Chrome 扩展背景激活非活动标签

Chrome extension background activating inactive tab

我正在使用清单 2。我有一个扩展需要打开特定 url 的“非活动选项卡”,收集信息并向后台发送消息以在我们完成后关闭此选项卡。当我将消息发送到后台时,我尝试使用以下之一关闭选项卡。


      setTimeout( () => {
            chrome.tabs.highlight({ tabs: sender.tab.index }, function () {
                chrome.tabs.remove(sender.tab.id);
            });
        }, 500);

OR

       setTimeout(function () {
            chrome.tabs.update(sender.tab.id, { active: true }, function () {
                chrome.tabs.remove(sender.tab.id);
            });
        }, 500);

这两个都不成功,直到我真正点击选项卡激活它,然后选项卡将执行删除调用。

这些是我在扩展程序中设置的权限。

   "permissions": [
        "activeTab",
        "tabs",
        "notifications",
        "contextMenus",
        "storage",
        "<all_urls>"
    ]

大家有什么建议吗?

提前致谢, 汤姆

我准备了一个最小清单 v2 示例来展示如何使用回调样式实现此行为。

manifest.json

这里 "https://www.google.com/*" 是一个示例 url 在何处打开选项卡;可以是任何东西。

{
  "name": "EXAMPLE",
  "version": "0.0.0",
  "manifest_version": 2, 
  "permissions": [
    "activeTab",
    "https://www.google.com/*"
  ],
  "background": {
    "scripts": ["background.js"]
  }
}

content.js

内容脚本会立即通过消息传递给注册的听众发送一条消息。

chrome.runtime.sendMessage({msg: document.body.innerText});

background.js

// step 1: create tab
chrome.tabs.create({

    // tab properties
    active: false,
    url: 'https://www.google.com/'

}, ({id: createdTabId}) => {

    // step 2: register listener to receive message from tab
    chrome.runtime.onMessage.addListener((request, sender) => {

            // step 4. using tab id to identify response from same tab
            if (createdTabId === sender.tab.id) {

                // close the created tab
                chrome.tabs.remove(createdTabId);

                // do something with the received data
                window.alert(`message from tab: ${request.msg}`);
            }
        }
    );

    // step 3: programmatically load content script after registering listener
    // in MV3 this is called: chrome.scripting.executeScript
    chrome.tabs.executeScript(createdTabId, {file: 'content.js'});
});

后台脚本按顺序做了四件事:

  1. 创建非活动选项卡
  2. 注册一个侦听器以接收来自创建的选项卡的响应
  3. 将内容脚本加载到创建的选项卡中
  4. 收到消息后,显示消息值

我正在使用选项卡 ID 来识别消息发送者,这需要等待选项卡创建完成才能注册侦听器,然后加载内容脚本,因为内容脚本会立即发送响应。这是一个选择。另一种方法是在清单中指定内容脚本以加载特定匹配模式,在打开选项卡之前注册侦听器,并使用选项卡 ID 以外的其他内容作为识别来自选项卡的响应的条件。