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