只有在DevTools取消停靠时,后台页面中的executeScript才会静默失败

时间:2014-04-11 18:44:31

标签: google-chrome-extension google-chrome-devtools

我的DevTools扩展程序将脚本注入到被检查的窗口中,以便解析和接收来自 - 通常在页面加载时,以及首次打开DevTools时的消息。

后台页面中的相关行如下:

chrome.tabs.executeScript(message.tabId,{ file: 'insert.js', runAt: 'document_idle' },function(results){console.log(results);});

此行通常在成功时在后台控制台中显示[null] - 并且在停靠状态下打开DevTools时以及用户在任何状态下使用DevTools导航到新URL时都成功。只有当DevTools在未对接状态下打开时才能正常工作;在这种情况下,调用无声地失败,results正在返回undefined

权限是“标签”,“http:// / ”,“https:// / ”;而且,它只是在这个非常具体的情况下才起作用。

这是一个已知问题的解决方法,还是我认为这是一个Chromium错误?

1 个答案:

答案 0 :(得分:0)

your bug report的测试用例包含拼写错误。

事件页面中的onMessage事件监听器要求标签ID可用message.tabId

chrome.tabs.executeScript(message.tabId,{ file: 'insert.js', runAt: 'document_idle' });

但是,在devtools页面中,邮件正在以" tabID" (注:资本D)。

chrome.runtime.sendMessage({type: 'newpageload',tabID:  chrome.devtools.inspectedWindow.tabId});

由于事件页面中未定义message.tabId,因此Chrome默认将内容脚本插入current window的有效标签中。当开发人员工具未对接时,此选项卡(巧合地)与检查的选项卡相同,因此您没有注意到错误。

当devtools解除对接时,当前窗口是devtools。由于您无法编写开发人员工具的脚本,因此似乎没有任何内容。如果您在chrome.runtime.lastError的回调中读取chrome.tabs.executeScript的值,您会注意到您正在尝试在错误的窗口中插入脚本。

更改" tabId"到" tabID",测试用例按预期工作。