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