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