WebDriver: hang in Selenium test alerts_tests.py::testShouldHandleAlertOnPageBeforeUnload
authorbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Jul 2018 23:11:02 +0000 (23:11 +0000)
committerbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Jul 2018 23:11:02 +0000 (23:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187418
<rdar://problem/41909520>

Reviewed by Timothy Hatcher.

Per the W3C specification, “User prompts that are spawned from beforeunload event handlers,
are dismissed implicitly upon navigation or close window, regardless of the defined user prompt handler.”

This behavior differs from legacy Selenium behavior where (as in the test) it's expected that
a test can accept or dismiss a beforeunload alert manually.

Prior to this patch, beforeunload alerts hang because Safari uses a nested modal run loop, which does
not process incoming Automation messages, so there was no way for the test to manually dismiss
the alert.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::runBeforeUnloadConfirmPanel):
Don't show beforeunload alerts for pages being controlled by automation.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233600 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/WebPageProxy.cpp

index b06ef3a..d371fd0 100644 (file)
@@ -1,3 +1,26 @@
+2018-07-06  Brian Burg  <bburg@apple.com>
+
+        WebDriver: hang in Selenium test alerts_tests.py::testShouldHandleAlertOnPageBeforeUnload
+        https://bugs.webkit.org/show_bug.cgi?id=187418
+        <rdar://problem/41909520>
+
+        Reviewed by Timothy Hatcher.
+
+        Per the W3C specification, “User prompts that are spawned from beforeunload event handlers,
+        are dismissed implicitly upon navigation or close window, regardless of the defined user prompt handler.”
+
+        This behavior differs from legacy Selenium behavior where (as in the test) it's expected that
+        a test can accept or dismiss a beforeunload alert manually.
+
+        Prior to this patch, beforeunload alerts hang because Safari uses a nested modal run loop, which does
+        not process incoming Automation messages, so there was no way for the test to manually dismiss
+        the alert.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::runBeforeUnloadConfirmPanel):
+        Don't show beforeunload alerts for pages being controlled by automation.
+
+
 2018-07-06  Chris Dumez  <cdumez@apple.com>
 
         ASSERTION FAILED: contextConnection under WebCore::SWServer::terminateWorkerInternal
index 6ce35d5..8c33078 100644 (file)
@@ -4523,14 +4523,18 @@ void WebPageProxy::runBeforeUnloadConfirmPanel(uint64_t frameID, const SecurityO
     WebFrameProxy* frame = m_process->webFrame(frameID);
     MESSAGE_CHECK(frame);
 
-    // Since runBeforeUnloadConfirmPanel() can spin a nested run loop we need to turn off the responsiveness timer.
-    m_process->responsivenessTimer().stop();
-
+    // Per §18 User Prompts in the WebDriver spec, "User prompts that are spawned from beforeunload
+    // event handlers, are dismissed implicitly upon navigation or close window, regardless of the
+    // defined user prompt handler." So, always allow the unload to proceed if the page is being automated.
     if (m_controlledByAutomation) {
-        if (auto* automationSession = process().processPool().automationSession())
-            automationSession->willShowJavaScriptDialog(*this);
+        if (auto* automationSession = process().processPool().automationSession()) {
+            reply(true);
+            return;
+        }
     }
 
+    // Since runBeforeUnloadConfirmPanel() can spin a nested run loop we need to turn off the responsiveness timer.
+    m_process->responsivenessTimer().stop();
     m_uiClient->runBeforeUnloadConfirmPanel(this, message, frame, securityOrigin, WTFMove(reply));
 }