diff options
Diffstat (limited to 'chrome/browser/tabs/tab_strip_model.cc')
-rw-r--r-- | chrome/browser/tabs/tab_strip_model.cc | 76 |
1 files changed, 35 insertions, 41 deletions
diff --git a/chrome/browser/tabs/tab_strip_model.cc b/chrome/browser/tabs/tab_strip_model.cc index 2245011..d65e126 100644 --- a/chrome/browser/tabs/tab_strip_model.cc +++ b/chrome/browser/tabs/tab_strip_model.cc @@ -106,18 +106,18 @@ bool TabStripModel::ContainsIndex(int index) const { } void TabStripModel::AppendTabContents(TabContents* contents, bool foreground) { + // Tabs opened in the foreground using this method inherit the group of the + // previously selected tab. int index = order_controller_->DetermineInsertionIndexForAppending(); - InsertTabContentsAt(index, contents, - foreground ? (ADD_INHERIT_GROUP | ADD_SELECTED) : - ADD_NONE); + InsertTabContentsAt(index, contents, foreground, foreground); } void TabStripModel::InsertTabContentsAt(int index, TabContents* contents, - int add_types) { - bool foreground = add_types & ADD_SELECTED; - index = ConstrainInsertionIndex(index, contents->is_app() || - add_types & ADD_PINNED); + bool foreground, + bool inherit_group, + bool pinned) { + index = ConstrainInsertionIndex(index, contents->is_app() || pinned); // In tab dragging situations, if the last tab in the window was detached // then the user aborted the drag, we will have the |closing_all_| member @@ -130,8 +130,8 @@ void TabStripModel::InsertTabContentsAt(int index, // since the old contents and the new contents will be the same... TabContents* selected_contents = GetSelectedTabContents(); TabContentsData* data = new TabContentsData(contents); - data->pinned = (add_types & ADD_PINNED) == ADD_PINNED; - if ((add_types & ADD_INHERIT_GROUP) && selected_contents) { + data->pinned = pinned; + if (inherit_group && selected_contents) { if (foreground) { // Forget any existing relationships, we don't want to make things too // confusing by having multiple groups active at the same time. @@ -151,27 +151,8 @@ void TabStripModel::InsertTabContentsAt(int index, FOR_EACH_OBSERVER(TabStripModelObserver, observers_, TabInsertedAt(contents, index, foreground)); - if (foreground) + if (foreground) { ChangeSelectedContentsFrom(selected_contents, index, false); - - // Ensure that the new TabContentsView begins at the same size as the - // previous TabContentsView if it existed. Otherwise, the initial WebKit - // layout will be performed based on a width of 0 pixels, causing a - // very long, narrow, inaccurate layout. Because some scripts on pages (as - // well as WebKit's anchor link location calculation) are run on the - // initial layout and not recalculated later, we need to ensure the first - // layout is performed with sane view dimensions even when we're opening a - // new background tab. - if (!foreground) { - if (selected_contents) { - contents->view()->SizeContents( - selected_contents->view()->GetContainerSize()); - } - // We need to hide the contents or else we get and execute paints for - // background tabs. With enough background tabs they will steal the - // backing store of the visible tab causing flashing. See bug 20831. - contents->HideContents(); - contents->WasHidden(); } } @@ -180,9 +161,7 @@ void TabStripModel::ReplaceNavigationControllerAt( // This appears to be OK with no flicker since no redraw event // occurs between the call to add an aditional tab and one to close // the previous tab. - InsertTabContentsAt( - index + 1, controller->tab_contents(), - TabStripModel::ADD_SELECTED | TabStripModel::ADD_INHERIT_GROUP); + InsertTabContentsAt(index + 1, controller->tab_contents(), true, true); std::vector<int> closing_tabs; closing_tabs.push_back(index); InternalCloseTabs(closing_tabs, CLOSE_NONE); @@ -507,24 +486,24 @@ int TabStripModel::ConstrainInsertionIndex(int index, bool mini_tab) { void TabStripModel::AddTabContents(TabContents* contents, int index, + bool force_index, PageTransition::Type transition, - int add_types) { + bool foreground) { // If the newly-opened tab is part of the same task as the parent tab, we want // to inherit the parent's "group" attribute, so that if this tab is then // closed we'll jump back to the parent tab. // TODO(jbs): Perhaps instead of trying to infer this we should expose // inherit_group directly to callers, who may have more context - bool inherit_group = (add_types & ADD_INHERIT_GROUP) == ADD_INHERIT_GROUP; + bool inherit_group = false; - if (transition == PageTransition::LINK && - (add_types & ADD_FORCE_INDEX) == 0) { + if (transition == PageTransition::LINK && !force_index) { // We assume tabs opened via link clicks are part of the same task as their // parent. Note that when |force_index| is true (e.g. when the user // drag-and-drops a link to the tab strip), callers aren't really handling // link clicks, they just want to score the navigation like a link click in // the history backend, so we don't inherit the group in this case. index = order_controller_->DetermineInsertionIndex( - contents, transition, add_types & ADD_SELECTED); + contents, transition, foreground); inherit_group = true; } else { // For all other types, respect what was passed to us, normalizing -1s and @@ -542,14 +521,29 @@ void TabStripModel::AddTabContents(TabContents* contents, // is re-selected, not the next-adjacent. inherit_group = true; } - InsertTabContentsAt( - index, contents, - add_types | (inherit_group ? TabStripModel::ADD_INHERIT_GROUP : 0)); + InsertTabContentsAt(index, contents, foreground, inherit_group); // Reset the index, just in case insert ended up moving it on us. index = GetIndexOfTabContents(contents); - if (inherit_group && transition == PageTransition::TYPED) 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 + // layout will be performed based on a width of 0 pixels, causing a + // very long, narrow, inaccurate layout. Because some scripts on pages (as + // well as WebKit's anchor link location calculation) are run on the + // initial layout and not recalculated later, we need to ensure the first + // layout is performed with sane view dimensions even when we're opening a + // new background tab. + if (TabContents* old_contents = GetSelectedTabContents()) { + if (!foreground) { + contents->view()->SizeContents(old_contents->view()->GetContainerSize()); + // We need to hide the contents or else we get and execute paints for + // background tabs. With enough background tabs they will steal the + // backing store of the visible tab causing flashing. See bug 20831. + contents->HideContents(); + } + } } void TabStripModel::CloseSelectedTab() { |