Hay una manera de permitir una extensión pesada de la escritura de contenido para continuar funcionando después de una actualización, ya hacer que funcione inmediatamente después de la instalación.
Instalar
El método de instalación es para repetir simplemente a través de todas las pestañas en todas las ventanas, e inyectar algunas secuencias de comandos mediante programación en pestañas con URLs que coincidan.
Obviamente, tiene que hacerlo en una secuencia de comandos o background pageevent page declarada en 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);
}
}
}
});
de actualización
método
La actualización se basa sobre el hecho de que los scripts de contenido se dejan inyectar después de que una extensión se deshabilita, desinstala o actualiza.
Cuando se realiza la conexión de puerto, se agrega un controlador onDisconnect. Esto espera un segundo después del evento de desconexión, luego intenta reconectarse. Si falla, se activa otro onDisconnect para que el proceso vuelva a suceder, hasta que se establezca una conexión. No es perfecto, pero funciona.
El script contenido:
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();
Parece que Safari 7 (al menos) ya no se actualiza automáticamente la página cuando una extensión está instalada – baseten