问题描述
请帮帮我!我收到错误“未经检查的 runtime.lastError:无法访问 url 的内容”“。扩展清单必须请求访问此主机的权限。”和“未检查的 runtime.lastError:无法建立连接。接收端不存在。”在清单 3 中。
来自内容脚本的监听器
chrome.runtime.onMessage.addListener(
function(req,sender,sendResponse) {
if(req.msg === "analysis background") {
let obj = parse();
sendResponse(obj);
}
return true;
}
);
);
manifest.json
{
"manifest_version": 3,"name": "extensionParser","version": "1.0.0","action": {
"default_popup": "popups/popup.html"
},"background": {
"service_worker": "background.js"
},"permissions": ["tabs","scripting","http://localhost/site_for_parsing"]
}
const siteUrl = "http://localhost/site_for_parsing";
chrome.runtime.onConnect.addListener(port => {
port.onMessage.addListener(msg => {
if(msg.message === 'analysis') {
chrome.tabs.create({active: false,url: siteUrl},tab => {
chrome.scripting.executeScript({
target: {tabId:tab.id},files: ['dist/parser.js']
},(results) => {
chrome.tabs.sendMessage(tab.id,{msg: "analysis background"},res => {
port.postMessage(res)
chrome.tabs.remove(tab.id)
})
})
});
}
});
});
解决方法
- 应将站点权限添加到
host_permissions
,而不是permissions
、more info。 - 在 ManifestV3 中 create + executeScript 是 bugged,因此要么 a) 返回 ManifestV2 直到此问题得到修复或 b) 使用以下解决方法。
等待 URL 设置:
(async () => {
const tab = await chrome.tabs.create({url: 'https://www.example.com'});
const tabId = tab.id;
if (!tab.url) await onTabUrlUpdated(tabId);
const results = await chrome.scripting.executeScript({
target: {tabId},files: ['content.js'],});
chrome.tabs.sendMessage(tabId,{msg: 'analysis background'},res => {
port.postMessage(res);
chrome.tabs.remove(tabId);
});
})();
function onTabUrlUpdated(tabId) {
return new Promise((resolve,reject) => {
const onUpdated = (id,info) => id === tabId && info.url && done(true);
const onRemoved = id => id === tabId && done(false);
chrome.tabs.onUpdated.addListener(onUpdated);
chrome.tabs.onRemoved.addListener(onRemoved);
function done(ok) {
chrome.tabs.onUpdated.removeListener(onUpdated);
chrome.tabs.onRemoved.removeListener(onRemoved);
(ok ? resolve : reject)();
}
});
}