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