问题描述
用例
- 现有网页/网址是从第 3 方应用打开的。完成网页上的工作后,预计将关闭
- Javascript 不允许使用 window.close() 或类似方法,ref。 window.close and self.close do not close the window in Chrome
浏览器限制(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);
}
总而言之,会发生以下情况:
- 网页加载
- 内容脚本为自定义事件
myCloseTabEvent
添加事件侦听器
- 后台脚本使用 chrome.runtime.onMessage.addListener() 添加一个 onMessage 监听器
- 在页面上完成所有工作后,现有 Javascript 代码将通过调用
mySendEvent()
来调度自定义事件。 - 内容脚本运行其侦听器
function(e)
,向后台脚本发送消息。 - 后台脚本 onMessage listener
function(msgData,sendResponse)
使用 sender 对象来确定 tabId,并使用chrome.tabs.remove(sender.tab.id);
关闭浏览器选项卡
问题
- 从概念上讲,这种方法是我们实现关闭浏览器选项卡目标的最佳选择吗?是否有更好的方法来实现相同的目标?
- 需要后台脚本才能关闭选项卡(如果我错了,请纠正我)。因此,不能使用 content_scripts ->
matches
将浏览器扩展程序限制为仅在一组特定域上处于活动状态。有哪些最佳实践可以将这样的浏览器扩展功能限制在特定域中? (域名是扩展的用户知道的,但在打包工件时不知道)。这尤其令人感兴趣,可以通过向扩展程序的后台脚本发送相同的消息来防止其他(恶意)网页自行关闭。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)