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(); 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: 60 explicit TestApi(WebContentsModalDialogManager* manager) 61 : manager_(manager) {} 62 63 void CloseAllDialogs() { manager_->CloseAllDialogs(); } 64 void DidAttachInterstitialPage() { manager_->DidAttachInterstitialPage(); } 65 void WebContentsWasShown() { manager_->WasShown(); } 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