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