Index: mojo/shell/application_manager.cc |
diff --git a/mojo/shell/application_manager.cc b/mojo/shell/application_manager.cc |
index d953a9013ef81095b6a990b827c29044db671e73..10d8d146035d46e065e8185b2bfdfb0c5b2d0856 100644 |
--- a/mojo/shell/application_manager.cc |
+++ b/mojo/shell/application_manager.cc |
@@ -14,6 +14,7 @@ |
#include "mojo/application/public/interfaces/content_handler.mojom.h" |
#include "mojo/public/cpp/bindings/binding.h" |
#include "mojo/public/cpp/bindings/error_handler.h" |
+#include "mojo/shell/content_handler_connection.h" |
#include "mojo/shell/fetcher.h" |
#include "mojo/shell/local_fetcher.h" |
#include "mojo/shell/network_fetcher.h" |
@@ -32,45 +33,6 @@ bool has_created_instance = false; |
} // namespace |
-class ApplicationManager::ContentHandlerConnection : public ErrorHandler { |
- public: |
- ContentHandlerConnection(ApplicationManager* manager, |
- const GURL& content_handler_url, |
- const GURL& requestor_url, |
- const std::string& qualifier) |
- : manager_(manager), |
- content_handler_url_(content_handler_url), |
- content_handler_qualifier_(qualifier) { |
- ServiceProviderPtr services; |
- mojo::URLRequestPtr request(mojo::URLRequest::New()); |
- request->url = mojo::String::From(content_handler_url.spec()); |
- manager->ConnectToApplicationInternal( |
- request.Pass(), qualifier, requestor_url, GetProxy(&services), |
- nullptr, base::Closure()); |
- MessagePipe pipe; |
- content_handler_.Bind( |
- InterfacePtrInfo<ContentHandler>(pipe.handle0.Pass(), 0u)); |
- services->ConnectToService(ContentHandler::Name_, pipe.handle1.Pass()); |
- content_handler_.set_error_handler(this); |
- } |
- |
- ContentHandler* content_handler() { return content_handler_.get(); } |
- |
- GURL content_handler_url() { return content_handler_url_; } |
- std::string content_handler_qualifier() { return content_handler_qualifier_; } |
- |
- private: |
- // ErrorHandler implementation: |
- void OnConnectionError() override { manager_->OnContentHandlerError(this); } |
- |
- ApplicationManager* manager_; |
- GURL content_handler_url_; |
- std::string content_handler_qualifier_; |
- ContentHandlerPtr content_handler_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ContentHandlerConnection); |
-}; |
- |
// static |
ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager) |
: manager_(manager) { |
@@ -93,7 +55,9 @@ ApplicationManager::ApplicationManager(Delegate* delegate) |
} |
ApplicationManager::~ApplicationManager() { |
- STLDeleteValues(&url_to_content_handler_); |
+ URLToContentHandlerMap url_to_content_handler(url_to_content_handler_); |
+ for (auto& pair : url_to_content_handler) |
+ pair.second->CloseConnection(); |
TerminateShellConnections(); |
STLDeleteValues(&url_to_loader_); |
STLDeleteValues(&scheme_to_loader_); |
@@ -523,14 +487,13 @@ void ApplicationManager::OnShellImplError(ShellImpl* shell_impl) { |
on_application_end.Run(); |
} |
-void ApplicationManager::OnContentHandlerError( |
+void ApplicationManager::OnContentHandlerConnectionClosed( |
ContentHandlerConnection* content_handler) { |
// Remove the mapping to the content handler. |
auto it = url_to_content_handler_.find( |
std::make_pair(content_handler->content_handler_url(), |
content_handler->content_handler_qualifier())); |
DCHECK(it != url_to_content_handler_.end()); |
- delete it->second; |
url_to_content_handler_.erase(it); |
} |