1 // Copyright (c) 2012 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_CONSTRAINED_WEB_DIALOG_UI_H_ 6 #define CHROME_BROWSER_UI_WEBUI_CONSTRAINED_WEB_DIALOG_UI_H_ 7 8 #include "base/compiler_specific.h" 9 #include "components/web_modal/native_web_contents_modal_dialog.h" 10 #include "content/public/browser/web_ui_controller.h" 11 #include "ui/gfx/native_widget_types.h" 12 13 namespace content { 14 class BrowserContext; 15 class RenderViewHost; 16 class WebContents; 17 } 18 19 namespace ui { 20 class WebDialogDelegate; 21 class WebDialogWebContentsDelegate; 22 } 23 24 class ConstrainedWebDialogDelegate { 25 public: 26 virtual const ui::WebDialogDelegate* GetWebDialogDelegate() const = 0; 27 virtual ui::WebDialogDelegate* GetWebDialogDelegate() = 0; 28 29 // Called when the dialog is being closed in response to a "dialogClose" 30 // message from WebUI. 31 virtual void OnDialogCloseFromWebUI() = 0; 32 33 // If called, on dialog closure, the dialog will release its WebContents 34 // instead of destroying it. After which point, the caller will own the 35 // released WebContents. 36 virtual void ReleaseWebContentsOnDialogClose() = 0; 37 38 // Returns the WebContents owned by the constrained window. 39 virtual content::WebContents* GetWebContents() = 0; 40 41 // Returns the native type used to display the dialog. 42 virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() = 0; 43 44 protected: ~ConstrainedWebDialogDelegate()45 virtual ~ConstrainedWebDialogDelegate() {} 46 }; 47 48 // ConstrainedWebDialogUI is a facility to show HTML WebUI content 49 // in a tab-modal constrained dialog. It is implemented as an adapter 50 // between an WebDialogUI object and a web contents modal dialog. 51 // 52 // Since the web contents modal dialog requires platform-specific delegate 53 // implementations, this class is just a factory stub. 54 class ConstrainedWebDialogUI : public content::WebUIController { 55 public: 56 explicit ConstrainedWebDialogUI(content::WebUI* web_ui); 57 virtual ~ConstrainedWebDialogUI(); 58 59 // WebUIController implementation: 60 virtual void RenderViewCreated( 61 content::RenderViewHost* render_view_host) OVERRIDE; 62 63 // Sets the delegate on the WebContents. 64 static void SetConstrainedDelegate(content::WebContents* web_contents, 65 ConstrainedWebDialogDelegate* delegate); 66 67 protected: 68 // Returns the ConstrainedWebDialogDelegate saved with the WebContents. 69 // Returns NULL if no such delegate is set. 70 ConstrainedWebDialogDelegate* GetConstrainedDelegate(); 71 72 private: 73 // JS Message Handler 74 void OnDialogCloseMessage(const base::ListValue* args); 75 76 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogUI); 77 }; 78 79 // Create a constrained HTML dialog. The actual object that gets created 80 // is a ConstrainedWebDialogDelegate, which later triggers construction of a 81 // ConstrainedWebDialogUI object. 82 // |browser_context| is used to construct the constrained HTML dialog's 83 // WebContents. 84 // |delegate| controls the behavior of the dialog. 85 // |overshadowed| is the tab being overshadowed by the dialog. 86 ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( 87 content::BrowserContext* browser_context, 88 ui::WebDialogDelegate* delegate, 89 content::WebContents* overshadowed); 90 91 #endif // CHROME_BROWSER_UI_WEBUI_CONSTRAINED_WEB_DIALOG_UI_H_ 92