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

时间:2015-01-19 22:20:08

标签: javascript google-chrome-extension

我通过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

1 个答案:

答案 0 :(得分:1)

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

在Chrome 41.0.2222.0之前,chrome.tabs.executeScript可以通过以下方案中的空标签列表调用回调:

  1. 新文档已committed但尚未完全加载。
  2. 调用
  3. chrome.tabs.executeScript(文档尚未完成加载)。
  4. 步骤1中的文档加载已中止提交了其他页面。