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