Подтвердить что ты не робот

Содержимое расширения Chrome script повторная инъекция после обновления или установки

После того, как расширение Chrome, на котором я работаю, установлено или обновлено, сценарии содержимого (указанные в манифесте) не повторно вставляются, поэтому для продления работы требуется обновление страницы. Есть ли способ принудительно вставить сценарии?

Я считаю, что я мог бы добавить их снова программным путем, удалив их из манифеста, а затем обработать страницы, которые нужно ввести на исходную страницу, но это не очень хорошее решение.

Я не хочу автоматически обновлять пользовательские вкладки, потому что это может потерять некоторые из их данных. Safari автоматически обновляет все страницы при установке или обновлении расширения.

4b9b3361

Ответ 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();

Ответ 2

Единственный способ принудительного встраивания содержимого script без обновления страницы - через программную инъекцию.

Вы можете получить все вкладки и ввести код в них с помощью API-интерфейсов chrome. Например, вы можете хранить манифестную версию в локальном хранилище и каждый раз проверять, является ли версия манифеста старой (на исходной странице), если вы можете получить все активные вкладки и ввести программный код или любое другое решение, которое сделает вас убедитесь, что расширение обновлено.

Получите все вкладки, используя:
chrome.tabs.query

и введите код на все страницы
chrome.tabs.executeScript(tabId, {file: "content_script.js"});

Ответ 3

Chrome добавил метод для прослушивания события установки или обновления расширения. Можно повторно внедрить сценарий содержимого, когда такое событие происходит. https://developers.chrome.com/extensions/runtime#event-onInstalled

Ответ 4

Вы не можете добавить ?ver=2.10 в конце css или js, которые вы обновили?

"content_scripts": [ {
      "css": [ "css/cs.css?ver=2.10" ],
      "js": [ "js/contentScript.js?ver=2.10" ],
      "matches": [ "http://*/*", "https://*/*" ],
      "run_at": "document_end"
   } ],