Ответ 1
Существует способ, позволяющий расширению расширений сценариев содержимого продолжать функционировать после обновления, и заставить его работать сразу после установки.
устанавливать
Метод установки состоит в том, чтобы просто перебрать все вкладки во всех окнах и программно внедрить некоторые сценарии во вкладки с соответствующими URL-адресами.
Очевидно, что вы должны сделать это в фоновом скрипте страницы или страницы события, объявленном в manifest.json:
"background": {
"scripts": ["background.js"]
},
background.js:
// Add a 'manifest' property to the 'chrome' object.
chrome.manifest = chrome.app.getDetails();
var injectIntoTab = function (tab) {
// You could iterate through the content scripts here
var scripts = chrome.manifest.content_scripts[0].js;
var i = 0, s = scripts.length;
for( ; i < s; i++ ) {
chrome.tabs.executeScript(tab.id, {
file: scripts[i]
});
}
}
// Get all windows
chrome.windows.getAll({
populate: true
}, function (windows) {
var i = 0, w = windows.length, currentWindow;
for( ; i < w; i++ ) {
currentWindow = windows[i];
var j = 0, t = currentWindow.tabs.length, currentTab;
for( ; j < t; j++ ) {
currentTab = currentWindow.tabs[j];
// Skip chrome:// and https:// pages
if( ! currentTab.url.match(/(chrome|https):\/\//gi) ) {
injectIntoTab(currentTab);
}
}
}
});
Обновить
Метод обновления основан на том факте, что сценарии содержимого остаются введенными после того, как расширение отключено, удалено или обновлено.
Когда установлено соединение с портом, добавляется обработчик onDisconnect. Это ждет секунду после события разъединения, затем пытается повторно соединиться. Если происходит сбой, запускается другой onDisconnect, поэтому процесс повторяется до тех пор, пока не будет установлено соединение. Это не идеально, но это работает.
Содержание скрипта:
var port;
// Attempt to reconnect
var reconnectToExtension = function () {
// Reset port
port = null;
// Attempt to reconnect after 1 second
setTimeout(connectToExtension, 1000 * 1);
};
// Attempt to connect
var connectToExtension = function () {
// Make the connection
port = chrome.runtime.connect({name: "my-port"});
// When extension is upgraded or disabled and renabled, the content scripts
// will still be injected, so we have to reconnect them.
// We listen for an onDisconnect event, and then wait for a second before
// trying to connect again. Becuase chrome.runtime.connect fires an onDisconnect
// event if it does not connect, an unsuccessful connection should trigger
// another attempt, 1 second later.
port.onDisconnect.addListener(reconnectToExtension);
};
// Connect for the first time
connectToExtension();