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