javascript - 如何实现 chrome.tabs.remove() 的安全实现
问题描述
用例
- 现有网页/URL 从第 3 方应用程序打开。网页上的工作完成后,预计会自行关闭。
- Javascript 不允许它使用 window.close() 或类似的,参考。 window.close 和 self.close 不会在 Chrome 中关闭窗口
浏览器限制(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);
}
总之,会发生以下情况:
- 网页加载
- 内容脚本为自定义事件添加事件侦听器
myCloseTabEvent
- 后台脚本使用 chrome.runtime.onMessage.addListener() 添加一个 onMessage 监听器
- 在页面上完成所有工作后,现有的 Javascript 代码会通过调用
mySendEvent()
. - 内容脚本运行它的监听
function(e)
器,向后台脚本发送消息。 - 后台脚本 onMessage 监听
function(msgData, sender, sendResponse)
器使用 sender 对象确定 tabId,并使用关闭浏览器选项卡chrome.tabs.remove(sender.tab.id);
问题
- 从概念上讲,这种方法是实现关闭浏览器选项卡目标的最佳选择吗?有没有更好的方法来实现同样的目标?
- 需要一个后台脚本才能关闭选项卡(如果我在这里错了,请纠正我)。因此,不能使用content_scripts ->将浏览器扩展限制为仅在一组特定域上处于活动状态
matches
。存在哪些最佳实践来将此类浏览器扩展的功能限制在特定域中?(扩展的用户知道域名,但在打包工件时不知道)。这特别有趣,可以通过向扩展程序的后台脚本发送相同的消息来防止其他(恶意)网页自行关闭。
解决方案
推荐阅读
- java - 在“Spring”中检索文件ID属于特定用户的文件信息
- javascript - 如何修复我的标题在移动浏览器上被截断?
- php - 在字符串中搜索 URL,并为每个问题添加查询字符串
- r - 使用用户定义的函数删除缺失值
- python - 将大量图像加载到 numpy 数组
- android - 颤振医生 --android-licenses 错误:无法找到或加载主类 Studio
- react-native - TypeError: null is not an object error when importing 'react-native-fs'
- python - 如何删除 Pandas 中的索引?
- python - Python lambda 传递了错误的参数
- javascript - 异步调用在 JS 的这个块内不起作用