1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_WEBUI_HTML_DIALOG_UI_H_ 6 #define CHROME_BROWSER_UI_WEBUI_HTML_DIALOG_UI_H_ 7 #pragma once 8 9 #include <string> 10 #include <vector> 11 12 #include "content/browser/webui/web_ui.h" 13 #include "content/common/property_bag.h" 14 #include "googleurl/src/gurl.h" 15 16 namespace gfx { 17 class Size; 18 } 19 20 struct ContextMenuParams; 21 22 // Implement this class to receive notifications. 23 class HtmlDialogUIDelegate { 24 public: 25 // Returns true if the contents needs to be run in a modal dialog. 26 virtual bool IsDialogModal() const = 0; 27 28 // Returns the title of the dialog. 29 virtual std::wstring GetDialogTitle() const = 0; 30 31 // Get the HTML file path for the content to load in the dialog. 32 virtual GURL GetDialogContentURL() const = 0; 33 34 // Get WebUIMessageHandler objects to handle messages from the HTML/JS page. 35 // The handlers are used to send and receive messages from the page while it 36 // is still open. Ownership of each handler is taken over by the WebUI 37 // hosting the page. 38 virtual void GetWebUIMessageHandlers( 39 std::vector<WebUIMessageHandler*>* handlers) const = 0; 40 41 // Get the size of the dialog. 42 virtual void GetDialogSize(gfx::Size* size) const = 0; 43 44 // Gets the JSON string input to use when showing the dialog. 45 virtual std::string GetDialogArgs() const = 0; 46 47 // A callback to notify the delegate that the dialog closed. 48 virtual void OnDialogClosed(const std::string& json_retval) = 0; 49 50 // Notifies the delegate that the dialog's containing window has been 51 // closed, and that OnDialogClosed() will be called shortly. 52 // TODO(jamescook): Make this pure virtual. 53 virtual void OnWindowClosed(); 54 55 // A callback to notify the delegate that the contents have gone 56 // away. Only relevant if your dialog hosts code that calls 57 // windows.close() and you've allowed that. If the output parameter 58 // is set to true, then the dialog is closed. The default is false. 59 virtual void OnCloseContents(TabContents* source, bool* out_close_dialog) = 0; 60 61 // A callback to allow the delegate to dictate that the window should not 62 // have a title bar. This is useful when presenting branded interfaces. 63 virtual bool ShouldShowDialogTitle() const = 0; 64 65 // A callback to allow the delegate to inhibit context menu or show 66 // customized menu. 67 virtual bool HandleContextMenu(const ContextMenuParams& params); 68 69 protected: 70 virtual ~HtmlDialogUIDelegate() {} 71 }; 72 73 // Displays file URL contents inside a modal HTML dialog. 74 // 75 // This application really should not use TabContents + WebUI. It should instead 76 // just embed a RenderView in a dialog and be done with it. 77 // 78 // Before loading a URL corresponding to this WebUI, the caller should set its 79 // delegate as a property on the TabContents. This WebUI will pick it up from 80 // there and call it back. This is a bit of a hack to allow the dialog to pass 81 // its delegate to the Web UI without having nasty accessors on the TabContents. 82 // The correct design using RVH directly would avoid all of this. 83 class HtmlDialogUI : public WebUI { 84 public: 85 struct HtmlDialogParams { 86 // The URL for the content that will be loaded in the dialog. 87 GURL url; 88 // Width of the dialog. 89 int width; 90 // Height of the dialog. 91 int height; 92 // The JSON input to pass to the dialog when showing it. 93 std::string json_input; 94 }; 95 96 // When created, the property should already be set on the TabContents. 97 explicit HtmlDialogUI(TabContents* tab_contents); 98 virtual ~HtmlDialogUI(); 99 100 // Returns the PropertyBag accessor object used to write the delegate pointer 101 // into the TabContents (see class-level comment above). 102 static PropertyAccessor<HtmlDialogUIDelegate*>& GetPropertyAccessor(); 103 104 private: 105 // WebUI 106 virtual void RenderViewCreated(RenderViewHost* render_view_host); 107 108 // JS message handler. 109 void OnDialogClosed(const ListValue* args); 110 111 DISALLOW_COPY_AND_ASSIGN(HtmlDialogUI); 112 }; 113 114 // Displays external URL contents inside a modal HTML dialog. 115 // 116 // Intended to be the place to collect the settings and lockdowns 117 // necessary for running external UI conponents securely (e.g., the 118 // cloud print dialog). 119 class ExternalHtmlDialogUI : public HtmlDialogUI { 120 public: 121 explicit ExternalHtmlDialogUI(TabContents* tab_contents); 122 virtual ~ExternalHtmlDialogUI(); 123 }; 124 125 #endif // CHROME_BROWSER_UI_WEBUI_HTML_DIALOG_UI_H_ 126