Title: [220394] trunk/Source
Revision
220394
Author
carlo...@webkit.org
Date
2017-08-08 01:29:19 -0700 (Tue, 08 Aug 2017)

Log Message

Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
https://bugs.webkit.org/show_bug.cgi?id=175261

Reviewed by Brian Burg.

Source/WebDriver:

* CommandResult.cpp:
(WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.

Source/WebKit:

According to the spec, send alert text command should fail if the current dialog is not a prompt. This patch
adds _javascript_DialogType enum to API::AutomationSessionClient and a new virtual method to ask the client about
the type of the current dialog. WebAutomationSession::setUserInputForCurrentJavaScriptPrompt() uses the new
client method to check the type of the current dialog and fail in case it's not a prompt. Cocoa needs an
implementation, for now it always returns Prompt as the type to keep compatibility.

18.4 Send Alert Text.
https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text

This fixes selenium test testSettingTheValueOfAnAlertThrows.

* UIProcess/API/APIAutomationSessionClient.h:
(API::AutomationSessionClient::typeOfCurrentJavaScriptDialogOnPage):
* UIProcess/API/glib/WebKitAutomationSession.cpp:
* UIProcess/API/glib/WebKitWebView.cpp:
(webkitWebViewGetCurrentScriptDialogType):
* UIProcess/API/glib/WebKitWebViewPrivate.h:
* UIProcess/Automation/Automation.json:
* UIProcess/Automation/WebAutomationSession.cpp:
(WebKit::WebAutomationSession::setUserInputForCurrentJavaScriptPrompt):
* UIProcess/Cocoa/AutomationSessionClient.h:
* UIProcess/Cocoa/AutomationSessionClient.mm:
(WebKit::AutomationSessionClient::typeOfCurrentJavaScriptDialogOnPage):

Modified Paths

Diff

Modified: trunk/Source/WebDriver/ChangeLog (220393 => 220394)


--- trunk/Source/WebDriver/ChangeLog	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebDriver/ChangeLog	2017-08-08 08:29:19 UTC (rev 220394)
@@ -1,5 +1,15 @@
 2017-08-07  Carlos Garcia Campos  <cgar...@igalia.com>
 
+        Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
+        https://bugs.webkit.org/show_bug.cgi?id=175261
+
+        Reviewed by Brian Burg.
+
+        * CommandResult.cpp:
+        (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
+
+2017-08-07  Carlos Garcia Campos  <cgar...@igalia.com>
+
         WebDriver: implement unhandled prompt behavior
         https://bugs.webkit.org/show_bug.cgi?id=175184
 

Modified: trunk/Source/WebDriver/CommandResult.cpp (220393 => 220394)


--- trunk/Source/WebDriver/CommandResult.cpp	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebDriver/CommandResult.cpp	2017-08-08 08:29:19 UTC (rev 220394)
@@ -88,6 +88,8 @@
             m_errorCode = ErrorCode::NoSuchFrame;
         else if (errorName == "NotImplemented")
             m_errorCode = ErrorCode::UnsupportedOperation;
+        else if (errorName == "ElementNotInteractable")
+            m_errorCode = ErrorCode::ElementNotInteractable;
         else if (errorName == "_javascript_Error")
             m_errorCode = ErrorCode::_javascript_Error;
         else if (errorName == "_javascript_Timeout")

Modified: trunk/Source/WebKit/ChangeLog (220393 => 220394)


--- trunk/Source/WebKit/ChangeLog	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/ChangeLog	2017-08-08 08:29:19 UTC (rev 220394)
@@ -1,3 +1,34 @@
+2017-08-07  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
+        https://bugs.webkit.org/show_bug.cgi?id=175261
+
+        Reviewed by Brian Burg.
+
+        According to the spec, send alert text command should fail if the current dialog is not a prompt. This patch
+        adds _javascript_DialogType enum to API::AutomationSessionClient and a new virtual method to ask the client about
+        the type of the current dialog. WebAutomationSession::setUserInputForCurrentJavaScriptPrompt() uses the new
+        client method to check the type of the current dialog and fail in case it's not a prompt. Cocoa needs an
+        implementation, for now it always returns Prompt as the type to keep compatibility.
+
+        18.4 Send Alert Text.
+        https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text
+
+        This fixes selenium test testSettingTheValueOfAnAlertThrows.
+
+        * UIProcess/API/APIAutomationSessionClient.h:
+        (API::AutomationSessionClient::typeOfCurrentJavaScriptDialogOnPage):
+        * UIProcess/API/glib/WebKitAutomationSession.cpp:
+        * UIProcess/API/glib/WebKitWebView.cpp:
+        (webkitWebViewGetCurrentScriptDialogType):
+        * UIProcess/API/glib/WebKitWebViewPrivate.h:
+        * UIProcess/Automation/Automation.json:
+        * UIProcess/Automation/WebAutomationSession.cpp:
+        (WebKit::WebAutomationSession::setUserInputForCurrentJavaScriptPrompt):
+        * UIProcess/Cocoa/AutomationSessionClient.h:
+        * UIProcess/Cocoa/AutomationSessionClient.mm:
+        (WebKit::AutomationSessionClient::typeOfCurrentJavaScriptDialogOnPage):
+
 2017-08-08  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [iOS WK2] WKWebView schedules nonstop layout after pressing cmb+b,i,u inside a contenteditable div

Modified: trunk/Source/WebKit/UIProcess/API/APIAutomationSessionClient.h (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/API/APIAutomationSessionClient.h	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/API/APIAutomationSessionClient.h	2017-08-08 08:29:19 UTC (rev 220394)
@@ -37,6 +37,13 @@
 
 class AutomationSessionClient {
 public:
+    enum class _javascript_DialogType {
+        Alert,
+        Confirm,
+        Prompt,
+        BeforeUnloadConfirm
+    };
+
     virtual ~AutomationSessionClient() { }
 
     virtual String sessionIdentifier() const { return String(); }
@@ -47,6 +54,7 @@
     virtual void acceptCurrentJavaScriptDialogOnPage(WebKit::WebAutomationSession&, WebKit::WebPageProxy&) { }
     virtual String messageOfCurrentJavaScriptDialogOnPage(WebKit::WebAutomationSession&, WebKit::WebPageProxy&) { return String(); }
     virtual void setUserInputForCurrentJavaScriptPromptOnPage(WebKit::WebAutomationSession&, WebKit::WebPageProxy&, const String&) { }
+    virtual std::optional<_javascript_DialogType> typeOfCurrentJavaScriptDialogOnPage(WebKit::WebAutomationSession&, WebKit::WebPageProxy&) { return std::nullopt; }
 };
 
 } // namespace API

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp	2017-08-08 08:29:19 UTC (rev 220394)
@@ -132,6 +132,29 @@
         webkitWebViewSetCurrentScriptDialogUserInput(webView, userInput);
     }
 
+    std::optional<API::AutomationSessionClient::_javascript_DialogType> typeOfCurrentJavaScriptDialogOnPage(WebAutomationSession&, WebPageProxy& page) override
+    {
+        auto* webView = webkitWebContextGetWebViewForPage(m_session->priv->webContext, &page);
+        if (!webView)
+            return std::nullopt;
+        auto dialogType = webkitWebViewGetCurrentScriptDialogType(webView);
+        if (!dialogType)
+            return std::nullopt;
+        switch (dialogType.value()) {
+        case WEBKIT_SCRIPT_DIALOG_ALERT:
+            return API::AutomationSessionClient::_javascript_DialogType::Alert;
+        case WEBKIT_SCRIPT_DIALOG_CONFIRM:
+            return API::AutomationSessionClient::_javascript_DialogType::Confirm;
+        case WEBKIT_SCRIPT_DIALOG_PROMPT:
+            return API::AutomationSessionClient::_javascript_DialogType::Prompt;
+        case WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM:
+            return API::AutomationSessionClient::_javascript_DialogType::BeforeUnloadConfirm;
+        }
+
+        ASSERT_NOT_REACHED();
+        return std::nullopt;
+    }
+
     WebKitAutomationSession* m_session;
 };
 

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


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2017-08-08 08:29:19 UTC (rev 220394)
@@ -2090,6 +2090,14 @@
         webkitScriptDialogDismiss(webView->priv->currentScriptDialog);
 }
 
+std::optional<WebKitScriptDialogType> webkitWebViewGetCurrentScriptDialogType(WebKitWebView* webView)
+{
+    if (!webView->priv->currentScriptDialog)
+        return std::nullopt;
+
+    return static_cast<WebKitScriptDialogType>(webView->priv->currentScriptDialog->type);
+}
+
 void webkitWebViewMakePolicyDecision(WebKitWebView* webView, WebKitPolicyDecisionType type, WebKitPolicyDecision* decision)
 {
     gboolean returnValue;

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebViewPrivate.h (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebViewPrivate.h	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebViewPrivate.h	2017-08-08 08:29:19 UTC (rev 220394)
@@ -59,6 +59,7 @@
 void webkitWebViewSetCurrentScriptDialogUserInput(WebKitWebView*, const String&);
 void webkitWebViewAcceptCurrentScriptDialog(WebKitWebView*);
 void webkitWebViewDismissCurrentScriptDialog(WebKitWebView*);
+std::optional<WebKitScriptDialogType> webkitWebViewGetCurrentScriptDialogType(WebKitWebView*);
 void webkitWebViewMakePermissionRequest(WebKitWebView*, WebKitPermissionRequest*);
 void webkitWebViewMakePolicyDecision(WebKitWebView*, WebKitPolicyDecisionType, WebKitPolicyDecision*);
 void webkitWebViewMouseTargetChanged(WebKitWebView*, const WebKit::WebHitTestResultData&, WebKit::WebEvent::Modifiers);

Modified: trunk/Source/WebKit/UIProcess/Automation/Automation.json (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/Automation/Automation.json	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/Automation/Automation.json	2017-08-08 08:29:19 UTC (rev 220394)
@@ -58,7 +58,8 @@
                 "NotImplemented",
                 "MissingParameter",
                 "InvalidParameter",
-                "InvalidSelector"
+                "InvalidSelector",
+                "ElementNotInteractable"
             ]
         },
         {

Modified: trunk/Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp	2017-08-08 08:29:19 UTC (rev 220394)
@@ -919,6 +919,24 @@
     if (!m_client->isShowingJavaScriptDialogOnPage(*this, *page))
         FAIL_WITH_PREDEFINED_ERROR(NoJavaScriptDialog);
 
+    // ยง18.4 Send Alert Text.
+    // https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text
+    // 3. Run the substeps of the first matching current user prompt:
+    auto scriptDialogType = m_client->typeOfCurrentJavaScriptDialogOnPage(*this, *page);
+    ASSERT(scriptDialogType);
+    switch (scriptDialogType.value()) {
+    case API::AutomationSessionClient::_javascript_DialogType::Alert:
+    case API::AutomationSessionClient::_javascript_DialogType::Confirm:
+        // Return error with error code element not interactable.
+        FAIL_WITH_PREDEFINED_ERROR(ElementNotInteractable);
+    case API::AutomationSessionClient::_javascript_DialogType::Prompt:
+        // Do nothing.
+        break;
+    case API::AutomationSessionClient::_javascript_DialogType::BeforeUnloadConfirm:
+        // Return error with error code unsupported operation.
+        FAIL_WITH_PREDEFINED_ERROR(NotImplemented);
+    }
+
     m_client->setUserInputForCurrentJavaScriptPromptOnPage(*this, *page, promptValue);
 }
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/AutomationSessionClient.h (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/Cocoa/AutomationSessionClient.h	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/Cocoa/AutomationSessionClient.h	2017-08-08 08:29:19 UTC (rev 220394)
@@ -51,6 +51,7 @@
     void acceptCurrentJavaScriptDialogOnPage(WebAutomationSession&, WebPageProxy&) override;
     String messageOfCurrentJavaScriptDialogOnPage(WebAutomationSession&, WebPageProxy&) override;
     void setUserInputForCurrentJavaScriptPromptOnPage(WebAutomationSession&, WebPageProxy&, const String&) override;
+    std::optional<API::AutomationSessionClient::_javascript_DialogType> typeOfCurrentJavaScriptDialogOnPage(WebAutomationSession&, WebPageProxy&) override;
 
     WeakObjCPtr<id <_WKAutomationSessionDelegate>> m_delegate;
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/AutomationSessionClient.mm (220393 => 220394)


--- trunk/Source/WebKit/UIProcess/Cocoa/AutomationSessionClient.mm	2017-08-08 08:10:23 UTC (rev 220393)
+++ trunk/Source/WebKit/UIProcess/Cocoa/AutomationSessionClient.mm	2017-08-08 08:29:19 UTC (rev 220394)
@@ -123,6 +123,13 @@
         [m_delegate.get() _automationSession:wrapper(session) setUserInput:value forCurrentJavaScriptDialogOnPage:toAPI(&page)];
 }
 
+std::optional<API::AutomationSessionClient::_javascript_DialogType> AutomationSessionClient::typeOfCurrentJavaScriptDialogOnPage(WebAutomationSession&, WebPageProxy&)
+{
+    // FIXME: Implement it. This is only used in WebAutomationSession::setUserInputForCurrentJavaScriptPrompt() so for now we return
+    // always Prompt type for compatibility.
+    return API::AutomationSessionClient::_javascript_DialogType::Prompt;
+}
+
 } // namespace WebKit
 
 #endif // WK_API_ENABLED
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to