1 2017-12-02 Carlos Garcia Campos <cgarcia@igalia.com>
3 WebDriver: handle user prompts shown while executing scripts
4 https://bugs.webkit.org/show_bug.cgi?id=179979
6 Reviewed by Brian Burg.
9 https://w3c.github.io/webdriver/webdriver-spec.html#executing-script
11 The rules to execute a function body are as follows. The algorithm will return success with the JSON
12 representation of the function’s return value, or an error if the evaluation of the function results in a
13 JavaScript exception being thrown or at any point during its execution an unhandled user prompt appears.
15 If at any point during the algorithm a user prompt appears, the user prompt handler must be invoked. If its
16 return value is an error, it must immediately return with that error and abort all subsequent substeps of this
19 This will be covered by new WPT tests that will be available after the next upgrade.
22 (WebDriver::CommandResult::CommandResult): Handle UnexpectedAlertOpen internal error.
24 (WebDriver::Session::handleUserPrompts): Move code to handleUnexpectedAlertOpen() and call it instead.
25 (WebDriver::Session::handleUnexpectedAlertOpen): Code moved here to be used also by executeScript().
26 (WebDriver::Session::executeScript): In case of UnexpectedAlertOpen error, call handleUnexpectedAlertOpen().
29 2017-12-01 Carlos Garcia Campos <cgarcia@igalia.com>
31 WebDriver: implement status command
32 https://bugs.webkit.org/show_bug.cgi?id=180133
34 Reviewed by Brian Burg.
37 https://w3c.github.io/webdriver/webdriver-spec.html#status
39 Fixes: imported/w3c/webdriver/tests/sessions/status.py::test_get_status_no_session
40 imported/w3c/webdriver/tests/sessions/status.py::test_status_with_session_running_on_endpoint_node
42 * WebDriverService.cpp:
43 (WebDriver::WebDriverService::status):
46 2017-12-01 Carlos Garcia Campos <cgarcia@igalia.com>
48 WebDriver: end point nodes are only allowed to have one session
49 https://bugs.webkit.org/show_bug.cgi?id=180131
51 Reviewed by Brian Burg.
53 We are currently keeping a map of sessions, but our service is always and end point node, so only one session
54 can exist at a time. Make findSessionOrCompleteWithError() return a boolean instead, failing in case the sessionID
55 parameter is not found or it doesn't match the current session. Replace the session map and active session
56 pointer with a single session member and return SessionNotCreated error when new session command is received and
57 there's an active session.
60 A remote end has an associated maximum active sessions (an integer) that defines the number of active sessions
61 that are supported. This may be “unlimited” for intermediary nodes, but must be exactly one for a remote end
62 that is an endpoint node.
63 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-maximum-active-sessions
65 Fixes: imported/w3c/webdriver/tests/sessions/new_session/default_values.py::test_repeat_new_session
67 * WebDriverService.cpp:
68 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
69 (WebDriver::WebDriverService::newSession):
70 (WebDriver::WebDriverService::deleteSession):
71 (WebDriver::WebDriverService::status):
72 (WebDriver::WebDriverService::setTimeouts):
73 (WebDriver::WebDriverService::go):
74 (WebDriver::WebDriverService::getCurrentURL):
75 (WebDriver::WebDriverService::back):
76 (WebDriver::WebDriverService::forward):
77 (WebDriver::WebDriverService::refresh):
78 (WebDriver::WebDriverService::getTitle):
79 (WebDriver::WebDriverService::getWindowHandle):
80 (WebDriver::WebDriverService::setWindowRect):
81 (WebDriver::WebDriverService::closeWindow):
82 (WebDriver::WebDriverService::switchToWindow):
83 (WebDriver::WebDriverService::getWindowHandles):
84 (WebDriver::WebDriverService::switchToFrame):
85 (WebDriver::WebDriverService::switchToParentFrame):
86 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
87 (WebDriver::WebDriverService::findElement):
88 (WebDriver::WebDriverService::findElements):
89 (WebDriver::WebDriverService::findElementFromElement):
90 (WebDriver::WebDriverService::findElementsFromElement):
91 (WebDriver::WebDriverService::getActiveElement):
92 (WebDriver::WebDriverService::isElementSelected):
93 (WebDriver::WebDriverService::getElementAttribute):
94 (WebDriver::WebDriverService::getElementText):
95 (WebDriver::WebDriverService::getElementTagName):
96 (WebDriver::WebDriverService::getElementRect):
97 (WebDriver::WebDriverService::isElementEnabled):
98 (WebDriver::WebDriverService::isElementDisplayed):
99 (WebDriver::WebDriverService::elementClick):
100 (WebDriver::WebDriverService::elementClear):
101 (WebDriver::WebDriverService::elementSendKeys):
102 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
103 (WebDriver::WebDriverService::executeScript):
104 (WebDriver::WebDriverService::executeAsyncScript):
105 (WebDriver::WebDriverService::getAllCookies):
106 (WebDriver::WebDriverService::getNamedCookie):
107 (WebDriver::deserializeCookie):
108 (WebDriver::WebDriverService::addCookie):
109 (WebDriver::WebDriverService::deleteCookie):
110 (WebDriver::WebDriverService::deleteAllCookies):
111 (WebDriver::WebDriverService::dismissAlert):
112 (WebDriver::WebDriverService::acceptAlert):
113 (WebDriver::WebDriverService::getAlertText):
114 (WebDriver::WebDriverService::sendAlertText):
115 (WebDriver::WebDriverService::takeScreenshot):
116 (WebDriver::WebDriverService::takeElementScreenshot):
117 * WebDriverService.h:
119 2017-11-30 Carlos Garcia Campos <cgarcia@igalia.com>
121 WebDriver: locator strategy should be validated before trying to find elements
122 https://bugs.webkit.org/show_bug.cgi?id=180187
124 Reviewed by Carlos Alberto Lopez Perez.
126 We currently rely on the js atom to raise an exception in case the locator strategy is not valid, but in case of
127 find element from element, if the element doesn't exist we fail with stale element error instead of invalid
128 argument as expected. So, let's validate the strategies when parsing them, which would also avoid going to the
129 browser in cae of invalid strategy.
131 Fixes: imported/w3c/webdriver/tests/retrieval/find_element_from_element.py::test_invalid_using_argument[a]
133 * WebDriverService.cpp:
134 (WebDriver::isValidStrategy):
135 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
137 2017-11-30 Carlos Garcia Campos <cgarcia@igalia.com>
139 WebDriver: remove elementSubmit command
140 https://bugs.webkit.org/show_bug.cgi?id=180186
142 Reviewed by Carlos Alberto Lopez Perez.
144 It's not in the spec, we had it only because selenium used it, but now it uses execute_script with custom code
145 to implement submit, so we can just remove it.
148 (WebDriver::Session::elementSubmit): Deleted.
150 * WebDriverService.cpp:
151 (WebDriver::WebDriverService::elementSubmit): Deleted.
152 * WebDriverService.h:
154 2017-11-14 Carlos Garcia Campos <cgarcia@igalia.com>
156 Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
157 https://bugs.webkit.org/show_bug.cgi?id=173793
159 Reviewed by Joseph Pecoraro.
163 (WebDriver::CommandResult::CommandResult):
165 (WebDriver::CommandResult::success):
166 (WebDriver::CommandResult::fail):
167 (WebDriver::CommandResult::result const):
168 (WebDriver::CommandResult::setAdditionalErrorData):
169 (WebDriver::CommandResult::additionalErrorData const):
171 (WebDriver::firstWindowHandleInResult):
172 (WebDriver::Session::handleUserPrompts):
173 (WebDriver::Session::reportUnexpectedAlertOpen):
174 (WebDriver::Session::go):
175 (WebDriver::Session::getCurrentURL):
176 (WebDriver::Session::back):
177 (WebDriver::Session::forward):
178 (WebDriver::Session::refresh):
179 (WebDriver::Session::getTitle):
180 (WebDriver::Session::getWindowHandle):
181 (WebDriver::Session::closeTopLevelBrowsingContext):
182 (WebDriver::Session::switchToWindow):
183 (WebDriver::Session::getWindowHandles):
184 (WebDriver::Session::switchToFrame):
185 (WebDriver::Session::switchToParentFrame):
186 (WebDriver::Session::getToplevelBrowsingContextRect):
187 (WebDriver::Session::moveToplevelBrowsingContextWindow):
188 (WebDriver::Session::resizeToplevelBrowsingContextWindow):
189 (WebDriver::Session::createElement):
190 (WebDriver::Session::extractElement):
191 (WebDriver::Session::extractElementID):
192 (WebDriver::Session::computeElementLayout):
193 (WebDriver::Session::findElements):
194 (WebDriver::Session::isElementSelected):
195 (WebDriver::Session::getElementText):
196 (WebDriver::Session::getElementTagName):
197 (WebDriver::Session::getElementRect):
198 (WebDriver::Session::isElementEnabled):
199 (WebDriver::Session::isElementDisplayed):
200 (WebDriver::Session::getElementAttribute):
201 (WebDriver::Session::waitForNavigationToComplete):
202 (WebDriver::Session::selectOptionElement):
203 (WebDriver::Session::elementClick):
204 (WebDriver::Session::elementClear):
205 (WebDriver::Session::elementSendKeys):
206 (WebDriver::Session::elementSubmit):
207 (WebDriver::Session::handleScriptResult):
208 (WebDriver::Session::executeScript):
209 (WebDriver::Session::performMouseInteraction):
210 (WebDriver::Session::performKeyboardInteractions):
211 (WebDriver::parseAutomationCookie):
212 (WebDriver::builtAutomationCookie):
213 (WebDriver::serializeCookie):
214 (WebDriver::Session::getAllCookies):
215 (WebDriver::Session::getNamedCookie):
216 (WebDriver::Session::addCookie):
217 (WebDriver::Session::deleteCookie):
218 (WebDriver::Session::deleteAllCookies):
219 (WebDriver::Session::dismissAlert):
220 (WebDriver::Session::acceptAlert):
221 (WebDriver::Session::getAlertText):
222 (WebDriver::Session::sendAlertText):
223 (WebDriver::Session::takeScreenshot):
226 (WebDriver::SessionHost::sendCommandToBackend):
227 (WebDriver::SessionHost::dispatchMessage):
229 * WebDriverService.cpp:
230 (WebDriver::WebDriverService::handleRequest):
231 (WebDriver::WebDriverService::sendResponse const):
232 (WebDriver::deserializeTimeouts):
233 (WebDriver::WebDriverService::parseCapabilities const):
234 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
235 (WebDriver::WebDriverService::validatedCapabilities const):
236 (WebDriver::WebDriverService::mergeCapabilities const):
237 (WebDriver::WebDriverService::matchCapabilities const):
238 (WebDriver::WebDriverService::processCapabilities const):
239 (WebDriver::WebDriverService::newSession):
240 (WebDriver::WebDriverService::deleteSession):
241 (WebDriver::WebDriverService::setTimeouts):
242 (WebDriver::WebDriverService::go):
243 (WebDriver::WebDriverService::getCurrentURL):
244 (WebDriver::WebDriverService::back):
245 (WebDriver::WebDriverService::forward):
246 (WebDriver::WebDriverService::refresh):
247 (WebDriver::WebDriverService::getTitle):
248 (WebDriver::WebDriverService::getWindowHandle):
249 (WebDriver::WebDriverService::getWindowRect):
250 (WebDriver::valueAsNumberInRange):
251 (WebDriver::WebDriverService::setWindowRect):
252 (WebDriver::WebDriverService::closeWindow):
253 (WebDriver::WebDriverService::switchToWindow):
254 (WebDriver::WebDriverService::getWindowHandles):
255 (WebDriver::WebDriverService::switchToFrame):
256 (WebDriver::WebDriverService::switchToParentFrame):
257 (WebDriver::findElementOrCompleteWithError):
258 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
259 (WebDriver::WebDriverService::findElement):
260 (WebDriver::WebDriverService::findElements):
261 (WebDriver::WebDriverService::findElementFromElement):
262 (WebDriver::WebDriverService::findElementsFromElement):
263 (WebDriver::WebDriverService::isElementSelected):
264 (WebDriver::WebDriverService::getElementAttribute):
265 (WebDriver::WebDriverService::getElementText):
266 (WebDriver::WebDriverService::getElementTagName):
267 (WebDriver::WebDriverService::getElementRect):
268 (WebDriver::WebDriverService::isElementEnabled):
269 (WebDriver::WebDriverService::isElementDisplayed):
270 (WebDriver::WebDriverService::elementClick):
271 (WebDriver::WebDriverService::elementClear):
272 (WebDriver::WebDriverService::elementSendKeys):
273 (WebDriver::WebDriverService::elementSubmit):
274 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
275 (WebDriver::WebDriverService::executeScript):
276 (WebDriver::WebDriverService::executeAsyncScript):
277 (WebDriver::WebDriverService::getAllCookies):
278 (WebDriver::WebDriverService::getNamedCookie):
279 (WebDriver::deserializeCookie):
280 (WebDriver::WebDriverService::addCookie):
281 (WebDriver::WebDriverService::deleteCookie):
282 (WebDriver::WebDriverService::deleteAllCookies):
283 (WebDriver::WebDriverService::dismissAlert):
284 (WebDriver::WebDriverService::acceptAlert):
285 (WebDriver::WebDriverService::getAlertText):
286 (WebDriver::WebDriverService::sendAlertText):
287 (WebDriver::WebDriverService::takeScreenshot):
288 (WebDriver::WebDriverService::takeElementScreenshot):
289 * WebDriverService.h:
290 * gtk/WebDriverServiceGtk.cpp:
291 (WebDriver::WebDriverService::platformValidateCapability const):
292 (WebDriver::WebDriverService::platformMatchCapability const):
293 (WebDriver::WebDriverService::platformParseCapabilities const):
294 * wpe/WebDriverServiceWPE.cpp:
295 (WebDriver::WebDriverService::platformValidateCapability const):
296 (WebDriver::WebDriverService::platformMatchCapability const):
297 (WebDriver::WebDriverService::platformParseCapabilities const):
299 2017-11-28 Carlos Garcia Campos <cgarcia@igalia.com>
301 [GTK] WebDriver: stop making mandatory to provide a browser path if webkitgtk:browserOptions is present in capabilities
302 https://bugs.webkit.org/show_bug.cgi?id=180012
304 Reviewed by Carlos Alberto Lopez Perez.
306 Everything should be optional. We might want to disable overlay scrollbars, but still using the default browser,
307 for example, as I'm doing when running the selenium tests. We might also want to provide additional browser
308 arguments, but using the default browser.
310 * gtk/WebDriverServiceGtk.cpp:
311 (WebDriver::WebDriverService::platformValidateCapability const): Do not consider invalid to not provide a
312 browser binary when webkitgtk:browserOptions is present.
313 (WebDriver::WebDriverService::platformParseCapabilities const): Override default capabilities with the ones
316 2017-11-27 Carlos Garcia Campos <cgarcia@igalia.com>
318 WebDriver: Implement get active element command
319 https://bugs.webkit.org/show_bug.cgi?id=180001
321 Reviewed by Brian Burg.
323 12.6 Get Active Element
324 https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element
326 Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.
329 (WebDriver::Session::getActiveElement):
331 * WebDriverService.cpp:
332 (WebDriver::WebDriverService::getActiveElement):
333 * WebDriverService.h:
335 2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>
337 WebDriver: do not try to parse http body if method is not POST
338 https://bugs.webkit.org/show_bug.cgi?id=179918
340 Reviewed by Darin Adler.
344 5. If request’s method is POST:
346 1. Let parse result be the result of parsing as JSON with request’s body as the argument. If this process
347 throws an exception, return an error with error code invalid argument and jump back to step 1 in this
350 2. If parse result is not an Object, send an error with error code invalid argument and jump back to step 1
351 in this overall algorithm.
353 Otherwise, let parameters be parse result.
355 Otherwise, let parameters be null.
358 https://w3c.github.io/webdriver/webdriver-spec.html#processing-model
360 Now, w3c tests are sending null as body of delete session command (it used to be just empty), making it fail
361 with invalid argument error.
363 * WebDriverService.cpp:
364 (WebDriver::WebDriverService::findCommand):
365 (WebDriver::WebDriverService::handleRequest):
366 * WebDriverService.h:
368 2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>
370 WebDriver: crash in Session::computeElementLayout when called without a current browsing context
371 https://bugs.webkit.org/show_bug.cgi?id=179917
373 Reviewed by Darin Adler.
375 In the case of computeElementLayout message, the frameHandle parameter is not optional, but we still need to
376 provide a valid value (empty string means the default frame) when m_currentBrowsingContext is std::nullopt. The
377 same applies to selectOptionElement.
380 (WebDriver::Session::computeElementLayout):
381 (WebDriver::Session::selectOptionElement):
383 2017-11-15 Carlos Garcia Campos <cgarcia@igalia.com>
385 [WPE] Add initial support for WebDriver
386 https://bugs.webkit.org/show_bug.cgi?id=179727
388 Reviewed by Michael Catanzaro.
390 Add WPE implementation for platform-specific methods. Move the version handling to a common file
391 WebDriverServiceGLib.cpp.
396 * glib/WebDriverServiceGLib.cpp: Added.
397 (WebDriver::parseVersion):
398 (WebDriver::WebDriverService::platformCompareBrowserVersions):
399 * gtk/WebDriverServiceGtk.cpp:
400 * wpe/WebDriverServiceWPE.cpp: Copied from Source/WebDriver/gtk/WebDriverServiceGtk.cpp.
401 (WebDriver::WebDriverService::platformCapabilities):
402 (WebDriver::WebDriverService::platformValidateCapability const):
403 (WebDriver::WebDriverService::platformMatchCapability const):
404 (WebDriver::WebDriverService::platformParseCapabilities const):
406 2017-11-15 Ryan Haddad <ryanhaddad@apple.com>
408 Unreviewed, rolling out r224863.
410 Introduced LayoutTest crashes on iOS Simulator.
414 "Move JSONValues to WTF and convert uses of InspectorValues.h
416 https://bugs.webkit.org/show_bug.cgi?id=173793
417 https://trac.webkit.org/changeset/224863
419 2017-11-14 Carlos Garcia Campos <cgarcia@igalia.com>
421 Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
422 https://bugs.webkit.org/show_bug.cgi?id=173793
424 Reviewed by Brian Burg.
428 (WebDriver::CommandResult::CommandResult):
430 (WebDriver::CommandResult::success):
431 (WebDriver::CommandResult::fail):
432 (WebDriver::CommandResult::result const):
433 (WebDriver::CommandResult::setAdditionalErrorData):
434 (WebDriver::CommandResult::additionalErrorData const):
436 (WebDriver::firstWindowHandleInResult):
437 (WebDriver::Session::handleUserPrompts):
438 (WebDriver::Session::reportUnexpectedAlertOpen):
439 (WebDriver::Session::go):
440 (WebDriver::Session::getCurrentURL):
441 (WebDriver::Session::back):
442 (WebDriver::Session::forward):
443 (WebDriver::Session::refresh):
444 (WebDriver::Session::getTitle):
445 (WebDriver::Session::getWindowHandle):
446 (WebDriver::Session::closeTopLevelBrowsingContext):
447 (WebDriver::Session::switchToWindow):
448 (WebDriver::Session::getWindowHandles):
449 (WebDriver::Session::switchToFrame):
450 (WebDriver::Session::switchToParentFrame):
451 (WebDriver::Session::getToplevelBrowsingContextRect):
452 (WebDriver::Session::moveToplevelBrowsingContextWindow):
453 (WebDriver::Session::resizeToplevelBrowsingContextWindow):
454 (WebDriver::Session::createElement):
455 (WebDriver::Session::extractElement):
456 (WebDriver::Session::extractElementID):
457 (WebDriver::Session::computeElementLayout):
458 (WebDriver::Session::findElements):
459 (WebDriver::Session::isElementSelected):
460 (WebDriver::Session::getElementText):
461 (WebDriver::Session::getElementTagName):
462 (WebDriver::Session::getElementRect):
463 (WebDriver::Session::isElementEnabled):
464 (WebDriver::Session::isElementDisplayed):
465 (WebDriver::Session::getElementAttribute):
466 (WebDriver::Session::waitForNavigationToComplete):
467 (WebDriver::Session::selectOptionElement):
468 (WebDriver::Session::elementClick):
469 (WebDriver::Session::elementClear):
470 (WebDriver::Session::elementSendKeys):
471 (WebDriver::Session::elementSubmit):
472 (WebDriver::Session::handleScriptResult):
473 (WebDriver::Session::executeScript):
474 (WebDriver::Session::performMouseInteraction):
475 (WebDriver::Session::performKeyboardInteractions):
476 (WebDriver::parseAutomationCookie):
477 (WebDriver::builtAutomationCookie):
478 (WebDriver::serializeCookie):
479 (WebDriver::Session::getAllCookies):
480 (WebDriver::Session::getNamedCookie):
481 (WebDriver::Session::addCookie):
482 (WebDriver::Session::deleteCookie):
483 (WebDriver::Session::deleteAllCookies):
484 (WebDriver::Session::dismissAlert):
485 (WebDriver::Session::acceptAlert):
486 (WebDriver::Session::getAlertText):
487 (WebDriver::Session::sendAlertText):
488 (WebDriver::Session::takeScreenshot):
491 (WebDriver::SessionHost::sendCommandToBackend):
492 (WebDriver::SessionHost::dispatchMessage):
494 * WebDriverService.cpp:
495 (WebDriver::WebDriverService::handleRequest):
496 (WebDriver::WebDriverService::sendResponse const):
497 (WebDriver::deserializeTimeouts):
498 (WebDriver::WebDriverService::parseCapabilities const):
499 (WebDriver::WebDriverService::findSessionOrCompleteWithError):
500 (WebDriver::WebDriverService::validatedCapabilities const):
501 (WebDriver::WebDriverService::mergeCapabilities const):
502 (WebDriver::WebDriverService::matchCapabilities const):
503 (WebDriver::WebDriverService::processCapabilities const):
504 (WebDriver::WebDriverService::newSession):
505 (WebDriver::WebDriverService::deleteSession):
506 (WebDriver::WebDriverService::setTimeouts):
507 (WebDriver::WebDriverService::go):
508 (WebDriver::WebDriverService::getCurrentURL):
509 (WebDriver::WebDriverService::back):
510 (WebDriver::WebDriverService::forward):
511 (WebDriver::WebDriverService::refresh):
512 (WebDriver::WebDriverService::getTitle):
513 (WebDriver::WebDriverService::getWindowHandle):
514 (WebDriver::WebDriverService::getWindowRect):
515 (WebDriver::valueAsNumberInRange):
516 (WebDriver::WebDriverService::setWindowRect):
517 (WebDriver::WebDriverService::closeWindow):
518 (WebDriver::WebDriverService::switchToWindow):
519 (WebDriver::WebDriverService::getWindowHandles):
520 (WebDriver::WebDriverService::switchToFrame):
521 (WebDriver::WebDriverService::switchToParentFrame):
522 (WebDriver::findElementOrCompleteWithError):
523 (WebDriver::findStrategyAndSelectorOrCompleteWithError):
524 (WebDriver::WebDriverService::findElement):
525 (WebDriver::WebDriverService::findElements):
526 (WebDriver::WebDriverService::findElementFromElement):
527 (WebDriver::WebDriverService::findElementsFromElement):
528 (WebDriver::WebDriverService::isElementSelected):
529 (WebDriver::WebDriverService::getElementAttribute):
530 (WebDriver::WebDriverService::getElementText):
531 (WebDriver::WebDriverService::getElementTagName):
532 (WebDriver::WebDriverService::getElementRect):
533 (WebDriver::WebDriverService::isElementEnabled):
534 (WebDriver::WebDriverService::isElementDisplayed):
535 (WebDriver::WebDriverService::elementClick):
536 (WebDriver::WebDriverService::elementClear):
537 (WebDriver::WebDriverService::elementSendKeys):
538 (WebDriver::WebDriverService::elementSubmit):
539 (WebDriver::findScriptAndArgumentsOrCompleteWithError):
540 (WebDriver::WebDriverService::executeScript):
541 (WebDriver::WebDriverService::executeAsyncScript):
542 (WebDriver::WebDriverService::getAllCookies):
543 (WebDriver::WebDriverService::getNamedCookie):
544 (WebDriver::deserializeCookie):
545 (WebDriver::WebDriverService::addCookie):
546 (WebDriver::WebDriverService::deleteCookie):
547 (WebDriver::WebDriverService::deleteAllCookies):
548 (WebDriver::WebDriverService::dismissAlert):
549 (WebDriver::WebDriverService::acceptAlert):
550 (WebDriver::WebDriverService::getAlertText):
551 (WebDriver::WebDriverService::sendAlertText):
552 (WebDriver::WebDriverService::takeScreenshot):
553 (WebDriver::WebDriverService::takeElementScreenshot):
554 * WebDriverService.h:
555 * gtk/WebDriverServiceGtk.cpp:
556 (WebDriver::WebDriverService::platformValidateCapability const):
557 (WebDriver::WebDriverService::platformMatchCapability const):
558 (WebDriver::WebDriverService::platformParseCapabilities const):
560 2017-11-07 Brian Burg <bburg@apple.com>
562 Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
563 https://bugs.webkit.org/show_bug.cgi?id=179129
564 <rdar://problem/35297038>
566 Reviewed by Simon Fraser.
568 Adjust code to use the proper coordinate system when requesting element layout.
571 (WebDriver::Session::computeElementLayout):
573 2017-11-09 Carlos Garcia Campos <cgarcia@igalia.com>
575 WebDriver: WebDriverService::matchCapabilities should follow the spec
576 https://bugs.webkit.org/show_bug.cgi?id=179371
578 Reviewed by Brian Burg.
580 The returned object should contain all the entries mentioned in the spec, not only the ones already present in
581 the passed in capabilities object.
583 7.2 Processing Capabilities
584 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-matching-capabilities
586 * WebDriverService.cpp:
587 (WebDriver::WebDriverService::matchCapabilities const):
588 (WebDriver::WebDriverService::processCapabilities const):
589 * WebDriverService.h:
591 2017-11-09 Carlos Garcia Campos <cgarcia@igalia.com>
593 WebDriver: capabilities with null value shouldn't be added to the validated capabilities object
594 https://bugs.webkit.org/show_bug.cgi?id=179369
596 Reviewed by Brian Burg.
598 "4. If deserialized is not null, set a property on result with name name and value deserialized."
600 7.2 Processing Capabilities
601 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
603 Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[platformName-None]
605 * WebDriverService.cpp:
606 (WebDriver::WebDriverService::validatedCapabilities const):
608 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
610 WebDriver: unknown capabilities should produce an InvalidArgument error when validating capabilities
611 https://bugs.webkit.org/show_bug.cgi?id=178868
613 Reviewed by Brian Burg.
615 7.2 Processing Capabilities
616 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
618 Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_extensions
620 * WebDriverService.cpp:
621 (WebDriver::WebDriverService::validatedCapabilities const):
623 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
625 WebDriver: deserializeTimeouts should fail if the value is not integer
626 https://bugs.webkit.org/show_bug.cgi?id=178866
628 Reviewed by Brian Burg.
630 If value is not an integer, or it is less than 0 or greater than 2^64 – 1, return error with error code invalid
632 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-deserialize-as-a-timeout
634 Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body0]
635 imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body1]
637 * WebDriverService.cpp:
638 (WebDriver::deserializeTimeouts):
640 2017-10-27 Carlos Garcia Campos <cgarcia@igalia.com>
642 WebDriver: failing to process capabilities should produce InvalidArgument error not SessionNotCreated
643 https://bugs.webkit.org/show_bug.cgi?id=178864
645 Reviewed by Brian Burg.
647 Fixes most of the tests in imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py.
649 7.2 Processing Capabilities
650 https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
652 * WebDriverService.cpp:
653 (WebDriver::WebDriverService::processCapabilities const):
655 2017-10-10 Sam Weinig <sam@webkit.org>
657 Replace copyKeysToVector/copyValuesToVector with copyToVector(map.keys())/copyToVector(map.values())
658 https://bugs.webkit.org/show_bug.cgi?id=178102
660 Reviewed by Tim Horton.
663 (WebDriver::SessionHost::inspectorDisconnected):
665 2017-10-02 Carlos Garcia Campos <cgarcia@igalia.com>
667 WebDriver: HTTP status code is not correct for some of the errors
668 https://bugs.webkit.org/show_bug.cgi?id=177354
670 Reviewed by Brian Burg.
672 I think this changed in the spec at some point. The thing is that no such alert, frame and window and stale
673 element reference errors should return 404 instead of 400.
675 https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
678 (WebDriver::CommandResult::httpStatusCode const):
680 2017-09-19 Carlos Garcia Campos <cgarcia@igalia.com>
682 WebDriver: Implement commands to get and set the window rect
683 https://bugs.webkit.org/show_bug.cgi?id=177134
685 Reviewed by Brian Burg.
687 We are currently implementing the selenium legacy ones, we should implement the w3c ones instead.
689 https://w3c.github.io/webdriver/webdriver-spec.html#resizing-and-positioning-windows
692 (WebDriver::Session::getToplevelBrowsingContextRect): Helper to get the window rect. This is used by both get
693 and set window rect commands.
694 (WebDriver::Session::moveToplevelBrowsingContextwindow): Helper to ask automation to move the window.
695 (WebDriver::Session::resizeToplevelBrowsingContextwindow): Helper to ask automation to resize the window.
696 (WebDriver::Session::getWindowRect): Handle prompts and then call getToplevelBrowsingContextRect().
697 (WebDriver::Session::setWindowRect): Handle prompts and then move and resize the window according to the given
698 parameters and finish the operation calling getToplevelBrowsingContextRect().
700 * WebDriverService.cpp:
701 (WebDriver::WebDriverService::getWindowRect): Ask the session to get the window rect.
702 (WebDriver::valueAsNumberInRange): Helper to check a value is a valid number in the given range.
703 (WebDriver::WebDriverService::setWindowRect): Get and check size and position from parameters and then ask the
704 session to set the window rect.
705 * WebDriverService.h:
707 2017-09-19 Carlos Garcia Campos <cgarcia@igalia.com>
709 WebDriver: wrong response in case of errors
710 https://bugs.webkit.org/show_bug.cgi?id=177127
712 Reviewed by Brian Burg.
714 I misunderstood the spec when I implemented this, so we either return a "value" key with the result in case of
715 success or the error object as the body in case of error. We should always add a "value" key to the body and set
716 it with either the result or the error object.
718 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-an-error
720 * WebDriverService.cpp:
721 (WebDriver::WebDriverService::sendResponse const):
723 2017-09-18 Carlos Garcia Campos <cgarcia@igalia.com>
725 WebDriver: wrong key name for capabilities in new session response
726 https://bugs.webkit.org/show_bug.cgi?id=177074
728 Reviewed by Brian Burg.
730 We are using "value", it should be "capabilities".
731 https://w3c.github.io/webdriver/webdriver-spec.html#new-session
733 * WebDriverService.cpp:
734 (WebDriver::WebDriverService::newSession):
736 2017-09-18 Carlos Garcia Campos <cgarcia@igalia.com>
738 WebDriver: HTTP responses should include Cache-Control header with no-cache value
739 https://bugs.webkit.org/show_bug.cgi?id=177073
741 Reviewed by Sergio Villar Senin.
743 6.3 Processing Model.
744 Set the response’s header with name and value with the following values:
746 Content-Type "application/json; charset=utf-8"
747 Cache-Control "no-cache"
749 https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-a-response
751 We were setting the Content-Type, but not the Cache-Control. This is checked by all WPT WebDriver tests.
753 * soup/HTTPServerSoup.cpp:
754 (WebDriver::HTTPServer::listen): Add Cache-Control header.
756 2017-09-18 Michael Catanzaro <mcatanzaro@igalia.com>
758 [CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
759 https://bugs.webkit.org/show_bug.cgi?id=174558
761 Reviewed by Alex Christensen.
765 2017-09-15 JF Bastien <jfbastien@apple.com>
767 WTF: use Forward.h when appropriate instead of Vector.h
768 https://bugs.webkit.org/show_bug.cgi?id=176984
770 Reviewed by Saam Barati.
772 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.
776 2017-09-09 Carlos Garcia Campos <cgarcia@igalia.com>
778 WebDriver: ensure we close all windows handles when closing the session
779 https://bugs.webkit.org/show_bug.cgi?id=176508
781 Reviewed by Brian Burg.
783 The spec says that when closing the session all top level browsing contexts should be closed. We are currently
784 checking if we have an active top level browsing context and then we try to close it before trying with the
785 rest. It can happen that we are in an inconsistent state, for example if the current top level browsing context
786 has been closed by JavaScript or another action and the user didn't switch to another one before closing the
787 session. In such case, closing the session will fail with NoSuchwindow and any other window open will not be
788 closed. It's safer to always ask for all window handles and close them, which is what the spec says too.
791 (WebDriver::firstWindowHandleInResult): Helper class to get the first window handle in the result array.
792 (WebDriver::Session::closeAllToplevelBrowsingContexts): Use firstWindowHandleInResult().
793 (WebDriver::Session::close): Close the current top level browsing context and get all window handles to close
796 2017-08-28 Carlos Garcia Campos <cgarcia@igalia.com>
798 WebDriver: implement screen capture commands
799 https://bugs.webkit.org/show_bug.cgi?id=174615
801 Reviewed by Brian Burg.
803 Implement takeScreenshot and takeElementScreenshot commands.
806 https://w3c.github.io/webdriver/webdriver-spec.html#screen-capture
809 (WebDriver::CommandResult::CommandResult): Handle ScreenshotError protocol error.
810 (WebDriver::CommandResult::httpStatusCode const): Add UnableToCaptureScreen.
811 (WebDriver::CommandResult::errorString const): Ditto.
814 (WebDriver::Session::takeScreenshot):
816 * WebDriverService.cpp:
817 (WebDriver::WebDriverService::takeScreenshot):
818 (WebDriver::WebDriverService::takeElementScreenshot):
819 * WebDriverService.h:
821 2017-08-28 Carlos Garcia Campos <cgarcia@igalia.com>
823 WebDriver: implement cookies commands
824 https://bugs.webkit.org/show_bug.cgi?id=174613
826 Reviewed by Brian Burg.
828 Add cookies commands.
831 https://w3c.github.io/webdriver/webdriver-spec.html#cookies
834 (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
835 (WebDriver::CommandResult::errorString const): Ditto.
838 (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
839 (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
840 (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
841 (WebDriver::Session::getAllCookies):
842 (WebDriver::Session::getNamedCookie):
843 (WebDriver::Session::addCookie):
844 (WebDriver::Session::deleteCookie):
845 (WebDriver::Session::deleteAllCookies):
847 * WebDriverService.cpp:
848 (WebDriver::WebDriverService::getAllCookies):
849 (WebDriver::WebDriverService::getNamedCookie):
850 (WebDriver::deserializeCookie):
851 (WebDriver::WebDriverService::addCookie):
852 (WebDriver::WebDriverService::deleteCookie):
853 (WebDriver::WebDriverService::deleteAllCookies):
854 * WebDriverService.h:
856 2017-07-28 Carlos Garcia Campos <cgarcia@igalia.com>
858 WebDriver: fix return value of close window command
859 https://bugs.webkit.org/show_bug.cgi?id=174861
861 Reviewed by Brian Burg.
863 We are currently returning null, but we should return the list of window handles, and try to close the session
864 if there aren't more window handles.
867 https://w3c.github.io/webdriver/webdriver-spec.html#close-window
869 3. If there are no more open top-level browsing contexts, then try to close the session.
870 4. Return the result of running the remote end steps for the Get Window Handles command.
873 (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
874 context and the next one if there are more.
875 (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
877 (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
878 getWindowHandles() when done.
879 (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
880 (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
881 toplevel browsing context.
884 * WebDriverService.cpp:
885 (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
886 (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
887 (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
888 * WebDriverService.h: Remove unused quit() method.
889 * glib/SessionHostGlib.cpp:
890 (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
891 (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
893 2017-08-14 Carlos Garcia Campos <cgarcia@igalia.com>
895 WebDriver: handle click events on option elements
896 https://bugs.webkit.org/show_bug.cgi?id=174710
897 <rdar://problem/33459305>
899 Reviewed by Brian Burg.
901 Option elements are considered as a special case by the specification. When clicking an option element, we
902 should get its container and use it when scrolling into view and calculating in-view center point instead of the
903 option element itself. Then, we should not emulate a click, but change the selected status of the option element
904 like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
905 option to call selectOptionElement() or performMouseInteraction().
907 This fixes more than 20 selenium tests.
910 (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
911 (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
912 (WebDriver::CommandResult::errorString const): Ditto.
915 (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
916 (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
917 the element is an option or not.
920 2017-08-11 Carlos Alberto Lopez Perez <clopez@igalia.com>
922 Fix build warning in WebDriverService.h
923 https://bugs.webkit.org/show_bug.cgi?id=166682
925 Unreviewed build fix.
927 * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
929 2017-08-08 Michael Catanzaro <mcatanzaro@igalia.com>
931 Unreviewed, fix Ubuntu LTS build
932 https://bugs.webkit.org/show_bug.cgi?id=174490
934 * glib/SessionHostGlib.cpp:
936 2017-08-08 Michael Catanzaro <mcatanzaro@igalia.com>
938 [CMake] Properly test if compiler supports compiler flags
939 https://bugs.webkit.org/show_bug.cgi?id=174490
941 Reviewed by Konstantin Tokarev.
943 * WebDriverService.cpp:
944 (WebDriver::WebDriverService::run):
945 * glib/SessionHostGlib.cpp:
947 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
949 Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
950 https://bugs.webkit.org/show_bug.cgi?id=175261
952 Reviewed by Brian Burg.
955 (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
957 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
959 WebDriver: implement unhandled prompt behavior
960 https://bugs.webkit.org/show_bug.cgi?id=175184
962 Reviewed by Brian Burg.
964 Handle user prompts before running some of the commands according to the specification.
966 * Capabilities.h: Add UnhandledPromptBehavior capability.
968 (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
969 (WebDriver::CommandResult::errorString const): Ditto.
971 (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
972 as part of the result error message.
973 (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
975 (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
976 on the unhandled prompt behavior.
977 (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
978 including the alert text as additional error data.
979 (WebDriver::Session::go): Handle user prompts before running the command.
980 (WebDriver::Session::getCurrentURL): Ditto.
981 (WebDriver::Session::back): Ditto.
982 (WebDriver::Session::forward): Ditto.
983 (WebDriver::Session::refresh): Ditto.
984 (WebDriver::Session::getTitle): Ditto.
985 (WebDriver::Session::closeWindow): Ditto.
986 (WebDriver::Session::switchToFrame): Ditto.
987 (WebDriver::Session::switchToParentFrame): Ditto.
988 (WebDriver::Session::isElementSelected): Ditto.
989 (WebDriver::Session::getElementText): Ditto.
990 (WebDriver::Session::getElementTagName): Ditto.
991 (WebDriver::Session::getElementRect): Ditto.
992 (WebDriver::Session::isElementEnabled): Ditto.
993 (WebDriver::Session::isElementDisplayed): Ditto.
994 (WebDriver::Session::getElementAttribute): Ditto.
995 (WebDriver::Session::elementSendKeys): Ditto.
996 (WebDriver::Session::elementSubmit): Ditto.
997 (WebDriver::Session::executeScript): Ditto.
999 * WebDriverService.cpp:
1000 (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
1001 (WebDriver::deserializeUnhandledPromptBehavior):
1002 (WebDriver::WebDriverService::parseCapabilities const):
1003 (WebDriver::WebDriverService::validatedCapabilities const):
1004 (WebDriver::WebDriverService::newSession):
1006 2017-08-07 Carlos Garcia Campos <cgarcia@igalia.com>
1008 WebDriver: implement user prompt commands
1009 https://bugs.webkit.org/show_bug.cgi?id=174614
1011 Reviewed by Brian Burg.
1013 * CommandResult.cpp:
1014 (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
1015 (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
1016 (WebDriver::CommandResult::errorString const): Ditto.
1019 (WebDriver::Session::dismissAlert):
1020 (WebDriver::Session::acceptAlert):
1021 (WebDriver::Session::getAlertText):
1022 (WebDriver::Session::sendAlertText):
1024 * WebDriverService.cpp:
1025 (WebDriver::WebDriverService::dismissAlert):
1026 (WebDriver::WebDriverService::acceptAlert):
1027 (WebDriver::WebDriverService::getAlertText):
1028 (WebDriver::WebDriverService::sendAlertText):
1029 * WebDriverService.h:
1031 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1033 [GTK][WPE] Add API to provide browser information required by automation
1034 https://bugs.webkit.org/show_bug.cgi?id=175130
1036 Reviewed by Brian Burg.
1039 (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
1040 with error in that case.
1042 * glib/SessionHostGlib.cpp:
1043 (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
1045 (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
1046 capabilities and calling matchCapabilities() to match them.
1047 (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
1050 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1052 WebDriver: Implement page load strategy
1053 https://bugs.webkit.org/show_bug.cgi?id=175183
1055 Reviewed by Brian Burg.
1057 Validate and parse page load strategy when processing capabilities.
1061 (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
1062 passed to Automation.
1063 (WebDriver::Session::go): Pass page load strategy if present.
1064 (WebDriver::Session::back): Ditto.
1065 (WebDriver::Session::forward): Ditto.
1066 (WebDriver::Session::refresh): Ditto.
1067 (WebDriver::Session::waitForNavigationToComplete): Ditto.
1069 * WebDriverService.cpp:
1070 (WebDriver::deserializePageLoadStrategy):
1071 (WebDriver::WebDriverService::parseCapabilities const):
1072 (WebDriver::WebDriverService::validatedCapabilities const):
1073 (WebDriver::WebDriverService::newSession):
1075 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1077 Unreviewed. Try to fix build with clang after r220315.
1079 * WebDriverService.cpp:
1080 (WebDriver::WebDriverService::validatedCapabilities const):
1081 (WebDriver::WebDriverService::mergeCapabilities const):
1083 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1085 WebDriver: properly handle capabilities and process firstMatch too
1086 https://bugs.webkit.org/show_bug.cgi?id=174618
1088 Reviewed by Brian Burg.
1090 Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
1093 7.2 Processing Capabilities.
1094 https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1096 * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
1098 * WebDriverService.cpp:
1099 (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
1100 (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
1101 so we just need to get them without checking the value type.
1102 (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
1103 values are the expected one.
1104 (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
1105 single object ensuring that the same capability is not in both.
1106 (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
1107 expected capabilities.
1108 (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
1109 (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
1110 capabilities and add all capabilities to the command result.
1111 (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
1112 * WebDriverService.h:
1113 * glib/SessionHostGlib.cpp:
1114 (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
1115 (WebDriver::SessionHost::startAutomationSession): Add FIXME.
1116 * gtk/WebDriverServiceGtk.cpp:
1117 (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
1118 (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
1119 (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
1120 (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
1121 (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
1124 2017-08-05 Carlos Garcia Campos <cgarcia@igalia.com>
1126 WebDriver: use in-view center point for clicks instead of bounding box center point
1127 https://bugs.webkit.org/show_bug.cgi?id=174863
1129 Reviewed by Simon Fraser.
1131 The center of the element bounding box is not always part of the element, like in multiline links, for example.
1133 11.1 Element Interactability.
1134 https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
1136 * CommandResult.cpp:
1137 (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
1138 (WebDriver::CommandResult::errorString): Ditto.
1139 * CommandResult.h: Ditto.
1141 (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
1142 (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
1143 (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
1146 2017-08-01 Michael Catanzaro <mcatanzaro@igalia.com>
1148 [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
1149 https://bugs.webkit.org/show_bug.cgi?id=174855
1151 Reviewed by Carlos Garcia Campos.
1153 Don't create derived sources directory here anymore.
1155 * PlatformGTK.cmake:
1157 2017-07-26 Carlos Garcia Campos <cgarcia@igalia.com>
1159 Unreviewed. Fix GTK distcheck.
1161 Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
1163 * PlatformGTK.cmake:
1165 2017-07-24 Carlos Garcia Campos <cgarcia@igalia.com>
1167 WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
1168 https://bugs.webkit.org/show_bug.cgi?id=174783
1170 Reviewed by Brian Burg.
1172 We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
1173 current browsing context, and the spec also refers to it as the current browsing context, so better use
1174 m_currentBrowsingContext.
1177 (WebDriver::Session::switchToTopLevelBrowsingContext):
1178 (WebDriver::Session::switchToBrowsingContext):
1179 (WebDriver::Session::switchToFrame):
1180 (WebDriver::Session::switchToParentFrame):
1181 (WebDriver::Session::computeElementLayout):
1182 (WebDriver::Session::findElements):
1183 (WebDriver::Session::isElementSelected):
1184 (WebDriver::Session::getElementText):
1185 (WebDriver::Session::getElementTagName):
1186 (WebDriver::Session::isElementEnabled):
1187 (WebDriver::Session::isElementDisplayed):
1188 (WebDriver::Session::getElementAttribute):
1189 (WebDriver::Session::waitForNavigationToComplete):
1190 (WebDriver::Session::elementClear):
1191 (WebDriver::Session::elementSendKeys):
1192 (WebDriver::Session::elementSubmit):
1193 (WebDriver::Session::executeScript):
1196 2017-07-20 Carlos Garcia Campos <cgarcia@igalia.com>
1198 WebDriver: implement page load timeout
1199 https://bugs.webkit.org/show_bug.cgi?id=174672
1201 Reviewed by Brian Burg.
1203 Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
1204 commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
1205 instead of the one in the spec.
1208 https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
1210 * CommandResult.cpp:
1211 (WebDriver::CommandResult::CommandResult):
1212 (WebDriver::CommandResult::httpStatusCode):
1213 (WebDriver::CommandResult::errorString):
1216 (WebDriver::Session::go):
1217 (WebDriver::Session::back):
1218 (WebDriver::Session::forward):
1219 (WebDriver::Session::refresh):
1220 (WebDriver::Session::waitForNavigationToComplete):
1221 * WebDriverService.cpp:
1222 (WebDriver::WebDriverService::setTimeouts):
1224 2017-07-21 Carlos Garcia Campos <cgarcia@igalia.com>
1226 WebDriver: wait until navigation is complete before running new commands and after a click
1227 https://bugs.webkit.org/show_bug.cgi?id=174670
1229 Reviewed by Brian Burg.
1231 We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
1232 the spec says we should always wait before executing a new command and also after a click. This is causing test
1233 testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
1234 + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
1235 the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
1238 6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
1239 jump to step 1 in this overall algorithm, otherwise continue.
1240 https://www.w3.org/TR/webdriver/#processing-model
1242 14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
1243 value if it is an error. 2. Try to wait for navigation to complete.
1244 https://www.w3.org/TR/webdriver/#element-click
1247 (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
1248 wait for any pending navigation of current browsing context to complete.
1249 (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
1251 * WebDriverService.cpp:
1252 (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
1253 (WebDriver::WebDriverService::getCurrentURL): Ditto.
1254 (WebDriver::WebDriverService::back): Ditto.
1255 (WebDriver::WebDriverService::forward): Ditto.
1256 (WebDriver::WebDriverService::refresh): Ditto.
1257 (WebDriver::WebDriverService::getTitle): Ditto.
1258 (WebDriver::WebDriverService::switchToFrame): Ditto.
1259 (WebDriver::WebDriverService::switchToParentFrame): Ditto.
1260 (WebDriver::WebDriverService::findElement): Ditto.
1261 (WebDriver::WebDriverService::findElements): Ditto.
1262 (WebDriver::WebDriverService::executeScript): Ditto.
1263 (WebDriver::WebDriverService::executeAsyncScript): Ditto.
1265 2017-07-21 Carlos Garcia Campos <cgarcia@igalia.com>
1267 WebDriver: correctly handle main frame handles
1268 https://bugs.webkit.org/show_bug.cgi?id=174668
1270 Reviewed by Brian Burg.
1272 When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
1273 that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
1274 are currently considering empty strings as valid browsing context. It's not a big deal because Automation
1275 converts back the empty string received to the main frame, though. We should also ensure we close the current
1276 browsing context when switching to a new top level browsing context. This patch adds to helper private methods
1277 to switch browsing contexts that deal with the special cases.
1280 (WebDriver::Session::close):
1281 (WebDriver::Session::switchToTopLevelBrowsingContext):
1282 (WebDriver::Session::switchToBrowsingContext):
1283 (WebDriver::Session::createTopLevelBrowsingContext):
1284 (WebDriver::Session::go):
1285 (WebDriver::Session::back):
1286 (WebDriver::Session::forward):
1287 (WebDriver::Session::refresh):
1288 (WebDriver::Session::switchToWindow):
1289 (WebDriver::Session::switchToFrame):
1290 (WebDriver::Session::switchToParentFrame):
1293 2017-07-18 Carlos Garcia Campos <cgarcia@igalia.com>
1295 WebDriver: handle invalid selector errors
1296 https://bugs.webkit.org/show_bug.cgi?id=174619
1298 Reviewed by Brian Burg.
1300 Add InvalidSelector error and handle it in case of protocol server error.
1302 * CommandResult.cpp:
1303 (WebDriver::CommandResult::CommandResult):
1304 (WebDriver::CommandResult::httpStatusCode):
1305 (WebDriver::CommandResult::errorString):
1308 2017-07-18 Carlos Alberto Lopez Perez <clopez@igalia.com>
1310 [GTK] Fix build with Clang after r219605.
1311 https://bugs.webkit.org/show_bug.cgi?id=166682
1313 Unreviewed build fix.
1315 Clang-3.8 complains with the following error:
1316 non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
1318 * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
1320 2017-07-13 Carlos Garcia Campos <cgarcia@igalia.com>
1322 Add initial implementation of WebDriver process to run the HTTP server
1323 https://bugs.webkit.org/show_bug.cgi?id=166682
1325 Reviewed by Brian Burg.
1327 Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
1328 cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
1329 the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
1330 libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
1331 inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
1332 using the official selenium python tests as reference.
1334 * CMakeLists.txt: Added.
1335 * Capabilities.h: Added.
1336 * CommandResult.cpp: Added.
1337 * CommandResult.h: Added.
1338 * HTTPServer.cpp: Added.
1339 * HTTPServer.h: Added.
1340 * PlatformGTK.cmake: Added.
1341 * Session.cpp: Added.
1343 * SessionHost.cpp: Added.
1344 * SessionHost.h: Added.
1345 * WebDriverMain.cpp: Added.
1346 * WebDriverService.cpp: Added.
1347 * WebDriverService.h: Added.
1349 * glib/SessionHostGlib.cpp: Added.
1350 * gtk/WebDriverServiceGtk.cpp: Added.
1351 * soup/HTTPServerSoup.cpp: Added.