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

Chrome extensions - reload matching tabs

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

先谢谢了。

使用 chrome.runtime.getManifest() 获取所有内容脚本声明,手动将 matches 和其他类型的模式转换为正则表达式并检查所有浏览器选项卡 url。

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

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 转换函数。