Index: chrome/browser/ui/webui/mojo_web_ui_controller.h |
diff --git a/chrome/browser/ui/webui/mojo_web_ui_controller.h b/chrome/browser/ui/webui/mojo_web_ui_controller.h |
index 35ba56d82f841502a186445f2feac4132354fd46..c0f879bb8054ed8f63703cceb9c87c29d76486d9 100644 |
--- a/chrome/browser/ui/webui/mojo_web_ui_controller.h |
+++ b/chrome/browser/ui/webui/mojo_web_ui_controller.h |
@@ -9,7 +9,11 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
+#include "chrome/browser/ui/webui/mojo_web_ui_handler.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/web_ui_controller.h" |
+#include "content/public/common/service_registry.h" |
#include "mojo/public/cpp/system/core.h" |
class MojoWebUIHandler; |
@@ -18,6 +22,26 @@ namespace content { |
class WebUIDataSource; |
} |
+class MojoWebUIControllerBase : public content::WebUIController { |
+ public: |
+ explicit MojoWebUIControllerBase(content::WebUI* contents); |
+ virtual ~MojoWebUIControllerBase(); |
+ |
+ // WebUIController overrides: |
+ virtual void RenderViewCreated( |
+ content::RenderViewHost* render_view_host) OVERRIDE; |
+ |
+ protected: |
+ // Invoke to register mapping between binding file and resource id (IDR_...). |
+ void AddMojoResourcePath(const std::string& path, int resource_id); |
+ |
+ private: |
+ // Bindings files are registered here. |
+ content::WebUIDataSource* mojo_data_source_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MojoWebUIControllerBase); |
+}; |
+ |
// MojoWebUIController is intended for web ui pages that use mojo. It is |
// expected that subclasses will do two things: |
// . In the constructor invoke AddMojoResourcePath() to register the bindings |
@@ -25,29 +49,30 @@ class WebUIDataSource; |
// AddMojoResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom", |
// IDR_OMNIBOX_MOJO_JS); |
// . Override CreateUIHandler() to create the implementation of the bindings. |
-class MojoWebUIController : public content::WebUIController { |
+template <typename Interface> |
+class MojoWebUIController : public MojoWebUIControllerBase { |
public: |
- explicit MojoWebUIController(content::WebUI* contents); |
- virtual ~MojoWebUIController(); |
- |
- // WebUIController overrides: |
+ explicit MojoWebUIController(content::WebUI* contents) |
+ : MojoWebUIControllerBase(contents), weak_factory_(this) {} |
+ virtual ~MojoWebUIController() {} |
virtual void RenderViewCreated( |
- content::RenderViewHost* render_view_host) OVERRIDE; |
+ content::RenderViewHost* render_view_host) OVERRIDE { |
+ MojoWebUIControllerBase::RenderViewCreated(render_view_host); |
+ render_view_host->GetMainFrame()->GetServiceRegistry()-> |
+ AddService<Interface>( |
+ base::Bind(&MojoWebUIController::CreateAndStoreUIHandler, |
+ weak_factory_.GetWeakPtr())); |
+ } |
protected: |
- // Invoke to register mapping between binding file and resource id (IDR_...). |
- void AddMojoResourcePath(const std::string& path, int resource_id); |
- |
// Invoked to create the specific bindings implementation. |
virtual scoped_ptr<MojoWebUIHandler> CreateUIHandler( |
- mojo::ScopedMessagePipeHandle handle_to_page) = 0; |
+ mojo::InterfaceRequest<Interface> request) = 0; |
private: |
- // Invoked in response to a connection from the renderer. |
- void CreateAndStoreUIHandler(mojo::ScopedMessagePipeHandle handle); |
- |
- // Bindings files are registered here. |
- content::WebUIDataSource* mojo_data_source_; |
+ void CreateAndStoreUIHandler(mojo::InterfaceRequest<Interface> request) { |
+ ui_handler_ = CreateUIHandler(request.Pass()); |
+ } |
scoped_ptr<MojoWebUIHandler> ui_handler_; |