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