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 16namespace web_modal { 17 18class WebContentsModalDialogManagerDelegate; 19 20// Per-WebContents class to manage WebContents-modal dialogs. 21class 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_ 126