以编程方式关闭/退出 PWA

Bra*_*rad 14 javascript google-chrome progressive-web-apps

如何关闭/退出我的 PWA?

我以为我能够做到这一点:

window.close();
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致通常的错误:

脚本可能只关闭由它打开的窗口。

有没有办法以编程方式关闭我的 PWA?

Sir*_*ple 5

因此,请遵循有关此的 MDN 文档:

window.close

过去,当您直接调用 window 对象的 close() 方法而不是在 window 实例上调用 close() 时,浏览器会关闭最前面的窗口,无论您的脚本是否创建了该窗口。这已不再是这种情况; 出于安全原因,不再允许脚本关闭它们没有打开的窗口。

遵循生活标准

如果 current 为 null 或其正在关闭为 true,则返回。(这是问题出现的时候,因为浏览上下文为空,除非您使用 javascript 上下文打开一个新文档)

如果以下所有情况都为真:

  • 当前是脚本可关闭的
  • 现任全局对象的浏览上下文熟悉当前
  • 允许当前全局对象的浏览上下文导航当前

同样从第二部分开始,脚本将被视为不可关闭脚本(这里有更多信息

如果浏览上下文是由脚本(而不是由用户的操作)创建的辅助浏览上下文,或者如果它是会话历史记录仅包含一个 Document 的顶级浏览上下文,则该浏览上下文是脚本可关闭的。

所以我担心在现代浏览器中,如果不控制打开它的人,就不可能真正关闭当前选项卡。这也适用于 iframe 打开的窗口。所有信息都在我链接的当前标准中,原因在我引用的标准中。几年前,有一些使用open("", "_self")和类似解决方案的变通方法,但我相信这个已经被修补了。

在 PWA 的情况下,只要浏览历史记录中没有推送事件,您将只能关闭应用程序(这意味着window.history.length整个导航保持 1。在这种情况下,您的应用程序将被视为顶级浏览上下文只有一个文档,因此window.close()就可以了。可以测试最后一个确认:转到 twitter.com -> 安装 Twitter PWA -> 打开 PWA -> 打开控制台并写入window.close(),它会立即关闭窗口。在它的那一刻导航到 PWA 中的任何链接,不满足历史只有一个文档的条件。

额外试图找出为什么这是一个安全问题:https : //security.stackexchange.com/questions/120116/security-feature-preventing-javascript-from-closure-the-window

https://security.stackexchange.com/questions/133744/why-do-browsers-disallow-script-closure-an-opener-window-yet-allow-changed-its