Index: chrome/browser/tabs/tab_strip_model.cc |
diff --git a/chrome/browser/tabs/tab_strip_model.cc b/chrome/browser/tabs/tab_strip_model.cc |
index ad67ca9d3e06ef64b85e00084891a44a4e224680..16270ee28268c7b33340df5dcaf2aa3f1fe43db0 100644 |
--- a/chrome/browser/tabs/tab_strip_model.cc |
+++ b/chrome/browser/tabs/tab_strip_model.cc |
@@ -164,6 +164,11 @@ void TabStripModel::InsertTabContentsAt(int index, |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
TabInsertedAt(contents, index, active)); |
+ if (active) |
+ tab_mru_list_manager_.ActivateContents(contents); |
+ else |
+ tab_mru_list_manager_.AppendContents(contents); |
+ |
if (active) { |
TabStripSelectionModel new_model; |
new_model.Copy(selection_model_); |
@@ -186,6 +191,8 @@ TabContentsWrapper* TabStripModel::ReplaceTabContentsAt( |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
TabReplacedAt(this, old_contents, new_contents, index)); |
+ tab_mru_list_manager_.ReplaceContents(old_contents, new_contents); |
+ |
// When the active tab contents is replaced send out selected notification |
// too. We do this as nearly all observers need to treat a replace of the |
// selected contents as selection changing. |
@@ -193,6 +200,7 @@ TabContentsWrapper* TabStripModel::ReplaceTabContentsAt( |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
ActiveTabChanged(old_contents, new_contents, |
active_index(), false)); |
+ tab_mru_list_manager_.ActivateContents(new_contents); |
} |
return old_contents; |
} |
@@ -251,8 +259,10 @@ TabContentsWrapper* TabStripModel::DetachTabContentsAt(int index) { |
closing_all_ = true; |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
TabDetachedAt(removed_contents, index)); |
+ tab_mru_list_manager_.RemoveContents(removed_contents); |
if (empty()) { |
selection_model_.Clear(); |
+ tab_mru_list_manager_.ClearContents(); |
// TabDetachedAt() might unregister observers, so send |TabStripEmtpy()| in |
// a second pass. |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, TabStripEmpty()); |
@@ -757,6 +767,13 @@ void TabStripModel::SelectLastTab() { |
ActivateTabAt(count() - 1, true); |
} |
+void TabStripModel::SelectNextMRUTab() { |
+ TabContentsWrapper* contents = tab_mru_list_manager_.GetNextMRUTab(); |
+ if (contents) { |
+ ActivateTabAt(GetIndexOfTabContents(contents),true); |
+ } |
+} |
+ |
void TabStripModel::MoveTabNext() { |
// TODO: this likely needs to be updated for multi-selection. |
int new_index = std::min(active_index() + 1, count() - 1); |
@@ -1208,6 +1225,8 @@ void TabStripModel::InternalCloseTab(TabContentsWrapper* contents, |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
TabClosingAt(this, contents, index)); |
+ tab_mru_list_manager_.RemoveContents(contents); |
+ |
// Ask the delegate to save an entry for this tab in the historical tab |
// database if applicable. |
if (create_historical_tabs) |
@@ -1240,6 +1259,7 @@ void TabStripModel::NotifyIfActiveTabChanged( |
ActiveTabChanged(old_contents, new_contents, |
active_index(), |
notify_types == NOTIFY_USER_GESTURE)); |
+ tab_mru_list_manager_.ActivateContents(new_contents); |
// Activating a discarded tab reloads it, so it is no longer discarded. |
contents_data_[active_index()]->discarded = false; |
} |