1caf574b66252c711e44fad8bdf532b6964a4375
[WebKit-https.git] / Source / WebDriver / ChangeLog
1 2018-07-26  Ross Kirsling  <ross.kirsling@sony.com>
2
3         String(View) should have a splitAllowingEmptyEntries function instead of a flag parameter
4         https://bugs.webkit.org/show_bug.cgi?id=187963
5
6         Reviewed by Alex Christensen.
7
8         * WebDriverService.cpp:
9         (WebDriver::WebDriverService::findCommand):
10         * glib/WebDriverServiceGLib.cpp:
11         (WebDriver::parseVersion):
12         Update split/splitAllowingEmptyEntries usage.
13
14 2018-07-05  Carlos Garcia Campos  <cgarcia@igalia.com>
15
16         [GTK][WPE] Add --host option to WebDriver process
17         https://bugs.webkit.org/show_bug.cgi?id=187288
18
19         Reviewed by Žan Doberšek.
20
21         We currently allow to pass a port number and the server always listens for connections on localhost. We should
22         allow to optionally pass a host IP address to be able to use WebDriver remotely.
23
24         * HTTPServer.h:
25         * WebDriverService.cpp:
26         (WebDriver::printUsageStatement): Update usage to include --host option.
27         (WebDriver::WebDriverService::run): Parse --host option and pass it to HTTPServer::listen().
28         * soup/HTTPServerSoup.cpp:
29         (WebDriver::soupServerListen): Helper to call soup_server_listen_local(), soup_server_listen_all() or
30         soup_server_listen() depending on the given host.
31         (WebDriver::HTTPServer::listen): Use soupServerListen() helper.
32
33 2018-06-24  Carlos Garcia Campos  <cgarcia@igalia.com>
34
35         Unreviewed. Fix WebDriver tests after r233077.
36
37         WebDriver process is crashing because GVariant doesn't allow to pass a nullptr array when using @ modifier.
38
39         * SessionHost.h:
40         * glib/SessionHostGlib.cpp:
41         (WebDriver::SessionHost::buildSessionCapabilities const): Receive a GVariantBuilder and return true if there are
42         session capabilities.
43         (WebDriver::SessionHost::startAutomationSession): Remove the @ modifier and use a GVariantBuilder instead, or
44         nullptr if there aren't session capabilities.
45
46 2018-06-21  Brian Burg  <bburg@apple.com>
47
48         Web Automation: key actions should support multiple pressed virtual keys
49         https://bugs.webkit.org/show_bug.cgi?id=186899
50         <rdar://problem/38222248>
51
52         Reviewed by Timothy Hatcher.
53
54         Adopt new protocol command argument types.
55
56         * Session.cpp:
57         (WebDriver::Session::performActions):
58
59 2018-06-23  Yusuke Suzuki  <utatane.tea@gmail.com>
60
61         [WTF] Add user-defined literal for ASCIILiteral
62         https://bugs.webkit.org/show_bug.cgi?id=186839
63
64         Reviewed by Darin Adler.
65
66         * CommandResult.cpp:
67         (WebDriver::CommandResult::errorString const):
68         * Session.cpp:
69         (WebDriver::Session::webElementIdentifier):
70         (WebDriver::Session::getTimeouts):
71         (WebDriver::Session::createTopLevelBrowsingContext):
72         (WebDriver::Session::handleUserPrompts):
73         (WebDriver::Session::reportUnexpectedAlertOpen):
74         (WebDriver::Session::go):
75         (WebDriver::Session::getCurrentURL):
76         (WebDriver::Session::back):
77         (WebDriver::Session::forward):
78         (WebDriver::Session::refresh):
79         (WebDriver::Session::getTitle):
80         (WebDriver::Session::getWindowHandle):
81         (WebDriver::Session::closeTopLevelBrowsingContext):
82         (WebDriver::Session::switchToWindow):
83         (WebDriver::Session::getWindowHandles):
84         (WebDriver::Session::switchToFrame):
85         (WebDriver::Session::switchToParentFrame):
86         (WebDriver::Session::getToplevelBrowsingContextRect):
87         (WebDriver::Session::setWindowRect):
88         (WebDriver::Session::maximizeWindow):
89         (WebDriver::Session::minimizeWindow):
90         (WebDriver::Session::fullscreenWindow):
91         (WebDriver::Session::computeElementLayout):
92         (WebDriver::Session::findElements):
93         (WebDriver::Session::getActiveElement):
94         (WebDriver::Session::isElementSelected):
95         (WebDriver::Session::getElementText):
96         (WebDriver::Session::getElementTagName):
97         (WebDriver::Session::getElementRect):
98         (WebDriver::Session::isElementEnabled):
99         (WebDriver::Session::isElementDisplayed):
100         (WebDriver::Session::getElementAttribute):
101         (WebDriver::Session::getElementProperty):
102         (WebDriver::Session::getElementCSSValue):
103         (WebDriver::Session::waitForNavigationToComplete):
104         (WebDriver::Session::selectOptionElement):
105         (WebDriver::Session::elementClear):
106         (WebDriver::Session::virtualKeyForKeySequence):
107         (WebDriver::Session::elementSendKeys):
108         (WebDriver::Session::executeScript):
109         (WebDriver::mouseButtonForAutomation):
110         (WebDriver::Session::performMouseInteraction):
111         (WebDriver::Session::performKeyboardInteractions):
112         (WebDriver::parseAutomationCookie):
113         (WebDriver::builtAutomationCookie):
114         (WebDriver::serializeCookie):
115         (WebDriver::Session::getAllCookies):
116         (WebDriver::Session::getNamedCookie):
117         (WebDriver::Session::addCookie):
118         (WebDriver::Session::deleteCookie):
119         (WebDriver::Session::deleteAllCookies):
120         (WebDriver::Session::performActions):
121         (WebDriver::Session::releaseActions):
122         (WebDriver::Session::dismissAlert):
123         (WebDriver::Session::acceptAlert):
124         (WebDriver::Session::getAlertText):
125         (WebDriver::Session::sendAlertText):
126         (WebDriver::Session::takeScreenshot):
127         * SessionHost.cpp:
128         (WebDriver::SessionHost::dispatchMessage):
129         * WebDriverService.cpp:
130         (WebDriver::WebDriverService::sendResponse const):
131         (WebDriver::WebDriverService::parseCapabilities const):
132         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
133         (WebDriver::WebDriverService::matchCapabilities const):
134         (WebDriver::WebDriverService::processCapabilities const):
135         (WebDriver::WebDriverService::createSession):
136         (WebDriver::WebDriverService::deleteSession):
137         (WebDriver::WebDriverService::status):
138         (WebDriver::WebDriverService::go):
139         (WebDriver::WebDriverService::setWindowRect):
140         (WebDriver::WebDriverService::switchToWindow):
141         (WebDriver::WebDriverService::switchToFrame):
142         (WebDriver::findElementOrCompleteWithError):
143         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
144         (WebDriver::WebDriverService::getElementAttribute):
145         (WebDriver::WebDriverService::getElementProperty):
146         (WebDriver::WebDriverService::getElementCSSValue):
147         (WebDriver::WebDriverService::elementSendKeys):
148         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
149         (WebDriver::WebDriverService::getNamedCookie):
150         (WebDriver::deserializeCookie):
151         (WebDriver::WebDriverService::addCookie):
152         (WebDriver::WebDriverService::deleteCookie):
153         (WebDriver::processPauseAction):
154         (WebDriver::processNullAction):
155         (WebDriver::processKeyAction):
156         (WebDriver::processPointerAction):
157         (WebDriver::processPointerParameters):
158         (WebDriver::processInputActionSequence):
159         (WebDriver::WebDriverService::performActions):
160         (WebDriver::WebDriverService::sendAlertText):
161         (WebDriver::WebDriverService::takeElementScreenshot):
162         * glib/SessionHostGlib.cpp:
163         (WebDriver::SessionHost::sendMessageToBackend):
164         * gtk/WebDriverServiceGtk.cpp:
165         (WebDriver::WebDriverService::platformValidateCapability const):
166         (WebDriver::WebDriverService::platformParseCapabilities const):
167         * wpe/WebDriverServiceWPE.cpp:
168         (WebDriver::WebDriverService::platformValidateCapability const):
169         (WebDriver::WebDriverService::platformParseCapabilities const):
170
171 2018-06-22  Carlos Garcia Campos  <cgarcia@igalia.com>
172
173         [GTK] WebDriver: use a dictionary for session capabilities in StartAutomationSession message
174         https://bugs.webkit.org/show_bug.cgi?id=186915
175
176         Reviewed by Žan Doberšek.
177
178         Instead of growing the message signature every time we add a new capability, use a dictionary a{sv} and simply add
179         new entries when new capabilities are added. This way we won't need to change the message signature anymore.
180
181         * SessionHost.h:
182         * glib/SessionHostGlib.cpp:
183         (WebDriver::SessionHost::buildSessionCapabilities const): Helper to build the session capabilities dictionary.
184         (WebDriver::SessionHost::startAutomationSession):
185
186 2018-06-21  Zan Dobersek  <zdobersek@igalia.com>
187
188         [GTK] WebDriver: allow applying host-specific TLS certificates for automated sessions
189         https://bugs.webkit.org/show_bug.cgi?id=186884
190
191         Reviewed by Carlos Garcia Campos.
192
193         Start handling the 'certificates' capability for the GTK+ port. This is
194         a list of host-certificate pairs that should be marked as allowed for a
195         given automation session. This object should be positioned inside the
196         'webkitgtk:browserOptions' dictionary in the capabilities JSON.
197
198         * Capabilities.h:
199         * glib/SessionHostGlib.cpp:
200         (WebDriver::SessionHost::startAutomationSession): Include any
201         host-certificate pairs in the StartAutomationSession DBus message.
202         * gtk/WebDriverServiceGtk.cpp:
203         (WebDriver::WebDriverService::platformValidateCapability const):
204         Properly validate the 'certificates' value, if present.
205         (WebDriver::WebDriverService::platformParseCapabilities const):
206         Properly parse the 'certificates' value, if present, and extract the
207         host-certificate pairs.
208
209 2018-06-14  Carlos Garcia Campos  <cgarcia@igalia.com>
210
211         [GTK][WPE] WebDriver: handle acceptInsecureCertificates capability
212         https://bugs.webkit.org/show_bug.cgi?id=186560
213
214         Reviewed by Brian Burg.
215
216         Send session capabilities as part of the StartAutomationSession message. For now only acceptInsecureCerts
217         capability is sent.
218
219         * glib/SessionHostGlib.cpp:
220         (WebDriver::SessionHost::startAutomationSession):
221         * gtk/WebDriverServiceGtk.cpp:
222         (WebDriver::WebDriverService::platformCapabilities): Remove default value of acceptInsecureCerts, since that's
223         now handled by the browser.
224         * wpe/WebDriverServiceWPE.cpp:
225         (WebDriver::WebDriverService::platformCapabilities): Ditto.
226
227 2018-06-10  Carlos Garcia Campos  <cgarcia@igalia.com>
228
229         [WPE] Add a MiniBrowser and use it to run WebDriver tests
230         https://bugs.webkit.org/show_bug.cgi?id=186345
231
232         Reviewed by Žan Doberšek.
233
234         Use MiniBrowser instead of dyz as the default WebDriver browser for WPE.
235
236         * wpe/WebDriverServiceWPE.cpp:
237         (WebDriver::WebDriverService::platformParseCapabilities const):
238
239 2018-06-04  Carlos Garcia Campos  <cgarcia@igalia.com>
240
241         [WPE] WebDriver: stop making mandatory to provide a browser path if wpe:browserOptions is present in capabilities
242         https://bugs.webkit.org/show_bug.cgi?id=186264
243
244         Reviewed by Žan Doberšek.
245
246         Everything should be optional. Do not consider invalid to not provide a browser binary when wpe:browserOptions
247         is present.
248
249         * wpe/WebDriverServiceWPE.cpp:
250         (WebDriver::WebDriverService::platformParseCapabilities const):
251
252 2018-05-24  Carlos Garcia Campos  <cgarcia@igalia.com>
253
254         WebDriver: implement maximize, minimize and fullscreen window commands
255         https://bugs.webkit.org/show_bug.cgi?id=180398
256
257         Reviewed by Brian Burg.
258
259         * CMakeLists.txt: Add EnterFullscreen.js to the build.
260         * Session.cpp:
261         (WebDriver::Session::maximizeWindow):
262         (WebDriver::Session::minimizeWindow):
263         (WebDriver::Session::fullscreenWindow):
264         * Session.h:
265         * WebDriverService.cpp:
266         (WebDriver::WebDriverService::maximizeWindow):
267         (WebDriver::WebDriverService::minimizeWindow):
268         (WebDriver::WebDriverService::fullscreenWindow):
269         * WebDriverService.h:
270
271 2018-05-23  Carlos Garcia Campos  <cgarcia@igalia.com>
272
273         [GTK] WebDriver: implement AutomationSessionClient::didDisconnectFromRemote
274         https://bugs.webkit.org/show_bug.cgi?id=185866
275
276         Reviewed by Brian Burg.
277
278         Close the dbus connection when receiving an empty target list.
279
280         * glib/SessionHostGlib.cpp:
281         (WebDriver::SessionHost::setTargetList):
282
283 2018-05-21  Olivier Blin  <olivier.blin@softathome.com>
284
285         [WPE][WebDriver] add ICU include dirs
286         https://bugs.webkit.org/show_bug.cgi?id=185824
287
288         Reviewed by Konstantin Tokarev.
289
290         WebDriver does not build in the WPE port when ICU headers are in a non-default directory.
291
292         * PlatformWPE.cmake: Add ICU include dirs
293
294 2018-05-09  Carlos Garcia Campos  <cgarcia@igalia.com>
295
296         WebDriver: implement advance user interactions
297         https://bugs.webkit.org/show_bug.cgi?id=174616
298
299         Reviewed by Brian Burg.
300
301         Add initial implementation of action commands.
302
303         * Actions.h: Added.
304         (WebDriver::Action::Action):
305         * CommandResult.cpp:
306         (WebDriver::CommandResult::CommandResult): Handle MoveTargetOutOfBounds error.
307         (WebDriver::CommandResult::httpStatusCode const): Ditto.
308         (WebDriver::CommandResult::errorString const): Ditto.
309         * CommandResult.h:
310         * Session.cpp:
311         (WebDriver::Session::webElementIdentifier): Helper to return the web element id.
312         (WebDriver::Session::createElement): Use webElementIdentifier().
313         (WebDriver::Session::extractElementID): Ditto.
314         (WebDriver::Session::virtualKeyForKeySequence): Add more kay codes includes in the spec.
315         (WebDriver::mouseButtonForAutomation): Helper to get the mouse button string to pass to automation.
316         (WebDriver::Session::performMouseInteraction): Use mouseButtonForAutomation().
317         (WebDriver::Session::getOrCreateInputSource): Ensure an input source for given id and add it to the active input
318         sources.
319         (WebDriver::Session::inputSourceState): Return the current input source state for the given id.
320         (WebDriver::Session::computeInViewCenterPointOfElements): Get the in view center point for the list of elements given.
321         (WebDriver::automationSourceType): Helper to get the input source type to pass to automation.
322         (WebDriver::Session::performActions): Process the list of action by tick and generate a list of states to pass
323         to automation.
324         (WebDriver::Session::releaseActions): Reset input sources and state table and send a message to automation.
325         * Session.h:
326         * WebDriverService.cpp:
327         (WebDriver::processPauseAction):
328         (WebDriver::processNullAction):
329         (WebDriver::processKeyAction):
330         (WebDriver::actionMouseButton):
331         (WebDriver::processPointerAction):
332         (WebDriver::processPointerParameters):
333         (WebDriver::processInputActionSequence):
334         (WebDriver::WebDriverService::performActions):
335         (WebDriver::WebDriverService::releaseActions):
336         * WebDriverService.h:
337
338 2018-03-05  Carlos Garcia Campos  <cgarcia@igalia.com>
339
340         WebDriver: Also ignore NoSuchwindow errors when waiting for navigation to complete
341         https://bugs.webkit.org/show_bug.cgi?id=183280
342
343         Reviewed by Brian Burg.
344
345         We currently ignore NoSuchFrame, but navigation or previous command might have closed the window too.
346
347         Fixes: imported/selenium/py/test/selenium/webdriver/common/window_switching_tests.py::testClickingOnAButtonThatClosesAnOpenWindowDoesNotCauseTheBrowserToHang
348                imported/selenium/py/test/selenium/webdriver/common/window_switching_tests.py::testCanCallGetWindowHandlesAfterClosingAWindow
349
350         * Session.cpp:
351         (WebDriver::Session::waitForNavigationToComplete): Ignore NoSuchWindow errors.
352
353 2018-02-14  Brian Burg  <bburg@apple.com>
354
355         Web Automation: combine session commands to resize and move top-level browsing contexts
356         https://bugs.webkit.org/show_bug.cgi?id=182749
357         <rdar://problem/37515170>
358
359         Reviewed by Andy Estes.
360
361         The new command can take either size or origin. Just have one session command for use by endpoints.
362
363         * Session.cpp:
364         (WebDriver::Session::setWindowRect):
365         (WebDriver::Session::moveToplevelBrowsingContextWindow): Deleted.
366         (WebDriver::Session::resizeToplevelBrowsingContextWindow): Deleted.
367         * Session.h:
368
369 2018-01-30  Don Olmstead  <don.olmstead@sony.com>
370
371         [CMake] Make WTF headers copies
372         https://bugs.webkit.org/show_bug.cgi?id=182274
373
374         Reviewed by Alex Christensen.
375
376         * CMakeLists.txt:
377
378 2018-01-29  Carlos Garcia Campos  <cgarcia@igalia.com>
379
380         WebDriver: evaluateJavaScriptFunction should return null when return value is undefined
381         https://bugs.webkit.org/show_bug.cgi?id=180350
382
383         Reviewed by Carlos Alberto Lopez Perez.
384
385         Stop handling the empty string as a special case of evaluateJavaScriptFunction result.
386
387         * Session.cpp:
388         (WebDriver::Session::executeScript):
389
390 2018-01-26  Carlos Garcia Campos  <cgarcia@igalia.com>
391
392         WebDriver: service hangs after a browser crash
393         https://bugs.webkit.org/show_bug.cgi?id=182170
394
395         Reviewed by Carlos Alberto Lopez Perez.
396
397         This is currently happening in the GTK+ debug bot. There's a test that makes the browser crash due to an assert,
398         hanging the whole process and preventing the rest of the tests from running. When the browser crashes, we
399         correctly handle the pending requests, by completing them with an error. However, if the client tries to send
400         another command we fail to send the message to the browser and the reply is never sent to the client. In the
401         case of the tests, delete session command is sent, but never gets a reply.
402
403         * Session.cpp:
404         (WebDriver::Session::isConnected const): Return whether the session is connected to the browser.
405         * Session.h:
406         * SessionHost.cpp:
407         (WebDriver::SessionHost::sendCommandToBackend): Pass the message ID to SessionHost::sendMessageToBackend().
408         * SessionHost.h:
409         * WebDriverService.cpp:
410         (WebDriver::WebDriverService::deleteSession): Ignore unknown errors if the session is no longer connected.
411         * glib/SessionHostGlib.cpp:
412         (WebDriver::SessionHost::sendMessageToBackend): Handle errors when sending the command by completing the request
413         with an error.
414
415 2018-01-26  Carlos Garcia Campos  <cgarcia@igalia.com>
416
417         WebDriver: timeouts value and cookie expiry should be limited to max safe integer
418         https://bugs.webkit.org/show_bug.cgi?id=182167
419
420         Reviewed by Žan Doberšek.
421
422         This changed recently in the spec, but our implementation was wrong in any case since we were limiting to
423         INT_MAX. Use valueAsNumberInRange() to ensure we get a valid double value in the given range, and then convert
424         to unsigned if it's a valid integer.
425
426         Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[timeouts-value10]
427                imported/w3c/webdriver/tests/sessions/new_session/create_alwaysMatch.py::test_valid[timeouts-value10]
428
429         * Session.h:
430         * WebDriverService.cpp:
431         (WebDriver::valueAsNumberInRange):
432         (WebDriver::unsignedValue):
433         (WebDriver::deserializeTimeouts):
434         (WebDriver::deserializeCookie):
435
436 2018-01-25  Carlos Garcia Campos  <cgarcia@igalia.com>
437
438         WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_browserName fails
439         https://bugs.webkit.org/show_bug.cgi?id=181985
440
441         Reviewed by Carlos Alberto Lopez Perez.
442
443         The problem is that we are considering a failure when the browser name doesn't match the capabilities, instead
444         of trying with the next merged capabilities. This is happening because when processing capabilities, we only
445         match the ones that we know without having to launch the browser. Browser name and version are provided by the
446         browser during the session initialization. This patch reworks the session creation to make it possible to try
447         with the next merged capabilities when matching fails after the browser is launched.
448
449         * Session.cpp:
450         (WebDriver::Session::Session): Initialize timeouts from capabilities, because now we have the final capabilities here.
451         (WebDriver::Session::id const): Return the session ID from the SessionHost, since it's now created there.
452         (WebDriver::Session::createTopLevelBrowsingContext): Do not start the session, it has already been started a
453         this point.
454         (WebDriver::Session::createElement): Use id() instead of m_id.
455         * Session.h:
456         * SessionHost.h:
457         (WebDriver::SessionHost::sessionID const): Return the session ID.
458         * WebDriverService.cpp:
459         (WebDriver::WebDriverService::matchCapabilities const): Remove the error handling, and return a boolean instead,
460         since not mathing is not an error.
461         (WebDriver::WebDriverService::processCapabilities const): Return a list of matched capabilities, instead of the
462         JSON object corresponding to the first match.
463         (WebDriver::WebDriverService::newSession): Use helper connectToBrowser().
464         (WebDriver::WebDriverService::connectToBrowser): Create a session host for the next merged capabilities and
465         connect to the browser.
466         (WebDriver::WebDriverService::createSession): Start a new automation session. If capabilities didn't match,
467         start the process again calling connectToBrowser(), otherwise create the new session and top level.
468         * WebDriverService.h:
469         * glib/SessionHostGlib.cpp:
470         (WebDriver::matchBrowserOptions): Helper to check browser options.
471         (WebDriver::SessionHost::matchCapabilities): Use matchBrowserOptions() and return true or false instead of an
472         optional error message.
473         (WebDriver::SessionHost::startAutomationSession): Create the session ID here and notify the caller in case
474         capabilities didn't match.
475         (WebDriver::SessionHost::setTargetList): Notify that capabilities did match.
476         * gtk/WebDriverServiceGtk.cpp:
477         (WebDriver::WebDriverService::platformMatchCapability const): Make it return bool.
478         * wpe/WebDriverServiceWPE.cpp:
479         (WebDriver::WebDriverService::platformMatchCapability const): Ditto.
480
481 2018-01-25  Carlos Garcia Campos  <cgarcia@igalia.com>
482
483         WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_platformName fails
484         https://bugs.webkit.org/show_bug.cgi?id=181984
485
486         Reviewed by Carlos Alberto Lopez Perez.
487
488         Platform name is expected to be lower case, so do not compre ignoring case.
489
490         Fixes: imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_platformName
491
492         * WebDriverService.cpp:
493         (WebDriver::WebDriverService::matchCapabilities const):
494
495 2018-01-23  Carlos Garcia Campos  <cgarcia@igalia.com>
496
497         WebDriver: several tests in imported/w3c/webdriver/tests/sessions/new_session/merge.py are failing
498         https://bugs.webkit.org/show_bug.cgi?id=180407
499
500         Reviewed by Carlos Alberto Lopez Perez.
501
502         This is actually a bug in the spec, see https://github.com/w3c/webdriver/issues/1203. It seems the idea in any
503         case is that we should check all the firstMatch capabilities before matching them, and return if there's any
504         error.
505
506         * WebDriverService.cpp:
507         (WebDriver::WebDriverService::mergeCapabilities const):
508         (WebDriver::WebDriverService::processCapabilities const):
509
510 2018-01-23  Carlos Garcia Campos  <cgarcia@igalia.com>
511
512         WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/response.py::test_timeouts fails
513         https://bugs.webkit.org/show_bug.cgi?id=180412
514
515         Reviewed by Carlos Alberto Lopez Perez.
516
517         Include all missing capabilities in the new session response message.
518
519         Fixes: imported/w3c/webdriver/tests/sessions/new_session/response.py::test_resp_capabilites
520                imported/w3c/webdriver/tests/sessions/new_session/response.py::test_resp_data
521                imported/w3c/webdriver/tests/sessions/new_session/response.py::test_timeouts
522
523         * Session.h:
524         (WebDriver::Session::scriptTimeout const):
525         (WebDriver::Session::pageLoadTimeout const):
526         (WebDriver::Session::implicitWaitTimeout const):
527         * WebDriverService.cpp:
528         (WebDriver::WebDriverService::newSession):
529
530 2018-01-23  Carlos Garcia Campos  <cgarcia@igalia.com>
531
532         WebDriver: matched capabilities should include setWindowRect
533         https://bugs.webkit.org/show_bug.cgi?id=180411
534
535         Reviewed by Carlos Alberto Lopez Perez.
536
537         Handle setWindowRect in capabilities. It's always true for GTK and false for WPE.
538
539         * Capabilities.h:
540         * WebDriverService.cpp:
541         (WebDriver::WebDriverService::parseCapabilities const):
542         (WebDriver::WebDriverService::matchCapabilities const):
543         (WebDriver::WebDriverService::newSession):
544         * gtk/WebDriverServiceGtk.cpp:
545         (WebDriver::WebDriverService::platformCapabilities):
546         * wpe/WebDriverServiceWPE.cpp:
547         (WebDriver::WebDriverService::platformCapabilities):
548
549 2018-01-23  Carlos Garcia Campos  <cgarcia@igalia.com>
550
551         WebDriver: test imported/selenium/py/test/selenium/webdriver/common/api_example_tests.py::testChangeWindowSize fails
552         https://bugs.webkit.org/show_bug.cgi?id=181728
553
554         Reviewed by Sergio Villar Senin.
555
556         Due to a copy-paste error we are getting the window height using the width variable.
557
558         Fixes: imported/selenium/py/test/selenium/webdriver/common/api_example_tests.py::testChangeWindowSize
559                imported/selenium/py/test/selenium/webdriver/common/position_and_size_tests.py::testShouldScrollPageAndGetCoordinatesOfAnElementThatIsOutOfViewPort
560                imported/w3c/webdriver/tests/get_window_rect.py::test_payload
561                imported/w3c/webdriver/tests/set_window_rect.py::test_width_height_floats
562                imported/w3c/webdriver/tests/set_window_rect.py::test_height_width
563                imported/w3c/webdriver/tests/set_window_rect.py::test_height_width_larger_than_max
564                imported/w3c/webdriver/tests/contexts/resizing_and_positioning.py::test_window_resize
565
566         * Session.cpp:
567         (WebDriver::Session::getToplevelBrowsingContextRect):
568
569 2018-01-22  Carlos Garcia Campos  <cgarcia@igalia.com>
570
571         WebDriver: implement get element CSS value command
572         https://bugs.webkit.org/show_bug.cgi?id=181736
573
574         Reviewed by Carlos Alberto Lopez Perez.
575
576         13.4 Get Element CSS Value
577         https://w3c.github.io/webdriver/webdriver-spec.html#get-element-css-value
578
579         Fixes: imported/selenium/py/test/selenium/webdriver/common/rendered_webelement_tests.py::testShouldPickUpStyleOfAnElement
580                imported/selenium/py/test/selenium/webdriver/common/rendered_webelement_tests.py::testShouldAllowInheritedStylesToBeUsed
581
582         * Session.cpp:
583         (WebDriver::Session::getElementProperty):
584         (WebDriver::Session::getElementCSSValue):
585         * Session.h:
586         * WebDriverService.cpp:
587         (WebDriver::WebDriverService::getElementCSSValue):
588         * WebDriverService.h:
589
590 2018-01-22  Carlos Garcia Campos  <cgarcia@igalia.com>
591
592         [GTK] WebDriver: test imported/w3c/webdriver/tests/sessions/new_session/response.py is crashing in the bots
593         https://bugs.webkit.org/show_bug.cgi?id=181904
594
595         Reviewed by Carlos Alberto Lopez Perez.
596
597         Handle the case of failing to launch the browser. The test is actually failing because it's sending wrong
598         capabilities, the driver tries to fall back to the default driver, but since WebKit is not installed in the
599         bots, it fails to find the MiniBrowser. The test needs to be fixed, but we shouldn't crash when the browser
600         can't be spawned for whatever reason in any case. This patch handles that case and changes the boolean result of
601         connectToBrowser to be an optional error string instead. This way we can provide more detailed error message
602         when we reject the session creation because the browser failed to start.
603
604         * SessionHost.h:
605         * WebDriverService.cpp:
606         (WebDriver::WebDriverService::newSession):
607         * glib/SessionHostGlib.cpp:
608         (WebDriver::SessionHost::connectToBrowser):
609         (WebDriver::ConnectToBrowserAsyncData::ConnectToBrowserAsyncData):
610         (WebDriver::SessionHost::launchBrowser):
611         (WebDriver::SessionHost::setupConnection):
612
613 2018-01-11  Carlos Garcia Campos  <cgarcia@igalia.com>
614
615         WebDriver: implement get timeouts command
616         https://bugs.webkit.org/show_bug.cgi?id=181524
617
618         Reviewed by Žan Doberšek.
619
620         8.4 Get Timeouts
621         https://w3c.github.io/webdriver/webdriver-spec.html#get-timeouts
622
623         Also simplify the way timeouts are handled in Session. Stop using Timeouts struct, because once the session is
624         created the timeouts are no longer optional, they have a default value. Use individual members instead that are
625         initialized to their default values on construction and only overriden by capabilities or set timeouts command.
626
627         Fixes: imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_timeouts
628                imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_default_timeouts
629                imported/w3c/webdriver/tests/sessions/get_timeouts.py::test_get_new_timeouts
630
631         * Session.cpp:
632         (WebDriver::Session::Session):
633         (WebDriver::Session::getTimeouts):
634         (WebDriver::Session::setTimeouts):
635         (WebDriver::Session::go):
636         (WebDriver::Session::back):
637         (WebDriver::Session::forward):
638         (WebDriver::Session::refresh):
639         (WebDriver::Session::findElements):
640         (WebDriver::Session::waitForNavigationToComplete):
641         (WebDriver::Session::executeScript):
642         * Session.h:
643         * WebDriverService.cpp:
644         (WebDriver::WebDriverService::getTimeouts):
645         * WebDriverService.h:
646
647 2018-01-10  Zan Dobersek  <zdobersek@igalia.com>
648
649         WebDriver: deserializeTimeouts() shouldn't reject double timeout values
650         https://bugs.webkit.org/show_bug.cgi?id=181473
651
652         Reviewed by Carlos Garcia Campos.
653
654         With these changes, the following tests are fixed:
655             imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldTimeoutIfScriptDoesNotInvokeCallbackWithLongTimeout
656             imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldDetectPageLoadsWhileWaitingOnAnAsyncScriptAndReturnAnError
657             imported/selenium/py/test/selenium/webdriver/common/executing_async_javascript_tests.py::testShouldBeAbleToExecuteAsynchronousScripts
658             imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldImplicitlyWaitForASingleElement
659             imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldStillFailToFindAnElementWhenImplicitWaitsAreEnabled
660             imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldReturnAfterFirstAttemptToFindOneAfterDisablingImplicitWaits
661             imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldImplicitlyWaitUntilAtLeastOneElementIsFoundWhenSearchingForMany
662             imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldStillFailToFindAnElemenstWhenImplicitWaitsAreEnabled
663             imported/selenium/py/test/selenium/webdriver/common/implicit_waits_tests.py::testShouldReturnAfterFirstAttemptToFindManyAfterDisablingImplicitWaits
664             imported/selenium/py/test/selenium/webdriver/common/page_load_timeout_tests.py::testShouldTimeoutOnPageLoadTakingTooLong
665             imported/selenium/py/test/selenium/webdriver/common/page_load_timeout_tests.py::testShouldTimeoutOnPageLoadTakingTooLong
666             imported/selenium/py/test/selenium/webdriver/common/webdriverwait_tests.py::testShouldWaitOnlyAsLongAsTimeoutSpecifiedWhenImplicitWaitsAreSet
667
668         The following two tests regress, and will be looked into separately:
669             imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_invalid
670             imported/w3c/webdriver/tests/sessions/new_session/merge.py::test_merge_invalid
671
672         * WebDriverService.cpp:
673         (WebDriver::integerValue): Helper function that retrieves an integer value
674         from a given JSON::Value object, if possible.
675         (WebDriver::deserializeTimeouts): Timeout JSON value has to be converted to
676         an integer, which is allowed if the value is of either Integer or Double type.
677         Helper integerValue() function retrieves the integer value, in addition to
678         ensuring that possible double value that we convert to an integer is already
679         in integer form to begin with.
680
681 2017-12-15  Carlos Garcia Campos  <cgarcia@igalia.com>
682
683         WebDriver: add support for accept/dismiss and notify unhandled prompt behavior
684         https://bugs.webkit.org/show_bug.cgi?id=179999
685
686         Reviewed by Carlos Alberto Lopez Perez.
687
688         They work as accept and dismiss, but unexpected alert open is still reported.
689
690         18. User Prompts
691         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-known-prompt-handling-approaches-table
692
693         * Capabilities.h: Add DismissAndNotify and AcceptAndNotify to UnhandledPromptBehavior enum.
694         * Session.cpp:
695         (WebDriver::Session::handleUnexpectedAlertOpen): Move default implementation to dismissAndNotifyAlert and
696         acceptAndNotifyAlert and use dismissAndNotifyAlert by default.
697         (WebDriver::Session::dismissAndNotifyAlert):
698         (WebDriver::Session::acceptAndNotifyAlert):
699         * Session.h:
700         * WebDriverService.cpp:
701         (WebDriver::deserializeUnhandledPromptBehavior): Handle accept/dismiss and notify.
702         (WebDriver::WebDriverService::newSession): Ditto.
703
704 2017-12-11  Carlos Garcia Campos  <cgarcia@igalia.com>
705
706         WebDriver: get active element should return no such element error when there isn't an active element
707         https://bugs.webkit.org/show_bug.cgi?id=180421
708
709         Reviewed by Brian Burg.
710
711         We currently return unknown error.
712
713         Fixes: imported/w3c/webdriver/tests/element_retrieval/get_active_element.py::test_missing_document_element
714
715         * Session.cpp:
716         (WebDriver::Session::getActiveElement):
717
718 2017-12-04  Brian Burg  <bburg@apple.com>
719
720         Web Automation: add flag to preserve legacy page screenshot behavior
721         https://bugs.webkit.org/show_bug.cgi?id=180313
722         <rdar://problem/34379930>
723
724         Reviewed by Joseph Pecoraro.
725
726         Set the clipToViewport flag to true when sending Automation.takeScreenshot.
727         This preserves the current behavior for this driver implementation.
728
729         * Session.cpp:
730         (WebDriver::Session::takeScreenshot):
731
732 2017-12-04  Carlos Garcia Campos  <cgarcia@igalia.com>
733
734         WebDriver: implement element property command
735         https://bugs.webkit.org/show_bug.cgi?id=180244
736
737         Reviewed by Brian Burg.
738
739         13.3 Get Element Property
740         https://w3c.github.io/webdriver/webdriver-spec.html#get-element-property
741
742         Fixes: imported/w3c/webdriver/tests/state/get_element_property.py::test_no_browsing_context
743                imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_dismiss
744                imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_accept
745                imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_missing_value
746                imported/w3c/webdriver/tests/state/get_element_property.py::test_element_stale
747
748         * Session.cpp:
749         (WebDriver::Session::getElementAttribute):
750         (WebDriver::Session::getElementProperty):
751         * Session.h:
752         * WebDriverService.cpp:
753         (WebDriver::WebDriverService::getElementProperty):
754         * WebDriverService.h:
755
756 2017-12-02  Carlos Garcia Campos  <cgarcia@igalia.com>
757
758         WebDriver: handle user prompts shown while executing scripts
759         https://bugs.webkit.org/show_bug.cgi?id=179979
760
761         Reviewed by Brian Burg.
762
763         15.2 Executing Script
764         https://w3c.github.io/webdriver/webdriver-spec.html#executing-script
765
766         The rules to execute a function body are as follows. The algorithm will return success with the JSON
767         representation of the function’s return value, or an error if the evaluation of the function results in a
768         JavaScript exception being thrown or at any point during its execution an unhandled user prompt appears.
769
770         If at any point during the algorithm a user prompt appears, the user prompt handler must be invoked. If its
771         return value is an error, it must immediately return with that error and abort all subsequent substeps of this
772         algorithm.
773
774         This will be covered by new WPT tests that will be available after the next upgrade.
775
776         * CommandResult.cpp:
777         (WebDriver::CommandResult::CommandResult): Handle UnexpectedAlertOpen internal error.
778         * Session.cpp:
779         (WebDriver::Session::handleUserPrompts): Move code to handleUnexpectedAlertOpen() and call it instead.
780         (WebDriver::Session::handleUnexpectedAlertOpen): Code moved here to be used also by executeScript().
781         (WebDriver::Session::executeScript): In case of UnexpectedAlertOpen error, call handleUnexpectedAlertOpen().
782         * Session.h:
783
784 2017-12-01  Carlos Garcia Campos  <cgarcia@igalia.com>
785
786         WebDriver: implement status command
787         https://bugs.webkit.org/show_bug.cgi?id=180133
788
789         Reviewed by Brian Burg.
790
791         8.3 Status
792         https://w3c.github.io/webdriver/webdriver-spec.html#status
793
794         Fixes: imported/w3c/webdriver/tests/sessions/status.py::test_get_status_no_session
795                imported/w3c/webdriver/tests/sessions/status.py::test_status_with_session_running_on_endpoint_node
796
797         * WebDriverService.cpp:
798         (WebDriver::WebDriverService::status):
799         * WebDriverService.h:
800
801 2017-12-01  Carlos Garcia Campos  <cgarcia@igalia.com>
802
803         WebDriver: end point nodes are only allowed to have one session
804         https://bugs.webkit.org/show_bug.cgi?id=180131
805
806         Reviewed by Brian Burg.
807
808         We are currently keeping a map of sessions, but our service is always and end point node, so only one session
809         can exist at a time. Make findSessionOrCompleteWithError() return a boolean instead, failing in case the sessionID
810         parameter is not found or it doesn't match the current session. Replace the session map and active session
811         pointer with a single session member and return SessionNotCreated error when new session command is received and
812         there's an active session.
813
814         8. Sessions
815         A remote end has an associated maximum active sessions (an integer) that defines the number of active sessions
816         that are supported. This may be “unlimited” for intermediary nodes, but must be exactly one for a remote end
817         that is an endpoint node.
818         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-maximum-active-sessions
819
820         Fixes: imported/w3c/webdriver/tests/sessions/new_session/default_values.py::test_repeat_new_session
821
822         * WebDriverService.cpp:
823         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
824         (WebDriver::WebDriverService::newSession):
825         (WebDriver::WebDriverService::deleteSession):
826         (WebDriver::WebDriverService::status):
827         (WebDriver::WebDriverService::setTimeouts):
828         (WebDriver::WebDriverService::go):
829         (WebDriver::WebDriverService::getCurrentURL):
830         (WebDriver::WebDriverService::back):
831         (WebDriver::WebDriverService::forward):
832         (WebDriver::WebDriverService::refresh):
833         (WebDriver::WebDriverService::getTitle):
834         (WebDriver::WebDriverService::getWindowHandle):
835         (WebDriver::WebDriverService::setWindowRect):
836         (WebDriver::WebDriverService::closeWindow):
837         (WebDriver::WebDriverService::switchToWindow):
838         (WebDriver::WebDriverService::getWindowHandles):
839         (WebDriver::WebDriverService::switchToFrame):
840         (WebDriver::WebDriverService::switchToParentFrame):
841         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
842         (WebDriver::WebDriverService::findElement):
843         (WebDriver::WebDriverService::findElements):
844         (WebDriver::WebDriverService::findElementFromElement):
845         (WebDriver::WebDriverService::findElementsFromElement):
846         (WebDriver::WebDriverService::getActiveElement):
847         (WebDriver::WebDriverService::isElementSelected):
848         (WebDriver::WebDriverService::getElementAttribute):
849         (WebDriver::WebDriverService::getElementText):
850         (WebDriver::WebDriverService::getElementTagName):
851         (WebDriver::WebDriverService::getElementRect):
852         (WebDriver::WebDriverService::isElementEnabled):
853         (WebDriver::WebDriverService::isElementDisplayed):
854         (WebDriver::WebDriverService::elementClick):
855         (WebDriver::WebDriverService::elementClear):
856         (WebDriver::WebDriverService::elementSendKeys):
857         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
858         (WebDriver::WebDriverService::executeScript):
859         (WebDriver::WebDriverService::executeAsyncScript):
860         (WebDriver::WebDriverService::getAllCookies):
861         (WebDriver::WebDriverService::getNamedCookie):
862         (WebDriver::deserializeCookie):
863         (WebDriver::WebDriverService::addCookie):
864         (WebDriver::WebDriverService::deleteCookie):
865         (WebDriver::WebDriverService::deleteAllCookies):
866         (WebDriver::WebDriverService::dismissAlert):
867         (WebDriver::WebDriverService::acceptAlert):
868         (WebDriver::WebDriverService::getAlertText):
869         (WebDriver::WebDriverService::sendAlertText):
870         (WebDriver::WebDriverService::takeScreenshot):
871         (WebDriver::WebDriverService::takeElementScreenshot):
872         * WebDriverService.h:
873
874 2017-11-30  Carlos Garcia Campos  <cgarcia@igalia.com>
875
876         WebDriver: locator strategy should be validated before trying to find elements
877         https://bugs.webkit.org/show_bug.cgi?id=180187
878
879         Reviewed by Carlos Alberto Lopez Perez.
880
881         We currently rely on the js atom to raise an exception in case the locator strategy is not valid, but in case of
882         find element from element, if the element doesn't exist we fail with stale element error instead of invalid
883         argument as expected. So, let's validate the strategies when parsing them, which would also avoid going to the
884         browser in cae of invalid strategy.
885
886         Fixes: imported/w3c/webdriver/tests/retrieval/find_element_from_element.py::test_invalid_using_argument[a]
887
888         * WebDriverService.cpp:
889         (WebDriver::isValidStrategy):
890         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
891
892 2017-11-30  Carlos Garcia Campos  <cgarcia@igalia.com>
893
894         WebDriver: remove elementSubmit command
895         https://bugs.webkit.org/show_bug.cgi?id=180186
896
897         Reviewed by Carlos Alberto Lopez Perez.
898
899         It's not in the spec, we had it only because selenium used it, but now it uses execute_script with custom code
900         to implement submit, so we can just remove it.
901
902         * Session.cpp:
903         (WebDriver::Session::elementSubmit): Deleted.
904         * Session.h:
905         * WebDriverService.cpp:
906         (WebDriver::WebDriverService::elementSubmit): Deleted.
907         * WebDriverService.h:
908
909 2017-11-14  Carlos Garcia Campos  <cgarcia@igalia.com>
910
911         Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
912         https://bugs.webkit.org/show_bug.cgi?id=173793
913
914         Reviewed by Joseph Pecoraro.
915
916         * CMakeLists.txt:
917         * CommandResult.cpp:
918         (WebDriver::CommandResult::CommandResult):
919         * CommandResult.h:
920         (WebDriver::CommandResult::success):
921         (WebDriver::CommandResult::fail):
922         (WebDriver::CommandResult::result const):
923         (WebDriver::CommandResult::setAdditionalErrorData):
924         (WebDriver::CommandResult::additionalErrorData const):
925         * Session.cpp:
926         (WebDriver::firstWindowHandleInResult):
927         (WebDriver::Session::handleUserPrompts):
928         (WebDriver::Session::reportUnexpectedAlertOpen):
929         (WebDriver::Session::go):
930         (WebDriver::Session::getCurrentURL):
931         (WebDriver::Session::back):
932         (WebDriver::Session::forward):
933         (WebDriver::Session::refresh):
934         (WebDriver::Session::getTitle):
935         (WebDriver::Session::getWindowHandle):
936         (WebDriver::Session::closeTopLevelBrowsingContext):
937         (WebDriver::Session::switchToWindow):
938         (WebDriver::Session::getWindowHandles):
939         (WebDriver::Session::switchToFrame):
940         (WebDriver::Session::switchToParentFrame):
941         (WebDriver::Session::getToplevelBrowsingContextRect):
942         (WebDriver::Session::moveToplevelBrowsingContextWindow):
943         (WebDriver::Session::resizeToplevelBrowsingContextWindow):
944         (WebDriver::Session::createElement):
945         (WebDriver::Session::extractElement):
946         (WebDriver::Session::extractElementID):
947         (WebDriver::Session::computeElementLayout):
948         (WebDriver::Session::findElements):
949         (WebDriver::Session::isElementSelected):
950         (WebDriver::Session::getElementText):
951         (WebDriver::Session::getElementTagName):
952         (WebDriver::Session::getElementRect):
953         (WebDriver::Session::isElementEnabled):
954         (WebDriver::Session::isElementDisplayed):
955         (WebDriver::Session::getElementAttribute):
956         (WebDriver::Session::waitForNavigationToComplete):
957         (WebDriver::Session::selectOptionElement):
958         (WebDriver::Session::elementClick):
959         (WebDriver::Session::elementClear):
960         (WebDriver::Session::elementSendKeys):
961         (WebDriver::Session::elementSubmit):
962         (WebDriver::Session::handleScriptResult):
963         (WebDriver::Session::executeScript):
964         (WebDriver::Session::performMouseInteraction):
965         (WebDriver::Session::performKeyboardInteractions):
966         (WebDriver::parseAutomationCookie):
967         (WebDriver::builtAutomationCookie):
968         (WebDriver::serializeCookie):
969         (WebDriver::Session::getAllCookies):
970         (WebDriver::Session::getNamedCookie):
971         (WebDriver::Session::addCookie):
972         (WebDriver::Session::deleteCookie):
973         (WebDriver::Session::deleteAllCookies):
974         (WebDriver::Session::dismissAlert):
975         (WebDriver::Session::acceptAlert):
976         (WebDriver::Session::getAlertText):
977         (WebDriver::Session::sendAlertText):
978         (WebDriver::Session::takeScreenshot):
979         * Session.h:
980         * SessionHost.cpp:
981         (WebDriver::SessionHost::sendCommandToBackend):
982         (WebDriver::SessionHost::dispatchMessage):
983         * SessionHost.h:
984         * WebDriverService.cpp:
985         (WebDriver::WebDriverService::handleRequest):
986         (WebDriver::WebDriverService::sendResponse const):
987         (WebDriver::deserializeTimeouts):
988         (WebDriver::WebDriverService::parseCapabilities const):
989         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
990         (WebDriver::WebDriverService::validatedCapabilities const):
991         (WebDriver::WebDriverService::mergeCapabilities const):
992         (WebDriver::WebDriverService::matchCapabilities const):
993         (WebDriver::WebDriverService::processCapabilities const):
994         (WebDriver::WebDriverService::newSession):
995         (WebDriver::WebDriverService::deleteSession):
996         (WebDriver::WebDriverService::setTimeouts):
997         (WebDriver::WebDriverService::go):
998         (WebDriver::WebDriverService::getCurrentURL):
999         (WebDriver::WebDriverService::back):
1000         (WebDriver::WebDriverService::forward):
1001         (WebDriver::WebDriverService::refresh):
1002         (WebDriver::WebDriverService::getTitle):
1003         (WebDriver::WebDriverService::getWindowHandle):
1004         (WebDriver::WebDriverService::getWindowRect):
1005         (WebDriver::valueAsNumberInRange):
1006         (WebDriver::WebDriverService::setWindowRect):
1007         (WebDriver::WebDriverService::closeWindow):
1008         (WebDriver::WebDriverService::switchToWindow):
1009         (WebDriver::WebDriverService::getWindowHandles):
1010         (WebDriver::WebDriverService::switchToFrame):
1011         (WebDriver::WebDriverService::switchToParentFrame):
1012         (WebDriver::findElementOrCompleteWithError):
1013         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
1014         (WebDriver::WebDriverService::findElement):
1015         (WebDriver::WebDriverService::findElements):
1016         (WebDriver::WebDriverService::findElementFromElement):
1017         (WebDriver::WebDriverService::findElementsFromElement):
1018         (WebDriver::WebDriverService::isElementSelected):
1019         (WebDriver::WebDriverService::getElementAttribute):
1020         (WebDriver::WebDriverService::getElementText):
1021         (WebDriver::WebDriverService::getElementTagName):
1022         (WebDriver::WebDriverService::getElementRect):
1023         (WebDriver::WebDriverService::isElementEnabled):
1024         (WebDriver::WebDriverService::isElementDisplayed):
1025         (WebDriver::WebDriverService::elementClick):
1026         (WebDriver::WebDriverService::elementClear):
1027         (WebDriver::WebDriverService::elementSendKeys):
1028         (WebDriver::WebDriverService::elementSubmit):
1029         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
1030         (WebDriver::WebDriverService::executeScript):
1031         (WebDriver::WebDriverService::executeAsyncScript):
1032         (WebDriver::WebDriverService::getAllCookies):
1033         (WebDriver::WebDriverService::getNamedCookie):
1034         (WebDriver::deserializeCookie):
1035         (WebDriver::WebDriverService::addCookie):
1036         (WebDriver::WebDriverService::deleteCookie):
1037         (WebDriver::WebDriverService::deleteAllCookies):
1038         (WebDriver::WebDriverService::dismissAlert):
1039         (WebDriver::WebDriverService::acceptAlert):
1040         (WebDriver::WebDriverService::getAlertText):
1041         (WebDriver::WebDriverService::sendAlertText):
1042         (WebDriver::WebDriverService::takeScreenshot):
1043         (WebDriver::WebDriverService::takeElementScreenshot):
1044         * WebDriverService.h:
1045         * gtk/WebDriverServiceGtk.cpp:
1046         (WebDriver::WebDriverService::platformValidateCapability const):
1047         (WebDriver::WebDriverService::platformMatchCapability const):
1048         (WebDriver::WebDriverService::platformParseCapabilities const):
1049         * wpe/WebDriverServiceWPE.cpp:
1050         (WebDriver::WebDriverService::platformValidateCapability const):
1051         (WebDriver::WebDriverService::platformMatchCapability const):
1052         (WebDriver::WebDriverService::platformParseCapabilities const):
1053
1054 2017-11-28  Carlos Garcia Campos  <cgarcia@igalia.com>
1055
1056         [GTK] WebDriver: stop making mandatory to provide a browser path if webkitgtk:browserOptions is present in capabilities
1057         https://bugs.webkit.org/show_bug.cgi?id=180012
1058
1059         Reviewed by Carlos Alberto Lopez Perez.
1060
1061         Everything should be optional. We might want to disable overlay scrollbars, but still using the default browser,
1062         for example, as I'm doing when running the selenium tests. We might also want to provide additional browser
1063         arguments, but using the default browser.
1064
1065         * gtk/WebDriverServiceGtk.cpp:
1066         (WebDriver::WebDriverService::platformValidateCapability const): Do not consider invalid to not provide a
1067         browser binary when webkitgtk:browserOptions is present.
1068         (WebDriver::WebDriverService::platformParseCapabilities const): Override default capabilities with the ones
1069         provided.
1070
1071 2017-11-27  Carlos Garcia Campos  <cgarcia@igalia.com>
1072
1073         WebDriver: Implement get active element command
1074         https://bugs.webkit.org/show_bug.cgi?id=180001
1075
1076         Reviewed by Brian Burg.
1077
1078         12.6 Get Active Element
1079         https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element
1080
1081         Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.
1082
1083         * Session.cpp:
1084         (WebDriver::Session::getActiveElement):
1085         * Session.h:
1086         * WebDriverService.cpp:
1087         (WebDriver::WebDriverService::getActiveElement):
1088         * WebDriverService.h:
1089
1090 2017-11-21  Carlos Garcia Campos  <cgarcia@igalia.com>
1091
1092         WebDriver: do not try to parse http body if method is not POST
1093         https://bugs.webkit.org/show_bug.cgi?id=179918
1094
1095         Reviewed by Darin Adler.
1096
1097         As said in the spec:
1098
1099           5. If request’s method is POST:
1100
1101             1. Let parse result be the result of parsing as JSON with request’s body as the argument. If this process
1102                throws an exception, return an error with error code invalid argument and jump back to step 1 in this
1103                overall algorithm.
1104
1105             2. If parse result is not an Object, send an error with error code invalid argument and jump back to step 1
1106                in this overall algorithm.
1107
1108             Otherwise, let parameters be parse result.
1109
1110           Otherwise, let parameters be null.
1111
1112         6.3 Processing Model
1113         https://w3c.github.io/webdriver/webdriver-spec.html#processing-model
1114
1115         Now, w3c tests are sending null as body of delete session command (it used to be just empty), making it fail
1116         with invalid argument error.
1117
1118         * WebDriverService.cpp:
1119         (WebDriver::WebDriverService::findCommand):
1120         (WebDriver::WebDriverService::handleRequest):
1121         * WebDriverService.h:
1122
1123 2017-11-21  Carlos Garcia Campos  <cgarcia@igalia.com>
1124
1125         WebDriver: crash in Session::computeElementLayout when called without a current browsing context
1126         https://bugs.webkit.org/show_bug.cgi?id=179917
1127
1128         Reviewed by Darin Adler.
1129
1130         In the case of computeElementLayout message, the frameHandle parameter is not optional, but we still need to
1131         provide a valid value (empty string means the default frame) when m_currentBrowsingContext is std::nullopt. The
1132         same applies to selectOptionElement.
1133
1134         * Session.cpp:
1135         (WebDriver::Session::computeElementLayout):
1136         (WebDriver::Session::selectOptionElement):
1137
1138 2017-11-15  Carlos Garcia Campos  <cgarcia@igalia.com>
1139
1140         [WPE] Add initial support for WebDriver
1141         https://bugs.webkit.org/show_bug.cgi?id=179727
1142
1143         Reviewed by Michael Catanzaro.
1144
1145         Add WPE implementation for platform-specific methods. Move the version handling to a common file
1146         WebDriverServiceGLib.cpp.
1147
1148         * Capabilities.h:
1149         * PlatformGTK.cmake:
1150         * PlatformWPE.cmake:
1151         * glib/WebDriverServiceGLib.cpp: Added.
1152         (WebDriver::parseVersion):
1153         (WebDriver::WebDriverService::platformCompareBrowserVersions):
1154         * gtk/WebDriverServiceGtk.cpp:
1155         * wpe/WebDriverServiceWPE.cpp: Copied from Source/WebDriver/gtk/WebDriverServiceGtk.cpp.
1156         (WebDriver::WebDriverService::platformCapabilities):
1157         (WebDriver::WebDriverService::platformValidateCapability const):
1158         (WebDriver::WebDriverService::platformMatchCapability const):
1159         (WebDriver::WebDriverService::platformParseCapabilities const):
1160
1161 2017-11-15  Ryan Haddad  <ryanhaddad@apple.com>
1162
1163         Unreviewed, rolling out r224863.
1164
1165         Introduced LayoutTest crashes on iOS Simulator.
1166
1167         Reverted changeset:
1168
1169         "Move JSONValues to WTF and convert uses of InspectorValues.h
1170         to JSONValues.h"
1171         https://bugs.webkit.org/show_bug.cgi?id=173793
1172         https://trac.webkit.org/changeset/224863
1173
1174 2017-11-14  Carlos Garcia Campos  <cgarcia@igalia.com>
1175
1176         Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
1177         https://bugs.webkit.org/show_bug.cgi?id=173793
1178
1179         Reviewed by Brian Burg.
1180
1181         * CMakeLists.txt:
1182         * CommandResult.cpp:
1183         (WebDriver::CommandResult::CommandResult):
1184         * CommandResult.h:
1185         (WebDriver::CommandResult::success):
1186         (WebDriver::CommandResult::fail):
1187         (WebDriver::CommandResult::result const):
1188         (WebDriver::CommandResult::setAdditionalErrorData):
1189         (WebDriver::CommandResult::additionalErrorData const):
1190         * Session.cpp:
1191         (WebDriver::firstWindowHandleInResult):
1192         (WebDriver::Session::handleUserPrompts):
1193         (WebDriver::Session::reportUnexpectedAlertOpen):
1194         (WebDriver::Session::go):
1195         (WebDriver::Session::getCurrentURL):
1196         (WebDriver::Session::back):
1197         (WebDriver::Session::forward):
1198         (WebDriver::Session::refresh):
1199         (WebDriver::Session::getTitle):
1200         (WebDriver::Session::getWindowHandle):
1201         (WebDriver::Session::closeTopLevelBrowsingContext):
1202         (WebDriver::Session::switchToWindow):
1203         (WebDriver::Session::getWindowHandles):
1204         (WebDriver::Session::switchToFrame):
1205         (WebDriver::Session::switchToParentFrame):
1206         (WebDriver::Session::getToplevelBrowsingContextRect):
1207         (WebDriver::Session::moveToplevelBrowsingContextWindow):
1208         (WebDriver::Session::resizeToplevelBrowsingContextWindow):
1209         (WebDriver::Session::createElement):
1210         (WebDriver::Session::extractElement):
1211         (WebDriver::Session::extractElementID):
1212         (WebDriver::Session::computeElementLayout):
1213         (WebDriver::Session::findElements):
1214         (WebDriver::Session::isElementSelected):
1215         (WebDriver::Session::getElementText):
1216         (WebDriver::Session::getElementTagName):
1217         (WebDriver::Session::getElementRect):
1218         (WebDriver::Session::isElementEnabled):
1219         (WebDriver::Session::isElementDisplayed):
1220         (WebDriver::Session::getElementAttribute):
1221         (WebDriver::Session::waitForNavigationToComplete):
1222         (WebDriver::Session::selectOptionElement):
1223         (WebDriver::Session::elementClick):
1224         (WebDriver::Session::elementClear):
1225         (WebDriver::Session::elementSendKeys):
1226         (WebDriver::Session::elementSubmit):
1227         (WebDriver::Session::handleScriptResult):
1228         (WebDriver::Session::executeScript):
1229         (WebDriver::Session::performMouseInteraction):
1230         (WebDriver::Session::performKeyboardInteractions):
1231         (WebDriver::parseAutomationCookie):
1232         (WebDriver::builtAutomationCookie):
1233         (WebDriver::serializeCookie):
1234         (WebDriver::Session::getAllCookies):
1235         (WebDriver::Session::getNamedCookie):
1236         (WebDriver::Session::addCookie):
1237         (WebDriver::Session::deleteCookie):
1238         (WebDriver::Session::deleteAllCookies):
1239         (WebDriver::Session::dismissAlert):
1240         (WebDriver::Session::acceptAlert):
1241         (WebDriver::Session::getAlertText):
1242         (WebDriver::Session::sendAlertText):
1243         (WebDriver::Session::takeScreenshot):
1244         * Session.h:
1245         * SessionHost.cpp:
1246         (WebDriver::SessionHost::sendCommandToBackend):
1247         (WebDriver::SessionHost::dispatchMessage):
1248         * SessionHost.h:
1249         * WebDriverService.cpp:
1250         (WebDriver::WebDriverService::handleRequest):
1251         (WebDriver::WebDriverService::sendResponse const):
1252         (WebDriver::deserializeTimeouts):
1253         (WebDriver::WebDriverService::parseCapabilities const):
1254         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
1255         (WebDriver::WebDriverService::validatedCapabilities const):
1256         (WebDriver::WebDriverService::mergeCapabilities const):
1257         (WebDriver::WebDriverService::matchCapabilities const):
1258         (WebDriver::WebDriverService::processCapabilities const):
1259         (WebDriver::WebDriverService::newSession):
1260         (WebDriver::WebDriverService::deleteSession):
1261         (WebDriver::WebDriverService::setTimeouts):
1262         (WebDriver::WebDriverService::go):
1263         (WebDriver::WebDriverService::getCurrentURL):
1264         (WebDriver::WebDriverService::back):
1265         (WebDriver::WebDriverService::forward):
1266         (WebDriver::WebDriverService::refresh):
1267         (WebDriver::WebDriverService::getTitle):
1268         (WebDriver::WebDriverService::getWindowHandle):
1269         (WebDriver::WebDriverService::getWindowRect):
1270         (WebDriver::valueAsNumberInRange):
1271         (WebDriver::WebDriverService::setWindowRect):
1272         (WebDriver::WebDriverService::closeWindow):
1273         (WebDriver::WebDriverService::switchToWindow):
1274         (WebDriver::WebDriverService::getWindowHandles):
1275         (WebDriver::WebDriverService::switchToFrame):
1276         (WebDriver::WebDriverService::switchToParentFrame):
1277         (WebDriver::findElementOrCompleteWithError):
1278         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
1279         (WebDriver::WebDriverService::findElement):
1280         (WebDriver::WebDriverService::findElements):
1281         (WebDriver::WebDriverService::findElementFromElement):
1282         (WebDriver::WebDriverService::findElementsFromElement):
1283         (WebDriver::WebDriverService::isElementSelected):
1284         (WebDriver::WebDriverService::getElementAttribute):
1285         (WebDriver::WebDriverService::getElementText):
1286         (WebDriver::WebDriverService::getElementTagName):
1287         (WebDriver::WebDriverService::getElementRect):
1288         (WebDriver::WebDriverService::isElementEnabled):
1289         (WebDriver::WebDriverService::isElementDisplayed):
1290         (WebDriver::WebDriverService::elementClick):
1291         (WebDriver::WebDriverService::elementClear):
1292         (WebDriver::WebDriverService::elementSendKeys):
1293         (WebDriver::WebDriverService::elementSubmit):
1294         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
1295         (WebDriver::WebDriverService::executeScript):
1296         (WebDriver::WebDriverService::executeAsyncScript):
1297         (WebDriver::WebDriverService::getAllCookies):
1298         (WebDriver::WebDriverService::getNamedCookie):
1299         (WebDriver::deserializeCookie):
1300         (WebDriver::WebDriverService::addCookie):
1301         (WebDriver::WebDriverService::deleteCookie):
1302         (WebDriver::WebDriverService::deleteAllCookies):
1303         (WebDriver::WebDriverService::dismissAlert):
1304         (WebDriver::WebDriverService::acceptAlert):
1305         (WebDriver::WebDriverService::getAlertText):
1306         (WebDriver::WebDriverService::sendAlertText):
1307         (WebDriver::WebDriverService::takeScreenshot):
1308         (WebDriver::WebDriverService::takeElementScreenshot):
1309         * WebDriverService.h:
1310         * gtk/WebDriverServiceGtk.cpp:
1311         (WebDriver::WebDriverService::platformValidateCapability const):
1312         (WebDriver::WebDriverService::platformMatchCapability const):
1313         (WebDriver::WebDriverService::platformParseCapabilities const):
1314
1315 2017-11-07  Brian Burg  <bburg@apple.com>
1316
1317         Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
1318         https://bugs.webkit.org/show_bug.cgi?id=179129
1319         <rdar://problem/35297038>
1320
1321         Reviewed by Simon Fraser.
1322
1323         Adjust code to use the proper coordinate system when requesting element layout.
1324
1325         * Session.cpp:
1326         (WebDriver::Session::computeElementLayout):
1327
1328 2017-11-09  Carlos Garcia Campos  <cgarcia@igalia.com>
1329
1330         WebDriver: WebDriverService::matchCapabilities should follow the spec
1331         https://bugs.webkit.org/show_bug.cgi?id=179371
1332
1333         Reviewed by Brian Burg.
1334
1335         The returned object should contain all the entries mentioned in the spec, not only the ones already present in
1336         the passed in capabilities object.
1337
1338         7.2 Processing Capabilities
1339         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-matching-capabilities
1340
1341         * WebDriverService.cpp:
1342         (WebDriver::WebDriverService::matchCapabilities const):
1343         (WebDriver::WebDriverService::processCapabilities const):
1344         * WebDriverService.h:
1345
1346 2017-11-09  Carlos Garcia Campos  <cgarcia@igalia.com>
1347
1348         WebDriver: capabilities with null value shouldn't be added to the validated capabilities object
1349         https://bugs.webkit.org/show_bug.cgi?id=179369
1350
1351         Reviewed by Brian Burg.
1352
1353         "4. If deserialized is not null, set a property on result with name name and value deserialized."
1354
1355         7.2 Processing Capabilities
1356         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
1357
1358         Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[platformName-None]
1359
1360         * WebDriverService.cpp:
1361         (WebDriver::WebDriverService::validatedCapabilities const):
1362
1363 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
1364
1365         WebDriver: unknown capabilities should produce an InvalidArgument error when validating capabilities
1366         https://bugs.webkit.org/show_bug.cgi?id=178868
1367
1368         Reviewed by Brian Burg.
1369
1370         7.2 Processing Capabilities
1371         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
1372
1373         Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_extensions
1374
1375         * WebDriverService.cpp:
1376         (WebDriver::WebDriverService::validatedCapabilities const):
1377
1378 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
1379
1380         WebDriver: deserializeTimeouts should fail if the value is not integer
1381         https://bugs.webkit.org/show_bug.cgi?id=178866
1382
1383         Reviewed by Brian Burg.
1384
1385         If value is not an integer, or it is less than 0 or greater than 2^64 – 1, return error with error code invalid
1386         argument.
1387         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-deserialize-as-a-timeout
1388
1389         Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body0]
1390                imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body1]
1391
1392         * WebDriverService.cpp:
1393         (WebDriver::deserializeTimeouts):
1394
1395 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
1396
1397         WebDriver: failing to process capabilities should produce InvalidArgument error not SessionNotCreated
1398         https://bugs.webkit.org/show_bug.cgi?id=178864
1399
1400         Reviewed by Brian Burg.
1401
1402         Fixes most of the tests in imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py.
1403
1404         7.2 Processing Capabilities
1405         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1406
1407         * WebDriverService.cpp:
1408         (WebDriver::WebDriverService::processCapabilities const):
1409
1410 2017-10-10  Sam Weinig  <sam@webkit.org>
1411
1412         Replace copyKeysToVector/copyValuesToVector with copyToVector(map.keys())/copyToVector(map.values())
1413         https://bugs.webkit.org/show_bug.cgi?id=178102
1414
1415         Reviewed by Tim Horton.
1416
1417         * SessionHost.cpp:
1418         (WebDriver::SessionHost::inspectorDisconnected):
1419
1420 2017-10-02  Carlos Garcia Campos  <cgarcia@igalia.com>
1421
1422         WebDriver: HTTP status code is not correct for some of the errors
1423         https://bugs.webkit.org/show_bug.cgi?id=177354
1424
1425         Reviewed by Brian Burg.
1426
1427         I think this changed in the spec at some point. The thing is that no such alert, frame and window and stale
1428         element reference errors should return 404 instead of 400.
1429
1430         https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
1431
1432         * CommandResult.cpp:
1433         (WebDriver::CommandResult::httpStatusCode const):
1434
1435 2017-09-19  Carlos Garcia Campos  <cgarcia@igalia.com>
1436
1437         WebDriver: Implement commands to get and set the window rect
1438         https://bugs.webkit.org/show_bug.cgi?id=177134
1439
1440         Reviewed by Brian Burg.
1441
1442         We are currently implementing the selenium legacy ones, we should implement the w3c ones instead.
1443
1444         https://w3c.github.io/webdriver/webdriver-spec.html#resizing-and-positioning-windows
1445
1446         * Session.cpp:
1447         (WebDriver::Session::getToplevelBrowsingContextRect): Helper to get the window rect. This is used by both get
1448         and set window rect commands.
1449         (WebDriver::Session::moveToplevelBrowsingContextwindow): Helper to ask automation to move the window.
1450         (WebDriver::Session::resizeToplevelBrowsingContextwindow): Helper to ask automation to resize the window.
1451         (WebDriver::Session::getWindowRect): Handle prompts and then call getToplevelBrowsingContextRect().
1452         (WebDriver::Session::setWindowRect): Handle prompts and then move and resize the window according to the given
1453         parameters and finish the operation calling getToplevelBrowsingContextRect().
1454         * Session.h:
1455         * WebDriverService.cpp:
1456         (WebDriver::WebDriverService::getWindowRect): Ask the session to get the window rect.
1457         (WebDriver::valueAsNumberInRange): Helper to check a value is a valid number in the given range.
1458         (WebDriver::WebDriverService::setWindowRect): Get and check size and position from parameters and then ask the
1459         session to set the window rect.
1460         * WebDriverService.h:
1461
1462 2017-09-19  Carlos Garcia Campos  <cgarcia@igalia.com>
1463
1464         WebDriver: wrong response in case of errors
1465         https://bugs.webkit.org/show_bug.cgi?id=177127
1466
1467         Reviewed by Brian Burg.
1468
1469         I misunderstood the spec when I implemented this, so we either return a "value" key with the result in case of
1470         success or the error object as the body in case of error. We should always add a "value" key to the body and set
1471         it with either the result or the error object.
1472
1473         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-an-error
1474
1475         * WebDriverService.cpp:
1476         (WebDriver::WebDriverService::sendResponse const):
1477
1478 2017-09-18  Carlos Garcia Campos  <cgarcia@igalia.com>
1479
1480         WebDriver: wrong key name for capabilities in new session response
1481         https://bugs.webkit.org/show_bug.cgi?id=177074
1482
1483         Reviewed by Brian Burg.
1484
1485         We are using "value", it should be "capabilities".
1486         https://w3c.github.io/webdriver/webdriver-spec.html#new-session
1487
1488         * WebDriverService.cpp:
1489         (WebDriver::WebDriverService::newSession):
1490
1491 2017-09-18  Carlos Garcia Campos  <cgarcia@igalia.com>
1492
1493         WebDriver: HTTP responses should include Cache-Control header with no-cache value
1494         https://bugs.webkit.org/show_bug.cgi?id=177073
1495
1496         Reviewed by Sergio Villar Senin.
1497
1498         6.3 Processing Model.
1499         Set the response’s header with name and value with the following values:
1500
1501         Content-Type "application/json; charset=utf-8"
1502         Cache-Control "no-cache"
1503
1504         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-a-response
1505
1506         We were setting the Content-Type, but not the Cache-Control. This is checked by all WPT WebDriver tests.
1507
1508         * soup/HTTPServerSoup.cpp:
1509         (WebDriver::HTTPServer::listen): Add Cache-Control header.
1510
1511 2017-09-18  Michael Catanzaro  <mcatanzaro@igalia.com>
1512
1513         [CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
1514         https://bugs.webkit.org/show_bug.cgi?id=174558
1515
1516         Reviewed by Alex Christensen.
1517
1518         * CMakeLists.txt:
1519
1520 2017-09-15  JF Bastien  <jfbastien@apple.com>
1521
1522         WTF: use Forward.h when appropriate instead of Vector.h
1523         https://bugs.webkit.org/show_bug.cgi?id=176984
1524
1525         Reviewed by Saam Barati.
1526
1527         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.
1528
1529         * Session.h:
1530
1531 2017-09-09  Carlos Garcia Campos  <cgarcia@igalia.com>
1532
1533         WebDriver: ensure we close all windows handles when closing the session
1534         https://bugs.webkit.org/show_bug.cgi?id=176508
1535
1536         Reviewed by Brian Burg.
1537
1538         The spec says that when closing the session all top level browsing contexts should be closed. We are currently
1539         checking if we have an active top level browsing context and then we try to close it before trying with the
1540         rest. It can happen that we are in an inconsistent state, for example if the current top level browsing context
1541         has been closed by JavaScript or another action and the user didn't switch to another one before closing the
1542         session. In such case, closing the session will fail with NoSuchwindow and any other window open will not be
1543         closed. It's safer to always ask for all window handles and close them, which is what the spec says too.
1544
1545         * Session.cpp:
1546         (WebDriver::firstWindowHandleInResult): Helper class to get the first window handle in the result array.
1547         (WebDriver::Session::closeAllToplevelBrowsingContexts): Use firstWindowHandleInResult().
1548         (WebDriver::Session::close): Close the current top level browsing context and get all window handles to close
1549         them all if needed.
1550
1551 2017-08-28  Carlos Garcia Campos  <cgarcia@igalia.com>
1552
1553         WebDriver: implement screen capture commands
1554         https://bugs.webkit.org/show_bug.cgi?id=174615
1555
1556         Reviewed by Brian Burg.
1557
1558         Implement takeScreenshot and takeElementScreenshot commands.
1559
1560         19. Screen Capture.
1561         https://w3c.github.io/webdriver/webdriver-spec.html#screen-capture
1562
1563         * CommandResult.cpp:
1564         (WebDriver::CommandResult::CommandResult): Handle ScreenshotError protocol error.
1565         (WebDriver::CommandResult::httpStatusCode const): Add UnableToCaptureScreen.
1566         (WebDriver::CommandResult::errorString const): Ditto.
1567         * CommandResult.h:
1568         * Session.cpp:
1569         (WebDriver::Session::takeScreenshot):
1570         * Session.h:
1571         * WebDriverService.cpp:
1572         (WebDriver::WebDriverService::takeScreenshot):
1573         (WebDriver::WebDriverService::takeElementScreenshot):
1574         * WebDriverService.h:
1575
1576 2017-08-28  Carlos Garcia Campos  <cgarcia@igalia.com>
1577
1578         WebDriver: implement cookies commands
1579         https://bugs.webkit.org/show_bug.cgi?id=174613
1580
1581         Reviewed by Brian Burg.
1582
1583         Add cookies commands.
1584
1585         16. Cookies.
1586         https://w3c.github.io/webdriver/webdriver-spec.html#cookies
1587
1588         * CommandResult.cpp:
1589         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
1590         (WebDriver::CommandResult::errorString const): Ditto.
1591         * CommandResult.h:
1592         * Session.cpp:
1593         (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
1594         (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
1595         (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
1596         (WebDriver::Session::getAllCookies):
1597         (WebDriver::Session::getNamedCookie):
1598         (WebDriver::Session::addCookie):
1599         (WebDriver::Session::deleteCookie):
1600         (WebDriver::Session::deleteAllCookies):
1601         * Session.h:
1602         * WebDriverService.cpp:
1603         (WebDriver::WebDriverService::getAllCookies):
1604         (WebDriver::WebDriverService::getNamedCookie):
1605         (WebDriver::deserializeCookie):
1606         (WebDriver::WebDriverService::addCookie):
1607         (WebDriver::WebDriverService::deleteCookie):
1608         (WebDriver::WebDriverService::deleteAllCookies):
1609         * WebDriverService.h:
1610
1611 2017-07-28  Carlos Garcia Campos  <cgarcia@igalia.com>
1612
1613         WebDriver: fix return value of close window command
1614         https://bugs.webkit.org/show_bug.cgi?id=174861
1615
1616         Reviewed by Brian Burg.
1617
1618         We are currently returning null, but we should return the list of window handles, and try to close the session
1619         if there aren't more window handles.
1620
1621         10.2 Close Window
1622         https://w3c.github.io/webdriver/webdriver-spec.html#close-window
1623
1624         3. If there are no more open top-level browsing contexts, then try to close the session.
1625         4. Return the result of running the remote end steps for the Get Window Handles command.
1626
1627         * Session.cpp:
1628         (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
1629         context and the next one if there are more.
1630         (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
1631         the session.
1632         (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
1633         getWindowHandles() when done.
1634         (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
1635         (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
1636         toplevel browsing context.
1637         * Session.h:
1638         * SessionHost.h:
1639         * WebDriverService.cpp:
1640         (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
1641         (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
1642         (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
1643         * WebDriverService.h: Remove unused quit() method.
1644         * glib/SessionHostGlib.cpp:
1645         (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
1646         (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
1647
1648 2017-08-14  Carlos Garcia Campos  <cgarcia@igalia.com>
1649
1650         WebDriver: handle click events on option elements
1651         https://bugs.webkit.org/show_bug.cgi?id=174710
1652         <rdar://problem/33459305>
1653
1654         Reviewed by Brian Burg.
1655
1656         Option elements are considered as a special case by the specification. When clicking an option element, we
1657         should get its container and use it when scrolling into view and calculating in-view center point instead of the
1658         option element itself. Then, we should not emulate a click, but change the selected status of the option element
1659         like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
1660         option to call selectOptionElement() or performMouseInteraction().
1661
1662         This fixes more than 20 selenium tests.
1663
1664         * CommandResult.cpp:
1665         (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
1666         (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
1667         (WebDriver::CommandResult::errorString const): Ditto.
1668         * CommandResult.h:
1669         * Session.cpp:
1670         (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
1671         (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
1672         the element is an option or not.
1673         * Session.h:
1674
1675 2017-08-11  Carlos Alberto Lopez Perez  <clopez@igalia.com>
1676
1677         Fix build warning in WebDriverService.h
1678         https://bugs.webkit.org/show_bug.cgi?id=166682
1679
1680         Unreviewed build fix.
1681
1682         * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
1683
1684 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
1685
1686         Unreviewed, fix Ubuntu LTS build
1687         https://bugs.webkit.org/show_bug.cgi?id=174490
1688
1689         * glib/SessionHostGlib.cpp:
1690
1691 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
1692
1693         [CMake] Properly test if compiler supports compiler flags
1694         https://bugs.webkit.org/show_bug.cgi?id=174490
1695
1696         Reviewed by Konstantin Tokarev.
1697
1698         * WebDriverService.cpp:
1699         (WebDriver::WebDriverService::run):
1700         * glib/SessionHostGlib.cpp:
1701
1702 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
1703
1704         Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
1705         https://bugs.webkit.org/show_bug.cgi?id=175261
1706
1707         Reviewed by Brian Burg.
1708
1709         * CommandResult.cpp:
1710         (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
1711
1712 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
1713
1714         WebDriver: implement unhandled prompt behavior
1715         https://bugs.webkit.org/show_bug.cgi?id=175184
1716
1717         Reviewed by Brian Burg.
1718
1719         Handle user prompts before running some of the commands according to the specification.
1720
1721         * Capabilities.h: Add UnhandledPromptBehavior capability.
1722         * CommandResult.cpp:
1723         (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
1724         (WebDriver::CommandResult::errorString const): Ditto.
1725         * CommandResult.h:
1726         (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
1727         as part of the result error message.
1728         (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
1729         * Session.cpp:
1730         (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
1731         on the unhandled prompt behavior.
1732         (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
1733         including the alert text as additional error data.
1734         (WebDriver::Session::go): Handle user prompts before running the command.
1735         (WebDriver::Session::getCurrentURL): Ditto.
1736         (WebDriver::Session::back): Ditto.
1737         (WebDriver::Session::forward): Ditto.
1738         (WebDriver::Session::refresh): Ditto.
1739         (WebDriver::Session::getTitle): Ditto.
1740         (WebDriver::Session::closeWindow): Ditto.
1741         (WebDriver::Session::switchToFrame): Ditto.
1742         (WebDriver::Session::switchToParentFrame): Ditto.
1743         (WebDriver::Session::isElementSelected): Ditto.
1744         (WebDriver::Session::getElementText): Ditto.
1745         (WebDriver::Session::getElementTagName): Ditto.
1746         (WebDriver::Session::getElementRect): Ditto.
1747         (WebDriver::Session::isElementEnabled): Ditto.
1748         (WebDriver::Session::isElementDisplayed): Ditto.
1749         (WebDriver::Session::getElementAttribute): Ditto.
1750         (WebDriver::Session::elementSendKeys): Ditto.
1751         (WebDriver::Session::elementSubmit): Ditto.
1752         (WebDriver::Session::executeScript): Ditto.
1753         * Session.h:
1754         * WebDriverService.cpp:
1755         (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
1756         (WebDriver::deserializeUnhandledPromptBehavior):
1757         (WebDriver::WebDriverService::parseCapabilities const):
1758         (WebDriver::WebDriverService::validatedCapabilities const):
1759         (WebDriver::WebDriverService::newSession):
1760
1761 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
1762
1763         WebDriver: implement user prompt commands
1764         https://bugs.webkit.org/show_bug.cgi?id=174614
1765
1766         Reviewed by Brian Burg.
1767
1768         * CommandResult.cpp:
1769         (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
1770         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
1771         (WebDriver::CommandResult::errorString const): Ditto.
1772         * CommandResult.h:
1773         * Session.cpp:
1774         (WebDriver::Session::dismissAlert):
1775         (WebDriver::Session::acceptAlert):
1776         (WebDriver::Session::getAlertText):
1777         (WebDriver::Session::sendAlertText):
1778         * Session.h:
1779         * WebDriverService.cpp:
1780         (WebDriver::WebDriverService::dismissAlert):
1781         (WebDriver::WebDriverService::acceptAlert):
1782         (WebDriver::WebDriverService::getAlertText):
1783         (WebDriver::WebDriverService::sendAlertText):
1784         * WebDriverService.h:
1785
1786 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1787
1788         [GTK][WPE] Add API to provide browser information required by automation
1789         https://bugs.webkit.org/show_bug.cgi?id=175130
1790
1791         Reviewed by Brian Burg.
1792
1793         * Session.cpp:
1794         (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
1795         with error in that case.
1796         * SessionHost.h:
1797         * glib/SessionHostGlib.cpp:
1798         (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
1799         been launched.
1800         (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
1801         capabilities and calling matchCapabilities() to match them.
1802         (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
1803         capabilities.
1804
1805 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1806
1807         WebDriver: Implement page load strategy
1808         https://bugs.webkit.org/show_bug.cgi?id=175183
1809
1810         Reviewed by Brian Burg.
1811
1812         Validate and parse page load strategy when processing capabilities.
1813
1814         * Capabilities.h:
1815         * Session.cpp:
1816         (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
1817         passed to Automation.
1818         (WebDriver::Session::go): Pass page load strategy if present.
1819         (WebDriver::Session::back): Ditto.
1820         (WebDriver::Session::forward): Ditto.
1821         (WebDriver::Session::refresh): Ditto.
1822         (WebDriver::Session::waitForNavigationToComplete): Ditto.
1823         * Session.h:
1824         * WebDriverService.cpp:
1825         (WebDriver::deserializePageLoadStrategy):
1826         (WebDriver::WebDriverService::parseCapabilities const):
1827         (WebDriver::WebDriverService::validatedCapabilities const):
1828         (WebDriver::WebDriverService::newSession):
1829
1830 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1831
1832         Unreviewed. Try to fix build with clang after r220315.
1833
1834         * WebDriverService.cpp:
1835         (WebDriver::WebDriverService::validatedCapabilities const):
1836         (WebDriver::WebDriverService::mergeCapabilities const):
1837
1838 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1839
1840         WebDriver: properly handle capabilities and process firstMatch too
1841         https://bugs.webkit.org/show_bug.cgi?id=174618
1842
1843         Reviewed by Brian Burg.
1844
1845         Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
1846         capabilities.
1847
1848         7.2 Processing Capabilities.
1849         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1850
1851         * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
1852         * Session.h:
1853         * WebDriverService.cpp:
1854         (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
1855         (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
1856         so we just need to get them without checking the value type.
1857         (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
1858         values are the expected one.
1859         (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
1860         single object ensuring that the same capability is not in both.
1861         (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
1862         expected capabilities.
1863         (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
1864         (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
1865         capabilities and add all capabilities to the command result.
1866         (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
1867         * WebDriverService.h:
1868         * glib/SessionHostGlib.cpp:
1869         (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
1870         (WebDriver::SessionHost::startAutomationSession): Add FIXME.
1871         * gtk/WebDriverServiceGtk.cpp:
1872         (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
1873         (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
1874         (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
1875         (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
1876         (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
1877         validated before.
1878
1879 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1880
1881         WebDriver: use in-view center point for clicks instead of bounding box center point
1882         https://bugs.webkit.org/show_bug.cgi?id=174863
1883
1884         Reviewed by Simon Fraser.
1885
1886         The center of the element bounding box is not always part of the element, like in multiline links, for example.
1887
1888         11.1 Element Interactability.
1889         https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
1890
1891         * CommandResult.cpp:
1892         (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
1893         (WebDriver::CommandResult::errorString): Ditto.
1894         * CommandResult.h: Ditto.
1895         * Session.cpp:
1896         (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
1897         (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
1898         (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
1899         * Session.h:
1900
1901 2017-08-01  Michael Catanzaro  <mcatanzaro@igalia.com>
1902
1903         [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
1904         https://bugs.webkit.org/show_bug.cgi?id=174855
1905
1906         Reviewed by Carlos Garcia Campos.
1907
1908         Don't create derived sources directory here anymore.
1909
1910         * PlatformGTK.cmake:
1911
1912 2017-07-26  Carlos Garcia Campos  <cgarcia@igalia.com>
1913
1914         Unreviewed. Fix GTK distcheck.
1915
1916         Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
1917
1918         * PlatformGTK.cmake:
1919
1920 2017-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
1921
1922         WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
1923         https://bugs.webkit.org/show_bug.cgi?id=174783
1924
1925         Reviewed by Brian Burg.
1926
1927         We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
1928         current browsing context, and the spec also refers to it as the current browsing context, so better use
1929         m_currentBrowsingContext.
1930
1931         * Session.cpp:
1932         (WebDriver::Session::switchToTopLevelBrowsingContext):
1933         (WebDriver::Session::switchToBrowsingContext):
1934         (WebDriver::Session::switchToFrame):
1935         (WebDriver::Session::switchToParentFrame):
1936         (WebDriver::Session::computeElementLayout):
1937         (WebDriver::Session::findElements):
1938         (WebDriver::Session::isElementSelected):
1939         (WebDriver::Session::getElementText):
1940         (WebDriver::Session::getElementTagName):
1941         (WebDriver::Session::isElementEnabled):
1942         (WebDriver::Session::isElementDisplayed):
1943         (WebDriver::Session::getElementAttribute):
1944         (WebDriver::Session::waitForNavigationToComplete):
1945         (WebDriver::Session::elementClear):
1946         (WebDriver::Session::elementSendKeys):
1947         (WebDriver::Session::elementSubmit):
1948         (WebDriver::Session::executeScript):
1949         * Session.h:
1950
1951 2017-07-20  Carlos Garcia Campos  <cgarcia@igalia.com>
1952
1953         WebDriver: implement page load timeout
1954         https://bugs.webkit.org/show_bug.cgi?id=174672
1955
1956         Reviewed by Brian Burg.
1957
1958         Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
1959         commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
1960         instead of the one in the spec.
1961
1962         8. Sessions
1963         https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
1964
1965         * CommandResult.cpp:
1966         (WebDriver::CommandResult::CommandResult):
1967         (WebDriver::CommandResult::httpStatusCode):
1968         (WebDriver::CommandResult::errorString):
1969         * CommandResult.h:
1970         * Session.cpp:
1971         (WebDriver::Session::go):
1972         (WebDriver::Session::back):
1973         (WebDriver::Session::forward):
1974         (WebDriver::Session::refresh):
1975         (WebDriver::Session::waitForNavigationToComplete):
1976         * WebDriverService.cpp:
1977         (WebDriver::WebDriverService::setTimeouts):
1978
1979 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
1980
1981         WebDriver: wait until navigation is complete before running new commands and after a click
1982         https://bugs.webkit.org/show_bug.cgi?id=174670
1983
1984         Reviewed by Brian Burg.
1985
1986         We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
1987         the spec says we should always wait before executing a new command and also after a click. This is causing test
1988         testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
1989         + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
1990         the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
1991         most of the times.
1992
1993         6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
1994         jump to step 1 in this overall algorithm, otherwise continue.
1995         https://www.w3.org/TR/webdriver/#processing-model
1996
1997         14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
1998         value if it is an error. 2. Try to wait for navigation to complete.
1999         https://www.w3.org/TR/webdriver/#element-click
2000
2001         * Session.cpp:
2002         (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
2003         wait for any pending navigation of current browsing context to complete.
2004         (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
2005         * Session.h:
2006         * WebDriverService.cpp:
2007         (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
2008         (WebDriver::WebDriverService::getCurrentURL): Ditto.
2009         (WebDriver::WebDriverService::back): Ditto.
2010         (WebDriver::WebDriverService::forward): Ditto.
2011         (WebDriver::WebDriverService::refresh): Ditto.
2012         (WebDriver::WebDriverService::getTitle): Ditto.
2013         (WebDriver::WebDriverService::switchToFrame): Ditto.
2014         (WebDriver::WebDriverService::switchToParentFrame): Ditto.
2015         (WebDriver::WebDriverService::findElement): Ditto.
2016         (WebDriver::WebDriverService::findElements): Ditto.
2017         (WebDriver::WebDriverService::executeScript): Ditto.
2018         (WebDriver::WebDriverService::executeAsyncScript): Ditto.
2019
2020 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
2021
2022         WebDriver: correctly handle main frame handles
2023         https://bugs.webkit.org/show_bug.cgi?id=174668
2024
2025         Reviewed by Brian Burg.
2026
2027         When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
2028         that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
2029         are currently considering empty strings as valid browsing context. It's not a big deal because Automation
2030         converts back the empty string received to the main frame, though. We should also ensure we close the current
2031         browsing context when switching to a new top level browsing context. This patch adds to helper private methods
2032         to switch browsing contexts that deal with the special cases.
2033
2034         * Session.cpp:
2035         (WebDriver::Session::close):
2036         (WebDriver::Session::switchToTopLevelBrowsingContext):
2037         (WebDriver::Session::switchToBrowsingContext):
2038         (WebDriver::Session::createTopLevelBrowsingContext):
2039         (WebDriver::Session::go):
2040         (WebDriver::Session::back):
2041         (WebDriver::Session::forward):
2042         (WebDriver::Session::refresh):
2043         (WebDriver::Session::switchToWindow):
2044         (WebDriver::Session::switchToFrame):
2045         (WebDriver::Session::switchToParentFrame):
2046         * Session.h:
2047
2048 2017-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
2049
2050         WebDriver: handle invalid selector errors
2051         https://bugs.webkit.org/show_bug.cgi?id=174619
2052
2053         Reviewed by Brian Burg.
2054
2055         Add InvalidSelector error and handle it in case of protocol server error.
2056
2057         * CommandResult.cpp:
2058         (WebDriver::CommandResult::CommandResult):
2059         (WebDriver::CommandResult::httpStatusCode):
2060         (WebDriver::CommandResult::errorString):
2061         * CommandResult.h:
2062
2063 2017-07-18  Carlos Alberto Lopez Perez  <clopez@igalia.com>
2064
2065         [GTK] Fix build with Clang after r219605.
2066         https://bugs.webkit.org/show_bug.cgi?id=166682
2067
2068         Unreviewed build fix.
2069
2070         Clang-3.8 complains with the following error:
2071         non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
2072
2073         * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
2074
2075 2017-07-13  Carlos Garcia Campos  <cgarcia@igalia.com>
2076
2077         Add initial implementation of WebDriver process to run the HTTP server
2078         https://bugs.webkit.org/show_bug.cgi?id=166682
2079
2080         Reviewed by Brian Burg.
2081
2082         Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
2083         cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
2084         the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
2085         libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
2086         inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
2087         using the official selenium python tests as reference.
2088
2089         * CMakeLists.txt: Added.
2090         * Capabilities.h: Added.
2091         * CommandResult.cpp: Added.
2092         * CommandResult.h: Added.
2093         * HTTPServer.cpp: Added.
2094         * HTTPServer.h: Added.
2095         * PlatformGTK.cmake: Added.
2096         * Session.cpp: Added.
2097         * Session.h: Added.
2098         * SessionHost.cpp: Added.
2099         * SessionHost.h: Added.
2100         * WebDriverMain.cpp: Added.
2101         * WebDriverService.cpp: Added.
2102         * WebDriverService.h: Added.
2103         * config.h: Added.
2104         * glib/SessionHostGlib.cpp: Added.
2105         * gtk/WebDriverServiceGtk.cpp: Added.
2106         * soup/HTTPServerSoup.cpp: Added.