Диалог подтверждения теряет фокус на iOS10

1

В мобильной версии моего веб-сайта у меня есть диалоговое окно подтверждения JavaScript, которое появляется при определенных обстоятельствах. Используя setTimeout я запускаю диалог подтверждения. Независимо от того, в какую вкладку находится пользователь, он должен увидеть confirm dialog но в iOS 10 теряет фокус.

В iOS версии 8 и 9 отлично работает, когда у меня есть две вкладки, и я нахожусь на второй вкладке, диалоговое окно подтверждения отображается спереди так, как должно.

Есть ли решение или обходное решение для этого?

var cf = confirm("Close?"); 
if (cf){ do that....} else { do this... }
Теги:
browser
mobile-safari
safari10

1 ответ

2

SafariDriver реализован в JS, поэтому для перехвата вызовов для alert, confirm и prompt необходимо переопределить функции в контексте веб-страницы.

Измените введенный сценарий, который будет вставляться в качестве сценария Start вместо сценария End что означает, что скрипт вводится после загрузки DOM, но до того, как он был разобран (вместо того, чтобы вводиться после события onload):

http://developer.apple.com/library/safari/#documentation/Tools/Conceptual/SafariExtensionGuide/InjectingScripts/InjectingScripts.html#//apple_ref/doc/uid/TP40009977-CH6-SW5

Переопределите глобальные функции оповещения в контексте тестируемой страницы, а не вложенный сценарий. Это похоже на требования команды executeScript. Поэтому первое, что должен сделать наш инъецируемый скрипт, это добавить тег сценария в DOM, который устанавливает предупреждения. Этот тег скрипта должен быть добавлен в качестве первого дочернего элемента documentElement для обеспечения его выполнения перед любыми другими страницами. Это обеспечит настройку наших обработчиков предупреждений, прежде чем что-либо на странице сможет запустить предупреждение.

Как только предупреждение срабатывает, мы должны уведомить расширение о наличии предупреждения, одновременно блокируя текущий поток JS на странице. Обычно наши скрипты страниц взаимодействуют с вложенным скриптом, используя window.postMessage. postMessage запускает MessageEvent асинхронно. Чтобы поддерживать синхронность, мы можем вручную запустить MessageEvent:

Use a MessageEvent instead of some other DOM event so we can include a JSON object describing the alert.

var event = document.createEvent('MessageEvent');
event.initMessageEvent('message', false, false, {
  type: "alert",  // confirm, or prompt
  text: "hello"
}, window.location.origin, '0', window, null);
window.dispatchEvent(event);

Введенный сценарий должен прослушивать ответ на сообщение с предупреждением страницы. Чтобы синхронно отправить предупреждение на расширение для обработки, мы можем (ab) использовать механизм расширения Safari для блокировки содержимого из загрузки:

http://developer.apple.com/library/safari/#documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW9

window.addEventListener('message', function(e) {
  // Create a beforeload event, which is required by the canLoad method
  var e = document.createEvent('Events');
  e.initEvent('beforeload', false, false);

  // canLoad sends and waits for a response synchronously. It is the only
  // synchronous function in the Safari extension messaging API.
  var response = safari.self.tab.canLoad(e, e.data);

  // Send the response back to the page using another MessageEvent.
  var responseEvent = document.createEvent('MessageEvent');
  responseEvent.initMessageEvent('message', false, false, {
    accepted: response.accepted,
    response: response.value
  }, window.location.origin, '0', window, null);
  window.dispatchEvent(responseEvent);
}, true);

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

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

Одна из возможностей заключается в том, чтобы клиент WebDriver участвовал в обработке предупреждений. В дополнение к предоставлению сервера WebSocket ожидается, что клиент WebDriver также предоставит конечную точку XHR. Когда обнаружено предупреждение, сервер отправит синхронный POST XHR в эту конечную точку. Клиент должен отвечать только после того, как пользователь принял или отклонил предупреждение (или необработанная ошибка предупреждения была сброшена из другой команды). Когда принимается XHR-ответ, расширение завершает цепочку и отправляет ответ обратно на вложенный сценарий.

Вы можете найти больше здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню