google-chrome-extension - extensiones - extension o extencion
Reinicio de script de contenido de extensión de Chrome después de la actualización o instalación (3)
Después de instalar o actualizar la extensión de Chrome en la que estoy trabajando, las secuencias de comandos de contenido (especificadas en el manifiesto) no se vuelven a inyectar, por lo que es necesario actualizar la página para que la extensión funcione. ¿Hay alguna manera de obligar a los scripts a ser inyectados nuevamente?
Creo que podría inyectarlos de nuevo programáticamente quitándolos del manifiesto y luego manejando qué páginas inyectar en la página de fondo, pero esta no es una buena solución.
No quiero actualizar automáticamente las pestañas del usuario porque eso podría perder parte de sus datos. Safari actualiza automáticamente todas las páginas cuando instala o actualiza una extensión.
¿no puedes agregar ?ver=2.10
al final de css o js que actualizaste?
"content_scripts": [ {
"css": [ "css/cs.css?ver=2.10" ],
"js": [ "js/contentScript.js?ver=2.10" ],
"matches": [ "http://*/*", "https://*/*" ],
"run_at": "document_end"
} ],
Hay una forma de permitir que una extensión de script de contenido continúe funcionando después de una actualización y que funcione inmediatamente después de la instalación.
Instalar
El método de instalación consiste simplemente en recorrer todas las pestañas de todas las ventanas e insertar algunas secuencias de comandos programáticamente en pestañas con direcciones URL coincidentes.
Obviamente, debe hacerlo en una página de fondo o en un script de página de evento declarado 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);
}
}
}
});
Mejorar
El método de actualización se basa en el hecho de que las secuencias de comandos 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 de 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();
La única forma de obligar a un script de contenido a ser inyectado sin actualizar la página es a través de la inyección de programatic.
Puedes obtener todas las pestañas e insertar código en ellas usando la API de pestañas de Chrome. Por ejemplo, puede almacenar una versión de manifiesto en el almacenamiento local y comprobar siempre si la versión de manifiesto es antigua (en la página de fondo), de ser así, puede obtener todas las pestañas activas e inyectar su código mediante programación, o cualquier otra solución que lo haga Asegúrese de que la extensión esté actualizada.
Obtén todas las pestañas usando:
chrome.tabs.query
e inyecta tu código en todas las páginas
chrome.tabs.executeScript(tabId, {file: "content_script.js"});