我有一个Chrome扩展程序,其中包含两个由清单注入的内容脚本和一个后台脚本。
{
"manifest_version": 2,
"name": "Test",
"permissions": [
"tabs", "<all_urls>", "activeTab", "storage"
],
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": [
"content/autofill/lib_generic.js",
"content/autofill/lib.js"],
"run_at": "document_end"
}
],
"web_accessible_resources": [
"content/specific_scripts/*"
],
"background": {
"scripts": ["background.js"],
"persistent": false
}
}
lib_generic.js
包含一个名为apply_forms(...)
的函数(它的描述不重要)。该函数从lib.js
文件调用。但是,这个过程在几个页面上无法正常工作,因此对于每个这样的页面,我都有一个特殊的脚本 - 也只有一个名为apply_forms(...)
的函数。
我有一个函数,它以当前域作为输入并返回所需特定脚本的名称,或者如果应使用通用脚本,则返回false
。
由于文件太多且逻辑更加复杂,因此我不能仅列出所有(url, script)
对于"content_scripts"
指令(我也不想将所有特定文件注入为内容脚本)。
我尝试在后台执行以下操作(请注意,这仅用于演示):
var url = ""; //url of current tab
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if(changeInfo.status == "complete") {
var filename = getSpecificFilename(url);
chrome.tabs.executeScript(tabId, {file: filename}, function() {
//script injected
});
}
});
注意:getSpecificFilename(...)将始终返回一个名称。
但是在第5行我得到了Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL
。
有人能帮我解决这个问题吗?这是动态“覆盖”函数定义的好方法,还是应该走另一条路(那么哪条)。
谢谢。