2016-08-17 9 views
0

Я хочу знать, есть ли способ со справочной страницы, чтобы перезагрузить все страницы, соответствующие content_scripts.matches манифеста. Json? Или мне нужно определить это где-то еще в моем коде и прокручивать вкладки, чтобы проверить, не совпадают ли они?Расширения Chrome - перезагрузка соответствующих вкладок

Спасибо заранее.

+2

[chrome.runtime.getManifest()] (https://developer.chrome.com/extensions/runtime#method-getManifest) + преобразование 'совпадений' в регулярные выражения (' * '->'. *? ') + ручное сравнение URL каждой вкладки. – wOxxOm

+0

Не думаю, что прямой путь? Как насчет отправки сигнала с каждой вкладки (сценарий содержимого) и сохранения tabId в фоновом режиме, а затем обновить эти вкладки? –

+0

'getManifest' будет делать! Если вы хотите отправить ответ в качестве ответа, я проверю его. –

ответ

1

Используйте chrome.runtime.getManifest(), чтобы получить все ваши объявления сценариев контента, вручную преобразуйте matches и другие типы шаблонов в регулярные выражения и проверьте все URL-адреса вкладок браузера.

Это упрощенная версия, которая не учитывает исключенные 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); 
      } 
     }); 
    }); 
}); 

Непрошеным. В случае проблем, отлаживайте его, исправьте, отредактируйте этот ответ.

См. this answer для более правильной функции преобразования glob-to-regexp.