chrome.tabs.executeScript ненадежен - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь внедрить скрипт содержимого динамически, поэтому я использую для этого документированный метод chrome.tabs.executeScript.

Однако, в отличие от скриптов со встроенным содержимым (определенных в манифесте), динамический скрипт запускается случайным образом, в то время как я должен быть уверен, что он запускается каждый раз.

Обычно я слушаю события обновления вкладок в фоновом скрипте и выполняю скрипт динамического содержимого для каждого "loading" события

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

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

Есть ли способы обеспечить выполнение динамического сценария 100% времени, несмотря на какие-либо обстоятельства?

Вот последовательность журналов, в которой скрипт не запускается:

loading: changeInfo =  {status: "loading"}
loading: start. sender.tab.id =  1454
loading: start script loading
loading: code size =  4190306  bytes
loading: changeInfo =  {status: "complete"} <- page loading completed
loading: time to execute script =  945 <- script execution completed

А вот фрагмент кода:

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
    console.log("loading: changeInfo = ", changeInfo)
    if (changeInfo.status !== "loading") {
        console.log("loading: skip");
        return;
    }
    console.log("loading: start. sender.tab.id = ", tabId)

    console.log("loading: start script loading")
    var timerStart = Date.now();
    console.log("loading: code size = ", byteCount(scriptCode), " bytes")
    chrome.tabs.executeScript(tabId,
        {
            code: scriptCode,
            runAt: "document_idle"
        }, function (response) {
            console.log("loading: time to execute script = ", Date.now() - timerStart)
            var err = chrome.runtime.lastError;
            console.log("loading: response = ", response, ", err = ", err)
        });
});

В журнале также нет ошибок

Еще одна вещь, которую нужно добавить - если я оберну chrome.tabs.executeScript в setTimeout с задержкой около 2000 мс, это гарантирует, что скрипт никогда не запустится, что предполагает проблему с синхронизацией.

1 Ответ

0 голосов
/ 17 мая 2018

Хорошо, это было глупо - проблема заключалась в самом динамическом коде скрипта: основная логика была выполнена в обратном вызове onload и никогда не запускалась, если скрипт загружался после onload:

window.addEventListener("load", mainLogic, false);

удаление обратного вызова и запуск mainLogic() напрямую исправили проблему.

Я оставлю это здесь на случай, если кто-то совершит ту же ошибку, что и я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...