Index: components/html_viewer/html_viewer.cc |
diff --git a/components/html_viewer/html_viewer.cc b/components/html_viewer/html_viewer.cc |
index fad2bc60c602c8b70512111b4d1183260ddcd76b..fe82f8152e2d1878bc3cba9ff19fa5e10afc535e 100644 |
--- a/components/html_viewer/html_viewer.cc |
+++ b/components/html_viewer/html_viewer.cc |
@@ -40,35 +40,44 @@ namespace html_viewer { |
class HTMLViewer; |
-class HTMLViewerApplication : public mojo::Application { |
+// ApplicationDelegate created by the content handler for a specific url. |
+class HTMLDocumentApplicationDelegate : public mojo::ApplicationDelegate { |
public: |
- HTMLViewerApplication(InterfaceRequest<Application> request, |
- URLResponsePtr response, |
- Setup* setup) |
- : app_refcount_(setup->app()->app_lifetime_helper()->CreateAppRefCount()), |
+ HTMLDocumentApplicationDelegate( |
+ mojo::InterfaceRequest<mojo::Application> request, |
+ mojo::URLResponsePtr response, |
+ Setup* setup, |
+ scoped_ptr<mojo::AppRefCount> parent_app_refcount) |
+ : app_(this, |
+ request.Pass(), |
+ base::Bind(&HTMLDocumentApplicationDelegate::OnTerminate, |
+ base::Unretained(this))), |
+ parent_app_refcount_(parent_app_refcount.Pass()), |
url_(response->url), |
- binding_(this, request.Pass()), |
initial_response_(response.Pass()), |
- setup_(setup) { |
- } |
+ setup_(setup) {} |
+ |
+ private: |
+ ~HTMLDocumentApplicationDelegate() override {} |
- ~HTMLViewerApplication() override { |
+ // Callback from the quit closure. We key off this rather than |
+ // ApplicationDelegate::Quit() as we don't want to shut down the messageloop |
+ // when we quit (the messageloop is shared among multiple |
+ // HTMLDocumentApplicationDelegates). |
+ void OnTerminate() { |
+ delete this; |
} |
- void Initialize(ShellPtr shell, const String& url) override { |
- shell_ = shell.Pass(); |
+ // ApplicationDelegate; |
+ void Initialize(mojo::ApplicationImpl* app) override { |
mojo::URLRequestPtr request(mojo::URLRequest::New()); |
request->url = mojo::String::From("mojo:network_service"); |
- setup_->app()->ConnectToService(request.Pass(), &network_service_); |
+ app_.ConnectToService(request.Pass(), (&network_service_)); |
} |
- |
- void AcceptConnection(const String& requestor_url, |
- InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services, |
- const String& url) override { |
+ bool ConfigureIncomingConnection( |
+ mojo::ApplicationConnection* connection) override { |
if (initial_response_) { |
- OnResponseReceived(URLLoaderPtr(), services.Pass(), |
- initial_response_.Pass()); |
+ OnResponseReceived(URLLoaderPtr(), connection, initial_response_.Pass()); |
} else { |
URLLoaderPtr loader; |
network_service_->CreateURLLoader(GetProxy(&loader)); |
@@ -76,60 +85,59 @@ class HTMLViewerApplication : public mojo::Application { |
request->url = url_; |
request->auto_follow_redirects = true; |
- // |loader| will be pass to the OnResponseReceived method through a |
+ // |loader| will be passed to the OnResponseReceived method through a |
// callback. Because order of evaluation is undefined, a reference to the |
// raw pointer is needed. |
mojo::URLLoader* raw_loader = loader.get(); |
raw_loader->Start( |
request.Pass(), |
- base::Bind(&HTMLViewerApplication::OnResponseReceived, |
+ base::Bind(&HTMLDocumentApplicationDelegate::OnResponseReceived, |
base::Unretained(this), base::Passed(&loader), |
- base::Passed(&services))); |
+ connection)); |
} |
+ return true; |
} |
- void OnQuitRequested(const mojo::Callback<void(bool)>& callback) override { |
- callback.Run(true); |
- delete this; |
- } |
- |
- private: |
void OnResponseReceived(URLLoaderPtr loader, |
- InterfaceRequest<ServiceProvider> services, |
+ mojo::ApplicationConnection* connection, |
URLResponsePtr response) { |
// HTMLDocument is destroyed when the hosting view is destroyed. |
// TODO(sky): when headless, this leaks. |
- new HTMLDocument(services.Pass(), response.Pass(), shell_.Pass(), setup_); |
+ // TODO(sky): this needs to delete if serviceprovider goes away too. |
+ new HTMLDocument(&app_, connection, response.Pass(), setup_); |
} |
- scoped_ptr<mojo::AppRefCount> app_refcount_; |
- String url_; |
- mojo::StrongBinding<mojo::Application> binding_; |
- ShellPtr shell_; |
+ mojo::ApplicationImpl app_; |
+ // AppRefCount of the parent (HTMLViewer). |
+ scoped_ptr<mojo::AppRefCount> parent_app_refcount_; |
+ const String url_; |
mojo::NetworkServicePtr network_service_; |
URLResponsePtr initial_response_; |
Setup* setup_; |
- DISALLOW_COPY_AND_ASSIGN(HTMLViewerApplication); |
+ DISALLOW_COPY_AND_ASSIGN(HTMLDocumentApplicationDelegate); |
}; |
class ContentHandlerImpl : public mojo::ContentHandler { |
public: |
ContentHandlerImpl(Setup* setup, |
+ mojo::ApplicationImpl* app, |
mojo::InterfaceRequest<ContentHandler> request) |
- : setup_(setup), |
- binding_(this, request.Pass()) {} |
+ : setup_(setup), app_(app), binding_(this, request.Pass()) {} |
~ContentHandlerImpl() override {} |
private: |
// Overridden from ContentHandler: |
void StartApplication(InterfaceRequest<mojo::Application> request, |
URLResponsePtr response) override { |
- // HTMLViewerApplication is owned by the binding. |
- new HTMLViewerApplication(request.Pass(), response.Pass(), setup_); |
+ // HTMLDocumentApplicationDelegate deletes itself. |
+ new HTMLDocumentApplicationDelegate( |
+ request.Pass(), response.Pass(), setup_, |
+ app_->app_lifetime_helper()->CreateAppRefCount()); |
} |
Setup* setup_; |
+ mojo::ApplicationImpl* app_; |
mojo::StrongBinding<mojo::ContentHandler> binding_; |
DISALLOW_COPY_AND_ASSIGN(ContentHandlerImpl); |
@@ -138,12 +146,13 @@ class ContentHandlerImpl : public mojo::ContentHandler { |
class HTMLViewer : public mojo::ApplicationDelegate, |
public mojo::InterfaceFactory<ContentHandler> { |
public: |
- HTMLViewer() {} |
+ HTMLViewer() : app_(nullptr) {} |
~HTMLViewer() override {} |
private: |
// Overridden from ApplicationDelegate: |
void Initialize(mojo::ApplicationImpl* app) override { |
+ app_ = app; |
setup_.reset(new Setup(app)); |
} |
@@ -162,10 +171,11 @@ class HTMLViewer : public mojo::ApplicationDelegate, |
// Overridden from InterfaceFactory<ContentHandler> |
void Create(ApplicationConnection* connection, |
mojo::InterfaceRequest<ContentHandler> request) override { |
- new ContentHandlerImpl(setup_.get(), request.Pass()); |
+ new ContentHandlerImpl(setup_.get(), app_, request.Pass()); |
} |
scoped_ptr<Setup> setup_; |
+ mojo::ApplicationImpl* app_; |
DISALLOW_COPY_AND_ASSIGN(HTMLViewer); |
}; |