Я пытаюсь внедрить скрипт содержимого динамически, поэтому я использую для этого документированный метод 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 мс, это гарантирует, что скрипт никогда не запустится, что предполагает проблему с синхронизацией.