Chromium Code Reviews| 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..298b957b2c02d3926945490b3e2b04566bfae885 |
| --- /dev/null |
| +++ b/chrome/browser/ui/browser_tab_strip_tracker.cc |
| @@ -0,0 +1,102 @@ |
| +// 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); |
| + switch (init_with) { |
|
Peter Kasting
2015/10/10 00:34:40
Nit: I kinda feel like just an if (...) { } else {
sky
2015/10/12 15:16:21
Done.
|
| + case InitWith::BROWSERS_IN_ACTIVE_DESKTOP: |
| + for (Browser* browser : |
| + *BrowserList::GetInstance(chrome::GetActiveDesktop())) |
| + MaybeTrackBrowser(browser); |
| + break; |
| + case InitWith::ALL_BROWERS: |
| + for (chrome::BrowserIterator it; !it.done(); it.Next()) |
|
Peter Kasting
2015/10/10 00:34:39
Random grouse: It sure would be nice if we redid t
sky
2015/10/12 15:16:21
Agreed. I'm not trying to do it now though.
|
| + MaybeTrackBrowser(*it); |
| + break; |
| + } |
| +} |
| + |
| +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); |
| + |
| + // GlobalConfirmInfoBar (in debugger_api) wants this. |
|
Peter Kasting
2015/10/10 00:34:40
Nit: Not totally clear on what this comment means.
sky
2015/10/12 15:16:21
Nuked.
|
| + 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); |
| +} |