blob: 48e0cc00bae7ea0a87ee47d94c370daa48b9580f [file] [log] [blame]
skydbc6f292015-10-12 16:30:041// Copyright 2015 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_UI_BROWSER_TAB_STRIP_TRACKER_H_
6#define CHROME_BROWSER_UI_BROWSER_TAB_STRIP_TRACKER_H_
7
8#include <set>
9
10#include "base/basictypes.h"
11#include "chrome/browser/ui/browser_list_observer.h"
12
13class BrowserTabStripTrackerDelegate;
14class TabStripModelObserver;
15
16// BrowserTabStripTracker is useful when you want to attach a
17// TabStripModelObserver to a subset of the available browsers, as well as
18// tracking new Browsers as they are added.
19//
20// To constrain the set of Browsers to track use a
21// BrowserTabStripTrackerDelegate. BrowserTabStripTracker queries the delegate
22// for each Browser to determine if the Browser should be tracked. A null
23// delegate indicates all Browsers should be observed.
24//
25// If you are interested in BrowserListObserver functions specify a
26// BrowserListObserver in the constructor. OnBrowserAdded() and
27// OnBrowserRemoved() are only called if the delegate indicates the browser
28// should be tracked.
29class BrowserTabStripTracker : public chrome::BrowserListObserver {
30 public:
31 // See Init() for details.
32 enum class InitWith {
33 BROWSERS_IN_ACTIVE_DESKTOP,
34 ALL_BROWERS,
35 };
36
37 // See class description for details. You only need specify a
38 // TabStripModelObserver. |delegate| and |browser_list_observer| are
39 // optional.
40 BrowserTabStripTracker(TabStripModelObserver* tab_strip_model_observer,
41 BrowserTabStripTrackerDelegate* delegate,
42 BrowserListObserver* browser_list_observer);
43 ~BrowserTabStripTracker() override;
44
45 // Starts tracking BrowserList for changes and additionally observes the
46 // existing Browsers matching |init_with|. If there is a
47 // BrowserTabStripTrackerDelegate it is called to determine if the Browser
48 // should be observed. If an existing Browser should be observed
49 // TabInsertedAt() is called for any existing tabs. If a delegate needs to
50 // differentiate between Browsers observed by way of Init() vs. a Browser
51 // added after the fact use is_processing_initial_browsers().
52 void Init(InitWith init_with);
53
54 // Returns true if processing an existing Browser in Init().
55 bool is_processing_initial_browsers() const {
56 return is_processing_initial_browsers_;
57 }
58
59 // Stops observing the current set of observed browsers and calls
60 // BrowserListObserver::OnBrowserRemoved().
61 void StopObservingAndSendOnBrowserRemoved();
62
63 private:
64 using Browsers = std::set<Browser*>;
65
66 // Returns true if a TabStripModelObserver should be added to |browser|.
67 bool ShouldTrackBrowser(Browser* browser);
68
69 // If ShouldTrackBrowser() returns true for |browser| then a
70 // TabStripModelObserver is attached.
71 void MaybeTrackBrowser(Browser* browser);
72
73 // BrowserListObserver:
74 void OnBrowserAdded(Browser* browser) override;
75 void OnBrowserRemoved(Browser* browser) override;
76 void OnBrowserSetLastActive(Browser* browser) override;
77
78 TabStripModelObserver* tab_strip_model_observer_;
79 BrowserTabStripTrackerDelegate* delegate_;
80 BrowserListObserver* browser_list_observer_;
81 bool is_processing_initial_browsers_;
82 Browsers browsers_observing_;
83
84 DISALLOW_COPY_AND_ASSIGN(BrowserTabStripTracker);
85};
86
87#endif // CHROME_BROWSER_UI_BROWSER_TAB_STRIP_TRACKER_H_