blob: 19c1fc46cc4d2c11a43f26f81fc1b45c702bba63 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include <vector>
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tabs/tab_group_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/tab_groups/tab_group_id.h"
#include "content/public/test/browser_test.h"
#include "url/gurl.h"
namespace {
ui::MouseEvent GetDummyEvent() {
return ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::PointF(), gfx::PointF(),
base::TimeTicks::Now(), 0, 0);
}
} // namespace
// Integration tests for interactions between TabStripModel and TabStrip.
class TabStripBrowsertest : public InProcessBrowserTest {
public:
TabStripModel* tab_strip_model() { return browser()->tab_strip_model(); }
TabStrip* tab_strip() {
return BrowserView::GetBrowserViewForBrowser(browser())->tabstrip();
}
void AppendTab() { chrome::AddTabAt(browser(), GURL(), -1, true); }
tab_groups::TabGroupId AddTabToNewGroup(int tab_index) {
return tab_strip_model()->AddToNewGroup({tab_index});
}
void AddTabToExistingGroup(int tab_index, tab_groups::TabGroupId group) {
tab_strip_model()->AddToExistingGroup({tab_index}, group);
}
std::vector<content::WebContents*> GetWebContentses() {
std::vector<content::WebContents*> contentses;
for (int i = 0; i < tab_strip()->GetTabCount(); ++i)
contentses.push_back(tab_strip_model()->GetWebContentsAt(i));
return contentses;
}
std::vector<content::WebContents*> GetWebContentsesInOrder(
const std::vector<int>& order) {
std::vector<content::WebContents*> contentses;
for (int i = 0; i < tab_strip()->GetTabCount(); ++i)
contentses.push_back(tab_strip_model()->GetWebContentsAt(order[i]));
return contentses;
}
};
// Regression test for crbug.com/983961.
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabAndDeleteGroup) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToNewGroup(2);
Tab* tab0 = tab_strip()->tab_at(0);
Tab* tab1 = tab_strip()->tab_at(1);
Tab* tab2 = tab_strip()->tab_at(2);
tab_strip_model()->AddToExistingGroup({2}, group);
EXPECT_EQ(tab0, tab_strip()->tab_at(0));
EXPECT_EQ(tab2, tab_strip()->tab_at(1));
EXPECT_EQ(tab1, tab_strip()->tab_at(2));
EXPECT_EQ(group, tab_strip_model()->GetTabGroupForTab(1));
std::vector<tab_groups::TabGroupId> groups =
tab_strip_model()->group_model()->ListTabGroups();
EXPECT_EQ(groups.size(), 1U);
EXPECT_EQ(groups[0], group);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabPrevious_Success) {
AppendTab();
AppendTab();
const auto expected = GetWebContentsesInOrder({1, 0, 2});
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabPrevious_AddsToGroup) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
// Instead of moving, the tab should be added to the group.
const auto expected = GetWebContentsesInOrder({0, 1, 2});
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(2));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(2)->group().value(), group);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabPrevious_PastCollapsedGroup_Success) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto expected = GetWebContentsesInOrder({2, 0, 1});
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(2));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
EXPECT_EQ(tab_strip()->tab_at(0)->group(), absl::nullopt);
EXPECT_EQ(tab_strip()->tab_at(1)->group().value(), group);
EXPECT_EQ(tab_strip()->tab_at(2)->group().value(), group);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabPrevious_BetweenTwoCollapsedGroups_Success) {
AppendTab();
AppendTab();
AppendTab();
AppendTab();
tab_groups::TabGroupId group1 = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group1);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group1);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_groups::TabGroupId group2 = AddTabToNewGroup(2);
AddTabToExistingGroup(3, group2);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group2));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group2);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group2));
const auto expected = GetWebContentsesInOrder({0, 1, 4, 2, 3});
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(4));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group1));
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group2));
EXPECT_EQ(tab_strip()->tab_at(0)->group().value(), group1);
EXPECT_EQ(tab_strip()->tab_at(1)->group().value(), group1);
EXPECT_EQ(tab_strip()->tab_at(2)->group(), absl::nullopt);
EXPECT_EQ(tab_strip()->tab_at(3)->group().value(), group2);
EXPECT_EQ(tab_strip()->tab_at(4)->group().value(), group2);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabPrevious_RemovesFromGroup) {
AppendTab();
AppendTab();
AddTabToNewGroup(1);
// Instead of moving, the tab should be removed from the group.
const auto expected = GetWebContentsesInOrder({0, 1, 2});
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(1)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabPrevious_ShiftsBetweenGroups) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToNewGroup(1);
// Instead of moving, the tab should be removed from its old group, then added
// to the new group.
const auto expected = GetWebContentsesInOrder({0, 1, 2});
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(1)->group(), absl::nullopt);
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(1)->group().value(), group);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabPrevious_Failure_EdgeOfTabstrip) {
AppendTab();
AppendTab();
const auto contentses = GetWebContentses();
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(0));
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabPrevious_Failure_Pinned) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
const auto contentses = GetWebContentses();
tab_strip()->ShiftTabPrevious(tab_strip()->tab_at(1));
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabNext_Success) {
AppendTab();
AppendTab();
const auto expected = GetWebContentsesInOrder({1, 0, 2});
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabNext_AddsToGroup) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
// Instead of moving, the tab should be added to the group.
const auto expected = GetWebContentsesInOrder({0, 1, 2});
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(0)->group().value(), group);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabNext_PastCollapsedGroup_Success) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto expected = GetWebContentsesInOrder({1, 2, 0});
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
EXPECT_EQ(tab_strip()->tab_at(0)->group().value(), group);
EXPECT_EQ(tab_strip()->tab_at(1)->group().value(), group);
EXPECT_EQ(tab_strip()->tab_at(2)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabNext_BetweenTwoCollapsedGroups_Success) {
AppendTab();
AppendTab();
AppendTab();
AppendTab();
tab_groups::TabGroupId group1 = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group1);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group1);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_groups::TabGroupId group2 = AddTabToNewGroup(3);
AddTabToExistingGroup(4, group2);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group2));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group2);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group2));
const auto expected = GetWebContentsesInOrder({1, 2, 0, 3, 4});
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group1));
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group2));
EXPECT_EQ(tab_strip()->tab_at(0)->group().value(), group1);
EXPECT_EQ(tab_strip()->tab_at(1)->group().value(), group1);
EXPECT_EQ(tab_strip()->tab_at(2)->group(), absl::nullopt);
EXPECT_EQ(tab_strip()->tab_at(3)->group().value(), group2);
EXPECT_EQ(tab_strip()->tab_at(4)->group().value(), group2);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabNext_RemovesFromGroup) {
AppendTab();
AppendTab();
AddTabToNewGroup(1);
// Instead of moving, the tab should be removed from the group.
const auto expected = GetWebContentsesInOrder({0, 1, 2});
tab_strip()->ShiftTabNext(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(1)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabNext_ShiftsBetweenGroups) {
AppendTab();
AppendTab();
AddTabToNewGroup(0);
tab_groups::TabGroupId group = AddTabToNewGroup(1);
// Instead of moving, the tab should be removed from its old group, then added
// to the new group.
const auto expected = GetWebContentsesInOrder({0, 1, 2});
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(0)->group(), absl::nullopt);
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
EXPECT_EQ(tab_strip()->tab_at(0)->group().value(), group);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftTabNext_Failure_EdgeOfTabstrip) {
AppendTab();
AppendTab();
const auto contentses = GetWebContentses();
tab_strip()->ShiftTabNext(tab_strip()->tab_at(2));
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftTabNext_Failure_Pinned) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
const auto contentses = GetWebContentses();
tab_strip()->ShiftTabNext(tab_strip()->tab_at(0));
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_NoPinnedTabs_Success) {
AppendTab();
AppendTab();
AppendTab();
const auto expected = GetWebContentsesInOrder({2, 0, 1, 3});
tab_strip()->MoveTabFirst(tab_strip()->tab_at(2));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_PinnedTabs_Success) {
AppendTab();
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
const auto expected = GetWebContentsesInOrder({0, 2, 1, 3});
tab_strip()->MoveTabFirst(tab_strip()->tab_at(2));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_DoesNotAddToGroup) {
AppendTab();
AppendTab();
AddTabToNewGroup(0);
tab_strip()->MoveTabFirst(tab_strip()->tab_at(1));
EXPECT_EQ(tab_strip()->tab_at(0)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_RemovesFromGroup) {
AppendTab();
AppendTab();
AddTabToNewGroup(0);
AddTabToNewGroup(1);
tab_strip()->MoveTabFirst(tab_strip()->tab_at(0));
EXPECT_EQ(tab_strip()->tab_at(0)->group(), absl::nullopt);
tab_strip()->MoveTabFirst(tab_strip()->tab_at(1));
EXPECT_EQ(tab_strip()->tab_at(0)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_NoPinnedTabs_Failure) {
AppendTab();
AppendTab();
AppendTab();
const auto contentses = GetWebContentses();
tab_strip()->MoveTabFirst(tab_strip()->tab_at(0));
// No changes expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_PinnedTabs_Failure) {
AppendTab();
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
const auto contentses = GetWebContentses();
tab_strip()->MoveTabFirst(tab_strip()->tab_at(1));
// No changes expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
MoveTabFirst_MovePinnedTab_Success) {
AppendTab();
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_strip_model()->SetTabPinned(1, true);
tab_strip_model()->SetTabPinned(2, true);
const auto expected = GetWebContentsesInOrder({2, 0, 1, 3});
tab_strip()->MoveTabFirst(tab_strip()->tab_at(2));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_NoPinnedTabs_Success) {
AppendTab();
AppendTab();
const auto expected = GetWebContentsesInOrder({1, 2, 0});
tab_strip()->MoveTabLast(tab_strip()->tab_at(0));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_MovePinnedTab_Success) {
AppendTab();
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_strip_model()->SetTabPinned(1, true);
tab_strip_model()->SetTabPinned(2, true);
const auto expected = GetWebContentsesInOrder({0, 2, 1, 3});
tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_AllPinnedTabs_Success) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_strip_model()->SetTabPinned(1, true);
tab_strip_model()->SetTabPinned(2, true);
const auto expected = GetWebContentsesInOrder({0, 2, 1});
tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_DoesNotAddToGroup) {
AppendTab();
AppendTab();
AddTabToNewGroup(2);
tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
EXPECT_EQ(tab_strip()->tab_at(2)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_RemovesFromGroup) {
AppendTab();
AppendTab();
AddTabToNewGroup(1);
AddTabToNewGroup(2);
tab_strip()->MoveTabLast(tab_strip()->tab_at(2));
EXPECT_EQ(tab_strip()->tab_at(2)->group(), absl::nullopt);
tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
EXPECT_EQ(tab_strip()->tab_at(2)->group(), absl::nullopt);
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_NoPinnedTabs_Failure) {
AppendTab();
AppendTab();
const auto contentses = GetWebContentses();
tab_strip()->MoveTabLast(tab_strip()->tab_at(2));
// No changes expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_PinnedTabs_Failure) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_strip_model()->SetTabPinned(1, true);
const auto contentses = GetWebContentses();
tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
// No changes expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_AllPinnedTabs_Failure) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_strip_model()->SetTabPinned(1, true);
tab_strip_model()->SetTabPinned(2, true);
const auto contentses = GetWebContentses();
tab_strip()->MoveTabLast(tab_strip()->tab_at(2));
// No changes expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftGroupLeft_Success) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
const auto expected = GetWebContentsesInOrder({1, 2, 0});
tab_strip()->ShiftGroupLeft(group);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftGroupLeft_OtherGroup) {
AppendTab();
AppendTab();
AppendTab();
tab_groups::TabGroupId group1 = AddTabToNewGroup(2);
AddTabToExistingGroup(3, group1);
tab_groups::TabGroupId group2 = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group2);
const auto expected = GetWebContentsesInOrder({2, 3, 0, 1});
tab_strip()->ShiftGroupLeft(group1);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftGroupLeft_Failure_EdgeOfTabstrip) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group);
const auto contentses = GetWebContentses();
tab_strip()->ShiftGroupLeft(group);
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftGroupLeft_Failure_Pinned) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
const auto contentses = GetWebContentses();
tab_strip()->ShiftGroupLeft(group);
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftGroupRight_Success) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group);
const auto expected = GetWebContentsesInOrder({2, 0, 1});
tab_strip()->ShiftGroupRight(group);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftGroupRight_OtherGroup) {
AppendTab();
AppendTab();
AppendTab();
tab_groups::TabGroupId group1 = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group1);
tab_groups::TabGroupId group2 = AddTabToNewGroup(2);
AddTabToExistingGroup(3, group2);
const auto expected = GetWebContentsesInOrder({2, 3, 0, 1});
tab_strip()->ShiftGroupRight(group1);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftGroupRight_Failure_EdgeOfTabstrip) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
const auto contentses = GetWebContentses();
tab_strip()->ShiftGroupRight(group);
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftCollapsedGroupLeft_Success) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto expected = GetWebContentsesInOrder({1, 2, 0});
tab_strip()->ShiftGroupLeft(group);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftCollapsedGroupLeft_OtherCollapsedGroup) {
AppendTab();
AppendTab();
AppendTab();
AppendTab();
tab_groups::TabGroupId group1 = AddTabToNewGroup(2);
AddTabToExistingGroup(3, group1);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group1);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_groups::TabGroupId group2 = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group2);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group2));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group2);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group2));
const auto expected = GetWebContentsesInOrder({2, 3, 0, 1, 4});
tab_strip()->ShiftGroupLeft(group1);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftCollapsedGroupLeft_Failure_EdgeOfTabstrip) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto contentses = GetWebContentses();
tab_strip()->ShiftGroupLeft(group);
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftCollapsedGroupLeft_Failure_Pinned) {
AppendTab();
AppendTab();
tab_strip_model()->SetTabPinned(0, true);
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto contentses = GetWebContentses();
tab_strip()->ShiftGroupLeft(group);
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, ShiftCollapsedGroupRight_Success) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto expected = GetWebContentsesInOrder({2, 0, 1});
tab_strip()->ShiftGroupRight(group);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftCollapsedGroupRight_OtherCollapsedGroup) {
AppendTab();
AppendTab();
AppendTab();
AppendTab();
tab_groups::TabGroupId group1 = AddTabToNewGroup(0);
AddTabToExistingGroup(1, group1);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group1);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group1));
tab_groups::TabGroupId group2 = AddTabToNewGroup(2);
AddTabToExistingGroup(3, group2);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group2));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group2);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group2));
const auto expected = GetWebContentsesInOrder({2, 3, 0, 1, 4});
tab_strip()->ShiftGroupRight(group1);
EXPECT_EQ(expected, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ShiftCollapsedGroupRight_Failure_EdgeOfTabstrip) {
AppendTab();
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
AddTabToExistingGroup(2, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
const auto contentses = GetWebContentses();
tab_strip()->ShiftGroupRight(group);
// No change expected.
EXPECT_EQ(contentses, GetWebContentses());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
CollapseGroup_WithActiveTabInGroup_SelectsNext) {
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
tab_strip()->SelectTab(tab_strip()->tab_at(0), GetDummyEvent());
ASSERT_EQ(0, tab_strip()->controller()->GetActiveIndex());
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
EXPECT_EQ(1, tab_strip()->controller()->GetActiveIndex());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
CollapseGroup_WithActiveTabInGroup_SelectsPrevious) {
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(1);
tab_strip()->SelectTab(tab_strip()->tab_at(1), GetDummyEvent());
ASSERT_EQ(1, tab_strip()->controller()->GetActiveIndex());
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
EXPECT_EQ(0, tab_strip()->controller()->GetActiveIndex());
}
IN_PROC_BROWSER_TEST_F(
TabStripBrowsertest,
CollapseGroup_WithActiveTabOutsideGroup_DoesNotChangeActiveTab) {
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
tab_strip()->SelectTab(tab_strip()->tab_at(1), GetDummyEvent());
ASSERT_EQ(1, tab_strip()->controller()->GetActiveIndex());
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
EXPECT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
EXPECT_EQ(1, tab_strip()->controller()->GetActiveIndex());
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, CollapseGroup_Fails) {
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
tab_strip_model()->AddToExistingGroup({1}, group);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
EXPECT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
}
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
ActivateTabInCollapsedGroup_ExpandsCollapsedGroup) {
AppendTab();
tab_groups::TabGroupId group = AddTabToNewGroup(0);
ASSERT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
tab_strip()->controller()->ToggleTabGroupCollapsedState(group);
ASSERT_TRUE(tab_strip()->controller()->IsGroupCollapsed(group));
ASSERT_EQ(1, tab_strip()->controller()->GetActiveIndex());
tab_strip()->SelectTab(tab_strip()->tab_at(0), GetDummyEvent());
EXPECT_FALSE(tab_strip()->controller()->IsGroupCollapsed(group));
}
// Tests IDC_SELECT_TAB_0, IDC_SELECT_NEXT_TAB, IDC_SELECT_PREVIOUS_TAB and
// IDC_SELECT_LAST_TAB. The tab navigation accelerators should ignore tabs in
// collapsed groups.
IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, TabGroupTabNavigationAccelerators) {
// Create five tabs.
for (int i = 0; i < 4; i++)
AppendTab();
ASSERT_EQ(5, tab_strip_model()->count());
// Add the first, second, and last tab into their own collapsed groups.
tab_groups::TabGroupId group1 = tab_strip_model()->AddToNewGroup({0});
tab_groups::TabGroupId group2 = tab_strip_model()->AddToNewGroup({1});
tab_groups::TabGroupId group3 = tab_strip_model()->AddToNewGroup({4});
tab_strip()->controller()->ToggleTabGroupCollapsedState(group1);
tab_strip()->controller()->ToggleTabGroupCollapsedState(group2);
tab_strip()->controller()->ToggleTabGroupCollapsedState(group3);
// Select the fourth tab.
tab_strip_model()->ActivateTabAt(3);
CommandUpdater* updater = browser()->command_controller();
// Navigate to the first tab using an accelerator.
updater->ExecuteCommand(IDC_SELECT_TAB_0);
ASSERT_EQ(2, tab_strip_model()->active_index());
// Navigate back to the first tab using the previous accelerators.
updater->ExecuteCommand(IDC_SELECT_PREVIOUS_TAB);
ASSERT_EQ(3, tab_strip_model()->active_index());
// Navigate to the second tab using the next accelerators.
updater->ExecuteCommand(IDC_SELECT_NEXT_TAB);
ASSERT_EQ(2, tab_strip_model()->active_index());
// Navigate to the last tab using the select last accelerator.
updater->ExecuteCommand(IDC_SELECT_LAST_TAB);
ASSERT_EQ(3, tab_strip_model()->active_index());
}