Convert ViewProviderApp and ContentViewerApp to implement ApplicationImplBase instead of ApplicationDelegate. R=vardhan@google.com Review URL: https://codereview.chromium.org/2020453003 .
diff --git a/apps/moterm/main.cc b/apps/moterm/main.cc index abeb499..7a41df4 100644 --- a/apps/moterm/main.cc +++ b/apps/moterm/main.cc
@@ -7,10 +7,12 @@ // application.) #include "apps/moterm/moterm_app.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" +#include "mojo/public/cpp/application/run_application.h" MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new MotermApp()); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + MotermApp moterm_app; + return mojo::RunApplication(application_request, &moterm_app); }
diff --git a/apps/moterm/moterm_app.cc b/apps/moterm/moterm_app.cc index a8a45f4..ff78b0e 100644 --- a/apps/moterm/moterm_app.cc +++ b/apps/moterm/moterm_app.cc
@@ -15,6 +15,6 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) { - new MotermView(mojo::CreateApplicationConnector(app_impl()->shell()), + new MotermView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass(), services.Pass()); }
diff --git a/examples/moterm_example_app/moterm_example_app.cc b/examples/moterm_example_app/moterm_example_app.cc index e1ca20e..3a4ad03 100644 --- a/examples/moterm_example_app/moterm_example_app.cc +++ b/examples/moterm_example_app/moterm_example_app.cc
@@ -15,12 +15,11 @@ #include "base/memory/weak_ptr.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "mojo/application/application_runner_chromium.h" #include "mojo/common/binding_set.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" -#include "mojo/public/cpp/application/application_delegate.h" -#include "mojo/public/cpp/application/application_impl.h" #include "mojo/public/cpp/application/connect.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/public/cpp/bindings/array.h" #include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/interfaces/application/service_provider.mojom.h" @@ -166,7 +165,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) override { - new MotermExampleAppView(app_impl()->shell(), view_owner_request.Pass()); + new MotermExampleAppView(shell(), view_owner_request.Pass()); } private: @@ -174,6 +173,7 @@ }; MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new MotermExampleApp()); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + MotermExampleApp moterm_example_app; + return mojo::RunApplication(application_request, &moterm_example_app); }
diff --git a/examples/shadows/main.cc b/examples/shadows/main.cc index 74ec64d..33732aa 100644 --- a/examples/shadows/main.cc +++ b/examples/shadows/main.cc
@@ -3,10 +3,12 @@ // found in the LICENSE file. #include "examples/shadows/shadows_app.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" +#include "mojo/public/cpp/application/run_application.h" MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::ShadowsApp); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::ShadowsApp shadows_app; + return mojo::RunApplication(application_request, &shadows_app); }
diff --git a/examples/shadows/shadows_app.cc b/examples/shadows/shadows_app.cc index 41f4dfe..3f36aad 100644 --- a/examples/shadows/shadows_app.cc +++ b/examples/shadows/shadows_app.cc
@@ -17,7 +17,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) { - new ShadowsView(mojo::CreateApplicationConnector(app_impl()->shell()), + new ShadowsView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass()); }
diff --git a/examples/ui/jank/jank.cc b/examples/ui/jank/jank.cc index 7825251..742e2db 100644 --- a/examples/ui/jank/jank.cc +++ b/examples/ui/jank/jank.cc
@@ -8,9 +8,10 @@ #include "base/bind.h" #include "base/macros.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" #include "mojo/public/cpp/application/connect.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/ui/choreographer.h" #include "mojo/ui/ganesh_view.h" #include "mojo/ui/input_handler.h" @@ -210,7 +211,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) override { - new JankView(mojo::CreateApplicationConnector(app_impl()->shell()), + new JankView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass()); } @@ -221,6 +222,7 @@ } // namespace examples MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::JankApp()); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::JankApp jank_app; + return mojo::RunApplication(application_request, &jank_app); }
diff --git a/examples/ui/noodles/main.cc b/examples/ui/noodles/main.cc index 6aff78e..7427bd1 100644 --- a/examples/ui/noodles/main.cc +++ b/examples/ui/noodles/main.cc
@@ -3,10 +3,12 @@ // found in the LICENSE file. #include "examples/ui/noodles/noodles_app.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" +#include "mojo/public/cpp/application/run_application.h" MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::NoodlesApp); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::NoodlesApp noodles_app; + return mojo::RunApplication(application_request, &noodles_app); }
diff --git a/examples/ui/noodles/noodles_app.cc b/examples/ui/noodles/noodles_app.cc index 5c28d9e..1e31959 100644 --- a/examples/ui/noodles/noodles_app.cc +++ b/examples/ui/noodles/noodles_app.cc
@@ -17,7 +17,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) { - new NoodlesView(mojo::CreateApplicationConnector(app_impl()->shell()), + new NoodlesView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass()); }
diff --git a/examples/ui/pdf_viewer/pdf_viewer.cc b/examples/ui/pdf_viewer/pdf_viewer.cc index f16be50..3043c4b 100644 --- a/examples/ui/pdf_viewer/pdf_viewer.cc +++ b/examples/ui/pdf_viewer/pdf_viewer.cc
@@ -8,14 +8,16 @@ #include "base/bind.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" -#include "mojo/application/application_runner_chromium.h" #include "mojo/data_pipe_utils/data_pipe_utils.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" #include "mojo/public/cpp/application/connect.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/ui/choreographer.h" #include "mojo/ui/content_viewer_app.h" #include "mojo/ui/ganesh_view.h" #include "mojo/ui/input_handler.h" +#include "mojo/ui/view_provider_app.h" #include "third_party/pdfium/fpdfsdk/include/fpdf_ext.h" #include "third_party/pdfium/fpdfsdk/include/fpdfview.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -272,7 +274,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) override { - new PDFDocumentView(mojo::CreateApplicationConnector(app_impl()->shell()), + new PDFDocumentView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass(), pdf_document_); } @@ -311,6 +313,7 @@ } // namespace examples MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::PDFContentViewerApp()); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::PDFContentViewerApp pdf_content_viewer_app; + return mojo::RunApplication(application_request, &pdf_content_viewer_app); }
diff --git a/examples/ui/png_viewer/png_viewer.cc b/examples/ui/png_viewer/png_viewer.cc index 6e89523..2ad6551 100644 --- a/examples/ui/png_viewer/png_viewer.cc +++ b/examples/ui/png_viewer/png_viewer.cc
@@ -7,12 +7,14 @@ #include "base/bind.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" -#include "mojo/application/application_runner_chromium.h" #include "mojo/data_pipe_utils/data_pipe_utils.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" #include "mojo/public/cpp/application/connect.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/ui/content_viewer_app.h" #include "mojo/ui/ganesh_view.h" +#include "mojo/ui/view_provider_app.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImage.h" @@ -121,7 +123,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) override { - new PNGView(mojo::CreateApplicationConnector(app_impl()->shell()), + new PNGView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass(), image_); } @@ -161,6 +163,7 @@ } // namespace examples MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::PNGContentViewerApp()); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::PNGContentViewerApp png_content_viewer_app; + return mojo::RunApplication(application_request, &png_content_viewer_app); }
diff --git a/examples/ui/shapes/main.cc b/examples/ui/shapes/main.cc index bf4925e..1669259 100644 --- a/examples/ui/shapes/main.cc +++ b/examples/ui/shapes/main.cc
@@ -3,10 +3,12 @@ // found in the LICENSE file. #include "examples/ui/shapes/shapes_app.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" +#include "mojo/public/cpp/application/run_application.h" MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::ShapesApp); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::ShapesApp shapes_app; + return mojo::RunApplication(application_request, &shapes_app); }
diff --git a/examples/ui/shapes/shapes_app.cc b/examples/ui/shapes/shapes_app.cc index 4c50654..02ca962 100644 --- a/examples/ui/shapes/shapes_app.cc +++ b/examples/ui/shapes/shapes_app.cc
@@ -17,7 +17,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) { - new ShapesView(mojo::CreateApplicationConnector(app_impl()->shell()), + new ShapesView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass()); }
diff --git a/examples/ui/spinning_cube/main.cc b/examples/ui/spinning_cube/main.cc index fcf0bc2..6bb2ad1 100644 --- a/examples/ui/spinning_cube/main.cc +++ b/examples/ui/spinning_cube/main.cc
@@ -3,10 +3,12 @@ // found in the LICENSE file. #include "examples/ui/spinning_cube/spinning_cube_app.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" +#include "mojo/public/cpp/application/run_application.h" MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::SpinningCubeApp); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::SpinningCubeApp spinning_cube_app; + return mojo::RunApplication(application_request, &spinning_cube_app); }
diff --git a/examples/ui/spinning_cube/spinning_cube_app.cc b/examples/ui/spinning_cube/spinning_cube_app.cc index ea6f507..2908e07 100644 --- a/examples/ui/spinning_cube/spinning_cube_app.cc +++ b/examples/ui/spinning_cube/spinning_cube_app.cc
@@ -17,7 +17,7 @@ const std::string& connection_url, mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, mojo::InterfaceRequest<mojo::ServiceProvider> services) { - new SpinningCubeView(mojo::CreateApplicationConnector(app_impl()->shell()), + new SpinningCubeView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass()); }
diff --git a/examples/ui/tile/main.cc b/examples/ui/tile/main.cc index 930aca3..458388e 100644 --- a/examples/ui/tile/main.cc +++ b/examples/ui/tile/main.cc
@@ -3,10 +3,12 @@ // found in the LICENSE file. #include "examples/ui/tile/tile_app.h" -#include "mojo/application/application_runner_chromium.h" +#include "mojo/environment/scoped_chromium_init.h" #include "mojo/public/c/system/main.h" +#include "mojo/public/cpp/application/run_application.h" MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunnerChromium runner(new examples::TileApp); - return runner.Run(application_request); + mojo::ScopedChromiumInit init; + examples::TileApp tile_app; + return mojo::RunApplication(application_request, &tile_app); }
diff --git a/examples/ui/tile/tile_app.cc b/examples/ui/tile/tile_app.cc index bdd24ae..ee6c56f 100644 --- a/examples/ui/tile/tile_app.cc +++ b/examples/ui/tile/tile_app.cc
@@ -24,7 +24,7 @@ return; } - new TileView(mojo::CreateApplicationConnector(app_impl()->shell()), + new TileView(mojo::CreateApplicationConnector(shell()), view_owner_request.Pass(), params); }
diff --git a/mojo/ui/content_viewer_app.cc b/mojo/ui/content_viewer_app.cc index 0ede5d2..21bb266 100644 --- a/mojo/ui/content_viewer_app.cc +++ b/mojo/ui/content_viewer_app.cc
@@ -6,6 +6,8 @@ #include "base/command_line.h" #include "base/logging.h" +#include "mojo/public/cpp/application/service_provider_impl.h" +#include "mojo/ui/view_provider_app.h" namespace mojo { namespace ui { @@ -37,17 +39,15 @@ ContentViewerApp::~ContentViewerApp() {} -void ContentViewerApp::Initialize(mojo::ApplicationImpl* app_impl) { - app_impl_ = app_impl; - +void ContentViewerApp::OnInitialize() { auto command_line = base::CommandLine::ForCurrentProcess(); - command_line->InitFromArgv(app_impl_->args()); + command_line->InitFromArgv(args()); logging::LoggingSettings settings; settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; logging::InitLogging(settings); } -bool ContentViewerApp::ConfigureIncomingConnection( +bool ContentViewerApp::OnAcceptConnection( ServiceProviderImpl* service_provider_impl) { service_provider_impl->AddService<ContentHandler>([this]( const ConnectionContext& connection_context, @@ -63,12 +63,13 @@ const std::string& content_handler_url, mojo::InterfaceRequest<mojo::Application> application_request, mojo::URLResponsePtr response) { + // TODO(vtl): This is usually leaky, since |*app| (the returned + // |ApplicationImplBase|/|ViewProviderApp| implementation) typically doesn't + // own itself. Probably |LoadContent()| should take the |application_request|, + // and not return anything. This method doesn't really appear to add anything. ViewProviderApp* app = LoadContent(content_handler_url, response.Pass()); - if (app) { - // TODO(vtl): This is leaky, since |ApplicationImpl| doesn't own itself. - // (Also, who owns |*app|?) - new mojo::ApplicationImpl(app, application_request.Pass()); - } + if (app) + app->Bind(application_request.Pass()); } } // namespace ui
diff --git a/mojo/ui/content_viewer_app.h b/mojo/ui/content_viewer_app.h index e09a66a..c28d2d9 100644 --- a/mojo/ui/content_viewer_app.h +++ b/mojo/ui/content_viewer_app.h
@@ -6,12 +6,18 @@ #define MOJO_UI_CONTENT_VIEWER_APP_H_ #include "mojo/common/strong_binding_set.h" +#include "mojo/public/cpp/application/application_impl_base.h" +#include "mojo/public/cpp/system/macros.h" #include "mojo/services/content_handler/interfaces/content_handler.mojom.h" -#include "mojo/ui/view_provider_app.h" namespace mojo { + +class ServiceProviderImpl; + namespace ui { +class ViewProviderApp; + // A simple ContentHandler application implementation for rendering // content as Views. Subclasses must provide a function to create // the view provider application on demand. @@ -19,17 +25,14 @@ // TODO(jeffbrown): Support creating the view provider application in a // separate thread if desired (often not the case). This is one reason // we are not using the ContentHandlerFactory here. -class ContentViewerApp : public ApplicationDelegate { +class ContentViewerApp : public ApplicationImplBase { public: ContentViewerApp(); ~ContentViewerApp() override; - ApplicationImpl* app_impl() { return app_impl_; } - - // |ApplicationDelegate|: - void Initialize(ApplicationImpl* app) override; - bool ConfigureIncomingConnection( - ServiceProviderImpl* service_provider_impl) override; + // |ApplicationImplBase|: + void OnInitialize() override; + bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override; // Called to create the view provider application to view the content. // @@ -42,8 +45,12 @@ // request. // The |response| carries the data retrieved by the content handler. // - // Returns the view provider application delegate to view the content, - // or nullptr if the content could not be loaded. + // Returns the view provider application to view the content, or nullptr if + // the content could not be loaded. + // + // TODO(vtl): This interface is a bit broken. (What's the ownership of the + // returned ViewProviderApp implementation?) See my TODO in the implementation + // of StartViewer(). virtual ViewProviderApp* LoadContent(const std::string& content_handler_url, URLResponsePtr response) = 0; @@ -54,7 +61,6 @@ InterfaceRequest<Application> application_request, URLResponsePtr response); - ApplicationImpl* app_impl_ = nullptr; StrongBindingSet<ContentHandler> bindings_; MOJO_DISALLOW_COPY_AND_ASSIGN(ContentViewerApp);
diff --git a/mojo/ui/view_provider_app.cc b/mojo/ui/view_provider_app.cc index a8e4b85..2db4765 100644 --- a/mojo/ui/view_provider_app.cc +++ b/mojo/ui/view_provider_app.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/logging.h" +#include "mojo/public/cpp/application/service_provider_impl.h" namespace mojo { namespace ui { @@ -37,17 +38,15 @@ ViewProviderApp::~ViewProviderApp() {} -void ViewProviderApp::Initialize(mojo::ApplicationImpl* app_impl) { - app_impl_ = app_impl; - +void ViewProviderApp::OnInitialize() { auto command_line = base::CommandLine::ForCurrentProcess(); - command_line->InitFromArgv(app_impl_->args()); + command_line->InitFromArgv(args()); logging::LoggingSettings settings; settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; logging::InitLogging(settings); } -bool ViewProviderApp::ConfigureIncomingConnection( +bool ViewProviderApp::OnAcceptConnection( ServiceProviderImpl* service_provider_impl) { service_provider_impl->AddService<ViewProvider>( [this](const ConnectionContext& connection_context,
diff --git a/mojo/ui/view_provider_app.h b/mojo/ui/view_provider_app.h index 9c85733..a0b81b4 100644 --- a/mojo/ui/view_provider_app.h +++ b/mojo/ui/view_provider_app.h
@@ -8,14 +8,14 @@ #include <string> #include "mojo/common/strong_binding_set.h" -#include "mojo/public/c/system/main.h" -#include "mojo/public/cpp/application/application_delegate.h" -#include "mojo/public/cpp/application/application_impl.h" -#include "mojo/public/cpp/application/service_provider_impl.h" +#include "mojo/public/cpp/application/application_impl_base.h" #include "mojo/public/cpp/system/macros.h" #include "mojo/services/ui/views/interfaces/view_provider.mojom.h" namespace mojo { + +class ServiceProviderImpl; + namespace ui { // Abstract implementation of a simple application that offers a ViewProvider. @@ -23,17 +23,14 @@ // // It is not necessary to use this class to implement all ViewProviders. // This class is merely intended to make the simple apps easier to write. -class ViewProviderApp : public ApplicationDelegate { +class ViewProviderApp : public ApplicationImplBase { public: ViewProviderApp(); ~ViewProviderApp() override; - ApplicationImpl* app_impl() { return app_impl_; } - - // |ApplicationDelegate|: - void Initialize(ApplicationImpl* app) override; - bool ConfigureIncomingConnection( - ServiceProviderImpl* service_provider_impl) override; + // |ApplicationImplBase|: + void OnInitialize() override; + bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override; // Called by the ViewProvider to create a view. // This method may be called multiple times in the case where the @@ -58,7 +55,6 @@ InterfaceRequest<ViewOwner> view_owner_request, InterfaceRequest<ServiceProvider> services); - ApplicationImpl* app_impl_ = nullptr; StrongBindingSet<ViewProvider> bindings_; MOJO_DISALLOW_COPY_AND_ASSIGN(ViewProviderApp);