我创建了一个Chrome扩展程序,作为其操作的一部分,它会打开一个带有指定网址的新标签页。
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if( request.message === "open_new_tab" ) {
chrome.tabs.create({"url": request.url});
}
}
);
(GitHub上的完整代码)
这适用于带有网页的标签,但我无法让它在空标签上工作,例如:chrome://apps/
为了澄清,如果我打开标签并且它在stackoverflow.com上,那么当我点击我的扩展按钮,它会打开一个新标签,加载生成的网址。当我在新标签页或者网址以chrome://
开头的标签页上时,该扩展程序无效。
我需要包含哪些权限才能允许在任何标签中打开扩展程序?是否包含新标签和任何chrome://
标签?
的manifest.json:
{
"manifest_version": 2,
"name": "MyMiniCity Checker",
"short_name": "MyMiniCity Checker",
"description": "Checks what your city needs most and redirects the browser accordingly.",
"version": "0.2",
"author":"Richard Parnaby-King",
"homepage_url": "https://github.com/richard-parnaby-king/MyMiniCity-Checker/",
"icons": {
"128": "icon-big.png"
},
"options_page": "options/options.html",
"browser_action": {
"default_icon": "icon.png"
},
"permissions": ["tabs","storage","http://*.myminicity.com/","http://*/*", "https://*/*"],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_scripts": [ {
"matches": [ "http://*/*", "https://*/*"],
"js": [ "jquery-1.11.3.min.js" ]
}]
}
Background.js:
//When user clicks on button, run script
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null, { file: "jquery-1.11.3.min.js" }, function() {
chrome.tabs.executeScript(null, { file: "contentscript.js" });
});
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if( request.message === "open_new_tab" ) {
chrome.tabs.create({"url": request.url});
}
}
);
好像没有执行background.js文件。我怀疑这是一个权限。为了在每个标签中运行此扩展程序,我需要什么权限?
答案 0 :(得分:7)
好吧,这条消息应该来自您尝试注入当前标签的内容脚本。
最宽的permission you can request为"<all_urls>"
,但仍有网址被排除在访问权之外。
您通常只能访问http:
,https:
,file:
和ftp:
计划。
file:
方案要求用户在chrome://extensions/
中手动批准访问权限:
来自访问权限的Chrome网上应用店网址are specifically blacklisted。没有覆盖。
chrome://
网址(也称为WebUI)出于安全原因排除。标志中有一个手动覆盖:chrome://flags/#extensions-on-chrome-urls
,但你永远不会指望它在那里。
上述情况除外,如果您声明了确切的权限,则可以访问chrome://favicon/
个网址。
总而言之,即使拥有最广泛的权限,您也无法确定是否可以访问。在chrome.runtime.lastError
的回调中检查executeScript
并正常失败。
答案 1 :(得分:3)
由于我希望在每个页面上运行,这意味着我无法在内容脚本中使用代码。我将所有代码都移到了后台脚本中:
chrome.browserAction.onClicked.addListener(function(tab) {
//...
chrome.tabs.create({"url": newTabUrl});
//...
});
所以当我点击我的按钮时,使用附带的jquery脚本调用上面的代码。