【问题标题】:When can chrome.tabs.executeScript give an empty array as the result valuechrome.tabs.executeScript 什么时候可以给出一个空数组作为结果值
【发布时间】:2023-03-14 16:41:01
【问题描述】:

我正在通过 chrome.tabs.executeScript(在 document_end)将脚本注入网页。我确信脚本在语法上是好的,并且清单中的权限是好的。大多数情况下 (>99%) 一切都很好,脚本会做它应该做的事情并返回它应该做的事情。

但有时结果(通过回调获得)是一个空数组。什么时候会发生这种情况?

我注意到我在选项卡仍在加载时调用了 executeScript API(但同样,大部分时间它都有效)。如果我一次又一次地重试注入相同的脚本,最终,经过几次重试,它会返回它应该返回的内容。但我不知道如何判断失败的尝试是被执行了还是没有返回任何东西。

编辑: 这是一个代码示例:

var debugInjectResultProblem = function(tabId, callback) {
    chrome.tabs.executeScript(tabId, {code: 'Date.now()', runAt: 'document_end'}, function(result) {
        if (chrome.runtime.lastError) {
            console.error('Real error: ', chrome.runtime.lastError);
            callback();
            return;
        }
        console.log('Result is ', result);
        if (!result || result.length === 0) {
            debugInjectResultProblem(tabId, callback);
        } else {
            callback();
        }
    })
};

//... the tab gets reloaded here with different URLs couple of times
//... now inside a tab updated event handler
//... the code variable normally contains the script which is quite long
//... but the problem happens even if I do:

code = 'Date.now()';
chrome.tabs.executeScript(tabId, {code: code, runAt: 'document_end'}, function(retVal) {
    if (chrome.runtime.lastError) {
        console.error('Error executing script: ' + chrome.runtime.lastError.message);
    }
    else if (!retVal || !retVal[0]) {
        console.error('Unexpected executeScript retVal: ' + JSON.stringify(retVal));
        debugInjectResultProblem(tabHandle, function() { console.log('Done'); });
    }
    else {
        console.log('OK, result is:', retVal[0]);
    }
});

同样,99% 的情况下都可以。然后突然输出变成这样:

Unexpected executeScript retVal:  []
Result is  []
Result is  []
Result is  [1421783140122]
Done

【问题讨论】:

  • 向我们提供任何代码可能有用吗?我们可以猜测,但这不是猜测。
  • 结果列表很少是空数组。结果列表为空通常表示竞争条件或 Chrome 中的错误。您能否编辑您的问题并显示触发此错误的代码和说明?
  • 好的,很抱歉所有为我做 OT 的人没有给出代码示例。我的代码相当冗长。我试图缩短它,但是我无法重现该行为。这就是为什么我只是问了一般问题,是否可以出于任何原因返回 []。感谢 rob-w 的回复。其他人,再次抱歉。
  • 投票支持重新开放,但我认为@RobW 需要看看。
  • 哦,我能想到一个原因。如果标签页在document_end 触发之前离开怎么办?

标签: javascript google-chrome-extension


【解决方案1】:

自 Chrome 41.0.2223.0 起,您不应再获得空列表,因为在 crbug.com/416907 中更改了内容脚本的调度方式以修复错误。

在 Chrome 41.0.2222.0 之前,chrome.tabs.executeScript 可以在以下情况下调用带有空选项卡列表的回调:

  1. 一个新文档已经committed,但尚未完全加载。
  2. chrome.tabs.executeScript 被调用(当文档尚未完成加载时)。
  3. 第 1 步的文档加载被中止并且另一个页面被提交。

【讨论】:

  • @Xan 这不是三选一的选择,所有三个都必须按照这个顺序发生。
  • 哎呀 - 但后来我真的猜到了。 QA 感觉刺痛。
  • 是的!我来自扩展程序的日志证实了有关中止加载和不同页面的信息。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
相关资源
最近更新 更多