chrome.tabs.executeScript什么时候可以给出一个空数组作为结果值

When can chrome.tabs.executeScript give an empty array as the result value

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

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

我注意到我在选项卡仍在加载时调用了 executeScript API(但同样,大部分时间它都有效)。如果我不断尝试一次又一次地注入相同的脚本,最终,在多次重试之后,它 return 是它应该的。但我不知道如何判断失败的尝试是否已执行或只是未能 return 任何事情。

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

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 41.0.2223.0 以来,您不应再得到空列表,因为内容脚本的安排方式已在 crbug.com/416907 中更改以修复错误。

直到 Chrome 41.0.2222.0,chrome.tabs.executeScript 可以在以下情况下使用空选项卡列表调用回调:

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