Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / components / web_modal / web_contents_modal_dialog_manager.h
1 // Copyright 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 COMPONENTS_WEB_MODAL_WEB_CONTENTS_MODAL_DIALOG_MANAGER_H_
6 #define COMPONENTS_WEB_MODAL_WEB_CONTENTS_MODAL_DIALOG_MANAGER_H_
7
8 #include <deque>
9
10 #include "base/memory/scoped_ptr.h"
11 #include "components/web_modal/single_web_contents_dialog_manager.h"
12 #include "content/public/browser/web_contents_observer.h"
13 #include "content/public/browser/web_contents_user_data.h"
14 #include "ui/gfx/native_widget_types.h"
15
16 namespace web_modal {
17
18 class WebContentsModalDialogManagerDelegate;
19
20 // Per-WebContents class to manage WebContents-modal dialogs.
21 class WebContentsModalDialogManager
22     : public SingleWebContentsDialogManagerDelegate,
23       public content::WebContentsObserver,
24       public content::WebContentsUserData<WebContentsModalDialogManager> {
25  public:
26   virtual ~WebContentsModalDialogManager();
27
28   WebContentsModalDialogManagerDelegate* delegate() const { return delegate_; }
29   void SetDelegate(WebContentsModalDialogManagerDelegate* d);
30
31   static SingleWebContentsDialogManager* CreateNativeWebModalManager(
32       NativeWebContentsModalDialog dialog,
33       SingleWebContentsDialogManagerDelegate* native_delegate);
34
35   // Shows the dialog as a web contents modal dialog. The dialog will notify via
36   // WillClose() when it is being destroyed.
37   void ShowModalDialog(NativeWebContentsModalDialog dialog);
38
39   // Allow clients to supply their own native dialog manager. Suitable for
40   // bubble clients.
41   void ShowDialogWithManager(
42       NativeWebContentsModalDialog dialog,
43       scoped_ptr<SingleWebContentsDialogManager> manager);
44
45   // Returns true if any dialogs are active and not closed.
46   bool IsDialogActive() const;
47
48   // Focus the topmost modal dialog.  IsDialogActive() must be true when calling
49   // this function.
50   void FocusTopmostDialog() const;
51
52   // SingleWebContentsDialogManagerDelegate:
53   virtual content::WebContents* GetWebContents() const OVERRIDE;
54   virtual void WillClose(NativeWebContentsModalDialog dialog) OVERRIDE;
55
56   // For testing.
57   class TestApi {
58    public:
59     explicit TestApi(WebContentsModalDialogManager* manager)
60         : manager_(manager) {}
61
62     void CloseAllDialogs() { manager_->CloseAllDialogs(); }
63     void DidAttachInterstitialPage() { manager_->DidAttachInterstitialPage(); }
64     void WebContentsWasShown() { manager_->WasShown(); }
65     void WebContentsWasHidden() { manager_->WasHidden(); }
66
67    private:
68     WebContentsModalDialogManager* manager_;
69
70     DISALLOW_COPY_AND_ASSIGN(TestApi);
71   };
72
73  private:
74   explicit WebContentsModalDialogManager(content::WebContents* web_contents);
75   friend class content::WebContentsUserData<WebContentsModalDialogManager>;
76   friend class PopupManager;
77
78   struct DialogState {
79     DialogState(NativeWebContentsModalDialog dialog,
80                 scoped_ptr<SingleWebContentsDialogManager> manager);
81     ~DialogState();
82
83     NativeWebContentsModalDialog dialog;
84     scoped_ptr<SingleWebContentsDialogManager> manager;
85   };
86
87   typedef std::deque<DialogState*> WebContentsModalDialogList;
88
89   // Utility function to get the dialog state for a dialog.
90   WebContentsModalDialogList::iterator FindDialogState(
91       NativeWebContentsModalDialog dialog);
92
93   // Blocks/unblocks interaction with renderer process.
94   void BlockWebContentsInteraction(bool blocked);
95
96   bool IsWebContentsVisible() const;
97
98   // Closes all WebContentsModalDialogs.
99   void CloseAllDialogs();
100
101   // Overridden from content::WebContentsObserver:
102   virtual void DidNavigateMainFrame(
103       const content::LoadCommittedDetails& details,
104       const content::FrameNavigateParams& params) OVERRIDE;
105   virtual void DidGetIgnoredUIEvent() OVERRIDE;
106   virtual void WasShown() OVERRIDE;
107   virtual void WasHidden() OVERRIDE;
108   virtual void WebContentsDestroyed() OVERRIDE;
109   virtual void DidAttachInterstitialPage() OVERRIDE;
110
111   // Delegate for notifying our owner about stuff. Not owned by us.
112   WebContentsModalDialogManagerDelegate* delegate_;
113
114   // All active dialogs.
115   WebContentsModalDialogList child_dialogs_;
116
117   // True while closing the dialogs on WebContents close.
118   bool closing_all_dialogs_;
119
120   DISALLOW_COPY_AND_ASSIGN(WebContentsModalDialogManager);
121 };
122
123 }  // namespace web_modal
124
125 #endif  // COMPONENTS_WEB_MODAL_WEB_CONTENTS_MODAL_DIALOG_MANAGER_H_