1 2018-01-30 Don Olmstead <don.olmstead@sony.com>
3 [CMake] Make WTF headers copies
4 https://bugs.webkit.org/show_bug.cgi?id=182274
6 Reviewed by Alex Christensen.
10 2018-01-29 Carlos Garcia Campos <cgarcia@igalia.com>
12 WebDriver: evaluateJavaScriptFunction should return null when return value is undefined
13 https://bugs.webkit.org/show_bug.cgi?id=180350
15 Reviewed by Carlos Alberto Lopez Perez.
17 Stop handling the empty string as a special case of evaluateJavaScriptFunction result.
20 (WebDriver::Session::executeScript):
22 2018-01-26 Carlos Garcia Campos <cgarcia@igalia.com>
24 WebDriver: service hangs after a browser crash
25 https://bugs.webkit.org/show_bug.cgi?id=182170
27 Reviewed by Carlos Alberto Lopez Perez.
29 This is currently happening in the GTK+ debug bot. There's a test that makes the browser crash due to an assert,
30 hanging the whole process and preventing the rest of the tests from running. When the browser crashes, we
31 correctly handle the pending requests, by completing them with an error. However, if the client tries to send
32 another command we fail to send the message to the browser and the reply is never sent to the client. In the
33 case of the tests, delete session command is sent, but never gets a reply.
36 (WebDriver::Session::isConnected const): Return whether the session is connected to the browser.
39 (WebDriver::SessionHost::sendCommandToBackend): Pass the message ID to SessionHost::sendMessageToBackend().
41 * WebDriverService.cpp:
42 (WebDriver::WebDriverService::deleteSession): Ignore unknown errors if the session is no longer connected.
43 * glib/SessionHostGlib.cpp:
44 (WebDriver::SessionHost::sendMessageToBackend): Handle errors when sending the command by completing the request
47 2018-01-26 Carlos Garcia Campos <cgarcia@igalia.com>
49 WebDriver: timeouts value and cookie expiry should be limited to max safe integer
50 https://bugs.webkit.org/show_bug.cgi?id=182167
52 Reviewed by Žan Doberšek.
54 This changed recently in the spec, but our implementation was wrong in any case since we were limiting to
55 INT_MAX. Use valueAsNumberInRange() to ensure we get a valid double value in the given range, and then convert
56 to unsigned if it's a valid integer.
58 Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[timeouts-value10]
59 imported/w3c/webdriver/tests/sessions/new_session/create_alwaysMatch.py::test_valid[timeouts-value10]
62 * WebDriverService.cpp:
63 (WebDriver::valueAsNumberInRange):
64 (WebDriver::unsignedValue):
65 (WebDriver::deserializeTimeouts):
66 (WebDriver::deserializeCookie):
68 2018-01-25 Carlos Garcia Campos <cgarcia@igalia.com>
70 WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_browserName fails
71 https://bugs.webkit.org/show_bug.cgi?id=181985
73 Reviewed by Carlos Alberto Lopez Perez.
75 The problem is that we are considering a failure when the browser name doesn't match the capabilities, instead
76 of trying with the next merged capabilities. This is happening because when processing capabilities, we only
77 match the ones that we know without having to launch the browser. Browser name and version are provided by the
78 browser during the session initialization. This patch reworks the session creation to make it possible to try
79 with the next merged capabilities when matching fails after the browser is launched.
82 (WebDriver::Session::Session): Initialize timeouts from capabilities, because now we have the final capabilities here.
83 (WebDriver::Session::id const): Return the session ID from the SessionHost, since it's now created there.
84 (WebDriver::Session::createTopLevelBrowsingContext): Do not start the session, it has already been started a
86 (WebDriver::Session::createElement): Use id() instead of m_id.
89 (WebDriver::SessionHost::sessionID const): Return the session ID.
90 * WebDriverService.cpp:
91 (WebDriver::WebDriverService::matchCapabilities const): Remove the error handling, and return a boolean instead,
92 since not mathing is not an error.
93 (WebDriver::WebDriverService::processCapabilities const): Return a list of matched capabilities, instead of the
94 JSON object corresponding to the first match.
95 (WebDriver::WebDriverService::newSession): Use helper connectToBrowser().
96 (WebDriver::WebDriverService::connectToBrowser): Create a session host for the next merged capabilities and
97 connect to the browser.
98 (WebDriver::WebDriverService::createSession): Start a new automation session. If capabilities didn't match,
99 start the process again calling connectToBrowser(), otherwise create the new session and top level.
100 * WebDriverService.h:
101 * glib/SessionHostGlib.cpp:
102 (WebDriver::matchBrowserOptions): Helper to check browser options.
103 (WebDriver::SessionHost::matchCapabilities): Use matchBrowserOptions() and return true or false instead of an
104 optional error message.
105 (WebDriver::SessionHost::startAutomationSession): Create the session ID here and notify the caller in case
106 capabilities didn't match.
107 (WebDriver::SessionHost::setTargetList): Notify that capabilities did match.
108 * gtk/WebDriverServiceGtk.cpp:
109 (WebDriver::WebDriverService::platformMatchCapability const): Make it return bool.
110 * wpe/WebDriverServiceWPE.cpp:
111 (WebDriver::WebDriverService::platformMatchCapability const): Ditto.
113 2018-01-25 Carlos Garcia Campos <cgarcia@igalia.com>
115 WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_platformName fails
116 https://bugs.webkit.org/show_bug.cgi?id=181984
118 Reviewed by Carlos Alberto Lopez Perez.
120 Platform name is expected to be lower case, so do not compre ignoring case.
122 Fixes: imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_platformName
124 * WebDriverService.cpp:
125 (WebDriver::WebDriverService::matchCapabilities const):
127 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
129 WebDriver: several tests in imported/w3c/webdriver/tests/sessions/new_session/merge.py are failing
130 https://bugs.webkit.org/show_bug.cgi?id=180407
132 Reviewed by Carlos Alberto Lopez Perez.
134 This is actually a bug in the spec, see https://github.com/w3c/webdriver/issues/1203. It seems the idea in any
135 case is that we should check all the firstMatch capabilities before matching them, and return if there's any
138 * WebDriverService.cpp:
139 (WebDriver::WebDriverService::mergeCapabilities const):
140 (WebDriver::WebDriverService::processCapabilities const):
142 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
144 WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/response.py::test_timeouts fails
145 https://bugs.webkit.org/show_bug.cgi?id=180412
147 Reviewed by Carlos Alberto Lopez Perez.
149 Include all missing capabilities in the new session response message.
151 Fixes: imported/w3c/webdriver/tests/sessions/new_session/response.py::test_resp_capabilites
152 imported/w3c/webdriver/tests/sessions/new_session/response.py::test_resp_data
153 imported/w3c/webdriver/tests/sessions/new_session/response.py::test_timeouts
156 (WebDriver::Session::scriptTimeout const):
157 (WebDriver::Session::pageLoadTimeout const):
158 (WebDriver::Session::implicitWaitTimeout const):
159 * WebDriverService.cpp:
160 (WebDriver::WebDriverService::newSession):
162 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
164 WebDriver: matched capabilities should include setWindowRect
165 https://bugs.webkit.org/show_bug.cgi?id=180411
167 Reviewed by Carlos Alberto Lopez Perez.
169 Handle setWindowRect in capabilities. It's always true for GTK and false for WPE.
172 * WebDriverService.cpp:
173 (WebDriver::WebDriverService::parseCapabilities const):
174 (WebDriver::WebDriverService::matchCapabilities const):
175 (WebDriver::WebDriverService::newSession):
176 * gtk/WebDriverServiceGtk.cpp:
177 (WebDriver::WebDriverService::platformCapabilities):
178 * wpe/WebDriverServiceWPE.cpp:
179 (WebDriver::WebDriverService::platformCapabilities):
181 2018-01-23 Carlos Garcia Campos <cgarcia@igalia.com>
183 WebDriver: test imported/selenium/py/test/selenium/webdriver/common/api_example_tests.py::testChangeWindowSize fails
184 https://bugs.webkit.org/show_bug.cgi?id=181728
186 Reviewed by Sergio Villar Senin.
188 Due to a copy-paste error we are getting the window height using the width variable.
190 Fixes: imported/selenium/py/test/selenium/webdriver/common/api_example_tests.py::testChangeWindowSize
191 imported/selenium/py/test/selenium/webdriver/common/position_and_size_tests.py::testShouldScrollPageAndGetCoordinatesOfAnElementThatIsOutOfViewPort
192 imported/w3c/webdriver/tests/get_window_rect.py::test_payload
193 imported/w3c/webdriver/tests/set_window_rect.py::test_width_height_floats
194 imported/w3c/webdriver/tests/set_window_rect.py::test_height_width
195 imported/w3c/webdriver/tests/set_window_rect.py::test_height_width_larger_than_max
196 imported/w3c/webdriver/tests/contexts/resizing_and_positioning.py::test_window_resize
199 (WebDriver::Session::getToplevelBrowsingContextRect):
201 2018-01-22 Carlos Garcia Campos <cgarcia@igalia.com>
203 WebDriver: implement get element CSS value command
204 https://bugs.webkit.org/show_bug.cgi?id=181736
206 Reviewed by Carlos Alberto Lopez Perez.
208 13.4 Get Element CSS Value
209 https://w3c.github.io/webdriver/webdriver-spec.html#get-element-css-value
211 Fixes: imported/selenium/py/test/selenium/webdriver/common/rendered_webelement_tests.py::testShouldPickUpStyleOfAnElement
212 imported/selenium/py/test/selenium/webdriver/common/rendered_webelement_tests.py::testShouldAllowInheritedStylesToBeUsed
215 (WebDriver::Session::getElementProperty):
216 (WebDriver::Session::getElementCSSValue):
218 * WebDriverService.cpp:
219 (WebDriver::WebDriverService::getElementCSSValue):
220 * WebDriverService.h:
222 2018-01-22 Carlos Garcia Campos <cgarcia@igalia.com>
224 [GTK] WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/response.py is crashing in the bots
225 https://bugs.webkit.org/show_bug.cgi?id=181904
227 Reviewed by Carlos Alberto Lopez Perez.
229 Handle the case of failing to launch the browser. The test is actually failing because it's sending wrong
230 capabilities, the driver tries to fall back to the default driver, but since WebKit is not installed in the
231 bots, it fails to find the MiniBrowser. The test needs to be fixed, but we shouldn't crash when the browser
232 can't be spawned for whatever reason in any case. This patch handles that case and changes the boolean result of
233 connectToBrowser to be an optional error string instead. This way we can provide more detailed error message
234 when we reject the session creation because the browser failed to start.
237 * WebDriverService.cpp:
238 (WebDriver::WebDriverService::newSession):
239 * glib/SessionHostGlib.cpp:
240 (WebDriver::SessionHost::connectToBrowser):
241 (WebDriver::ConnectToBrowserAsyncData::ConnectToBrowserAsyncData):
242 (WebDriver::SessionHost::launchBrowser):
243 (WebDriver::SessionHost::setupConnection):
245 2018-01-11 Carlos Garcia Campos <cgarcia@igalia.com>
247 WebDriver: implement get timeouts command
248 https://bugs.webkit.org/show_bug.cgi?id=181524
250 Reviewed by Žan Doberšek.
253 https://w3c.github.io/webdriver/webdriver-spec.html#get-timeouts
255 Also simplify the way timeouts are handled in Session. Stop using Timeouts struct, because once the session is
256 created the timeouts are no longer optional, they have a default value. Use individual members instead that are
257 initialized to their default values on construction and only overriden by capabilities or set timeouts command.
259 Fixes: imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_timeouts
260 imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_default_timeouts
261 imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_new_timeouts
264 (WebDriver::Session::Session):
265 (WebDriver::Session::getTimeouts):
266 (WebDriver::Session::setTimeouts):
267 (WebDriver::Session::go):
268 (WebDriver::Session::back):
269 (WebDriver::Session::forward):
270 (WebDriver::Session::refresh):
271 (WebDriver::Session::findElements):
272 (WebDriver::Session::waitForNavigationToComplete):
273 (WebDriver::Session::executeScript):
275 * WebDriverService.cpp:
276 (WebDriver::WebDriverService::getTimeouts):
277 * WebDriverService.h:
279 2018-01-10 Zan Dobersek <zdobersek@igalia.com>
281 WebDriver: deserializeTimeouts() shouldn't reject double timeout values
282 https://bugs.webkit.org/show_bug.cgi?id=181473
284 Reviewed by Carlos Garcia Campos.
286 With these changes, the following tests are fixed:
287 imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldTimeoutIfScriptDoesNotInvokeCallbackWithLongTimeout
288 imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldDetectPageLoadsWhileWaitingOnAnAsyncScriptAndReturnAnError
289 imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldBeAbleToExecuteAsynchronousScripts
290 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldImplicitlyWaitForASingleElement
291 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldStillFailToFindAnElementWhenImplicitWaitsAreEnabled
292 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldReturnAfterFirstAttemptToFindOneAfterDisablingImplicitWaits
293 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldImplicitlyWaitUntilAtLeastOneElementIsFoundWhenSearchingForMany
294 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldStillFailToFindAnElemenstWhenImplicitWaitsAreEnabled
295 imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldReturnAfterFirstAttemptToFindManyAfterDisablingImplicitWaits
296 imported/selenium/py/test/selenium/webdriver/common/page_load_timeout_tests.py::testShouldTimeoutOnPageLoadTakingTooLong
297 imported/selenium/py/test/selenium/webdriver/common/page_load_timeout_tests.py::testShouldTimeoutOnPageLoadTakingTooLong
298 imported/selenium/py/test/selenium/webdriver/common/webdriverwait_tests.py::testShouldWaitOnlyAsLongAsTimeoutSpecifiedWhenImplicitWaitsAreSet
300 The following two tests regress, and will be looked into separately:
301 imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_invalid
302 imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_invalid
304 * WebDriverService.cpp:
305 (WebDriver::integerValue): Helper function that retrieves an integer value
306 from a given JSON::Value object, if possible.
307 (WebDriver::deserializeTimeouts): Timeout JSON value has to be converted to
308 an integer, which is allowed if the value is of either Integer or Double type.
309 Helper integerValue() function retrieves the integer value, in addition to
310 ensuring that possible double value that we convert to an integer is already
311 in integer form to begin with.
313 2017-12-15 Carlos Garcia Campos <cgarcia@igalia.com>
315 WebDriver: add support for accept/dismiss and notify unhandled prompt behavior
316 https://bugs.webkit.org/show_bug.cgi?id=179999
318 Reviewed by Carlos Alberto Lopez Perez.
320 They work as accept and dismiss, but unexpected alert open is still reported.
323 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-known-prompt-handling-approaches-table
325 * Capabilities.h: Add DismissAndNotify and AcceptAndNotify to UnhandledPromptBehavior enum.
327 (WebDriver::Session::handleUnexpectedAlertOpen): Move default implementation to dismissAndNotifyAlert and
328 acceptAndNotifyAlert and use dismissAndNotifyAlert by default.
329 (WebDriver::Session::dismissAndNotifyAlert):
330 (WebDriver::Session::acceptAndNotifyAlert):
332 * WebDriverService.cpp:
333 (WebDriver::deserializeUnhandledPromptBehavior): Handle accept/dismiss and notify.
334 (WebDriver::WebDriverService::newSession): Ditto.
336 2017-12-11 Carlos Garcia Campos <cgarcia@igalia.com>
338 WebDriver: get active element should return no such element error when there isn't an active element
339 https://bugs.webkit.org/show_bug.cgi?id=180421
341 Reviewed by Brian Burg.
343 We currently return unknown error.
345 Fixes: imported/w3c/webdriver/tests/element_retrieval/get_active_element.py::test_missing_document_element
348 (WebDriver::Session::getActiveElement):
350 2017-12-04 Brian Burg <bburg@apple.com>
352 Web Automation: add flag to preserve legacy page screenshot behavior
353 https://bugs.webkit.org/show_bug.cgi?id=180313
354 <rdar://problem/34379930>
356 Reviewed by Joseph Pecoraro.
358 Set the clipToViewport flag to true when sending Automation.takeScreenshot.
359 This preserves the current behavior for this driver implementation.
362 (WebDriver::Session::takeScreenshot):
364 2017-12-04 Carlos Garcia Campos <cgarcia@igalia.com>
366 WebDriver: implement element property command
367 https://bugs.webkit.org/show_bug.cgi?id=180244
369 Reviewed by Brian Burg.
371 13.3 Get Element Property
372 https://w3c.github.io/webdriver/webdriver-spec.html#get-element-property
374 Fixes: imported/w3c/webdriver/tests/state/get_element_property.py::test_no_browsing_context
375 imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_dismiss
376 imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_accept
377 imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_missing_value
378 imported/w3c/webdriver/tests/state/get_element_property.py::test_element_stale
381 (WebDriver::Session::getElementAttribute):
382 (WebDriver::Session::getElementProperty):
384 * WebDriverService.cpp:
385 (WebDriver::WebDriverService::getElementProperty):
386 * WebDriverService.h:
388 2017-12-02 Carlos Garcia Campos <cgarcia@igalia.com>
390 WebDriver: handle user prompts shown while executing scripts
391 https://bugs.webkit.org/show_bug.cgi?id=179979
393 Reviewed by Brian Burg.
395 15.2 Executing Script
396 https://w3c.github.io/webdriver/webdriver-spec.html#executing-script
398 The rules to execute a function body are as follows. The algorithm will return success with the JSON
399 representation of the function’s return value, or an error if the evaluation of the function results in a
400 JavaScript exception being thrown or at any point during its execution an unhandled user prompt appears.
402 If at any point during the algorithm a user prompt appears, the user prompt handler must be invoked. If its
403 return value is an error, it must immediately return with that error and abort all subsequent substeps of this
406 This will be covered by new WPT tests that will be available after the next upgrade.
409 (WebDriver::CommandResult::CommandResult): Handle UnexpectedAlertOpen internal error.
411 (WebDriver::Session::handleUserPrompts): Move code to handleUnexpectedAlertOpen() and call it instead.
412 (WebDriver::Session::handleUnexpectedAlertOpen): Code moved here to be used also by executeScript().
413 (WebDriver::Session::executeScript): In case of UnexpectedAlertOpen error, call handleUnexpectedAlertOpen().
416 2017-12-01 Carlos Garcia Campos <cgarcia@igalia.com>
418 WebDriver: implement status command
419 https://bugs.webkit.org/show_bug.cgi?id=180133
421 Reviewed by Brian Burg.
424 https://w3c.github.io/webdriver/webdriver-spec.html#status
426 Fixes: imported/w3c/webdriver/tests/sessions/status.py::test_get_status_no_session
427 imported/w3c/webdriver/tests/sessions/status.py::test_status_with_session_running_on_endpoint_node
429 * WebDriverService.cpp:
430 (WebDriver::WebDriverService::status):
431 * WebDriverService.h:
433 2017-12-01 Carlos Garcia Campos <cgarcia@igalia.com>
435 WebDriver: end point nodes are only allowed to have one session
436 https://bugs.webkit.org/show_bug.cgi?id=180131
438 Reviewed by Brian Burg.
440 We are currently keeping a map of sessions, but our service is always and end point node, so only one session
441 can exist at a time. Make findSessionOrCompleteWithError() return a boolean instead, failing in case the sessionID
442 parameter is not found or it doesn't match the current session. Replace the session map and active session
443 pointer with a single session member and return SessionNotCreated error when new session command is received and
444 there's an active session.
447 A remote end has an associated maximum active sessions (an integer) that defines the number of active sessions
448 that are supported. This may be “unlimited” for intermediary nodes, but must be exactly one for a remote end
449 that is an endpoint node.
450 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-maximum-active-sessions
452 Fixes: imported/w3c/webdriver/tests/sessions/new_session/default_values.py::test_repeat_new_session
454 * WebDriverService.cpp:
455 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
456 (WebDriver::WebDriverService::newSession):
457 (WebDriver::WebDriverService::deleteSession):
458 (WebDriver::WebDriverService::status):
459 (WebDriver::WebDriverService::setTimeouts):
460 (WebDriver::WebDriverService::go):
461 (WebDriver::WebDriverService::getCurrentURL):
462 (WebDriver::WebDriverService::back):
463 (WebDriver::WebDriverService::forward):
464 (WebDriver::WebDriverService::refresh):
465 (WebDriver::WebDriverService::getTitle):
466 (WebDriver::WebDriverService::getWindowHandle):
467 (WebDriver::WebDriverService::setWindowRect):
468 (WebDriver::WebDriverService::closeWindow):
469 (WebDriver::WebDriverService::switchToWindow):
470 (WebDriver::WebDriverService::getWindowHandles):
471 (WebDriver::WebDriverService::switchToFrame):
472 (WebDriver::WebDriverService::switchToParentFrame):
473 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
474 (WebDriver::WebDriverService::findElement):
475 (WebDriver::WebDriverService::findElements):
476 (WebDriver::WebDriverService::findElementFromElement):
477 (WebDriver::WebDriverService::findElementsFromElement):
478 (WebDriver::WebDriverService::getActiveElement):
479 (WebDriver::WebDriverService::isElementSelected):
480 (WebDriver::WebDriverService::getElementAttribute):
481 (WebDriver::WebDriverService::getElementText):
482 (WebDriver::WebDriverService::getElementTagName):
483 (WebDriver::WebDriverService::getElementRect):
484 (WebDriver::WebDriverService::isElementEnabled):
485 (WebDriver::WebDriverService::isElementDisplayed):
486 (WebDriver::WebDriverService::elementClick):
487 (WebDriver::WebDriverService::elementClear):
488 (WebDriver::WebDriverService::elementSendKeys):
489 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
490 (WebDriver::WebDriverService::executeScript):
491 (WebDriver::WebDriverService::executeAsyncScript):
492 (WebDriver::WebDriverService::getAllCookies):
493 (WebDriver::WebDriverService::getNamedCookie):
494 (WebDriver::deserializeCookie):
495 (WebDriver::WebDriverService::addCookie):
496 (WebDriver::WebDriverService::deleteCookie):
497 (WebDriver::WebDriverService::deleteAllCookies):
498 (WebDriver::WebDriverService::dismissAlert):
499 (WebDriver::WebDriverService::acceptAlert):
500 (WebDriver::WebDriverService::getAlertText):
501 (WebDriver::WebDriverService::sendAlertText):
502 (WebDriver::WebDriverService::takeScreenshot):
503 (WebDriver::WebDriverService::takeElementScreenshot):
504 * WebDriverService.h:
506 2017-11-30 Carlos Garcia Campos <cgarcia@igalia.com>
508 WebDriver: locator strategy should be validated before trying to find elements
509 https://bugs.webkit.org/show_bug.cgi?id=180187
511 Reviewed by Carlos Alberto Lopez Perez.
513 We currently rely on the js atom to raise an exception in case the locator strategy is not valid, but in case of
514 find element from element, if the element doesn't exist we fail with stale element error instead of invalid
515 argument as expected. So, let's validate the strategies when parsing them, which would also avoid going to the
516 browser in cae of invalid strategy.
518 Fixes: imported/w3c/webdriver/tests/retrieval/find_element_from_element.py::test_invalid_using_argument[a]
520 * WebDriverService.cpp:
521 (WebDriver::isValidStrategy):
522 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
524 2017-11-30 Carlos Garcia Campos <cgarcia@igalia.com>
526 WebDriver: remove elementSubmit command
527 https://bugs.webkit.org/show_bug.cgi?id=180186
529 Reviewed by Carlos Alberto Lopez Perez.
531 It's not in the spec, we had it only because selenium used it, but now it uses execute_script with custom code
532 to implement submit, so we can just remove it.
535 (WebDriver::Session::elementSubmit): Deleted.
537 * WebDriverService.cpp:
538 (WebDriver::WebDriverService::elementSubmit): Deleted.
539 * WebDriverService.h:
541 2017-11-14 Carlos Garcia Campos <cgarcia@igalia.com>
543 Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
544 https://bugs.webkit.org/show_bug.cgi?id=173793
546 Reviewed by Joseph Pecoraro.
550 (WebDriver::CommandResult::CommandResult):
552 (WebDriver::CommandResult::success):
553 (WebDriver::CommandResult::fail):
554 (WebDriver::CommandResult::result const):
555 (WebDriver::CommandResult::setAdditionalErrorData):
556 (WebDriver::CommandResult::additionalErrorData const):
558 (WebDriver::firstWindowHandleInResult):
559 (WebDriver::Session::handleUserPrompts):
560 (WebDriver::Session::reportUnexpectedAlertOpen):
561 (WebDriver::Session::go):
562 (WebDriver::Session::getCurrentURL):
563 (WebDriver::Session::back):
564 (WebDriver::Session::forward):
565 (WebDriver::Session::refresh):
566 (WebDriver::Session::getTitle):
567 (WebDriver::Session::getWindowHandle):
568 (WebDriver::Session::closeTopLevelBrowsingContext):
569 (WebDriver::Session::switchToWindow):
570 (WebDriver::Session::getWindowHandles):
571 (WebDriver::Session::switchToFrame):
572 (WebDriver::Session::switchToParentFrame):
573 (WebDriver::Session::getToplevelBrowsingContextRect):
574 (WebDriver::Session::moveToplevelBrowsingContextWindow):
575 (WebDriver::Session::resizeToplevelBrowsingContextWindow):
576 (WebDriver::Session::createElement):
577 (WebDriver::Session::extractElement):
578 (WebDriver::Session::extractElementID):
579 (WebDriver::Session::computeElementLayout):
580 (WebDriver::Session::findElements):
581 (WebDriver::Session::isElementSelected):
582 (WebDriver::Session::getElementText):
583 (WebDriver::Session::getElementTagName):
584 (WebDriver::Session::getElementRect):
585 (WebDriver::Session::isElementEnabled):
586 (WebDriver::Session::isElementDisplayed):
587 (WebDriver::Session::getElementAttribute):
588 (WebDriver::Session::waitForNavigationToComplete):
589 (WebDriver::Session::selectOptionElement):
590 (WebDriver::Session::elementClick):
591 (WebDriver::Session::elementClear):
592 (WebDriver::Session::elementSendKeys):
593 (WebDriver::Session::elementSubmit):
594 (WebDriver::Session::handleScriptResult):
595 (WebDriver::Session::executeScript):
596 (WebDriver::Session::performMouseInteraction):
597 (WebDriver::Session::performKeyboardInteractions):
598 (WebDriver::parseAutomationCookie):
599 (WebDriver::builtAutomationCookie):
600 (WebDriver::serializeCookie):
601 (WebDriver::Session::getAllCookies):
602 (WebDriver::Session::getNamedCookie):
603 (WebDriver::Session::addCookie):
604 (WebDriver::Session::deleteCookie):
605 (WebDriver::Session::deleteAllCookies):
606 (WebDriver::Session::dismissAlert):
607 (WebDriver::Session::acceptAlert):
608 (WebDriver::Session::getAlertText):
609 (WebDriver::Session::sendAlertText):
610 (WebDriver::Session::takeScreenshot):
613 (WebDriver::SessionHost::sendCommandToBackend):
614 (WebDriver::SessionHost::dispatchMessage):
616 * WebDriverService.cpp:
617 (WebDriver::WebDriverService::handleRequest):
618 (WebDriver::WebDriverService::sendResponse const):
619 (WebDriver::deserializeTimeouts):
620 (WebDriver::WebDriverService::parseCapabilities const):
621 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
622 (WebDriver::WebDriverService::validatedCapabilities const):
623 (WebDriver::WebDriverService::mergeCapabilities const):
624 (WebDriver::WebDriverService::matchCapabilities const):
625 (WebDriver::WebDriverService::processCapabilities const):
626 (WebDriver::WebDriverService::newSession):
627 (WebDriver::WebDriverService::deleteSession):
628 (WebDriver::WebDriverService::setTimeouts):
629 (WebDriver::WebDriverService::go):
630 (WebDriver::WebDriverService::getCurrentURL):
631 (WebDriver::WebDriverService::back):
632 (WebDriver::WebDriverService::forward):
633 (WebDriver::WebDriverService::refresh):
634 (WebDriver::WebDriverService::getTitle):
635 (WebDriver::WebDriverService::getWindowHandle):
636 (WebDriver::WebDriverService::getWindowRect):
637 (WebDriver::valueAsNumberInRange):
638 (WebDriver::WebDriverService::setWindowRect):
639 (WebDriver::WebDriverService::closeWindow):
640 (WebDriver::WebDriverService::switchToWindow):
641 (WebDriver::WebDriverService::getWindowHandles):
642 (WebDriver::WebDriverService::switchToFrame):
643 (WebDriver::WebDriverService::switchToParentFrame):
644 (WebDriver::findElementOrCompleteWithError):
645 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
646 (WebDriver::WebDriverService::findElement):
647 (WebDriver::WebDriverService::findElements):
648 (WebDriver::WebDriverService::findElementFromElement):
649 (WebDriver::WebDriverService::findElementsFromElement):
650 (WebDriver::WebDriverService::isElementSelected):
651 (WebDriver::WebDriverService::getElementAttribute):
652 (WebDriver::WebDriverService::getElementText):
653 (WebDriver::WebDriverService::getElementTagName):
654 (WebDriver::WebDriverService::getElementRect):
655 (WebDriver::WebDriverService::isElementEnabled):
656 (WebDriver::WebDriverService::isElementDisplayed):
657 (WebDriver::WebDriverService::elementClick):
658 (WebDriver::WebDriverService::elementClear):
659 (WebDriver::WebDriverService::elementSendKeys):
660 (WebDriver::WebDriverService::elementSubmit):
661 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
662 (WebDriver::WebDriverService::executeScript):
663 (WebDriver::WebDriverService::executeAsyncScript):
664 (WebDriver::WebDriverService::getAllCookies):
665 (WebDriver::WebDriverService::getNamedCookie):
666 (WebDriver::deserializeCookie):
667 (WebDriver::WebDriverService::addCookie):
668 (WebDriver::WebDriverService::deleteCookie):
669 (WebDriver::WebDriverService::deleteAllCookies):
670 (WebDriver::WebDriverService::dismissAlert):
671 (WebDriver::WebDriverService::acceptAlert):
672 (WebDriver::WebDriverService::getAlertText):
673 (WebDriver::WebDriverService::sendAlertText):
674 (WebDriver::WebDriverService::takeScreenshot):
675 (WebDriver::WebDriverService::takeElementScreenshot):
676 * WebDriverService.h:
677 * gtk/WebDriverServiceGtk.cpp:
678 (WebDriver::WebDriverService::platformValidateCapability const):
679 (WebDriver::WebDriverService::platformMatchCapability const):
680 (WebDriver::WebDriverService::platformParseCapabilities const):
681 * wpe/WebDriverServiceWPE.cpp:
682 (WebDriver::WebDriverService::platformValidateCapability const):
683 (WebDriver::WebDriverService::platformMatchCapability const):
684 (WebDriver::WebDriverService::platformParseCapabilities const):
686 2017-11-28 Carlos Garcia Campos <cgarcia@igalia.com>
688 [GTK] WebDriver: stop making mandatory to provide a browser path if webkitgtk:browserOptions is present in capabilities
689 https://bugs.webkit.org/show_bug.cgi?id=180012
691 Reviewed by Carlos Alberto Lopez Perez.
693 Everything should be optional. We might want to disable overlay scrollbars, but still using the default browser,
694 for example, as I'm doing when running the selenium tests. We might also want to provide additional browser
695 arguments, but using the default browser.
697 * gtk/WebDriverServiceGtk.cpp:
698 (WebDriver::WebDriverService::platformValidateCapability const): Do not consider invalid to not provide a
699 browser binary when webkitgtk:browserOptions is present.
700 (WebDriver::WebDriverService::platformParseCapabilities const): Override default capabilities with the ones
703 2017-11-27 Carlos Garcia Campos <cgarcia@igalia.com>
705 WebDriver: Implement get active element command
706 https://bugs.webkit.org/show_bug.cgi?id=180001
708 Reviewed by Brian Burg.
710 12.6 Get Active Element
711 https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element
713 Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.
716 (WebDriver::Session::getActiveElement):
718 * WebDriverService.cpp:
719 (WebDriver::WebDriverService::getActiveElement):
720 * WebDriverService.h:
722 2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>
724 WebDriver: do not try to parse http body if method is not POST
725 https://bugs.webkit.org/show_bug.cgi?id=179918
727 Reviewed by Darin Adler.
731 5. If request’s method is POST:
733 1. Let parse result be the result of parsing as JSON with request’s body as the argument. If this process
734 throws an exception, return an error with error code invalid argument and jump back to step 1 in this
737 2. If parse result is not an Object, send an error with error code invalid argument and jump back to step 1
738 in this overall algorithm.
740 Otherwise, let parameters be parse result.
742 Otherwise, let parameters be null.
745 https://w3c.github.io/webdriver/webdriver-spec.html#processing-model
747 Now, w3c tests are sending null as body of delete session command (it used to be just empty), making it fail
748 with invalid argument error.
750 * WebDriverService.cpp:
751 (WebDriver::WebDriverService::findCommand):
752 (WebDriver::WebDriverService::handleRequest):
753 * WebDriverService.h:
755 2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>
757 WebDriver: crash in Session::computeElementLayout when called without a current browsing context
758 https://bugs.webkit.org/show_bug.cgi?id=179917
760 Reviewed by Darin Adler.
762 In the case of computeElementLayout message, the frameHandle parameter is not optional, but we still need to
763 provide a valid value (empty string means the default frame) when m_currentBrowsingContext is std::nullopt. The
764 same applies to selectOptionElement.
767 (WebDriver::Session::computeElementLayout):
768 (WebDriver::Session::selectOptionElement):
770 2017-11-15 Carlos Garcia Campos <cgarcia@igalia.com>
772 [WPE] Add initial support for WebDriver
773 https://bugs.webkit.org/show_bug.cgi?id=179727
775 Reviewed by Michael Catanzaro.
777 Add WPE implementation for platform-specific methods. Move the version handling to a common file
778 WebDriverServiceGLib.cpp.
783 * glib/WebDriverServiceGLib.cpp: Added.
784 (WebDriver::parseVersion):
785 (WebDriver::WebDriverService::platformCompareBrowserVersions):
786 * gtk/WebDriverServiceGtk.cpp:
787 * wpe/WebDriverServiceWPE.cpp: Copied from Source/WebDriver/gtk/WebDriverServiceGtk.cpp.
788 (WebDriver::WebDriverService::platformCapabilities):
789 (WebDriver::WebDriverService::platformValidateCapability const):
790 (WebDriver::WebDriverService::platformMatchCapability const):
791 (WebDriver::WebDriverService::platformParseCapabilities const):
793 2017-11-15 Ryan Haddad <ryanhaddad@apple.com>
795 Unreviewed, rolling out r224863.
797 Introduced LayoutTest crashes on iOS Simulator.
801 "Move JSONValues to WTF and convert uses of InspectorValues.h
803 https://bugs.webkit.org/show_bug.cgi?id=173793
804 https://trac.webkit.org/changeset/224863
806 2017-11-14 Carlos Garcia Campos <cgarcia@igalia.com>
808 Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
809 https://bugs.webkit.org/show_bug.cgi?id=173793
811 Reviewed by Brian Burg.
815 (WebDriver::CommandResult::CommandResult):
817 (WebDriver::CommandResult::success):
818 (WebDriver::CommandResult::fail):
819 (WebDriver::CommandResult::result const):
820 (WebDriver::CommandResult::setAdditionalErrorData):
821 (WebDriver::CommandResult::additionalErrorData const):
823 (WebDriver::firstWindowHandleInResult):
824 (WebDriver::Session::handleUserPrompts):
825 (WebDriver::Session::reportUnexpectedAlertOpen):
826 (WebDriver::Session::go):
827 (WebDriver::Session::getCurrentURL):
828 (WebDriver::Session::back):
829 (WebDriver::Session::forward):
830 (WebDriver::Session::refresh):
831 (WebDriver::Session::getTitle):
832 (WebDriver::Session::getWindowHandle):
833 (WebDriver::Session::closeTopLevelBrowsingContext):
834 (WebDriver::Session::switchToWindow):
835 (WebDriver::Session::getWindowHandles):
836 (WebDriver::Session::switchToFrame):
837 (WebDriver::Session::switchToParentFrame):
838 (WebDriver::Session::getToplevelBrowsingContextRect):
839 (WebDriver::Session::moveToplevelBrowsingContextWindow):
840 (WebDriver::Session::resizeToplevelBrowsingContextWindow):
841 (WebDriver::Session::createElement):
842 (WebDriver::Session::extractElement):
843 (WebDriver::Session::extractElementID):
844 (WebDriver::Session::computeElementLayout):
845 (WebDriver::Session::findElements):
846 (WebDriver::Session::isElementSelected):
847 (WebDriver::Session::getElementText):
848 (WebDriver::Session::getElementTagName):
849 (WebDriver::Session::getElementRect):
850 (WebDriver::Session::isElementEnabled):
851 (WebDriver::Session::isElementDisplayed):
852 (WebDriver::Session::getElementAttribute):
853 (WebDriver::Session::waitForNavigationToComplete):
854 (WebDriver::Session::selectOptionElement):
855 (WebDriver::Session::elementClick):
856 (WebDriver::Session::elementClear):
857 (WebDriver::Session::elementSendKeys):
858 (WebDriver::Session::elementSubmit):
859 (WebDriver::Session::handleScriptResult):
860 (WebDriver::Session::executeScript):
861 (WebDriver::Session::performMouseInteraction):
862 (WebDriver::Session::performKeyboardInteractions):
863 (WebDriver::parseAutomationCookie):
864 (WebDriver::builtAutomationCookie):
865 (WebDriver::serializeCookie):
866 (WebDriver::Session::getAllCookies):
867 (WebDriver::Session::getNamedCookie):
868 (WebDriver::Session::addCookie):
869 (WebDriver::Session::deleteCookie):
870 (WebDriver::Session::deleteAllCookies):
871 (WebDriver::Session::dismissAlert):
872 (WebDriver::Session::acceptAlert):
873 (WebDriver::Session::getAlertText):
874 (WebDriver::Session::sendAlertText):
875 (WebDriver::Session::takeScreenshot):
878 (WebDriver::SessionHost::sendCommandToBackend):
879 (WebDriver::SessionHost::dispatchMessage):
881 * WebDriverService.cpp:
882 (WebDriver::WebDriverService::handleRequest):
883 (WebDriver::WebDriverService::sendResponse const):
884 (WebDriver::deserializeTimeouts):
885 (WebDriver::WebDriverService::parseCapabilities const):
886 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
887 (WebDriver::WebDriverService::validatedCapabilities const):
888 (WebDriver::WebDriverService::mergeCapabilities const):
889 (WebDriver::WebDriverService::matchCapabilities const):
890 (WebDriver::WebDriverService::processCapabilities const):
891 (WebDriver::WebDriverService::newSession):
892 (WebDriver::WebDriverService::deleteSession):
893 (WebDriver::WebDriverService::setTimeouts):
894 (WebDriver::WebDriverService::go):
895 (WebDriver::WebDriverService::getCurrentURL):
896 (WebDriver::WebDriverService::back):
897 (WebDriver::WebDriverService::forward):
898 (WebDriver::WebDriverService::refresh):
899 (WebDriver::WebDriverService::getTitle):
900 (WebDriver::WebDriverService::getWindowHandle):
901 (WebDriver::WebDriverService::getWindowRect):
902 (WebDriver::valueAsNumberInRange):
903 (WebDriver::WebDriverService::setWindowRect):
904 (WebDriver::WebDriverService::closeWindow):
905 (WebDriver::WebDriverService::switchToWindow):
906 (WebDriver::WebDriverService::getWindowHandles):
907 (WebDriver::WebDriverService::switchToFrame):
908 (WebDriver::WebDriverService::switchToParentFrame):
909 (WebDriver::findElementOrCompleteWithError):
910 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
911 (WebDriver::WebDriverService::findElement):
912 (WebDriver::WebDriverService::findElements):
913 (WebDriver::WebDriverService::findElementFromElement):
914 (WebDriver::WebDriverService::findElementsFromElement):
915 (WebDriver::WebDriverService::isElementSelected):
916 (WebDriver::WebDriverService::getElementAttribute):
917 (WebDriver::WebDriverService::getElementText):
918 (WebDriver::WebDriverService::getElementTagName):
919 (WebDriver::WebDriverService::getElementRect):
920 (WebDriver::WebDriverService::isElementEnabled):
921 (WebDriver::WebDriverService::isElementDisplayed):
922 (WebDriver::WebDriverService::elementClick):
923 (WebDriver::WebDriverService::elementClear):
924 (WebDriver::WebDriverService::elementSendKeys):
925 (WebDriver::WebDriverService::elementSubmit):
926 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
927 (WebDriver::WebDriverService::executeScript):
928 (WebDriver::WebDriverService::executeAsyncScript):
929 (WebDriver::WebDriverService::getAllCookies):
930 (WebDriver::WebDriverService::getNamedCookie):
931 (WebDriver::deserializeCookie):
932 (WebDriver::WebDriverService::addCookie):
933 (WebDriver::WebDriverService::deleteCookie):
934 (WebDriver::WebDriverService::deleteAllCookies):
935 (WebDriver::WebDriverService::dismissAlert):
936 (WebDriver::WebDriverService::acceptAlert):
937 (WebDriver::WebDriverService::getAlertText):
938 (WebDriver::WebDriverService::sendAlertText):
939 (WebDriver::WebDriverService::takeScreenshot):
940 (WebDriver::WebDriverService::takeElementScreenshot):
941 * WebDriverService.h:
942 * gtk/WebDriverServiceGtk.cpp:
943 (WebDriver::WebDriverService::platformValidateCapability const):
944 (WebDriver::WebDriverService::platformMatchCapability const):
945 (WebDriver::WebDriverService::platformParseCapabilities const):
947 2017-11-07 Brian Burg <bburg@apple.com>
949 Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
950 https://bugs.webkit.org/show_bug.cgi?id=179129
951 <rdar://problem/35297038>
953 Reviewed by Simon Fraser.
955 Adjust code to use the proper coordinate system when requesting element layout.
958 (WebDriver::Session::computeElementLayout):
960 2017-11-09 Carlos Garcia Campos <cgarcia@igalia.com>
962 WebDriver: WebDriverService::matchCapabilities should follow the spec
963 https://bugs.webkit.org/show_bug.cgi?id=179371
965 Reviewed by Brian Burg.
967 The returned object should contain all the entries mentioned in the spec, not only the ones already present in
968 the passed in capabilities object.
970 7.2 Processing Capabilities
971 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-matching-capabilities
973 * WebDriverService.cpp:
974 (WebDriver::WebDriverService::matchCapabilities const):
975 (WebDriver::WebDriverService::processCapabilities const):
976 * WebDriverService.h:
978 2017-11-09 Carlos Garcia Campos <cgarcia@igalia.com>
980 WebDriver: capabilities with null value shouldn't be added to the validated capabilities object
981 https://bugs.webkit.org/show_bug.cgi?id=179369
983 Reviewed by Brian Burg.
985 "4. If deserialized is not null, set a property on result with name name and value deserialized."
987 7.2 Processing Capabilities
988 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
990 Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[platformName-None]
992 * WebDriverService.cpp:
993 (WebDriver::WebDriverService::validatedCapabilities const):
995 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
997 WebDriver: unknown capabilities should produce an InvalidArgument error when validating capabilities
998 https://bugs.webkit.org/show_bug.cgi?id=178868
1000 Reviewed by Brian Burg.
1002 7.2 Processing Capabilities
1003 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
1005 Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_extensions
1007 * WebDriverService.cpp:
1008 (WebDriver::WebDriverService::validatedCapabilities const):
1010 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
1012 WebDriver: deserializeTimeouts should fail if the value is not integer
1013 https://bugs.webkit.org/show_bug.cgi?id=178866
1015 Reviewed by Brian Burg.
1017 If value is not an integer, or it is less than 0 or greater than 2^64 – 1, return error with error code invalid
1019 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-deserialize-as-a-timeout
1021 Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body0]
1022 imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body1]
1024 * WebDriverService.cpp:
1025 (WebDriver::deserializeTimeouts):
1027 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
1029 WebDriver: failing to process capabilities should produce InvalidArgument error not SessionNotCreated
1030 https://bugs.webkit.org/show_bug.cgi?id=178864
1032 Reviewed by Brian Burg.
1034 Fixes most of the tests in imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py.
1036 7.2 Processing Capabilities
1037 https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1039 * WebDriverService.cpp:
1040 (WebDriver::WebDriverService::processCapabilities const):
1042 2017-10-10 Sam Weinig <sam@webkit.org>
1044 Replace copyKeysToVector/copyValuesToVector with copyToVector(map.keys())/copyToVector(map.values())
1045 https://bugs.webkit.org/show_bug.cgi?id=178102
1047 Reviewed by Tim Horton.
1050 (WebDriver::SessionHost::inspectorDisconnected):
1052 2017-10-02 Carlos Garcia Campos <cgarcia@igalia.com>
1054 WebDriver: HTTP status code is not correct for some of the errors
1055 https://bugs.webkit.org/show_bug.cgi?id=177354
1057 Reviewed by Brian Burg.
1059 I think this changed in the spec at some point. The thing is that no such alert, frame and window and stale
1060 element reference errors should return 404 instead of 400.
1062 https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
1064 * CommandResult.cpp:
1065 (WebDriver::CommandResult::httpStatusCode const):
1067 2017-09-19 Carlos Garcia Campos <cgarcia@igalia.com>
1069 WebDriver: Implement commands to get and set the window rect
1070 https://bugs.webkit.org/show_bug.cgi?id=177134
1072 Reviewed by Brian Burg.
1074 We are currently implementing the selenium legacy ones, we should implement the w3c ones instead.
1076 https://w3c.github.io/webdriver/webdriver-spec.html#resizing-and-positioning-windows
1079 (WebDriver::Session::getToplevelBrowsingContextRect): Helper to get the window rect. This is used by both get
1080 and set window rect commands.
1081 (WebDriver::Session::moveToplevelBrowsingContextwindow): Helper to ask automation to move the window.
1082 (WebDriver::Session::resizeToplevelBrowsingContextwindow): Helper to ask automation to resize the window.
1083 (WebDriver::Session::getWindowRect): Handle prompts and then call getToplevelBrowsingContextRect().
1084 (WebDriver::Session::setWindowRect): Handle prompts and then move and resize the window according to the given
1085 parameters and finish the operation calling getToplevelBrowsingContextRect().
1087 * WebDriverService.cpp:
1088 (WebDriver::WebDriverService::getWindowRect): Ask the session to get the window rect.
1089 (WebDriver::valueAsNumberInRange): Helper to check a value is a valid number in the given range.
1090 (WebDriver::WebDriverService::setWindowRect): Get and check size and position from parameters and then ask the
1091 session to set the window rect.
1092 * WebDriverService.h:
1094 2017-09-19 Carlos Garcia Campos <cgarcia@igalia.com>
1096 WebDriver: wrong response in case of errors
1097 https://bugs.webkit.org/show_bug.cgi?id=177127
1099 Reviewed by Brian Burg.
1101 I misunderstood the spec when I implemented this, so we either return a "value" key with the result in case of
1102 success or the error object as the body in case of error. We should always add a "value" key to the body and set
1103 it with either the result or the error object.
1105 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-an-error
1107 * WebDriverService.cpp:
1108 (WebDriver::WebDriverService::sendResponse const):
1110 2017-09-18 Carlos Garcia Campos <cgarcia@igalia.com>
1112 WebDriver: wrong key name for capabilities in new session response
1113 https://bugs.webkit.org/show_bug.cgi?id=177074
1115 Reviewed by Brian Burg.
1117 We are using "value", it should be "capabilities".
1118 https://w3c.github.io/webdriver/webdriver-spec.html#new-session
1120 * WebDriverService.cpp:
1121 (WebDriver::WebDriverService::newSession):
1123 2017-09-18 Carlos Garcia Campos <cgarcia@igalia.com>
1125 WebDriver: HTTP responses should include Cache-Control header with no-cache value
1126 https://bugs.webkit.org/show_bug.cgi?id=177073
1128 Reviewed by Sergio Villar Senin.
1130 6.3 Processing Model.
1131 Set the response’s header with name and value with the following values:
1133 Content-Type "application/json; charset=utf-8"
1134 Cache-Control "no-cache"
1136 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-a-response
1138 We were setting the Content-Type, but not the Cache-Control. This is checked by all WPT WebDriver tests.
1140 * soup/HTTPServerSoup.cpp:
1141 (WebDriver::HTTPServer::listen): Add Cache-Control header.
1143 2017-09-18 Michael Catanzaro <mcatanzaro@igalia.com>
1145 [CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
1146 https://bugs.webkit.org/show_bug.cgi?id=174558
1148 Reviewed by Alex Christensen.
1152 2017-09-15 JF Bastien <jfbastien@apple.com>
1154 WTF: use Forward.h when appropriate instead of Vector.h
1155 https://bugs.webkit.org/show_bug.cgi?id=176984
1157 Reviewed by Saam Barati.
1159 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.
1163 2017-09-09 Carlos Garcia Campos <cgarcia@igalia.com>
1165 WebDriver: ensure we close all windows handles when closing the session
1166 https://bugs.webkit.org/show_bug.cgi?id=176508
1168 Reviewed by Brian Burg.
1170 The spec says that when closing the session all top level browsing contexts should be closed. We are currently
1171 checking if we have an active top level browsing context and then we try to close it before trying with the
1172 rest. It can happen that we are in an inconsistent state, for example if the current top level browsing context
1173 has been closed by JavaScript or another action and the user didn't switch to another one before closing the
1174 session. In such case, closing the session will fail with NoSuchwindow and any other window open will not be
1175 closed. It's safer to always ask for all window handles and close them, which is what the spec says too.
1178 (WebDriver::firstWindowHandleInResult): Helper class to get the first window handle in the result array.
1179 (WebDriver::Session::closeAllToplevelBrowsingContexts): Use firstWindowHandleInResult().
1180 (WebDriver::Session::close): Close the current top level browsing context and get all window handles to close
1183 2017-08-28 Carlos Garcia Campos <cgarcia@igalia.com>
1185 WebDriver: implement screen capture commands
1186 https://bugs.webkit.org/show_bug.cgi?id=174615
1188 Reviewed by Brian Burg.
1190 Implement takeScreenshot and takeElementScreenshot commands.
1193 https://w3c.github.io/webdriver/webdriver-spec.html#screen-capture
1195 * CommandResult.cpp:
1196 (WebDriver::CommandResult::CommandResult): Handle ScreenshotError protocol error.
1197 (WebDriver::CommandResult::httpStatusCode const): Add UnableToCaptureScreen.
1198 (WebDriver::CommandResult::errorString const): Ditto.
1201 (WebDriver::Session::takeScreenshot):
1203 * WebDriverService.cpp:
1204 (WebDriver::WebDriverService::takeScreenshot):
1205 (WebDriver::WebDriverService::takeElementScreenshot):
1206 * WebDriverService.h:
1208 2017-08-28 Carlos Garcia Campos <cgarcia@igalia.com>
1210 WebDriver: implement cookies commands
1211 https://bugs.webkit.org/show_bug.cgi?id=174613
1213 Reviewed by Brian Burg.
1215 Add cookies commands.
1218 https://w3c.github.io/webdriver/webdriver-spec.html#cookies
1220 * CommandResult.cpp:
1221 (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
1222 (WebDriver::CommandResult::errorString const): Ditto.
1225 (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
1226 (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
1227 (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
1228 (WebDriver::Session::getAllCookies):
1229 (WebDriver::Session::getNamedCookie):
1230 (WebDriver::Session::addCookie):
1231 (WebDriver::Session::deleteCookie):
1232 (WebDriver::Session::deleteAllCookies):
1234 * WebDriverService.cpp:
1235 (WebDriver::WebDriverService::getAllCookies):
1236 (WebDriver::WebDriverService::getNamedCookie):
1237 (WebDriver::deserializeCookie):
1238 (WebDriver::WebDriverService::addCookie):
1239 (WebDriver::WebDriverService::deleteCookie):
1240 (WebDriver::WebDriverService::deleteAllCookies):
1241 * WebDriverService.h:
1243 2017-07-28 Carlos Garcia Campos <cgarcia@igalia.com>
1245 WebDriver: fix return value of close window command
1246 https://bugs.webkit.org/show_bug.cgi?id=174861
1248 Reviewed by Brian Burg.
1250 We are currently returning null, but we should return the list of window handles, and try to close the session
1251 if there aren't more window handles.
1254 https://w3c.github.io/webdriver/webdriver-spec.html#close-window
1256 3. If there are no more open top-level browsing contexts, then try to close the session.
1257 4. Return the result of running the remote end steps for the Get Window Handles command.
1260 (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
1261 context and the next one if there are more.
1262 (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
1264 (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
1265 getWindowHandles() when done.
1266 (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
1267 (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
1268 toplevel browsing context.
1271 * WebDriverService.cpp:
1272 (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
1273 (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
1274 (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
1275 * WebDriverService.h: Remove unused quit() method.
1276 * glib/SessionHostGlib.cpp:
1277 (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
1278 (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
1280 2017-08-14 Carlos Garcia Campos <cgarcia@igalia.com>
1282 WebDriver: handle click events on option elements
1283 https://bugs.webkit.org/show_bug.cgi?id=174710
1284 <rdar://problem/33459305>
1286 Reviewed by Brian Burg.
1288 Option elements are considered as a special case by the specification. When clicking an option element, we
1289 should get its container and use it when scrolling into view and calculating in-view center point instead of the
1290 option element itself. Then, we should not emulate a click, but change the selected status of the option element
1291 like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
1292 option to call selectOptionElement() or performMouseInteraction().
1294 This fixes more than 20 selenium tests.
1296 * CommandResult.cpp:
1297 (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
1298 (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
1299 (WebDriver::CommandResult::errorString const): Ditto.
1302 (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
1303 (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
1304 the element is an option or not.
1307 2017-08-11 Carlos Alberto Lopez Perez <clopez@igalia.com>
1309 Fix build warning in WebDriverService.h
1310 https://bugs.webkit.org/show_bug.cgi?id=166682
1312 Unreviewed build fix.
1314 * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
1316 2017-08-08 Michael Catanzaro <mcatanzaro@igalia.com>
1318 Unreviewed, fix Ubuntu LTS build
1319 https://bugs.webkit.org/show_bug.cgi?id=174490
1321 * glib/SessionHostGlib.cpp:
1323 2017-08-08 Michael Catanzaro <mcatanzaro@igalia.com>
1325 [CMake] Properly test if compiler supports compiler flags
1326 https://bugs.webkit.org/show_bug.cgi?id=174490
1328 Reviewed by Konstantin Tokarev.
1330 * WebDriverService.cpp:
1331 (WebDriver::WebDriverService::run):
1332 * glib/SessionHostGlib.cpp:
1334 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1336 Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
1337 https://bugs.webkit.org/show_bug.cgi?id=175261
1339 Reviewed by Brian Burg.
1341 * CommandResult.cpp:
1342 (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
1344 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1346 WebDriver: implement unhandled prompt behavior
1347 https://bugs.webkit.org/show_bug.cgi?id=175184
1349 Reviewed by Brian Burg.
1351 Handle user prompts before running some of the commands according to the specification.
1353 * Capabilities.h: Add UnhandledPromptBehavior capability.
1354 * CommandResult.cpp:
1355 (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
1356 (WebDriver::CommandResult::errorString const): Ditto.
1358 (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
1359 as part of the result error message.
1360 (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
1362 (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
1363 on the unhandled prompt behavior.
1364 (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
1365 including the alert text as additional error data.
1366 (WebDriver::Session::go): Handle user prompts before running the command.
1367 (WebDriver::Session::getCurrentURL): Ditto.
1368 (WebDriver::Session::back): Ditto.
1369 (WebDriver::Session::forward): Ditto.
1370 (WebDriver::Session::refresh): Ditto.
1371 (WebDriver::Session::getTitle): Ditto.
1372 (WebDriver::Session::closeWindow): Ditto.
1373 (WebDriver::Session::switchToFrame): Ditto.
1374 (WebDriver::Session::switchToParentFrame): Ditto.
1375 (WebDriver::Session::isElementSelected): Ditto.
1376 (WebDriver::Session::getElementText): Ditto.
1377 (WebDriver::Session::getElementTagName): Ditto.
1378 (WebDriver::Session::getElementRect): Ditto.
1379 (WebDriver::Session::isElementEnabled): Ditto.
1380 (WebDriver::Session::isElementDisplayed): Ditto.
1381 (WebDriver::Session::getElementAttribute): Ditto.
1382 (WebDriver::Session::elementSendKeys): Ditto.
1383 (WebDriver::Session::elementSubmit): Ditto.
1384 (WebDriver::Session::executeScript): Ditto.
1386 * WebDriverService.cpp:
1387 (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
1388 (WebDriver::deserializeUnhandledPromptBehavior):
1389 (WebDriver::WebDriverService::parseCapabilities const):
1390 (WebDriver::WebDriverService::validatedCapabilities const):
1391 (WebDriver::WebDriverService::newSession):
1393 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1395 WebDriver: implement user prompt commands
1396 https://bugs.webkit.org/show_bug.cgi?id=174614
1398 Reviewed by Brian Burg.
1400 * CommandResult.cpp:
1401 (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
1402 (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
1403 (WebDriver::CommandResult::errorString const): Ditto.
1406 (WebDriver::Session::dismissAlert):
1407 (WebDriver::Session::acceptAlert):
1408 (WebDriver::Session::getAlertText):
1409 (WebDriver::Session::sendAlertText):
1411 * WebDriverService.cpp:
1412 (WebDriver::WebDriverService::dismissAlert):
1413 (WebDriver::WebDriverService::acceptAlert):
1414 (WebDriver::WebDriverService::getAlertText):
1415 (WebDriver::WebDriverService::sendAlertText):
1416 * WebDriverService.h:
1418 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1420 [GTK][WPE] Add API to provide browser information required by automation
1421 https://bugs.webkit.org/show_bug.cgi?id=175130
1423 Reviewed by Brian Burg.
1426 (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
1427 with error in that case.
1429 * glib/SessionHostGlib.cpp:
1430 (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
1432 (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
1433 capabilities and calling matchCapabilities() to match them.
1434 (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
1437 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1439 WebDriver: Implement page load strategy
1440 https://bugs.webkit.org/show_bug.cgi?id=175183
1442 Reviewed by Brian Burg.
1444 Validate and parse page load strategy when processing capabilities.
1448 (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
1449 passed to Automation.
1450 (WebDriver::Session::go): Pass page load strategy if present.
1451 (WebDriver::Session::back): Ditto.
1452 (WebDriver::Session::forward): Ditto.
1453 (WebDriver::Session::refresh): Ditto.
1454 (WebDriver::Session::waitForNavigationToComplete): Ditto.
1456 * WebDriverService.cpp:
1457 (WebDriver::deserializePageLoadStrategy):
1458 (WebDriver::WebDriverService::parseCapabilities const):
1459 (WebDriver::WebDriverService::validatedCapabilities const):
1460 (WebDriver::WebDriverService::newSession):
1462 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1464 Unreviewed. Try to fix build with clang after r220315.
1466 * WebDriverService.cpp:
1467 (WebDriver::WebDriverService::validatedCapabilities const):
1468 (WebDriver::WebDriverService::mergeCapabilities const):
1470 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1472 WebDriver: properly handle capabilities and process firstMatch too
1473 https://bugs.webkit.org/show_bug.cgi?id=174618
1475 Reviewed by Brian Burg.
1477 Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
1480 7.2 Processing Capabilities.
1481 https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1483 * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
1485 * WebDriverService.cpp:
1486 (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
1487 (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
1488 so we just need to get them without checking the value type.
1489 (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
1490 values are the expected one.
1491 (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
1492 single object ensuring that the same capability is not in both.
1493 (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
1494 expected capabilities.
1495 (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
1496 (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
1497 capabilities and add all capabilities to the command result.
1498 (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
1499 * WebDriverService.h:
1500 * glib/SessionHostGlib.cpp:
1501 (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
1502 (WebDriver::SessionHost::startAutomationSession): Add FIXME.
1503 * gtk/WebDriverServiceGtk.cpp:
1504 (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
1505 (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
1506 (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
1507 (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
1508 (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
1511 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1513 WebDriver: use in-view center point for clicks instead of bounding box center point
1514 https://bugs.webkit.org/show_bug.cgi?id=174863
1516 Reviewed by Simon Fraser.
1518 The center of the element bounding box is not always part of the element, like in multiline links, for example.
1520 11.1 Element Interactability.
1521 https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
1523 * CommandResult.cpp:
1524 (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
1525 (WebDriver::CommandResult::errorString): Ditto.
1526 * CommandResult.h: Ditto.
1528 (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
1529 (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
1530 (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
1533 2017-08-01 Michael Catanzaro <mcatanzaro@igalia.com>
1535 [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
1536 https://bugs.webkit.org/show_bug.cgi?id=174855
1538 Reviewed by Carlos Garcia Campos.
1540 Don't create derived sources directory here anymore.
1542 * PlatformGTK.cmake:
1544 2017-07-26 Carlos Garcia Campos <cgarcia@igalia.com>
1546 Unreviewed. Fix GTK distcheck.
1548 Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
1550 * PlatformGTK.cmake:
1552 2017-07-24 Carlos Garcia Campos <cgarcia@igalia.com>
1554 WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
1555 https://bugs.webkit.org/show_bug.cgi?id=174783
1557 Reviewed by Brian Burg.
1559 We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
1560 current browsing context, and the spec also refers to it as the current browsing context, so better use
1561 m_currentBrowsingContext.
1564 (WebDriver::Session::switchToTopLevelBrowsingContext):
1565 (WebDriver::Session::switchToBrowsingContext):
1566 (WebDriver::Session::switchToFrame):
1567 (WebDriver::Session::switchToParentFrame):
1568 (WebDriver::Session::computeElementLayout):
1569 (WebDriver::Session::findElements):
1570 (WebDriver::Session::isElementSelected):
1571 (WebDriver::Session::getElementText):
1572 (WebDriver::Session::getElementTagName):
1573 (WebDriver::Session::isElementEnabled):
1574 (WebDriver::Session::isElementDisplayed):
1575 (WebDriver::Session::getElementAttribute):
1576 (WebDriver::Session::waitForNavigationToComplete):
1577 (WebDriver::Session::elementClear):
1578 (WebDriver::Session::elementSendKeys):
1579 (WebDriver::Session::elementSubmit):
1580 (WebDriver::Session::executeScript):
1583 2017-07-20 Carlos Garcia Campos <cgarcia@igalia.com>
1585 WebDriver: implement page load timeout
1586 https://bugs.webkit.org/show_bug.cgi?id=174672
1588 Reviewed by Brian Burg.
1590 Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
1591 commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
1592 instead of the one in the spec.
1595 https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
1597 * CommandResult.cpp:
1598 (WebDriver::CommandResult::CommandResult):
1599 (WebDriver::CommandResult::httpStatusCode):
1600 (WebDriver::CommandResult::errorString):
1603 (WebDriver::Session::go):
1604 (WebDriver::Session::back):
1605 (WebDriver::Session::forward):
1606 (WebDriver::Session::refresh):
1607 (WebDriver::Session::waitForNavigationToComplete):
1608 * WebDriverService.cpp:
1609 (WebDriver::WebDriverService::setTimeouts):
1611 2017-07-21 Carlos Garcia Campos <cgarcia@igalia.com>
1613 WebDriver: wait until navigation is complete before running new commands and after a click
1614 https://bugs.webkit.org/show_bug.cgi?id=174670
1616 Reviewed by Brian Burg.
1618 We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
1619 the spec says we should always wait before executing a new command and also after a click. This is causing test
1620 testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
1621 + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
1622 the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
1625 6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
1626 jump to step 1 in this overall algorithm, otherwise continue.
1627 https://www.w3.org/TR/webdriver/#processing-model
1629 14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
1630 value if it is an error. 2. Try to wait for navigation to complete.
1631 https://www.w3.org/TR/webdriver/#element-click
1634 (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
1635 wait for any pending navigation of current browsing context to complete.
1636 (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
1638 * WebDriverService.cpp:
1639 (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
1640 (WebDriver::WebDriverService::getCurrentURL): Ditto.
1641 (WebDriver::WebDriverService::back): Ditto.
1642 (WebDriver::WebDriverService::forward): Ditto.
1643 (WebDriver::WebDriverService::refresh): Ditto.
1644 (WebDriver::WebDriverService::getTitle): Ditto.
1645 (WebDriver::WebDriverService::switchToFrame): Ditto.
1646 (WebDriver::WebDriverService::switchToParentFrame): Ditto.
1647 (WebDriver::WebDriverService::findElement): Ditto.
1648 (WebDriver::WebDriverService::findElements): Ditto.
1649 (WebDriver::WebDriverService::executeScript): Ditto.
1650 (WebDriver::WebDriverService::executeAsyncScript): Ditto.
1652 2017-07-21 Carlos Garcia Campos <cgarcia@igalia.com>
1654 WebDriver: correctly handle main frame handles
1655 https://bugs.webkit.org/show_bug.cgi?id=174668
1657 Reviewed by Brian Burg.
1659 When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
1660 that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
1661 are currently considering empty strings as valid browsing context. It's not a big deal because Automation
1662 converts back the empty string received to the main frame, though. We should also ensure we close the current
1663 browsing context when switching to a new top level browsing context. This patch adds to helper private methods
1664 to switch browsing contexts that deal with the special cases.
1667 (WebDriver::Session::close):
1668 (WebDriver::Session::switchToTopLevelBrowsingContext):
1669 (WebDriver::Session::switchToBrowsingContext):
1670 (WebDriver::Session::createTopLevelBrowsingContext):
1671 (WebDriver::Session::go):
1672 (WebDriver::Session::back):
1673 (WebDriver::Session::forward):
1674 (WebDriver::Session::refresh):
1675 (WebDriver::Session::switchToWindow):
1676 (WebDriver::Session::switchToFrame):
1677 (WebDriver::Session::switchToParentFrame):
1680 2017-07-18 Carlos Garcia Campos <cgarcia@igalia.com>
1682 WebDriver: handle invalid selector errors
1683 https://bugs.webkit.org/show_bug.cgi?id=174619
1685 Reviewed by Brian Burg.
1687 Add InvalidSelector error and handle it in case of protocol server error.
1689 * CommandResult.cpp:
1690 (WebDriver::CommandResult::CommandResult):
1691 (WebDriver::CommandResult::httpStatusCode):
1692 (WebDriver::CommandResult::errorString):
1695 2017-07-18 Carlos Alberto Lopez Perez <clopez@igalia.com>
1697 [GTK] Fix build with Clang after r219605.
1698 https://bugs.webkit.org/show_bug.cgi?id=166682
1700 Unreviewed build fix.
1702 Clang-3.8 complains with the following error:
1703 non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
1705 * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
1707 2017-07-13 Carlos Garcia Campos <cgarcia@igalia.com>
1709 Add initial implementation of WebDriver process to run the HTTP server
1710 https://bugs.webkit.org/show_bug.cgi?id=166682
1712 Reviewed by Brian Burg.
1714 Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
1715 cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
1716 the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
1717 libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
1718 inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
1719 using the official selenium python tests as reference.
1721 * CMakeLists.txt: Added.
1722 * Capabilities.h: Added.
1723 * CommandResult.cpp: Added.
1724 * CommandResult.h: Added.
1725 * HTTPServer.cpp: Added.
1726 * HTTPServer.h: Added.
1727 * PlatformGTK.cmake: Added.
1728 * Session.cpp: Added.
1730 * SessionHost.cpp: Added.
1731 * SessionHost.h: Added.
1732 * WebDriverMain.cpp: Added.
1733 * WebDriverService.cpp: Added.
1734 * WebDriverService.h: Added.
1736 * glib/SessionHostGlib.cpp: Added.
1737 * gtk/WebDriverServiceGtk.cpp: Added.
1738 * soup/HTTPServerSoup.cpp: Added.