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 5e877c13a615337574ff3894aaf5c99135c829d1..d6e5bc1d7810f1acbe183eaa6b84033d46477b9f 100644 |
--- a/chrome/browser/tabs/tab_strip_model.cc |
+++ b/chrome/browser/tabs/tab_strip_model.cc |
@@ -141,6 +141,8 @@ void TabStripModel::InsertTabContentsAt(int index, |
} |
// Anything opened by a link we deem to have an opener. |
data->SetGroup(&selected_contents->controller()); |
+ // TODO(sky): nuke when we figure out what is causing 34135. |
+ CHECK(data->opener != &(contents->controller())); |
} else if ((add_types & ADD_INHERIT_OPENER) && selected_contents) { |
if (foreground) { |
// Forget any existing relationships, we don't want to make things too |
@@ -148,6 +150,8 @@ void TabStripModel::InsertTabContentsAt(int index, |
ForgetAllOpeners(); |
} |
data->opener = &selected_contents->controller(); |
+ // TODO(sky): nuke when we figure out what is causing 34135. |
+ CHECK(data->opener != &(contents->controller())); |
} |
contents_data_.insert(contents_data_.begin() + index, data); |
@@ -168,11 +172,11 @@ void TabStripModel::InsertTabContentsAt(int index, |
TabContentsWrapper* TabStripModel::ReplaceTabContentsAt( |
int index, |
TabContentsWrapper* new_contents) { |
- // TODO: this should reset group/opener of any tabs that point at |
- // old_contents. |
DCHECK(ContainsIndex(index)); |
TabContentsWrapper* old_contents = GetContentsAt(index); |
+ ForgetOpenersAndGroupsReferencing(&(old_contents->controller())); |
+ |
contents_data_[index]->contents = new_contents; |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
@@ -217,6 +221,7 @@ TabContentsWrapper* TabStripModel::DetachTabContentsAt(int index) { |
volatile TabContentsData old_data = *contents_data_.at(index); |
delete contents_data_.at(index); |
contents_data_.erase(contents_data_.begin() + index); |
+ ForgetOpenersAndGroupsReferencing(&(removed_contents->controller())); |
if (empty()) |
closing_all_ = true; |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
@@ -1016,3 +1021,14 @@ bool TabStripModel::OpenerMatches(const TabContentsData* data, |
bool use_group) { |
return data->opener == opener || (use_group && data->group == opener); |
} |
+ |
+void TabStripModel::ForgetOpenersAndGroupsReferencing( |
+ const NavigationController* tab) { |
+ for (TabContentsDataVector::const_iterator i = contents_data_.begin(); |
+ i != contents_data_.end(); ++i) { |
+ if ((*i)->group == tab) |
+ (*i)->group = NULL; |
+ if ((*i)->opener == tab) |
+ (*i)->opener = NULL; |
+ } |
+} |