Index: examples/wm_flow/app/app.cc |
diff --git a/examples/wm_flow/app/app.cc b/examples/wm_flow/app/app.cc |
index 6e4c2435a86947cbd8527e70e3eec9588605e0d0..7a1171e574781bd9848f0bb6fe093317bf1c1388 100644 |
--- a/examples/wm_flow/app/app.cc |
+++ b/examples/wm_flow/app/app.cc |
@@ -11,6 +11,7 @@ |
#include "examples/wm_flow/app/embedder.mojom.h" |
#include "examples/wm_flow/embedded/embeddee.mojom.h" |
#include "mojo/application/application_runner_chromium.h" |
+#include "mojo/common/weak_binding_set.h" |
#include "mojo/public/c/system/main.h" |
#include "mojo/public/cpp/application/application_connection.h" |
#include "mojo/public/cpp/application/application_delegate.h" |
@@ -47,6 +48,30 @@ class EmbedderImpl : public mojo::InterfaceImpl<Embedder> { |
DISALLOW_COPY_AND_ASSIGN(EmbedderImpl); |
}; |
+class EmbedderImplProvider : public mojo::ServiceProvider { |
+ public: |
+ EmbedderImplProvider() {} |
+ ~EmbedderImplProvider() override {} |
+ |
+ void AddBinding(mojo::InterfaceRequest<mojo::ServiceProvider> request) { |
+ embeddee_exposed_services_.AddBinding(this, request.Pass()); |
+ } |
+ |
+ private: |
+ // mojo::ServiceProvider implementation |
+ void ConnectToService(const mojo::String& interface_name, |
+ mojo::ScopedMessagePipeHandle pipe_handle) override { |
+ if (interface_name != Embedder::Name_) |
+ return; |
+ auto request = mojo::MakeRequest<Embedder>(pipe_handle.Pass()); |
+ mojo::BindToRequest(new EmbedderImpl, &request); |
+ } |
+ |
+ mojo::WeakBindingSet<mojo::ServiceProvider> embeddee_exposed_services_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(EmbedderImplProvider); |
+}; |
+ |
} // namespace |
// This app starts its life via Connect() rather than by being embed, so it does |
@@ -83,10 +108,9 @@ class WMFlowApp : public mojo::ApplicationDelegate, |
} |
// Overridden from mojo::ViewManagerDelegate: |
- virtual void OnEmbed( |
- mojo::View* root, |
- mojo::ServiceProviderImpl* exported_services, |
- scoped_ptr<mojo::ServiceProvider> imported_services) override { |
+ virtual void OnEmbed(mojo::View* root, |
+ mojo::InterfaceRequest<mojo::ServiceProvider> services, |
+ mojo::ServiceProviderPtr exposed_services) override { |
root->AddObserver(this); |
mojo::BitmapUploader* uploader = new mojo::BitmapUploader(root); |
uploaders_[root] = uploader; |
@@ -106,14 +130,13 @@ class WMFlowApp : public mojo::ApplicationDelegate, |
embed->SetBounds(bounds); |
embed->SetVisible(true); |
- scoped_ptr<mojo::ServiceProviderImpl> registry( |
- new mojo::ServiceProviderImpl); |
- // Expose some services to the embeddee... |
- registry->AddService(&embedder_factory_); |
+ mojo::ServiceProviderPtr embedee_exposed_services; |
+ embeddee_provider_.AddBinding(GetProxy(&embedee_exposed_services)); |
GURL embedded_app_url = url_.Resolve("wm_flow_embedded.mojo"); |
- scoped_ptr<mojo::ServiceProvider> imported = |
- embed->Embed(embedded_app_url.spec(), registry.Pass()); |
+ mojo::ServiceProviderPtr imported; |
+ embed->Embed(embedded_app_url.spec(), GetProxy(&imported), |
+ embedee_exposed_services.Pass()); |
// FIXME: This is wrong. We're storing per-view state on this per-app |
// delegate. Every time a new view is created embedee_ is replaced |
// causing the previous one to shut down. This class should not |
@@ -154,9 +177,9 @@ class WMFlowApp : public mojo::ApplicationDelegate, |
mojo::Shell* shell_; |
int embed_count_; |
scoped_ptr<mojo::ViewManagerClientFactory> view_manager_client_factory_; |
- mojo::InterfaceFactoryImpl<EmbedderImpl> embedder_factory_; |
scoped_ptr<mojo::ViewManagerContext> view_manager_context_; |
EmbeddeePtr embeddee_; |
+ EmbedderImplProvider embeddee_provider_; |
ViewToUploader uploaders_; |
GURL url_; |