以编程方式关闭/退出PWA

时间:2020-03-07 23:10:23

标签: javascript google-chrome progressive-web-apps

如何关闭/退出我的PWA?

我以为我可以做到这一点:

window.close();

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

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

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

1 个答案:

答案 0 :(得分:3)

因此,请遵循以下MDN文档:

window.close

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

跟随living standard

如果current为null或它的close为true,则返回。 (问题出在这里,除非您使用javascript上下文打开新文档,否则浏览上下文为null)

如果满足以下所有条件:

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

从第二部分开始,该脚本将被视为不可关闭脚本(Here you have more info

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

因此,我担心在现代浏览器中,如果不控制打开者的名称,实际上不可能完全关闭当前选项卡。这也适用于由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-closing-the-window

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