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.
5 #ifndef UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
6 #define UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "ui/gfx/size.h"
14 #include "ui/views/controls/webview/webview_export.h"
15 #include "ui/views/widget/widget_delegate.h"
16 #include "ui/views/window/client_view.h"
17 #include "ui/web_dialogs/web_dialog_delegate.h"
18 #include "ui/web_dialogs/web_dialog_web_contents_delegate.h"
27 ////////////////////////////////////////////////////////////////////////////////
29 // WebDialogView is a view used to display an web dialog to the user. The
30 // content of the dialogs is determined by the delegate
31 // (ui::WebDialogDelegate), but is basically a file URL along with a
32 // JSON input string. The HTML is supposed to show a UI to the user and is
33 // expected to send back a JSON file as a return value.
35 ////////////////////////////////////////////////////////////////////////////////
37 // TODO(akalin): Make WebDialogView contain an WebDialogWebContentsDelegate
38 // instead of inheriting from it to avoid violating the "no multiple
40 class WEBVIEW_EXPORT WebDialogView
: public views::ClientView
,
41 public ui::WebDialogWebContentsDelegate
,
42 public ui::WebDialogDelegate
,
43 public views::WidgetDelegate
{
45 // |handler| must not be NULL and this class takes the ownership.
46 WebDialogView(content::BrowserContext
* context
,
47 ui::WebDialogDelegate
* delegate
,
48 WebContentsHandler
* handler
);
49 virtual ~WebDialogView();
52 content::WebContents
* web_contents();
54 // Overridden from views::ClientView:
55 virtual gfx::Size
GetPreferredSize() const OVERRIDE
;
56 virtual gfx::Size
GetMinimumSize() const OVERRIDE
;
57 virtual bool AcceleratorPressed(const ui::Accelerator
& accelerator
)
59 virtual void ViewHierarchyChanged(
60 const ViewHierarchyChangedDetails
& details
) OVERRIDE
;
61 virtual bool CanClose() OVERRIDE
;
63 // Overridden from views::WidgetDelegate:
64 virtual bool CanResize() const OVERRIDE
;
65 virtual ui::ModalType
GetModalType() const OVERRIDE
;
66 virtual base::string16
GetWindowTitle() const OVERRIDE
;
67 virtual std::string
GetWindowName() const OVERRIDE
;
68 virtual void WindowClosing() OVERRIDE
;
69 virtual views::View
* GetContentsView() OVERRIDE
;
70 virtual ClientView
* CreateClientView(views::Widget
* widget
) OVERRIDE
;
71 virtual views::View
* GetInitiallyFocusedView() OVERRIDE
;
72 virtual bool ShouldShowWindowTitle() const OVERRIDE
;
73 virtual views::Widget
* GetWidget() OVERRIDE
;
74 virtual const views::Widget
* GetWidget() const OVERRIDE
;
76 // Overridden from ui::WebDialogDelegate:
77 virtual ui::ModalType
GetDialogModalType() const OVERRIDE
;
78 virtual base::string16
GetDialogTitle() const OVERRIDE
;
79 virtual GURL
GetDialogContentURL() const OVERRIDE
;
80 virtual void GetWebUIMessageHandlers(
81 std::vector
<content::WebUIMessageHandler
*>* handlers
) const OVERRIDE
;
82 virtual void GetDialogSize(gfx::Size
* size
) const OVERRIDE
;
83 virtual void GetMinimumDialogSize(gfx::Size
* size
) const OVERRIDE
;
84 virtual std::string
GetDialogArgs() const OVERRIDE
;
85 virtual void OnDialogShown(
86 content::WebUI
* webui
,
87 content::RenderViewHost
* render_view_host
) OVERRIDE
;
88 virtual void OnDialogClosed(const std::string
& json_retval
) OVERRIDE
;
89 virtual void OnDialogCloseFromWebUI(
90 const std::string
& json_retval
) OVERRIDE
;
91 virtual void OnCloseContents(content::WebContents
* source
,
92 bool* out_close_dialog
) OVERRIDE
;
93 virtual bool ShouldShowDialogTitle() const OVERRIDE
;
94 virtual bool HandleContextMenu(
95 const content::ContextMenuParams
& params
) OVERRIDE
;
97 // Overridden from content::WebContentsDelegate:
98 virtual void MoveContents(content::WebContents
* source
,
99 const gfx::Rect
& pos
) OVERRIDE
;
100 virtual void HandleKeyboardEvent(
101 content::WebContents
* source
,
102 const content::NativeWebKeyboardEvent
& event
) OVERRIDE
;
103 virtual void CloseContents(content::WebContents
* source
) OVERRIDE
;
104 virtual content::WebContents
* OpenURLFromTab(
105 content::WebContents
* source
,
106 const content::OpenURLParams
& params
) OVERRIDE
;
107 virtual void AddNewContents(content::WebContents
* source
,
108 content::WebContents
* new_contents
,
109 WindowOpenDisposition disposition
,
110 const gfx::Rect
& initial_pos
,
112 bool* was_blocked
) OVERRIDE
;
113 virtual void LoadingStateChanged(content::WebContents
* source
,
114 bool to_different_document
) OVERRIDE
;
115 virtual void BeforeUnloadFired(content::WebContents
* tab
,
117 bool* proceed_to_fire_unload
) OVERRIDE
;
120 FRIEND_TEST_ALL_PREFIXES(WebDialogBrowserTest
, WebContentRendered
);
122 // Initializes the contents of the dialog.
125 // This view is a delegate to the HTML content since it needs to get notified
126 // about when the dialog is closing. For all other actions (besides dialog
127 // closing) we delegate to the creator of this view, which we keep track of
128 // using this variable.
129 ui::WebDialogDelegate
* delegate_
;
131 views::WebView
* web_view_
;
133 // Whether user is attempting to close the dialog and we are processing
134 // beforeunload event.
135 bool is_attempting_close_dialog_
;
137 // Whether beforeunload event has been fired and we have finished processing
138 // beforeunload event.
139 bool before_unload_fired_
;
141 // Whether the dialog is closed from WebUI in response to a "dialogClose"
143 bool closed_via_webui_
;
145 // A json string returned to WebUI from a "dialogClose" message.
146 std::string dialog_close_retval_
;
148 // Whether CloseContents() has been called.
149 bool close_contents_called_
;
151 DISALLOW_COPY_AND_ASSIGN(WebDialogView
);
156 #endif // UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_