Add a mojo::RunApplication() for running implementations of ApplicationImplBase. Also add a mojo::TerminateApplication() that works with it. And convert some low-hanging fruit. The API probably isn't final yet: * As indicated by the TODO, RunApplication() should probably return a MojoResult. * Conversely, TerminateApplication() should probably take a MojoResult. * I should probably have an additional "RunMainApplication()" (MainRunApplication()?) for the main thread/MojoMain() case. * Then I can separate out the APIs from the implementation, and the "chromium" versions can implement the same API. * (The main/non-main cases are the same in the "standalone" case, but in the "chromium" version, the main case has to do more stuff.) R=vardhan@google.com Review URL: https://codereview.chromium.org/2004493002 .
diff --git a/examples/echo/echo_benchmark.cc b/examples/echo/echo_benchmark.cc index 2a48404..e8da193 100644 --- a/examples/echo/echo_benchmark.cc +++ b/examples/echo/echo_benchmark.cc
@@ -13,7 +13,6 @@ #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/application_runner.h" #include "mojo/public/cpp/application/connect.h" #include "mojo/public/cpp/utility/run_loop.h"
diff --git a/examples/spinning_cube/spinning_cube_app.cc b/examples/spinning_cube/spinning_cube_app.cc index 694c66a..adcef63 100644 --- a/examples/spinning_cube/spinning_cube_app.cc +++ b/examples/spinning_cube/spinning_cube_app.cc
@@ -10,10 +10,9 @@ #include "base/bind.h" #include "examples/spinning_cube/gles2_client_impl.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/application_runner.h" +#include "mojo/public/cpp/application/application_impl_base.h" #include "mojo/public/cpp/application/connect.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/public/cpp/application/service_provider_impl.h" #include "mojo/public/cpp/system/macros.h" #include "mojo/public/cpp/utility/run_loop.h" @@ -22,7 +21,7 @@ namespace examples { -class SpinningCubeApp : public mojo::ApplicationDelegate, +class SpinningCubeApp : public mojo::ApplicationImplBase, public mojo::NativeViewportEventDispatcher { public: SpinningCubeApp() : dispatcher_binding_(this) {} @@ -32,8 +31,9 @@ mojo::ignore_result(gles2_client_.release()); } - void Initialize(mojo::ApplicationImpl* app) override { - mojo::ConnectToService(app->shell(), "mojo:native_viewport_service", + // |ApplicationImplBase| overrides: + void OnInitialize() override { + mojo::ConnectToService(shell(), "mojo:native_viewport_service", GetProxy(&viewport_)); viewport_.set_connection_error_handler( [this]() { OnViewportConnectionError(); }); @@ -94,7 +94,7 @@ } // namespace examples MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunner runner(std::unique_ptr<examples::SpinningCubeApp>( - new examples::SpinningCubeApp())); - return runner.Run(application_request); + examples::SpinningCubeApp spinning_cube_app; + mojo::RunApplication(application_request, &spinning_cube_app); + return MOJO_RESULT_OK; }
diff --git a/examples/trace_me/trace_me_app.cc b/examples/trace_me/trace_me_app.cc index b33ccc5..b26b004 100644 --- a/examples/trace_me/trace_me_app.cc +++ b/examples/trace_me/trace_me_app.cc
@@ -13,7 +13,6 @@ #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/application_runner.h" #include "mojo/public/cpp/application/service_provider_impl.h" // This is an example app that uses implementation of tracing from mojo/common
diff --git a/mojo/public/cpp/application/BUILD.gn b/mojo/public/cpp/application/BUILD.gn index ec0deae..d46f34a 100644 --- a/mojo/public/cpp/application/BUILD.gn +++ b/mojo/public/cpp/application/BUILD.gn
@@ -32,7 +32,10 @@ # GYP version: mojo/public/mojo_public.gyp:mojo_application_standalone mojo_sdk_source_set("standalone") { sources = [ + "application_runner.h", "lib/application_runner.cc", + "lib/run_application.cc", + "run_application.h", ] public_deps = [ @@ -41,7 +44,9 @@ mojo_sdk_deps = [ "mojo/public/cpp/environment:standalone", + "mojo/public/cpp/system", "mojo/public/cpp/utility", + "mojo/public/interfaces/application", ] }
diff --git a/mojo/public/cpp/application/application_impl_base.h b/mojo/public/cpp/application/application_impl_base.h index 8d3cbf6..1553e5d 100644 --- a/mojo/public/cpp/application/application_impl_base.h +++ b/mojo/public/cpp/application/application_impl_base.h
@@ -26,12 +26,16 @@ // To use this class, subclass it and implement/override the required methods // (see below). // +// Note that by default |ApplicationImplBase|s are not "strongly bound" to their +// |Application| requests (so, e.g., they can thus be constructed on the stack). +// A subclass may make itself strongly bound by setting a suitable connection +// error handler on the binding (available via |application_binding()|). +// // TODO(vtl): ApplicationRunners should take this instead of an // ApplicationDelegate. Write more here when that's true (it's pretty hard to // use this class in the current setup). class ApplicationImplBase : public Application { public: - ApplicationImplBase(); ~ApplicationImplBase() override; // Binds the given |Application| request to this object. This must be done @@ -48,30 +52,41 @@ // until this object is destroyed. Shell* shell() const { return shell_.get(); } + // Returns this object's |Application| binding (set up by |Bind()|; of course, + // you can always manipulate it directly). + const Binding<Application>& application_binding() const { + return application_binding_; + } + Binding<Application>& application_binding() { return application_binding_; } + // Returns any initial configuration arguments, passed by the shell. const std::vector<std::string>& args() const { return args_; } bool HasArg(const std::string& arg) const; const std::string& url() const { return url_; } - // Methods to be implemented/overridden by subclasses: + // Methods to be overridden (if desired) by subclasses: // Called after |Initialize()| has been received (|shell()|, |args()|, and // |url()| will be valid when this is called. The default implementation does // nothing. - virtual void OnInitialize() {} + virtual void OnInitialize(); // Called when another application connects to this application (i.e., we // receive |AcceptConnection()|). This should either configure what services // are "provided" (made available via a |ServiceProvider|) to that application // and return true, or this may return false to reject the connection - // entirely. - virtual bool OnAcceptConnection( - ServiceProviderImpl* service_provider_impl) = 0; + // entirely. The default implementation rejects all connections (by just + // returning false). + virtual bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl); // Called before quitting the main message (run) loop, i.e., before // |Terminate()|. The default implementation does nothing. - virtual void OnQuit() {} + virtual void OnQuit(); + + protected: + // This class is meant to be subclassed. + ApplicationImplBase(); private: // |Application| implementation. In general, you probably shouldn't call these
diff --git a/mojo/public/cpp/application/lib/application_impl_base.cc b/mojo/public/cpp/application/lib/application_impl_base.cc index 544c262..085e8c8 100644 --- a/mojo/public/cpp/application/lib/application_impl_base.cc +++ b/mojo/public/cpp/application/lib/application_impl_base.cc
@@ -13,8 +13,6 @@ namespace mojo { -ApplicationImplBase::ApplicationImplBase() : application_binding_(this) {} - ApplicationImplBase::~ApplicationImplBase() {} void ApplicationImplBase::Bind( @@ -26,6 +24,17 @@ return std::find(args_.begin(), args_.end(), arg) != args_.end(); } +void ApplicationImplBase::OnInitialize() {} + +bool ApplicationImplBase::OnAcceptConnection( + ServiceProviderImpl* service_provider_impl) { + return false; +} + +void ApplicationImplBase::OnQuit() {} + +ApplicationImplBase::ApplicationImplBase() : application_binding_(this) {} + void ApplicationImplBase::Initialize(InterfaceHandle<Shell> shell, Array<String> args, const mojo::String& url) {
diff --git a/mojo/public/cpp/application/lib/run_application.cc b/mojo/public/cpp/application/lib/run_application.cc new file mode 100644 index 0000000..82d3089 --- /dev/null +++ b/mojo/public/cpp/application/lib/run_application.cc
@@ -0,0 +1,32 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mojo/public/cpp/application/run_application.h" + +#include "mojo/public/cpp/application/application_impl_base.h" +#include "mojo/public/cpp/system/message_pipe.h" +#include "mojo/public/cpp/utility/run_loop.h" +#include "mojo/public/interfaces/application/application.mojom.h" + +namespace mojo { + +void RunApplication(MojoHandle application_request_handle, + ApplicationImplBase* application_impl) { + // TODO(vtl): Possibly we should have an assertion that we're not running, but + // that requires TLS. + + RunLoop loop; + application_impl->Bind(InterfaceRequest<Application>( + MakeScopedHandle(MessagePipeHandle(application_request_handle)))); + loop.Run(); + + // TODO(vtl): Should we unbind stuff here? (Should there be "will start"/"did + // stop" notifications to the |ApplicationImplBase|?) +} + +void TerminateApplication() { + RunLoop::current()->Quit(); +} + +} // namespace mojo
diff --git a/mojo/public/cpp/application/run_application.h b/mojo/public/cpp/application/run_application.h new file mode 100644 index 0000000..98f0ef1 --- /dev/null +++ b/mojo/public/cpp/application/run_application.h
@@ -0,0 +1,53 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MOJO_PUBLIC_CPP_APPLICATION_RUN_APPLICATION_H_ +#define MOJO_PUBLIC_CPP_APPLICATION_RUN_APPLICATION_H_ + +#include "mojo/public/c/system/handle.h" +#include "mojo/public/c/system/result.h" + +namespace mojo { + +class ApplicationImplBase; + +// Sets up a message (run) loop and runs the provided application +// implementation. +// +// Typical use (where |MyApplicationImpl| is an implementation of +// |ApplicationImplBase|): +// +// MojoResult MojoMain(MojoHandle application_request_handle) { +// MyApplicationImpl my_app; +// mojo::RunApplication(application_request_handle, &my_app); +// return MOJO_RESULT_OK; +// } +// +// Note that this may actually be used on any thread (that is not already +// running a message loop of some sort). +// +// |*application_impl| must remain alive until the message loop starts running +// (thus it may own itself). +// +// TODO(vtl): Possibly this should return a |MojoResult| and +// |TerminateApplication()| should take a |MojoResult| argument (which this +// returns), but to communicate that value requires TLS. +// TODO(vtl): Maybe this should be like |Environment|, with different possible +// implementations (e.g., "standalone" vs "chromium"). However, +// |ApplicationRunnerChromium| currently has additional goop specific to the +// main thread. Probably we should have additional "MainRunApplication()" and +// "MainTerminateApplication()" functions. +void RunApplication(MojoHandle application_request_handle, + ApplicationImplBase* application_impl); + +// Terminates the currently-running application. This may only be called from +// "inside" |RunApplication()| (i.e., it is on the stack, which means that the +// message loop is running). This will cause |RunApplication()| to return "soon" +// (assuming the message loop is not blocked processing some task). This may +// cause queued work to *not* be executed. +void TerminateApplication(); + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_APPLICATION_RUN_APPLICATION_H_
diff --git a/mojo/public/cpp/bindings/tests/versioning_test_service.cc b/mojo/public/cpp/bindings/tests/versioning_test_service.cc index cba93f9..3f7d503 100644 --- a/mojo/public/cpp/bindings/tests/versioning_test_service.cc +++ b/mojo/public/cpp/bindings/tests/versioning_test_service.cc
@@ -6,8 +6,8 @@ #include <memory> #include "mojo/public/c/system/main.h" -#include "mojo/public/cpp/application/application_delegate.h" -#include "mojo/public/cpp/application/application_runner.h" +#include "mojo/public/cpp/application/application_impl_base.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/public/cpp/application/service_provider_impl.h" #include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/system/macros.h" @@ -90,15 +90,17 @@ std::map<uint64_t, EmployeeInfo*> employees_; StrongBinding<HumanResourceDatabase> strong_binding_; + + MOJO_DISALLOW_COPY_AND_ASSIGN(HumanResourceDatabaseImpl); }; -class HumanResourceSystemServer : public ApplicationDelegate { +class HumanResourceSystemServer : public ApplicationImplBase { public: HumanResourceSystemServer() {} + ~HumanResourceSystemServer() override {} - // ApplicationDelegate implementation. - bool ConfigureIncomingConnection( - ServiceProviderImpl* service_provider_impl) override { + // |ApplicationImplBase| overrides: + bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override { service_provider_impl->AddService<HumanResourceDatabase>( [](const ConnectionContext& connection_context, InterfaceRequest<HumanResourceDatabase> hr_db_request) { @@ -108,6 +110,9 @@ }); return true; } + + private: + MOJO_DISALLOW_COPY_AND_ASSIGN(HumanResourceSystemServer); }; } // namespace versioning @@ -115,9 +120,7 @@ } // namespace mojo MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunner runner( - std::unique_ptr<mojo::test::versioning::HumanResourceSystemServer>( - new mojo::test::versioning::HumanResourceSystemServer())); - - return runner.Run(application_request); + mojo::test::versioning::HumanResourceSystemServer hr_system_server; + mojo::RunApplication(application_request, &hr_system_server); + return MOJO_RESULT_OK; }
diff --git a/mojo/services/log/cpp/log_client.h b/mojo/services/log/cpp/log_client.h index 3639307..049ed16 100644 --- a/mojo/services/log/cpp/log_client.h +++ b/mojo/services/log/cpp/log_client.h
@@ -8,24 +8,25 @@ // // Example application that uses this log client to talk to the log service: // -// class MyDelegate : public mojo::ApplicationDelegate { +// class MyApp : public mojo::ApplicationImplBase { // public: -// void Initialize(mojo::ApplicationImpl* app) override { +// void OnInitialize() override { // LogPtr log; -// app->ConnectToService("mojo:log", &log); +// mojo::ConnectToService(shell(), "mojo:log", &log); // mojo::log::InitializeLogger(std::move(log), // mojo::Environment::GetDefaultLogger()); // mojo::Environment::SetDefaultLogger(mojo::log::GetLogger()); // } // -// void Quit() { +// void OnQuit() override { // mojo::log::DestroyLogger(); // } // }; // // MojoResult MojoMain(MojoHandle app_request) { -// mojo::ApplicationRunner runner(new MyDelegate); -// return runner.Run(app_request); +// MyApp app; +// mojo::RunApplication(&app); +// return MOJO_RESULT_OK; // } #ifndef MOJO_SERVICES_LOG_CPP_LOG_CLIENT_H_
diff --git a/services/test_service/test_request_tracker_application.cc b/services/test_service/test_request_tracker_application.cc index 1877708..2c41f76 100644 --- a/services/test_service/test_request_tracker_application.cc +++ b/services/test_service/test_request_tracker_application.cc
@@ -4,35 +4,26 @@ #include "services/test_service/test_request_tracker_application.h" -#include <memory> - #include "mojo/public/c/system/main.h" -#include "mojo/public/cpp/application/application_runner.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/public/cpp/application/service_provider_impl.h" #include "services/test_service/test_time_service_impl.h" namespace mojo { namespace test { -TestRequestTrackerApplication::TestRequestTrackerApplication() - : app_impl_(nullptr) { -} +TestRequestTrackerApplication::TestRequestTrackerApplication() {} -TestRequestTrackerApplication::~TestRequestTrackerApplication() { -} +TestRequestTrackerApplication::~TestRequestTrackerApplication() {} -void TestRequestTrackerApplication::Initialize(ApplicationImpl* app) { - app_impl_ = app; -} - -bool TestRequestTrackerApplication::ConfigureIncomingConnection( +bool TestRequestTrackerApplication::OnAcceptConnection( ServiceProviderImpl* service_provider_impl) { // Every instance of the service and recorder shares the context. // Note, this app is single-threaded, so this is thread safe. service_provider_impl->AddService<TestTimeService>( [this](const ConnectionContext& connection_context, InterfaceRequest<TestTimeService> request) { - new TestTimeServiceImpl(app_impl_, request.Pass()); + new TestTimeServiceImpl(this, request.Pass()); }); service_provider_impl->AddService<TestRequestTracker>( [this](const ConnectionContext& connection_context, @@ -51,8 +42,7 @@ } // namespace mojo MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunner runner( - std::unique_ptr<mojo::test::TestRequestTrackerApplication>( - new mojo::test::TestRequestTrackerApplication())); - return runner.Run(application_request); + mojo::test::TestRequestTrackerApplication app; + mojo::RunApplication(application_request, &app); + return MOJO_RESULT_OK; }
diff --git a/services/test_service/test_request_tracker_application.h b/services/test_service/test_request_tracker_application.h index 53a01bf..8ffa83e 100644 --- a/services/test_service/test_request_tracker_application.h +++ b/services/test_service/test_request_tracker_application.h
@@ -5,29 +5,25 @@ #ifndef SERVICES_TEST_SERVICE_TEST_REQUEST_TRACKER_APPLICATION_H_ #define SERVICES_TEST_SERVICE_TEST_REQUEST_TRACKER_APPLICATION_H_ -#include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/application_impl_base.h" #include "mojo/public/cpp/system/macros.h" #include "services/test_service/test_request_tracker_impl.h" namespace mojo { -class ApplicationImpl; namespace test { + class TestTimeService; // Embeds TestRequestTracker mojo services into an application. -class TestRequestTrackerApplication : public ApplicationDelegate { +class TestRequestTrackerApplication : public ApplicationImplBase { public: TestRequestTrackerApplication(); ~TestRequestTrackerApplication() override; - void Initialize(ApplicationImpl* app) override; - - // ApplicationDelegate methods: - bool ConfigureIncomingConnection( - ServiceProviderImpl* service_provider_impl) override; + // |ApplicationImplBase| method: + bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override; private: - ApplicationImpl* app_impl_; TrackingContext context_; MOJO_DISALLOW_COPY_AND_ASSIGN(TestRequestTrackerApplication); };
diff --git a/services/test_service/test_service_application.cc b/services/test_service/test_service_application.cc index d458d09..c883cef 100644 --- a/services/test_service/test_service_application.cc +++ b/services/test_service/test_service_application.cc
@@ -6,39 +6,31 @@ #include <assert.h> -#include <memory> - #include "mojo/public/c/system/main.h" -#include "mojo/public/cpp/application/application_runner.h" +#include "mojo/public/cpp/application/run_application.h" #include "mojo/public/cpp/application/service_provider_impl.h" -#include "mojo/public/cpp/utility/run_loop.h" #include "services/test_service/test_service_impl.h" #include "services/test_service/test_time_service_impl.h" namespace mojo { namespace test { -TestServiceApplication::TestServiceApplication() - : ref_count_(0), app_impl_(nullptr) {} +TestServiceApplication::TestServiceApplication() : ref_count_(0) {} TestServiceApplication::~TestServiceApplication() {} -void TestServiceApplication::Initialize(ApplicationImpl* app) { - app_impl_ = app; -} - -bool TestServiceApplication::ConfigureIncomingConnection( +bool TestServiceApplication::OnAcceptConnection( ServiceProviderImpl* service_provider_impl) { service_provider_impl->AddService<TestService>( [this](const ConnectionContext& connection_context, InterfaceRequest<TestService> request) { - new TestServiceImpl(app_impl_, this, request.Pass()); + new TestServiceImpl(this, request.Pass()); AddRef(); }); service_provider_impl->AddService<TestTimeService>( [this](const ConnectionContext& connection_context, InterfaceRequest<TestTimeService> request) { - new TestTimeServiceImpl(app_impl_, request.Pass()); + new TestTimeServiceImpl(this, request.Pass()); }); return true; } @@ -52,15 +44,14 @@ assert(ref_count_ > 0); ref_count_--; if (ref_count_ <= 0) - RunLoop::current()->Quit(); + TerminateApplication(); } } // namespace test } // namespace mojo MojoResult MojoMain(MojoHandle application_request) { - mojo::ApplicationRunner runner( - std::unique_ptr<mojo::test::TestServiceApplication>( - new mojo::test::TestServiceApplication())); - return runner.Run(application_request); + mojo::test::TestServiceApplication app; + mojo::RunApplication(application_request, &app); + return MOJO_RESULT_OK; }
diff --git a/services/test_service/test_service_application.h b/services/test_service/test_service_application.h index 9defb8a..27d1451 100644 --- a/services/test_service/test_service_application.h +++ b/services/test_service/test_service_application.h
@@ -5,32 +5,25 @@ #ifndef SERVICES_TEST_SERVICE_TEST_SERVICE_APPLICATION_H_ #define SERVICES_TEST_SERVICE_TEST_SERVICE_APPLICATION_H_ -#include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/application_impl_base.h" #include "mojo/public/cpp/system/macros.h" namespace mojo { namespace test { -class TestService; -class TestTimeService; - -class TestServiceApplication : public ApplicationDelegate { +class TestServiceApplication : public ApplicationImplBase { public: TestServiceApplication(); ~TestServiceApplication() override; - void Initialize(ApplicationImpl* app) override; - - // ApplicationDelegate implementation. - bool ConfigureIncomingConnection( - ServiceProviderImpl* service_provider_impl) override; + // |ApplicationImplBase| method: + bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override; void AddRef(); void ReleaseRef(); private: int ref_count_; - ApplicationImpl* app_impl_; MOJO_DISALLOW_COPY_AND_ASSIGN(TestServiceApplication); };
diff --git a/services/test_service/test_service_impl.cc b/services/test_service/test_service_impl.cc index 27487c8..bbd6a27 100644 --- a/services/test_service/test_service_impl.cc +++ b/services/test_service/test_service_impl.cc
@@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/i18n/time_formatting.h" #include "base/strings/utf_string_conversions.h" -#include "mojo/public/cpp/application/application_impl.h" #include "mojo/public/cpp/application/connect.h" #include "services/test_service/test_service_application.h" #include "services/test_service/test_time_service_impl.h" @@ -16,18 +15,14 @@ namespace mojo { namespace test { -TestServiceImpl::TestServiceImpl(ApplicationImpl* app_impl, - TestServiceApplication* application, +TestServiceImpl::TestServiceImpl(TestServiceApplication* application, InterfaceRequest<TestService> request) - : application_(application), - app_impl_(app_impl), - binding_(this, request.Pass()) { + : application_(application), binding_(this, request.Pass()) { binding_.set_connection_error_handler( [this]() { application_->ReleaseRef(); }); } -TestServiceImpl::~TestServiceImpl() { -} +TestServiceImpl::~TestServiceImpl() {} void TestServiceImpl::Ping(const mojo::Callback<void()>& callback) { if (tracking_) @@ -44,7 +39,7 @@ void TestServiceImpl::ConnectToAppAndGetTime( const mojo::String& app_url, const mojo::Callback<void(int64_t)>& callback) { - ConnectToService(app_impl_->shell(), app_url, GetProxy(&time_service_)); + ConnectToService(application_->shell(), app_url, GetProxy(&time_service_)); if (tracking_) { tracking_->RecordNewRequest(); time_service_->StartTrackingRequests(mojo::Callback<void()>()); @@ -55,7 +50,7 @@ void TestServiceImpl::StartTrackingRequests( const mojo::Callback<void()>& callback) { TestRequestTrackerPtr tracker; - ConnectToService(app_impl_->shell(), "mojo:test_request_tracker_app", + ConnectToService(application_->shell(), "mojo:test_request_tracker_app", GetProxy(&tracker)); tracking_.reset(new TrackedService(tracker.Pass(), Name_, callback)); }
diff --git a/services/test_service/test_service_impl.h b/services/test_service/test_service_impl.h index df5803c..92f0b91 100644 --- a/services/test_service/test_service_impl.h +++ b/services/test_service/test_service_impl.h
@@ -11,7 +11,6 @@ #include "services/test_service/test_service.mojom.h" namespace mojo { -class ApplicationImpl; namespace test { class TrackedService; @@ -19,8 +18,7 @@ class TestServiceImpl : public TestService { public: - TestServiceImpl(ApplicationImpl* app_impl, - TestServiceApplication* application, + TestServiceImpl(TestServiceApplication* application, InterfaceRequest<TestService> request); ~TestServiceImpl() override; @@ -33,7 +31,6 @@ private: TestServiceApplication* const application_; - ApplicationImpl* const app_impl_; TestTimeServicePtr time_service_; scoped_ptr<TrackedService> tracking_; StrongBinding<TestService> binding_;
diff --git a/services/test_service/test_time_service_impl.cc b/services/test_service/test_time_service_impl.cc index 0f61f06..3bb0bde 100644 --- a/services/test_service/test_time_service_impl.cc +++ b/services/test_service/test_time_service_impl.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "base/time/time.h" -#include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/application_impl_base.h" #include "mojo/public/cpp/application/connect.h" #include "services/test_service/test_request_tracker.mojom.h" #include "services/test_service/test_time_service_impl.h" @@ -13,18 +13,16 @@ namespace test { TestTimeServiceImpl::TestTimeServiceImpl( - ApplicationImpl* app_impl, + ApplicationImplBase* application, InterfaceRequest<TestTimeService> request) - : app_impl_(app_impl), binding_(this, request.Pass()) { -} + : application_(application), binding_(this, request.Pass()) {} -TestTimeServiceImpl::~TestTimeServiceImpl() { -} +TestTimeServiceImpl::~TestTimeServiceImpl() {} void TestTimeServiceImpl::StartTrackingRequests( const mojo::Callback<void()>& callback) { TestRequestTrackerPtr tracker; - ConnectToService(app_impl_->shell(), "mojo:test_request_tracker_app", + ConnectToService(application_->shell(), "mojo:test_request_tracker_app", GetProxy(&tracker)); tracking_.reset(new TrackedService(tracker.Pass(), Name_, callback)); }
diff --git a/services/test_service/test_time_service_impl.h b/services/test_service/test_time_service_impl.h index 5ca569b..27a028f 100644 --- a/services/test_service/test_time_service_impl.h +++ b/services/test_service/test_time_service_impl.h
@@ -12,13 +12,16 @@ #include "services/test_service/test_service.mojom.h" namespace mojo { + +class ApplicationImplBase; + namespace test { class TrackedService; class TestTimeServiceImpl : public TestTimeService { public: - TestTimeServiceImpl(ApplicationImpl* app_impl, + TestTimeServiceImpl(ApplicationImplBase* application, InterfaceRequest<TestTimeService> request); ~TestTimeServiceImpl() override; @@ -28,7 +31,7 @@ void StartTrackingRequests(const mojo::Callback<void()>& callback) override; private: - ApplicationImpl* app_impl_; + ApplicationImplBase* const application_; scoped_ptr<TrackedService> tracking_; StrongBinding<TestTimeService> binding_; MOJO_DISALLOW_COPY_AND_ASSIGN(TestTimeServiceImpl);