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

Google chrome 无法将chrome.tabs.executeScript()调用到预加载的选项卡中。这是Chrome中的一个bug吗?,google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,我只想知道我所描述的是Chrome的预期行为还是一个bug。 当您在omnibar中输入URL时,chrome会在后台预加载一个不可见的选项卡,并在用户点击enter时将其替换 内容脚本也会插入到预加载的选项卡中。我有一个内容脚本,其中包含一行: chrome.runtime.sendMessage({ msg: 'init' }); 后台页面等待此消息,并将脚本动态加载到发送消息的选项卡中 chrome.runtime.onMessage.addListener( function(re

我只想知道我所描述的是Chrome的预期行为还是一个bug。

当您在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显然无效

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

每行对应以下操作:

  • 打开一个新选项卡(其选项卡ID为2812)
  • 开始在URL栏中键入(在tabId 2814中的后台进行预加载)
  • 后台页面尝试将chrome.tabs.execute脚本调用到tabId 2814中,但失败
  • 3秒钟后,按enter键加载URL。最后,onReplaced事件触发,指示tabId从2812更改为2814
  • 这一切在我看来都是倒退。这是否意味着不可能在预加载的选项卡中动态执行脚本


    是的,只有用户确认导航时,该选项卡才会变为现实,在这种情况下,它会在onReplaced事件中报告,并在chrome.tabs API中可见。我想原因是,直到那一刻,它还没有成为一个内部标签所需要的东西。顺便说一句,在交换之前,此类选项卡的id始终为
    -1
    。是否有任何方法可以识别MessageSender是否属于预加载的选项卡?当我在onMessage回调中读取sender.tab.id时,我始终会获得该选项卡在变为实际选项卡时假定的id。然而sender.tab.index是-1。啊,是的,就是它!那是我记得的
    -1
    。谢谢。这看起来像一个肮脏的黑客。。。但只要管用。