| Index: chrome/browser/ui/browser_tab_strip_tracker.cc
|
| diff --git a/chrome/browser/ui/browser_tab_strip_tracker.cc b/chrome/browser/ui/browser_tab_strip_tracker.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ef34ce32ff896c67727da0d6fa4550bce913f739
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/browser_tab_strip_tracker.cc
|
| @@ -0,0 +1,99 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/ui/browser_tab_strip_tracker.h"
|
| +
|
| +#include "base/auto_reset.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_iterator.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/browser/ui/browser_tab_strip_tracker_delegate.h"
|
| +#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +
|
| +BrowserTabStripTracker::BrowserTabStripTracker(
|
| + TabStripModelObserver* tab_strip_model_observer,
|
| + BrowserTabStripTrackerDelegate* delegate,
|
| + BrowserListObserver* browser_list_observer)
|
| + : tab_strip_model_observer_(tab_strip_model_observer),
|
| + delegate_(delegate),
|
| + browser_list_observer_(browser_list_observer),
|
| + is_processing_initial_browsers_(false) {
|
| + DCHECK(tab_strip_model_observer_);
|
| +}
|
| +
|
| +BrowserTabStripTracker::~BrowserTabStripTracker() {
|
| + for (Browser* browser : browsers_observing_)
|
| + browser->tab_strip_model()->RemoveObserver(tab_strip_model_observer_);
|
| +
|
| + BrowserList::RemoveObserver(this);
|
| +}
|
| +
|
| +void BrowserTabStripTracker::Init(InitWith init_with) {
|
| + BrowserList::AddObserver(this);
|
| +
|
| + base::AutoReset<bool> restter(&is_processing_initial_browsers_, true);
|
| + if (init_with == InitWith::BROWSERS_IN_ACTIVE_DESKTOP) {
|
| + for (Browser* browser :
|
| + *BrowserList::GetInstance(chrome::GetActiveDesktop()))
|
| + MaybeTrackBrowser(browser);
|
| + } else {
|
| + DCHECK(InitWith::ALL_BROWERS == init_with);
|
| + for (chrome::BrowserIterator it; !it.done(); it.Next())
|
| + MaybeTrackBrowser(*it);
|
| + }
|
| +}
|
| +
|
| +void BrowserTabStripTracker::StopObservingAndSendOnBrowserRemoved() {
|
| + Browsers current_browsers;
|
| + current_browsers.swap(browsers_observing_);
|
| +
|
| + for (Browser* browser : current_browsers) {
|
| + browser->tab_strip_model()->RemoveObserver(tab_strip_model_observer_);
|
| + if (browser_list_observer_)
|
| + browser_list_observer_->OnBrowserRemoved(browser);
|
| + }
|
| +}
|
| +
|
| +bool BrowserTabStripTracker::ShouldTrackBrowser(Browser* browser) {
|
| + return !delegate_ || delegate_->ShouldTrackBrowser(browser);
|
| +}
|
| +
|
| +void BrowserTabStripTracker::MaybeTrackBrowser(Browser* browser) {
|
| + if (!ShouldTrackBrowser(browser))
|
| + return;
|
| +
|
| + browsers_observing_.insert(browser);
|
| +
|
| + if (browser_list_observer_)
|
| + browser_list_observer_->OnBrowserAdded(browser);
|
| +
|
| + TabStripModel* tab_strip_model = browser->tab_strip_model();
|
| + tab_strip_model->AddObserver(tab_strip_model_observer_);
|
| + const int active_index = tab_strip_model->active_index();
|
| + for (int i = 0; i < tab_strip_model->count(); ++i) {
|
| + tab_strip_model_observer_->TabInsertedAt(
|
| + tab_strip_model->GetWebContentsAt(i), i, i == active_index);
|
| + }
|
| +}
|
| +
|
| +void BrowserTabStripTracker::OnBrowserAdded(Browser* browser) {
|
| + MaybeTrackBrowser(browser);
|
| +}
|
| +
|
| +void BrowserTabStripTracker::OnBrowserRemoved(Browser* browser) {
|
| + auto it = browsers_observing_.find(browser);
|
| + if (it == browsers_observing_.end())
|
| + return;
|
| +
|
| + browsers_observing_.erase(it);
|
| + browser->tab_strip_model()->RemoveObserver(tab_strip_model_observer_);
|
| +
|
| + if (browser_list_observer_)
|
| + browser_list_observer_->OnBrowserRemoved(browser);
|
| +}
|
| +
|
| +void BrowserTabStripTracker::OnBrowserSetLastActive(Browser* browser) {
|
| + if (browser_list_observer_)
|
| + browser_list_observer_->OnBrowserSetLastActive(browser);
|
| +}
|
|
|