Javascript chrome.tabs.executeScript并仅注入通过manifest.json中匹配过滤器的页面

Javascript chrome.tabs.executeScript并仅注入通过manifest.json中匹配过滤器的页面,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,在我的Chrome扩展重新加载或更新后,我尝试将我的内容脚本以编程方式注入到打开的选项卡中 我的脚本可以为任意选项卡调用以下方法: var manifest = chrome.app.getDetails(); var scripts = manifest.content_scripts[0].js; chrome.tabs.executeScript(nTabID, { file: scripts[0] }); 这是可行的,除非我尝试将其加载到一个页面中,该页面不应该根据ma

在我的Chrome扩展重新加载或更新后,我尝试将我的内容脚本以编程方式注入到打开的选项卡中

我的脚本可以为任意选项卡调用以下方法:

var manifest = chrome.app.getDetails();
var scripts = manifest.content_scripts[0].js;
chrome.tabs.executeScript(nTabID, {
    file: scripts[0]
    });
这是可行的,除非我尝试将其加载到一个页面中,该页面不应该根据
manifest.json
中的
matches
子句运行内容脚本。我得到以下例外情况:

无法访问url“此处的实际url”的内容。扩展清单 必须请求访问此主机的权限

所以我的问题是。有没有办法解析页面URL,查看它是否与
manifest.json
中的
matches
子句匹配,并防止调用
chrome.tabs.executeScript
查找不必要的URL

另外,我知道一个“黑客”解决方案是捕获并忽略异常。因此,我不是在要求它。

当您用于选项卡列表时,请使用
url
属性按a进行筛选,此键还支持匹配模式数组。如果您需要支持Chrome 38或更早版本,或者如果您的选项卡没有
Chrome.tabs.query
,请使用来筛选选项卡。要使用它,请复制该函数并将其包含在(后台)页面中(例如,将其粘贴到以下代码段之前)

前面的代码段在所有选项卡中插入内容脚本。您有责任确保插入脚本不会与脚本的早期/后期实例冲突

模仿和功能稍微复杂一些,因为API不能用于针对特定帧()。如果还想插入框架,则必须在每个选项卡中插入(因为在与URL匹配的非匹配顶级框架下可能有一个框架),并在内容脚本中检查页面的URL


最后,请注意,您的内容脚本还必须处理这样一个事实,即它可能在不同于的点上运行。特别是,依赖于
“run\u at”:“document\u start”
的内容脚本可能无法工作,因为调用
chrome.tabs.executeScript
将导致脚本注入远远超过
document\u start
阶段。

请查看
chrome.runtime.getManifest()
@Qantas94Heavy:我做了,然后呢?你在舱单上定义了你的匹配项,不是吗?从这里开始,只需搜索它以匹配URL。好吧,我显然不在你的水平上,这就是为什么我要问这个问题。。。。您能告诉我如何从清单中的匹配项中搜索它吗?谢谢。请注意,您的
crbug.com/63979
链接已断开。我目前使用的是Chrome v.37,因此还无法尝试。不过出于好奇,有没有一个统计数据显示哪个版本上有多少Chrome用户?@c0000fd一般来说,由于自动更新,你可以假设大多数用户都使用最新版本。有关发布日历,请参阅;在列出的日期后再加上大约6-8周,以查看每个人在该版本的大致日期。
var content_scripts = chrome.runtime.getManifest().content_scripts;
// Exclude CSS files - CSS is automatically inserted.
content_scripts = content_scripts.filter(function(content_script) {
    return content_script.js && content_script.js.length > 0;
});
content_scripts.forEach(function(content_script) {
    try {
        // NOTE: an array of patterns is only supported in Chrome 39+
        chrome.tabs.query({
            url: content_script.matches
        }, injectScripts);
    } catch (e) {
        // NOTE: This requires the "tabs" permission!
        chrome.tabs.query({
        }, function(tabs) {
            var parsed = content_script.matches.map(parse_match_pattern);
            var pattern = new RegExp(parsed.join('|'));
            tabs = tabs.filter(function(tab) {
                return pattern.test(tab.url);
            });
            injectScripts(tabs);
        });
    }

    function injectScripts(tabs) {
        tabs.forEach(function(tab) {
            content_script.js.forEach(function(js) {
                chrome.tabs.executeScript(tab.id, {
                    file: js
                });
            });
        });
    }
});