Home | History | Annotate | Download | only in web_modal
      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_
    126