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 7db00b0305d2977d85908656844297b4778aa92e..d65e126a1f192c8eaa953266d0952a0e829a149e 100644 |
--- a/chrome/browser/tabs/tab_strip_model.cc |
+++ b/chrome/browser/tabs/tab_strip_model.cc |
@@ -17,6 +17,7 @@ |
#include "chrome/browser/metrics/user_metrics.h" |
#include "chrome/browser/profile.h" |
#include "chrome/browser/renderer_host/render_process_host.h" |
+#include "chrome/browser/renderer_host/render_view_host.h" |
#include "chrome/browser/sessions/tab_restore_service.h" |
#include "chrome/browser/tabs/tab_strip_model_order_controller.h" |
#include "chrome/browser/tab_contents/navigation_controller.h" |
@@ -174,7 +175,7 @@ TabContents* TabStripModel::DetachTabContentsAt(int index) { |
TabContents* removed_contents = GetContentsAt(index); |
int next_selected_index = |
order_controller_->DetermineNewSelectedIndex(index, true); |
- delete contents_data_.at(index); |
+ delete contents_data_[index]; |
contents_data_.erase(contents_data_.begin() + index); |
next_selected_index = IndexOfNextNonPhantomTab(next_selected_index, -1); |
if (!HasNonPhantomTabs()) |
@@ -286,7 +287,7 @@ bool TabStripModel::TabsAreLoading() const { |
NavigationController* TabStripModel::GetOpenerOfTabContentsAt(int index) { |
DCHECK(ContainsIndex(index)); |
- return contents_data_.at(index)->opener; |
+ return contents_data_[index]->opener; |
} |
int TabStripModel::GetIndexOfNextTabContentsOpenedBy( |
@@ -378,14 +379,14 @@ void TabStripModel::ForgetAllOpeners() { |
void TabStripModel::ForgetGroup(TabContents* contents) { |
int index = GetIndexOfTabContents(contents); |
DCHECK(ContainsIndex(index)); |
- contents_data_.at(index)->SetGroup(NULL); |
- contents_data_.at(index)->ForgetOpener(); |
+ contents_data_[index]->SetGroup(NULL); |
+ contents_data_[index]->ForgetOpener(); |
} |
bool TabStripModel::ShouldResetGroupOnSelect(TabContents* contents) const { |
int index = GetIndexOfTabContents(contents); |
DCHECK(ContainsIndex(index)); |
- return contents_data_.at(index)->reset_group_on_select; |
+ return contents_data_[index]->reset_group_on_select; |
} |
void TabStripModel::SetTabBlocked(int index, bool blocked) { |
@@ -403,6 +404,14 @@ void TabStripModel::SetTabPinned(int index, bool pinned) { |
if (contents_data_[index]->pinned == pinned) |
return; |
+ // Reroute toplevel requests to the browser if the tab is pinned. This allows |
+ // us to rewrite the WindowOpenDisposition in certain cases. |
+ TabContents* contents = contents_data_[index]->contents; |
+ contents->GetMutableRendererPrefs()->browser_handles_top_level_requests = |
+ pinned; |
+ if (contents->render_view_host()) |
+ contents->render_view_host()->SyncRendererPrefs(); |
+ |
if (IsAppTab(index)) { |
// Changing the pinned state of an app tab doesn't effect it's mini-tab |
// status. |
@@ -421,15 +430,13 @@ void TabStripModel::SetTabPinned(int index, bool pinned) { |
} |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
- TabMiniStateChanged(contents_data_[index]->contents, |
- index)); |
+ TabMiniStateChanged(contents, index)); |
} |
// else: the tab was at the boundary and it's position doesn't need to |
// change. |
FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
- TabPinnedStateChanged(contents_data_[index]->contents, |
- index)); |
+ TabPinnedStateChanged(contents, index)); |
} |
bool TabStripModel::IsTabPinned(int index) const { |
@@ -518,7 +525,7 @@ void TabStripModel::AddTabContents(TabContents* contents, |
// Reset the index, just in case insert ended up moving it on us. |
index = GetIndexOfTabContents(contents); |
if (inherit_group && transition == PageTransition::TYPED) |
- contents_data_.at(index)->reset_group_on_select = true; |
+ contents_data_[index]->reset_group_on_select = true; |
// Ensure that the new TabContentsView begins at the same size as the |
// previous TabContentsView if it existed. Otherwise, the initial WebKit |
@@ -937,7 +944,7 @@ void TabStripModel::InternalCloseTab(TabContents* contents, |
TabContents* TabStripModel::GetContentsAt(int index) const { |
CHECK(ContainsIndex(index)) << |
"Failed to find: " << index << " in: " << count() << " entries."; |
- return contents_data_.at(index)->contents; |
+ return contents_data_[index]->contents; |
} |
void TabStripModel::ChangeSelectedContentsFrom( |
@@ -962,7 +969,7 @@ void TabStripModel::ChangeSelectedContentsFrom( |
void TabStripModel::SetOpenerForContents(TabContents* contents, |
TabContents* opener) { |
int index = GetIndexOfTabContents(contents); |
- contents_data_.at(index)->opener = &opener->controller(); |
+ contents_data_[index]->opener = &opener->controller(); |
} |
void TabStripModel::SelectRelativeTab(bool next) { |
@@ -1050,7 +1057,7 @@ void TabStripModel::MakePhantom(int index) { |
void TabStripModel::MoveTabContentsAtImpl(int index, int to_position, |
bool select_after_move) { |
- TabContentsData* moved_data = contents_data_.at(index); |
+ TabContentsData* moved_data = contents_data_[index]; |
contents_data_.erase(contents_data_.begin() + index); |
contents_data_.insert(contents_data_.begin() + to_position, moved_data); |