Title: [261370] trunk/Source/WebKit
Revision
261370
Author
[email protected]
Date
2020-05-08 01:21:55 -0700 (Fri, 08 May 2020)

Log Message

[WPE][WebDriver] Implement user prompt support
https://bugs.webkit.org/show_bug.cgi?id=207372

Reviewed by Carlos Garcia Campos.

Provide a default implementation for WebDriver dialog commands.
This implementation will mimic the expected browser behavior of
accepting/dismissing the dialogs, while not exposing any new API.

* UIProcess/API/glib/WebKitScriptDialogPrivate.h:
- Expose new private function to check whether the dialog is using a
default implementation or is handled by the user.
* UIProcess/API/glib/WebKitWebView.cpp:
- Avoid default WebDriver behavior if the dialog is user-handled.
(webkitWebViewSetCurrentScriptDialogUserInput):
(webkitWebViewAcceptCurrentScriptDialog):
(webkitWebViewDismissCurrentScriptDialog):
* UIProcess/API/gtk/WebKitScriptDialogGtk.cpp:
(webkitScriptDialogIsUserHandled):
- Return whether the dialog is user handled.
* UIProcess/API/wpe/WebKitScriptDialogWPE.cpp:
- Added basic behavior for the WebDriver dialog callbacks for WPE.
(webkitScriptDialogAccept):
(webkitScriptDialogDismiss):
(webkitScriptDialogSetUserInput):
(webkitScriptDialogIsUserHandled):

* UIProcess/API/wpe/WebKitWebViewWPE.cpp:
(webkitWebViewScriptDialog):
- Hold a dialog ref if the webview is controlled by automation and ends
up calling the default "script-dialog" event handler.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (261369 => 261370)


--- trunk/Source/WebKit/ChangeLog	2020-05-08 08:06:44 UTC (rev 261369)
+++ trunk/Source/WebKit/ChangeLog	2020-05-08 08:21:55 UTC (rev 261370)
@@ -1,3 +1,37 @@
+2020-05-08  Lauro Moura  <[email protected]>
+
+        [WPE][WebDriver] Implement user prompt support
+        https://bugs.webkit.org/show_bug.cgi?id=207372
+
+        Reviewed by Carlos Garcia Campos.
+
+        Provide a default implementation for WebDriver dialog commands.
+        This implementation will mimic the expected browser behavior of
+        accepting/dismissing the dialogs, while not exposing any new API.
+
+        * UIProcess/API/glib/WebKitScriptDialogPrivate.h:
+        - Expose new private function to check whether the dialog is using a
+        default implementation or is handled by the user.
+        * UIProcess/API/glib/WebKitWebView.cpp:
+        - Avoid default WebDriver behavior if the dialog is user-handled.
+        (webkitWebViewSetCurrentScriptDialogUserInput):
+        (webkitWebViewAcceptCurrentScriptDialog):
+        (webkitWebViewDismissCurrentScriptDialog):
+        * UIProcess/API/gtk/WebKitScriptDialogGtk.cpp:
+        (webkitScriptDialogIsUserHandled):
+        - Return whether the dialog is user handled.
+        * UIProcess/API/wpe/WebKitScriptDialogWPE.cpp:
+        - Added basic behavior for the WebDriver dialog callbacks for WPE.
+        (webkitScriptDialogAccept):
+        (webkitScriptDialogDismiss):
+        (webkitScriptDialogSetUserInput):
+        (webkitScriptDialogIsUserHandled):
+
+        * UIProcess/API/wpe/WebKitWebViewWPE.cpp:
+        (webkitWebViewScriptDialog):
+        - Hold a dialog ref if the webview is controlled by automation and ends
+        up calling the default "script-dialog" event handler.
+
 2020-05-07  Jiewen Tan  <[email protected]>
 
         [WebAuthn] Roll back newly created credentials if an error occurs

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitScriptDialogPrivate.h (261369 => 261370)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitScriptDialogPrivate.h	2020-05-08 08:06:44 UTC (rev 261369)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitScriptDialogPrivate.h	2020-05-08 08:21:55 UTC (rev 261370)
@@ -45,6 +45,10 @@
     GtkWidget* nativeDialog { nullptr };
 #endif
 
+#if PLATFORM(WPE)
+    bool isUserHandled { true };
+#endif
+
     int referenceCount { 1 };
 };
 
@@ -53,3 +57,4 @@
 void webkitScriptDialogAccept(WebKitScriptDialog*);
 void webkitScriptDialogDismiss(WebKitScriptDialog*);
 void webkitScriptDialogSetUserInput(WebKitScriptDialog*, const String&);
+bool webkitScriptDialogIsUserHandled(WebKitScriptDialog *);

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp (261369 => 261370)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2020-05-08 08:06:44 UTC (rev 261369)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2020-05-08 08:21:55 UTC (rev 261370)
@@ -2438,7 +2438,11 @@
     if (!webView->priv->currentScriptDialog)
         return;
 
-    // FIXME: Add API to ask the user in case default implementation is not being used.
+    if (webkitScriptDialogIsUserHandled(webView->priv->currentScriptDialog)) {
+        // FIXME: Add API to ask the user in case default implementation is not being used.
+        return;
+    }
+
     if (webkitScriptDialogIsRunning(webView->priv->currentScriptDialog))
         webkitScriptDialogSetUserInput(webView->priv->currentScriptDialog, userInput);
 }
@@ -2448,7 +2452,11 @@
     if (!webView->priv->currentScriptDialog)
         return;
 
-    // FIXME: Add API to ask the user in case default implementation is not being used.
+    if (webkitScriptDialogIsUserHandled(webView->priv->currentScriptDialog)) {
+        // FIXME: Add API to ask the user in case default implementation is not being used.
+        return;
+    }
+
     if (webkitScriptDialogIsRunning(webView->priv->currentScriptDialog))
         webkitScriptDialogAccept(webView->priv->currentScriptDialog);
 }
@@ -2458,7 +2466,11 @@
     if (!webView->priv->currentScriptDialog)
         return;
 
-    // FIXME: Add API to ask the user in case default implementation is not being used.
+    if (webkitScriptDialogIsUserHandled(webView->priv->currentScriptDialog)) {
+        // FIXME: Add API to ask the user in case default implementation is not being used.
+        return;
+    }
+
     if (webkitScriptDialogIsRunning(webView->priv->currentScriptDialog))
         webkitScriptDialogDismiss(webView->priv->currentScriptDialog);
 }

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp (261369 => 261370)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp	2020-05-08 08:06:44 UTC (rev 261369)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp	2020-05-08 08:21:55 UTC (rev 261370)
@@ -50,3 +50,8 @@
     webkitScriptDialogImplSetEntryText(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog), userInput);
 #endif
 }
+
+bool webkitScriptDialogIsUserHandled(WebKitScriptDialog* scriptDialog)
+{
+    return !WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog);
+}

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitScriptDialogWPE.cpp (261369 => 261370)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitScriptDialogWPE.cpp	2020-05-08 08:06:44 UTC (rev 261369)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitScriptDialogWPE.cpp	2020-05-08 08:21:55 UTC (rev 261370)
@@ -22,14 +22,37 @@
 
 #include "WebKitScriptDialogPrivate.h"
 
-void webkitScriptDialogAccept(WebKitScriptDialog*)
+// Callbacks invoked by WebDriver commands
+// As WPE has currently no public API to allow the browser to respond to these commands,
+// we mimic the expected behavior in these callbacks like one would do in a reference browser.
+void webkitScriptDialogAccept(WebKitScriptDialog* dialog)
 {
+    auto dialog_type = webkit_script_dialog_get_dialog_type(dialog);
+    if (dialog_type == WEBKIT_SCRIPT_DIALOG_CONFIRM || dialog_type == WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM)
+        webkit_script_dialog_confirm_set_confirmed(dialog, TRUE);
+    // W3C WebDriver tests expect an empty string instead of a null one when the prompt is accepted.
+    if (dialog_type == WEBKIT_SCRIPT_DIALOG_PROMPT && dialog->text.isNull())
+        webkit_script_dialog_prompt_set_text(dialog, dialog->defaultText.isNull() ? "" : dialog->defaultText.data());
+    webkit_script_dialog_unref(dialog);
 }
 
-void webkitScriptDialogDismiss(WebKitScriptDialog*)
+void webkitScriptDialogDismiss(WebKitScriptDialog* dialog)
 {
+    auto dialog_type = webkit_script_dialog_get_dialog_type(dialog);
+    if (dialog_type == WEBKIT_SCRIPT_DIALOG_CONFIRM || dialog_type == WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM)
+        webkit_script_dialog_confirm_set_confirmed(dialog, FALSE);
+    webkit_script_dialog_unref(dialog);
 }
 
-void webkitScriptDialogSetUserInput(WebKitScriptDialog*, const String&)
+void webkitScriptDialogSetUserInput(WebKitScriptDialog* dialog, const String& input)
 {
+    if (webkit_script_dialog_get_dialog_type(dialog) != WEBKIT_SCRIPT_DIALOG_PROMPT)
+        return;
+
+    webkit_script_dialog_prompt_set_text(dialog, input.utf8().data());
 }
+
+bool webkitScriptDialogIsUserHandled(WebKitScriptDialog* dialog)
+{
+    return dialog->isUserHandled;
+}

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewWPE.cpp (261369 => 261370)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewWPE.cpp	2020-05-08 08:06:44 UTC (rev 261369)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewWPE.cpp	2020-05-08 08:21:55 UTC (rev 261370)
@@ -21,15 +21,22 @@
 #include "WebKitWebView.h"
 
 #include "WebKitColorPrivate.h"
+#include "WebKitScriptDialogPrivate.h"
 #include "WebKitWebViewPrivate.h"
 
+
 gboolean webkitWebViewAuthenticate(WebKitWebView*, WebKitAuthenticationRequest*)
 {
     return FALSE;
 }
 
-gboolean webkitWebViewScriptDialog(WebKitWebView*, WebKitScriptDialog*)
+gboolean webkitWebViewScriptDialog(WebKitWebView* webview, WebKitScriptDialog* dialog)
 {
+    if (webkit_web_view_is_controlled_by_automation(webview)) {
+        webkit_script_dialog_ref(dialog);
+        dialog->isUserHandled = false;
+    }
+
     return FALSE;
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to