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