Chrome扩展程序 - 重新加载匹配标签

时间:2016-08-17 15:20:54

标签: google-chrome-extension manifest google-chrome-app

我想知道,是否有一种方法可以从后台页面重新加载与manifest.json的content_scripts.matches匹配的所有页面?或者我是否必须在我的代码中的其他位置定义它,并循环选项卡以检查是否匹配?

非常感谢。

1 个答案:

答案 0 :(得分:1)

使用chrome.runtime.getManifest()获取所有内容脚本声明,手动将matches和其他类型的模式转换为regexp并检查所有浏览器标签网址。

这是一个简化版本,不考虑排除的网址。

var matches = [];

chrome.runtime.getManifest().content_scripts.forEach(function(cs) {
    Array.prototype.push.apply(matches, (cs.matches || []).map(matchToRegexp));
    Array.prototype.push.apply(matches, (cs.include_globs || []).map(globToRegexp));

    function matchToRegexp(match) {
        return match.replace(/[{}()\[\]\\.+?^$|]/g, "\\$&")
                    .replace(/\*/g, '.*?');
    }
    function globToRegexp(glob) {
        return glob.replace(/[{}()\[\]\\.+^$|]/g, "\\$&")
                   .replace(/\?/g, '.')
                   .replace(/\*/g, '.*?');
    }
});

var hasAllUrls = matches.indexOf('<all_urls>') >= 0 || matches.indexOf('*://*/*/') >= 0;
var rxMatches = hasAllUrls ? /^(https?|file|ftp):\/\/.+/
                           : new RegExp('^' + matches.join('$|^') + '$');

chrome.windows.getAll({
    populate: true,
    windowTypes: ['normal', 'panel', 'popup'],
}, function(windows) {
    windows.forEach(function(window) {
        window.tabs.forEach(function(tab) {
            if (rxMatches.test(tab.url)) {
                chrome.tabs.reload(tab.id);
            }
        });
    });
});

未测试。如果出现问题,请调试,修复,编辑此答案。

有关更正确的glob-to-regexp转换函数,请参阅this answer