如何实现 chrome.tabs.remove() 的安全实现

问题描述

用例

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

浏览器扩展

在我看来合乎逻辑的方法是使用以下工件。

content.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);

background.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. 添加事件侦听器
  4. 后台脚本使用 chrome.runtime.onMessage.addListener() 添加一个 onMessage 监听器
  5. 页面上完成所有工作后,现有 Javascript 代码将通过调用 mySendEvent() 来调度自定义事件。
  6. 内容脚本运行其侦听器 function(e),向后台脚本发送消息。
  7. 后台脚本 onMessage listener function(msgData,sendResponse) 使用 sender 对象来确定 tabId,并使用 chrome.tabs.remove(sender.tab.id); 关闭浏览器选项卡

问题

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)