OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 CHROME_BROWSER_INFOBARS_INFOBAR_MANAGER_H_ | |
6 #define CHROME_BROWSER_INFOBARS_INFOBAR_MANAGER_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/memory/scoped_ptr.h" | |
11 #include "base/observer_list.h" | |
12 #include "chrome/browser/infobars/infobar_delegate.h" | |
13 | |
14 namespace content { | |
15 class WebContents; | |
16 } | |
17 | |
18 class InfoBar; | |
19 | |
20 // Provides access to creating, removing and enumerating info bars | |
21 // attached to a tab. | |
22 class InfoBarManager { | |
23 public: | |
24 // Observer class for infobar events. | |
25 class Observer { | |
26 public: | |
27 virtual void OnInfoBarAdded(InfoBar* infobar) = 0; | |
28 virtual void OnInfoBarRemoved(InfoBar* infobar, bool animate) = 0; | |
29 virtual void OnInfoBarReplaced(InfoBar* old_infobar, | |
30 InfoBar* new_infobar) = 0; | |
31 virtual void OnManagerShuttingDown(InfoBarManager* manager) = 0; | |
32 }; | |
33 | |
34 InfoBarManager(); | |
35 virtual ~InfoBarManager(); | |
36 | |
37 // Must be called before destruction. | |
38 // TODO(droger): Merge this method with the destructor once the virtual calls | |
39 // for notifications are removed (see http://crbug.com/354380). | |
40 void ShutDown(); | |
41 | |
42 // Adds the specified |infobar|, which already owns a delegate. | |
43 // | |
44 // If infobars are disabled for this tab or the tab already has an infobar | |
45 // whose delegate returns true for | |
46 // InfoBarDelegate::EqualsDelegate(infobar->delegate()), |infobar| is deleted | |
47 // immediately without being added. | |
48 // | |
49 // Returns the infobar if it was successfully added. | |
50 InfoBar* AddInfoBar(scoped_ptr<InfoBar> infobar); | |
51 | |
52 // Removes the specified |infobar|. This in turn may close immediately or | |
53 // animate closed; at the end the infobar will delete itself. | |
54 // | |
55 // If infobars are disabled for this tab, this will do nothing, on the | |
56 // assumption that the matching AddInfoBar() call will have already deleted | |
57 // the infobar (see above). | |
58 void RemoveInfoBar(InfoBar* infobar); | |
59 | |
60 // Removes all the infobars. | |
61 void RemoveAllInfoBars(bool animate); | |
62 | |
63 // Replaces one infobar with another, without any animation in between. This | |
64 // will result in |old_infobar| being synchronously deleted. | |
65 // | |
66 // If infobars are disabled for this tab, |new_infobar| is deleted immediately | |
67 // without being added, and nothing else happens. | |
68 // | |
69 // Returns the new infobar if it was successfully added. | |
70 // | |
71 // NOTE: This does not perform any EqualsDelegate() checks like AddInfoBar(). | |
72 InfoBar* ReplaceInfoBar(InfoBar* old_infobar, | |
73 scoped_ptr<InfoBar> new_infobar); | |
74 | |
75 // Returns the number of infobars for this tab. | |
76 size_t infobar_count() const { return infobars_.size(); } | |
77 | |
78 // Returns the infobar at the given |index|. The InfoBarManager retains | |
79 // ownership. | |
80 // | |
81 // Warning: Does not sanity check |index|. | |
82 InfoBar* infobar_at(size_t index) { return infobars_[index]; } | |
83 | |
84 // Must be called when a navigation happens. | |
85 void OnNavigation(const InfoBarDelegate::NavigationDetails& details); | |
86 | |
87 void AddObserver(Observer* obs); | |
88 void RemoveObserver(Observer* obs); | |
89 | |
90 // Returns the active entry ID. | |
91 virtual int GetActiveEntryID() = 0; | |
92 | |
93 protected: | |
94 // Notifies the observer in |observer_list_|. | |
95 // TODO(droger): Absorb these methods back into their callers once virtual | |
96 // overrides are removed (see http://crbug.com/354380). | |
97 virtual void NotifyInfoBarAdded(InfoBar* infobar); | |
98 virtual void NotifyInfoBarRemoved(InfoBar* infobar, bool animate); | |
99 virtual void NotifyInfoBarReplaced(InfoBar* old_infobar, | |
100 InfoBar* new_infobar); | |
101 | |
102 private: | |
103 // InfoBars associated with this InfoBarManager. We own these pointers. | |
104 // However, this is not a ScopedVector, because we don't delete the infobars | |
105 // directly once they've been added to this; instead, when we're done with an | |
106 // infobar, we instruct it to delete itself and then orphan it. See | |
107 // RemoveInfoBarInternal(). | |
108 typedef std::vector<InfoBar*> InfoBars; | |
109 | |
110 void RemoveInfoBarInternal(InfoBar* infobar, bool animate); | |
111 | |
112 InfoBars infobars_; | |
113 bool infobars_enabled_; | |
114 | |
115 ObserverList<Observer, true> observer_list_; | |
116 | |
117 DISALLOW_COPY_AND_ASSIGN(InfoBarManager); | |
118 }; | |
119 | |
120 #endif // CHROME_BROWSER_INFOBARS_INFOBAR_MANAGER_H_ | |
OLD | NEW |