Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ui / views / controls / webview / web_dialog_view.h
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
20 namespace content {
21 class BrowserContext;
22 }
23
24 namespace views {
25 class 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.
40 class 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() OVERRIDE;
56   virtual gfx::Size GetMinimumSize() 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_