Manifest V3不再支持远程代码

Manifest v2里面可以轻松做到加载远程code,但v3 已经被限制到只能用参数了。

可以发现,把函数放入扩展内可以运行excuteScript,但放入远端文件不行。以下是测试案例:

首先,不行的案例:

报错显示没有定义远端文件中写到的代码函数greetUser。

具体代码如下:

远端test6.js:

function greetUser(name) {
  alert(`Hello, ${name} from remote script!`);
}

manifest.json

{
  "manifest_version": 3,
  "name": "Remote JS code test",
  "version": "3.0",
  "permissions": [
    "activeTab",
    "storage", 
    "declarativeContent", 
    "scripting"
  ],
  "host_permissions": ["http://localhost:8000/"],
  "background": {
    "service_worker": "background.js"
  },  
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "images/icon_blog.png",
      "48": "images/icon_discover.png",
      "128": "images/icon_forum.png"
    }
  }
}

popup.html

<!-- popup.html -->
<!DOCTYPE html>
<html>
<head>
  <title>Remote JS Loader (Manifest V3)</title>
  <script src="popup.js"></script>
</head>
<body>
  <h1>Remote JS Loader (Manifest V3)</h1>
  <button id="loadButton">Load Remote Script</button>
</body>
</html>

popup.js

// popup.js
document.addEventListener('DOMContentLoaded', function() {
  document.getElementById('loadButton').addEventListener('click', function() {
      // 在点击按钮时执行的代码
      chrome.runtime.sendMessage({ action: 'loadRemoteScript' });
  });
});

background.js

// background.js
// function greetUser1(name) {
//     alert(`Hello, ${name} from remote script!`);
//   }
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    // 接收来自 popup.js 的消息
    if (message.action === 'loadRemoteScript') {
      fetch('http://localhost:8000/test6.js')
        .then(response => response.text())
        .then(script => {
          // 在这里使用下载的脚本
          console.log(script);
          // 执行远程脚本
          chrome.scripting.executeScript({
            func: greetUser,
            args: ['Sherry'], // 传递给 greetUser 函数的参数
          });
        })
        .catch(error => console.error('Error fetching script:', error));
    }
});

2. 函数在扩展内可以成功

代码如下:
 

manifest.json

{
    "manifest_version": 3,
    "name": "Test Extension",
    "version": "1.0",
    "action": {
        "default_popup": "popup.html"
    },
    "background": {
        "service_worker": "background.js"
    },
    "permissions": [
        "activeTab",
        "storage", 
        "declarativeContent", 
        "scripting"
    ]
}

popup.html

<!-- popup.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Test Extension</title>
    <script src="popup.js"></script>
</head>
<body>
    <h1>Test Extension</h1>
    <button id="executeButton">Execute Script</button>
</body>
</html>

popup.js

// popup.js
document.addEventListener('DOMContentLoaded', function() {
    document.getElementById('executeButton').addEventListener('click', function() {
        chrome.runtime.sendMessage({ action: 'executeScript' });
    });
});

background.js

// background.js
function greetUser(name) {
    alert(`Hello, ${name}!`);
}

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    if (message.action === 'executeScript') {
        fetch('http://localhost:8000/test7.js', { mode: 'no-cors' })
            .then(response => response.text())
            .then(data => {
                let givenName = data.givenName || '<GIVEN_NAME>';
                chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
                    if (tabs && tabs.length > 0) {
                        chrome.scripting.executeScript({
                            target: {tabId: tabs[0].id},
                            func: greetUser,
                            args: [givenName],
                        });
                    } else {
                        console.error('No active tab found.');
                    }
                });
            })
            .catch(error => console.error('Error fetching user data:', error));
    }
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值