15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef CHROME_BROWSER_UI_WEBUI_MOJO_WEB_UI_CONTROLLER_H_
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define CHROME_BROWSER_UI_WEBUI_MOJO_WEB_UI_CONTROLLER_H_
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <string>
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/scoped_ptr.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/weak_ptr.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/webui/mojo_web_ui_handler.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/render_frame_host.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_ui_controller.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/common/service_registry.h"
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/public/cpp/system/core.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MojoWebUIHandler;
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace content {
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass WebUIDataSource;
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MojoWebUIControllerBase : public content::WebUIController {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit MojoWebUIControllerBase(content::WebUI* contents);
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MojoWebUIControllerBase();
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // WebUIController overrides:
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void RenderViewCreated(
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE;
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Invoke to register mapping between binding file and resource id (IDR_...).
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AddMojoResourcePath(const std::string& path, int resource_id);
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Bindings files are registered here.
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::WebUIDataSource* mojo_data_source_;
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MojoWebUIControllerBase);
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// MojoWebUIController is intended for web ui pages that use mojo. It is
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// expected that subclasses will do two things:
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// . In the constructor invoke AddMojoResourcePath() to register the bindings
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu//   files, eg:
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu//     AddMojoResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom",
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu//                         IDR_OMNIBOX_MOJO_JS);
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// . Override CreateUIHandler() to create the implementation of the bindings.
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename Interface>
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MojoWebUIController : public MojoWebUIControllerBase {
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit MojoWebUIController(content::WebUI* contents)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : MojoWebUIControllerBase(contents), weak_factory_(this) {}
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MojoWebUIController() {}
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void RenderViewCreated(
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MojoWebUIControllerBase::RenderViewCreated(render_view_host);
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    render_view_host->GetMainFrame()->GetServiceRegistry()->
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        AddService<Interface>(
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            base::Bind(&MojoWebUIController::CreateAndStoreUIHandler,
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       weak_factory_.GetWeakPtr()));
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected:
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Invoked to create the specific bindings implementation.
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual scoped_ptr<MojoWebUIHandler> CreateUIHandler(
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      mojo::InterfaceRequest<Interface> request) = 0;
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void CreateAndStoreUIHandler(mojo::InterfaceRequest<Interface> request) {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui_handler_ = CreateUIHandler(request.Pass());
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<MojoWebUIHandler> ui_handler_;
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtrFactory<MojoWebUIController> weak_factory_;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(MojoWebUIController);
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // CHROME_BROWSER_UI_WEBUI_MOJO_WEB_UI_CONTROLLER_H_
85