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