WebDriver: fix return value of close window command
[WebKit-https.git] / Source / WebDriver / ChangeLog
1 2017-07-28  Carlos Garcia Campos  <cgarcia@igalia.com>
2
3         WebDriver: fix return value of close window command
4         https://bugs.webkit.org/show_bug.cgi?id=174861
5
6         Reviewed by Brian Burg.
7
8         We are currently returning null, but we should return the list of window handles, and try to close the session
9         if there aren't more window handles.
10
11         10.2 Close Window
12         https://w3c.github.io/webdriver/webdriver-spec.html#close-window
13
14         3. If there are no more open top-level browsing contexts, then try to close the session.
15         4. Return the result of running the remote end steps for the Get Window Handles command.
16
17         * Session.cpp:
18         (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
19         context and the next one if there are more.
20         (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
21         the session.
22         (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
23         getWindowHandles() when done.
24         (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
25         (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
26         toplevel browsing context.
27         * Session.h:
28         * SessionHost.h:
29         * WebDriverService.cpp:
30         (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
31         (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
32         (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
33         * WebDriverService.h: Remove unused quit() method.
34         * glib/SessionHostGlib.cpp:
35         (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
36         (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
37
38 2017-08-14  Carlos Garcia Campos  <cgarcia@igalia.com>
39
40         WebDriver: handle click events on option elements
41         https://bugs.webkit.org/show_bug.cgi?id=174710
42         <rdar://problem/33459305>
43
44         Reviewed by Brian Burg.
45
46         Option elements are considered as a special case by the specification. When clicking an option element, we
47         should get its container and use it when scrolling into view and calculating in-view center point instead of the
48         option element itself. Then, we should not emulate a click, but change the selected status of the option element
49         like if it were done by a user action, firing the corresponding events. Now we check whether the element is an
50         option to call selectOptionElement() or performMouseInteraction().
51
52         This fixes more than 20 selenium tests.
53
54         * CommandResult.cpp:
55         (WebDriver::CommandResult::CommandResult): Handle ElementNotSelectable protocol error.
56         (WebDriver::CommandResult::httpStatusCode const): Add ElementNotSelectable.
57         (WebDriver::CommandResult::errorString const): Ditto.
58         * CommandResult.h:
59         * Session.cpp:
60         (WebDriver::Session::selectOptionElement): Ask automation to select the given option element.
61         (WebDriver::Session::elementClick): Call selectOptionElement() or performMouseInteraction() depending on whether
62         the element is an option or not.
63         * Session.h:
64
65 2017-08-11  Carlos Alberto Lopez Perez  <clopez@igalia.com>
66
67         Fix build warning in WebDriverService.h
68         https://bugs.webkit.org/show_bug.cgi?id=166682
69
70         Unreviewed build fix.
71
72         * WebDriverService.h: Fixes the warning: class 'Capabilities' was previously declared as a struct [-Wmismatched-tags]
73
74 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
75
76         Unreviewed, fix Ubuntu LTS build
77         https://bugs.webkit.org/show_bug.cgi?id=174490
78
79         * glib/SessionHostGlib.cpp:
80
81 2017-08-08  Michael Catanzaro  <mcatanzaro@igalia.com>
82
83         [CMake] Properly test if compiler supports compiler flags
84         https://bugs.webkit.org/show_bug.cgi?id=174490
85
86         Reviewed by Konstantin Tokarev.
87
88         * WebDriverService.cpp:
89         (WebDriver::WebDriverService::run):
90         * glib/SessionHostGlib.cpp:
91
92 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
93
94         Web Automation: setUserInputForCurrentJavaScriptPrompt should fail if current dialog is not a prompt
95         https://bugs.webkit.org/show_bug.cgi?id=175261
96
97         Reviewed by Brian Burg.
98
99         * CommandResult.cpp:
100         (WebDriver::CommandResult::CommandResult): Handle ElementNotInteractable protocol error.
101
102 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
103
104         WebDriver: implement unhandled prompt behavior
105         https://bugs.webkit.org/show_bug.cgi?id=175184
106
107         Reviewed by Brian Burg.
108
109         Handle user prompts before running some of the commands according to the specification.
110
111         * Capabilities.h: Add UnhandledPromptBehavior capability.
112         * CommandResult.cpp:
113         (WebDriver::CommandResult::httpStatusCode const): Add UnexpectedAlertOpen error.
114         (WebDriver::CommandResult::errorString const): Ditto.
115         * CommandResult.h:
116         (WebDriver::CommandResult::setAdditonalErrorData): New method to set an additional data object that will be sent
117         as part of the result error message.
118         (WebDriver::CommandResult::additionalErrorData const): Return the additional data object.
119         * Session.cpp:
120         (WebDriver::Session::handleUserPrompts): Check if there's an active JavaScript dialog and deal with it depeding
121         on the unhandled prompt behavior.
122         (WebDriver::Session::reportUnexpectedAlertOpen): Generate an error message with UnexpectedAlertOpen error and
123         including the alert text as additional error data.
124         (WebDriver::Session::go): Handle user prompts before running the command.
125         (WebDriver::Session::getCurrentURL): Ditto.
126         (WebDriver::Session::back): Ditto.
127         (WebDriver::Session::forward): Ditto.
128         (WebDriver::Session::refresh): Ditto.
129         (WebDriver::Session::getTitle): Ditto.
130         (WebDriver::Session::closeWindow): Ditto.
131         (WebDriver::Session::switchToFrame): Ditto.
132         (WebDriver::Session::switchToParentFrame): Ditto.
133         (WebDriver::Session::isElementSelected): Ditto.
134         (WebDriver::Session::getElementText): Ditto.
135         (WebDriver::Session::getElementTagName): Ditto.
136         (WebDriver::Session::getElementRect): Ditto.
137         (WebDriver::Session::isElementEnabled): Ditto.
138         (WebDriver::Session::isElementDisplayed): Ditto.
139         (WebDriver::Session::getElementAttribute): Ditto.
140         (WebDriver::Session::elementSendKeys): Ditto.
141         (WebDriver::Session::elementSubmit): Ditto.
142         (WebDriver::Session::executeScript): Ditto.
143         * Session.h:
144         * WebDriverService.cpp:
145         (WebDriver::WebDriverService::sendResponse const): Send data object as part of the result error message if present.
146         (WebDriver::deserializeUnhandledPromptBehavior):
147         (WebDriver::WebDriverService::parseCapabilities const):
148         (WebDriver::WebDriverService::validatedCapabilities const):
149         (WebDriver::WebDriverService::newSession):
150
151 2017-08-07  Carlos Garcia Campos  <cgarcia@igalia.com>
152
153         WebDriver: implement user prompt commands
154         https://bugs.webkit.org/show_bug.cgi?id=174614
155
156         Reviewed by Brian Burg.
157
158         * CommandResult.cpp:
159         (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
160         (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
161         (WebDriver::CommandResult::errorString const): Ditto.
162         * CommandResult.h:
163         * Session.cpp:
164         (WebDriver::Session::dismissAlert):
165         (WebDriver::Session::acceptAlert):
166         (WebDriver::Session::getAlertText):
167         (WebDriver::Session::sendAlertText):
168         * Session.h:
169         * WebDriverService.cpp:
170         (WebDriver::WebDriverService::dismissAlert):
171         (WebDriver::WebDriverService::acceptAlert):
172         (WebDriver::WebDriverService::getAlertText):
173         (WebDriver::WebDriverService::sendAlertText):
174         * WebDriverService.h:
175
176 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
177
178         [GTK][WPE] Add API to provide browser information required by automation
179         https://bugs.webkit.org/show_bug.cgi?id=175130
180
181         Reviewed by Brian Burg.
182
183         * Session.cpp:
184         (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
185         with error in that case.
186         * SessionHost.h:
187         * glib/SessionHostGlib.cpp:
188         (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
189         been launched.
190         (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
191         capabilities and calling matchCapabilities() to match them.
192         (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
193         capabilities.
194
195 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
196
197         WebDriver: Implement page load strategy
198         https://bugs.webkit.org/show_bug.cgi?id=175183
199
200         Reviewed by Brian Burg.
201
202         Validate and parse page load strategy when processing capabilities.
203
204         * Capabilities.h:
205         * Session.cpp:
206         (WebDriver::Session::pageLoadStrategyString const): Helper to get the page load strategy as a String to be
207         passed to Automation.
208         (WebDriver::Session::go): Pass page load strategy if present.
209         (WebDriver::Session::back): Ditto.
210         (WebDriver::Session::forward): Ditto.
211         (WebDriver::Session::refresh): Ditto.
212         (WebDriver::Session::waitForNavigationToComplete): Ditto.
213         * Session.h:
214         * WebDriverService.cpp:
215         (WebDriver::deserializePageLoadStrategy):
216         (WebDriver::WebDriverService::parseCapabilities const):
217         (WebDriver::WebDriverService::validatedCapabilities const):
218         (WebDriver::WebDriverService::newSession):
219
220 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
221
222         Unreviewed. Try to fix build with clang after r220315.
223
224         * WebDriverService.cpp:
225         (WebDriver::WebDriverService::validatedCapabilities const):
226         (WebDriver::WebDriverService::mergeCapabilities const):
227
228 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
229
230         WebDriver: properly handle capabilities and process firstMatch too
231         https://bugs.webkit.org/show_bug.cgi?id=174618
232
233         Reviewed by Brian Burg.
234
235         Implement processing of capabilities following the spec. This patch adds validation, merging and matching of
236         capabilities.
237
238         7.2 Processing Capabilities.
239         https://w3c.github.io/webdriver/webdriver-spec.html#processing-capabilities
240
241         * Capabilities.h: Make all capabilities optional and move Timeouts struct here.
242         * Session.h:
243         * WebDriverService.cpp:
244         (WebDriver::deserializeTimeouts): Helper to extract timeouts from JSON object.
245         (WebDriver::WebDriverService::parseCapabilities const): At this point capabilities have already been validated,
246         so we just need to get them without checking the value type.
247         (WebDriver::WebDriverService::validatedCapabilities const): Validate the given capabilities, ensuring types of
248         values are the expected one.
249         (WebDriver::WebDriverService::mergeCapabilities const): Merge the alwaysMatch and firstMatch capabilities into a
250         single object ensuring that the same capability is not in both.
251         (WebDriver::WebDriverService::matchCapabilities const): Try to match the merged capabilities againt the platform
252         expected capabilities.
253         (WebDriver::WebDriverService::processCapabilities const): Validate, merge and match the capabilities.
254         (WebDriver::WebDriverService::newSession): Use processCapabilities(). Also initialize the timeouts from
255         capabilities and add all capabilities to the command result.
256         (WebDriver::WebDriverService::setTimeouts): Use deserializeTimeouts().
257         * WebDriverService.h:
258         * glib/SessionHostGlib.cpp:
259         (WebDriver::SessionHost::launchBrowser): Updated to properly access the capabilities that are now optional.
260         (WebDriver::SessionHost::startAutomationSession): Add FIXME.
261         * gtk/WebDriverServiceGtk.cpp:
262         (WebDriver::WebDriverService::platformCapabilities): Return the Capabilities with the known required ones filled.
263         (WebDriver::WebDriverService::platformValidateCapability const): Validate webkitgtk:browserOptions.
264         (WebDriver::WebDriverService::platformMatchCapability const): This does nothing for now.
265         (WebDriver::WebDriverService::platformCompareBrowserVersions): Compare the given browser versions.
266         (WebDriver::WebDriverService::platformParseCapabilities const): Updated now that capabilites have already been
267         validated before.
268
269 2017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
270
271         WebDriver: use in-view center point for clicks instead of bounding box center point
272         https://bugs.webkit.org/show_bug.cgi?id=174863
273
274         Reviewed by Simon Fraser.
275
276         The center of the element bounding box is not always part of the element, like in multiline links, for example.
277
278         11.1 Element Interactability.
279         https://www.w3.org/TR/webdriver/#dfn-in-view-center-point
280
281         * CommandResult.cpp:
282         (WebDriver::CommandResult::httpStatusCode): Add ElementClickIntercepted and ElementNotInteractable errors.
283         (WebDriver::CommandResult::errorString): Ditto.
284         * CommandResult.h: Ditto.
285         * Session.cpp:
286         (WebDriver::Session::computeElementLayout): Get the in-view center point and isObscured from the result too.
287         (WebDriver::Session::getElementRect): Ignore in-view center point and isObscured.
288         (WebDriver::Session::elementClick): Fail in case the element is not interactable or is obscured.
289         * Session.h:
290
291 2017-08-01  Michael Catanzaro  <mcatanzaro@igalia.com>
292
293         [CMake] WebKitFS.cmake depends on options set in Option cmake files that are included later
294         https://bugs.webkit.org/show_bug.cgi?id=174855
295
296         Reviewed by Carlos Garcia Campos.
297
298         Don't create derived sources directory here anymore.
299
300         * PlatformGTK.cmake:
301
302 2017-07-26  Carlos Garcia Campos  <cgarcia@igalia.com>
303
304         Unreviewed. Fix GTK distcheck.
305
306         Ensure WebDriver derived sources directory is created, WebKitFS.cmake is useless for this.
307
308         * PlatformGTK.cmake:
309
310 2017-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
311
312         WebDriver: rename m_browsingContext as m_currentBrowsingContext in Session
313         https://bugs.webkit.org/show_bug.cgi?id=174783
314
315         Reviewed by Brian Burg.
316
317         We have m_toplevelBrowsingContext and m_browsingContext, which is confusing. m_browsingContext is actually the
318         current browsing context, and the spec also refers to it as the current browsing context, so better use
319         m_currentBrowsingContext.
320
321         * Session.cpp:
322         (WebDriver::Session::switchToTopLevelBrowsingContext):
323         (WebDriver::Session::switchToBrowsingContext):
324         (WebDriver::Session::switchToFrame):
325         (WebDriver::Session::switchToParentFrame):
326         (WebDriver::Session::computeElementLayout):
327         (WebDriver::Session::findElements):
328         (WebDriver::Session::isElementSelected):
329         (WebDriver::Session::getElementText):
330         (WebDriver::Session::getElementTagName):
331         (WebDriver::Session::isElementEnabled):
332         (WebDriver::Session::isElementDisplayed):
333         (WebDriver::Session::getElementAttribute):
334         (WebDriver::Session::waitForNavigationToComplete):
335         (WebDriver::Session::elementClear):
336         (WebDriver::Session::elementSendKeys):
337         (WebDriver::Session::elementSubmit):
338         (WebDriver::Session::executeScript):
339         * Session.h:
340
341 2017-07-20  Carlos Garcia Campos  <cgarcia@igalia.com>
342
343         WebDriver: implement page load timeout
344         https://bugs.webkit.org/show_bug.cgi?id=174672
345
346         Reviewed by Brian Burg.
347
348         Handle timeout errors and pass the page load timeout to waitForNavigationToComplete and all other navigation
349         commands. Also fix the setTimeouts command that was still using the legacy name of the page load timeout,
350         instead of the one in the spec.
351
352         8. Sessions
353         https://www.w3.org/TR/webdriver/#dfn-session-page-load-timeout
354
355         * CommandResult.cpp:
356         (WebDriver::CommandResult::CommandResult):
357         (WebDriver::CommandResult::httpStatusCode):
358         (WebDriver::CommandResult::errorString):
359         * CommandResult.h:
360         * Session.cpp:
361         (WebDriver::Session::go):
362         (WebDriver::Session::back):
363         (WebDriver::Session::forward):
364         (WebDriver::Session::refresh):
365         (WebDriver::Session::waitForNavigationToComplete):
366         * WebDriverService.cpp:
367         (WebDriver::WebDriverService::setTimeouts):
368
369 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
370
371         WebDriver: wait until navigation is complete before running new commands and after a click
372         https://bugs.webkit.org/show_bug.cgi?id=174670
373
374         Reviewed by Brian Burg.
375
376         We are already waiting for navigation to complete after navigation commands (go, back, forward, refresh), but
377         the spec says we should always wait before executing a new command and also after a click. This is causing test
378         testShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes to sometimes fail, because it does .click()
379         + .title and expects the title to tbe the one of the page loaded by the click. Since the load happens very fast,
380         the test usually passes, but in a real case with a slower load, the title of the previous page will be returned
381         most of the times.
382
383         6.3 Processing Model. Step 7. Wait for navigation to complete. If this returns an error return its value and
384         jump to step 1 in this overall algorithm, otherwise continue.
385         https://www.w3.org/TR/webdriver/#processing-model
386
387         14.1 Element Click. Step 10. If the click causes navigation: 1. Run the post-navigation checks and return its
388         value if it is an error. 2. Try to wait for navigation to complete.
389         https://www.w3.org/TR/webdriver/#element-click
390
391         * Session.cpp:
392         (WebDriver::Session::waitForNavigationToComplete): Send waitForNavigationToComplete message to the browser to
393         wait for any pending navigation of current browsing context to complete.
394         (WebDriver::Session::elementClick): Call waitForNavigationToComplete() after the click.
395         * Session.h:
396         * WebDriverService.cpp:
397         (WebDriver::WebDriverService::go): Wait for navigations to complete before running the command.
398         (WebDriver::WebDriverService::getCurrentURL): Ditto.
399         (WebDriver::WebDriverService::back): Ditto.
400         (WebDriver::WebDriverService::forward): Ditto.
401         (WebDriver::WebDriverService::refresh): Ditto.
402         (WebDriver::WebDriverService::getTitle): Ditto.
403         (WebDriver::WebDriverService::switchToFrame): Ditto.
404         (WebDriver::WebDriverService::switchToParentFrame): Ditto.
405         (WebDriver::WebDriverService::findElement): Ditto.
406         (WebDriver::WebDriverService::findElements): Ditto.
407         (WebDriver::WebDriverService::executeScript): Ditto.
408         (WebDriver::WebDriverService::executeAsyncScript): Ditto.
409
410 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
411
412         WebDriver: correctly handle main frame handles
413         https://bugs.webkit.org/show_bug.cgi?id=174668
414
415         Reviewed by Brian Burg.
416
417         When I switched to use std::optional instead of empty strings for the browsing contexts in WebDriver, I forgot
418         that automation uses empty string for frames to refer to the main frame. We should handle that case, because we
419         are currently considering empty strings as valid browsing context. It's not a big deal because Automation
420         converts back the empty string received to the main frame, though. We should also ensure we close the current
421         browsing context when switching to a new top level browsing context. This patch adds to helper private methods
422         to switch browsing contexts that deal with the special cases.
423
424         * Session.cpp:
425         (WebDriver::Session::close):
426         (WebDriver::Session::switchToTopLevelBrowsingContext):
427         (WebDriver::Session::switchToBrowsingContext):
428         (WebDriver::Session::createTopLevelBrowsingContext):
429         (WebDriver::Session::go):
430         (WebDriver::Session::back):
431         (WebDriver::Session::forward):
432         (WebDriver::Session::refresh):
433         (WebDriver::Session::switchToWindow):
434         (WebDriver::Session::switchToFrame):
435         (WebDriver::Session::switchToParentFrame):
436         * Session.h:
437
438 2017-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
439
440         WebDriver: handle invalid selector errors
441         https://bugs.webkit.org/show_bug.cgi?id=174619
442
443         Reviewed by Brian Burg.
444
445         Add InvalidSelector error and handle it in case of protocol server error.
446
447         * CommandResult.cpp:
448         (WebDriver::CommandResult::CommandResult):
449         (WebDriver::CommandResult::httpStatusCode):
450         (WebDriver::CommandResult::errorString):
451         * CommandResult.h:
452
453 2017-07-18  Carlos Alberto Lopez Perez  <clopez@igalia.com>
454
455         [GTK] Fix build with Clang after r219605.
456         https://bugs.webkit.org/show_bug.cgi?id=166682
457
458         Unreviewed build fix.
459
460         Clang-3.8 complains with the following error:
461         non-constant-expression cannot be narrowed from type 'gboolean' (aka 'int') to 'bool' in initializer list [-Wc++11-narrowing]
462
463         * glib/SessionHostGlib.cpp: insert an explicit cast to silence this issue.
464
465 2017-07-13  Carlos Garcia Campos  <cgarcia@igalia.com>
466
467         Add initial implementation of WebDriver process to run the HTTP server
468         https://bugs.webkit.org/show_bug.cgi?id=166682
469
470         Reviewed by Brian Burg.
471
472         Add WebDriver process that runs the HTTP server and implements an initial set of commands. Most of the code is
473         cross-platform, only the HTTP server implementation, the code to launch the browser and the communication with
474         the remote inspector requires platform specific code. This patch includes the GTK port implementation, using
475         libsoup for the HTTP server, and GLib for launching the browser and communicating with the remote
476         inspector. This implementation follows the w3c spec (https://www.w3.org/TR/webdriver) as close as possible, but
477         using the official selenium python tests as reference.
478
479         * CMakeLists.txt: Added.
480         * Capabilities.h: Added.
481         * CommandResult.cpp: Added.
482         * CommandResult.h: Added.
483         * HTTPServer.cpp: Added.
484         * HTTPServer.h: Added.
485         * PlatformGTK.cmake: Added.
486         * Session.cpp: Added.
487         * Session.h: Added.
488         * SessionHost.cpp: Added.
489         * SessionHost.h: Added.
490         * WebDriverMain.cpp: Added.
491         * WebDriverService.cpp: Added.
492         * WebDriverService.h: Added.
493         * config.h: Added.
494         * glib/SessionHostGlib.cpp: Added.
495         * gtk/WebDriverServiceGtk.cpp: Added.
496         * soup/HTTPServerSoup.cpp: Added.