1 2018-01-29 Carlos Garcia Campos <cgarcia@igalia.com>
3 WebDriver: evaluateJavaScriptFunction should return null when return value is undefined
4 https://bugs.webkit.org/show_bug.cgi?id=180350
6 Reviewed by Carlos Alberto Lopez Perez.
8 Stop handling the empty string as a special case of evaluateJavaScriptFunction result.
11 (WebDriver::Session::executeScript):
13 2018-01-26 Carlos Garcia Campos <cgarcia@igalia.com>
15 WebDriver: service hangs after a browser crash
16 https://bugs.webkit.org/show_bug.cgi?id=182170
18 Reviewed by Carlos Alberto Lopez Perez.
20 This is currently happening in the GTK+ debug bot. There's a test that makes the browser crash due to an assert,
21 hanging the whole process and preventing the rest of the tests from running. When the browser crashes, we
22 correctly handle the pending requests, by completing them with an error. However, if the client tries to send
23 another command we fail to send the message to the browser and the reply is never sent to the client. In the
24 case of the tests, delete session command is sent, but never gets a reply.
27 (WebDriver::Session::isConnected const): Return whether the session is connected to the browser.
30 (WebDriver::SessionHost::sendCommandToBackend): Pass the message ID to SessionHost::sendMessageToBackend().
32 * WebDriverService.cpp:
33 (WebDriver::WebDriverService::deleteSession): Ignore unknown errors if the session is no longer connected.
34 * glib/SessionHostGlib.cpp:
35 (WebDriver::SessionHost::sendMessageToBackend): Handle errors when sending the command by completing the request
38 2018-01-26 Carlos Garcia Campos <cgarcia@igalia.com>
40 WebDriver: timeouts value and cookie expiry should be limited to max safe integer
41 https://bugs.webkit.org/show_bug.cgi?id=182167
43 Reviewed by Žan Doberšek.
45 This changed recently in the spec, but our implementation was wrong in any case since we were limiting to
46 INT_MAX. Use valueAsNumberInRange() to ensure we get a valid double value in the given range, and then convert
47 to unsigned if it's a valid integer.
49 Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[timeouts-value10]
50 imported/w3c/webdriver/tests/sessions/new_session/create_alwaysMatch.py::test_valid[timeouts-value10]
53 * WebDriverService.cpp:
54 (WebDriver::valueAsNumberInRange):
55 (WebDriver::unsignedValue):
56 (WebDriver::deserializeTimeouts):
57 (WebDriver::deserializeCookie):
59 2018-01-25 Carlos Garcia Campos <cgarcia@igalia.com>
61 WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_browserName fails
62 https://bugs.webkit.org/show_bug.cgi?id=181985
64 Reviewed by Carlos Alberto Lopez Perez.
66 The problem is that we are considering a failure when the browser name doesn't match the capabilities, instead
67 of trying with the next merged capabilities. This is happening because when processing capabilities, we only
68 match the ones that we know without having to launch the browser. Browser name and version are provided by the
69 browser during the session initialization. This patch reworks the session creation to make it possible to try
70 with the next merged capabilities when matching fails after the browser is launched.
73 (WebDriver::Session::Session): Initialize timeouts from capabilities, because now we have the final capabilities here.
74 (WebDriver::Session::id const): Return the session ID from the SessionHost, since it's now created there.
75 (WebDriver::Session::createTopLevelBrowsingContext): Do not start the session, it has already been started a
77 (WebDriver::Session::createElement): Use id() instead of m_id.
80 (WebDriver::SessionHost::sessionID const): Return the session ID.
81 * WebDriverService.cpp:
82 (WebDriver::WebDriverService::matchCapabilities const): Remove the error handling, and return a boolean instead,
83 since not mathing is not an error.
84 (WebDriver::WebDriverService::processCapabilities const): Return a list of matched capabilities, instead of the
85 JSON object corresponding to the first match.
86 (WebDriver::WebDriverService::newSession): Use helper connectToBrowser().
87 (WebDriver::WebDriverService::connectToBrowser): Create a session host for the next merged capabilities and
88 connect to the browser.
89 (WebDriver::WebDriverService::createSession): Start a new automation session. If capabilities didn't match,
90 start the process again calling connectToBrowser(), otherwise create the new session and top level.
92 * glib/SessionHostGlib.cpp:
93 (WebDriver::matchBrowserOptions): Helper to check browser options.
94 (WebDriver::SessionHost::matchCapabilities): Use matchBrowserOptions() and return true or false instead of an
95 optional error message.
96 (WebDriver::SessionHost::startAutomationSession): Create the session ID here and notify the caller in case
97 capabilities didn't match.
98 (WebDriver::SessionHost::setTargetList): Notify that capabilities did match.
99 * gtk/WebDriverServiceGtk.cpp:
100 (WebDriver::WebDriverService::platformMatchCapability const): Make it return bool.
101 * wpe/WebDriverServiceWPE.cpp:
102 (WebDriver::WebDriverService::platformMatchCapability const): Ditto.
104 2018-01-25 Carlos Garcia Campos <cgarcia@igalia.com>
106 WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_platformName fails
107 https://bugs.webkit.org/show_bug.cgi?id=181984
109 Reviewed by Carlos Alberto Lopez Perez.
111 Platform name is expected to be lower case, so do not compre ignoring case.
113 Fixes: imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_platformName
115 * WebDriverService.cpp:
116 (WebDriver::WebDriverService::matchCapabilities const):
118 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
120 WebDriver: several tests in imported/w3c/webdriver/tests/sessions/new_session/merge.py are failing
121 https://bugs.webkit.org/show_bug.cgi?id=180407
123 Reviewed by Carlos Alberto Lopez Perez.
125 This is actually a bug in the spec, see https://github.com/w3c/webdriver/issues/1203. It seems the idea in any
126 case is that we should check all the firstMatch capabilities before matching them, and return if there's any
129 * WebDriverService.cpp:
130 (WebDriver::WebDriverService::mergeCapabilities const):
131 (WebDriver::WebDriverService::processCapabilities const):
133 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
135 WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/response.py::test_timeouts fails
136 https://bugs.webkit.org/show_bug.cgi?id=180412
138 Reviewed by Carlos Alberto Lopez Perez.
140 Include all missing capabilities in the new session response message.
142 Fixes: imported/w3c/webdriver/tests/sessions/new_session/response.py::test_resp_capabilites
143 imported/w3c/webdriver/tests/sessions/new_session/response.py::test_resp_data
144 imported/w3c/webdriver/tests/sessions/new_session/response.py::test_timeouts
147 (WebDriver::Session::scriptTimeout const):
148 (WebDriver::Session::pageLoadTimeout const):
149 (WebDriver::Session::implicitWaitTimeout const):
150 * WebDriverService.cpp:
151 (WebDriver::WebDriverService::newSession):
153 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
155 WebDriver: matched capabilities should include setWindowRect
156 https://bugs.webkit.org/show_bug.cgi?id=180411
158 Reviewed by Carlos Alberto Lopez Perez.
160 Handle setWindowRect in capabilities. It's always true for GTK and false for WPE.
163 * WebDriverService.cpp:
164 (WebDriver::WebDriverService::parseCapabilities const):
165 (WebDriver::WebDriverService::matchCapabilities const):
166 (WebDriver::WebDriverService::newSession):
167 * gtk/WebDriverServiceGtk.cpp:
168 (WebDriver::WebDriverService::platformCapabilities):
169 * wpe/WebDriverServiceWPE.cpp:
170 (WebDriver::WebDriverService::platformCapabilities):
172 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
174 WebDriver: test imported/selenium/py/test/selenium/webdriver/common/api_example_tests.py::testChangeWindowSize fails
175 https://bugs.webkit.org/show_bug.cgi?id=181728
177 Reviewed by Sergio Villar Senin.
179 Due to a copy-paste error we are getting the window height using the width variable.
181 Fixes: imported/selenium/py/test/selenium/webdriver/common/api_example_tests.py::testChangeWindowSize
182 imported/selenium/py/test/selenium/webdriver/common/position_and_size_tests.py::testShouldScrollPageAndGetCoordinatesOfAnElementThatIsOutOfViewPort
183 imported/w3c/webdriver/tests/get_window_rect.py::test_payload
184 imported/w3c/webdriver/tests/set_window_rect.py::test_width_height_floats
185 imported/w3c/webdriver/tests/set_window_rect.py::test_height_width
186 imported/w3c/webdriver/tests/set_window_rect.py::test_height_width_larger_than_max
187 imported/w3c/webdriver/tests/contexts/resizing_and_positioning.py::test_window_resize
190 (WebDriver::Session::getToplevelBrowsingContextRect):
192 2018-01-22 Carlos Garcia Campos <cgarcia@igalia.com>
194 WebDriver: implement get element CSS value command
195 https://bugs.webkit.org/show_bug.cgi?id=181736
197 Reviewed by Carlos Alberto Lopez Perez.
199 13.4 Get Element CSS Value
200 https://w3c.github.io/webdriver/webdriver-spec.html#get-element-css-value
202 Fixes: imported/selenium/py/test/selenium/webdriver/common/rendered_webelement_tests.py::testShouldPickUpStyleOfAnElement
203 imported/selenium/py/test/selenium/webdriver/common/rendered_webelement_tests.py::testShouldAllowInheritedStylesToBeUsed
206 (WebDriver::Session::getElementProperty):
207 (WebDriver::Session::getElementCSSValue):
209 * WebDriverService.cpp:
210 (WebDriver::WebDriverService::getElementCSSValue):
211 * WebDriverService.h:
213 2018-01-22 Carlos Garcia Campos <cgarcia@igalia.com>
215 [GTK] WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/response.py is crashing in the bots
216 https://bugs.webkit.org/show_bug.cgi?id=181904
218 Reviewed by Carlos Alberto Lopez Perez.
220 Handle the case of failing to launch the browser. The test is actually failing because it's sending wrong
221 capabilities, the driver tries to fall back to the default driver, but since WebKit is not installed in the
222 bots, it fails to find the MiniBrowser. The test needs to be fixed, but we shouldn't crash when the browser
223 can't be spawned for whatever reason in any case. This patch handles that case and changes the boolean result of
224 connectToBrowser to be an optional error string instead. This way we can provide more detailed error message
225 when we reject the session creation because the browser failed to start.
228 * WebDriverService.cpp:
229 (WebDriver::WebDriverService::newSession):
230 * glib/SessionHostGlib.cpp:
231 (WebDriver::SessionHost::connectToBrowser):
232 (WebDriver::ConnectToBrowserAsyncData::ConnectToBrowserAsyncData):
233 (WebDriver::SessionHost::launchBrowser):
234 (WebDriver::SessionHost::setupConnection):
236 2018-01-11 Carlos Garcia Campos <cgarcia@igalia.com>
238 WebDriver: implement get timeouts command
239 https://bugs.webkit.org/show_bug.cgi?id=181524
241 Reviewed by Žan Doberšek.
244 https://w3c.github.io/webdriver/webdriver-spec.html#get-timeouts
246 Also simplify the way timeouts are handled in Session. Stop using Timeouts struct, because once the session is
247 created the timeouts are no longer optional, they have a default value. Use individual members instead that are
248 initialized to their default values on construction and only overriden by capabilities or set timeouts command.
250 Fixes: imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_timeouts
251 imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_default_timeouts
252 imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_new_timeouts
255 (WebDriver::Session::Session):
256 (WebDriver::Session::getTimeouts):
257 (WebDriver::Session::setTimeouts):
258 (WebDriver::Session::go):
259 (WebDriver::Session::back):
260 (WebDriver::Session::forward):
261 (WebDriver::Session::refresh):
262 (WebDriver::Session::findElements):
263 (WebDriver::Session::waitForNavigationToComplete):
264 (WebDriver::Session::executeScript):
266 * WebDriverService.cpp:
267 (WebDriver::WebDriverService::getTimeouts):
268 * WebDriverService.h:
270 2018-01-10 Zan Dobersek <zdobersek@igalia.com>
272 WebDriver: deserializeTimeouts() shouldn't reject double timeout values
273 https://bugs.webkit.org/show_bug.cgi?id=181473
275 Reviewed by Carlos Garcia Campos.
277 With these changes, the following tests are fixed:
278 imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldTimeoutIfScriptDoesNotInvokeCallbackWithLongTimeout
279 imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldDetectPageLoadsWhileWaitingOnAnAsyncScriptAndReturnAnError
280 imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldBeAbleToExecuteAsynchronousScripts
281 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldImplicitlyWaitForASingleElement
282 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldStillFailToFindAnElementWhenImplicitWaitsAreEnabled
283 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldReturnAfterFirstAttemptToFindOneAfterDisablingImplicitWaits
284 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldImplicitlyWaitUntilAtLeastOneElementIsFoundWhenSearchingForMany
285 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldStillFailToFindAnElemenstWhenImplicitWaitsAreEnabled
286 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldReturnAfterFirstAttemptToFindManyAfterDisablingImplicitWaits
287 imported/selenium/py/test/selenium/webdriver/common/page_load_timeout_tests.py::testShouldTimeoutOnPageLoadTakingTooLong
288 imported/selenium/py/test/selenium/webdriver/common/page_load_timeout_tests.py::testShouldTimeoutOnPageLoadTakingTooLong
289 imported/selenium/py/test/selenium/webdriver/common/webdriverwait_tests.py::testShouldWaitOnlyAsLongAsTimeoutSpecifiedWhenImplicitWaitsAreSet
291 The following two tests regress, and will be looked into separately:
292 imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_invalid
293 imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_invalid
295 * WebDriverService.cpp:
296 (WebDriver::integerValue): Helper function that retrieves an integer value
297 from a given JSON::Value object, if possible.
298 (WebDriver::deserializeTimeouts): Timeout JSON value has to be converted to
299 an integer, which is allowed if the value is of either Integer or Double type.
300 Helper integerValue() function retrieves the integer value, in addition to
301 ensuring that possible double value that we convert to an integer is already
302 in integer form to begin with.
304 2017-12-15 Carlos Garcia Campos <cgarcia@igalia.com>
306 WebDriver: add support for accept/dismiss and notify unhandled prompt behavior
307 https://bugs.webkit.org/show_bug.cgi?id=179999
309 Reviewed by Carlos Alberto Lopez Perez.
311 They work as accept and dismiss, but unexpected alert open is still reported.
314 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-known-prompt-handling-approaches-table
316 * Capabilities.h: Add DismissAndNotify and AcceptAndNotify to UnhandledPromptBehavior enum.
318 (WebDriver::Session::handleUnexpectedAlertOpen): Move default implementation to dismissAndNotifyAlert and
319 acceptAndNotifyAlert and use dismissAndNotifyAlert by default.
320 (WebDriver::Session::dismissAndNotifyAlert):
321 (WebDriver::Session::acceptAndNotifyAlert):
323 * WebDriverService.cpp:
324 (WebDriver::deserializeUnhandledPromptBehavior): Handle accept/dismiss and notify.
325 (WebDriver::WebDriverService::newSession): Ditto.
327 2017-12-11 Carlos Garcia Campos <cgarcia@igalia.com>
329 WebDriver: get active element should return no such element error when there isn't an active element
330 https://bugs.webkit.org/show_bug.cgi?id=180421
332 Reviewed by Brian Burg.
334 We currently return unknown error.
336 Fixes: imported/w3c/webdriver/tests/element_retrieval/get_active_element.py::test_missing_document_element
339 (WebDriver::Session::getActiveElement):
341 2017-12-04 Brian Burg <bburg@apple.com>
343 Web Automation: add flag to preserve legacy page screenshot behavior
344 https://bugs.webkit.org/show_bug.cgi?id=180313
345 <rdar://problem/34379930>
347 Reviewed by Joseph Pecoraro.
349 Set the clipToViewport flag to true when sending Automation.takeScreenshot.
350 This preserves the current behavior for this driver implementation.
353 (WebDriver::Session::takeScreenshot):
355 2017-12-04 Carlos Garcia Campos <cgarcia@igalia.com>
357 WebDriver: implement element property command
358 https://bugs.webkit.org/show_bug.cgi?id=180244
360 Reviewed by Brian Burg.
362 13.3 Get Element Property
363 https://w3c.github.io/webdriver/webdriver-spec.html#get-element-property
365 Fixes: imported/w3c/webdriver/tests/state/get_element_property.py::test_no_browsing_context
366 imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_dismiss
367 imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_accept
368 imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_missing_value
369 imported/w3c/webdriver/tests/state/get_element_property.py::test_element_stale
372 (WebDriver::Session::getElementAttribute):
373 (WebDriver::Session::getElementProperty):
375 * WebDriverService.cpp:
376 (WebDriver::WebDriverService::getElementProperty):
377 * WebDriverService.h:
379 2017-12-02 Carlos Garcia Campos <cgarcia@igalia.com>
381 WebDriver: handle user prompts shown while executing scripts
382 https://bugs.webkit.org/show_bug.cgi?id=179979
384 Reviewed by Brian Burg.
386 15.2 Executing Script
387 https://w3c.github.io/webdriver/webdriver-spec.html#executing-script
389 The rules to execute a function body are as follows. The algorithm will return success with the JSON
390 representation of the function’s return value, or an error if the evaluation of the function results in a
391 JavaScript exception being thrown or at any point during its execution an unhandled user prompt appears.
393 If at any point during the algorithm a user prompt appears, the user prompt handler must be invoked. If its
394 return value is an error, it must immediately return with that error and abort all subsequent substeps of this
397 This will be covered by new WPT tests that will be available after the next upgrade.
400 (WebDriver::CommandResult::CommandResult): Handle UnexpectedAlertOpen internal error.
402 (WebDriver::Session::handleUserPrompts): Move code to handleUnexpectedAlertOpen() and call it instead.
403 (WebDriver::Session::handleUnexpectedAlertOpen): Code moved here to be used also by executeScript().
404 (WebDriver::Session::executeScript): In case of UnexpectedAlertOpen error, call handleUnexpectedAlertOpen().
407 2017-12-01 Carlos Garcia Campos <cgarcia@igalia.com>
409 WebDriver: implement status command
410 https://bugs.webkit.org/show_bug.cgi?id=180133
412 Reviewed by Brian Burg.
415 https://w3c.github.io/webdriver/webdriver-spec.html#status
417 Fixes: imported/w3c/webdriver/tests/sessions/status.py::test_get_status_no_session
418 imported/w3c/webdriver/tests/sessions/status.py::test_status_with_session_running_on_endpoint_node
420 * WebDriverService.cpp:
421 (WebDriver::WebDriverService::status):
422 * WebDriverService.h:
424 2017-12-01 Carlos Garcia Campos <cgarcia@igalia.com>
426 WebDriver: end point nodes are only allowed to have one session
427 https://bugs.webkit.org/show_bug.cgi?id=180131
429 Reviewed by Brian Burg.
431 We are currently keeping a map of sessions, but our service is always and end point node, so only one session
432 can exist at a time. Make findSessionOrCompleteWithError() return a boolean instead, failing in case the sessionID
433 parameter is not found or it doesn't match the current session. Replace the session map and active session
434 pointer with a single session member and return SessionNotCreated error when new session command is received and
435 there's an active session.
438 A remote end has an associated maximum active sessions (an integer) that defines the number of active sessions
439 that are supported. This may be “unlimited” for intermediary nodes, but must be exactly one for a remote end
440 that is an endpoint node.
441 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-maximum-active-sessions
443 Fixes: imported/w3c/webdriver/tests/sessions/new_session/default_values.py::test_repeat_new_session
445 * WebDriverService.cpp:
446 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
447 (WebDriver::WebDriverService::newSession):
448 (WebDriver::WebDriverService::deleteSession):
449 (WebDriver::WebDriverService::status):
450 (WebDriver::WebDriverService::setTimeouts):
451 (WebDriver::WebDriverService::go):
452 (WebDriver::WebDriverService::getCurrentURL):
453 (WebDriver::WebDriverService::back):
454 (WebDriver::WebDriverService::forward):
455 (WebDriver::WebDriverService::refresh):
456 (WebDriver::WebDriverService::getTitle):
457 (WebDriver::WebDriverService::getWindowHandle):
458 (WebDriver::WebDriverService::setWindowRect):
459 (WebDriver::WebDriverService::closeWindow):
460 (WebDriver::WebDriverService::switchToWindow):
461 (WebDriver::WebDriverService::getWindowHandles):
462 (WebDriver::WebDriverService::switchToFrame):
463 (WebDriver::WebDriverService::switchToParentFrame):
464 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
465 (WebDriver::WebDriverService::findElement):
466 (WebDriver::WebDriverService::findElements):
467 (WebDriver::WebDriverService::findElementFromElement):
468 (WebDriver::WebDriverService::findElementsFromElement):
469 (WebDriver::WebDriverService::getActiveElement):
470 (WebDriver::WebDriverService::isElementSelected):
471 (WebDriver::WebDriverService::getElementAttribute):
472 (WebDriver::WebDriverService::getElementText):
473 (WebDriver::WebDriverService::getElementTagName):
474 (WebDriver::WebDriverService::getElementRect):
475 (WebDriver::WebDriverService::isElementEnabled):
476 (WebDriver::WebDriverService::isElementDisplayed):
477 (WebDriver::WebDriverService::elementClick):
478 (WebDriver::WebDriverService::elementClear):
479 (WebDriver::WebDriverService::elementSendKeys):
480 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
481 (WebDriver::WebDriverService::executeScript):
482 (WebDriver::WebDriverService::executeAsyncScript):
483 (WebDriver::WebDriverService::getAllCookies):
484 (WebDriver::WebDriverService::getNamedCookie):
485 (WebDriver::deserializeCookie):
486 (WebDriver::WebDriverService::addCookie):
487 (WebDriver::WebDriverService::deleteCookie):
488 (WebDriver::WebDriverService::deleteAllCookies):
489 (WebDriver::WebDriverService::dismissAlert):
490 (WebDriver::WebDriverService::acceptAlert):
491 (WebDriver::WebDriverService::getAlertText):
492 (WebDriver::WebDriverService::sendAlertText):
493 (WebDriver::WebDriverService::takeScreenshot):
494 (WebDriver::WebDriverService::takeElementScreenshot):
495 * WebDriverService.h:
497 2017-11-30 Carlos Garcia Campos <cgarcia@igalia.com>
499 WebDriver: locator strategy should be validated before trying to find elements
500 https://bugs.webkit.org/show_bug.cgi?id=180187
502 Reviewed by Carlos Alberto Lopez Perez.
504 We currently rely on the js atom to raise an exception in case the locator strategy is not valid, but in case of
505 find element from element, if the element doesn't exist we fail with stale element error instead of invalid
506 argument as expected. So, let's validate the strategies when parsing them, which would also avoid going to the
507 browser in cae of invalid strategy.
509 Fixes: imported/w3c/webdriver/tests/retrieval/find_element_from_element.py::test_invalid_using_argument[a]
511 * WebDriverService.cpp:
512 (WebDriver::isValidStrategy):
513 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
515 2017-11-30 Carlos Garcia Campos <cgarcia@igalia.com>
517 WebDriver: remove elementSubmit command
518 https://bugs.webkit.org/show_bug.cgi?id=180186
520 Reviewed by Carlos Alberto Lopez Perez.
522 It's not in the spec, we had it only because selenium used it, but now it uses execute_script with custom code
523 to implement submit, so we can just remove it.
526 (WebDriver::Session::elementSubmit): Deleted.
528 * WebDriverService.cpp:
529 (WebDriver::WebDriverService::elementSubmit): Deleted.
530 * WebDriverService.h:
532 2017-11-14 Carlos Garcia Campos <cgarcia@igalia.com>
534 Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
535 https://bugs.webkit.org/show_bug.cgi?id=173793
537 Reviewed by Joseph Pecoraro.
541 (WebDriver::CommandResult::CommandResult):
543 (WebDriver::CommandResult::success):
544 (WebDriver::CommandResult::fail):
545 (WebDriver::CommandResult::result const):
546 (WebDriver::CommandResult::setAdditionalErrorData):
547 (WebDriver::CommandResult::additionalErrorData const):
549 (WebDriver::firstWindowHandleInResult):
550 (WebDriver::Session::handleUserPrompts):
551 (WebDriver::Session::reportUnexpectedAlertOpen):
552 (WebDriver::Session::go):
553 (WebDriver::Session::getCurrentURL):
554 (WebDriver::Session::back):
555 (WebDriver::Session::forward):
556 (WebDriver::Session::refresh):
557 (WebDriver::Session::getTitle):
558 (WebDriver::Session::getWindowHandle):
559 (WebDriver::Session::closeTopLevelBrowsingContext):
560 (WebDriver::Session::switchToWindow):
561 (WebDriver::Session::getWindowHandles):
562 (WebDriver::Session::switchToFrame):
563 (WebDriver::Session::switchToParentFrame):
564 (WebDriver::Session::getToplevelBrowsingContextRect):
565 (WebDriver::Session::moveToplevelBrowsingContextWindow):
566 (WebDriver::Session::resizeToplevelBrowsingContextWindow):
567 (WebDriver::Session::createElement):
568 (WebDriver::Session::extractElement):
569 (WebDriver::Session::extractElementID):
570 (WebDriver::Session::computeElementLayout):
571 (WebDriver::Session::findElements):
572 (WebDriver::Session::isElementSelected):
573 (WebDriver::Session::getElementText):
574 (WebDriver::Session::getElementTagName):
575 (WebDriver::Session::getElementRect):
576 (WebDriver::Session::isElementEnabled):
577 (WebDriver::Session::isElementDisplayed):
578 (WebDriver::Session::getElementAttribute):
579 (WebDriver::Session::waitForNavigationToComplete):
580 (WebDriver::Session::selectOptionElement):
581 (WebDriver::Session::elementClick):
582 (WebDriver::Session::elementClear):
583 (WebDriver::Session::elementSendKeys):
584 (WebDriver::Session::elementSubmit):
585 (WebDriver::Session::handleScriptResult):
586 (WebDriver::Session::executeScript):
587 (WebDriver::Session::performMouseInteraction):
588 (WebDriver::Session::performKeyboardInteractions):
589 (WebDriver::parseAutomationCookie):
590 (WebDriver::builtAutomationCookie):
591 (WebDriver::serializeCookie):
592 (WebDriver::Session::getAllCookies):
593 (WebDriver::Session::getNamedCookie):
594 (WebDriver::Session::addCookie):
595 (WebDriver::Session::deleteCookie):
596 (WebDriver::Session::deleteAllCookies):
597 (WebDriver::Session::dismissAlert):
598 (WebDriver::Session::acceptAlert):
599 (WebDriver::Session::getAlertText):
600 (WebDriver::Session::sendAlertText):
601 (WebDriver::Session::takeScreenshot):
604 (WebDriver::SessionHost::sendCommandToBackend):
605 (WebDriver::SessionHost::dispatchMessage):
607 * WebDriverService.cpp:
608 (WebDriver::WebDriverService::handleRequest):
609 (WebDriver::WebDriverService::sendResponse const):
610 (WebDriver::deserializeTimeouts):
611 (WebDriver::WebDriverService::parseCapabilities const):
612 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
613 (WebDriver::WebDriverService::validatedCapabilities const):
614 (WebDriver::WebDriverService::mergeCapabilities const):
615 (WebDriver::WebDriverService::matchCapabilities const):
616 (WebDriver::WebDriverService::processCapabilities const):
617 (WebDriver::WebDriverService::newSession):
618 (WebDriver::WebDriverService::deleteSession):
619 (WebDriver::WebDriverService::setTimeouts):
620 (WebDriver::WebDriverService::go):
621 (WebDriver::WebDriverService::getCurrentURL):
622 (WebDriver::WebDriverService::back):
623 (WebDriver::WebDriverService::forward):
624 (WebDriver::WebDriverService::refresh):
625 (WebDriver::WebDriverService::getTitle):
626 (WebDriver::WebDriverService::getWindowHandle):
627 (WebDriver::WebDriverService::getWindowRect):
628 (WebDriver::valueAsNumberInRange):
629 (WebDriver::WebDriverService::setWindowRect):
630 (WebDriver::WebDriverService::closeWindow):
631 (WebDriver::WebDriverService::switchToWindow):
632 (WebDriver::WebDriverService::getWindowHandles):
633 (WebDriver::WebDriverService::switchToFrame):
634 (WebDriver::WebDriverService::switchToParentFrame):
635 (WebDriver::findElementOrCompleteWithError):
636 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
637 (WebDriver::WebDriverService::findElement):
638 (WebDriver::WebDriverService::findElements):
639 (WebDriver::WebDriverService::findElementFromElement):
640 (WebDriver::WebDriverService::findElementsFromElement):
641 (WebDriver::WebDriverService::isElementSelected):
642 (WebDriver::WebDriverService::getElementAttribute):
643 (WebDriver::WebDriverService::getElementText):
644 (WebDriver::WebDriverService::getElementTagName):
645 (WebDriver::WebDriverService::getElementRect):
646 (WebDriver::WebDriverService::isElementEnabled):
647 (WebDriver::WebDriverService::isElementDisplayed):
648 (WebDriver::WebDriverService::elementClick):
649 (WebDriver::WebDriverService::elementClear):
650 (WebDriver::WebDriverService::elementSendKeys):
651 (WebDriver::WebDriverService::elementSubmit):
652 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
653 (WebDriver::WebDriverService::executeScript):
654 (WebDriver::WebDriverService::executeAsyncScript):
655 (WebDriver::WebDriverService::getAllCookies):
656 (WebDriver::WebDriverService::getNamedCookie):
657 (WebDriver::deserializeCookie):
658 (WebDriver::WebDriverService::addCookie):
659 (WebDriver::WebDriverService::deleteCookie):
660 (WebDriver::WebDriverService::deleteAllCookies):
661 (WebDriver::WebDriverService::dismissAlert):
662 (WebDriver::WebDriverService::acceptAlert):
663 (WebDriver::WebDriverService::getAlertText):
664 (WebDriver::WebDriverService::sendAlertText):
665 (WebDriver::WebDriverService::takeScreenshot):
666 (WebDriver::WebDriverService::takeElementScreenshot):
667 * WebDriverService.h:
668 * gtk/WebDriverServiceGtk.cpp:
669 (WebDriver::WebDriverService::platformValidateCapability const):
670 (WebDriver::WebDriverService::platformMatchCapability const):
671 (WebDriver::WebDriverService::platformParseCapabilities const):
672 * wpe/WebDriverServiceWPE.cpp:
673 (WebDriver::WebDriverService::platformValidateCapability const):
674 (WebDriver::WebDriverService::platformMatchCapability const):
675 (WebDriver::WebDriverService::platformParseCapabilities const):
677 2017-11-28 Carlos Garcia Campos <cgarcia@igalia.com>
679 [GTK] WebDriver: stop making mandatory to provide a browser path if webkitgtk:browserOptions is present in capabilities
680 https://bugs.webkit.org/show_bug.cgi?id=180012
682 Reviewed by Carlos Alberto Lopez Perez.
684 Everything should be optional. We might want to disable overlay scrollbars, but still using the default browser,
685 for example, as I'm doing when running the selenium tests. We might also want to provide additional browser
686 arguments, but using the default browser.
688 * gtk/WebDriverServiceGtk.cpp:
689 (WebDriver::WebDriverService::platformValidateCapability const): Do not consider invalid to not provide a
690 browser binary when webkitgtk:browserOptions is present.
691 (WebDriver::WebDriverService::platformParseCapabilities const): Override default capabilities with the ones
694 2017-11-27 Carlos Garcia Campos <cgarcia@igalia.com>
696 WebDriver: Implement get active element command
697 https://bugs.webkit.org/show_bug.cgi?id=180001
699 Reviewed by Brian Burg.
701 12.6 Get Active Element
702 https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element
704 Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.
707 (WebDriver::Session::getActiveElement):
709 * WebDriverService.cpp:
710 (WebDriver::WebDriverService::getActiveElement):
711 * WebDriverService.h:
713 2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>
715 WebDriver: do not try to parse http body if method is not POST
716 https://bugs.webkit.org/show_bug.cgi?id=179918
718 Reviewed by Darin Adler.
722 5. If request’s method is POST:
724 1. Let parse result be the result of parsing as JSON with request’s body as the argument. If this process
725 throws an exception, return an error with error code invalid argument and jump back to step 1 in this
728 2. If parse result is not an Object, send an error with error code invalid argument and jump back to step 1
729 in this overall algorithm.
731 Otherwise, let parameters be parse result.
733 Otherwise, let parameters be null.
736 https://w3c.github.io/webdriver/webdriver-spec.html#processing-model
738 Now, w3c tests are sending null as body of delete session command (it used to be just empty), making it fail
739 with invalid argument error.
741 * WebDriverService.cpp:
742 (WebDriver::WebDriverService::findCommand):
743 (WebDriver::WebDriverService::handleRequest):
744 * WebDriverService.h:
746 2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>
748 WebDriver: crash in Session::computeElementLayout when called without a current browsing context
749 https://bugs.webkit.org/show_bug.cgi?id=179917
751 Reviewed by Darin Adler.
753 In the case of computeElementLayout message, the frameHandle parameter is not optional, but we still need to
754 provide a valid value (empty string means the default frame) when m_currentBrowsingContext is std::nullopt. The
755 same applies to selectOptionElement.
758 (WebDriver::Session::computeElementLayout):
759 (WebDriver::Session::selectOptionElement):
761 2017-11-15 Carlos Garcia Campos <cgarcia@igalia.com>
763 [WPE] Add initial support for WebDriver
764 https://bugs.webkit.org/show_bug.cgi?id=179727
766 Reviewed by Michael Catanzaro.
768 Add WPE implementation for platform-specific methods. Move the version handling to a common file
769 WebDriverServiceGLib.cpp.
774 * glib/WebDriverServiceGLib.cpp: Added.
775 (WebDriver::parseVersion):
776 (WebDriver::WebDriverService::platformCompareBrowserVersions):
777 * gtk/WebDriverServiceGtk.cpp:
778 * wpe/WebDriverServiceWPE.cpp: Copied from Source/WebDriver/gtk/WebDriverServiceGtk.cpp.
779 (WebDriver::WebDriverService::platformCapabilities):
780 (WebDriver::WebDriverService::platformValidateCapability const):
781 (WebDriver::WebDriverService::platformMatchCapability const):
782 (WebDriver::WebDriverService::platformParseCapabilities const):
784 2017-11-15 Ryan Haddad <ryanhaddad@apple.com>
786 Unreviewed, rolling out r224863.
788 Introduced LayoutTest crashes on iOS Simulator.
792 "Move JSONValues to WTF and convert uses of InspectorValues.h
794 https://bugs.webkit.org/show_bug.cgi?id=173793
795 https://trac.webkit.org/changeset/224863
797 2017-11-14 Carlos Garcia Campos <cgarcia@igalia.com>
799 Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
800 https://bugs.webkit.org/show_bug.cgi?id=173793
802 Reviewed by Brian Burg.
806 (WebDriver::CommandResult::CommandResult):
808 (WebDriver::CommandResult::success):
809 (WebDriver::CommandResult::fail):
810 (WebDriver::CommandResult::result const):
811 (WebDriver::CommandResult::setAdditionalErrorData):
812 (WebDriver::CommandResult::additionalErrorData const):
814 (WebDriver::firstWindowHandleInResult):
815 (WebDriver::Session::handleUserPrompts):
816 (WebDriver::Session::reportUnexpectedAlertOpen):
817 (WebDriver::Session::go):
818 (WebDriver::Session::getCurrentURL):
819 (WebDriver::Session::back):
820 (WebDriver::Session::forward):
821 (WebDriver::Session::refresh):
822 (WebDriver::Session::getTitle):
823 (WebDriver::Session::getWindowHandle):
824 (WebDriver::Session::closeTopLevelBrowsingContext):
825 (WebDriver::Session::switchToWindow):
826 (WebDriver::Session::getWindowHandles):
827 (WebDriver::Session::switchToFrame):
828 (WebDriver::Session::switchToParentFrame):
829 (WebDriver::Session::getToplevelBrowsingContextRect):
830 (WebDriver::Session::moveToplevelBrowsingContextWindow):
831 (WebDriver::Session::resizeToplevelBrowsingContextWindow):
832 (WebDriver::Session::createElement):
833 (WebDriver::Session::extractElement):
834 (WebDriver::Session::extractElementID):
835 (WebDriver::Session::computeElementLayout):
836 (WebDriver::Session::findElements):
837 (WebDriver::Session::isElementSelected):
838 (WebDriver::Session::getElementText):
839 (WebDriver::Session::getElementTagName):
840 (WebDriver::Session::getElementRect):
841 (WebDriver::Session::isElementEnabled):
842 (WebDriver::Session::isElementDisplayed):
843 (WebDriver::Session::getElementAttribute):
844 (WebDriver::Session::waitForNavigationToComplete):
845 (WebDriver::Session::selectOptionElement):
846 (WebDriver::Session::elementClick):
847 (WebDriver::Session::elementClear):
848 (WebDriver::Session::elementSendKeys):
849 (WebDriver::Session::elementSubmit):
850 (WebDriver::Session::handleScriptResult):
851 (WebDriver::Session::executeScript):
852 (WebDriver::Session::performMouseInteraction):
853 (WebDriver::Session::performKeyboardInteractions):
854 (WebDriver::parseAutomationCookie):
855 (WebDriver::builtAutomationCookie):
856 (WebDriver::serializeCookie):
857 (WebDriver::Session::getAllCookies):
858 (WebDriver::Session::getNamedCookie):
859 (WebDriver::Session::addCookie):
860 (WebDriver::Session::deleteCookie):
861 (WebDriver::Session::deleteAllCookies):
862 (WebDriver::Session::dismissAlert):
863 (WebDriver::Session::acceptAlert):
864 (WebDriver::Session::getAlertText):
865 (WebDriver::Session::sendAlertText):
866 (WebDriver::Session::takeScreenshot):
869 (WebDriver::SessionHost::sendCommandToBackend):
870 (WebDriver::SessionHost::dispatchMessage):
872 * WebDriverService.cpp:
873 (WebDriver::WebDriverService::handleRequest):
874 (WebDriver::WebDriverService::sendResponse const):
875 (WebDriver::deserializeTimeouts):
876 (WebDriver::WebDriverService::parseCapabilities const):
877 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
878 (WebDriver::WebDriverService::validatedCapabilities const):
879 (WebDriver::WebDriverService::mergeCapabilities const):
880 (WebDriver::WebDriverService::matchCapabilities const):
881 (WebDriver::WebDriverService::processCapabilities const):
882 (WebDriver::WebDriverService::newSession):
883 (WebDriver::WebDriverService::deleteSession):
884 (WebDriver::WebDriverService::setTimeouts):
885 (WebDriver::WebDriverService::go):
886 (WebDriver::WebDriverService::getCurrentURL):
887 (WebDriver::WebDriverService::back):
888 (WebDriver::WebDriverService::forward):
889 (WebDriver::WebDriverService::refresh):
890 (WebDriver::WebDriverService::getTitle):
891 (WebDriver::WebDriverService::getWindowHandle):
892 (WebDriver::WebDriverService::getWindowRect):
893 (WebDriver::valueAsNumberInRange):
894 (WebDriver::WebDriverService::setWindowRect):
895 (WebDriver::WebDriverService::closeWindow):
896 (WebDriver::WebDriverService::switchToWindow):
897 (WebDriver::WebDriverService::getWindowHandles):
898 (WebDriver::WebDriverService::switchToFrame):
899 (WebDriver::WebDriverService::switchToParentFrame):
900 (WebDriver::findElementOrCompleteWithError):
901 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
902 (WebDriver::WebDriverService::findElement):
903 (WebDriver::WebDriverService::findElements):
904 (WebDriver::WebDriverService::findElementFromElement):
905 (WebDriver::WebDriverService::findElementsFromElement):
906 (WebDriver::WebDriverService::isElementSelected):
907 (WebDriver::WebDriverService::getElementAttribute):
908 (WebDriver::WebDriverService::getElementText):
909 (WebDriver::WebDriverService::getElementTagName):
910 (WebDriver::WebDriverService::getElementRect):
911 (WebDriver::WebDriverService::isElementEnabled):
912 (WebDriver::WebDriverService::isElementDisplayed):
913 (WebDriver::WebDriverService::elementClick):
914 (WebDriver::WebDriverService::elementClear):
915 (WebDriver::WebDriverService::elementSendKeys):
916 (WebDriver::WebDriverService::elementSubmit):
917 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
918 (WebDriver::WebDriverService::executeScript):
919 (WebDriver::WebDriverService::executeAsyncScript):
920 (WebDriver::WebDriverService::getAllCookies):
921 (WebDriver::WebDriverService::getNamedCookie):
922 (WebDriver::deserializeCookie):
923 (WebDriver::WebDriverService::addCookie):
924 (WebDriver::WebDriverService::deleteCookie):
925 (WebDriver::WebDriverService::deleteAllCookies):
926 (WebDriver::WebDriverService::dismissAlert):
927 (WebDriver::WebDriverService::acceptAlert):
928 (WebDriver::WebDriverService::getAlertText):
929 (WebDriver::WebDriverService::sendAlertText):
930 (WebDriver::WebDriverService::takeScreenshot):
931 (WebDriver::WebDriverService::takeElementScreenshot):
932 * WebDriverService.h:
933 * gtk/WebDriverServiceGtk.cpp:
934 (WebDriver::WebDriverService::platformValidateCapability const):
935 (WebDriver::WebDriverService::platformMatchCapability const):
936 (WebDriver::WebDriverService::platformParseCapabilities const):
938 2017-11-07 Brian Burg <bburg@apple.com>
940 Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
941 https://bugs.webkit.org/show_bug.cgi?id=179129
942 <rdar://problem/35297038>
944 Reviewed by Simon Fraser.
946 Adjust code to use the proper coordinate system when requesting element layout.
949 (WebDriver::Session::computeElementLayout):
951 2017-11-09 Carlos Garcia Campos <cgarcia@igalia.com>
953 WebDriver: WebDriverService::matchCapabilities should follow the spec
954 https://bugs.webkit.org/show_bug.cgi?id=179371
956 Reviewed by Brian Burg.
958 The returned object should contain all the entries mentioned in the spec, not only the ones already present in
959 the passed in capabilities object.
961 7.2 Processing Capabilities
962 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-matching-capabilities
964 * WebDriverService.cpp:
965 (WebDriver::WebDriverService::matchCapabilities const):
966 (WebDriver::WebDriverService::processCapabilities const):
967 * WebDriverService.h:
969 2017-11-09 Carlos Garcia Campos <cgarcia@igalia.com>
971 WebDriver: capabilities with null value shouldn't be added to the validated capabilities object
972 https://bugs.webkit.org/show_bug.cgi?id=179369
974 Reviewed by Brian Burg.
976 "4. If deserialized is not null, set a property on result with name name and value deserialized."
978 7.2 Processing Capabilities
979 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
981 Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[platformName-None]
983 * WebDriverService.cpp:
984 (WebDriver::WebDriverService::validatedCapabilities const):
986 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
988 WebDriver: unknown capabilities should produce an InvalidArgument error when validating capabilities
989 https://bugs.webkit.org/show_bug.cgi?id=178868
991 Reviewed by Brian Burg.
993 7.2 Processing Capabilities
994 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
996 Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_extensions
998 * WebDriverService.cpp:
999 (WebDriver::WebDriverService::validatedCapabilities const):
1001 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
1003 WebDriver: deserializeTimeouts should fail if the value is not integer
1004 https://bugs.webkit.org/show_bug.cgi?id=178866
1006 Reviewed by Brian Burg.
1008 If value is not an integer, or it is less than 0 or greater than 2^64 – 1, return error with error code invalid
1010 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-deserialize-as-a-timeout
1012 Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body0]
1013 imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body1]
1015 * WebDriverService.cpp:
1016 (WebDriver::deserializeTimeouts):
1018 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
1020 WebDriver: failing to process capabilities should produce InvalidArgument error not SessionNotCreated
1021 https://bugs.webkit.org/show_bug.cgi?id=178864
1023 Reviewed by Brian Burg.
1025 Fixes most of the tests in imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py.
1027 7.2 Processing Capabilities
1028 https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1030 * WebDriverService.cpp:
1031 (WebDriver::WebDriverService::processCapabilities const):
1033 2017-10-10 Sam Weinig <sam@webkit.org>
1035 Replace copyKeysToVector/copyValuesToVector with copyToVector(map.keys())/copyToVector(map.values())
1036 https://bugs.webkit.org/show_bug.cgi?id=178102
1038 Reviewed by Tim Horton.
1041 (WebDriver::SessionHost::inspectorDisconnected):
1043 2017-10-02 Carlos Garcia Campos <cgarcia@igalia.com>
1045 WebDriver: HTTP status code is not correct for some of the errors
1046 https://bugs.webkit.org/show_bug.cgi?id=177354
1048 Reviewed by Brian Burg.
1050 I think this changed in the spec at some point. The thing is that no such alert, frame and window and stale
1051 element reference errors should return 404 instead of 400.
1053 https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
1055 * CommandResult.cpp:
1056 (WebDriver::CommandResult::httpStatusCode const):
1058 2017-09-19 Carlos Garcia Campos <cgarcia@igalia.com>
1060 WebDriver: Implement commands to get and set the window rect
1061 https://bugs.webkit.org/show_bug.cgi?id=177134
1063 Reviewed by Brian Burg.
1065 We are currently implementing the selenium legacy ones, we should implement the w3c ones instead.
1067 https://w3c.github.io/webdriver/webdriver-spec.html#resizing-and-positioning-windows
1070 (WebDriver::Session::getToplevelBrowsingContextRect): Helper to get the window rect. This is used by both get
1071 and set window rect commands.
1072 (WebDriver::Session::moveToplevelBrowsingContextwindow): Helper to ask automation to move the window.
1073 (WebDriver::Session::resizeToplevelBrowsingContextwindow): Helper to ask automation to resize the window.
1074 (WebDriver::Session::getWindowRect): Handle prompts and then call getToplevelBrowsingContextRect().
1075 (WebDriver::Session::setWindowRect): Handle prompts and then move and resize the window according to the given
1076 parameters and finish the operation calling getToplevelBrowsingContextRect().
1078 * WebDriverService.cpp:
1079 (WebDriver::WebDriverService::getWindowRect): Ask the session to get the window rect.
1080 (WebDriver::valueAsNumberInRange): Helper to check a value is a valid number in the given range.
1081 (WebDriver::WebDriverService::setWindowRect): Get and check size and position from parameters and then ask the
1082 session to set the window rect.
1083 * WebDriverService.h:
1085 2017-09-19 Carlos Garcia Campos <cgarcia@igalia.com>
1087 WebDriver: wrong response in case of errors
1088 https://bugs.webkit.org/show_bug.cgi?id=177127
1090 Reviewed by Brian Burg.
1092 I misunderstood the spec when I implemented this, so we either return a "value" key with the result in case of
1093 success or the error object as the body in case of error. We should always add a "value" key to the body and set
1094 it with either the result or the error object.
1096 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-an-error
1098 * WebDriverService.cpp:
1099 (WebDriver::WebDriverService::sendResponse const):
1101 2017-09-18 Carlos Garcia Campos <cgarcia@igalia.com>
1103 WebDriver: wrong key name for capabilities in new session response
1104 https://bugs.webkit.org/show_bug.cgi?id=177074
1106 Reviewed by Brian Burg.
1108 We are using "value", it should be "capabilities".
1109 https://w3c.github.io/webdriver/webdriver-spec.html#new-session
1111 * WebDriverService.cpp:
1112 (WebDriver::WebDriverService::newSession):
1114 2017-09-18 Carlos Garcia Campos <cgarcia@igalia.com>
1116 WebDriver: HTTP responses should include Cache-Control header with no-cache value
1117 https://bugs.webkit.org/show_bug.cgi?id=177073
1119 Reviewed by Sergio Villar Senin.
1121 6.3 Processing Model.
1122 Set the response’s header with name and value with the following values:
1124 Content-Type "application/json; charset=utf-8"
1125 Cache-Control "no-cache"
1127 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-a-response
1129 We were setting the Content-Type, but not the Cache-Control. This is checked by all WPT WebDriver tests.
1131 * soup/HTTPServerSoup.cpp:
1132 (WebDriver::HTTPServer::listen): Add Cache-Control header.
1134 2017-09-18 Michael Catanzaro <mcatanzaro@igalia.com>
1136 [CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
1137 https://bugs.webkit.org/show_bug.cgi?id=174558
1139 Reviewed by Alex Christensen.
1143 2017-09-15 JF Bastien <jfbastien@apple.com>
1145 WTF: use Forward.h when appropriate instead of Vector.h
1146 https://bugs.webkit.org/show_bug.cgi?id=176984
1148 Reviewed by Saam Barati.
1150 There's no need to include Vector.h when Forward.h will suffice. All we need is to move the template default parameters from Vector, and then the forward declaration can be used in so many new places: if a header only takes Vector by reference, rvalue reference, pointer, returns any of these, or has them as members then the header doesn't need to see the definition because the declaration will suffice.
1154 2017-09-09 Carlos Garcia Campos <cgarcia@igalia.com>
1156 WebDriver: ensure we close all windows handles when closing the session
1157 https://bugs.webkit.org/show_bug.cgi?id=176508
1159 Reviewed by Brian Burg.
1161 The spec says that when closing the session all top level browsing contexts should be closed. We are currently
1162 checking if we have an active top level browsing context and then we try to close it before trying with the
1163 rest. It can happen that we are in an inconsistent state, for example if the current top level browsing context
1164 has been closed by JavaScript or another action and the user didn't switch to another one before closing the
1165 session. In such case, closing the session will fail with NoSuchwindow and any other window open will not be
1166 closed. It's safer to always ask for all window handles and close them, which is what the spec says too.
1169 (WebDriver::firstWindowHandleInResult): Helper class to get the first window handle in the result array.
1170 (WebDriver::Session::closeAllToplevelBrowsingContexts): Use firstWindowHandleInResult().
1171 (WebDriver::Session::close): Close the current top level browsing context and get all window handles to close
1174 2017-08-28 Carlos Garcia Campos <cgarcia@igalia.com>
1176 WebDriver: implement screen capture commands
1177 https://bugs.webkit.org/show_bug.cgi?id=174615
1179 Reviewed by Brian Burg.
1181 Implement takeScreenshot and takeElementScreenshot commands.
1184 https://w3c.github.io/webdriver/webdriver-spec.html#screen-capture
1186 * CommandResult.cpp:
1187 (WebDriver::CommandResult::CommandResult): Handle ScreenshotError protocol error.
1188 (WebDriver::CommandResult::httpStatusCode const): Add UnableToCaptureScreen.
1189 (WebDriver::CommandResult::errorString const): Ditto.
1192 (WebDriver::Session::takeScreenshot):
1194 * WebDriverService.cpp:
1195 (WebDriver::WebDriverService::takeScreenshot):
1196 (WebDriver::WebDriverService::takeElementScreenshot):
1197 * WebDriverService.h:
1199 2017-08-28 Carlos Garcia Campos <cgarcia@igalia.com>
1201 WebDriver: implement cookies commands
1202 https://bugs.webkit.org/show_bug.cgi?id=174613
1204 Reviewed by Brian Burg.
1206 Add cookies commands.
1209 https://w3c.github.io/webdriver/webdriver-spec.html#cookies
1211 * CommandResult.cpp:
1212 (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
1213 (WebDriver::CommandResult::errorString const): Ditto.
1216 (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
1217 (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
1218 (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
1219 (WebDriver::Session::getAllCookies):
1220 (WebDriver::Session::getNamedCookie):
1221 (WebDriver::Session::addCookie):
1222 (WebDriver::Session::deleteCookie):
1223 (WebDriver::Session::deleteAllCookies):
1225 * WebDriverService.cpp:
1226 (WebDriver::WebDriverService::getAllCookies):
1227 (WebDriver::WebDriverService::getNamedCookie):
1228 (WebDriver::deserializeCookie):
1229 (WebDriver::WebDriverService::addCookie):
1230 (WebDriver::WebDriverService::deleteCookie):
1231 (WebDriver::WebDriverService::deleteAllCookies):
1232 * WebDriverService.h:
1234 2017-07-28 Carlos Garcia Campos <cgarcia@igalia.com>
1236 WebDriver: fix return value of close window command
1237 https://bugs.webkit.org/show_bug.cgi?id=174861
1239 Reviewed by Brian Burg.
1241 We are currently returning null, but we should return the list of window handles, and try to close the session
1242 if there aren't more window handles.
1245 https://w3c.github.io/webdriver/webdriver-spec.html#close-window
1247 3. If there are no more open top-level browsing contexts, then try to close the session.
1248 4. Return the result of running the remote end steps for the Get Window Handles command.
1251 (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
1252 context and the next one if there are more.
1253 (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
1255 (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
1256 getWindowHandles() when done.
1257 (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
1258 (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
1259 toplevel browsing context.
1262 * WebDriverService.cpp:
1263 (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
1264 (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
1265 (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
1266 * WebDriverService.h: Remove unused quit() method.
1267 * glib/SessionHostGlib.cpp:
1268 (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
1269 (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
1271 2017-08-14 Carlos Garcia Campos <cgarcia@igalia.com>
1273 WebDriver: handle click events on option elements
1274 https://bugs.webkit.org/show_bug.cgi?id=174710
1275 <rdar://problem/33459305>
1277 Reviewed by Brian Burg.
1279 Option elements are considered as a special case by the specification. When clicking an option element, we
1280 should get its container and use it when scrolling into view and calculating in-view center point instead of the
1281 option element itself. Then, we should not emulate a click, but change the selected status of the option element
1282 like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
1283 option to call selectOptionElement() or performMouseInteraction().
1285 This fixes more than 20 selenium tests.
1287 * CommandResult.cpp:
1288 (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
1289 (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
1290 (WebDriver::CommandResult::errorString const): Ditto.
1293 (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
1294 (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
1295 the element is an option or not.
1298 2017-08-11 Carlos Alberto Lopez Perez <clopez@igalia.com>
1300 Fix build warning in WebDriverService.h
1301 https://bugs.webkit.org/show_bug.cgi?id=166682
1303 Unreviewed build fix.
1305 * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
1307 2017-08-08 Michael Catanzaro <mcatanzaro@igalia.com>
1309 Unreviewed, fix Ubuntu LTS build
1310 https://bugs.webkit.org/show_bug.cgi?id=174490
1312 * glib/SessionHostGlib.cpp:
1314 2017-08-08 Michael Catanzaro <mcatanzaro@igalia.com>
1316 [CMake] Properly test if compiler supports compiler flags
1317 https://bugs.webkit.org/show_bug.cgi?id=174490
1319 Reviewed by Konstantin Tokarev.
1321 * WebDriverService.cpp:
1322 (WebDriver::WebDriverService::run):
1323 * glib/SessionHostGlib.cpp:
1325 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1327 Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
1328 https://bugs.webkit.org/show_bug.cgi?id=175261
1330 Reviewed by Brian Burg.
1332 * CommandResult.cpp:
1333 (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
1335 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1337 WebDriver: implement unhandled prompt behavior
1338 https://bugs.webkit.org/show_bug.cgi?id=175184
1340 Reviewed by Brian Burg.
1342 Handle user prompts before running some of the commands according to the specification.
1344 * Capabilities.h: Add UnhandledPromptBehavior capability.
1345 * CommandResult.cpp:
1346 (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
1347 (WebDriver::CommandResult::errorString const): Ditto.
1349 (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
1350 as part of the result error message.
1351 (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
1353 (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
1354 on the unhandled prompt behavior.
1355 (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
1356 including the alert text as additional error data.
1357 (WebDriver::Session::go): Handle user prompts before running the command.
1358 (WebDriver::Session::getCurrentURL): Ditto.
1359 (WebDriver::Session::back): Ditto.
1360 (WebDriver::Session::forward): Ditto.
1361 (WebDriver::Session::refresh): Ditto.
1362 (WebDriver::Session::getTitle): Ditto.
1363 (WebDriver::Session::closeWindow): Ditto.
1364 (WebDriver::Session::switchToFrame): Ditto.
1365 (WebDriver::Session::switchToParentFrame): Ditto.
1366 (WebDriver::Session::isElementSelected): Ditto.
1367 (WebDriver::Session::getElementText): Ditto.
1368 (WebDriver::Session::getElementTagName): Ditto.
1369 (WebDriver::Session::getElementRect): Ditto.
1370 (WebDriver::Session::isElementEnabled): Ditto.
1371 (WebDriver::Session::isElementDisplayed): Ditto.
1372 (WebDriver::Session::getElementAttribute): Ditto.
1373 (WebDriver::Session::elementSendKeys): Ditto.
1374 (WebDriver::Session::elementSubmit): Ditto.
1375 (WebDriver::Session::executeScript): Ditto.
1377 * WebDriverService.cpp:
1378 (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
1379 (WebDriver::deserializeUnhandledPromptBehavior):
1380 (WebDriver::WebDriverService::parseCapabilities const):
1381 (WebDriver::WebDriverService::validatedCapabilities const):
1382 (WebDriver::WebDriverService::newSession):
1384 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1386 WebDriver: implement user prompt commands
1387 https://bugs.webkit.org/show_bug.cgi?id=174614
1389 Reviewed by Brian Burg.
1391 * CommandResult.cpp:
1392 (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
1393 (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
1394 (WebDriver::CommandResult::errorString const): Ditto.
1397 (WebDriver::Session::dismissAlert):
1398 (WebDriver::Session::acceptAlert):
1399 (WebDriver::Session::getAlertText):
1400 (WebDriver::Session::sendAlertText):
1402 * WebDriverService.cpp:
1403 (WebDriver::WebDriverService::dismissAlert):
1404 (WebDriver::WebDriverService::acceptAlert):
1405 (WebDriver::WebDriverService::getAlertText):
1406 (WebDriver::WebDriverService::sendAlertText):
1407 * WebDriverService.h:
1409 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1411 [GTK][WPE] Add API to provide browser information required by automation
1412 https://bugs.webkit.org/show_bug.cgi?id=175130
1414 Reviewed by Brian Burg.
1417 (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
1418 with error in that case.
1420 * glib/SessionHostGlib.cpp:
1421 (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
1423 (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
1424 capabilities and calling matchCapabilities() to match them.
1425 (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
1428 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1430 WebDriver: Implement page load strategy
1431 https://bugs.webkit.org/show_bug.cgi?id=175183
1433 Reviewed by Brian Burg.
1435 Validate and parse page load strategy when processing capabilities.
1439 (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
1440 passed to Automation.
1441 (WebDriver::Session::go): Pass page load strategy if present.
1442 (WebDriver::Session::back): Ditto.
1443 (WebDriver::Session::forward): Ditto.
1444 (WebDriver::Session::refresh): Ditto.
1445 (WebDriver::Session::waitForNavigationToComplete): Ditto.
1447 * WebDriverService.cpp:
1448 (WebDriver::deserializePageLoadStrategy):
1449 (WebDriver::WebDriverService::parseCapabilities const):
1450 (WebDriver::WebDriverService::validatedCapabilities const):
1451 (WebDriver::WebDriverService::newSession):
1453 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1455 Unreviewed. Try to fix build with clang after r220315.
1457 * WebDriverService.cpp:
1458 (WebDriver::WebDriverService::validatedCapabilities const):
1459 (WebDriver::WebDriverService::mergeCapabilities const):
1461 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1463 WebDriver: properly handle capabilities and process firstMatch too
1464 https://bugs.webkit.org/show_bug.cgi?id=174618
1466 Reviewed by Brian Burg.
1468 Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
1471 7.2 Processing Capabilities.
1472 https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1474 * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
1476 * WebDriverService.cpp:
1477 (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
1478 (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
1479 so we just need to get them without checking the value type.
1480 (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
1481 values are the expected one.
1482 (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
1483 single object ensuring that the same capability is not in both.
1484 (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
1485 expected capabilities.
1486 (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
1487 (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
1488 capabilities and add all capabilities to the command result.
1489 (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
1490 * WebDriverService.h:
1491 * glib/SessionHostGlib.cpp:
1492 (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
1493 (WebDriver::SessionHost::startAutomationSession): Add FIXME.
1494 * gtk/WebDriverServiceGtk.cpp:
1495 (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
1496 (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
1497 (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
1498 (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
1499 (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
1502 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1504 WebDriver: use in-view center point for clicks instead of bounding box center point
1505 https://bugs.webkit.org/show_bug.cgi?id=174863
1507 Reviewed by Simon Fraser.
1509 The center of the element bounding box is not always part of the element, like in multiline links, for example.
1511 11.1 Element Interactability.
1512 https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
1514 * CommandResult.cpp:
1515 (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
1516 (WebDriver::CommandResult::errorString): Ditto.
1517 * CommandResult.h: Ditto.
1519 (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
1520 (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
1521 (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
1524 2017-08-01 Michael Catanzaro <mcatanzaro@igalia.com>
1526 [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
1527 https://bugs.webkit.org/show_bug.cgi?id=174855
1529 Reviewed by Carlos Garcia Campos.
1531 Don't create derived sources directory here anymore.
1533 * PlatformGTK.cmake:
1535 2017-07-26 Carlos Garcia Campos <cgarcia@igalia.com>
1537 Unreviewed. Fix GTK distcheck.
1539 Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
1541 * PlatformGTK.cmake:
1543 2017-07-24 Carlos Garcia Campos <cgarcia@igalia.com>
1545 WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
1546 https://bugs.webkit.org/show_bug.cgi?id=174783
1548 Reviewed by Brian Burg.
1550 We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
1551 current browsing context, and the spec also refers to it as the current browsing context, so better use
1552 m_currentBrowsingContext.
1555 (WebDriver::Session::switchToTopLevelBrowsingContext):
1556 (WebDriver::Session::switchToBrowsingContext):
1557 (WebDriver::Session::switchToFrame):
1558 (WebDriver::Session::switchToParentFrame):
1559 (WebDriver::Session::computeElementLayout):
1560 (WebDriver::Session::findElements):
1561 (WebDriver::Session::isElementSelected):
1562 (WebDriver::Session::getElementText):
1563 (WebDriver::Session::getElementTagName):
1564 (WebDriver::Session::isElementEnabled):
1565 (WebDriver::Session::isElementDisplayed):
1566 (WebDriver::Session::getElementAttribute):
1567 (WebDriver::Session::waitForNavigationToComplete):
1568 (WebDriver::Session::elementClear):
1569 (WebDriver::Session::elementSendKeys):
1570 (WebDriver::Session::elementSubmit):
1571 (WebDriver::Session::executeScript):
1574 2017-07-20 Carlos Garcia Campos <cgarcia@igalia.com>
1576 WebDriver: implement page load timeout
1577 https://bugs.webkit.org/show_bug.cgi?id=174672
1579 Reviewed by Brian Burg.
1581 Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
1582 commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
1583 instead of the one in the spec.
1586 https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
1588 * CommandResult.cpp:
1589 (WebDriver::CommandResult::CommandResult):
1590 (WebDriver::CommandResult::httpStatusCode):
1591 (WebDriver::CommandResult::errorString):
1594 (WebDriver::Session::go):
1595 (WebDriver::Session::back):
1596 (WebDriver::Session::forward):
1597 (WebDriver::Session::refresh):
1598 (WebDriver::Session::waitForNavigationToComplete):
1599 * WebDriverService.cpp:
1600 (WebDriver::WebDriverService::setTimeouts):
1602 2017-07-21 Carlos Garcia Campos <cgarcia@igalia.com>
1604 WebDriver: wait until navigation is complete before running new commands and after a click
1605 https://bugs.webkit.org/show_bug.cgi?id=174670
1607 Reviewed by Brian Burg.
1609 We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
1610 the spec says we should always wait before executing a new command and also after a click. This is causing test
1611 testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
1612 + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
1613 the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
1616 6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
1617 jump to step 1 in this overall algorithm, otherwise continue.
1618 https://www.w3.org/TR/webdriver/#processing-model
1620 14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
1621 value if it is an error. 2. Try to wait for navigation to complete.
1622 https://www.w3.org/TR/webdriver/#element-click
1625 (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
1626 wait for any pending navigation of current browsing context to complete.
1627 (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
1629 * WebDriverService.cpp:
1630 (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
1631 (WebDriver::WebDriverService::getCurrentURL): Ditto.
1632 (WebDriver::WebDriverService::back): Ditto.
1633 (WebDriver::WebDriverService::forward): Ditto.
1634 (WebDriver::WebDriverService::refresh): Ditto.
1635 (WebDriver::WebDriverService::getTitle): Ditto.
1636 (WebDriver::WebDriverService::switchToFrame): Ditto.
1637 (WebDriver::WebDriverService::switchToParentFrame): Ditto.
1638 (WebDriver::WebDriverService::findElement): Ditto.
1639 (WebDriver::WebDriverService::findElements): Ditto.
1640 (WebDriver::WebDriverService::executeScript): Ditto.
1641 (WebDriver::WebDriverService::executeAsyncScript): Ditto.
1643 2017-07-21 Carlos Garcia Campos <cgarcia@igalia.com>
1645 WebDriver: correctly handle main frame handles
1646 https://bugs.webkit.org/show_bug.cgi?id=174668
1648 Reviewed by Brian Burg.
1650 When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
1651 that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
1652 are currently considering empty strings as valid browsing context. It's not a big deal because Automation
1653 converts back the empty string received to the main frame, though. We should also ensure we close the current
1654 browsing context when switching to a new top level browsing context. This patch adds to helper private methods
1655 to switch browsing contexts that deal with the special cases.
1658 (WebDriver::Session::close):
1659 (WebDriver::Session::switchToTopLevelBrowsingContext):
1660 (WebDriver::Session::switchToBrowsingContext):
1661 (WebDriver::Session::createTopLevelBrowsingContext):
1662 (WebDriver::Session::go):
1663 (WebDriver::Session::back):
1664 (WebDriver::Session::forward):
1665 (WebDriver::Session::refresh):
1666 (WebDriver::Session::switchToWindow):
1667 (WebDriver::Session::switchToFrame):
1668 (WebDriver::Session::switchToParentFrame):
1671 2017-07-18 Carlos Garcia Campos <cgarcia@igalia.com>
1673 WebDriver: handle invalid selector errors
1674 https://bugs.webkit.org/show_bug.cgi?id=174619
1676 Reviewed by Brian Burg.
1678 Add InvalidSelector error and handle it in case of protocol server error.
1680 * CommandResult.cpp:
1681 (WebDriver::CommandResult::CommandResult):
1682 (WebDriver::CommandResult::httpStatusCode):
1683 (WebDriver::CommandResult::errorString):
1686 2017-07-18 Carlos Alberto Lopez Perez <clopez@igalia.com>
1688 [GTK] Fix build with Clang after r219605.
1689 https://bugs.webkit.org/show_bug.cgi?id=166682
1691 Unreviewed build fix.
1693 Clang-3.8 complains with the following error:
1694 non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
1696 * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
1698 2017-07-13 Carlos Garcia Campos <cgarcia@igalia.com>
1700 Add initial implementation of WebDriver process to run the HTTP server
1701 https://bugs.webkit.org/show_bug.cgi?id=166682
1703 Reviewed by Brian Burg.
1705 Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
1706 cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
1707 the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
1708 libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
1709 inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
1710 using the official selenium python tests as reference.
1712 * CMakeLists.txt: Added.
1713 * Capabilities.h: Added.
1714 * CommandResult.cpp: Added.
1715 * CommandResult.h: Added.
1716 * HTTPServer.cpp: Added.
1717 * HTTPServer.h: Added.
1718 * PlatformGTK.cmake: Added.
1719 * Session.cpp: Added.
1721 * SessionHost.cpp: Added.
1722 * SessionHost.h: Added.
1723 * WebDriverMain.cpp: Added.
1724 * WebDriverService.cpp: Added.
1725 * WebDriverService.h: Added.
1727 * glib/SessionHostGlib.cpp: Added.
1728 * gtk/WebDriverServiceGtk.cpp: Added.
1729 * soup/HTTPServerSoup.cpp: Added.