Changeset 220794 in webkit
- Timestamp:
- Aug 16, 2017 4:38:22 AM (7 years ago)
- Location:
- trunk/Source/WebDriver
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebDriver/ChangeLog
r220740 r220794 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 1 38 2017-08-14 Carlos Garcia Campos <cgarcia@igalia.com> 2 39 -
trunk/Source/WebDriver/Session.cpp
r220740 r220794 58 58 } 59 59 60 void Session::closeAllToplevelBrowsingContexts(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&& completionHandler) 61 { 62 closeTopLevelBrowsingContext(toplevelBrowsingContext, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable { 63 if (result.isError()) { 64 completionHandler(WTFMove(result)); 65 return; 66 } 67 RefPtr<InspectorArray> handles; 68 if (result.result()->asArray(handles) && handles->length()) { 69 auto handleValue = handles->get(0); 70 String handle; 71 if (handleValue->asString(handle)) { 72 closeAllToplevelBrowsingContexts(handle, WTFMove(completionHandler)); 73 return; 74 } 75 } 76 completionHandler(CommandResult::success()); 77 }); 78 } 79 60 80 void Session::close(Function<void (CommandResult&&)>&& completionHandler) 61 81 { … … 65 85 } 66 86 67 RefPtr<InspectorObject> parameters = InspectorObject::create(); 68 parameters->setString(ASCIILiteral("handle"), m_toplevelBrowsingContext.value()); 69 m_host->sendCommandToBackend(ASCIILiteral("closeBrowsingContext"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) { 70 if (response.isError) { 71 completionHandler(CommandResult::fail(WTFMove(response.responseObject))); 72 return; 73 } 74 switchToTopLevelBrowsingContext(std::nullopt); 75 completionHandler(CommandResult::success()); 76 }); 87 auto toplevelBrowsingContext = std::exchange(m_toplevelBrowsingContext, std::nullopt); 88 closeAllToplevelBrowsingContexts(toplevelBrowsingContext.value(), WTFMove(completionHandler)); 77 89 } 78 90 … … 427 439 } 428 440 441 void Session::closeTopLevelBrowsingContext(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&& completionHandler) 442 { 443 RefPtr<InspectorObject> parameters = InspectorObject::create(); 444 parameters->setString(ASCIILiteral("handle"), toplevelBrowsingContext); 445 m_host->sendCommandToBackend(ASCIILiteral("closeBrowsingContext"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) mutable { 446 if (!m_host->isConnected()) { 447 // Closing the browsing context made the browser quit. 448 completionHandler(CommandResult::success(InspectorArray::create())); 449 return; 450 } 451 if (response.isError) { 452 completionHandler(CommandResult::fail(WTFMove(response.responseObject))); 453 return; 454 } 455 456 getWindowHandles([this, completionHandler = WTFMove(completionHandler)](CommandResult&& result) { 457 if (!m_host->isConnected()) { 458 // Closing the browsing context made the browser quit. 459 completionHandler(CommandResult::success(InspectorArray::create())); 460 return; 461 } 462 completionHandler(WTFMove(result)); 463 }); 464 }); 465 } 466 429 467 void Session::closeWindow(Function<void (CommandResult&&)>&& completionHandler) 430 468 { … … 439 477 return; 440 478 } 441 close(WTFMove(completionHandler)); 479 auto toplevelBrowsingContext = std::exchange(m_toplevelBrowsingContext, std::nullopt); 480 closeTopLevelBrowsingContext(toplevelBrowsingContext.value(), WTFMove(completionHandler)); 442 481 }); 443 482 } … … 459 498 void Session::getWindowHandles(Function<void (CommandResult&&)>&& completionHandler) 460 499 { 461 if (!m_toplevelBrowsingContext) {462 completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));463 return;464 }465 466 500 m_host->sendCommandToBackend(ASCIILiteral("getBrowsingContexts"), InspectorObject::create(), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) { 467 501 if (response.isError || !response.responseObject) { -
trunk/Source/WebDriver/Session.h
r220740 r220794 105 105 void switchToTopLevelBrowsingContext(std::optional<String>); 106 106 void switchToBrowsingContext(std::optional<String>); 107 void closeTopLevelBrowsingContext(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&&); 108 void closeAllToplevelBrowsingContexts(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&&); 107 109 108 110 std::optional<String> pageLoadStrategyString() const; -
trunk/Source/WebDriver/SessionHost.cpp
r219605 r220794 36 36 void SessionHost::inspectorDisconnected() 37 37 { 38 if (!m_closeMessageID)39 return;40 41 // Closing the browsing context made the browser quit.42 auto responseHandler = m_commandRequests.take(m_closeMessageID);43 m_closeMessageID = 0;44 responseHandler({ });38 // Browser closed or crashed, finish all pending commands with error. 39 Vector<long> messages; 40 copyKeysToVector(m_commandRequests, messages); 41 for (auto messageID : messages) { 42 auto responseHandler = m_commandRequests.take(messageID); 43 responseHandler({ nullptr, true }); 44 } 45 45 } 46 46 … … 50 50 long sequenceID = ++lastSequenceID; 51 51 m_commandRequests.add(sequenceID, WTFMove(responseHandler)); 52 if (command == "closeBrowsingContext")53 m_closeMessageID = sequenceID;54 52 StringBuilder messageBuilder; 55 53 messageBuilder.appendLiteral("{\"id\":"); … … 82 80 return; 83 81 84 if (m_closeMessageID == sequenceID)85 m_closeMessageID = 0;86 87 82 auto responseHandler = m_commandRequests.take(sequenceID); 88 83 ASSERT(responseHandler); -
trunk/Source/WebDriver/SessionHost.h
r220329 r220794 53 53 ~SessionHost(); 54 54 55 bool isConnected() const; 56 55 57 const Capabilities& capabilities() const { return m_capabilities; } 56 58 … … 93 95 94 96 HashMap<long, Function<void (CommandResponse&&)>> m_commandRequests; 95 long m_closeMessageID { 0 };96 97 97 98 #if USE(GLIB) -
trunk/Source/WebDriver/WebDriverService.cpp
r220403 r220794 96 96 RunLoop::run(); 97 97 98 m_server.disconnect(); 99 98 100 return EXIT_SUCCESS; 99 }100 101 void WebDriverService::quit()102 {103 m_server.disconnect();104 RunLoop::main().stop();105 101 } 106 102 … … 638 634 auto session = m_sessions.take(sessionID); 639 635 if (!session) { 640 completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidSessionID)); 641 return; 642 } 643 644 if (m_activeSession == session.get()) 645 m_activeSession = nullptr; 646 647 session->close(WTFMove(completionHandler)); 636 completionHandler(CommandResult::success()); 637 return; 638 } 639 640 session->close([this, session, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable { 641 if (m_activeSession == session.get()) 642 m_activeSession = nullptr; 643 completionHandler(WTFMove(result)); 644 }); 648 645 } 649 646 … … 839 836 // §10.2 Close Window. 840 837 // https://www.w3.org/TR/webdriver/#close-window 841 if (auto session = findSessionOrCompleteWithError(*parameters, completionHandler)) 842 session->closeWindow(WTFMove(completionHandler)); 838 auto session = findSessionOrCompleteWithError(*parameters, completionHandler); 839 if (!session) 840 return; 841 842 session->closeWindow([this, session, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable { 843 if (result.isError()) { 844 completionHandler(WTFMove(result)); 845 return; 846 } 847 848 RefPtr<InspectorArray> handles; 849 if (result.result()->asArray(handles) && !handles->length()) { 850 m_sessions.remove(session->id()); 851 if (m_activeSession == session.get()) 852 m_activeSession = nullptr; 853 } 854 completionHandler(WTFMove(result)); 855 }); 843 856 } 844 857 -
trunk/Source/WebDriver/WebDriverService.h
r220584 r220794 49 49 50 50 int run(int argc, char** argv); 51 void quit();52 51 53 52 static bool platformCompareBrowserVersions(const String&, const String&); -
trunk/Source/WebDriver/glib/SessionHostGlib.cpp
r220425 r220794 104 104 } 105 105 106 bool SessionHost::isConnected() const 107 { 108 return !!m_browser; 109 } 110 106 111 struct ConnectToBrowserAsyncData { 107 112 ConnectToBrowserAsyncData(SessionHost* sessionHost, GUniquePtr<char>&& dbusAddress, GCancellable* cancellable, Function<void (SessionHost::Succeeded)>&& completionHandler) … … 196 201 void SessionHost::dbusConnectionClosedCallback(SessionHost* sessionHost) 197 202 { 203 sessionHost->m_browser = nullptr; 198 204 sessionHost->inspectorDisconnected(); 199 205 }
Note: See TracChangeset
for help on using the changeset viewer.