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