OLD | NEW |
(Empty) | |
| 1 // 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 #include "chrome/browser/ui/browser_tab_strip_tracker.h" |
| 6 |
| 7 #include "base/auto_reset.h" |
| 8 #include "chrome/browser/ui/browser.h" |
| 9 #include "chrome/browser/ui/browser_iterator.h" |
| 10 #include "chrome/browser/ui/browser_list.h" |
| 11 #include "chrome/browser/ui/browser_tab_strip_tracker_delegate.h" |
| 12 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 13 |
| 14 BrowserTabStripTracker::BrowserTabStripTracker( |
| 15 TabStripModelObserver* tab_strip_model_observer, |
| 16 BrowserTabStripTrackerDelegate* delegate, |
| 17 BrowserListObserver* browser_list_observer) |
| 18 : tab_strip_model_observer_(tab_strip_model_observer), |
| 19 delegate_(delegate), |
| 20 browser_list_observer_(browser_list_observer), |
| 21 is_processing_initial_browsers_(false) { |
| 22 DCHECK(tab_strip_model_observer_); |
| 23 } |
| 24 |
| 25 BrowserTabStripTracker::~BrowserTabStripTracker() { |
| 26 for (Browser* browser : browsers_observing_) |
| 27 browser->tab_strip_model()->RemoveObserver(tab_strip_model_observer_); |
| 28 |
| 29 BrowserList::RemoveObserver(this); |
| 30 } |
| 31 |
| 32 void BrowserTabStripTracker::Init(InitWith init_with) { |
| 33 BrowserList::AddObserver(this); |
| 34 |
| 35 base::AutoReset<bool> restter(&is_processing_initial_browsers_, true); |
| 36 if (init_with == InitWith::BROWSERS_IN_ACTIVE_DESKTOP) { |
| 37 for (Browser* browser : |
| 38 *BrowserList::GetInstance(chrome::GetActiveDesktop())) |
| 39 MaybeTrackBrowser(browser); |
| 40 } else { |
| 41 DCHECK(InitWith::ALL_BROWERS == init_with); |
| 42 for (chrome::BrowserIterator it; !it.done(); it.Next()) |
| 43 MaybeTrackBrowser(*it); |
| 44 } |
| 45 } |
| 46 |
| 47 void BrowserTabStripTracker::StopObservingAndSendOnBrowserRemoved() { |
| 48 Browsers current_browsers; |
| 49 current_browsers.swap(browsers_observing_); |
| 50 |
| 51 for (Browser* browser : current_browsers) { |
| 52 browser->tab_strip_model()->RemoveObserver(tab_strip_model_observer_); |
| 53 if (browser_list_observer_) |
| 54 browser_list_observer_->OnBrowserRemoved(browser); |
| 55 } |
| 56 } |
| 57 |
| 58 bool BrowserTabStripTracker::ShouldTrackBrowser(Browser* browser) { |
| 59 return !delegate_ || delegate_->ShouldTrackBrowser(browser); |
| 60 } |
| 61 |
| 62 void BrowserTabStripTracker::MaybeTrackBrowser(Browser* browser) { |
| 63 if (!ShouldTrackBrowser(browser)) |
| 64 return; |
| 65 |
| 66 browsers_observing_.insert(browser); |
| 67 |
| 68 if (browser_list_observer_) |
| 69 browser_list_observer_->OnBrowserAdded(browser); |
| 70 |
| 71 TabStripModel* tab_strip_model = browser->tab_strip_model(); |
| 72 tab_strip_model->AddObserver(tab_strip_model_observer_); |
| 73 const int active_index = tab_strip_model->active_index(); |
| 74 for (int i = 0; i < tab_strip_model->count(); ++i) { |
| 75 tab_strip_model_observer_->TabInsertedAt( |
| 76 tab_strip_model->GetWebContentsAt(i), i, i == active_index); |
| 77 } |
| 78 } |
| 79 |
| 80 void BrowserTabStripTracker::OnBrowserAdded(Browser* browser) { |
| 81 MaybeTrackBrowser(browser); |
| 82 } |
| 83 |
| 84 void BrowserTabStripTracker::OnBrowserRemoved(Browser* browser) { |
| 85 auto it = browsers_observing_.find(browser); |
| 86 if (it == browsers_observing_.end()) |
| 87 return; |
| 88 |
| 89 browsers_observing_.erase(it); |
| 90 browser->tab_strip_model()->RemoveObserver(tab_strip_model_observer_); |
| 91 |
| 92 if (browser_list_observer_) |
| 93 browser_list_observer_->OnBrowserRemoved(browser); |
| 94 } |
| 95 |
| 96 void BrowserTabStripTracker::OnBrowserSetLastActive(Browser* browser) { |
| 97 if (browser_list_observer_) |
| 98 browser_list_observer_->OnBrowserSetLastActive(browser); |
| 99 } |
OLD | NEW |