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