首页 > 解决方案 > 如何实现 chrome.tabs.remove() 的安全实现

问题描述

用例

浏览器限制(Firefox/Chrome)在过去几年中有很好的记录和探索。对于给定的用例,根据我的理解,关闭浏览器选项卡只能通过后台脚本调用chrome.tabs.remove () API 来实现。

浏览器扩展

对我来说似乎合乎逻辑的方法是使用以下工件。

内容.js

document.addEventListener("myCloseTabEvent", function(e){
  console.log("[content] originating domain: " + this.domain);

  // Prepare message for background script
  var myMsgContent = {
    type: "myAction",
    value: "CloseBrowserTab"}

  browser.runtime.sendMessage(myMsgContent);
}, false);

背景.js

chrome.runtime.onMessage.addListener(
  function(msgData, sender, sendResponse) {
    if (msgData.type == "myAction" && msgData.value == "CloseBrowserTab") {
      chrome.tabs.remove(sender.tab.id);
    } else {
      console.log("[background] No action because !(myAction && CloseBrowserTab)");
    }
 });

更改网页以引发新事件

function mySendEvent() {
  const myEvent = new Event("myCloseTabEvent"); // OR CustomEvent()

  // Dispatch the event
  document.dispatchEvent(myEvent);
}

总之,会发生以下情况:

  1. 网页加载
  2. 内容脚本为自定义事件添加事件侦听器myCloseTabEvent
  3. 后台脚本使用 chrome.runtime.onMessage.addListener() 添加一个 onMessage 监听器
  4. 在页面上完成所有工作后,现有的 Javascript 代码会通过调用mySendEvent().
  5. 内容脚本运行它的监听function(e)器,向后台脚本发送消息。
  6. 后台脚本 onMessage 监听function(msgData, sender, sendResponse)器使用 sender 对象确定 tabId,并使用关闭浏览器选项卡chrome.tabs.remove(sender.tab.id);

问题

  1. 从概念上讲,这种方法是实现关闭浏览器选项卡目标的最佳选择吗?有没有更好的方法来实现同样的目标?
  2. 需要一个后台脚本才能关闭选项卡(如果我在这里错了,请纠正我)。因此,不能使用content_scripts ->将浏览器扩展限制为仅在一组特定域上处于活动状态matches。存在哪些最佳实践来将此类浏览器扩展的功能限制在特定域中?(扩展的用户知道域名,但在打包工件时不知道)。这特别有趣,可以通过向扩展程序的后台脚本发送相同的消息来防止其他(恶意)网页自行关闭。

标签: javascriptgoogle-chromedom-eventsbrowser-extension

解决方案


推荐阅读