правила для "запретить этой странице создавать дополнительные диалоги" - PullRequest
5 голосов
/ 13 января 2012

Я пытаюсь понять поведение Firefox в отношении добавления «запретить этой странице создавать дополнительные диалоги» в диалоговых окнах.

Используя jquery, если я добавлю следующих слушателей:

//html
<input class="testInput" />

//javascript
$('.testInput')
.click(function(){ alert('clicked') })
.keyup(function(){ alert('keyup') })
  1. При нажатии на вход окно предупреждения отображается нормально, пока ~ 13-й раз.
  2. При нажатии клавиши, с другой стороны, уже появляется второе окно сообщения появляется сообщение «запретить этой странице создавать дополнительные диалоги ". На самом деле, кажется, есть некоторая задержка, и если я подожду как 2 секунды между двумя нажатиями клавиш, сообщение исчезает.

Из моих неформальных тестов 2. фактически применяется, когда окно оповещения не вызывается из-за обратного вызова (например, обратный вызов keyup, отображающий окно оповещения в ответ на действие ajax ...)

Я использую Firefox 9.0.1 под Ubuntu, насколько я знаю, я не подправил настройки Firefox относительно этих порогов. Я предполагаю, что это происходит с любой последней версией любого браузера.

Я использую библиотеку jQuery, но я не думаю, что она здесь уместна.

Мой вопрос: Каковы точные правила, по которым это предупреждение появляется в диалоговом окне?

[редактировать]

При использовании Chromium / Ubuntu (версия 17.0.963.26) пороговое значение представляется только задержкой между двумя диалоговыми окнами.

Вы можете проверить это из jsfiddle здесь (спасибо Рори МакКроссану)

Ответы [ 2 ]

6 голосов
/ 13 января 2012

Точные правила: интервал времени между всплывающими диалоговыми окнами.Значение, используемое для определения этого, устанавливается в SUCCESSIVE_DIALOG_TIME_LIMIT

Проверьте строку 2614 в ссылке под фрагментом:

nsGlobalWindow::DialogOpenAttempted()

TimeDuration dialogDuration(TimeStamp::Now() - topWindow->mLastDialogQuitTime);

if (dialogDuration.ToSeconds() < Preferences::GetInt("dom.successive_dialog_time_limit",SUCCESSIVE_DIALOG_TIME_LIMIT)){topWindow->mDialogAbuseCount++;return (topWindow->GetPopupControlState() > openAllowed || topWindow->mDialogAbuseCount > MAX_DIALOG_COUNT);}topWindow->mDialogAbuseCount = 0; return false;}

Ссылка на источник

1 голос
/ 13 января 2012

Вы можете пнуть вокруг источника Firefox, если хотите.Обратите внимание, что разные браузеры будут иметь разные правила.

Соответствующий код для Firefox: nsGlobalWindow.cpp и nsGlobalWindow.h (ссылки ниже на номера строк,и так будет медленно гнить при изменении источника).Кажется, он управляется константами MAX_DIALOG_COUNT (10) в nsGlobalWindow.h и SUCCESSIVE_DIALOG_TIME_LIMIT (3, единицы измерения - секунды).nsGlobalWindow.cpp ведет подсчет (mDialogAbuseCount).По-видимому, функция dialogDuration увеличивает или очищает mDialogAbuseCount в зависимости от того, был ли диалог открыт дольше, чем SUCCESSIVE_DIALOG_TIME_LIMIT.Функция AreDialogsBlocked использует mDialogAbuseCount (частично) для определения, заблокированы ли они.

Короче говоря: если вы неоднократно открываете всплывающие окна, а затем закрываетеих в течение трех секунд, через 10 или около того вы что-то сработаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...