• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
delegate()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();
51 
52   // Overriden from SingleWebContentsDialogManagerDelegate:
53   virtual content::WebContents* GetWebContents() const OVERRIDE;
54   // Called when a WebContentsModalDialogs we own is about to be closed.
55   virtual void WillClose(NativeWebContentsModalDialog dialog) OVERRIDE;
56 
57   // For testing.
58   class TestApi {
59    public:
TestApi(WebContentsModalDialogManager * manager)60     explicit TestApi(WebContentsModalDialogManager* manager)
61         : manager_(manager) {}
62 
CloseAllDialogs()63     void CloseAllDialogs() { manager_->CloseAllDialogs(); }
DidAttachInterstitialPage()64     void DidAttachInterstitialPage() { manager_->DidAttachInterstitialPage(); }
WebContentsWasShown()65     void WebContentsWasShown() { manager_->WasShown(); }
WebContentsWasHidden()66     void WebContentsWasHidden() { manager_->WasHidden(); }
67 
68    private:
69     WebContentsModalDialogManager* manager_;
70 
71     DISALLOW_COPY_AND_ASSIGN(TestApi);
72   };
73 
74  private:
75   explicit WebContentsModalDialogManager(content::WebContents* web_contents);
76   friend class content::WebContentsUserData<WebContentsModalDialogManager>;
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_
126