Закрыть / выйти из PWA программно - PullRequest
6 голосов
/ 08 марта 2020

Как мне закрыть / выйти из моего PWA?

Я предполагал, что смогу сделать это:

window.close();

К сожалению, это приводит к обычной ошибке:

Скрипты могут закрывать только те windows, которые были открыты им.

Есть ли способ программно закрыть мою PWA?

1 Ответ

1 голос
/ 16 апреля 2020

Итак, следуя документации MDN по этому вопросу:

window.close

В прошлом, когда вы вызывали метод close () объекта окна напрямую, вместо того, чтобы вызывать close () для экземпляра окна, браузер закрывал самое переднее окно, независимо от того, создавал ли ваш скрипт это окно или нет. Это уже не так; по соображениям безопасности скрипты больше не могут закрываться windows, которые они не открывали.

В соответствии с жизненным стандартом

Если current имеет значение null или его закрытие равно true, возвращаемое значение. (Вот когда возникает проблема, поскольку контекст просмотра является нулевым, если вы не открыли новый документ с использованием контекста javascript)

Если выполняются все следующие условия:

  • текущий является закрываемым сценарием
  • контекст просмотра действующего глобального объекта знаком с текущим
  • контекст просмотра действующего глобального объекта разрешен для навигации по текущему

Также из второй части сценарий будет считаться не подлежащим закрытию сценарием ( Здесь у вас есть больше информации )

Контекст просмотра является закрываемым сценарием если это вспомогательный контекст просмотра, который был создан скриптом (в отличие от действий пользователя), или если это контекст просмотра верхнего уровня, история сеанса которого содержит только один документ.

Поэтому я боюсь, что в современных браузерах совершенно невозможно фактически закрыть текущую вкладку, не имея контроля над тем, кто ее открыл. Это также относится к windows, открываемым iframes. Вся информация в текущем стандарте, который я связал, и причины среди тех, которые я цитировал. Несколько лет назад были обходные пути с использованием open("", "_self") и аналогичных решений, но я считаю, что это исправление было исправлено.

В случае PWA вы сможете закрыть приложение только до тех пор, пока нет pu sh события в истории просмотра (это означает, что window.history.length остается 1 для всей навигации. В этом случае ваше приложение будет считаться контекстом просмотра верхнего уровня только с одним документом, следовательно, подойдет window.close(). последнее подтверждение может быть проверено: Go на 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

...