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