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