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