diff options
Diffstat (limited to 'mojo')
69 files changed, 808 insertions, 526 deletions
diff --git a/mojo/cc/context_provider_mojo.cc b/mojo/cc/context_provider_mojo.cc index 7356b58..10254b5 100644 --- a/mojo/cc/context_provider_mojo.cc +++ b/mojo/cc/context_provider_mojo.cc @@ -10,7 +10,9 @@ namespace mojo { ContextProviderMojo::ContextProviderMojo( ScopedMessagePipeHandle command_buffer_handle) - : command_buffer_handle_(command_buffer_handle.Pass()) {} + : command_buffer_handle_(command_buffer_handle.Pass()), + context_lost_(false) { +} bool ContextProviderMojo::BindToCurrentThread() { DCHECK(command_buffer_handle_.is_valid()); @@ -42,7 +44,9 @@ cc::ContextProvider::Capabilities ContextProviderMojo::ContextCapabilities() { return capabilities_; } -bool ContextProviderMojo::IsContextLost() { return !context_; } +bool ContextProviderMojo::IsContextLost() { + return context_lost_; +} bool ContextProviderMojo::DestroyedOnMainThread() { return !context_; } ContextProviderMojo::~ContextProviderMojo() { @@ -51,10 +55,7 @@ ContextProviderMojo::~ContextProviderMojo() { } void ContextProviderMojo::ContextLost() { - if (context_) { - MojoGLES2DestroyContext(context_); - context_ = NULL; - } + context_lost_ = true; } } // namespace mojo diff --git a/mojo/cc/context_provider_mojo.h b/mojo/cc/context_provider_mojo.h index eda6e43..32ef876 100644 --- a/mojo/cc/context_provider_mojo.h +++ b/mojo/cc/context_provider_mojo.h @@ -44,6 +44,7 @@ class ContextProviderMojo : public cc::ContextProvider { cc::ContextProvider::Capabilities capabilities_; ScopedMessagePipeHandle command_buffer_handle_; MojoGLES2Context context_; + bool context_lost_; }; } // namespace mojo diff --git a/mojo/dbus/dbus_external_service.h b/mojo/dbus/dbus_external_service.h index 77e9e4b..ea4c602 100644 --- a/mojo/dbus/dbus_external_service.h +++ b/mojo/dbus/dbus_external_service.h @@ -11,6 +11,8 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory.h" +#include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" #include "mojo/shell/external_service.mojom.h" @@ -50,8 +52,10 @@ class DBusExternalServiceBase { }; template <class ServiceImpl> -class DBusExternalService : public DBusExternalServiceBase, - public ApplicationDelegate { +class DBusExternalService + : public DBusExternalServiceBase, + public ApplicationDelegate, + public InterfaceFactory<typename ServiceImpl::ImplementedInterface> { public: explicit DBusExternalService(const std::string& service_name) : DBusExternalServiceBase(service_name) { @@ -60,10 +64,17 @@ class DBusExternalService : public DBusExternalServiceBase, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - connection->AddService<ServiceImpl>(); + connection->AddService(this); return true; } + virtual void Create( + ApplicationConnection* connection, + InterfaceRequest<typename ServiceImpl::ImplementedInterface> request) + MOJO_OVERRIDE { + BindToRequest(new ServiceImpl, &request); + } + protected: virtual void Connect(ScopedMessagePipeHandle client_handle) OVERRIDE { external_service_.reset(BindToPipe(new Impl(this), client_handle.Pass())); diff --git a/mojo/examples/aura_demo/aura_demo.cc b/mojo/examples/aura_demo/aura_demo.cc index 263493f..71dfd32 100644 --- a/mojo/examples/aura_demo/aura_demo.cc +++ b/mojo/examples/aura_demo/aura_demo.cc @@ -10,12 +10,14 @@ #include "mojo/aura/screen_mojo.h" #include "mojo/aura/window_tree_host_mojo.h" #include "mojo/aura/window_tree_host_mojo_delegate.h" +#include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/system/core.h" #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/interfaces/native_viewport/native_viewport.mojom.h" #include "ui/aura/client/default_capture_client.h" @@ -111,8 +113,8 @@ class AuraDemo : public ApplicationDelegate, : window1_(NULL), window2_(NULL), window21_(NULL), - view_(NULL) { - } + view_(NULL), + view_manager_client_factory_(this) {} virtual ~AuraDemo() {} private: @@ -172,7 +174,7 @@ class AuraDemo : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -192,6 +194,8 @@ class AuraDemo : public ApplicationDelegate, view_manager::View* view_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; + scoped_ptr<aura::WindowTreeHost> window_tree_host_; DISALLOW_COPY_AND_ASSIGN(AuraDemo); diff --git a/mojo/examples/browser/browser.cc b/mojo/examples/browser/browser.cc index e90eb50..40d1caa 100644 --- a/mojo/examples/browser/browser.cc +++ b/mojo/examples/browser/browser.cc @@ -14,6 +14,7 @@ #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/cpp/view_manager/view_observer.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" @@ -152,7 +153,11 @@ class Browser : public ApplicationDelegate, public views::TextfieldController, public view_manager::NodeObserver { public: - Browser() : view_manager_(NULL), root_(NULL), widget_(NULL) {} + Browser() + : view_manager_(NULL), + view_manager_client_factory_(this), + root_(NULL), + widget_(NULL) {} virtual ~Browser() { if (root_) @@ -169,7 +174,7 @@ class Browser : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -250,6 +255,7 @@ class Browser : public ApplicationDelegate, scoped_ptr<ViewsInit> views_init_; view_manager::ViewManager* view_manager_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; view_manager::Node* root_; views::Widget* widget_; navigation::NavigatorHostPtr navigator_host_; diff --git a/mojo/examples/embedded_app/embedded_app.cc b/mojo/examples/embedded_app/embedded_app.cc index 8600dc7..7e555cd 100644 --- a/mojo/examples/embedded_app/embedded_app.cc +++ b/mojo/examples/embedded_app/embedded_app.cc @@ -10,10 +10,12 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/cpp/view_manager/view_observer.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" @@ -26,17 +28,37 @@ using mojo::view_manager::NodeObserver; using mojo::view_manager::View; using mojo::view_manager::ViewManager; using mojo::view_manager::ViewManagerDelegate; +using mojo::view_manager::ViewManagerClientFactory; using mojo::view_manager::ViewObserver; namespace mojo { namespace examples { +class EmbeddedApp; + +class Navigator : public InterfaceImpl<navigation::Navigator> { + public: + explicit Navigator(EmbeddedApp* app) : app_(app) {} + + private: + virtual void Navigate( + uint32 node_id, + navigation::NavigationDetailsPtr navigation_details, + navigation::ResponseDetailsPtr response_details) OVERRIDE; + + EmbeddedApp* app_; + DISALLOW_COPY_AND_ASSIGN(Navigator); +}; class EmbeddedApp : public ApplicationDelegate, public ViewManagerDelegate, public ViewObserver, - public NodeObserver { + public NodeObserver, + public InterfaceFactoryWithContext<Navigator, EmbeddedApp> { public: - EmbeddedApp() : view_manager_(NULL) { + EmbeddedApp() + : InterfaceFactoryWithContext(this), + view_manager_(NULL), + view_manager_client_factory_(this) { url::AddStandardScheme("mojo"); } virtual ~EmbeddedApp() {} @@ -47,31 +69,6 @@ class EmbeddedApp : public ApplicationDelegate, } private: - class Navigator : public InterfaceImpl<navigation::Navigator> { - public: - Navigator(ApplicationConnection* connection, - EmbeddedApp* app) : app_(app) {} - private: - virtual void Navigate( - uint32 node_id, - navigation::NavigationDetailsPtr navigation_details, - navigation::ResponseDetailsPtr response_details) OVERRIDE { - GURL url(navigation_details->url.To<std::string>()); - if (!url.is_valid()) { - LOG(ERROR) << "URL is invalid."; - return; - } - // TODO(aa): Verify new URL is same origin as current origin. - SkColor color = 0x00; - if (!base::HexStringToUInt(url.path().substr(1), &color)) { - LOG(ERROR) << "Invalid URL, path not convertible to integer"; - return; - } - app_->SetNodeColor(node_id, color); - } - EmbeddedApp* app_; - DISALLOW_COPY_AND_ASSIGN(Navigator); - }; // Overridden from ApplicationDelegate: virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { @@ -83,8 +80,8 @@ class EmbeddedApp : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - ViewManager::ConfigureIncomingConnection(connection, this); - connection->AddService<Navigator>(this); + connection->AddService(&view_manager_client_factory_); + connection->AddService(this); return true; } @@ -147,6 +144,7 @@ class EmbeddedApp : public ApplicationDelegate, view_manager::ViewManager* view_manager_; navigation::NavigatorHostPtr navigator_host_; std::map<Node*, View*> views_to_reap_; + ViewManagerClientFactory view_manager_client_factory_; typedef std::map<view_manager::Id, Node*> RootMap; RootMap roots_; @@ -158,6 +156,23 @@ class EmbeddedApp : public ApplicationDelegate, DISALLOW_COPY_AND_ASSIGN(EmbeddedApp); }; +void Navigator::Navigate(uint32 node_id, + navigation::NavigationDetailsPtr navigation_details, + navigation::ResponseDetailsPtr response_details) { + GURL url(navigation_details->url.To<std::string>()); + if (!url.is_valid()) { + LOG(ERROR) << "URL is invalid."; + return; + } + // TODO(aa): Verify new URL is same origin as current origin. + SkColor color = 0x00; + if (!base::HexStringToUInt(url.path().substr(1), &color)) { + LOG(ERROR) << "Invalid URL, path not convertible to integer"; + return; + } + app_->SetNodeColor(node_id, color); +} + } // namespace examples // static diff --git a/mojo/examples/keyboard/keyboard.cc b/mojo/examples/keyboard/keyboard.cc index 0b76f39..f4f22b7 100644 --- a/mojo/examples/keyboard/keyboard.cc +++ b/mojo/examples/keyboard/keyboard.cc @@ -10,9 +10,11 @@ #include "mojo/examples/keyboard/keyboard_view.h" #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/cpp/view_manager/view_observer.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" @@ -33,7 +35,7 @@ class Keyboard; class KeyboardServiceImpl : public InterfaceImpl<KeyboardService> { public: - KeyboardServiceImpl(ApplicationConnection* connection, Keyboard* keyboard); + explicit KeyboardServiceImpl(Keyboard* keyboard); virtual ~KeyboardServiceImpl() {} // KeyboardService: @@ -45,11 +47,18 @@ class KeyboardServiceImpl : public InterfaceImpl<KeyboardService> { DISALLOW_COPY_AND_ASSIGN(KeyboardServiceImpl); }; -class Keyboard : public ApplicationDelegate, - public view_manager::ViewManagerDelegate, - public KeyboardDelegate { +class Keyboard + : public ApplicationDelegate, + public view_manager::ViewManagerDelegate, + public KeyboardDelegate, + public InterfaceFactoryWithContext<KeyboardServiceImpl, Keyboard> { public: - Keyboard() : view_manager_(NULL), keyboard_service_(NULL), target_(0) {} + Keyboard() + : InterfaceFactoryWithContext(this), + view_manager_(NULL), + view_manager_client_factory_(this), + keyboard_service_(NULL), + target_(0) {} virtual ~Keyboard() { } @@ -65,8 +74,8 @@ class Keyboard : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { views_init_.reset(new ViewsInit); - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); - connection->AddService<KeyboardServiceImpl>(this); + connection->AddService(&view_manager_client_factory_); + connection->AddService(this); return true; } @@ -111,6 +120,7 @@ class Keyboard : public ApplicationDelegate, scoped_ptr<ViewsInit> views_init_; view_manager::ViewManager* view_manager_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; KeyboardServiceImpl* keyboard_service_; @@ -119,8 +129,7 @@ class Keyboard : public ApplicationDelegate, DISALLOW_COPY_AND_ASSIGN(Keyboard); }; -KeyboardServiceImpl::KeyboardServiceImpl(ApplicationConnection* connection, - Keyboard* keyboard) +KeyboardServiceImpl::KeyboardServiceImpl(Keyboard* keyboard) : keyboard_(keyboard) { keyboard_->set_keyboard_service(this); } diff --git a/mojo/examples/media_viewer/media_viewer.cc b/mojo/examples/media_viewer/media_viewer.cc index 4221012..539cbd8 100644 --- a/mojo/examples/media_viewer/media_viewer.cc +++ b/mojo/examples/media_viewer/media_viewer.cc @@ -12,11 +12,13 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/public/cpp/bindings/interface_impl.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" #include "mojo/views/native_widget_view_manager.h" @@ -185,8 +187,7 @@ class ControlPanel : public views::ButtonListener { class NavigatorImpl : public InterfaceImpl<navigation::Navigator> { public: - NavigatorImpl(ApplicationConnection* connection, - MediaViewer* viewer) : viewer_(viewer) {} + explicit NavigatorImpl(MediaViewer* viewer) : viewer_(viewer) {} virtual ~NavigatorImpl() {} private: @@ -201,17 +202,22 @@ class NavigatorImpl : public InterfaceImpl<navigation::Navigator> { DISALLOW_COPY_AND_ASSIGN(NavigatorImpl); }; -class MediaViewer : public ApplicationDelegate, - public view_manager::ViewManagerDelegate, - public ControlPanel::Delegate, - public view_manager::NodeObserver { +class MediaViewer + : public ApplicationDelegate, + public view_manager::ViewManagerDelegate, + public ControlPanel::Delegate, + public view_manager::NodeObserver, + public InterfaceFactoryWithContext<NavigatorImpl, MediaViewer> { public: - MediaViewer() : app_(NULL), - view_manager_(NULL), - root_node_(NULL), - control_node_(NULL), - content_node_(NULL), - control_panel_(this) { + MediaViewer() + : InterfaceFactoryWithContext(this), + app_(NULL), + view_manager_(NULL), + view_manager_client_factory_(this), + root_node_(NULL), + control_node_(NULL), + content_node_(NULL), + control_panel_(this) { handler_map_["image/png"] = "mojo:mojo_png_viewer"; } @@ -271,8 +277,8 @@ class MediaViewer : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) OVERRIDE { - connection->AddService<NavigatorImpl>(this); - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -355,6 +361,7 @@ class MediaViewer : public ApplicationDelegate, ApplicationImpl* app_; scoped_ptr<ViewsInit> views_init_; view_manager::ViewManager* view_manager_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; view_manager::Node* root_node_; view_manager::Node* control_node_; view_manager::Node* content_node_; diff --git a/mojo/examples/nesting_app/nesting_app.cc b/mojo/examples/nesting_app/nesting_app.cc index 4141cd6..1b015df 100644 --- a/mojo/examples/nesting_app/nesting_app.cc +++ b/mojo/examples/nesting_app/nesting_app.cc @@ -9,10 +9,12 @@ #include "mojo/examples/window_manager/window_manager.mojom.h" #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/cpp/view_manager/view_observer.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" @@ -23,6 +25,7 @@ using mojo::view_manager::Node; using mojo::view_manager::NodeObserver; using mojo::view_manager::View; using mojo::view_manager::ViewManager; +using mojo::view_manager::ViewManagerClientFactory; using mojo::view_manager::ViewManagerDelegate; using mojo::view_manager::ViewObserver; @@ -33,44 +36,58 @@ namespace { const char kEmbeddedAppURL[] = "mojo:mojo_embedded_app"; } +class NestingApp; + +class Navigator : public InterfaceImpl<navigation::Navigator> { + public: + explicit Navigator(NestingApp* app) : app_(app) {} + + private: + virtual void Navigate( + uint32 node_id, + navigation::NavigationDetailsPtr navigation_details, + navigation::ResponseDetailsPtr response_details) OVERRIDE; + + NestingApp* app_; + DISALLOW_COPY_AND_ASSIGN(Navigator); +}; + // An app that embeds another app. // TODO(davemoore): Is this the right name? class NestingApp : public ApplicationDelegate, public ViewManagerDelegate, public ViewObserver, - public NodeObserver { + public NodeObserver, + public InterfaceFactoryWithContext<Navigator, NestingApp> { public: - NestingApp() : nested_(NULL) {} + NestingApp() + : InterfaceFactoryWithContext(this), + nested_(NULL), + view_manager_client_factory_(this) {} virtual ~NestingApp() {} - private: - class Navigator : public InterfaceImpl<navigation::Navigator> { - public: - explicit Navigator(ApplicationConnection* connection, - NestingApp* app) : app_(app) {} - private: - virtual void Navigate( - uint32 node_id, - navigation::NavigationDetailsPtr navigation_details, - navigation::ResponseDetailsPtr response_details) OVERRIDE { - GURL url(navigation_details->url.To<std::string>()); - if (!url.is_valid()) { - LOG(ERROR) << "URL is invalid."; - return; - } - app_->color_ = url.path().substr(1); - app_->NavigateChild(); + void set_color(const std::string& color) { color_ = color; } + + void NavigateChild() { + if (!color_.empty() && nested_) { + navigation::NavigationDetailsPtr details( + navigation::NavigationDetails::New()); + details->url = + base::StringPrintf("%s/%s", kEmbeddedAppURL, color_.c_str()); + navigation::ResponseDetailsPtr response_details( + navigation::ResponseDetails::New()); + navigator_->Navigate( + nested_->id(), details.Pass(), response_details.Pass()); } - NestingApp* app_; - DISALLOW_COPY_AND_ASSIGN(Navigator); - }; + } + private: // Overridden from ApplicationImpl: virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - ViewManager::ConfigureIncomingConnection(connection, this); connection->ConnectToService(&window_manager_); - connection->AddService<Navigator>(this); + connection->AddService(&view_manager_client_factory_); + connection->AddService(this); // TODO(davemoore): Is this ok? if (!navigator_) { connection->ConnectToApplication( @@ -111,28 +128,27 @@ class NestingApp : public ApplicationDelegate, nested_ = NULL; } - void NavigateChild() { - if (!color_.empty() && nested_) { - navigation::NavigationDetailsPtr details( - navigation::NavigationDetails::New()); - details->url = - base::StringPrintf("%s/%s", kEmbeddedAppURL, color_.c_str()); - navigation::ResponseDetailsPtr response_details( - navigation::ResponseDetails::New()); - navigator_->Navigate(nested_->id(), - details.Pass(), - response_details.Pass()); - } - } - std::string color_; Node* nested_; navigation::NavigatorPtr navigator_; IWindowManagerPtr window_manager_; + ViewManagerClientFactory view_manager_client_factory_; DISALLOW_COPY_AND_ASSIGN(NestingApp); }; +void Navigator::Navigate(uint32 node_id, + navigation::NavigationDetailsPtr navigation_details, + navigation::ResponseDetailsPtr response_details) { + GURL url(navigation_details->url.To<std::string>()); + if (!url.is_valid()) { + LOG(ERROR) << "URL is invalid."; + return; + } + app_->set_color(url.path().substr(1)); + app_->NavigateChild(); +} + } // namespace examples // static diff --git a/mojo/examples/png_viewer/png_viewer.cc b/mojo/examples/png_viewer/png_viewer.cc index c9488e7..e1a5aed 100644 --- a/mojo/examples/png_viewer/png_viewer.cc +++ b/mojo/examples/png_viewer/png_viewer.cc @@ -9,11 +9,13 @@ #include "mojo/examples/media_viewer/media_viewer.mojom.h" #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/types.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" #include "skia/ext/platform_canvas.h" @@ -31,8 +33,7 @@ class PNGViewer; class ZoomableMediaImpl : public InterfaceImpl<ZoomableMedia> { public: - ZoomableMediaImpl(ApplicationConnection* connection, - PNGViewer* viewer) : viewer_(viewer) {} + explicit ZoomableMediaImpl(PNGViewer* viewer) : viewer_(viewer) {} virtual ~ZoomableMediaImpl() {} private: @@ -48,8 +49,7 @@ class ZoomableMediaImpl : public InterfaceImpl<ZoomableMedia> { class NavigatorImpl : public InterfaceImpl<navigation::Navigator> { public: - NavigatorImpl(ApplicationConnection* connection, - PNGViewer* viewer) : viewer_(viewer) {} + explicit NavigatorImpl(PNGViewer* viewer) : viewer_(viewer) {} virtual ~NavigatorImpl() {} private: @@ -111,14 +111,20 @@ class NavigatorImpl : public InterfaceImpl<navigation::Navigator> { DISALLOW_COPY_AND_ASSIGN(NavigatorImpl); }; -class PNGViewer : public ApplicationDelegate, - public view_manager::ViewManagerDelegate, - public view_manager::NodeObserver { +class PNGViewer + : public ApplicationDelegate, + public view_manager::ViewManagerDelegate, + public view_manager::NodeObserver, + public InterfaceFactoryWithContext<NavigatorImpl, PNGViewer>, + public InterfaceFactoryWithContext<ZoomableMediaImpl, PNGViewer> { public: PNGViewer() - : content_view_(NULL), + : InterfaceFactoryWithContext<NavigatorImpl, PNGViewer>(this), + InterfaceFactoryWithContext<ZoomableMediaImpl, PNGViewer>(this), + content_view_(NULL), root_(NULL), - zoom_percentage_(kDefaultZoomPercentage) {} + zoom_percentage_(kDefaultZoomPercentage), + view_manager_client_factory_(this) {} virtual ~PNGViewer() { if (root_) root_->RemoveObserver(this); @@ -160,9 +166,9 @@ class PNGViewer : public ApplicationDelegate, // Overridden from ApplicationDelegate: virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - connection->AddService<NavigatorImpl>(this); - connection->AddService<ZoomableMediaImpl>(this); - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService<navigation::Navigator>(this); + connection->AddService<ZoomableMedia>(this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -216,6 +222,7 @@ class PNGViewer : public ApplicationDelegate, view_manager::Node* root_; SkBitmap bitmap_; uint16_t zoom_percentage_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; DISALLOW_COPY_AND_ASSIGN(PNGViewer); }; diff --git a/mojo/examples/surfaces_app/child_app.cc b/mojo/examples/surfaces_app/child_app.cc index 0a5c034..215f496 100644 --- a/mojo/examples/surfaces_app/child_app.cc +++ b/mojo/examples/surfaces_app/child_app.cc @@ -11,28 +11,31 @@ namespace mojo { namespace examples { -class ChildApp : public ApplicationDelegate, public ChildImpl::Context { +class ChildApp : public ApplicationDelegate, public InterfaceFactory<Child> { public: ChildApp() {} virtual ~ChildApp() {} - virtual void Initialize(ApplicationImpl* app) OVERRIDE { app_ = app; } + virtual void Initialize(ApplicationImpl* app) OVERRIDE { + surfaces_service_connection_ = + app->ConnectToApplication("mojo:mojo_surfaces_service"); + } // ApplicationDelegate implementation. virtual bool ConfigureIncomingConnection( ApplicationConnection* connection) OVERRIDE { - connection->AddService<ChildImpl, ChildImpl::Context>(this); + connection->AddService(this); return true; } - // ChildImpl::Context implementation. - virtual ApplicationConnection* ShellConnection( - const mojo::String& application_url) OVERRIDE { - return app_->ConnectToApplication(application_url); + // InterfaceFactory<Child> implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<Child> request) OVERRIDE { + BindToRequest(new ChildImpl(surfaces_service_connection_), &request); } private: - ApplicationImpl* app_; + ApplicationConnection* surfaces_service_connection_; DISALLOW_COPY_AND_ASSIGN(ChildApp); }; diff --git a/mojo/examples/surfaces_app/child_impl.cc b/mojo/examples/surfaces_app/child_impl.cc index 2d5140a..e84e933 100644 --- a/mojo/examples/surfaces_app/child_impl.cc +++ b/mojo/examples/surfaces_app/child_impl.cc @@ -27,30 +27,9 @@ using cc::SolidColorDrawQuad; using cc::DelegatedFrameData; using cc::CompositorFrame; -class SurfaceClientImpl : public surfaces::SurfaceClient { - public: - explicit SurfaceClientImpl(ChildImpl* impl) : impl_(impl) {} - virtual ~SurfaceClientImpl() {} - - // surfaces::SurfaceClient implementation - virtual void SetIdNamespace(uint32_t id_namespace) OVERRIDE { - impl_->SetIdNamespace(id_namespace); - } - - virtual void ReturnResources( - Array<surfaces::ReturnedResourcePtr> resources) OVERRIDE { - DCHECK(!resources.size()); - } - - private: - ChildImpl* impl_; -}; - -ChildImpl::ChildImpl(ApplicationConnection* connection, Context* context) - : surface_client_(new SurfaceClientImpl(this)) { - context->ShellConnection("mojo:mojo_surfaces_service") - ->ConnectToService(&surface_); - surface_.set_client(surface_client_.get()); +ChildImpl::ChildImpl(ApplicationConnection* surfaces_service_connection) { + surfaces_service_connection->ConnectToService(&surface_); + surface_.set_client(this); } ChildImpl::~ChildImpl() { @@ -74,6 +53,11 @@ void ChildImpl::SetIdNamespace(uint32_t id_namespace) { Draw(); } +void ChildImpl::ReturnResources( + Array<surfaces::ReturnedResourcePtr> resources) { + DCHECK(!resources.size()); +} + void ChildImpl::Draw() { id_ = allocator_->GenerateId(); surface_->CreateSurface(mojo::surfaces::SurfaceId::From(id_), diff --git a/mojo/examples/surfaces_app/child_impl.h b/mojo/examples/surfaces_app/child_impl.h index 8770f61..cdd5263 100644 --- a/mojo/examples/surfaces_app/child_impl.h +++ b/mojo/examples/surfaces_app/child_impl.h @@ -29,20 +29,21 @@ class Surface; namespace examples { -class SurfaceClientImpl; - // Simple example of a child app using surfaces. -class ChildImpl : public InterfaceImpl<Child> { +class ChildImpl : public InterfaceImpl<Child>, public surfaces::SurfaceClient { public: class Context { public: virtual ApplicationConnection* ShellConnection( const mojo::String& application_url) = 0; }; - ChildImpl(ApplicationConnection* connection, Context* context); + explicit ChildImpl(ApplicationConnection* surfaces_service_connection); virtual ~ChildImpl(); - void SetIdNamespace(uint32_t id_namespace); + // surfaces::SurfaceClient implementation + virtual void SetIdNamespace(uint32_t id_namespace) OVERRIDE; + virtual void ReturnResources( + Array<surfaces::ReturnedResourcePtr> resources) OVERRIDE; private: // Child implementation. @@ -58,7 +59,6 @@ class ChildImpl : public InterfaceImpl<Child> { scoped_ptr<cc::SurfaceIdAllocator> allocator_; surfaces::SurfacePtr surface_; cc::SurfaceId id_; - scoped_ptr<SurfaceClientImpl> surface_client_; mojo::Callback<void(surfaces::SurfaceIdPtr id)> produce_callback_; DISALLOW_COPY_AND_ASSIGN(ChildImpl); diff --git a/mojo/examples/window_manager/window_manager.cc b/mojo/examples/window_manager/window_manager.cc index 1ef062c..1f4e597 100644 --- a/mojo/examples/window_manager/window_manager.cc +++ b/mojo/examples/window_manager/window_manager.cc @@ -10,12 +10,14 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/cpp/view_manager/window_manager_delegate.h" #include "mojo/services/public/interfaces/input_events/input_events.mojom.h" @@ -35,6 +37,7 @@ using mojo::view_manager::Node; using mojo::view_manager::NodeObserver; using mojo::view_manager::View; using mojo::view_manager::ViewManager; +using mojo::view_manager::ViewManagerClientFactory; using mojo::view_manager::ViewManagerDelegate; using mojo::view_manager::ViewObserver; using mojo::view_manager::WindowManagerDelegate; @@ -54,8 +57,7 @@ const int kTextfieldHeight = 25; class WindowManagerConnection : public InterfaceImpl<IWindowManager> { public: - explicit WindowManagerConnection(ApplicationConnection* connection, - WindowManager* window_manager) + explicit WindowManagerConnection(WindowManager* window_manager) : window_manager_(window_manager) {} virtual ~WindowManagerConnection() {} @@ -72,10 +74,8 @@ class WindowManagerConnection : public InterfaceImpl<IWindowManager> { class NavigatorHost : public InterfaceImpl<navigation::NavigatorHost> { public: - explicit NavigatorHost(ApplicationConnection* connection, - WindowManager* window_manager) - : window_manager_(window_manager) { - } + explicit NavigatorHost(WindowManager* window_manager) + : window_manager_(window_manager) {} virtual ~NavigatorHost() { } @@ -249,16 +249,23 @@ class RootLayoutManager : public NodeObserver { DISALLOW_COPY_AND_ASSIGN(RootLayoutManager); }; -class WindowManager : public ApplicationDelegate, - public DebugPanel::Delegate, - public ViewManagerDelegate, - public WindowManagerDelegate { +class WindowManager + : public ApplicationDelegate, + public DebugPanel::Delegate, + public ViewManagerDelegate, + public WindowManagerDelegate, + public InterfaceFactoryWithContext<WindowManagerConnection, + WindowManager>, + public InterfaceFactoryWithContext<NavigatorHost, WindowManager> { public: WindowManager() - : launcher_ui_(NULL), + : InterfaceFactoryWithContext<WindowManagerConnection, WindowManager>( + this), + InterfaceFactoryWithContext<NavigatorHost, WindowManager>(this), + launcher_ui_(NULL), view_manager_(NULL), - app_(NULL) { - } + view_manager_client_factory_(this), + app_(NULL) {} virtual ~WindowManager() {} @@ -329,9 +336,9 @@ class WindowManager : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - connection->AddService<WindowManagerConnection>(this); - connection->AddService<NavigatorHost>(this); - ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService<IWindowManager>(this); + connection->AddService<navigation::NavigatorHost>(this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -505,6 +512,7 @@ class WindowManager : public ApplicationDelegate, Node* launcher_ui_; std::vector<Node*> windows_; ViewManager* view_manager_; + ViewManagerClientFactory view_manager_client_factory_; scoped_ptr<RootLayoutManager> root_layout_manager_; // Id of the node most content is added to. The keyboard is NOT added here. diff --git a/mojo/gles2/command_buffer_client_impl.cc b/mojo/gles2/command_buffer_client_impl.cc index 3a71697..cc6b9d0 100644 --- a/mojo/gles2/command_buffer_client_impl.cc +++ b/mojo/gles2/command_buffer_client_impl.cc @@ -107,7 +107,7 @@ bool CommandBufferClientImpl::Initialize() { CommandBufferSyncClientPtr sync_client; sync_client_impl_.reset( - BindToProxy(new SyncClientImpl(), &sync_client, async_waiter_)); + WeakBindToProxy(new SyncClientImpl(), &sync_client, async_waiter_)); command_buffer_->Initialize(sync_client.Pass(), duped.Pass()); diff --git a/mojo/mojo_public.gypi b/mojo/mojo_public.gypi index c1c6e63..42cc9f50 100644 --- a/mojo/mojo_public.gypi +++ b/mojo/mojo_public.gypi @@ -185,11 +185,11 @@ 'sources': [ 'public/cpp/application/application_impl.h', 'public/cpp/application/connect.h', + 'public/cpp/application/lib/application_connection.cc', + 'public/cpp/application/lib/application_delegate.cc', 'public/cpp/application/lib/application_impl.cc', 'public/cpp/application/lib/service_connector.cc', 'public/cpp/application/lib/service_connector.h', - 'public/cpp/application/lib/application_connection.cc', - 'public/cpp/application/lib/application_delegate.cc', 'public/cpp/application/lib/service_registry.cc', 'public/cpp/application/lib/service_registry.h', ], diff --git a/mojo/mojo_services.gypi b/mojo/mojo_services.gypi index 4c13c0a..821afcf 100644 --- a/mojo/mojo_services.gypi +++ b/mojo/mojo_services.gypi @@ -527,12 +527,14 @@ 'services/public/cpp/view_manager/lib/view.cc', 'services/public/cpp/view_manager/lib/view_private.cc', 'services/public/cpp/view_manager/lib/view_private.h', + 'services/public/cpp/view_manager/lib/view_manager_client_factory.cc', 'services/public/cpp/view_manager/lib/view_manager_client_impl.cc', 'services/public/cpp/view_manager/lib/view_manager_client_impl.h', 'services/public/cpp/view_manager/node.h', 'services/public/cpp/view_manager/node_observer.h', 'services/public/cpp/view_manager/view.h', 'services/public/cpp/view_manager/view_manager.h', + 'services/public/cpp/view_manager/view_manager_client_factory.h', 'services/public/cpp/view_manager/view_manager_delegate.h', 'services/public/cpp/view_manager/view_observer.h', 'services/public/cpp/view_manager/window_manager_delegate.h', diff --git a/mojo/public/cpp/application/application_connection.h b/mojo/public/cpp/application/application_connection.h index 2044af1..c0e3480 100644 --- a/mojo/public/cpp/application/application_connection.h +++ b/mojo/public/cpp/application/application_connection.h @@ -21,51 +21,26 @@ namespace mojo { // to implement a service named Foo. // That class must subclass an InterfaceImpl specialization. // -// If there is context that is to be shared amongst all instances, define a -// constructor with that class as its only argument, otherwise define an empty -// constructor. +// Then implement an InterfaceFactory<Foo> that binds instances of FooImpl to +// InterfaceRequest<Foo>s and register that on the connection. // -// class FooImpl : public InterfaceImpl<Foo> { -// public: -// explicit FooImpl(ApplicationConnnection* connection) {} -// }; +// connection->AddService(&factory); // -// or +// Or if you have multiple factories implemented by the same type, explicitly +// specify the interface to register the factory for: // -// class BarImpl : public InterfaceImpl<Bar> { -// public: -// // contexts will remain valid for the lifetime of BarImpl. -// BarImpl(ApplicationConnnection* connection, BarContext* service_context) -// : connection_(connection), servicecontext_(context) {} +// connection->AddService<Foo>(&my_foo_and_bar_factory_); +// connection->AddService<Bar>(&my_foo_and_bar_factory_); // -// Create an ApplicationDelegate instance and pass it to the constructor -// of an ApplicationImpl. The delegate will be called when new connections are -// made to other applications. -// -// connection->AddService<FooImpl>(); -// -// BarContext context; -// connection->AddService<BarImpl>(&context); +// The InterfaceFactory must outlive the ApplicationConnection. class ApplicationConnection { public: virtual ~ApplicationConnection(); - // Impl’s constructor will receive two arguments: - // Impl::Impl(Application::Context* app_context, - // ServiceContext* svc_context) - template <typename Impl, typename ServiceContext> - void AddService(ServiceContext* context) { - AddServiceConnector( - new internal::ServiceConnector<Impl, ServiceContext>(Impl::Name_, - context)); - } - - // Impl’s constructor will receive one argument: - // Impl::Impl(Application::Context* app_context) - template <typename Impl> - void AddService() { + template <typename Interface> + void AddService(InterfaceFactory<Interface>* factory) { AddServiceConnector( - new internal::ServiceConnector<Impl, void>(Impl::Name_, NULL)); + new internal::InterfaceFactoryConnector<Interface>(factory)); } // Connect to the service implementing |Interface|. @@ -96,8 +71,8 @@ class ApplicationConnection { // Raw ServiceProvider interface to remote application. virtual ServiceProvider* GetServiceProvider() = 0; -private: - virtual void AddServiceConnector( + private: + virtual void AddServiceConnector( internal::ServiceConnectorBase* service_connector) = 0; }; diff --git a/mojo/public/cpp/application/interface_factory.h b/mojo/public/cpp/application/interface_factory.h new file mode 100644 index 0000000..90abd13 --- /dev/null +++ b/mojo/public/cpp/application/interface_factory.h @@ -0,0 +1,30 @@ +// Copyright 2014 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_INTERFACE_FACTORY_H_ +#define MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_H_ + +#include "mojo/public/cpp/bindings/interface_impl.h" +#include "mojo/public/cpp/bindings/interface_request.h" + +namespace mojo { + +class ApplicationConnection; +template <typename Interface> class InterfaceRequest; + +// Implement this class to provide implementations of a given interface and +// bind them to incoming requests. The implementation of this class is +// responsible for managing the lifetime of the implementations of the +// interface. +template <typename Interface> +class InterfaceFactory { + public: + virtual ~InterfaceFactory() {} + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<Interface> request) = 0; +}; + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_H_ diff --git a/mojo/public/cpp/application/interface_factory_with_context.h b/mojo/public/cpp/application/interface_factory_with_context.h new file mode 100644 index 0000000..8ea7215 --- /dev/null +++ b/mojo/public/cpp/application/interface_factory_with_context.h @@ -0,0 +1,34 @@ +// Copyright 2014 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_INTERFACE_FACTORY_WITH_CONTEXT_H_ +#define MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_WITH_CONTEXT_H_ + +#include "mojo/public/cpp/application/interface_factory.h" + +namespace mojo { + +// Use this class to allocate and bind instances of Impl constructed with a +// context parameter to interface requests. The lifetime of the constructed +// Impls is bound to the pipe. +template <typename Impl, + typename Context, + typename Interface = typename Impl::ImplementedInterface> +class InterfaceFactoryWithContext : public InterfaceFactory<Interface> { + public: + explicit InterfaceFactoryWithContext(Context* context) : context_(context) {} + virtual ~InterfaceFactoryWithContext() {} + + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<Interface> request) MOJO_OVERRIDE { + BindToRequest(new Impl(context_), &request); + } + + private: + Context* context_; +}; + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_WITH_CONTEXT_H_ diff --git a/mojo/public/cpp/application/lib/mojo_main_chromium.cc b/mojo/public/cpp/application/lib/mojo_main_chromium.cc index 269b7a2..d8c5e3f 100644 --- a/mojo/public/cpp/application/lib/mojo_main_chromium.cc +++ b/mojo/public/cpp/application/lib/mojo_main_chromium.cc @@ -14,12 +14,16 @@ extern "C" APPLICATION_EXPORT MojoResult CDECL MojoMain( #if !defined(COMPONENT_BUILD) base::AtExitManager at_exit; #endif - base::MessageLoop loop; - scoped_ptr<mojo::ApplicationDelegate> delegate( - mojo::ApplicationDelegate::Create()); - mojo::ApplicationImpl app(delegate.get()); - app.BindShell(shell_handle); - loop.Run(); + scoped_ptr<mojo::ApplicationDelegate> delegate; + { + // We have to shut down the MessageLoop before destroying the + // ApplicationDelegate. + base::MessageLoop loop; + delegate.reset(mojo::ApplicationDelegate::Create()); + mojo::ApplicationImpl app(delegate.get()); + app.BindShell(shell_handle); + loop.Run(); + } return MOJO_RESULT_OK; } diff --git a/mojo/public/cpp/application/lib/mojo_main_standalone.cc b/mojo/public/cpp/application/lib/mojo_main_standalone.cc index 0ba078b..6071b6b 100644 --- a/mojo/public/cpp/application/lib/mojo_main_standalone.cc +++ b/mojo/public/cpp/application/lib/mojo_main_standalone.cc @@ -10,12 +10,17 @@ extern "C" APPLICATION_EXPORT MojoResult CDECL MojoMain( MojoHandle shell_handle) { mojo::Environment env; - mojo::RunLoop loop; - mojo::ApplicationDelegate* delegate = mojo::ApplicationDelegate::Create(); + mojo::ApplicationDelegate* delegate = NULL; { - mojo::ApplicationImpl app(delegate); - app.BindShell(shell_handle); - loop.Run(); + // We have to shut down the RunLoop before destroying the + // ApplicationDelegate. + mojo::RunLoop loop; + delegate = mojo::ApplicationDelegate::Create(); + { + mojo::ApplicationImpl app(delegate); + app.BindShell(shell_handle); + loop.Run(); + } } delete delegate; diff --git a/mojo/public/cpp/application/lib/service_connector.h b/mojo/public/cpp/application/lib/service_connector.h index d2de48b..aeb7de1 100644 --- a/mojo/public/cpp/application/lib/service_connector.h +++ b/mojo/public/cpp/application/lib/service_connector.h @@ -5,10 +5,8 @@ #ifndef MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_H_ #define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_H_ -#include <assert.h> - -#include <vector> - +#include "mojo/public/cpp/application/interface_factory.h" +#include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" namespace mojo { @@ -16,59 +14,6 @@ class ApplicationConnection; namespace internal { -template <class ServiceImpl, typename Context> -class ServiceConnector; - -// Specialization of ServiceConnection. -// ServiceImpl: Subclass of InterfaceImpl<...>. -// Context: Type of shared context. -template <class ServiceImpl, typename Context> -class ServiceConnection : public ServiceImpl { - public: - explicit ServiceConnection(ApplicationConnection* connection) - : ServiceImpl(connection) {} - ServiceConnection(ApplicationConnection* connection, - Context* context) : ServiceImpl(connection, context) {} - - virtual void OnConnectionError() MOJO_OVERRIDE { - service_connector_->RemoveConnection(static_cast<ServiceImpl*>(this)); - ServiceImpl::OnConnectionError(); - } - -private: - friend class ServiceConnector<ServiceImpl, Context>; - - // Called shortly after this class is instantiated. - void set_service_connector( - ServiceConnector<ServiceImpl, Context>* connector) { - service_connector_ = connector; - } - - ServiceConnector<ServiceImpl, Context>* service_connector_; - - MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnection); -}; - -template <typename ServiceImpl, typename Context> -struct ServiceConstructor { - static ServiceConnection<ServiceImpl, Context>* New( - ApplicationConnection* connection, - Context* context) { - return new ServiceConnection<ServiceImpl, Context>( - connection, context); - } -}; - -template <typename ServiceImpl> -struct ServiceConstructor<ServiceImpl, void> { - public: - static ServiceConnection<ServiceImpl, void>* New( - ApplicationConnection* connection, - void* context) { - return new ServiceConnection<ServiceImpl, void>(connection); - } -}; - class ServiceConnectorBase { public: ServiceConnectorBase(const std::string& name); @@ -86,53 +31,22 @@ class ServiceConnectorBase { MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnectorBase); }; -template <class ServiceImpl, typename Context=void> -class ServiceConnector : public internal::ServiceConnectorBase { +template <typename Interface> +class InterfaceFactoryConnector : public ServiceConnectorBase { public: - ServiceConnector(const std::string& name, Context* context = NULL) - : ServiceConnectorBase(name), context_(context) {} - - virtual ~ServiceConnector() { - ConnectionList doomed; - doomed.swap(connections_); - for (typename ConnectionList::iterator it = doomed.begin(); - it != doomed.end(); ++it) { - delete *it; - } - assert(connections_.empty()); // No one should have added more! - } + explicit InterfaceFactoryConnector(InterfaceFactory<Interface>* factory) + : ServiceConnectorBase(Interface::Name_), factory_(factory) {} + virtual ~InterfaceFactoryConnector() {} virtual void ConnectToService(const std::string& name, - ScopedMessagePipeHandle handle) MOJO_OVERRIDE { - ServiceConnection<ServiceImpl, Context>* impl = - ServiceConstructor<ServiceImpl, Context>::New(application_connection_, - context_); - impl->set_service_connector(this); - BindToPipe(impl, handle.Pass()); - - connections_.push_back(impl); - } - - void RemoveConnection(ServiceImpl* impl) { - // Called from ~ServiceImpl, in response to a connection error. - for (typename ConnectionList::iterator it = connections_.begin(); - it != connections_.end(); ++it) { - if (*it == impl) { - delete impl; - connections_.erase(it); - return; - } - } + ScopedMessagePipeHandle client_handle) { + factory_->Create(application_connection_, + MakeRequest<Interface>(client_handle.Pass())); } - Context* context() const { return context_; } - private: - typedef std::vector<ServiceImpl*> ConnectionList; - ConnectionList connections_; - Context* context_; - - MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnector); + InterfaceFactory<Interface>* factory_; + MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceFactoryConnector); }; } // namespace internal diff --git a/mojo/public/cpp/bindings/interface_impl.h b/mojo/public/cpp/bindings/interface_impl.h index 4a78cb4..da1055d 100644 --- a/mojo/public/cpp/bindings/interface_impl.h +++ b/mojo/public/cpp/bindings/interface_impl.h @@ -19,6 +19,7 @@ template <typename Interface> class InterfaceImpl : public internal::InterfaceImplBase<Interface> { public: typedef typename Interface::Client Client; + typedef Interface ImplementedInterface; InterfaceImpl() : internal_state_(this) {} virtual ~InterfaceImpl() {} @@ -57,12 +58,15 @@ class InterfaceImpl : public internal::InterfaceImplBase<Interface> { // Takes an instance of an InterfaceImpl<..> subclass and binds it to the given // MessagePipe. The instance is returned for convenience in member initializer -// lists, etc. If the pipe is closed, the instance's OnConnectionError method -// will be called. +// lists, etc. +// +// If the pipe is closed, the instance's OnConnectionError method will be called +// and then the instance will be deleted. // // The instance is also bound to the current thread. Its methods will only be -// called on the current thread, and if the current thread exits, then it will -// also be deleted, and along with it, its end point of the pipe will be closed. +// called on the current thread, and if the current thread exits, then the end +// point of the pipe will be closed and the error handler's OnConnectionError +// method will be called. // // Before returning, the instance's OnConnectionEstablished method is called. template <typename Impl> @@ -70,14 +74,25 @@ Impl* BindToPipe( Impl* instance, ScopedMessagePipeHandle handle, const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { - instance->internal_state()->Bind(handle.Pass(), waiter); + instance->internal_state()->Bind(handle.Pass(), true, waiter); + return instance; +} + +// Like BindToPipe but does not delete the instance after a channel error. +template <typename Impl> +Impl* WeakBindToPipe( + Impl* instance, + ScopedMessagePipeHandle handle, + const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { + instance->internal_state()->Bind(handle.Pass(), false, waiter); return instance; } // Takes an instance of an InterfaceImpl<..> subclass and binds it to the given // InterfacePtr<..>. The instance is returned for convenience in member // initializer lists, etc. If the pipe is closed, the instance's -// OnConnectionError method will be called. +// OnConnectionError method will be called and then the instance will be +// deleted. // // The instance is also bound to the current thread. Its methods will only be // called on the current thread, and if the current thread exits, then it will @@ -89,14 +104,25 @@ Impl* BindToProxy( Impl* instance, InterfacePtr<Interface>* ptr, const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { - instance->internal_state()->BindProxy(ptr, waiter); + instance->internal_state()->BindProxy(ptr, true, waiter); + return instance; +} + +// Like BindToProxy but does not delete the instance after a channel error. +template <typename Impl, typename Interface> +Impl* WeakBindToProxy( + Impl* instance, + InterfacePtr<Interface>* ptr, + const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { + instance->internal_state()->BindProxy(ptr, false, waiter); return instance; } // Takes an instance of an InterfaceImpl<..> subclass and binds it to the given // InterfaceRequest<..>. The instance is returned for convenience in member // initializer lists, etc. If the pipe is closed, the instance's -// OnConnectionError method will be called. +// OnConnectionError method will be called and then the instance will be +// deleted. // // The instance is also bound to the current thread. Its methods will only be // called on the current thread, and if the current thread exits, then it will @@ -112,6 +138,15 @@ Impl* BindToRequest( return BindToPipe(instance, request->PassMessagePipe(), waiter); } +// Like BindToRequest but does not delete the instance after a channel error. +template <typename Impl, typename Interface> +Impl* WeakBindToRequest( + Impl* instance, + InterfaceRequest<Interface>* request, + const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { + return WeakBindToPipe(instance, request->PassMessagePipe(), waiter); +} + } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_IMPL_H_ diff --git a/mojo/public/cpp/bindings/lib/interface_impl_internal.h b/mojo/public/cpp/bindings/lib/interface_impl_internal.h index d94d12d..79f59d8 100644 --- a/mojo/public/cpp/bindings/lib/interface_impl_internal.h +++ b/mojo/public/cpp/bindings/lib/interface_impl_internal.h @@ -31,12 +31,21 @@ class InterfaceImplState : public ErrorHandler { explicit InterfaceImplState(InterfaceImplBase<Interface>* instance) : router_(NULL), - proxy_(NULL) { + proxy_(NULL), + instance_bound_to_pipe_(false) +#ifndef NDEBUG + , + deleting_instance_due_to_error_(false) +#endif + { MOJO_DCHECK(instance); stub_.set_sink(instance); } virtual ~InterfaceImplState() { +#ifndef NDEBUG + MOJO_DCHECK(!instance_bound_to_pipe_ || deleting_instance_due_to_error_); +#endif delete proxy_; if (router_) { router_->set_error_handler(NULL); @@ -46,13 +55,15 @@ class InterfaceImplState : public ErrorHandler { void BindProxy( InterfacePtr<Interface>* ptr, + bool instance_bound_to_pipe, const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { MessagePipe pipe; ptr->Bind(pipe.handle0.Pass(), waiter); - Bind(pipe.handle1.Pass(), waiter); + Bind(pipe.handle1.Pass(), instance_bound_to_pipe, waiter); } void Bind(ScopedMessagePipeHandle handle, + bool instance_bound_to_pipe, const MojoAsyncWaiter* waiter) { MOJO_DCHECK(!router_); @@ -67,6 +78,8 @@ class InterfaceImplState : public ErrorHandler { proxy_ = new typename Client::Proxy_(router_); + instance_bound_to_pipe_ = instance_bound_to_pipe; + instance()->OnConnectionEstablished(); } @@ -84,12 +97,27 @@ class InterfaceImplState : public ErrorHandler { } virtual void OnConnectionError() MOJO_OVERRIDE { + // If the the instance is not bound to the pipe, the instance might choose + // to delete itself in the OnConnectionError handler, which would in turn + // delete this. Save the error behavior before invoking the error handler + // so we can correctly decide what to do. + bool bound = instance_bound_to_pipe_; instance()->OnConnectionError(); + if (!bound) + return; +#ifndef NDEBUG + deleting_instance_due_to_error_ = true; +#endif + delete instance(); } Router* router_; typename Client::Proxy_* proxy_; typename Interface::Stub_ stub_; + bool instance_bound_to_pipe_; +#ifndef NDEBUG + bool deleting_instance_due_to_error_; +#endif MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceImplState); }; diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc index d2e287f..696e613 100644 --- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc +++ b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc @@ -29,10 +29,6 @@ class StringRecorder { class ImportedInterfaceImpl : public InterfaceImpl<imported::ImportedInterface> { public: - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } - virtual void DoSomething() MOJO_OVERRIDE { do_something_count_++; } @@ -46,10 +42,6 @@ int ImportedInterfaceImpl::do_something_count_ = 0; class SampleNamedObjectImpl : public InterfaceImpl<sample::NamedObject> { public: - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } - virtual void SetName(const mojo::String& name) MOJO_OVERRIDE { name_ = name; } @@ -65,10 +57,6 @@ class SampleNamedObjectImpl : public InterfaceImpl<sample::NamedObject> { class SampleFactoryImpl : public InterfaceImpl<sample::Factory> { public: - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } - virtual void DoStuff(sample::RequestPtr request, ScopedMessagePipeHandle pipe) MOJO_OVERRIDE { std::string text1; diff --git a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc b/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc index 533d990..e3e9f1e 100644 --- a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc +++ b/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc @@ -41,10 +41,6 @@ class MathCalculatorImpl : public InterfaceImpl<math::Calculator> { got_connection_ = true; } - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } - virtual void Clear() MOJO_OVERRIDE { client()->Output(total_); } @@ -164,10 +160,6 @@ class ReentrantServiceImpl : public InterfaceImpl<sample::Service> { got_connection_ = true; } - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } - bool got_connection() const { return got_connection_; } diff --git a/mojo/public/cpp/bindings/tests/request_response_unittest.cc b/mojo/public/cpp/bindings/tests/request_response_unittest.cc index 338d968..a082a09 100644 --- a/mojo/public/cpp/bindings/tests/request_response_unittest.cc +++ b/mojo/public/cpp/bindings/tests/request_response_unittest.cc @@ -15,10 +15,6 @@ namespace { class ProviderImpl : public InterfaceImpl<sample::Provider> { public: - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } - virtual void EchoString( const String& a, const Callback<void(String)>& callback) MOJO_OVERRIDE { diff --git a/mojo/public/cpp/bindings/tests/validation_unittest.cc b/mojo/public/cpp/bindings/tests/validation_unittest.cc index 9269212..6463a9e 100644 --- a/mojo/public/cpp/bindings/tests/validation_unittest.cc +++ b/mojo/public/cpp/bindings/tests/validation_unittest.cc @@ -275,10 +275,6 @@ class IntegrationTestInterface1Impl virtual void Method0(BasicStructPtr param0) MOJO_OVERRIDE { } - - virtual void OnConnectionError() MOJO_OVERRIDE { - delete this; - } }; TEST_F(ValidationTest, InputParser) { diff --git a/mojo/service_manager/service_manager.cc b/mojo/service_manager/service_manager.cc index 7b5be43..92d336c 100644 --- a/mojo/service_manager/service_manager.cc +++ b/mojo/service_manager/service_manager.cc @@ -117,7 +117,7 @@ void ServiceManager::ConnectToApplication(const GURL& url, } else { MessagePipe pipe; GetLoaderForURL(url)->LoadService(this, url, pipe.handle0.Pass()); - shell_impl = BindToPipe(new ShellImpl(this, url), pipe.handle1.Pass()); + shell_impl = WeakBindToPipe(new ShellImpl(this, url), pipe.handle1.Pass()); url_to_shell_impl_[url] = shell_impl; } if (interceptor_) { diff --git a/mojo/service_manager/service_manager_unittest.cc b/mojo/service_manager/service_manager_unittest.cc index f485600..b3601e1 100644 --- a/mojo/service_manager/service_manager_unittest.cc +++ b/mojo/service_manager/service_manager_unittest.cc @@ -8,6 +8,7 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory.h" #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" #include "mojo/service_manager/service_loader.h" #include "mojo/service_manager/service_manager.h" @@ -44,8 +45,7 @@ class QuitMessageLoopErrorHandler : public ErrorHandler { class TestServiceImpl : public InterfaceImpl<TestService> { public: - explicit TestServiceImpl(ApplicationConnection* connection, - TestContext* context) : context_(context) { + explicit TestServiceImpl(TestContext* context) : context_(context) { ++context_->num_impls; } @@ -98,7 +98,8 @@ class TestClientImpl : public TestClient { }; class TestServiceLoader : public ServiceLoader, - public ApplicationDelegate { + public ApplicationDelegate, + public InterfaceFactory<TestService> { public: TestServiceLoader() : context_(NULL), @@ -115,6 +116,7 @@ class TestServiceLoader : public ServiceLoader, int num_loads() const { return num_loads_; } private: + // ServiceLoader implementation. virtual void LoadService( ServiceManager* manager, const GURL& url, @@ -127,12 +129,19 @@ class TestServiceLoader : public ServiceLoader, const GURL& url) OVERRIDE { } + // ApplicationDelegate implementation. virtual bool ConfigureIncomingConnection( ApplicationConnection* connection) OVERRIDE { - connection->AddService<TestServiceImpl>(context_); + connection->AddService(this); return true; } + // InterfaceFactory implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestService> request) OVERRIDE { + BindToRequest(new TestServiceImpl(context_), &request); + } + scoped_ptr<ApplicationImpl> test_app_; TestContext* context_; int num_loads_; @@ -160,8 +169,7 @@ struct TesterContext { // Used to test that the requestor url will be correctly passed. class TestAImpl : public InterfaceImpl<TestA> { public: - explicit TestAImpl(ApplicationConnection* connection, - TesterContext* test_context) + TestAImpl(ApplicationConnection* connection, TesterContext* test_context) : test_context_(test_context) { connection->ConnectToApplication(kTestBURLString)->ConnectToService(&b_); } @@ -187,8 +195,7 @@ class TestAImpl : public InterfaceImpl<TestA> { class TestBImpl : public InterfaceImpl<TestB> { public: - explicit TestBImpl(ApplicationConnection* connection, - TesterContext* test_context) + TestBImpl(ApplicationConnection* connection, TesterContext* test_context) : test_context_(test_context) { connection->ConnectToService(&c_); } @@ -217,10 +224,8 @@ class TestBImpl : public InterfaceImpl<TestB> { class TestCImpl : public InterfaceImpl<TestC> { public: - explicit TestCImpl(ApplicationConnection* connection, - TesterContext* test_context) - : test_context_(test_context) { - } + TestCImpl(ApplicationConnection* connection, TesterContext* test_context) + : test_context_(test_context) {} virtual ~TestCImpl() { test_context_->num_c_deletes++; } @@ -232,7 +237,11 @@ class TestCImpl : public InterfaceImpl<TestC> { TesterContext* test_context_; }; -class Tester : public ApplicationDelegate, public ServiceLoader { +class Tester : public ApplicationDelegate, + public ServiceLoader, + public InterfaceFactory<TestA>, + public InterfaceFactory<TestB>, + public InterfaceFactory<TestC> { public: Tester(TesterContext* context, const std::string& requestor_url) : context_(context), @@ -260,9 +269,9 @@ class Tester : public ApplicationDelegate, public ServiceLoader { } // If we're coming from A, then add B, otherwise A. if (connection->GetRemoteApplicationURL() == kTestAURLString) - connection->AddService<TestBImpl>(context_); + connection->AddService<TestB>(this); else - connection->AddService<TestAImpl>(context_); + connection->AddService<TestA>(this); return true; } @@ -270,10 +279,25 @@ class Tester : public ApplicationDelegate, public ServiceLoader { ApplicationConnection* connection) OVERRIDE { // If we're connecting to B, then add C. if (connection->GetRemoteApplicationURL() == kTestBURLString) - connection->AddService<TestCImpl>(context_); + connection->AddService<TestC>(this); return true; } + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestA> request) OVERRIDE { + BindToRequest(new TestAImpl(connection, context_), &request); + } + + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestB> request) OVERRIDE { + BindToRequest(new TestBImpl(connection, context_), &request); + } + + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestC> request) OVERRIDE { + BindToRequest(new TestCImpl(connection, context_), &request); + } + TesterContext* context_; scoped_ptr<ApplicationImpl> app_; std::string requestor_url_; @@ -418,7 +442,8 @@ TEST_F(ServiceManagerTest, SetLoaders) { // Confirm that the url of a service is correctly passed to another service that // it loads. -TEST_F(ServiceManagerTest, ACallB) { +// http://crbug.com/396300 +TEST_F(ServiceManagerTest, DISABLED_ACallB) { TesterContext context; ServiceManager sm; @@ -442,7 +467,8 @@ TEST_F(ServiceManagerTest, ACallB) { } // A calls B which calls C. -TEST_F(ServiceManagerTest, BCallC) { +// http://crbug.com/396300 +TEST_F(ServiceManagerTest, DISABLED_BCallC) { TesterContext context; ServiceManager sm; @@ -469,7 +495,8 @@ TEST_F(ServiceManagerTest, BCallC) { // Confirm that a service impl will be deleted if the app that connected to // it goes away. -TEST_F(ServiceManagerTest, BDeleted) { +// http://crbug.com/396300 +TEST_F(ServiceManagerTest, DISABLED_BDeleted) { TesterContext context; ServiceManager sm; diff --git a/mojo/services/dbus_echo/dbus_echo_service.cc b/mojo/services/dbus_echo/dbus_echo_service.cc index 5243c42..ae8029f 100644 --- a/mojo/services/dbus_echo/dbus_echo_service.cc +++ b/mojo/services/dbus_echo/dbus_echo_service.cc @@ -18,7 +18,7 @@ namespace { class EchoServiceImpl : public mojo::InterfaceImpl<mojo::EchoService> { public: - explicit EchoServiceImpl(mojo::ApplicationConnection* connection) {} + EchoServiceImpl() {} virtual ~EchoServiceImpl() {} protected: diff --git a/mojo/services/gles2/command_buffer_impl.cc b/mojo/services/gles2/command_buffer_impl.cc index 1f40444..3039b64 100644 --- a/mojo/services/gles2/command_buffer_impl.cc +++ b/mojo/services/gles2/command_buffer_impl.cc @@ -58,10 +58,6 @@ CommandBufferImpl::~CommandBufferImpl() { } } -void CommandBufferImpl::OnConnectionError() { - // TODO(darin): How should we handle this error? -} - void CommandBufferImpl::Initialize( CommandBufferSyncClientPtr sync_client, mojo::ScopedSharedBufferHandle shared_state) { diff --git a/mojo/services/gles2/command_buffer_impl.h b/mojo/services/gles2/command_buffer_impl.h index 090a7f6..5034fc9 100644 --- a/mojo/services/gles2/command_buffer_impl.h +++ b/mojo/services/gles2/command_buffer_impl.h @@ -34,7 +34,6 @@ class CommandBufferImpl : public InterfaceImpl<CommandBuffer> { const gfx::Size& size); virtual ~CommandBufferImpl(); - virtual void OnConnectionError() OVERRIDE; virtual void Initialize(CommandBufferSyncClientPtr sync_client, mojo::ScopedSharedBufferHandle shared_state) OVERRIDE; virtual void SetGetBuffer(int32_t buffer) OVERRIDE; diff --git a/mojo/services/html_viewer/html_viewer.cc b/mojo/services/html_viewer/html_viewer.cc index 65db20e..03fc1e4 100644 --- a/mojo/services/html_viewer/html_viewer.cc +++ b/mojo/services/html_viewer/html_viewer.cc @@ -6,12 +6,14 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/html_viewer/blink_platform_impl.h" #include "mojo/services/html_viewer/html_document_view.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/types.h" #include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/interfaces/navigation/navigation.mojom.h" #include "third_party/WebKit/public/web/WebKit.h" @@ -22,8 +24,7 @@ class HTMLViewer; class NavigatorImpl : public InterfaceImpl<navigation::Navigator> { public: - explicit NavigatorImpl(ApplicationConnection* connection, - HTMLViewer* viewer) : viewer_(viewer) {} + explicit NavigatorImpl(HTMLViewer* viewer) : viewer_(viewer) {} virtual ~NavigatorImpl() {} private: @@ -38,11 +39,16 @@ class NavigatorImpl : public InterfaceImpl<navigation::Navigator> { DISALLOW_COPY_AND_ASSIGN(NavigatorImpl); }; -class HTMLViewer : public ApplicationDelegate, - public view_manager::ViewManagerDelegate { +class HTMLViewer + : public ApplicationDelegate, + public view_manager::ViewManagerDelegate, + public InterfaceFactoryWithContext<NavigatorImpl, HTMLViewer> { public: - HTMLViewer() : application_impl_(NULL), document_view_(NULL) { - } + HTMLViewer() + : InterfaceFactoryWithContext(this), + application_impl_(NULL), + document_view_(NULL), + view_manager_client_factory_(this) {} virtual ~HTMLViewer() { blink::shutdown(); } @@ -63,8 +69,8 @@ class HTMLViewer : public ApplicationDelegate, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) OVERRIDE { - connection->AddService<NavigatorImpl>(this); - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -94,6 +100,7 @@ class HTMLViewer : public ApplicationDelegate, // TODO(darin): Figure out proper ownership of this instance. HTMLDocumentView* document_view_; URLResponsePtr response_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; DISALLOW_COPY_AND_ASSIGN(HTMLViewer); }; diff --git a/mojo/services/launcher/launcher.cc b/mojo/services/launcher/launcher.cc index 76d4d8f..374d912 100644 --- a/mojo/services/launcher/launcher.cc +++ b/mojo/services/launcher/launcher.cc @@ -10,6 +10,7 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/services/public/cpp/view_manager/types.h" #include "mojo/services/public/interfaces/launcher/launcher.mojom.h" #include "mojo/services/public/interfaces/network/network_service.mojom.h" @@ -30,8 +31,7 @@ class LauncherApp; class LauncherConnection : public InterfaceImpl<Launcher> { public: - LauncherConnection(ApplicationConnection* connection, LauncherApp* app) - : app_(app) {} + explicit LauncherConnection(LauncherApp* app) : app_(app) {} virtual ~LauncherConnection() {} private: @@ -86,9 +86,11 @@ class LaunchInstance { DISALLOW_COPY_AND_ASSIGN(LaunchInstance); }; -class LauncherApp : public ApplicationDelegate { +class LauncherApp + : public ApplicationDelegate, + public InterfaceFactoryWithContext<LauncherConnection, LauncherApp> { public: - LauncherApp() { + LauncherApp() : InterfaceFactoryWithContext(this) { handler_map_["text/html"] = "mojo:mojo_html_viewer"; handler_map_["image/png"] = "mojo:mojo_media_viewer"; } @@ -115,7 +117,7 @@ class LauncherApp : public ApplicationDelegate { virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE { - connection->AddService<LauncherConnection>(this); + connection->AddService(this); return true; } diff --git a/mojo/services/native_viewport/native_viewport_service.cc b/mojo/services/native_viewport/native_viewport_service.cc index bcde3aa..cc971b7 100644 --- a/mojo/services/native_viewport/native_viewport_service.cc +++ b/mojo/services/native_viewport/native_viewport_service.cc @@ -9,6 +9,7 @@ #include "base/message_loop/message_loop.h" #include "base/time/time.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory.h" #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" #include "mojo/services/gles2/command_buffer_impl.h" #include "mojo/services/native_viewport/native_viewport.h" @@ -29,11 +30,10 @@ bool IsRateLimitedEventType(ui::Event* event) { } // namespace -class NativeViewportImpl - : public InterfaceImpl<mojo::NativeViewport>, - public NativeViewportDelegate { +class NativeViewportImpl : public InterfaceImpl<mojo::NativeViewport>, + public NativeViewportDelegate { public: - explicit NativeViewportImpl(ApplicationConnection* connection) + NativeViewportImpl() : widget_(gfx::kNullAcceleratedWidget), waiting_for_event_ack_(false), weak_factory_(this) {} @@ -93,7 +93,7 @@ class NativeViewportImpl return; command_buffer_.reset( new CommandBufferImpl(widget_, native_viewport_->GetSize())); - BindToRequest(command_buffer_.get(), &command_buffer_request_); + WeakBindToRequest(command_buffer_.get(), &command_buffer_request_); } virtual bool OnEvent(ui::Event* ui_event) OVERRIDE { @@ -151,16 +151,24 @@ class NativeViewportImpl base::WeakPtrFactory<NativeViewportImpl> weak_factory_; }; -class NVSDelegate : public ApplicationDelegate { +class NVSDelegate : public ApplicationDelegate, + public InterfaceFactory<mojo::NativeViewport> { public: NVSDelegate() {} virtual ~NVSDelegate() {} + // ApplicationDelegate implementation. virtual bool ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) MOJO_OVERRIDE { - connection->AddService<NativeViewportImpl>(); + mojo::ApplicationConnection* connection) OVERRIDE { + connection->AddService(this); return true; } + + // ServiceFactory<mojo::NativeViewport> implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<mojo::NativeViewport> request) OVERRIDE { + BindToRequest(new NativeViewportImpl, &request); + } }; MOJO_NATIVE_VIEWPORT_EXPORT mojo::ApplicationImpl* diff --git a/mojo/services/network/main.cc b/mojo/services/network/main.cc index e7455a4..96e09ff 100644 --- a/mojo/services/network/main.cc +++ b/mojo/services/network/main.cc @@ -11,27 +11,40 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/public/cpp/application/application_delegate.h" #include "mojo/public/cpp/application/application_impl.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" +#include "mojo/public/cpp/bindings/interface_ptr.h" +#include "mojo/public/interfaces/service_provider/service_provider.mojom.h" #include "mojo/services/network/network_context.h" #include "mojo/services/network/network_service_impl.h" -class Delegate : public mojo::ApplicationDelegate { +class Delegate : public mojo::ApplicationDelegate, + public mojo::InterfaceFactory<mojo::NetworkService> { public: Delegate() {} - virtual void Initialize(mojo::ApplicationImpl* app) MOJO_OVERRIDE { + virtual void Initialize(mojo::ApplicationImpl* app) OVERRIDE { base::FilePath base_path; CHECK(PathService::Get(base::DIR_TEMP, &base_path)); base_path = base_path.Append(FILE_PATH_LITERAL("network_service")); context_.reset(new mojo::NetworkContext(base_path)); } + // mojo::ApplicationDelegate implementation. virtual bool ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) MOJO_OVERRIDE { + mojo::ApplicationConnection* connection) OVERRIDE { DCHECK(context_); - connection->AddService<mojo::NetworkServiceImpl>(context_.get()); + connection->AddService(this); return true; } + // mojo::InterfaceFactory<mojo::NetworkService> implementation. + virtual void Create( + mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<mojo::NetworkService> request) OVERRIDE { + mojo::BindToRequest( + new mojo::NetworkServiceImpl(connection, context_.get()), &request); + } + private: scoped_ptr<mojo::NetworkContext> context_; }; diff --git a/mojo/services/network/url_loader_impl.cc b/mojo/services/network/url_loader_impl.cc index 810a7be..724068c 100644 --- a/mojo/services/network/url_loader_impl.cc +++ b/mojo/services/network/url_loader_impl.cc @@ -118,10 +118,6 @@ URLLoaderImpl::URLLoaderImpl(NetworkContext* context) URLLoaderImpl::~URLLoaderImpl() { } -void URLLoaderImpl::OnConnectionError() { - delete this; -} - void URLLoaderImpl::Start(URLRequestPtr request, const Callback<void(URLResponsePtr)>& callback) { if (url_request_) { diff --git a/mojo/services/network/url_loader_impl.h b/mojo/services/network/url_loader_impl.h index 68bad9a..6785501 100644 --- a/mojo/services/network/url_loader_impl.h +++ b/mojo/services/network/url_loader_impl.h @@ -27,9 +27,6 @@ class URLLoaderImpl : public InterfaceImpl<URLLoader>, class PendingWriteToDataPipe; class DependentIOBuffer; - // InterfaceImpl<> methods: - virtual void OnConnectionError() OVERRIDE; - // URLLoader methods: virtual void Start( URLRequestPtr request, diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc new file mode 100644 index 0000000..37d0ee6 --- /dev/null +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc @@ -0,0 +1,28 @@ +// Copyright 2014 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/services/public/cpp/view_manager/view_manager_client_factory.h" + +#include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" + +namespace mojo { +namespace view_manager { + +ViewManagerClientFactory::ViewManagerClientFactory( + ViewManagerDelegate* delegate) + : delegate_(delegate) { +} + +ViewManagerClientFactory::~ViewManagerClientFactory() { +} + +// InterfaceFactory<ViewManagerClient> implementation. +void ViewManagerClientFactory::Create( + ApplicationConnection* connection, + InterfaceRequest<ViewManagerClient> request) { + BindToRequest(new ViewManagerClientImpl(delegate_), &request); +} + +} // namespace view_manager +} // namespace mojo diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc index dbb5a5c..8aaec2f 100644 --- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc @@ -523,13 +523,13 @@ class SetVisibleTransaction : public ViewManagerTransaction { DISALLOW_COPY_AND_ASSIGN(SetVisibleTransaction); }; -ViewManagerClientImpl::ViewManagerClientImpl(ApplicationConnection* connection, - ViewManagerDelegate* delegate) +ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate) : connected_(false), connection_id_(0), next_id_(1), delegate_(delegate), - window_manager_delegate_(NULL) {} + window_manager_delegate_(NULL) { +} ViewManagerClientImpl::~ViewManagerClientImpl() { while (!nodes_.empty()) { @@ -877,15 +877,5 @@ void ViewManagerClientImpl::RemoveRoot(Node* root) { roots_.erase(it); } -//////////////////////////////////////////////////////////////////////////////// -// ViewManager, public: - -// static -void ViewManager::ConfigureIncomingConnection( - ApplicationConnection* connection, - ViewManagerDelegate* delegate) { - connection->AddService<ViewManagerClientImpl>(delegate); -} - } // namespace view_manager } // namespace mojo diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h index 6c14553..39f7ecf 100644 --- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h @@ -22,14 +22,14 @@ class ApplicationConnection; namespace view_manager { class ViewManager; +class ViewManagerDelegate; class ViewManagerTransaction; // Manages the connection with the View Manager service. class ViewManagerClientImpl : public ViewManager, public InterfaceImpl<ViewManagerClient> { public: - explicit ViewManagerClientImpl(ApplicationConnection* connection, - ViewManagerDelegate* delegate); + explicit ViewManagerClientImpl(ViewManagerDelegate* delegate); virtual ~ViewManagerClientImpl(); bool connected() const { return connected_; } diff --git a/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc b/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc index 1992239..7964a12 100644 --- a/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc +++ b/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc @@ -16,6 +16,7 @@ #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/util.h" #include "mojo/services/public/cpp/view_manager/view.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/cpp/view_manager/view_observer.h" #include "mojo/shell/shell_test_helper.h" @@ -54,8 +55,7 @@ class ConnectServiceLoader : public ServiceLoader, typedef base::Callback<void(ViewManager*, Node*)> LoadedCallback; explicit ConnectServiceLoader(const LoadedCallback& callback) - : callback_(callback) { - } + : callback_(callback), view_manager_client_factory_(this) {} virtual ~ConnectServiceLoader() {} private: @@ -74,7 +74,7 @@ class ConnectServiceLoader : public ServiceLoader, virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) OVERRIDE { - ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -87,6 +87,7 @@ class ConnectServiceLoader : public ServiceLoader, ScopedVector<ApplicationImpl> apps_; LoadedCallback callback_; + ViewManagerClientFactory view_manager_client_factory_; DISALLOW_COPY_AND_ASSIGN(ConnectServiceLoader); }; @@ -397,9 +398,9 @@ class ViewManagerTest : public testing::Test { connect_loop_ = NULL; } - base::MessageLoop loop_; base::RunLoop* connect_loop_; shell::ShellTestHelper test_helper_; + base::MessageLoop loop_; ViewManagerInitServicePtr view_manager_init_; // Used to receive the most recent view manager loaded by an embed action. ViewManager* loaded_view_manager_; @@ -508,7 +509,8 @@ TEST_F(ViewManagerTest, NodeDestroyed) { EXPECT_EQ(NULL, embedded->GetNodeById(id)); } -TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNode) { +// http://crbug.com/396300 +TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNode) { Node* node = Node::Create(window_manager()); window_manager()->GetRoots().front()->AddChild(node); ViewManager* embedded = Embed(window_manager(), node); @@ -563,7 +565,8 @@ TEST_F(ViewManagerTest, DestroyView) { // Destroying the connection that created a node and view should result in that // node and view disappearing from all connections that see them. -TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNodeAndView) { +// http://crbug.com/396300 +TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNodeAndView) { Node* node = Node::Create(window_manager()); window_manager()->GetRoots().front()->AddChild(node); View* view = View::Create(window_manager()); @@ -592,8 +595,10 @@ TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNodeAndView) { // + the connection originating the node is destroyed // -> the view should still exist (since the second connection is live) but // should be disconnected from any nodes. -TEST_F(ViewManagerTest, - ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) { +// http://crbug.com/396300 +TEST_F( + ViewManagerTest, + DISABLED_ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) { Node* node = Node::Create(window_manager()); window_manager()->GetRoots().front()->AddChild(node); ViewManager* embedded = Embed(window_manager(), node); diff --git a/mojo/services/public/cpp/view_manager/view_manager.h b/mojo/services/public/cpp/view_manager/view_manager.h index 83b1199..30331e9 100644 --- a/mojo/services/public/cpp/view_manager/view_manager.h +++ b/mojo/services/public/cpp/view_manager/view_manager.h @@ -22,10 +22,6 @@ class WindowManagerDelegate; class ViewManager { public: - // Delegate is owned by the caller. - static void ConfigureIncomingConnection(ApplicationConnection* connection, - ViewManagerDelegate* delegate); - // Sets the window manager delegate. Can only be called by the app embedded at // the service root node. virtual void SetWindowManagerDelegate( diff --git a/mojo/services/public/cpp/view_manager/view_manager_client_factory.h b/mojo/services/public/cpp/view_manager/view_manager_client_factory.h new file mode 100644 index 0000000..db58d32 --- /dev/null +++ b/mojo/services/public/cpp/view_manager/view_manager_client_factory.h @@ -0,0 +1,36 @@ +// Copyright 2014 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_SERVICES_PUBLIC_CPP_VIEW_MANAGER_VIEW_MANAGER_CLIENT_FACTORY_H_ +#define MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_VIEW_MANAGER_CLIENT_FACTORY_H_ + +#include "mojo/public/cpp/application/interface_factory.h" +#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" + +namespace mojo { +namespace view_manager { + +class ViewManagerDelegate; + +// Add an instance of this class to an incoming connection to allow it to +// instantiate ViewManagerClient implementations in response to +// ViewManagerClient requests. +class ViewManagerClientFactory : public InterfaceFactory<ViewManagerClient> { + public: + explicit ViewManagerClientFactory(ViewManagerDelegate* delegate); + virtual ~ViewManagerClientFactory(); + + // InterfaceFactory<ViewManagerClient> implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<ViewManagerClient> request) + MOJO_OVERRIDE; + + private: + ViewManagerDelegate* delegate_; +}; + +} // namespace view_manager +} // namespace mojo + +#endif // MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_VIEW_MANAGER_CLIENT_FACTORY_H_ diff --git a/mojo/services/surfaces/surfaces_impl.cc b/mojo/services/surfaces/surfaces_impl.cc index da823d3..5baaf60 100644 --- a/mojo/services/surfaces/surfaces_impl.cc +++ b/mojo/services/surfaces/surfaces_impl.cc @@ -16,10 +16,13 @@ namespace mojo { namespace surfaces { -SurfacesImpl::SurfacesImpl(ApplicationConnection* app, Context* context) - : context_(context), - factory_(context_->Manager(), this), - id_namespace_(context->IdNamespace()) { +SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager, + uint32_t id_namespace, + Client* client) + : manager_(manager), + factory_(manager, this), + id_namespace_(id_namespace), + client_(client) { } SurfacesImpl::~SurfacesImpl() { @@ -47,7 +50,7 @@ void SurfacesImpl::SubmitFrame(SurfaceIdPtr id, FramePtr frame_ptr) { return; } factory_.SubmitFrame(id.To<cc::SurfaceId>(), mojo::ConvertTo(frame_ptr)); - context_->FrameSubmitted(); + client_->FrameSubmitted(); } void SurfacesImpl::DestroySurface(SurfaceIdPtr id) { @@ -72,8 +75,8 @@ void SurfacesImpl::CreateGLES2BoundSurface(CommandBufferPtr gles2_client, return; } if (!display_) { - display_.reset(new cc::Display(this, context_->Manager(), NULL)); - context_->SetDisplay(display_.get()); + display_.reset(new cc::Display(this, manager_, NULL)); + client_->SetDisplay(display_.get()); } factory_.Create(cc_id, size.To<gfx::Size>()); display_->Resize(cc_id, size.To<gfx::Size>()); diff --git a/mojo/services/surfaces/surfaces_impl.h b/mojo/services/surfaces/surfaces_impl.h index 5ecb9cf..21f2daa 100644 --- a/mojo/services/surfaces/surfaces_impl.h +++ b/mojo/services/surfaces/surfaces_impl.h @@ -28,14 +28,15 @@ class SurfacesImpl : public InterfaceImpl<Surface>, public cc::SurfaceFactoryClient, public cc::DisplayClient { public: - class Context { + class Client { public: - virtual cc::SurfaceManager* Manager() = 0; - virtual uint32_t IdNamespace() = 0; virtual void FrameSubmitted() = 0; virtual void SetDisplay(cc::Display*) = 0; }; - SurfacesImpl(ApplicationConnection* app, Context* context); + + SurfacesImpl(cc::SurfaceManager* manager, + uint32_t id_namespace, + Client* client); virtual ~SurfacesImpl(); // InterfaceImpl<Surface> implementation. @@ -59,9 +60,10 @@ class SurfacesImpl : public InterfaceImpl<Surface>, cc::SurfaceFactory* factory() { return &factory_; } private: - Context* context_; + cc::SurfaceManager* manager_; cc::SurfaceFactory factory_; uint32_t id_namespace_; + Client* client_; scoped_ptr<cc::Display> display_; ScopedMessagePipeHandle command_buffer_handle_; diff --git a/mojo/services/surfaces/surfaces_service_application.cc b/mojo/services/surfaces/surfaces_service_application.cc index 9c9e3f8..0bc440b 100644 --- a/mojo/services/surfaces/surfaces_service_application.cc +++ b/mojo/services/surfaces/surfaces_service_application.cc @@ -18,16 +18,14 @@ SurfacesServiceApplication::~SurfacesServiceApplication() { bool SurfacesServiceApplication::ConfigureIncomingConnection( ApplicationConnection* connection) { - connection->AddService<SurfacesImpl, SurfacesImpl::Context>(this); + connection->AddService(this); return true; } -cc::SurfaceManager* SurfacesServiceApplication::Manager() { - return &manager_; -} - -uint32_t SurfacesServiceApplication::IdNamespace() { - return next_id_namespace_++; +void SurfacesServiceApplication::Create(ApplicationConnection* connection, + InterfaceRequest<Surface> request) { + BindToRequest(new SurfacesImpl(&manager_, next_id_namespace_++, this), + &request); } void SurfacesServiceApplication::FrameSubmitted() { diff --git a/mojo/services/surfaces/surfaces_service_application.h b/mojo/services/surfaces/surfaces_service_application.h index ac6820d..75ca540 100644 --- a/mojo/services/surfaces/surfaces_service_application.h +++ b/mojo/services/surfaces/surfaces_service_application.h @@ -16,7 +16,8 @@ class ApplicationConnection; namespace surfaces { class SurfacesServiceApplication : public ApplicationDelegate, - public SurfacesImpl::Context { + public InterfaceFactory<Surface>, + public SurfacesImpl::Client { public: SurfacesServiceApplication(); virtual ~SurfacesServiceApplication(); @@ -25,9 +26,11 @@ class SurfacesServiceApplication : public ApplicationDelegate, virtual bool ConfigureIncomingConnection( ApplicationConnection* connection) OVERRIDE; - // SurfacesImpl::Context implementation. - virtual cc::SurfaceManager* Manager() OVERRIDE; - virtual uint32_t IdNamespace() OVERRIDE; + // InterfaceFactory<Surface> implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<Surface> request) OVERRIDE; + + // SurfacesImpl::Client implementation. virtual void FrameSubmitted() OVERRIDE; virtual void SetDisplay(cc::Display*) OVERRIDE; diff --git a/mojo/services/test_service/test_request_tracker_application.cc b/mojo/services/test_service/test_request_tracker_application.cc index 673cdf4..3a7e6d8 100644 --- a/mojo/services/test_service/test_request_tracker_application.cc +++ b/mojo/services/test_service/test_request_tracker_application.cc @@ -12,7 +12,9 @@ namespace mojo { namespace test { -TestRequestTrackerApplication::TestRequestTrackerApplication() { +TestRequestTrackerApplication::TestRequestTrackerApplication() + : test_tracked_request_factory_(&context_), + test_request_tracker_factory_(&context_) { } TestRequestTrackerApplication::~TestRequestTrackerApplication() { @@ -22,17 +24,23 @@ bool TestRequestTrackerApplication::ConfigureIncomingConnection( ApplicationConnection* connection) { // Every instance of the service and recorder shares the context. // Note, this app is single-threaded, so this is thread safe. - connection->AddService<TestTrackedRequestServiceImpl>(&context_); - connection->AddService<TestRequestTrackerImpl>(&context_); - connection->AddService<TestTimeServiceImpl>(); + connection->AddService(&test_tracked_request_factory_); + connection->AddService(&test_request_tracker_factory_); + connection->AddService(this); return true; } +void TestRequestTrackerApplication::Create( + ApplicationConnection* connection, + InterfaceRequest<TestTimeService> request) { + BindToRequest(new TestTimeServiceImpl(connection), &request); +} + } // namespace test // static ApplicationDelegate* ApplicationDelegate::Create() { - return new mojo::test::TestRequestTrackerApplication(); + return new test::TestRequestTrackerApplication(); } } // namespace mojo diff --git a/mojo/services/test_service/test_request_tracker_application.h b/mojo/services/test_service/test_request_tracker_application.h index 3951739..9b1a45f 100644 --- a/mojo/services/test_service/test_request_tracker_application.h +++ b/mojo/services/test_service/test_request_tracker_application.h @@ -6,23 +6,39 @@ #define MOJO_SERVICES_TEST_SERVICE_TEST_REQUEST_TRACKER_APPLICATION_H_ #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/public/cpp/system/macros.h" #include "mojo/services/test_service/test_request_tracker_impl.h" namespace mojo { namespace test { +class TestTimeService; // Embeds TestRequestTracker mojo services into an application. -class TestRequestTrackerApplication : public ApplicationDelegate { +class TestRequestTrackerApplication : public ApplicationDelegate, + public InterfaceFactory<TestTimeService> { public: TestRequestTrackerApplication(); virtual ~TestRequestTrackerApplication(); + // ApplicationDelegate methods: virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE; + // InterfaceFactory<TestTimeService> methods: + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestTimeService> request) MOJO_OVERRIDE; + private: TrackingContext context_; + typedef InterfaceFactoryWithContext<TestTrackedRequestServiceImpl, + TrackingContext> + TestTrackedRequestFactory; + TestTrackedRequestFactory test_tracked_request_factory_; + typedef InterfaceFactoryWithContext<TestRequestTrackerImpl, TrackingContext> + TestRequestTrackerFactory; + TestRequestTrackerFactory test_request_tracker_factory_; MOJO_DISALLOW_COPY_AND_ASSIGN(TestRequestTrackerApplication); }; diff --git a/mojo/services/test_service/test_request_tracker_impl.cc b/mojo/services/test_service/test_request_tracker_impl.cc index 7393cb4..9af6266 100644 --- a/mojo/services/test_service/test_request_tracker_impl.cc +++ b/mojo/services/test_service/test_request_tracker_impl.cc @@ -11,9 +11,8 @@ namespace test { TrackingContext::TrackingContext() : next_id(1) {} TrackingContext::~TrackingContext() {} - TestRequestTrackerImpl::TestRequestTrackerImpl( - ApplicationConnection* connection, - TrackingContext* context) : context_(context), weak_factory_(this) { + TestRequestTrackerImpl::TestRequestTrackerImpl(TrackingContext* context) + : context_(context), weak_factory_(this) { } TestRequestTrackerImpl::~TestRequestTrackerImpl() { @@ -42,8 +41,8 @@ void TestRequestTrackerImpl::UploaderNameCallback( } TestTrackedRequestServiceImpl::TestTrackedRequestServiceImpl( - ApplicationConnection* connection, - TrackingContext* context) : context_(context) { + TrackingContext* context) + : context_(context) { } TestTrackedRequestServiceImpl::~TestTrackedRequestServiceImpl() { diff --git a/mojo/services/test_service/test_request_tracker_impl.h b/mojo/services/test_service/test_request_tracker_impl.h index c080cb8..a5391bd 100644 --- a/mojo/services/test_service/test_request_tracker_impl.h +++ b/mojo/services/test_service/test_request_tracker_impl.h @@ -27,8 +27,7 @@ struct TrackingContext { class TestRequestTrackerImpl : public InterfaceImpl<TestRequestTracker> { public: - TestRequestTrackerImpl(ApplicationConnection* connection, - TrackingContext* context); + explicit TestRequestTrackerImpl(TrackingContext* context); virtual ~TestRequestTrackerImpl(); // TestRequestTracker. @@ -48,9 +47,7 @@ class TestRequestTrackerImpl : public InterfaceImpl<TestRequestTracker> { class TestTrackedRequestServiceImpl : public InterfaceImpl<TestTrackedRequestService> { public: - TestTrackedRequestServiceImpl( - ApplicationConnection* connection, - TrackingContext* context); + explicit TestTrackedRequestServiceImpl(TrackingContext* context); virtual ~TestTrackedRequestServiceImpl(); // |TestTrackedRequestService| implementation. diff --git a/mojo/services/test_service/test_service_application.cc b/mojo/services/test_service/test_service_application.cc index 097f368..074e2e8 100644 --- a/mojo/services/test_service/test_service_application.cc +++ b/mojo/services/test_service/test_service_application.cc @@ -22,11 +22,21 @@ TestServiceApplication::~TestServiceApplication() { bool TestServiceApplication::ConfigureIncomingConnection( ApplicationConnection* connection) { - connection->AddService<TestServiceImpl>(this); - connection->AddService<TestTimeServiceImpl>(); + connection->AddService<TestService>(this); + connection->AddService<TestTimeService>(this); return true; } +void TestServiceApplication::Create(ApplicationConnection* connection, + InterfaceRequest<TestService> request) { + BindToRequest(new TestServiceImpl(connection, this), &request); +} + +void TestServiceApplication::Create(ApplicationConnection* connection, + InterfaceRequest<TestTimeService> request) { + BindToRequest(new TestTimeServiceImpl(connection), &request); +} + void TestServiceApplication::AddRef() { assert(ref_count_ >= 0); ref_count_++; diff --git a/mojo/services/test_service/test_service_application.h b/mojo/services/test_service/test_service_application.h index 8892f30..06d2474 100644 --- a/mojo/services/test_service/test_service_application.h +++ b/mojo/services/test_service/test_service_application.h @@ -6,20 +6,35 @@ #define MOJO_SERVICES_TEST_SERVICE_TEST_SERVICE_APPLICATION_H_ #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory.h" #include "mojo/public/cpp/system/macros.h" namespace mojo { class ApplicationConnection; + namespace test { +class TestService; +class TestTimeService; -class TestServiceApplication : public ApplicationDelegate { +class TestServiceApplication : public ApplicationDelegate, + public InterfaceFactory<TestService>, + public InterfaceFactory<TestTimeService> { public: TestServiceApplication(); virtual ~TestServiceApplication(); + // ApplicationDelegate implementation. virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) MOJO_OVERRIDE; + // InterfaceFactory<TestService> implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestService> request) MOJO_OVERRIDE; + + // InterfaceFactory<TestTimeService> implementation. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<TestTimeService> request) MOJO_OVERRIDE; + void AddRef(); void ReleaseRef(); diff --git a/mojo/services/test_service/test_time_service_impl.h b/mojo/services/test_service/test_time_service_impl.h index 148204c..d3ab72c 100644 --- a/mojo/services/test_service/test_time_service_impl.h +++ b/mojo/services/test_service/test_time_service_impl.h @@ -11,7 +11,7 @@ namespace mojo { -class Application; +class ApplicationConnection; namespace test { @@ -19,7 +19,7 @@ class TestRequestTrackerClientImpl; class TestTimeServiceImpl : public InterfaceImpl<TestTimeService> { public: - TestTimeServiceImpl(ApplicationConnection* application); + explicit TestTimeServiceImpl(ApplicationConnection* application); virtual ~TestTimeServiceImpl(); // |TestTimeService| methods: diff --git a/mojo/services/view_manager/main.cc b/mojo/services/view_manager/main.cc index d511505..3a80996 100644 --- a/mojo/services/view_manager/main.cc +++ b/mojo/services/view_manager/main.cc @@ -10,19 +10,26 @@ namespace mojo { namespace view_manager { namespace service { -class ViewManagerApp : public ApplicationDelegate { +class ViewManagerApp : public ApplicationDelegate, + public InterfaceFactory<ViewManagerInitService> { public: ViewManagerApp() {} virtual ~ViewManagerApp() {} - virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) - MOJO_OVERRIDE { + virtual bool ConfigureIncomingConnection( + ApplicationConnection* connection) OVERRIDE { // TODO(sky): this needs some sort of authentication as well as making sure // we only ever have one active at a time. - connection->AddService<ViewManagerInitServiceImpl>(); + connection->AddService(this); return true; } + virtual void Create( + ApplicationConnection* connection, + InterfaceRequest<ViewManagerInitService> request) OVERRIDE { + BindToRequest(new ViewManagerInitServiceImpl(connection), &request); + } + private: DISALLOW_COPY_AND_ASSIGN(ViewManagerApp); }; diff --git a/mojo/services/view_manager/root_node_manager.cc b/mojo/services/view_manager/root_node_manager.cc index ecafe4e..4db1a4c 100644 --- a/mojo/services/view_manager/root_node_manager.cc +++ b/mojo/services/view_manager/root_node_manager.cc @@ -265,7 +265,7 @@ ViewManagerServiceImpl* RootNodeManager::EmbedImpl( creator_url, url.To<std::string>(), root_id); - BindToPipe(connection, pipe.handle0.Pass()); + WeakBindToPipe(connection, pipe.handle0.Pass()); connections_created_by_connect_.insert(connection); OnConnectionMessagedClient(connection->id()); return connection; diff --git a/mojo/services/view_manager/view_manager_unittest.cc b/mojo/services/view_manager/view_manager_unittest.cc index 8e5d742..5617d6f 100644 --- a/mojo/services/view_manager/view_manager_unittest.cc +++ b/mojo/services/view_manager/view_manager_unittest.cc @@ -307,8 +307,7 @@ bool ViewManagerProxy::in_embed_ = false; class TestViewManagerClientConnection : public InterfaceImpl<ViewManagerClient> { public: - TestViewManagerClientConnection(ApplicationConnection* app_connection) : - connection_(&tracker_) { + explicit TestViewManagerClientConnection() : connection_(&tracker_) { tracker_.set_delegate(&connection_); } @@ -379,12 +378,14 @@ class TestViewManagerClientConnection // Used with ViewManagerService::Embed(). Creates a // TestViewManagerClientConnection, which creates and owns the ViewManagerProxy. -class EmbedServiceLoader : public ServiceLoader, ApplicationDelegate { +class EmbedServiceLoader : public ServiceLoader, + ApplicationDelegate, + public InterfaceFactory<ViewManagerClient> { public: EmbedServiceLoader() {} virtual ~EmbedServiceLoader() {} - // ServiceLoader: + // ServiceLoader implementation: virtual void LoadService(ServiceManager* manager, const GURL& url, ScopedMessagePipeHandle shell_handle) OVERRIDE { @@ -396,13 +397,19 @@ class EmbedServiceLoader : public ServiceLoader, ApplicationDelegate { const GURL& url) OVERRIDE { } - // ApplicationDelegate + // ApplicationDelegate implementation: virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) OVERRIDE { - connection->AddService<TestViewManagerClientConnection>(); + connection->AddService(this); return true; } + // InterfaceFactory<ViewManagerClient> implementation: + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<ViewManagerClient> request) OVERRIDE { + BindToRequest(new TestViewManagerClientConnection, &request); + } + private: ScopedVector<ApplicationImpl> apps_; @@ -526,8 +533,8 @@ class ViewManagerTest : public testing::Test { } base::ShadowingAtExitManager at_exit_; - base::MessageLoop loop_; shell::ShellTestHelper test_helper_; + base::MessageLoop loop_; ViewManagerInitServicePtr view_manager_init_; diff --git a/mojo/services/window_manager/window_manager_api_unittest.cc b/mojo/services/window_manager/window_manager_api_unittest.cc index 7f81819b..bb2df34 100644 --- a/mojo/services/window_manager/window_manager_api_unittest.cc +++ b/mojo/services/window_manager/window_manager_api_unittest.cc @@ -10,6 +10,7 @@ #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/types.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" #include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" #include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h" @@ -121,7 +122,8 @@ class TestServiceLoader : public ServiceLoader, typedef base::Callback<void(view_manager::Node*)> RootAddedCallback; explicit TestServiceLoader(const RootAddedCallback& root_added_callback) - : root_added_callback_(root_added_callback) {} + : root_added_callback_(root_added_callback), + view_manager_client_factory_(this) {} virtual ~TestServiceLoader() {} private: @@ -140,7 +142,7 @@ class TestServiceLoader : public ServiceLoader, // Overridden from ApplicationDelegate: virtual bool ConfigureIncomingConnection( ApplicationConnection* connection) MOJO_OVERRIDE { - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(&view_manager_client_factory_); return true; } @@ -156,6 +158,7 @@ class TestServiceLoader : public ServiceLoader, RootAddedCallback root_added_callback_; ScopedVector<ApplicationImpl> apps_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; DISALLOW_COPY_AND_ASSIGN(TestServiceLoader); }; @@ -265,8 +268,8 @@ class WindowManagerApiTest : public testing::Test { run_loop->Quit(); } - base::MessageLoop loop_; shell::ShellTestHelper test_helper_; + base::MessageLoop loop_; view_manager::ViewManagerInitServicePtr view_manager_init_; scoped_ptr<TestWindowManagerClient> window_manager_client_; TestServiceLoader::RootAddedCallback root_added_callback_; @@ -274,7 +277,8 @@ class WindowManagerApiTest : public testing::Test { DISALLOW_COPY_AND_ASSIGN(WindowManagerApiTest); }; -TEST_F(WindowManagerApiTest, OpenWindow) { +// http://crbug.com/396295 +TEST_F(WindowManagerApiTest, DISABLED_OpenWindow) { OpenWindow(window_manager_.get()); view_manager::Id created_node = OpenWindowWithURL(window_manager_.get(), kTestServiceURL); @@ -282,7 +286,8 @@ TEST_F(WindowManagerApiTest, OpenWindow) { EXPECT_EQ(created_node, embed_node); } -TEST_F(WindowManagerApiTest, FocusAndActivateWindow) { +// http://crbug.com/396295 +TEST_F(WindowManagerApiTest, DISABLED_FocusAndActivateWindow) { view_manager::Id first_window = OpenWindow(window_manager_.get()); window_manager_->FocusWindow(first_window, base::Bind(&EmptyResultCallback)); diff --git a/mojo/services/window_manager/window_manager_app.cc b/mojo/services/window_manager/window_manager_app.cc index bb096f5..02e5b95 100644 --- a/mojo/services/window_manager/window_manager_app.cc +++ b/mojo/services/window_manager/window_manager_app.cc @@ -11,7 +11,6 @@ #include "mojo/public/cpp/application/application_connection.h" #include "mojo/services/public/cpp/view_manager/node.h" #include "mojo/services/public/cpp/view_manager/view_manager.h" -#include "mojo/services/window_manager/window_manager_service_impl.h" #include "ui/aura/window.h" #include "ui/aura/window_property.h" #include "ui/wm/core/capture_controller.h" @@ -71,7 +70,12 @@ class WMFocusRules : public wm::FocusRules { //////////////////////////////////////////////////////////////////////////////// // WindowManagerApp, public: -WindowManagerApp::WindowManagerApp() : view_manager_(NULL), root_(NULL) {} +WindowManagerApp::WindowManagerApp() + : InterfaceFactoryWithContext(this), + view_manager_(NULL), + view_manager_client_factory_(this), + root_(NULL) { +} WindowManagerApp::~WindowManagerApp() { // TODO(beng): Figure out if this should be done in // OnViewManagerDisconnected(). @@ -136,8 +140,8 @@ void WindowManagerApp::Initialize(ApplicationImpl* impl) { bool WindowManagerApp::ConfigureIncomingConnection( ApplicationConnection* connection) { - connection->AddService<WindowManagerServiceImpl>(this); - view_manager::ViewManager::ConfigureIncomingConnection(connection, this); + connection->AddService(this); + connection->AddService(&view_manager_client_factory_); return true; } diff --git a/mojo/services/window_manager/window_manager_app.h b/mojo/services/window_manager/window_manager_app.h index 9792f76e..bcd74db 100644 --- a/mojo/services/window_manager/window_manager_app.h +++ b/mojo/services/window_manager/window_manager_app.h @@ -10,10 +10,13 @@ #include "base/memory/scoped_ptr.h" #include "mojo/aura/window_tree_host_mojo_delegate.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory_with_context.h" #include "mojo/public/cpp/bindings/string.h" #include "mojo/services/public/cpp/view_manager/node_observer.h" #include "mojo/services/public/cpp/view_manager/types.h" +#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" +#include "mojo/services/window_manager/window_manager_service_impl.h" #include "ui/aura/client/focus_change_observer.h" #include "ui/wm/public/activation_change_observer.h" @@ -35,12 +38,15 @@ class AuraInit; class WindowManagerServiceImpl; class WindowTreeHostMojo; -class WindowManagerApp : public ApplicationDelegate, - public view_manager::ViewManagerDelegate, - public view_manager::NodeObserver, - public WindowTreeHostMojoDelegate, - public aura::client::FocusChangeObserver, - public aura::client::ActivationChangeObserver { +class WindowManagerApp + : public ApplicationDelegate, + public view_manager::ViewManagerDelegate, + public view_manager::NodeObserver, + public WindowTreeHostMojoDelegate, + public aura::client::FocusChangeObserver, + public aura::client::ActivationChangeObserver, + public InterfaceFactoryWithContext<WindowManagerServiceImpl, + WindowManagerApp> { public: WindowManagerApp(); virtual ~WindowManagerApp(); @@ -98,6 +104,7 @@ class WindowManagerApp : public ApplicationDelegate, void UnregisterSubtree(view_manager::Id id); view_manager::ViewManager* view_manager_; + view_manager::ViewManagerClientFactory view_manager_client_factory_; view_manager::Node* root_; scoped_ptr<AuraInit> aura_init_; diff --git a/mojo/services/window_manager/window_manager_service_impl.cc b/mojo/services/window_manager/window_manager_service_impl.cc index f8ce3d9..ef1ff64 100644 --- a/mojo/services/window_manager/window_manager_service_impl.cc +++ b/mojo/services/window_manager/window_manager_service_impl.cc @@ -12,7 +12,6 @@ namespace mojo { // WindowManagerServiceImpl, public: WindowManagerServiceImpl::WindowManagerServiceImpl( - ApplicationConnection* connection, WindowManagerApp* window_manager) : window_manager_(window_manager) { window_manager_->AddConnection(this); diff --git a/mojo/services/window_manager/window_manager_service_impl.h b/mojo/services/window_manager/window_manager_service_impl.h index 0fa8d6a..4d61968 100644 --- a/mojo/services/window_manager/window_manager_service_impl.h +++ b/mojo/services/window_manager/window_manager_service_impl.h @@ -11,13 +11,11 @@ namespace mojo { -class ApplicationConnection; class WindowManagerApp; class WindowManagerServiceImpl : public InterfaceImpl<WindowManagerService> { public: - WindowManagerServiceImpl(ApplicationConnection* connection, - WindowManagerApp* manager); + explicit WindowManagerServiceImpl(WindowManagerApp* manager); virtual ~WindowManagerServiceImpl(); void NotifyReady(); diff --git a/mojo/shell/network_service_loader.cc b/mojo/shell/network_service_loader.cc index 04161db..9f8f87f 100644 --- a/mojo/shell/network_service_loader.cc +++ b/mojo/shell/network_service_loader.cc @@ -53,9 +53,14 @@ void NetworkServiceLoader::Initialize(ApplicationImpl* app) { bool NetworkServiceLoader::ConfigureIncomingConnection( ApplicationConnection* connection) { - connection->AddService<NetworkServiceImpl>(context_.get()); + connection->AddService(this); return true; } +void NetworkServiceLoader::Create(ApplicationConnection* connection, + InterfaceRequest<NetworkService> request) { + BindToRequest(new NetworkServiceImpl(connection, context_.get()), &request); +} + } // namespace shell } // namespace mojo diff --git a/mojo/shell/network_service_loader.h b/mojo/shell/network_service_loader.h index 257f70b..2184072 100644 --- a/mojo/shell/network_service_loader.h +++ b/mojo/shell/network_service_loader.h @@ -10,17 +10,21 @@ #include "base/containers/scoped_ptr_hash_map.h" #include "base/memory/scoped_ptr.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory.h" #include "mojo/service_manager/service_loader.h" #include "mojo/services/network/network_context.h" namespace mojo { class ApplicationImpl; +class NetworkService; namespace shell { // ServiceLoader responsible for creating connections to the NetworkService. -class NetworkServiceLoader : public ServiceLoader, public ApplicationDelegate { +class NetworkServiceLoader : public ServiceLoader, + public ApplicationDelegate, + public InterfaceFactory<NetworkService> { public: NetworkServiceLoader(); virtual ~NetworkServiceLoader(); @@ -35,9 +39,13 @@ class NetworkServiceLoader : public ServiceLoader, public ApplicationDelegate { const GURL& url) OVERRIDE; // ApplicationDelegate overrides. - virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE; + virtual void Initialize(ApplicationImpl* app) OVERRIDE; virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) - MOJO_OVERRIDE; + OVERRIDE; + + // InterfaceFactory<NetworkService> overrides. + virtual void Create(ApplicationConnection* connection, + InterfaceRequest<NetworkService> request) OVERRIDE; base::ScopedPtrHashMap<uintptr_t, ApplicationImpl> apps_; scoped_ptr<NetworkContext> context_; diff --git a/mojo/shell/view_manager_loader.cc b/mojo/shell/view_manager_loader.cc index e41a874..6b93eac 100644 --- a/mojo/shell/view_manager_loader.cc +++ b/mojo/shell/view_manager_loader.cc @@ -9,6 +9,10 @@ #include "mojo/services/view_manager/view_manager_init_service_impl.h" namespace mojo { + +using view_manager::ViewManagerInitService; +using view_manager::service::ViewManagerInitServiceImpl; + namespace shell { ViewManagerLoader::ViewManagerLoader() { @@ -33,10 +37,16 @@ void ViewManagerLoader::OnServiceError(ServiceManager* manager, } bool ViewManagerLoader::ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) { - connection->AddService<view_manager::service::ViewManagerInitServiceImpl>(); + ApplicationConnection* connection) { + connection->AddService(this); return true; } +void ViewManagerLoader::Create( + ApplicationConnection* connection, + InterfaceRequest<ViewManagerInitService> request) { + BindToRequest(new ViewManagerInitServiceImpl(connection), &request); +} + } // namespace shell } // namespace mojo diff --git a/mojo/shell/view_manager_loader.h b/mojo/shell/view_manager_loader.h index 85454e2..c858a8d 100644 --- a/mojo/shell/view_manager_loader.h +++ b/mojo/shell/view_manager_loader.h @@ -8,7 +8,9 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory.h" #include "mojo/service_manager/service_loader.h" +#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" namespace mojo { @@ -17,7 +19,10 @@ class Application; namespace shell { // ServiceLoader responsible for creating connections to the ViewManager. -class ViewManagerLoader : public ServiceLoader, public ApplicationDelegate { +class ViewManagerLoader + : public ServiceLoader, + public ApplicationDelegate, + public InterfaceFactory<view_manager::ViewManagerInitService> { public: ViewManagerLoader(); virtual ~ViewManagerLoader(); @@ -33,7 +38,12 @@ class ViewManagerLoader : public ServiceLoader, public ApplicationDelegate { // ApplicationDelegate overrides. virtual bool ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) MOJO_OVERRIDE; + mojo::ApplicationConnection* connection) OVERRIDE; + + // InterfaceFactory<view_manager::ViewManagerInitService> overrides. + virtual void Create( + ApplicationConnection* connection, + InterfaceRequest<view_manager::ViewManagerInitService> request) OVERRIDE; ScopedVector<Application> apps_; |