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

Расширение Chrome: как определить, что контент script уже загружен на вкладку?

У меня есть следующий код на моем фоне script:

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) {
    if (changeinfo.status !== 'complete')
        return;

    if (!matchesUrlFilters(tab.url))
        return;

    chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() {
        chrome.tabs.executeScript(tabId, { file: "enhance.js" });
    });
});

Однако в некоторых случаях это, кажется, дважды вставляет мой контент script (это может произойти, когда enhance.js делает window.history.pushState).

Как я могу узнать, имеет ли вкладка уже мой контент script? Я пробовал chrome.tabs.sendRequest, но он никогда не вызывал обратный вызов, если содержимое script еще не было добавлено.

4b9b3361

Ответ 1

EDIT: обновлено за первый комментарий к этому ответу.

Вы можете попробовать что-то вроде этого. Добавьте прослушиватель onRequest, который будет использоваться в качестве обратного вызова для загрузки сценариев, но они будут загружаться только на основе значения, отправленного как часть сообщения запроса. Затем используйте executeScript для прямого вызова "кода", который отправляет сообщение со значением глобальной переменной (если оно существует).

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) {
    ...

    // execute a content script that immediately sends back a message 
    // that checks for the value of a global variable which is set when
    // the library has been loaded
    chrome.tabs.executeScript(tabId, {
        code: "chrome.extension.sendRequest({ loaded: EnhanceLibIsLoaded || false });"
    });

    ...
});

// listen for requests
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) {
    if (req.loaded === false) {
        chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() {
            chrome.tabs.executeScript(tabId, { file: "enhance.js" }, function() {
                // set the global variable that the scripts have been loaded
                // this could also be set as part of the enhance.js lib
                chrome.tabs.executeScript(tabId, { code: "var EnhanceLibIsLoaded = true;" });
            });
        });
     }
});