[WPE] Add initial support for WebDriver
[WebKit-https.git] / Source / WebDriver / ChangeLog
1 2017-11-15  Carlos Garcia Campos  <cgarcia@igalia.com>
2
3         [WPE] Add initial support for WebDriver
4         https://bugs.webkit.org/show_bug.cgi?id=179727
5
6         Reviewed by Michael Catanzaro.
7
8         Add WPE implementation for platform-specific methods. Move the version handling to a common file
9         WebDriverServiceGLib.cpp.
10
11         * Capabilities.h:
12         * PlatformGTK.cmake:
13         * PlatformWPE.cmake:
14         * glib/WebDriverServiceGLib.cpp: Added.
15         (WebDriver::parseVersion):
16         (WebDriver::WebDriverService::platformCompareBrowserVersions):
17         * gtk/WebDriverServiceGtk.cpp:
18         * wpe/WebDriverServiceWPE.cpp: Copied from Source/WebDriver/gtk/WebDriverServiceGtk.cpp.
19         (WebDriver::WebDriverService::platformCapabilities):
20         (WebDriver::WebDriverService::platformValidateCapability const):
21         (WebDriver::WebDriverService::platformMatchCapability const):
22         (WebDriver::WebDriverService::platformParseCapabilities const):
23
24 2017-11-15  Ryan Haddad  <ryanhaddad@apple.com>
25
26         Unreviewed, rolling out r224863.
27
28         Introduced LayoutTest crashes on iOS Simulator.
29
30         Reverted changeset:
31
32         "Move JSONValues to WTF and convert uses of InspectorValues.h
33         to JSONValues.h"
34         https://bugs.webkit.org/show_bug.cgi?id=173793
35         https://trac.webkit.org/changeset/224863
36
37 2017-11-14  Carlos Garcia Campos  <cgarcia@igalia.com>
38
39         Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
40         https://bugs.webkit.org/show_bug.cgi?id=173793
41
42         Reviewed by Brian Burg.
43
44         * CMakeLists.txt:
45         * CommandResult.cpp:
46         (WebDriver::CommandResult::CommandResult):
47         * CommandResult.h:
48         (WebDriver::CommandResult::success):
49         (WebDriver::CommandResult::fail):
50         (WebDriver::CommandResult::result const):
51         (WebDriver::CommandResult::setAdditionalErrorData):
52         (WebDriver::CommandResult::additionalErrorData const):
53         * Session.cpp:
54         (WebDriver::firstWindowHandleInResult):
55         (WebDriver::Session::handleUserPrompts):
56         (WebDriver::Session::reportUnexpectedAlertOpen):
57         (WebDriver::Session::go):
58         (WebDriver::Session::getCurrentURL):
59         (WebDriver::Session::back):
60         (WebDriver::Session::forward):
61         (WebDriver::Session::refresh):
62         (WebDriver::Session::getTitle):
63         (WebDriver::Session::getWindowHandle):
64         (WebDriver::Session::closeTopLevelBrowsingContext):
65         (WebDriver::Session::switchToWindow):
66         (WebDriver::Session::getWindowHandles):
67         (WebDriver::Session::switchToFrame):
68         (WebDriver::Session::switchToParentFrame):
69         (WebDriver::Session::getToplevelBrowsingContextRect):
70         (WebDriver::Session::moveToplevelBrowsingContextWindow):
71         (WebDriver::Session::resizeToplevelBrowsingContextWindow):
72         (WebDriver::Session::createElement):
73         (WebDriver::Session::extractElement):
74         (WebDriver::Session::extractElementID):
75         (WebDriver::Session::computeElementLayout):
76         (WebDriver::Session::findElements):
77         (WebDriver::Session::isElementSelected):
78         (WebDriver::Session::getElementText):
79         (WebDriver::Session::getElementTagName):
80         (WebDriver::Session::getElementRect):
81         (WebDriver::Session::isElementEnabled):
82         (WebDriver::Session::isElementDisplayed):
83         (WebDriver::Session::getElementAttribute):
84         (WebDriver::Session::waitForNavigationToComplete):
85         (WebDriver::Session::selectOptionElement):
86         (WebDriver::Session::elementClick):
87         (WebDriver::Session::elementClear):
88         (WebDriver::Session::elementSendKeys):
89         (WebDriver::Session::elementSubmit):
90         (WebDriver::Session::handleScriptResult):
91         (WebDriver::Session::executeScript):
92         (WebDriver::Session::performMouseInteraction):
93         (WebDriver::Session::performKeyboardInteractions):
94         (WebDriver::parseAutomationCookie):
95         (WebDriver::builtAutomationCookie):
96         (WebDriver::serializeCookie):
97         (WebDriver::Session::getAllCookies):
98         (WebDriver::Session::getNamedCookie):
99         (WebDriver::Session::addCookie):
100         (WebDriver::Session::deleteCookie):
101         (WebDriver::Session::deleteAllCookies):
102         (WebDriver::Session::dismissAlert):
103         (WebDriver::Session::acceptAlert):
104         (WebDriver::Session::getAlertText):
105         (WebDriver::Session::sendAlertText):
106         (WebDriver::Session::takeScreenshot):
107         * Session.h:
108         * SessionHost.cpp:
109         (WebDriver::SessionHost::sendCommandToBackend):
110         (WebDriver::SessionHost::dispatchMessage):
111         * SessionHost.h:
112         * WebDriverService.cpp:
113         (WebDriver::WebDriverService::handleRequest):
114         (WebDriver::WebDriverService::sendResponse const):
115         (WebDriver::deserializeTimeouts):
116         (WebDriver::WebDriverService::parseCapabilities const):
117         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
118         (WebDriver::WebDriverService::validatedCapabilities const):
119         (WebDriver::WebDriverService::mergeCapabilities const):
120         (WebDriver::WebDriverService::matchCapabilities const):
121         (WebDriver::WebDriverService::processCapabilities const):
122         (WebDriver::WebDriverService::newSession):
123         (WebDriver::WebDriverService::deleteSession):
124         (WebDriver::WebDriverService::setTimeouts):
125         (WebDriver::WebDriverService::go):
126         (WebDriver::WebDriverService::getCurrentURL):
127         (WebDriver::WebDriverService::back):
128         (WebDriver::WebDriverService::forward):
129         (WebDriver::WebDriverService::refresh):
130         (WebDriver::WebDriverService::getTitle):
131         (WebDriver::WebDriverService::getWindowHandle):
132         (WebDriver::WebDriverService::getWindowRect):
133         (WebDriver::valueAsNumberInRange):
134         (WebDriver::WebDriverService::setWindowRect):
135         (WebDriver::WebDriverService::closeWindow):
136         (WebDriver::WebDriverService::switchToWindow):
137         (WebDriver::WebDriverService::getWindowHandles):
138         (WebDriver::WebDriverService::switchToFrame):
139         (WebDriver::WebDriverService::switchToParentFrame):
140         (WebDriver::findElementOrCompleteWithError):
141         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
142         (WebDriver::WebDriverService::findElement):
143         (WebDriver::WebDriverService::findElements):
144         (WebDriver::WebDriverService::findElementFromElement):
145         (WebDriver::WebDriverService::findElementsFromElement):
146         (WebDriver::WebDriverService::isElementSelected):
147         (WebDriver::WebDriverService::getElementAttribute):
148         (WebDriver::WebDriverService::getElementText):
149         (WebDriver::WebDriverService::getElementTagName):
150         (WebDriver::WebDriverService::getElementRect):
151         (WebDriver::WebDriverService::isElementEnabled):
152         (WebDriver::WebDriverService::isElementDisplayed):
153         (WebDriver::WebDriverService::elementClick):
154         (WebDriver::WebDriverService::elementClear):
155         (WebDriver::WebDriverService::elementSendKeys):
156         (WebDriver::WebDriverService::elementSubmit):
157         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
158         (WebDriver::WebDriverService::executeScript):
159         (WebDriver::WebDriverService::executeAsyncScript):
160         (WebDriver::WebDriverService::getAllCookies):
161         (WebDriver::WebDriverService::getNamedCookie):
162         (WebDriver::deserializeCookie):
163         (WebDriver::WebDriverService::addCookie):
164         (WebDriver::WebDriverService::deleteCookie):
165         (WebDriver::WebDriverService::deleteAllCookies):
166         (WebDriver::WebDriverService::dismissAlert):
167         (WebDriver::WebDriverService::acceptAlert):
168         (WebDriver::WebDriverService::getAlertText):
169         (WebDriver::WebDriverService::sendAlertText):
170         (WebDriver::WebDriverService::takeScreenshot):
171         (WebDriver::WebDriverService::takeElementScreenshot):
172         * WebDriverService.h:
173         * gtk/WebDriverServiceGtk.cpp:
174         (WebDriver::WebDriverService::platformValidateCapability const):
175         (WebDriver::WebDriverService::platformMatchCapability const):
176         (WebDriver::WebDriverService::platformParseCapabilities const):
177
178 2017-11-07  Brian Burg  <bburg@apple.com>
179
180         Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
181         https://bugs.webkit.org/show_bug.cgi?id=179129
182         <rdar://problem/35297038>
183
184         Reviewed by Simon Fraser.
185
186         Adjust code to use the proper coordinate system when requesting element layout.
187
188         * Session.cpp:
189         (WebDriver::Session::computeElementLayout):
190
191 2017-11-09  Carlos Garcia Campos  <cgarcia@igalia.com>
192
193         WebDriver: WebDriverService::matchCapabilities should follow the spec
194         https://bugs.webkit.org/show_bug.cgi?id=179371
195
196         Reviewed by Brian Burg.
197
198         The returned object should contain all the entries mentioned in the spec, not only the ones already present in
199         the passed in capabilities object.
200
201         7.2 Processing Capabilities
202         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-matching-capabilities
203
204         * WebDriverService.cpp:
205         (WebDriver::WebDriverService::matchCapabilities const):
206         (WebDriver::WebDriverService::processCapabilities const):
207         * WebDriverService.h:
208
209 2017-11-09  Carlos Garcia Campos  <cgarcia@igalia.com>
210
211         WebDriver: capabilities with null value shouldn't be added to the validated capabilities object
212         https://bugs.webkit.org/show_bug.cgi?id=179369
213
214         Reviewed by Brian Burg.
215
216         "4. If deserialized is not null, set a property on result with name name and value deserialized."
217
218         7.2 Processing Capabilities
219         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
220
221         Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[platformName-None]
222
223         * WebDriverService.cpp:
224         (WebDriver::WebDriverService::validatedCapabilities const):
225
226 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
227
228         WebDriver: unknown capabilities should produce an InvalidArgument error when validating capabilities
229         https://bugs.webkit.org/show_bug.cgi?id=178868
230
231         Reviewed by Brian Burg.
232
233         7.2 Processing Capabilities
234         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
235
236         Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_extensions
237
238         * WebDriverService.cpp:
239         (WebDriver::WebDriverService::validatedCapabilities const):
240
241 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
242
243         WebDriver: deserializeTimeouts should fail if the value is not integer
244         https://bugs.webkit.org/show_bug.cgi?id=178866
245
246         Reviewed by Brian Burg.
247
248         If value is not an integer, or it is less than 0 or greater than 2^64 – 1, return error with error code invalid
249         argument.
250         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-deserialize-as-a-timeout
251
252         Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body0]
253                imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body1]
254
255         * WebDriverService.cpp:
256         (WebDriver::deserializeTimeouts):
257
258 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
259
260         WebDriver: failing to process capabilities should produce InvalidArgument error not SessionNotCreated
261         https://bugs.webkit.org/show_bug.cgi?id=178864
262
263         Reviewed by Brian Burg.
264
265         Fixes most of the tests in imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py.
266
267         7.2 Processing Capabilities
268         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
269
270         * WebDriverService.cpp:
271         (WebDriver::WebDriverService::processCapabilities const):
272
273 2017-10-10  Sam Weinig  <sam@webkit.org>
274
275         Replace copyKeysToVector/copyValuesToVector with copyToVector(map.keys())/copyToVector(map.values())
276         https://bugs.webkit.org/show_bug.cgi?id=178102
277
278         Reviewed by Tim Horton.
279
280         * SessionHost.cpp:
281         (WebDriver::SessionHost::inspectorDisconnected):
282
283 2017-10-02  Carlos Garcia Campos  <cgarcia@igalia.com>
284
285         WebDriver: HTTP status code is not correct for some of the errors
286         https://bugs.webkit.org/show_bug.cgi?id=177354
287
288         Reviewed by Brian Burg.
289
290         I think this changed in the spec at some point. The thing is that no such alert, frame and window and stale
291         element reference errors should return 404 instead of 400.
292
293         https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
294
295         * CommandResult.cpp:
296         (WebDriver::CommandResult::httpStatusCode const):
297
298 2017-09-19  Carlos Garcia Campos  <cgarcia@igalia.com>
299
300         WebDriver: Implement commands to get and set the window rect
301         https://bugs.webkit.org/show_bug.cgi?id=177134
302
303         Reviewed by Brian Burg.
304
305         We are currently implementing the selenium legacy ones, we should implement the w3c ones instead.
306
307         https://w3c.github.io/webdriver/webdriver-spec.html#resizing-and-positioning-windows
308
309         * Session.cpp:
310         (WebDriver::Session::getToplevelBrowsingContextRect): Helper to get the window rect. This is used by both get
311         and set window rect commands.
312         (WebDriver::Session::moveToplevelBrowsingContextwindow): Helper to ask automation to move the window.
313         (WebDriver::Session::resizeToplevelBrowsingContextwindow): Helper to ask automation to resize the window.
314         (WebDriver::Session::getWindowRect): Handle prompts and then call getToplevelBrowsingContextRect().
315         (WebDriver::Session::setWindowRect): Handle prompts and then move and resize the window according to the given
316         parameters and finish the operation calling getToplevelBrowsingContextRect().
317         * Session.h:
318         * WebDriverService.cpp:
319         (WebDriver::WebDriverService::getWindowRect): Ask the session to get the window rect.
320         (WebDriver::valueAsNumberInRange): Helper to check a value is a valid number in the given range.
321         (WebDriver::WebDriverService::setWindowRect): Get and check size and position from parameters and then ask the
322         session to set the window rect.
323         * WebDriverService.h:
324
325 2017-09-19  Carlos Garcia Campos  <cgarcia@igalia.com>
326
327         WebDriver: wrong response in case of errors
328         https://bugs.webkit.org/show_bug.cgi?id=177127
329
330         Reviewed by Brian Burg.
331
332         I misunderstood the spec when I implemented this, so we either return a "value" key with the result in case of
333         success or the error object as the body in case of error. We should always add a "value" key to the body and set
334         it with either the result or the error object.
335
336         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-an-error
337
338         * WebDriverService.cpp:
339         (WebDriver::WebDriverService::sendResponse const):
340
341 2017-09-18  Carlos Garcia Campos  <cgarcia@igalia.com>
342
343         WebDriver: wrong key name for capabilities in new session response
344         https://bugs.webkit.org/show_bug.cgi?id=177074
345
346         Reviewed by Brian Burg.
347
348         We are using "value", it should be "capabilities".
349         https://w3c.github.io/webdriver/webdriver-spec.html#new-session
350
351         * WebDriverService.cpp:
352         (WebDriver::WebDriverService::newSession):
353
354 2017-09-18  Carlos Garcia Campos  <cgarcia@igalia.com>
355
356         WebDriver: HTTP responses should include Cache-Control header with no-cache value
357         https://bugs.webkit.org/show_bug.cgi?id=177073
358
359         Reviewed by Sergio Villar Senin.
360
361         6.3 Processing Model.
362         Set the response’s header with name and value with the following values:
363
364         Content-Type "application/json; charset=utf-8"
365         Cache-Control "no-cache"
366
367         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-a-response
368
369         We were setting the Content-Type, but not the Cache-Control. This is checked by all WPT WebDriver tests.
370
371         * soup/HTTPServerSoup.cpp:
372         (WebDriver::HTTPServer::listen): Add Cache-Control header.
373
374 2017-09-18  Michael Catanzaro  <mcatanzaro@igalia.com>
375
376         [CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
377         https://bugs.webkit.org/show_bug.cgi?id=174558
378
379         Reviewed by Alex Christensen.
380
381         * CMakeLists.txt:
382
383 2017-09-15  JF Bastien  <jfbastien@apple.com>
384
385         WTF: use Forward.h when appropriate instead of Vector.h
386         https://bugs.webkit.org/show_bug.cgi?id=176984
387
388         Reviewed by Saam Barati.
389
390         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.
391
392         * Session.h:
393
394 2017-09-09  Carlos Garcia Campos  <cgarcia@igalia.com>
395
396         WebDriver: ensure we close all windows handles when closing the session
397         https://bugs.webkit.org/show_bug.cgi?id=176508
398
399         Reviewed by Brian Burg.
400
401         The spec says that when closing the session all top level browsing contexts should be closed. We are currently
402         checking if we have an active top level browsing context and then we try to close it before trying with the
403         rest. It can happen that we are in an inconsistent state, for example if the current top level browsing context
404         has been closed by JavaScript or another action and the user didn't switch to another one before closing the
405         session. In such case, closing the session will fail with NoSuchwindow and any other window open will not be
406         closed. It's safer to always ask for all window handles and close them, which is what the spec says too.
407
408         * Session.cpp:
409         (WebDriver::firstWindowHandleInResult): Helper class to get the first window handle in the result array.
410         (WebDriver::Session::closeAllToplevelBrowsingContexts): Use firstWindowHandleInResult().
411         (WebDriver::Session::close): Close the current top level browsing context and get all window handles to close
412         them all if needed.
413
414 2017-08-28  Carlos Garcia Campos  <cgarcia@igalia.com>
415
416         WebDriver: implement screen capture commands
417         https://bugs.webkit.org/show_bug.cgi?id=174615
418
419         Reviewed by Brian Burg.
420
421         Implement takeScreenshot and takeElementScreenshot commands.
422
423         19. Screen Capture.
424         https://w3c.github.io/webdriver/webdriver-spec.html#screen-capture
425
426         * CommandResult.cpp:
427         (WebDriver::CommandResult::CommandResult): Handle ScreenshotError protocol error.
428         (WebDriver::CommandResult::httpStatusCode const): Add UnableToCaptureScreen.
429         (WebDriver::CommandResult::errorString const): Ditto.
430         * CommandResult.h:
431         * Session.cpp:
432         (WebDriver::Session::takeScreenshot):
433         * Session.h:
434         * WebDriverService.cpp:
435         (WebDriver::WebDriverService::takeScreenshot):
436         (WebDriver::WebDriverService::takeElementScreenshot):
437         * WebDriverService.h:
438
439 2017-08-28  Carlos Garcia Campos  <cgarcia@igalia.com>
440
441         WebDriver: implement cookies commands
442         https://bugs.webkit.org/show_bug.cgi?id=174613
443
444         Reviewed by Brian Burg.
445
446         Add cookies commands.
447
448         16. Cookies.
449         https://w3c.github.io/webdriver/webdriver-spec.html#cookies
450
451         * CommandResult.cpp:
452         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
453         (WebDriver::CommandResult::errorString const): Ditto.
454         * CommandResult.h:
455         * Session.cpp:
456         (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
457         (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
458         (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
459         (WebDriver::Session::getAllCookies):
460         (WebDriver::Session::getNamedCookie):
461         (WebDriver::Session::addCookie):
462         (WebDriver::Session::deleteCookie):
463         (WebDriver::Session::deleteAllCookies):
464         * Session.h:
465         * WebDriverService.cpp:
466         (WebDriver::WebDriverService::getAllCookies):
467         (WebDriver::WebDriverService::getNamedCookie):
468         (WebDriver::deserializeCookie):
469         (WebDriver::WebDriverService::addCookie):
470         (WebDriver::WebDriverService::deleteCookie):
471         (WebDriver::WebDriverService::deleteAllCookies):
472         * WebDriverService.h:
473
474 2017-07-28  Carlos Garcia Campos  <cgarcia@igalia.com>
475
476         WebDriver: fix return value of close window command
477         https://bugs.webkit.org/show_bug.cgi?id=174861
478
479         Reviewed by Brian Burg.
480
481         We are currently returning null, but we should return the list of window handles, and try to close the session
482         if there aren't more window handles.
483
484         10.2 Close Window
485         https://w3c.github.io/webdriver/webdriver-spec.html#close-window
486
487         3. If there are no more open top-level browsing contexts, then try to close the session.
488         4. Return the result of running the remote end steps for the Get Window Handles command.
489
490         * Session.cpp:
491         (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
492         context and the next one if there are more.
493         (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
494         the session.
495         (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
496         getWindowHandles() when done.
497         (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
498         (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
499         toplevel browsing context.
500         * Session.h:
501         * SessionHost.h:
502         * WebDriverService.cpp:
503         (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
504         (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
505         (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
506         * WebDriverService.h: Remove unused quit() method.
507         * glib/SessionHostGlib.cpp:
508         (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
509         (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
510
511 2017-08-14  Carlos Garcia Campos  <cgarcia@igalia.com>
512
513         WebDriver: handle click events on option elements
514         https://bugs.webkit.org/show_bug.cgi?id=174710
515         <rdar://problem/33459305>
516
517         Reviewed by Brian Burg.
518
519         Option elements are considered as a special case by the specification. When clicking an option element, we
520         should get its container and use it when scrolling into view and calculating in-view center point instead of the
521         option element itself. Then, we should not emulate a click, but change the selected status of the option element
522         like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
523         option to call selectOptionElement() or performMouseInteraction().
524
525         This fixes more than 20 selenium tests.
526
527         * CommandResult.cpp:
528         (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
529         (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
530         (WebDriver::CommandResult::errorString const): Ditto.
531         * CommandResult.h:
532         * Session.cpp:
533         (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
534         (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
535         the element is an option or not.
536         * Session.h:
537
538 2017-08-11  Carlos Alberto Lopez Perez  <clopez@igalia.com>
539
540         Fix build warning in WebDriverService.h
541         https://bugs.webkit.org/show_bug.cgi?id=166682
542
543         Unreviewed build fix.
544
545         * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
546
547 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
548
549         Unreviewed, fix Ubuntu LTS build
550         https://bugs.webkit.org/show_bug.cgi?id=174490
551
552         * glib/SessionHostGlib.cpp:
553
554 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
555
556         [CMake] Properly test if compiler supports compiler flags
557         https://bugs.webkit.org/show_bug.cgi?id=174490
558
559         Reviewed by Konstantin Tokarev.
560
561         * WebDriverService.cpp:
562         (WebDriver::WebDriverService::run):
563         * glib/SessionHostGlib.cpp:
564
565 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
566
567         Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
568         https://bugs.webkit.org/show_bug.cgi?id=175261
569
570         Reviewed by Brian Burg.
571
572         * CommandResult.cpp:
573         (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
574
575 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
576
577         WebDriver: implement unhandled prompt behavior
578         https://bugs.webkit.org/show_bug.cgi?id=175184
579
580         Reviewed by Brian Burg.
581
582         Handle user prompts before running some of the commands according to the specification.
583
584         * Capabilities.h: Add UnhandledPromptBehavior capability.
585         * CommandResult.cpp:
586         (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
587         (WebDriver::CommandResult::errorString const): Ditto.
588         * CommandResult.h:
589         (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
590         as part of the result error message.
591         (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
592         * Session.cpp:
593         (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
594         on the unhandled prompt behavior.
595         (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
596         including the alert text as additional error data.
597         (WebDriver::Session::go): Handle user prompts before running the command.
598         (WebDriver::Session::getCurrentURL): Ditto.
599         (WebDriver::Session::back): Ditto.
600         (WebDriver::Session::forward): Ditto.
601         (WebDriver::Session::refresh): Ditto.
602         (WebDriver::Session::getTitle): Ditto.
603         (WebDriver::Session::closeWindow): Ditto.
604         (WebDriver::Session::switchToFrame): Ditto.
605         (WebDriver::Session::switchToParentFrame): Ditto.
606         (WebDriver::Session::isElementSelected): Ditto.
607         (WebDriver::Session::getElementText): Ditto.
608         (WebDriver::Session::getElementTagName): Ditto.
609         (WebDriver::Session::getElementRect): Ditto.
610         (WebDriver::Session::isElementEnabled): Ditto.
611         (WebDriver::Session::isElementDisplayed): Ditto.
612         (WebDriver::Session::getElementAttribute): Ditto.
613         (WebDriver::Session::elementSendKeys): Ditto.
614         (WebDriver::Session::elementSubmit): Ditto.
615         (WebDriver::Session::executeScript): Ditto.
616         * Session.h:
617         * WebDriverService.cpp:
618         (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
619         (WebDriver::deserializeUnhandledPromptBehavior):
620         (WebDriver::WebDriverService::parseCapabilities const):
621         (WebDriver::WebDriverService::validatedCapabilities const):
622         (WebDriver::WebDriverService::newSession):
623
624 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
625
626         WebDriver: implement user prompt commands
627         https://bugs.webkit.org/show_bug.cgi?id=174614
628
629         Reviewed by Brian Burg.
630
631         * CommandResult.cpp:
632         (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
633         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
634         (WebDriver::CommandResult::errorString const): Ditto.
635         * CommandResult.h:
636         * Session.cpp:
637         (WebDriver::Session::dismissAlert):
638         (WebDriver::Session::acceptAlert):
639         (WebDriver::Session::getAlertText):
640         (WebDriver::Session::sendAlertText):
641         * Session.h:
642         * WebDriverService.cpp:
643         (WebDriver::WebDriverService::dismissAlert):
644         (WebDriver::WebDriverService::acceptAlert):
645         (WebDriver::WebDriverService::getAlertText):
646         (WebDriver::WebDriverService::sendAlertText):
647         * WebDriverService.h:
648
649 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
650
651         [GTK][WPE] Add API to provide browser information required by automation
652         https://bugs.webkit.org/show_bug.cgi?id=175130
653
654         Reviewed by Brian Burg.
655
656         * Session.cpp:
657         (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
658         with error in that case.
659         * SessionHost.h:
660         * glib/SessionHostGlib.cpp:
661         (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
662         been launched.
663         (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
664         capabilities and calling matchCapabilities() to match them.
665         (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
666         capabilities.
667
668 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
669
670         WebDriver: Implement page load strategy
671         https://bugs.webkit.org/show_bug.cgi?id=175183
672
673         Reviewed by Brian Burg.
674
675         Validate and parse page load strategy when processing capabilities.
676
677         * Capabilities.h:
678         * Session.cpp:
679         (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
680         passed to Automation.
681         (WebDriver::Session::go): Pass page load strategy if present.
682         (WebDriver::Session::back): Ditto.
683         (WebDriver::Session::forward): Ditto.
684         (WebDriver::Session::refresh): Ditto.
685         (WebDriver::Session::waitForNavigationToComplete): Ditto.
686         * Session.h:
687         * WebDriverService.cpp:
688         (WebDriver::deserializePageLoadStrategy):
689         (WebDriver::WebDriverService::parseCapabilities const):
690         (WebDriver::WebDriverService::validatedCapabilities const):
691         (WebDriver::WebDriverService::newSession):
692
693 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
694
695         Unreviewed. Try to fix build with clang after r220315.
696
697         * WebDriverService.cpp:
698         (WebDriver::WebDriverService::validatedCapabilities const):
699         (WebDriver::WebDriverService::mergeCapabilities const):
700
701 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
702
703         WebDriver: properly handle capabilities and process firstMatch too
704         https://bugs.webkit.org/show_bug.cgi?id=174618
705
706         Reviewed by Brian Burg.
707
708         Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
709         capabilities.
710
711         7.2 Processing Capabilities.
712         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
713
714         * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
715         * Session.h:
716         * WebDriverService.cpp:
717         (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
718         (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
719         so we just need to get them without checking the value type.
720         (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
721         values are the expected one.
722         (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
723         single object ensuring that the same capability is not in both.
724         (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
725         expected capabilities.
726         (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
727         (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
728         capabilities and add all capabilities to the command result.
729         (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
730         * WebDriverService.h:
731         * glib/SessionHostGlib.cpp:
732         (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
733         (WebDriver::SessionHost::startAutomationSession): Add FIXME.
734         * gtk/WebDriverServiceGtk.cpp:
735         (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
736         (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
737         (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
738         (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
739         (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
740         validated before.
741
742 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
743
744         WebDriver: use in-view center point for clicks instead of bounding box center point
745         https://bugs.webkit.org/show_bug.cgi?id=174863
746
747         Reviewed by Simon Fraser.
748
749         The center of the element bounding box is not always part of the element, like in multiline links, for example.
750
751         11.1 Element Interactability.
752         https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
753
754         * CommandResult.cpp:
755         (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
756         (WebDriver::CommandResult::errorString): Ditto.
757         * CommandResult.h: Ditto.
758         * Session.cpp:
759         (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
760         (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
761         (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
762         * Session.h:
763
764 2017-08-01  Michael Catanzaro  <mcatanzaro@igalia.com>
765
766         [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
767         https://bugs.webkit.org/show_bug.cgi?id=174855
768
769         Reviewed by Carlos Garcia Campos.
770
771         Don't create derived sources directory here anymore.
772
773         * PlatformGTK.cmake:
774
775 2017-07-26  Carlos Garcia Campos  <cgarcia@igalia.com>
776
777         Unreviewed. Fix GTK distcheck.
778
779         Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
780
781         * PlatformGTK.cmake:
782
783 2017-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
784
785         WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
786         https://bugs.webkit.org/show_bug.cgi?id=174783
787
788         Reviewed by Brian Burg.
789
790         We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
791         current browsing context, and the spec also refers to it as the current browsing context, so better use
792         m_currentBrowsingContext.
793
794         * Session.cpp:
795         (WebDriver::Session::switchToTopLevelBrowsingContext):
796         (WebDriver::Session::switchToBrowsingContext):
797         (WebDriver::Session::switchToFrame):
798         (WebDriver::Session::switchToParentFrame):
799         (WebDriver::Session::computeElementLayout):
800         (WebDriver::Session::findElements):
801         (WebDriver::Session::isElementSelected):
802         (WebDriver::Session::getElementText):
803         (WebDriver::Session::getElementTagName):
804         (WebDriver::Session::isElementEnabled):
805         (WebDriver::Session::isElementDisplayed):
806         (WebDriver::Session::getElementAttribute):
807         (WebDriver::Session::waitForNavigationToComplete):
808         (WebDriver::Session::elementClear):
809         (WebDriver::Session::elementSendKeys):
810         (WebDriver::Session::elementSubmit):
811         (WebDriver::Session::executeScript):
812         * Session.h:
813
814 2017-07-20  Carlos Garcia Campos  <cgarcia@igalia.com>
815
816         WebDriver: implement page load timeout
817         https://bugs.webkit.org/show_bug.cgi?id=174672
818
819         Reviewed by Brian Burg.
820
821         Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
822         commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
823         instead of the one in the spec.
824
825         8. Sessions
826         https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
827
828         * CommandResult.cpp:
829         (WebDriver::CommandResult::CommandResult):
830         (WebDriver::CommandResult::httpStatusCode):
831         (WebDriver::CommandResult::errorString):
832         * CommandResult.h:
833         * Session.cpp:
834         (WebDriver::Session::go):
835         (WebDriver::Session::back):
836         (WebDriver::Session::forward):
837         (WebDriver::Session::refresh):
838         (WebDriver::Session::waitForNavigationToComplete):
839         * WebDriverService.cpp:
840         (WebDriver::WebDriverService::setTimeouts):
841
842 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
843
844         WebDriver: wait until navigation is complete before running new commands and after a click
845         https://bugs.webkit.org/show_bug.cgi?id=174670
846
847         Reviewed by Brian Burg.
848
849         We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
850         the spec says we should always wait before executing a new command and also after a click. This is causing test
851         testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
852         + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
853         the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
854         most of the times.
855
856         6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
857         jump to step 1 in this overall algorithm, otherwise continue.
858         https://www.w3.org/TR/webdriver/#processing-model
859
860         14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
861         value if it is an error. 2. Try to wait for navigation to complete.
862         https://www.w3.org/TR/webdriver/#element-click
863
864         * Session.cpp:
865         (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
866         wait for any pending navigation of current browsing context to complete.
867         (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
868         * Session.h:
869         * WebDriverService.cpp:
870         (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
871         (WebDriver::WebDriverService::getCurrentURL): Ditto.
872         (WebDriver::WebDriverService::back): Ditto.
873         (WebDriver::WebDriverService::forward): Ditto.
874         (WebDriver::WebDriverService::refresh): Ditto.
875         (WebDriver::WebDriverService::getTitle): Ditto.
876         (WebDriver::WebDriverService::switchToFrame): Ditto.
877         (WebDriver::WebDriverService::switchToParentFrame): Ditto.
878         (WebDriver::WebDriverService::findElement): Ditto.
879         (WebDriver::WebDriverService::findElements): Ditto.
880         (WebDriver::WebDriverService::executeScript): Ditto.
881         (WebDriver::WebDriverService::executeAsyncScript): Ditto.
882
883 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
884
885         WebDriver: correctly handle main frame handles
886         https://bugs.webkit.org/show_bug.cgi?id=174668
887
888         Reviewed by Brian Burg.
889
890         When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
891         that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
892         are currently considering empty strings as valid browsing context. It's not a big deal because Automation
893         converts back the empty string received to the main frame, though. We should also ensure we close the current
894         browsing context when switching to a new top level browsing context. This patch adds to helper private methods
895         to switch browsing contexts that deal with the special cases.
896
897         * Session.cpp:
898         (WebDriver::Session::close):
899         (WebDriver::Session::switchToTopLevelBrowsingContext):
900         (WebDriver::Session::switchToBrowsingContext):
901         (WebDriver::Session::createTopLevelBrowsingContext):
902         (WebDriver::Session::go):
903         (WebDriver::Session::back):
904         (WebDriver::Session::forward):
905         (WebDriver::Session::refresh):
906         (WebDriver::Session::switchToWindow):
907         (WebDriver::Session::switchToFrame):
908         (WebDriver::Session::switchToParentFrame):
909         * Session.h:
910
911 2017-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
912
913         WebDriver: handle invalid selector errors
914         https://bugs.webkit.org/show_bug.cgi?id=174619
915
916         Reviewed by Brian Burg.
917
918         Add InvalidSelector error and handle it in case of protocol server error.
919
920         * CommandResult.cpp:
921         (WebDriver::CommandResult::CommandResult):
922         (WebDriver::CommandResult::httpStatusCode):
923         (WebDriver::CommandResult::errorString):
924         * CommandResult.h:
925
926 2017-07-18  Carlos Alberto Lopez Perez  <clopez@igalia.com>
927
928         [GTK] Fix build with Clang after r219605.
929         https://bugs.webkit.org/show_bug.cgi?id=166682
930
931         Unreviewed build fix.
932
933         Clang-3.8 complains with the following error:
934         non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
935
936         * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
937
938 2017-07-13  Carlos Garcia Campos  <cgarcia@igalia.com>
939
940         Add initial implementation of WebDriver process to run the HTTP server
941         https://bugs.webkit.org/show_bug.cgi?id=166682
942
943         Reviewed by Brian Burg.
944
945         Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
946         cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
947         the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
948         libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
949         inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
950         using the official selenium python tests as reference.
951
952         * CMakeLists.txt: Added.
953         * Capabilities.h: Added.
954         * CommandResult.cpp: Added.
955         * CommandResult.h: Added.
956         * HTTPServer.cpp: Added.
957         * HTTPServer.h: Added.
958         * PlatformGTK.cmake: Added.
959         * Session.cpp: Added.
960         * Session.h: Added.
961         * SessionHost.cpp: Added.
962         * SessionHost.h: Added.
963         * WebDriverMain.cpp: Added.
964         * WebDriverService.cpp: Added.
965         * WebDriverService.h: Added.
966         * config.h: Added.
967         * glib/SessionHostGlib.cpp: Added.
968         * gtk/WebDriverServiceGtk.cpp: Added.
969         * soup/HTTPServerSoup.cpp: Added.