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