无法将chrome.tabs.executeScript()调用到预加载的选项卡中。这是Chrome中的错误吗?

时间:2017-04-27 18:31:03

标签: google-chrome google-chrome-extension

我想知道的是,我所描述的是Chrome中的预期行为或错误。

当你在omnibar中输入一个URL时,chrome会在后台预加载一个不可见的标签,并在用户点击Enter时将其交换。

内容脚本也会插入到预加载的标签中。我有一个包含一行的内容脚本:

chrome.runtime.sendMessage({ msg: 'init' });

后台页面等待此消息,并将脚本动态加载到发送消息的选项卡中。

chrome.runtime.onMessage.addListener(
  function(request, sender) {
    console.log('Loading script.js into frameId: ' + sender.frameId + ', tabId: ' + sender.tab.id);
    chrome.tabs.executeScript(sender.tab.id, {
      file: 'script.js',
      frameId: sender.frameId,
      runAt: 'document_start',
      matchAboutBlank: true
    });
  }
)

后台页面还会侦听制表符替换事件。

chrome.tabs.onReplaced.addListener(
  function (addedTabId, removedTabId){
    console.log('Tab id changed from ' + removedTabId + ' to ' + addedTabId);
  }
);

script.js动态加载到大多数选项卡中没有问题。但是,预加载的选项卡是一个问题,因为值sender.tab.id显然无效

下图显示了背景页面的控制台。

background page console

每一行对应以下行动:

  1. 打开一个新标签(包含tabId 2812)
  2. 开始在URL栏中输入(预加载发生在tabId 2814中的幕后)
  3. 后台页面尝试将chrome.tabs.execute脚本调用到tabId 2814但未通过
  4. 3秒后,按Enter键加载URL。最后,onReplaced事件触发,表明tabId已从2812更改为2814。
  5. 这对我来说似乎都是倒退。这是否意味着不可能将脚本动态执行到预加载的选项卡中?

    My extension showcasing this behavior

0 个答案:

没有答案