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