| Index: chrome/browser/ui/tabs/tab_strip_model_unittest.cc
|
| diff --git a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
|
| index 5ae32f53348ef9c9c1a43f7a93949a7b9f387051..bd78d5da8f89ad6177664a3215cee0824f3eb0d9 100644
|
| --- a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
|
| +++ b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
|
| @@ -863,6 +863,115 @@ TEST_F(TabStripModelTest, TestInsertionIndexDetermination) {
|
| EXPECT_TRUE(tabstrip.empty());
|
| }
|
|
|
| +// Tests that non-adjacent tabs with an opener are ignored when deciding where
|
| +// to position tabs.
|
| +TEST_F(TabStripModelTest, TestInsertionIndexDeterminationAfterDragged) {
|
| + TabStripDummyDelegate delegate;
|
| + TabStripModel tabstrip(&delegate, profile());
|
| + EXPECT_TRUE(tabstrip.empty());
|
| +
|
| + // Start with three tabs, of which the first is active.
|
| + WebContents* opener1 = CreateWebContentsWithID(1);
|
| + tabstrip.AppendWebContents(opener1, true /* foreground */);
|
| + tabstrip.AppendWebContents(CreateWebContentsWithID(2), false);
|
| + tabstrip.AppendWebContents(CreateWebContentsWithID(3), false);
|
| + EXPECT_EQ("1 2 3", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| + EXPECT_EQ(-1, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| +
|
| + // Open a link in a new background tab.
|
| + tabstrip.InsertWebContentsAt(GetInsertionIndex(&tabstrip),
|
| + CreateWebContentsWithID(11),
|
| + TabStripModel::ADD_INHERIT_GROUP);
|
| + EXPECT_EQ("1 11 2 3", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| + EXPECT_EQ(1, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| +
|
| + // Drag that tab (which activates it) one to the right.
|
| + tabstrip.MoveWebContentsAt(1, 2, true /* select_after_move */);
|
| + EXPECT_EQ("1 2 11 3", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(11, GetID(tabstrip.GetActiveWebContents()));
|
| + // It should no longer be counted by GetIndexOfLastWebContentsOpenedBy,
|
| + // since there is a tab in between, even though its opener is unchanged.
|
| + // TODO(johnme): Maybe its opener should be reset when it's dragged away.
|
| + EXPECT_EQ(-1, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| + EXPECT_EQ(opener1, tabstrip.GetOpenerOfWebContentsAt(2));
|
| +
|
| + // Activate the parent tab again.
|
| + tabstrip.ActivateTabAt(0, true /* user_gesture */);
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| +
|
| + // Open another link in a new background tab.
|
| + tabstrip.InsertWebContentsAt(GetInsertionIndex(&tabstrip),
|
| + CreateWebContentsWithID(12),
|
| + TabStripModel::ADD_INHERIT_GROUP);
|
| + // Tab 12 should be next to 1, and considered opened by it.
|
| + EXPECT_EQ("1 12 2 11 3", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| + EXPECT_EQ(1, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| +
|
| + tabstrip.CloseAllTabs();
|
| + EXPECT_TRUE(tabstrip.empty());
|
| +}
|
| +
|
| +// Tests that grandchild tabs are considered to be opened by their grandparent
|
| +// tab when deciding where to position tabs.
|
| +TEST_F(TabStripModelTest, TestInsertionIndexDeterminationNestedOpener) {
|
| + TabStripDummyDelegate delegate;
|
| + TabStripModel tabstrip(&delegate, profile());
|
| + EXPECT_TRUE(tabstrip.empty());
|
| +
|
| + // Start with two tabs, of which the first is active:
|
| + WebContents* opener1 = CreateWebContentsWithID(1);
|
| + tabstrip.AppendWebContents(opener1, true /* foreground */);
|
| + tabstrip.AppendWebContents(CreateWebContentsWithID(2), false);
|
| + EXPECT_EQ("1 2", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| + EXPECT_EQ(-1, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| +
|
| + // Open a link in a new background child tab.
|
| + WebContents* child11 = CreateWebContentsWithID(11);
|
| + tabstrip.InsertWebContentsAt(GetInsertionIndex(&tabstrip),
|
| + child11,
|
| + TabStripModel::ADD_INHERIT_GROUP);
|
| + EXPECT_EQ("1 11 2", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| + EXPECT_EQ(1, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| +
|
| + // Activate the child tab:
|
| + tabstrip.ActivateTabAt(1, true /* user_gesture */);
|
| + EXPECT_EQ(11, GetID(tabstrip.GetActiveWebContents()));
|
| +
|
| + // Open a link in a new background grandchild tab.
|
| + tabstrip.InsertWebContentsAt(GetInsertionIndex(&tabstrip),
|
| + CreateWebContentsWithID(111),
|
| + TabStripModel::ADD_INHERIT_GROUP);
|
| + EXPECT_EQ("1 11 111 2", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(11, GetID(tabstrip.GetActiveWebContents()));
|
| + // The grandchild tab should be counted by GetIndexOfLastWebContentsOpenedBy
|
| + // as opened by both its parent (child11) and grandparent (opener1).
|
| + EXPECT_EQ(2, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| + EXPECT_EQ(2, tabstrip.GetIndexOfLastWebContentsOpenedBy(child11, 1));
|
| +
|
| + // Activate the parent tab again:
|
| + tabstrip.ActivateTabAt(0, true /* user_gesture */);
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| +
|
| + // Open another link in a new background child tab (a sibling of child11).
|
| + tabstrip.InsertWebContentsAt(GetInsertionIndex(&tabstrip),
|
| + CreateWebContentsWithID(12),
|
| + TabStripModel::ADD_INHERIT_GROUP);
|
| + EXPECT_EQ("1 11 111 12 2", GetTabStripStateString(tabstrip));
|
| + EXPECT_EQ(1, GetID(tabstrip.GetActiveWebContents()));
|
| + // opener1 has three adjacent descendants (11, 111, 12)
|
| + EXPECT_EQ(3, tabstrip.GetIndexOfLastWebContentsOpenedBy(opener1, 0));
|
| + // child11 has only one adjacent descendant (111)
|
| + EXPECT_EQ(2, tabstrip.GetIndexOfLastWebContentsOpenedBy(child11, 1));
|
| +
|
| + tabstrip.CloseAllTabs();
|
| + EXPECT_TRUE(tabstrip.empty());
|
| +}
|
| +
|
| // Tests that selection is shifted to the correct tab when a tab is closed.
|
| // If a tab is in the background when it is closed, the selection does not
|
| // change.
|
|
|