Diff
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog 2017-08-17 07:50:38 UTC (rev 220845)
@@ -1,3 +1,40 @@
+2017-07-28 Carlos Garcia Campos <[email protected]>
+
+ WebDriver: fix return value of close window command
+ https://bugs.webkit.org/show_bug.cgi?id=174861
+
+ Reviewed by Brian Burg.
+
+ We are currently returning null, but we should return the list of window handles, and try to close the session
+ if there aren't more window handles.
+
+ 10.2 Close Window
+ https://w3c.github.io/webdriver/webdriver-spec.html#close-window
+
+ 3. If there are no more open top-level browsing contexts, then try to close the session.
+ 4. Return the result of running the remote end steps for the Get Window Handles command.
+
+ * Session.cpp:
+ (WebDriver::Session::closeAllToplevelBrowsingContexts): Helper function to close the given toplevel browsing
+ context and the next one if there are more.
+ (WebDriver::Session::close): Call closeAllToplevelBrowsingContexts() to delete all toplevel browsing contexts of
+ the session.
+ (WebDriver::Session::closeTopLevelBrowsingContext): Close the given toplevel browsing context and call
+ getWindowHandles() when done.
+ (WebDriver::Session::closeWindow): Call closeTopLevelBrowsingContext() passing the current toplevel browsing context.
+ (WebDriver::Session::getWindowHandles): Remove the early return, this command doesn't depend on a current
+ toplevel browsing context.
+ * Session.h:
+ * SessionHost.h:
+ * WebDriverService.cpp:
+ (WebDriver::WebDriverService::run): Disconnect the server when main loop quits.
+ (WebDriver::WebDriverService::deleteSession): Do not fail if the given session is not active.
+ (WebDriver::WebDriverService::closeWindow): Remove the session if the closed window was the last one.
+ * WebDriverService.h: Remove unused quit() method.
+ * glib/SessionHostGlib.cpp:
+ (WebDriver::SessionHost::isConnected): Return whether host is connected to a browser instance.
+ (WebDriver::SessionHost::dbusConnectionClosedCallback): Delete m_browser.
+
2017-08-14 Carlos Garcia Campos <[email protected]>
WebDriver: handle click events on option elements
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp 2017-08-17 07:50:38 UTC (rev 220845)
@@ -57,6 +57,26 @@
return m_host->capabilities();
}
+void Session::closeAllToplevelBrowsingContexts(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&& completionHandler)
+{
+ closeTopLevelBrowsingContext(toplevelBrowsingContext, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+ if (result.isError()) {
+ completionHandler(WTFMove(result));
+ return;
+ }
+ RefPtr<InspectorArray> handles;
+ if (result.result()->asArray(handles) && handles->length()) {
+ auto handleValue = handles->get(0);
+ String handle;
+ if (handleValue->asString(handle)) {
+ closeAllToplevelBrowsingContexts(handle, WTFMove(completionHandler));
+ return;
+ }
+ }
+ completionHandler(CommandResult::success());
+ });
+}
+
void Session::close(Function<void (CommandResult&&)>&& completionHandler)
{
if (!m_toplevelBrowsingContext) {
@@ -64,16 +84,8 @@
return;
}
- RefPtr<InspectorObject> parameters = InspectorObject::create();
- parameters->setString(ASCIILiteral("handle"), m_toplevelBrowsingContext.value());
- m_host->sendCommandToBackend(ASCIILiteral("closeBrowsingContext"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {
- if (response.isError) {
- completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
- return;
- }
- switchToTopLevelBrowsingContext(std::nullopt);
- completionHandler(CommandResult::success());
- });
+ auto toplevelBrowsingContext = std::exchange(m_toplevelBrowsingContext, std::nullopt);
+ closeAllToplevelBrowsingContexts(toplevelBrowsingContext.value(), WTFMove(completionHandler));
}
void Session::setTimeouts(const Timeouts& timeouts, Function<void (CommandResult&&)>&& completionHandler)
@@ -426,6 +438,32 @@
});
}
+void Session::closeTopLevelBrowsingContext(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&& completionHandler)
+{
+ RefPtr<InspectorObject> parameters = InspectorObject::create();
+ parameters->setString(ASCIILiteral("handle"), toplevelBrowsingContext);
+ m_host->sendCommandToBackend(ASCIILiteral("closeBrowsingContext"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) mutable {
+ if (!m_host->isConnected()) {
+ // Closing the browsing context made the browser quit.
+ completionHandler(CommandResult::success(InspectorArray::create()));
+ return;
+ }
+ if (response.isError) {
+ completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
+ return;
+ }
+
+ getWindowHandles([this, completionHandler = WTFMove(completionHandler)](CommandResult&& result) {
+ if (!m_host->isConnected()) {
+ // Closing the browsing context made the browser quit.
+ completionHandler(CommandResult::success(InspectorArray::create()));
+ return;
+ }
+ completionHandler(WTFMove(result));
+ });
+ });
+}
+
void Session::closeWindow(Function<void (CommandResult&&)>&& completionHandler)
{
if (!m_toplevelBrowsingContext) {
@@ -438,7 +476,8 @@
completionHandler(WTFMove(result));
return;
}
- close(WTFMove(completionHandler));
+ auto toplevelBrowsingContext = std::exchange(m_toplevelBrowsingContext, std::nullopt);
+ closeTopLevelBrowsingContext(toplevelBrowsingContext.value(), WTFMove(completionHandler));
});
}
@@ -458,11 +497,6 @@
void Session::getWindowHandles(Function<void (CommandResult&&)>&& completionHandler)
{
- if (!m_toplevelBrowsingContext) {
- completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
- return;
- }
-
m_host->sendCommandToBackend(ASCIILiteral("getBrowsingContexts"), InspectorObject::create(), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {
if (response.isError || !response.responseObject) {
completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.h (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.h 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.h 2017-08-17 07:50:38 UTC (rev 220845)
@@ -104,6 +104,8 @@
void switchToTopLevelBrowsingContext(std::optional<String>);
void switchToBrowsingContext(std::optional<String>);
+ void closeTopLevelBrowsingContext(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&&);
+ void closeAllToplevelBrowsingContexts(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&&);
std::optional<String> pageLoadStrategyString() const;
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/SessionHost.cpp (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/SessionHost.cpp 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/SessionHost.cpp 2017-08-17 07:50:38 UTC (rev 220845)
@@ -35,13 +35,13 @@
void SessionHost::inspectorDisconnected()
{
- if (!m_closeMessageID)
- return;
-
- // Closing the browsing context made the browser quit.
- auto responseHandler = m_commandRequests.take(m_closeMessageID);
- m_closeMessageID = 0;
- responseHandler({ });
+ // Browser closed or crashed, finish all pending commands with error.
+ Vector<long> messages;
+ copyKeysToVector(m_commandRequests, messages);
+ for (auto messageID : messages) {
+ auto responseHandler = m_commandRequests.take(messageID);
+ responseHandler({ nullptr, true });
+ }
}
long SessionHost::sendCommandToBackend(const String& command, RefPtr<InspectorObject>&& parameters, Function<void (CommandResponse&&)>&& responseHandler)
@@ -49,8 +49,6 @@
static long lastSequenceID = 0;
long sequenceID = ++lastSequenceID;
m_commandRequests.add(sequenceID, WTFMove(responseHandler));
- if (command == "closeBrowsingContext")
- m_closeMessageID = sequenceID;
StringBuilder messageBuilder;
messageBuilder.appendLiteral("{\"id\":");
messageBuilder.appendNumber(sequenceID);
@@ -81,9 +79,6 @@
if (!messageObject->getInteger(ASCIILiteral("id"), sequenceID))
return;
- if (m_closeMessageID == sequenceID)
- m_closeMessageID = 0;
-
auto responseHandler = m_commandRequests.take(sequenceID);
ASSERT(responseHandler);
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/SessionHost.h (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/SessionHost.h 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/SessionHost.h 2017-08-17 07:50:38 UTC (rev 220845)
@@ -52,6 +52,8 @@
}
~SessionHost();
+ bool isConnected() const;
+
const Capabilities& capabilities() const { return m_capabilities; }
enum class Succeeded { No, Yes };
@@ -92,7 +94,6 @@
Target m_target;
HashMap<long, Function<void (CommandResponse&&)>> m_commandRequests;
- long m_closeMessageID { 0 };
#if USE(GLIB)
Function<void (std::optional<String>)> m_startSessionCompletionHandler;
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.cpp (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.cpp 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.cpp 2017-08-17 07:50:38 UTC (rev 220845)
@@ -95,15 +95,11 @@
RunLoop::run();
+ m_server.disconnect();
+
return EXIT_SUCCESS;
}
-void WebDriverService::quit()
-{
- m_server.disconnect();
- RunLoop::main().stop();
-}
-
const WebDriverService::Command WebDriverService::s_commands[] = {
{ HTTPMethod::Post, "/session", &WebDriverService::newSession },
{ HTTPMethod::Delete, "/session/$sessionId", &WebDriverService::deleteSession },
@@ -637,14 +633,15 @@
auto session = m_sessions.take(sessionID);
if (!session) {
- completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidSessionID));
+ completionHandler(CommandResult::success());
return;
}
- if (m_activeSession == session.get())
- m_activeSession = nullptr;
-
- session->close(WTFMove(completionHandler));
+ session->close([this, session, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+ if (m_activeSession == session.get())
+ m_activeSession = nullptr;
+ completionHandler(WTFMove(result));
+ });
}
void WebDriverService::setTimeouts(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
@@ -838,8 +835,24 @@
{
// ยง10.2 Close Window.
// https://www.w3.org/TR/webdriver/#close-window
- if (auto session = findSessionOrCompleteWithError(*parameters, completionHandler))
- session->closeWindow(WTFMove(completionHandler));
+ auto session = findSessionOrCompleteWithError(*parameters, completionHandler);
+ if (!session)
+ return;
+
+ session->closeWindow([this, session, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+ if (result.isError()) {
+ completionHandler(WTFMove(result));
+ return;
+ }
+
+ RefPtr<InspectorArray> handles;
+ if (result.result()->asArray(handles) && !handles->length()) {
+ m_sessions.remove(session->id());
+ if (m_activeSession == session.get())
+ m_activeSession = nullptr;
+ }
+ completionHandler(WTFMove(result));
+ });
}
void WebDriverService::switchToWindow(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.h (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.h 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.h 2017-08-17 07:50:38 UTC (rev 220845)
@@ -48,7 +48,6 @@
~WebDriverService() = default;
int run(int argc, char** argv);
- void quit();
static bool platformCompareBrowserVersions(const String&, const String&);
Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/glib/SessionHostGlib.cpp (220844 => 220845)
--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/glib/SessionHostGlib.cpp 2017-08-17 07:50:01 UTC (rev 220844)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/glib/SessionHostGlib.cpp 2017-08-17 07:50:38 UTC (rev 220845)
@@ -103,6 +103,11 @@
launchBrowser(WTFMove(completionHandler));
}
+bool SessionHost::isConnected() const
+{
+ return !!m_browser;
+}
+
struct ConnectToBrowserAsyncData {
ConnectToBrowserAsyncData(SessionHost* sessionHost, GUniquePtr<char>&& dbusAddress, GCancellable* cancellable, Function<void (SessionHost::Succeeded)>&& completionHandler)
: sessionHost(sessionHost)
@@ -195,6 +200,7 @@
void SessionHost::dbusConnectionClosedCallback(SessionHost* sessionHost)
{
+ sessionHost->m_browser = nullptr;
sessionHost->inspectorDisconnected();
}