Провести тест нормальности Шапиро-Вилка

Обычный javascript не может закрыть окна волей-неволей. Это функция безопасности, введенная некоторое время назад, чтобы остановить различные вредоносные эксплойты и раздражения.

Из последней рабочей спецификации для window.close() :

Метод close() для объектов Window должен, если выполняются все следующие условия, закройте контекст просмотра A :

  • Соответствующий контекст просмотра [ является script-closable .
  • Контекст просмотра действующего сценария знаком с контекстом просмотра A .
  • В контексте просмотра действующего сценария разрешено перемещаться по контексту просмотра A .

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

Это означает, что с одним небольшим исключением javascript не должен закрывать окно, которое не было написанный тем же javascript.

Chrome разрешает это исключение, которое не применяется к пользовательским скриптам, однако Firefox этого не делает. Исключительные состояния реализации Firefox. :

Этот метод разрешен только для окон, открытых скриптом с использованием метода window.open.


Если вы попытаетесь использовать window.close из Greasemonkey / Tampermonkey / userscript, вы получите: Firefox: сообщение об ошибке, «Scripts may not close windows that were not opened by script.» Chrome: просто молча.


Долгосрочное решение:

Лучший способ справиться с этим - это сделать расширение Chrome и / или дополнение Firefox. Они могут достоверно закрыть текущее окно.

Однако, поскольку риски безопасности, создаваемые window.close, намного меньше для сценария Greasemonkey / Tampermonkey; Greasemonkey и Tampermonkey могли бы разумно предоставить эту функциональность в своем API (по сути, упаковывая работу по расширению для вас). Рассмотрите возможность создания запроса функции.


Хакерные обходные пути:

В настоящее время Chrome уязвим для эксплойта «самоперехвата». Так что код, подобный этому, использовался для работы в целом:

open(location, '_self').close();

Это ошибочное поведение, IMO, и теперь (примерно в апреле 2015 года) блокируется в основном. Он все равно будет работать с , введенным кодом только , если вкладка только что открыта и не имеет страниц в истории просмотра. Так что это полезно только при очень небольшом наборе обстоятельств.

Тем не менее, вариант по-прежнему работает на Chrome (v43 и v44) плюс Tampermonkey (v3.11 или новее). Используйте явные @grant и обычные window.close(). EG:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

Благодаря zanetu для обновления. Обратите внимание, что это не сработает, если открыта только одна вкладка. Он закрывает дополнительные вкладки.

Firefox защищен от этого эксплойта. Таким образом, единственным способом javascript является повреждение настроек безопасности, по одному браузеру за раз.

Вы можете открыть about:config и установить allow_scripts_to_close_windows на true.

Если ваш сценарий предназначен для личного использования, продолжайте и делайте это. Если вы попросите кого-нибудь еще включить эту настройку, они будут умны и оправданы, чтобы отказаться от предрассудков.

В настоящее время для Chrome нет эквивалентных настроек.

29
задан NelsonGon 13 May 2019 в 01:38
поделиться