chrome.tabs.executeScript不可靠

时间:2018-05-16 08:12:29

标签: google-chrome-extension

我试图动态注入内容脚本,因此我使用了记录的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 :(得分:0)

好吧,这很愚蠢 - 问题似乎出现在动态脚本代码本身中:主要逻辑是在onload回调中执行的,如果脚本在onload之后加载,则永远不会运行:

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

删除回调并运行mainLogic()直接修复了问题。

我会把它留在这里,万一有人犯了与我一样的错误。