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 UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
6#define UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
7
8#include <string>
9#include <vector>
10
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"
19
20namespace content {
21class BrowserContext;
22}
23
24namespace views {
25class WebView;
26
27////////////////////////////////////////////////////////////////////////////////
28//
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.
34//
35////////////////////////////////////////////////////////////////////////////////
36//
37// TODO(akalin): Make WebDialogView contain an WebDialogWebContentsDelegate
38// instead of inheriting from it to avoid violating the "no multiple
39// inheritance" rule.
40class WEBVIEW_EXPORT WebDialogView : public views::ClientView,
41                                     public ui::WebDialogWebContentsDelegate,
42                                     public ui::WebDialogDelegate,
43                                     public views::WidgetDelegate {
44 public:
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();
50
51  // For testing.
52  content::WebContents* web_contents();
53
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)
58      OVERRIDE;
59  virtual void ViewHierarchyChanged(
60      const ViewHierarchyChangedDetails& details) OVERRIDE;
61  virtual bool CanClose() OVERRIDE;
62
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;
75
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;
96
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,
111                              bool user_gesture,
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,
116                                 bool proceed,
117                                 bool* proceed_to_fire_unload) OVERRIDE;
118
119 private:
120  FRIEND_TEST_ALL_PREFIXES(WebDialogBrowserTest, WebContentRendered);
121
122  // Initializes the contents of the dialog.
123  void InitDialog();
124
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_;
130
131  views::WebView* web_view_;
132
133  // Whether user is attempting to close the dialog and we are processing
134  // beforeunload event.
135  bool is_attempting_close_dialog_;
136
137  // Whether beforeunload event has been fired and we have finished processing
138  // beforeunload event.
139  bool before_unload_fired_;
140
141  // Whether the dialog is closed from WebUI in response to a "dialogClose"
142  // message.
143  bool closed_via_webui_;
144
145  // A json string returned to WebUI from a "dialogClose" message.
146  std::string dialog_close_retval_;
147
148  // Whether CloseContents() has been called.
149  bool close_contents_called_;
150
151  DISALLOW_COPY_AND_ASSIGN(WebDialogView);
152};
153
154}  // namespace views
155
156#endif  // UI_VIEWS_CONTROLS_WEBVIEW_WEB_DIALOG_VIEW_H_
157