WebDriver: implement element property command
[WebKit-https.git] / Source / WebDriver / ChangeLog
1 2017-12-04  Carlos Garcia Campos  <cgarcia@igalia.com>
2
3         WebDriver: implement element property command
4         https://bugs.webkit.org/show_bug.cgi?id=180244
5
6         Reviewed by Brian Burg.
7
8         13.3 Get Element Property
9         https://w3c.github.io/webdriver/webdriver-spec.html#get-element-property
10
11         Fixes: imported/w3c/webdriver/tests/state/get_element_property.py::test_no_browsing_context
12                imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_dismiss
13                imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_accept
14                imported/w3c/webdriver/tests/state/get_element_property.py::test_handle_prompt_missing_value
15                imported/w3c/webdriver/tests/state/get_element_property.py::test_element_stale
16
17         * Session.cpp:
18         (WebDriver::Session::getElementAttribute):
19         (WebDriver::Session::getElementProperty):
20         * Session.h:
21         * WebDriverService.cpp:
22         (WebDriver::WebDriverService::getElementProperty):
23         * WebDriverService.h:
24
25 2017-12-02  Carlos Garcia Campos  <cgarcia@igalia.com>
26
27         WebDriver: handle user prompts shown while executing scripts
28         https://bugs.webkit.org/show_bug.cgi?id=179979
29
30         Reviewed by Brian Burg.
31
32         15.2 Executing Script
33         https://w3c.github.io/webdriver/webdriver-spec.html#executing-script
34
35         The rules to execute a function body are as follows. The algorithm will return success with the JSON
36         representation of the function’s return value, or an error if the evaluation of the function results in a
37         JavaScript exception being thrown or at any point during its execution an unhandled user prompt appears.
38
39         If at any point during the algorithm a user prompt appears, the user prompt handler must be invoked. If its
40         return value is an error, it must immediately return with that error and abort all subsequent substeps of this
41         algorithm.
42
43         This will be covered by new WPT tests that will be available after the next upgrade.
44
45         * CommandResult.cpp:
46         (WebDriver::CommandResult::CommandResult): Handle UnexpectedAlertOpen internal error.
47         * Session.cpp:
48         (WebDriver::Session::handleUserPrompts): Move code to handleUnexpectedAlertOpen() and call it instead.
49         (WebDriver::Session::handleUnexpectedAlertOpen): Code moved here to be used also by executeScript().
50         (WebDriver::Session::executeScript): In case of UnexpectedAlertOpen error, call handleUnexpectedAlertOpen().
51         * Session.h:
52
53 2017-12-01  Carlos Garcia Campos  <cgarcia@igalia.com>
54
55         WebDriver: implement status command
56         https://bugs.webkit.org/show_bug.cgi?id=180133
57
58         Reviewed by Brian Burg.
59
60         8.3 Status
61         https://w3c.github.io/webdriver/webdriver-spec.html#status
62
63         Fixes: imported/w3c/webdriver/tests/sessions/status.py::test_get_status_no_session
64                imported/w3c/webdriver/tests/sessions/status.py::test_status_with_session_running_on_endpoint_node
65
66         * WebDriverService.cpp:
67         (WebDriver::WebDriverService::status):
68         * WebDriverService.h:
69
70 2017-12-01  Carlos Garcia Campos  <cgarcia@igalia.com>
71
72         WebDriver: end point nodes are only allowed to have one session
73         https://bugs.webkit.org/show_bug.cgi?id=180131
74
75         Reviewed by Brian Burg.
76
77         We are currently keeping a map of sessions, but our service is always and end point node, so only one session
78         can exist at a time. Make findSessionOrCompleteWithError() return a boolean instead, failing in case the sessionID
79         parameter is not found or it doesn't match the current session. Replace the session map and active session
80         pointer with a single session member and return SessionNotCreated error when new session command is received and
81         there's an active session.
82
83         8. Sessions
84         A remote end has an associated maximum active sessions (an integer) that defines the number of active sessions
85         that are supported. This may be “unlimited” for intermediary nodes, but must be exactly one for a remote end
86         that is an endpoint node.
87         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-maximum-active-sessions
88
89         Fixes: imported/w3c/webdriver/tests/sessions/new_session/default_values.py::test_repeat_new_session
90
91         * WebDriverService.cpp:
92         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
93         (WebDriver::WebDriverService::newSession):
94         (WebDriver::WebDriverService::deleteSession):
95         (WebDriver::WebDriverService::status):
96         (WebDriver::WebDriverService::setTimeouts):
97         (WebDriver::WebDriverService::go):
98         (WebDriver::WebDriverService::getCurrentURL):
99         (WebDriver::WebDriverService::back):
100         (WebDriver::WebDriverService::forward):
101         (WebDriver::WebDriverService::refresh):
102         (WebDriver::WebDriverService::getTitle):
103         (WebDriver::WebDriverService::getWindowHandle):
104         (WebDriver::WebDriverService::setWindowRect):
105         (WebDriver::WebDriverService::closeWindow):
106         (WebDriver::WebDriverService::switchToWindow):
107         (WebDriver::WebDriverService::getWindowHandles):
108         (WebDriver::WebDriverService::switchToFrame):
109         (WebDriver::WebDriverService::switchToParentFrame):
110         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
111         (WebDriver::WebDriverService::findElement):
112         (WebDriver::WebDriverService::findElements):
113         (WebDriver::WebDriverService::findElementFromElement):
114         (WebDriver::WebDriverService::findElementsFromElement):
115         (WebDriver::WebDriverService::getActiveElement):
116         (WebDriver::WebDriverService::isElementSelected):
117         (WebDriver::WebDriverService::getElementAttribute):
118         (WebDriver::WebDriverService::getElementText):
119         (WebDriver::WebDriverService::getElementTagName):
120         (WebDriver::WebDriverService::getElementRect):
121         (WebDriver::WebDriverService::isElementEnabled):
122         (WebDriver::WebDriverService::isElementDisplayed):
123         (WebDriver::WebDriverService::elementClick):
124         (WebDriver::WebDriverService::elementClear):
125         (WebDriver::WebDriverService::elementSendKeys):
126         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
127         (WebDriver::WebDriverService::executeScript):
128         (WebDriver::WebDriverService::executeAsyncScript):
129         (WebDriver::WebDriverService::getAllCookies):
130         (WebDriver::WebDriverService::getNamedCookie):
131         (WebDriver::deserializeCookie):
132         (WebDriver::WebDriverService::addCookie):
133         (WebDriver::WebDriverService::deleteCookie):
134         (WebDriver::WebDriverService::deleteAllCookies):
135         (WebDriver::WebDriverService::dismissAlert):
136         (WebDriver::WebDriverService::acceptAlert):
137         (WebDriver::WebDriverService::getAlertText):
138         (WebDriver::WebDriverService::sendAlertText):
139         (WebDriver::WebDriverService::takeScreenshot):
140         (WebDriver::WebDriverService::takeElementScreenshot):
141         * WebDriverService.h:
142
143 2017-11-30  Carlos Garcia Campos  <cgarcia@igalia.com>
144
145         WebDriver: locator strategy should be validated before trying to find elements
146         https://bugs.webkit.org/show_bug.cgi?id=180187
147
148         Reviewed by Carlos Alberto Lopez Perez.
149
150         We currently rely on the js atom to raise an exception in case the locator strategy is not valid, but in case of
151         find element from element, if the element doesn't exist we fail with stale element error instead of invalid
152         argument as expected. So, let's validate the strategies when parsing them, which would also avoid going to the
153         browser in cae of invalid strategy.
154
155         Fixes: imported/w3c/webdriver/tests/retrieval/find_element_from_element.py::test_invalid_using_argument[a]
156
157         * WebDriverService.cpp:
158         (WebDriver::isValidStrategy):
159         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
160
161 2017-11-30  Carlos Garcia Campos  <cgarcia@igalia.com>
162
163         WebDriver: remove elementSubmit command
164         https://bugs.webkit.org/show_bug.cgi?id=180186
165
166         Reviewed by Carlos Alberto Lopez Perez.
167
168         It's not in the spec, we had it only because selenium used it, but now it uses execute_script with custom code
169         to implement submit, so we can just remove it.
170
171         * Session.cpp:
172         (WebDriver::Session::elementSubmit): Deleted.
173         * Session.h:
174         * WebDriverService.cpp:
175         (WebDriver::WebDriverService::elementSubmit): Deleted.
176         * WebDriverService.h:
177
178 2017-11-14  Carlos Garcia Campos  <cgarcia@igalia.com>
179
180         Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
181         https://bugs.webkit.org/show_bug.cgi?id=173793
182
183         Reviewed by Joseph Pecoraro.
184
185         * CMakeLists.txt:
186         * CommandResult.cpp:
187         (WebDriver::CommandResult::CommandResult):
188         * CommandResult.h:
189         (WebDriver::CommandResult::success):
190         (WebDriver::CommandResult::fail):
191         (WebDriver::CommandResult::result const):
192         (WebDriver::CommandResult::setAdditionalErrorData):
193         (WebDriver::CommandResult::additionalErrorData const):
194         * Session.cpp:
195         (WebDriver::firstWindowHandleInResult):
196         (WebDriver::Session::handleUserPrompts):
197         (WebDriver::Session::reportUnexpectedAlertOpen):
198         (WebDriver::Session::go):
199         (WebDriver::Session::getCurrentURL):
200         (WebDriver::Session::back):
201         (WebDriver::Session::forward):
202         (WebDriver::Session::refresh):
203         (WebDriver::Session::getTitle):
204         (WebDriver::Session::getWindowHandle):
205         (WebDriver::Session::closeTopLevelBrowsingContext):
206         (WebDriver::Session::switchToWindow):
207         (WebDriver::Session::getWindowHandles):
208         (WebDriver::Session::switchToFrame):
209         (WebDriver::Session::switchToParentFrame):
210         (WebDriver::Session::getToplevelBrowsingContextRect):
211         (WebDriver::Session::moveToplevelBrowsingContextWindow):
212         (WebDriver::Session::resizeToplevelBrowsingContextWindow):
213         (WebDriver::Session::createElement):
214         (WebDriver::Session::extractElement):
215         (WebDriver::Session::extractElementID):
216         (WebDriver::Session::computeElementLayout):
217         (WebDriver::Session::findElements):
218         (WebDriver::Session::isElementSelected):
219         (WebDriver::Session::getElementText):
220         (WebDriver::Session::getElementTagName):
221         (WebDriver::Session::getElementRect):
222         (WebDriver::Session::isElementEnabled):
223         (WebDriver::Session::isElementDisplayed):
224         (WebDriver::Session::getElementAttribute):
225         (WebDriver::Session::waitForNavigationToComplete):
226         (WebDriver::Session::selectOptionElement):
227         (WebDriver::Session::elementClick):
228         (WebDriver::Session::elementClear):
229         (WebDriver::Session::elementSendKeys):
230         (WebDriver::Session::elementSubmit):
231         (WebDriver::Session::handleScriptResult):
232         (WebDriver::Session::executeScript):
233         (WebDriver::Session::performMouseInteraction):
234         (WebDriver::Session::performKeyboardInteractions):
235         (WebDriver::parseAutomationCookie):
236         (WebDriver::builtAutomationCookie):
237         (WebDriver::serializeCookie):
238         (WebDriver::Session::getAllCookies):
239         (WebDriver::Session::getNamedCookie):
240         (WebDriver::Session::addCookie):
241         (WebDriver::Session::deleteCookie):
242         (WebDriver::Session::deleteAllCookies):
243         (WebDriver::Session::dismissAlert):
244         (WebDriver::Session::acceptAlert):
245         (WebDriver::Session::getAlertText):
246         (WebDriver::Session::sendAlertText):
247         (WebDriver::Session::takeScreenshot):
248         * Session.h:
249         * SessionHost.cpp:
250         (WebDriver::SessionHost::sendCommandToBackend):
251         (WebDriver::SessionHost::dispatchMessage):
252         * SessionHost.h:
253         * WebDriverService.cpp:
254         (WebDriver::WebDriverService::handleRequest):
255         (WebDriver::WebDriverService::sendResponse const):
256         (WebDriver::deserializeTimeouts):
257         (WebDriver::WebDriverService::parseCapabilities const):
258         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
259         (WebDriver::WebDriverService::validatedCapabilities const):
260         (WebDriver::WebDriverService::mergeCapabilities const):
261         (WebDriver::WebDriverService::matchCapabilities const):
262         (WebDriver::WebDriverService::processCapabilities const):
263         (WebDriver::WebDriverService::newSession):
264         (WebDriver::WebDriverService::deleteSession):
265         (WebDriver::WebDriverService::setTimeouts):
266         (WebDriver::WebDriverService::go):
267         (WebDriver::WebDriverService::getCurrentURL):
268         (WebDriver::WebDriverService::back):
269         (WebDriver::WebDriverService::forward):
270         (WebDriver::WebDriverService::refresh):
271         (WebDriver::WebDriverService::getTitle):
272         (WebDriver::WebDriverService::getWindowHandle):
273         (WebDriver::WebDriverService::getWindowRect):
274         (WebDriver::valueAsNumberInRange):
275         (WebDriver::WebDriverService::setWindowRect):
276         (WebDriver::WebDriverService::closeWindow):
277         (WebDriver::WebDriverService::switchToWindow):
278         (WebDriver::WebDriverService::getWindowHandles):
279         (WebDriver::WebDriverService::switchToFrame):
280         (WebDriver::WebDriverService::switchToParentFrame):
281         (WebDriver::findElementOrCompleteWithError):
282         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
283         (WebDriver::WebDriverService::findElement):
284         (WebDriver::WebDriverService::findElements):
285         (WebDriver::WebDriverService::findElementFromElement):
286         (WebDriver::WebDriverService::findElementsFromElement):
287         (WebDriver::WebDriverService::isElementSelected):
288         (WebDriver::WebDriverService::getElementAttribute):
289         (WebDriver::WebDriverService::getElementText):
290         (WebDriver::WebDriverService::getElementTagName):
291         (WebDriver::WebDriverService::getElementRect):
292         (WebDriver::WebDriverService::isElementEnabled):
293         (WebDriver::WebDriverService::isElementDisplayed):
294         (WebDriver::WebDriverService::elementClick):
295         (WebDriver::WebDriverService::elementClear):
296         (WebDriver::WebDriverService::elementSendKeys):
297         (WebDriver::WebDriverService::elementSubmit):
298         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
299         (WebDriver::WebDriverService::executeScript):
300         (WebDriver::WebDriverService::executeAsyncScript):
301         (WebDriver::WebDriverService::getAllCookies):
302         (WebDriver::WebDriverService::getNamedCookie):
303         (WebDriver::deserializeCookie):
304         (WebDriver::WebDriverService::addCookie):
305         (WebDriver::WebDriverService::deleteCookie):
306         (WebDriver::WebDriverService::deleteAllCookies):
307         (WebDriver::WebDriverService::dismissAlert):
308         (WebDriver::WebDriverService::acceptAlert):
309         (WebDriver::WebDriverService::getAlertText):
310         (WebDriver::WebDriverService::sendAlertText):
311         (WebDriver::WebDriverService::takeScreenshot):
312         (WebDriver::WebDriverService::takeElementScreenshot):
313         * WebDriverService.h:
314         * gtk/WebDriverServiceGtk.cpp:
315         (WebDriver::WebDriverService::platformValidateCapability const):
316         (WebDriver::WebDriverService::platformMatchCapability const):
317         (WebDriver::WebDriverService::platformParseCapabilities const):
318         * wpe/WebDriverServiceWPE.cpp:
319         (WebDriver::WebDriverService::platformValidateCapability const):
320         (WebDriver::WebDriverService::platformMatchCapability const):
321         (WebDriver::WebDriverService::platformParseCapabilities const):
322
323 2017-11-28  Carlos Garcia Campos  <cgarcia@igalia.com>
324
325         [GTK] WebDriver: stop making mandatory to provide a browser path if webkitgtk:browserOptions is present in capabilities
326         https://bugs.webkit.org/show_bug.cgi?id=180012
327
328         Reviewed by Carlos Alberto Lopez Perez.
329
330         Everything should be optional. We might want to disable overlay scrollbars, but still using the default browser,
331         for example, as I'm doing when running the selenium tests. We might also want to provide additional browser
332         arguments, but using the default browser.
333
334         * gtk/WebDriverServiceGtk.cpp:
335         (WebDriver::WebDriverService::platformValidateCapability const): Do not consider invalid to not provide a
336         browser binary when webkitgtk:browserOptions is present.
337         (WebDriver::WebDriverService::platformParseCapabilities const): Override default capabilities with the ones
338         provided.
339
340 2017-11-27  Carlos Garcia Campos  <cgarcia@igalia.com>
341
342         WebDriver: Implement get active element command
343         https://bugs.webkit.org/show_bug.cgi?id=180001
344
345         Reviewed by Brian Burg.
346
347         12.6 Get Active Element
348         https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element
349
350         Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.
351
352         * Session.cpp:
353         (WebDriver::Session::getActiveElement):
354         * Session.h:
355         * WebDriverService.cpp:
356         (WebDriver::WebDriverService::getActiveElement):
357         * WebDriverService.h:
358
359 2017-11-21  Carlos Garcia Campos  <cgarcia@igalia.com>
360
361         WebDriver: do not try to parse http body if method is not POST
362         https://bugs.webkit.org/show_bug.cgi?id=179918
363
364         Reviewed by Darin Adler.
365
366         As said in the spec:
367
368           5. If request’s method is POST:
369
370             1. Let parse result be the result of parsing as JSON with request’s body as the argument. If this process
371                throws an exception, return an error with error code invalid argument and jump back to step 1 in this
372                overall algorithm.
373
374             2. If parse result is not an Object, send an error with error code invalid argument and jump back to step 1
375                in this overall algorithm.
376
377             Otherwise, let parameters be parse result.
378
379           Otherwise, let parameters be null.
380
381         6.3 Processing Model
382         https://w3c.github.io/webdriver/webdriver-spec.html#processing-model
383
384         Now, w3c tests are sending null as body of delete session command (it used to be just empty), making it fail
385         with invalid argument error.
386
387         * WebDriverService.cpp:
388         (WebDriver::WebDriverService::findCommand):
389         (WebDriver::WebDriverService::handleRequest):
390         * WebDriverService.h:
391
392 2017-11-21  Carlos Garcia Campos  <cgarcia@igalia.com>
393
394         WebDriver: crash in Session::computeElementLayout when called without a current browsing context
395         https://bugs.webkit.org/show_bug.cgi?id=179917
396
397         Reviewed by Darin Adler.
398
399         In the case of computeElementLayout message, the frameHandle parameter is not optional, but we still need to
400         provide a valid value (empty string means the default frame) when m_currentBrowsingContext is std::nullopt. The
401         same applies to selectOptionElement.
402
403         * Session.cpp:
404         (WebDriver::Session::computeElementLayout):
405         (WebDriver::Session::selectOptionElement):
406
407 2017-11-15  Carlos Garcia Campos  <cgarcia@igalia.com>
408
409         [WPE] Add initial support for WebDriver
410         https://bugs.webkit.org/show_bug.cgi?id=179727
411
412         Reviewed by Michael Catanzaro.
413
414         Add WPE implementation for platform-specific methods. Move the version handling to a common file
415         WebDriverServiceGLib.cpp.
416
417         * Capabilities.h:
418         * PlatformGTK.cmake:
419         * PlatformWPE.cmake:
420         * glib/WebDriverServiceGLib.cpp: Added.
421         (WebDriver::parseVersion):
422         (WebDriver::WebDriverService::platformCompareBrowserVersions):
423         * gtk/WebDriverServiceGtk.cpp:
424         * wpe/WebDriverServiceWPE.cpp: Copied from Source/WebDriver/gtk/WebDriverServiceGtk.cpp.
425         (WebDriver::WebDriverService::platformCapabilities):
426         (WebDriver::WebDriverService::platformValidateCapability const):
427         (WebDriver::WebDriverService::platformMatchCapability const):
428         (WebDriver::WebDriverService::platformParseCapabilities const):
429
430 2017-11-15  Ryan Haddad  <ryanhaddad@apple.com>
431
432         Unreviewed, rolling out r224863.
433
434         Introduced LayoutTest crashes on iOS Simulator.
435
436         Reverted changeset:
437
438         "Move JSONValues to WTF and convert uses of InspectorValues.h
439         to JSONValues.h"
440         https://bugs.webkit.org/show_bug.cgi?id=173793
441         https://trac.webkit.org/changeset/224863
442
443 2017-11-14  Carlos Garcia Campos  <cgarcia@igalia.com>
444
445         Move JSONValues to WTF and convert uses of InspectorValues.h to JSONValues.h
446         https://bugs.webkit.org/show_bug.cgi?id=173793
447
448         Reviewed by Brian Burg.
449
450         * CMakeLists.txt:
451         * CommandResult.cpp:
452         (WebDriver::CommandResult::CommandResult):
453         * CommandResult.h:
454         (WebDriver::CommandResult::success):
455         (WebDriver::CommandResult::fail):
456         (WebDriver::CommandResult::result const):
457         (WebDriver::CommandResult::setAdditionalErrorData):
458         (WebDriver::CommandResult::additionalErrorData const):
459         * Session.cpp:
460         (WebDriver::firstWindowHandleInResult):
461         (WebDriver::Session::handleUserPrompts):
462         (WebDriver::Session::reportUnexpectedAlertOpen):
463         (WebDriver::Session::go):
464         (WebDriver::Session::getCurrentURL):
465         (WebDriver::Session::back):
466         (WebDriver::Session::forward):
467         (WebDriver::Session::refresh):
468         (WebDriver::Session::getTitle):
469         (WebDriver::Session::getWindowHandle):
470         (WebDriver::Session::closeTopLevelBrowsingContext):
471         (WebDriver::Session::switchToWindow):
472         (WebDriver::Session::getWindowHandles):
473         (WebDriver::Session::switchToFrame):
474         (WebDriver::Session::switchToParentFrame):
475         (WebDriver::Session::getToplevelBrowsingContextRect):
476         (WebDriver::Session::moveToplevelBrowsingContextWindow):
477         (WebDriver::Session::resizeToplevelBrowsingContextWindow):
478         (WebDriver::Session::createElement):
479         (WebDriver::Session::extractElement):
480         (WebDriver::Session::extractElementID):
481         (WebDriver::Session::computeElementLayout):
482         (WebDriver::Session::findElements):
483         (WebDriver::Session::isElementSelected):
484         (WebDriver::Session::getElementText):
485         (WebDriver::Session::getElementTagName):
486         (WebDriver::Session::getElementRect):
487         (WebDriver::Session::isElementEnabled):
488         (WebDriver::Session::isElementDisplayed):
489         (WebDriver::Session::getElementAttribute):
490         (WebDriver::Session::waitForNavigationToComplete):
491         (WebDriver::Session::selectOptionElement):
492         (WebDriver::Session::elementClick):
493         (WebDriver::Session::elementClear):
494         (WebDriver::Session::elementSendKeys):
495         (WebDriver::Session::elementSubmit):
496         (WebDriver::Session::handleScriptResult):
497         (WebDriver::Session::executeScript):
498         (WebDriver::Session::performMouseInteraction):
499         (WebDriver::Session::performKeyboardInteractions):
500         (WebDriver::parseAutomationCookie):
501         (WebDriver::builtAutomationCookie):
502         (WebDriver::serializeCookie):
503         (WebDriver::Session::getAllCookies):
504         (WebDriver::Session::getNamedCookie):
505         (WebDriver::Session::addCookie):
506         (WebDriver::Session::deleteCookie):
507         (WebDriver::Session::deleteAllCookies):
508         (WebDriver::Session::dismissAlert):
509         (WebDriver::Session::acceptAlert):
510         (WebDriver::Session::getAlertText):
511         (WebDriver::Session::sendAlertText):
512         (WebDriver::Session::takeScreenshot):
513         * Session.h:
514         * SessionHost.cpp:
515         (WebDriver::SessionHost::sendCommandToBackend):
516         (WebDriver::SessionHost::dispatchMessage):
517         * SessionHost.h:
518         * WebDriverService.cpp:
519         (WebDriver::WebDriverService::handleRequest):
520         (WebDriver::WebDriverService::sendResponse const):
521         (WebDriver::deserializeTimeouts):
522         (WebDriver::WebDriverService::parseCapabilities const):
523         (WebDriver::WebDriverService::findSessionOrCompleteWithError):
524         (WebDriver::WebDriverService::validatedCapabilities const):
525         (WebDriver::WebDriverService::mergeCapabilities const):
526         (WebDriver::WebDriverService::matchCapabilities const):
527         (WebDriver::WebDriverService::processCapabilities const):
528         (WebDriver::WebDriverService::newSession):
529         (WebDriver::WebDriverService::deleteSession):
530         (WebDriver::WebDriverService::setTimeouts):
531         (WebDriver::WebDriverService::go):
532         (WebDriver::WebDriverService::getCurrentURL):
533         (WebDriver::WebDriverService::back):
534         (WebDriver::WebDriverService::forward):
535         (WebDriver::WebDriverService::refresh):
536         (WebDriver::WebDriverService::getTitle):
537         (WebDriver::WebDriverService::getWindowHandle):
538         (WebDriver::WebDriverService::getWindowRect):
539         (WebDriver::valueAsNumberInRange):
540         (WebDriver::WebDriverService::setWindowRect):
541         (WebDriver::WebDriverService::closeWindow):
542         (WebDriver::WebDriverService::switchToWindow):
543         (WebDriver::WebDriverService::getWindowHandles):
544         (WebDriver::WebDriverService::switchToFrame):
545         (WebDriver::WebDriverService::switchToParentFrame):
546         (WebDriver::findElementOrCompleteWithError):
547         (WebDriver::findStrategyAndSelectorOrCompleteWithError):
548         (WebDriver::WebDriverService::findElement):
549         (WebDriver::WebDriverService::findElements):
550         (WebDriver::WebDriverService::findElementFromElement):
551         (WebDriver::WebDriverService::findElementsFromElement):
552         (WebDriver::WebDriverService::isElementSelected):
553         (WebDriver::WebDriverService::getElementAttribute):
554         (WebDriver::WebDriverService::getElementText):
555         (WebDriver::WebDriverService::getElementTagName):
556         (WebDriver::WebDriverService::getElementRect):
557         (WebDriver::WebDriverService::isElementEnabled):
558         (WebDriver::WebDriverService::isElementDisplayed):
559         (WebDriver::WebDriverService::elementClick):
560         (WebDriver::WebDriverService::elementClear):
561         (WebDriver::WebDriverService::elementSendKeys):
562         (WebDriver::WebDriverService::elementSubmit):
563         (WebDriver::findScriptAndArgumentsOrCompleteWithError):
564         (WebDriver::WebDriverService::executeScript):
565         (WebDriver::WebDriverService::executeAsyncScript):
566         (WebDriver::WebDriverService::getAllCookies):
567         (WebDriver::WebDriverService::getNamedCookie):
568         (WebDriver::deserializeCookie):
569         (WebDriver::WebDriverService::addCookie):
570         (WebDriver::WebDriverService::deleteCookie):
571         (WebDriver::WebDriverService::deleteAllCookies):
572         (WebDriver::WebDriverService::dismissAlert):
573         (WebDriver::WebDriverService::acceptAlert):
574         (WebDriver::WebDriverService::getAlertText):
575         (WebDriver::WebDriverService::sendAlertText):
576         (WebDriver::WebDriverService::takeScreenshot):
577         (WebDriver::WebDriverService::takeElementScreenshot):
578         * WebDriverService.h:
579         * gtk/WebDriverServiceGtk.cpp:
580         (WebDriver::WebDriverService::platformValidateCapability const):
581         (WebDriver::WebDriverService::platformMatchCapability const):
582         (WebDriver::WebDriverService::platformParseCapabilities const):
583
584 2017-11-07  Brian Burg  <bburg@apple.com>
585
586         Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
587         https://bugs.webkit.org/show_bug.cgi?id=179129
588         <rdar://problem/35297038>
589
590         Reviewed by Simon Fraser.
591
592         Adjust code to use the proper coordinate system when requesting element layout.
593
594         * Session.cpp:
595         (WebDriver::Session::computeElementLayout):
596
597 2017-11-09  Carlos Garcia Campos  <cgarcia@igalia.com>
598
599         WebDriver: WebDriverService::matchCapabilities should follow the spec
600         https://bugs.webkit.org/show_bug.cgi?id=179371
601
602         Reviewed by Brian Burg.
603
604         The returned object should contain all the entries mentioned in the spec, not only the ones already present in
605         the passed in capabilities object.
606
607         7.2 Processing Capabilities
608         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-matching-capabilities
609
610         * WebDriverService.cpp:
611         (WebDriver::WebDriverService::matchCapabilities const):
612         (WebDriver::WebDriverService::processCapabilities const):
613         * WebDriverService.h:
614
615 2017-11-09  Carlos Garcia Campos  <cgarcia@igalia.com>
616
617         WebDriver: capabilities with null value shouldn't be added to the validated capabilities object
618         https://bugs.webkit.org/show_bug.cgi?id=179369
619
620         Reviewed by Brian Burg.
621
622         "4. If deserialized is not null, set a property on result with name name and value deserialized."
623
624         7.2 Processing Capabilities
625         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
626
627         Fixes: imported/w3c/webdriver/tests/sessions/new_session/create_firstMatch.py::test_valid[platformName-None]
628
629         * WebDriverService.cpp:
630         (WebDriver::WebDriverService::validatedCapabilities const):
631
632 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
633
634         WebDriver: unknown capabilities should produce an InvalidArgument error when validating capabilities
635         https://bugs.webkit.org/show_bug.cgi?id=178868
636
637         Reviewed by Brian Burg.
638
639         7.2 Processing Capabilities
640         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-validate-capabilities
641
642         Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_extensions
643
644         * WebDriverService.cpp:
645         (WebDriver::WebDriverService::validatedCapabilities const):
646
647 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
648
649         WebDriver: deserializeTimeouts should fail if the value is not integer
650         https://bugs.webkit.org/show_bug.cgi?id=178866
651
652         Reviewed by Brian Burg.
653
654         If value is not an integer, or it is less than 0 or greater than 2^64 – 1, return error with error code invalid
655         argument.
656         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-deserialize-as-a-timeout
657
658         Fixes: imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body0]
659                imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py::test_invalid_values[timeouts-value59-body1]
660
661         * WebDriverService.cpp:
662         (WebDriver::deserializeTimeouts):
663
664 2017-10-27  Carlos Garcia Campos  <cgarcia@igalia.com>
665
666         WebDriver: failing to process capabilities should produce InvalidArgument error not SessionNotCreated
667         https://bugs.webkit.org/show_bug.cgi?id=178864
668
669         Reviewed by Brian Burg.
670
671         Fixes most of the tests in imported/w3c/webdriver/tests/sessions/new_session/invalid_capabilities.py.
672
673         7.2 Processing Capabilities
674         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
675
676         * WebDriverService.cpp:
677         (WebDriver::WebDriverService::processCapabilities const):
678
679 2017-10-10  Sam Weinig  <sam@webkit.org>
680
681         Replace copyKeysToVector/copyValuesToVector with copyToVector(map.keys())/copyToVector(map.values())
682         https://bugs.webkit.org/show_bug.cgi?id=178102
683
684         Reviewed by Tim Horton.
685
686         * SessionHost.cpp:
687         (WebDriver::SessionHost::inspectorDisconnected):
688
689 2017-10-02  Carlos Garcia Campos  <cgarcia@igalia.com>
690
691         WebDriver: HTTP status code is not correct for some of the errors
692         https://bugs.webkit.org/show_bug.cgi?id=177354
693
694         Reviewed by Brian Burg.
695
696         I think this changed in the spec at some point. The thing is that no such alert, frame and window and stale
697         element reference errors should return 404 instead of 400.
698
699         https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
700
701         * CommandResult.cpp:
702         (WebDriver::CommandResult::httpStatusCode const):
703
704 2017-09-19  Carlos Garcia Campos  <cgarcia@igalia.com>
705
706         WebDriver: Implement commands to get and set the window rect
707         https://bugs.webkit.org/show_bug.cgi?id=177134
708
709         Reviewed by Brian Burg.
710
711         We are currently implementing the selenium legacy ones, we should implement the w3c ones instead.
712
713         https://w3c.github.io/webdriver/webdriver-spec.html#resizing-and-positioning-windows
714
715         * Session.cpp:
716         (WebDriver::Session::getToplevelBrowsingContextRect): Helper to get the window rect. This is used by both get
717         and set window rect commands.
718         (WebDriver::Session::moveToplevelBrowsingContextwindow): Helper to ask automation to move the window.
719         (WebDriver::Session::resizeToplevelBrowsingContextwindow): Helper to ask automation to resize the window.
720         (WebDriver::Session::getWindowRect): Handle prompts and then call getToplevelBrowsingContextRect().
721         (WebDriver::Session::setWindowRect): Handle prompts and then move and resize the window according to the given
722         parameters and finish the operation calling getToplevelBrowsingContextRect().
723         * Session.h:
724         * WebDriverService.cpp:
725         (WebDriver::WebDriverService::getWindowRect): Ask the session to get the window rect.
726         (WebDriver::valueAsNumberInRange): Helper to check a value is a valid number in the given range.
727         (WebDriver::WebDriverService::setWindowRect): Get and check size and position from parameters and then ask the
728         session to set the window rect.
729         * WebDriverService.h:
730
731 2017-09-19  Carlos Garcia Campos  <cgarcia@igalia.com>
732
733         WebDriver: wrong response in case of errors
734         https://bugs.webkit.org/show_bug.cgi?id=177127
735
736         Reviewed by Brian Burg.
737
738         I misunderstood the spec when I implemented this, so we either return a "value" key with the result in case of
739         success or the error object as the body in case of error. We should always add a "value" key to the body and set
740         it with either the result or the error object.
741
742         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-an-error
743
744         * WebDriverService.cpp:
745         (WebDriver::WebDriverService::sendResponse const):
746
747 2017-09-18  Carlos Garcia Campos  <cgarcia@igalia.com>
748
749         WebDriver: wrong key name for capabilities in new session response
750         https://bugs.webkit.org/show_bug.cgi?id=177074
751
752         Reviewed by Brian Burg.
753
754         We are using "value", it should be "capabilities".
755         https://w3c.github.io/webdriver/webdriver-spec.html#new-session
756
757         * WebDriverService.cpp:
758         (WebDriver::WebDriverService::newSession):
759
760 2017-09-18  Carlos Garcia Campos  <cgarcia@igalia.com>
761
762         WebDriver: HTTP responses should include Cache-Control header with no-cache value
763         https://bugs.webkit.org/show_bug.cgi?id=177073
764
765         Reviewed by Sergio Villar Senin.
766
767         6.3 Processing Model.
768         Set the response’s header with name and value with the following values:
769
770         Content-Type "application/json; charset=utf-8"
771         Cache-Control "no-cache"
772
773         https://w3c.github.io/webdriver/webdriver-spec.html#dfn-send-a-response
774
775         We were setting the Content-Type, but not the Cache-Control. This is checked by all WPT WebDriver tests.
776
777         * soup/HTTPServerSoup.cpp:
778         (WebDriver::HTTPServer::listen): Add Cache-Control header.
779
780 2017-09-18  Michael Catanzaro  <mcatanzaro@igalia.com>
781
782         [CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
783         https://bugs.webkit.org/show_bug.cgi?id=174558
784
785         Reviewed by Alex Christensen.
786
787         * CMakeLists.txt:
788
789 2017-09-15  JF Bastien  <jfbastien@apple.com>
790
791         WTF: use Forward.h when appropriate instead of Vector.h
792         https://bugs.webkit.org/show_bug.cgi?id=176984
793
794         Reviewed by Saam Barati.
795
796         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.
797
798         * Session.h:
799
800 2017-09-09  Carlos Garcia Campos  <cgarcia@igalia.com>
801
802         WebDriver: ensure we close all windows handles when closing the session
803         https://bugs.webkit.org/show_bug.cgi?id=176508
804
805         Reviewed by Brian Burg.
806
807         The spec says that when closing the session all top level browsing contexts should be closed. We are currently
808         checking if we have an active top level browsing context and then we try to close it before trying with the
809         rest. It can happen that we are in an inconsistent state, for example if the current top level browsing context
810         has been closed by JavaScript or another action and the user didn't switch to another one before closing the
811         session. In such case, closing the session will fail with NoSuchwindow and any other window open will not be
812         closed. It's safer to always ask for all window handles and close them, which is what the spec says too.
813
814         * Session.cpp:
815         (WebDriver::firstWindowHandleInResult): Helper class to get the first window handle in the result array.
816         (WebDriver::Session::closeAllToplevelBrowsingContexts): Use firstWindowHandleInResult().
817         (WebDriver::Session::close): Close the current top level browsing context and get all window handles to close
818         them all if needed.
819
820 2017-08-28  Carlos Garcia Campos  <cgarcia@igalia.com>
821
822         WebDriver: implement screen capture commands
823         https://bugs.webkit.org/show_bug.cgi?id=174615
824
825         Reviewed by Brian Burg.
826
827         Implement takeScreenshot and takeElementScreenshot commands.
828
829         19. Screen Capture.
830         https://w3c.github.io/webdriver/webdriver-spec.html#screen-capture
831
832         * CommandResult.cpp:
833         (WebDriver::CommandResult::CommandResult): Handle ScreenshotError protocol error.
834         (WebDriver::CommandResult::httpStatusCode const): Add UnableToCaptureScreen.
835         (WebDriver::CommandResult::errorString const): Ditto.
836         * CommandResult.h:
837         * Session.cpp:
838         (WebDriver::Session::takeScreenshot):
839         * Session.h:
840         * WebDriverService.cpp:
841         (WebDriver::WebDriverService::takeScreenshot):
842         (WebDriver::WebDriverService::takeElementScreenshot):
843         * WebDriverService.h:
844
845 2017-08-28  Carlos Garcia Campos  <cgarcia@igalia.com>
846
847         WebDriver: implement cookies commands
848         https://bugs.webkit.org/show_bug.cgi?id=174613
849
850         Reviewed by Brian Burg.
851
852         Add cookies commands.
853
854         16. Cookies.
855         https://w3c.github.io/webdriver/webdriver-spec.html#cookies
856
857         * CommandResult.cpp:
858         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
859         (WebDriver::CommandResult::errorString const): Ditto.
860         * CommandResult.h:
861         * Session.cpp:
862         (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
863         (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
864         (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
865         (WebDriver::Session::getAllCookies):
866         (WebDriver::Session::getNamedCookie):
867         (WebDriver::Session::addCookie):
868         (WebDriver::Session::deleteCookie):
869         (WebDriver::Session::deleteAllCookies):
870         * Session.h:
871         * WebDriverService.cpp:
872         (WebDriver::WebDriverService::getAllCookies):
873         (WebDriver::WebDriverService::getNamedCookie):
874         (WebDriver::deserializeCookie):
875         (WebDriver::WebDriverService::addCookie):
876         (WebDriver::WebDriverService::deleteCookie):
877         (WebDriver::WebDriverService::deleteAllCookies):
878         * WebDriverService.h:
879
880 2017-07-28  Carlos Garcia Campos  <cgarcia@igalia.com>
881
882         WebDriver: fix return value of close window command
883         https://bugs.webkit.org/show_bug.cgi?id=174861
884
885         Reviewed by Brian Burg.
886
887         We are currently returning null, but we should return the list of window handles, and try to close the session
888         if there aren't more window handles.
889
890         10.2 Close Window
891         https://w3c.github.io/webdriver/webdriver-spec.html#close-window
892
893         3. If there are no more open top-level browsing contexts, then try to close the session.
894         4. Return the result of running the remote end steps for the Get Window Handles command.
895
896         * Session.cpp:
897         (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
898         context and the next one if there are more.
899         (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
900         the session.
901         (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
902         getWindowHandles() when done.
903         (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
904         (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
905         toplevel browsing context.
906         * Session.h:
907         * SessionHost.h:
908         * WebDriverService.cpp:
909         (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
910         (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
911         (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
912         * WebDriverService.h: Remove unused quit() method.
913         * glib/SessionHostGlib.cpp:
914         (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
915         (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
916
917 2017-08-14  Carlos Garcia Campos  <cgarcia@igalia.com>
918
919         WebDriver: handle click events on option elements
920         https://bugs.webkit.org/show_bug.cgi?id=174710
921         <rdar://problem/33459305>
922
923         Reviewed by Brian Burg.
924
925         Option elements are considered as a special case by the specification. When clicking an option element, we
926         should get its container and use it when scrolling into view and calculating in-view center point instead of the
927         option element itself. Then, we should not emulate a click, but change the selected status of the option element
928         like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
929         option to call selectOptionElement() or performMouseInteraction().
930
931         This fixes more than 20 selenium tests.
932
933         * CommandResult.cpp:
934         (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
935         (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
936         (WebDriver::CommandResult::errorString const): Ditto.
937         * CommandResult.h:
938         * Session.cpp:
939         (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
940         (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
941         the element is an option or not.
942         * Session.h:
943
944 2017-08-11  Carlos Alberto Lopez Perez  <clopez@igalia.com>
945
946         Fix build warning in WebDriverService.h
947         https://bugs.webkit.org/show_bug.cgi?id=166682
948
949         Unreviewed build fix.
950
951         * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
952
953 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
954
955         Unreviewed, fix Ubuntu LTS build
956         https://bugs.webkit.org/show_bug.cgi?id=174490
957
958         * glib/SessionHostGlib.cpp:
959
960 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
961
962         [CMake] Properly test if compiler supports compiler flags
963         https://bugs.webkit.org/show_bug.cgi?id=174490
964
965         Reviewed by Konstantin Tokarev.
966
967         * WebDriverService.cpp:
968         (WebDriver::WebDriverService::run):
969         * glib/SessionHostGlib.cpp:
970
971 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
972
973         Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
974         https://bugs.webkit.org/show_bug.cgi?id=175261
975
976         Reviewed by Brian Burg.
977
978         * CommandResult.cpp:
979         (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
980
981 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
982
983         WebDriver: implement unhandled prompt behavior
984         https://bugs.webkit.org/show_bug.cgi?id=175184
985
986         Reviewed by Brian Burg.
987
988         Handle user prompts before running some of the commands according to the specification.
989
990         * Capabilities.h: Add UnhandledPromptBehavior capability.
991         * CommandResult.cpp:
992         (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
993         (WebDriver::CommandResult::errorString const): Ditto.
994         * CommandResult.h:
995         (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
996         as part of the result error message.
997         (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
998         * Session.cpp:
999         (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
1000         on the unhandled prompt behavior.
1001         (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
1002         including the alert text as additional error data.
1003         (WebDriver::Session::go): Handle user prompts before running the command.
1004         (WebDriver::Session::getCurrentURL): Ditto.
1005         (WebDriver::Session::back): Ditto.
1006         (WebDriver::Session::forward): Ditto.
1007         (WebDriver::Session::refresh): Ditto.
1008         (WebDriver::Session::getTitle): Ditto.
1009         (WebDriver::Session::closeWindow): Ditto.
1010         (WebDriver::Session::switchToFrame): Ditto.
1011         (WebDriver::Session::switchToParentFrame): Ditto.
1012         (WebDriver::Session::isElementSelected): Ditto.
1013         (WebDriver::Session::getElementText): Ditto.
1014         (WebDriver::Session::getElementTagName): Ditto.
1015         (WebDriver::Session::getElementRect): Ditto.
1016         (WebDriver::Session::isElementEnabled): Ditto.
1017         (WebDriver::Session::isElementDisplayed): Ditto.
1018         (WebDriver::Session::getElementAttribute): Ditto.
1019         (WebDriver::Session::elementSendKeys): Ditto.
1020         (WebDriver::Session::elementSubmit): Ditto.
1021         (WebDriver::Session::executeScript): Ditto.
1022         * Session.h:
1023         * WebDriverService.cpp:
1024         (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
1025         (WebDriver::deserializeUnhandledPromptBehavior):
1026         (WebDriver::WebDriverService::parseCapabilities const):
1027         (WebDriver::WebDriverService::validatedCapabilities const):
1028         (WebDriver::WebDriverService::newSession):
1029
1030 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
1031
1032         WebDriver: implement user prompt commands
1033         https://bugs.webkit.org/show_bug.cgi?id=174614
1034
1035         Reviewed by Brian Burg.
1036
1037         * CommandResult.cpp:
1038         (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
1039         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
1040         (WebDriver::CommandResult::errorString const): Ditto.
1041         * CommandResult.h:
1042         * Session.cpp:
1043         (WebDriver::Session::dismissAlert):
1044         (WebDriver::Session::acceptAlert):
1045         (WebDriver::Session::getAlertText):
1046         (WebDriver::Session::sendAlertText):
1047         * Session.h:
1048         * WebDriverService.cpp:
1049         (WebDriver::WebDriverService::dismissAlert):
1050         (WebDriver::WebDriverService::acceptAlert):
1051         (WebDriver::WebDriverService::getAlertText):
1052         (WebDriver::WebDriverService::sendAlertText):
1053         * WebDriverService.h:
1054
1055 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1056
1057         [GTK][WPE] Add API to provide browser information required by automation
1058         https://bugs.webkit.org/show_bug.cgi?id=175130
1059
1060         Reviewed by Brian Burg.
1061
1062         * Session.cpp:
1063         (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
1064         with error in that case.
1065         * SessionHost.h:
1066         * glib/SessionHostGlib.cpp:
1067         (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
1068         been launched.
1069         (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
1070         capabilities and calling matchCapabilities() to match them.
1071         (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
1072         capabilities.
1073
1074 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1075
1076         WebDriver: Implement page load strategy
1077         https://bugs.webkit.org/show_bug.cgi?id=175183
1078
1079         Reviewed by Brian Burg.
1080
1081         Validate and parse page load strategy when processing capabilities.
1082
1083         * Capabilities.h:
1084         * Session.cpp:
1085         (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
1086         passed to Automation.
1087         (WebDriver::Session::go): Pass page load strategy if present.
1088         (WebDriver::Session::back): Ditto.
1089         (WebDriver::Session::forward): Ditto.
1090         (WebDriver::Session::refresh): Ditto.
1091         (WebDriver::Session::waitForNavigationToComplete): Ditto.
1092         * Session.h:
1093         * WebDriverService.cpp:
1094         (WebDriver::deserializePageLoadStrategy):
1095         (WebDriver::WebDriverService::parseCapabilities const):
1096         (WebDriver::WebDriverService::validatedCapabilities const):
1097         (WebDriver::WebDriverService::newSession):
1098
1099 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1100
1101         Unreviewed. Try to fix build with clang after r220315.
1102
1103         * WebDriverService.cpp:
1104         (WebDriver::WebDriverService::validatedCapabilities const):
1105         (WebDriver::WebDriverService::mergeCapabilities const):
1106
1107 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1108
1109         WebDriver: properly handle capabilities and process firstMatch too
1110         https://bugs.webkit.org/show_bug.cgi?id=174618
1111
1112         Reviewed by Brian Burg.
1113
1114         Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
1115         capabilities.
1116
1117         7.2 Processing Capabilities.
1118         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
1119
1120         * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
1121         * Session.h:
1122         * WebDriverService.cpp:
1123         (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
1124         (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
1125         so we just need to get them without checking the value type.
1126         (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
1127         values are the expected one.
1128         (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
1129         single object ensuring that the same capability is not in both.
1130         (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
1131         expected capabilities.
1132         (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
1133         (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
1134         capabilities and add all capabilities to the command result.
1135         (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
1136         * WebDriverService.h:
1137         * glib/SessionHostGlib.cpp:
1138         (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
1139         (WebDriver::SessionHost::startAutomationSession): Add FIXME.
1140         * gtk/WebDriverServiceGtk.cpp:
1141         (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
1142         (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
1143         (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
1144         (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
1145         (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
1146         validated before.
1147
1148 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
1149
1150         WebDriver: use in-view center point for clicks instead of bounding box center point
1151         https://bugs.webkit.org/show_bug.cgi?id=174863
1152
1153         Reviewed by Simon Fraser.
1154
1155         The center of the element bounding box is not always part of the element, like in multiline links, for example.
1156
1157         11.1 Element Interactability.
1158         https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
1159
1160         * CommandResult.cpp:
1161         (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
1162         (WebDriver::CommandResult::errorString): Ditto.
1163         * CommandResult.h: Ditto.
1164         * Session.cpp:
1165         (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
1166         (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
1167         (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
1168         * Session.h:
1169
1170 2017-08-01  Michael Catanzaro  <mcatanzaro@igalia.com>
1171
1172         [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
1173         https://bugs.webkit.org/show_bug.cgi?id=174855
1174
1175         Reviewed by Carlos Garcia Campos.
1176
1177         Don't create derived sources directory here anymore.
1178
1179         * PlatformGTK.cmake:
1180
1181 2017-07-26  Carlos Garcia Campos  <cgarcia@igalia.com>
1182
1183         Unreviewed. Fix GTK distcheck.
1184
1185         Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
1186
1187         * PlatformGTK.cmake:
1188
1189 2017-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
1190
1191         WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
1192         https://bugs.webkit.org/show_bug.cgi?id=174783
1193
1194         Reviewed by Brian Burg.
1195
1196         We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
1197         current browsing context, and the spec also refers to it as the current browsing context, so better use
1198         m_currentBrowsingContext.
1199
1200         * Session.cpp:
1201         (WebDriver::Session::switchToTopLevelBrowsingContext):
1202         (WebDriver::Session::switchToBrowsingContext):
1203         (WebDriver::Session::switchToFrame):
1204         (WebDriver::Session::switchToParentFrame):
1205         (WebDriver::Session::computeElementLayout):
1206         (WebDriver::Session::findElements):
1207         (WebDriver::Session::isElementSelected):
1208         (WebDriver::Session::getElementText):
1209         (WebDriver::Session::getElementTagName):
1210         (WebDriver::Session::isElementEnabled):
1211         (WebDriver::Session::isElementDisplayed):
1212         (WebDriver::Session::getElementAttribute):
1213         (WebDriver::Session::waitForNavigationToComplete):
1214         (WebDriver::Session::elementClear):
1215         (WebDriver::Session::elementSendKeys):
1216         (WebDriver::Session::elementSubmit):
1217         (WebDriver::Session::executeScript):
1218         * Session.h:
1219
1220 2017-07-20  Carlos Garcia Campos  <cgarcia@igalia.com>
1221
1222         WebDriver: implement page load timeout
1223         https://bugs.webkit.org/show_bug.cgi?id=174672
1224
1225         Reviewed by Brian Burg.
1226
1227         Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
1228         commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
1229         instead of the one in the spec.
1230
1231         8. Sessions
1232         https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
1233
1234         * CommandResult.cpp:
1235         (WebDriver::CommandResult::CommandResult):
1236         (WebDriver::CommandResult::httpStatusCode):
1237         (WebDriver::CommandResult::errorString):
1238         * CommandResult.h:
1239         * Session.cpp:
1240         (WebDriver::Session::go):
1241         (WebDriver::Session::back):
1242         (WebDriver::Session::forward):
1243         (WebDriver::Session::refresh):
1244         (WebDriver::Session::waitForNavigationToComplete):
1245         * WebDriverService.cpp:
1246         (WebDriver::WebDriverService::setTimeouts):
1247
1248 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
1249
1250         WebDriver: wait until navigation is complete before running new commands and after a click
1251         https://bugs.webkit.org/show_bug.cgi?id=174670
1252
1253         Reviewed by Brian Burg.
1254
1255         We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
1256         the spec says we should always wait before executing a new command and also after a click. This is causing test
1257         testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
1258         + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
1259         the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
1260         most of the times.
1261
1262         6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
1263         jump to step 1 in this overall algorithm, otherwise continue.
1264         https://www.w3.org/TR/webdriver/#processing-model
1265
1266         14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
1267         value if it is an error. 2. Try to wait for navigation to complete.
1268         https://www.w3.org/TR/webdriver/#element-click
1269
1270         * Session.cpp:
1271         (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
1272         wait for any pending navigation of current browsing context to complete.
1273         (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
1274         * Session.h:
1275         * WebDriverService.cpp:
1276         (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
1277         (WebDriver::WebDriverService::getCurrentURL): Ditto.
1278         (WebDriver::WebDriverService::back): Ditto.
1279         (WebDriver::WebDriverService::forward): Ditto.
1280         (WebDriver::WebDriverService::refresh): Ditto.
1281         (WebDriver::WebDriverService::getTitle): Ditto.
1282         (WebDriver::WebDriverService::switchToFrame): Ditto.
1283         (WebDriver::WebDriverService::switchToParentFrame): Ditto.
1284         (WebDriver::WebDriverService::findElement): Ditto.
1285         (WebDriver::WebDriverService::findElements): Ditto.
1286         (WebDriver::WebDriverService::executeScript): Ditto.
1287         (WebDriver::WebDriverService::executeAsyncScript): Ditto.
1288
1289 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
1290
1291         WebDriver: correctly handle main frame handles
1292         https://bugs.webkit.org/show_bug.cgi?id=174668
1293
1294         Reviewed by Brian Burg.
1295
1296         When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
1297         that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
1298         are currently considering empty strings as valid browsing context. It's not a big deal because Automation
1299         converts back the empty string received to the main frame, though. We should also ensure we close the current
1300         browsing context when switching to a new top level browsing context. This patch adds to helper private methods
1301         to switch browsing contexts that deal with the special cases.
1302
1303         * Session.cpp:
1304         (WebDriver::Session::close):
1305         (WebDriver::Session::switchToTopLevelBrowsingContext):
1306         (WebDriver::Session::switchToBrowsingContext):
1307         (WebDriver::Session::createTopLevelBrowsingContext):
1308         (WebDriver::Session::go):
1309         (WebDriver::Session::back):
1310         (WebDriver::Session::forward):
1311         (WebDriver::Session::refresh):
1312         (WebDriver::Session::switchToWindow):
1313         (WebDriver::Session::switchToFrame):
1314         (WebDriver::Session::switchToParentFrame):
1315         * Session.h:
1316
1317 2017-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
1318
1319         WebDriver: handle invalid selector errors
1320         https://bugs.webkit.org/show_bug.cgi?id=174619
1321
1322         Reviewed by Brian Burg.
1323
1324         Add InvalidSelector error and handle it in case of protocol server error.
1325
1326         * CommandResult.cpp:
1327         (WebDriver::CommandResult::CommandResult):
1328         (WebDriver::CommandResult::httpStatusCode):
1329         (WebDriver::CommandResult::errorString):
1330         * CommandResult.h:
1331
1332 2017-07-18  Carlos Alberto Lopez Perez  <clopez@igalia.com>
1333
1334         [GTK] Fix build with Clang after r219605.
1335         https://bugs.webkit.org/show_bug.cgi?id=166682
1336
1337         Unreviewed build fix.
1338
1339         Clang-3.8 complains with the following error:
1340         non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
1341
1342         * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
1343
1344 2017-07-13  Carlos Garcia Campos  <cgarcia@igalia.com>
1345
1346         Add initial implementation of WebDriver process to run the HTTP server
1347         https://bugs.webkit.org/show_bug.cgi?id=166682
1348
1349         Reviewed by Brian Burg.
1350
1351         Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
1352         cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
1353         the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
1354         libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
1355         inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
1356         using the official selenium python tests as reference.
1357
1358         * CMakeLists.txt: Added.
1359         * Capabilities.h: Added.
1360         * CommandResult.cpp: Added.
1361         * CommandResult.h: Added.
1362         * HTTPServer.cpp: Added.
1363         * HTTPServer.h: Added.
1364         * PlatformGTK.cmake: Added.
1365         * Session.cpp: Added.
1366         * Session.h: Added.
1367         * SessionHost.cpp: Added.
1368         * SessionHost.h: Added.
1369         * WebDriverMain.cpp: Added.
1370         * WebDriverService.cpp: Added.
1371         * WebDriverService.h: Added.
1372         * config.h: Added.
1373         * glib/SessionHostGlib.cpp: Added.
1374         * gtk/WebDriverServiceGtk.cpp: Added.
1375         * soup/HTTPServerSoup.cpp: Added.