Commit 5cd14eef authored by Collin Baker's avatar Collin Baker Committed by Commit Bot

Eagerly create tab_groups_ entries in FakeBaseTabStripController

tab_groups_ maps tab model indices to group IDs. This was managed
lazily: entries were created on grouping changes, not as tabs are
added and removed. This is difficult to manage and led to a crash in a
test I was writing.

With this change the entries are created in AddTab() and
AddPinnedTab(). tab_groups_.size() will always match num_tabs_.

Several tests using TabStrip::AddTabAt() directly had to be migrated
to use FakeBaseTabStripController::AddTab(). They relied on the lazy
tab group management and the fact that |tab_groups_.size()| could be
greater than |num_tabs_|.

While I was in there, I migrated all tests to using
FakeBaseTabStripController methods where possible.

Bug: None
Change-Id: I604fd1fca7f0349ad687210fae7ae35452ab1635
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2518250Reviewed-by: default avatarTaylor Bergquist <tbergquist@chromium.org>
Commit-Queue: Collin Baker <collinbaker@chromium.org>
Cr-Commit-Position: refs/heads/master@{#824228}
parent 454cf29b
...@@ -21,6 +21,8 @@ FakeBaseTabStripController::~FakeBaseTabStripController() { ...@@ -21,6 +21,8 @@ FakeBaseTabStripController::~FakeBaseTabStripController() {
void FakeBaseTabStripController::AddTab(int index, bool is_active) { void FakeBaseTabStripController::AddTab(int index, bool is_active) {
num_tabs_++; num_tabs_++;
tab_groups_.insert(tab_groups_.begin() + index, base::nullopt);
tab_strip_->AddTabAt(index, TabRendererData(), is_active); tab_strip_->AddTabAt(index, TabRendererData(), is_active);
if (is_active) { if (is_active) {
SelectTab(index, SelectTab(index,
...@@ -30,22 +32,19 @@ void FakeBaseTabStripController::AddTab(int index, bool is_active) { ...@@ -30,22 +32,19 @@ void FakeBaseTabStripController::AddTab(int index, bool is_active) {
} }
void FakeBaseTabStripController::AddPinnedTab(int index, bool is_active) { void FakeBaseTabStripController::AddPinnedTab(int index, bool is_active) {
num_tabs_++;
tab_groups_.insert(tab_groups_.begin() + index, base::nullopt);
TabRendererData data; TabRendererData data;
data.pinned = true; data.pinned = true;
num_tabs_++;
tab_strip_->AddTabAt(index, std::move(data), is_active); tab_strip_->AddTabAt(index, std::move(data), is_active);
if (is_active) if (is_active)
active_index_ = index; active_index_ = index;
} }
void FakeBaseTabStripController::MoveTab(int from_index, int to_index) { void FakeBaseTabStripController::MoveTab(int from_index, int to_index) {
base::Optional<tab_groups::TabGroupId> prev_group; base::Optional<tab_groups::TabGroupId> prev_group = tab_groups_[from_index];
if (from_index < int{tab_groups_.size()}) { tab_groups_.erase(tab_groups_.begin() + from_index);
prev_group = tab_groups_[from_index];
tab_groups_.erase(tab_groups_.begin() + from_index);
}
if (to_index >= int{tab_groups_.size()})
tab_groups_.resize(to_index + 1);
tab_groups_.insert(tab_groups_.begin() + to_index, prev_group); tab_groups_.insert(tab_groups_.begin() + to_index, prev_group);
tab_strip_->MoveTab(from_index, to_index, TabRendererData()); tab_strip_->MoveTab(from_index, to_index, TabRendererData());
} }
...@@ -63,6 +62,8 @@ bool FakeBaseTabStripController::ToggleTabGroupCollapsedState( ...@@ -63,6 +62,8 @@ bool FakeBaseTabStripController::ToggleTabGroupCollapsedState(
void FakeBaseTabStripController::RemoveTab(int index) { void FakeBaseTabStripController::RemoveTab(int index) {
num_tabs_--; num_tabs_--;
tab_groups_.erase(tab_groups_.begin() + index);
// RemoveTabAt() expects the controller state to have been updated already. // RemoveTabAt() expects the controller state to have been updated already.
const bool was_active = index == active_index_; const bool was_active = index == active_index_;
if (was_active) { if (was_active) {
...@@ -116,11 +117,7 @@ void FakeBaseTabStripController::MoveTabIntoGroup( ...@@ -116,11 +117,7 @@ void FakeBaseTabStripController::MoveTabIntoGroup(
int index, int index,
base::Optional<tab_groups::TabGroupId> new_group) { base::Optional<tab_groups::TabGroupId> new_group) {
bool group_exists = base::Contains(tab_groups_, new_group); bool group_exists = base::Contains(tab_groups_, new_group);
base::Optional<tab_groups::TabGroupId> old_group; base::Optional<tab_groups::TabGroupId> old_group = tab_groups_[index];
if (index >= int{tab_groups_.size()})
tab_groups_.resize(index + 1);
else
old_group = tab_groups_[index];
tab_groups_[index] = new_group; tab_groups_[index] = new_group;
......
...@@ -256,22 +256,13 @@ TEST_P(TabStripTest, GetModelCount) { ...@@ -256,22 +256,13 @@ TEST_P(TabStripTest, GetModelCount) {
TEST_P(TabStripTest, AccessibilityEvents) { TEST_P(TabStripTest, AccessibilityEvents) {
views::test::AXEventCounter ax_counter(views::AXEventManager::Get()); views::test::AXEventCounter ax_counter(views::AXEventManager::Get());
// When adding tabs, SetSelection() is called after AddTabAt(), as controller_->AddTab(0, false);
// otherwise the index would not be meaningful. controller_->AddTab(1, true);
tab_strip_->AddTabAt(0, TabRendererData(), false);
tab_strip_->AddTabAt(1, TabRendererData(), true);
ui::ListSelectionModel selection;
selection.SetSelectedIndex(1);
tab_strip_->SetSelection(selection);
EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd)); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd));
EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kSelection)); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kSelection));
EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove)); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove));
// When removing tabs, SetSelection() is called before RemoveTabAt(), as controller_->RemoveTab(1);
// otherwise the index would not be meaningful.
selection.SetSelectedIndex(0);
tab_strip_->SetSelection(selection);
tab_strip_->RemoveTabAt(nullptr, 1, true);
EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd)); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd));
EXPECT_EQ(2, ax_counter.GetCount(ax::mojom::Event::kSelection)); EXPECT_EQ(2, ax_counter.GetCount(ax::mojom::Event::kSelection));
EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove)); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove));
...@@ -285,17 +276,17 @@ TEST_P(TabStripTest, AccessibilityEvents) { ...@@ -285,17 +276,17 @@ TEST_P(TabStripTest, AccessibilityEvents) {
TEST_P(TabStripTest, AccessibilityData) { TEST_P(TabStripTest, AccessibilityData) {
// When adding tabs, indexes should be set. // When adding tabs, indexes should be set.
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
tab_strip_->AddTabAt(1, TabRendererData(), true); controller_->AddTab(1, true);
VerifyTabIndices(); VerifyTabIndices();
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
VerifyTabIndices(); VerifyTabIndices();
tab_strip_->RemoveTabAt(nullptr, 1, false); controller_->RemoveTab(1);
VerifyTabIndices(); VerifyTabIndices();
tab_strip_->MoveTab(1, 0, TabRendererData()); controller_->MoveTab(1, 0);
VerifyTabIndices(); VerifyTabIndices();
} }
...@@ -309,7 +300,7 @@ TEST_P(TabStripTest, tab_count) { ...@@ -309,7 +300,7 @@ TEST_P(TabStripTest, tab_count) {
TEST_P(TabStripTest, AddTabAt) { TEST_P(TabStripTest, AddTabAt) {
TestTabStripObserver observer(tab_strip_); TestTabStripObserver observer(tab_strip_);
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
ASSERT_EQ(1, tab_strip_->tab_count()); ASSERT_EQ(1, tab_strip_->tab_count());
EXPECT_EQ(0, observer.last_tab_added()); EXPECT_EQ(0, observer.last_tab_added());
Tab* tab = tab_strip_->tab_at(0); Tab* tab = tab_strip_->tab_at(0);
...@@ -318,13 +309,13 @@ TEST_P(TabStripTest, AddTabAt) { ...@@ -318,13 +309,13 @@ TEST_P(TabStripTest, AddTabAt) {
TEST_P(TabStripTest, MoveTab) { TEST_P(TabStripTest, MoveTab) {
TestTabStripObserver observer(tab_strip_); TestTabStripObserver observer(tab_strip_);
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
tab_strip_->AddTabAt(1, TabRendererData(), false); controller_->AddTab(1, false);
tab_strip_->AddTabAt(2, TabRendererData(), false); controller_->AddTab(2, false);
ASSERT_EQ(3, tab_strip_->tab_count()); ASSERT_EQ(3, tab_strip_->tab_count());
EXPECT_EQ(2, observer.last_tab_added()); EXPECT_EQ(2, observer.last_tab_added());
Tab* tab = tab_strip_->tab_at(0); Tab* tab = tab_strip_->tab_at(0);
tab_strip_->MoveTab(0, 1, TabRendererData()); controller_->MoveTab(0, 1);
EXPECT_EQ(0, observer.last_tab_moved_from()); EXPECT_EQ(0, observer.last_tab_moved_from());
EXPECT_EQ(1, observer.last_tab_moved_to()); EXPECT_EQ(1, observer.last_tab_moved_to());
EXPECT_EQ(tab, tab_strip_->tab_at(1)); EXPECT_EQ(tab, tab_strip_->tab_at(1));
...@@ -361,13 +352,13 @@ TEST_P(TabStripTest, TabViewOrder) { ...@@ -361,13 +352,13 @@ TEST_P(TabStripTest, TabViewOrder) {
controller_->AddTab(2, false); controller_->AddTab(2, false);
EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder()); EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder());
tab_strip_->MoveTab(0, 1, TabRendererData()); controller_->MoveTab(0, 1);
EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder()); EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder());
tab_strip_->MoveTab(1, 2, TabRendererData()); controller_->MoveTab(1, 2);
EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder()); EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder());
tab_strip_->MoveTab(1, 0, TabRendererData()); controller_->MoveTab(1, 0);
EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder()); EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder());
tab_strip_->MoveTab(0, 2, TabRendererData()); controller_->MoveTab(0, 2);
EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder()); EXPECT_EQ(GetTabSlotViewsInFocusOrder(), GetTabSlotViewsInVisualOrder());
} }
...@@ -1085,7 +1076,7 @@ TEST_P(TabStripTest, EventsOnClosingTab) { ...@@ -1085,7 +1076,7 @@ TEST_P(TabStripTest, EventsOnClosingTab) {
TEST_P(TabStripTest, GroupHeaderBasics) { TEST_P(TabStripTest, GroupHeaderBasics) {
tab_strip_parent_->SetBounds(0, 0, 1000, 100); tab_strip_parent_->SetBounds(0, 0, 1000, 100);
bounds_animator()->SetAnimationDuration(base::TimeDelta()); bounds_animator()->SetAnimationDuration(base::TimeDelta());
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
Tab* tab = tab_strip_->tab_at(0); Tab* tab = tab_strip_->tab_at(0);
const int first_slot_x = tab->x(); const int first_slot_x = tab->x();
...@@ -1108,8 +1099,8 @@ TEST_P(TabStripTest, GroupHeaderBetweenTabs) { ...@@ -1108,8 +1099,8 @@ TEST_P(TabStripTest, GroupHeaderBetweenTabs) {
tab_strip_parent_->SetBounds(0, 0, 1000, 100); tab_strip_parent_->SetBounds(0, 0, 1000, 100);
bounds_animator()->SetAnimationDuration(base::TimeDelta()); bounds_animator()->SetAnimationDuration(base::TimeDelta());
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
tab_strip_->AddTabAt(1, TabRendererData(), false); controller_->AddTab(1, false);
const int second_slot_x = tab_strip_->tab_at(1)->x(); const int second_slot_x = tab_strip_->tab_at(1)->x();
...@@ -1124,7 +1115,7 @@ TEST_P(TabStripTest, GroupHeaderBetweenTabs) { ...@@ -1124,7 +1115,7 @@ TEST_P(TabStripTest, GroupHeaderBetweenTabs) {
TEST_P(TabStripTest, GroupHeaderMovesRightWithTab) { TEST_P(TabStripTest, GroupHeaderMovesRightWithTab) {
tab_strip_parent_->SetBounds(0, 0, 2000, 100); tab_strip_parent_->SetBounds(0, 0, 2000, 100);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
tab_strip_->AddTabAt(i, TabRendererData(), false); controller_->AddTab(i, false);
base::Optional<tab_groups::TabGroupId> group = base::Optional<tab_groups::TabGroupId> group =
tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId::GenerateNew();
controller_->MoveTabIntoGroup(1, group); controller_->MoveTabIntoGroup(1, group);
...@@ -1142,7 +1133,7 @@ TEST_P(TabStripTest, GroupHeaderMovesRightWithTab) { ...@@ -1142,7 +1133,7 @@ TEST_P(TabStripTest, GroupHeaderMovesRightWithTab) {
TEST_P(TabStripTest, GroupHeaderMovesLeftWithTab) { TEST_P(TabStripTest, GroupHeaderMovesLeftWithTab) {
tab_strip_parent_->SetBounds(0, 0, 2000, 100); tab_strip_parent_->SetBounds(0, 0, 2000, 100);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
tab_strip_->AddTabAt(i, TabRendererData(), false); controller_->AddTab(i, false);
base::Optional<tab_groups::TabGroupId> group = base::Optional<tab_groups::TabGroupId> group =
tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId::GenerateNew();
controller_->MoveTabIntoGroup(2, group); controller_->MoveTabIntoGroup(2, group);
...@@ -1160,7 +1151,7 @@ TEST_P(TabStripTest, GroupHeaderMovesLeftWithTab) { ...@@ -1160,7 +1151,7 @@ TEST_P(TabStripTest, GroupHeaderMovesLeftWithTab) {
TEST_P(TabStripTest, GroupHeaderDoesntMoveReorderingTabsInGroup) { TEST_P(TabStripTest, GroupHeaderDoesntMoveReorderingTabsInGroup) {
tab_strip_parent_->SetBounds(0, 0, 2000, 100); tab_strip_parent_->SetBounds(0, 0, 2000, 100);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
tab_strip_->AddTabAt(i, TabRendererData(), false); controller_->AddTab(i, false);
base::Optional<tab_groups::TabGroupId> group = base::Optional<tab_groups::TabGroupId> group =
tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId::GenerateNew();
controller_->MoveTabIntoGroup(1, group); controller_->MoveTabIntoGroup(1, group);
...@@ -1186,7 +1177,7 @@ TEST_P(TabStripTest, GroupHeaderDoesntMoveReorderingTabsInGroup) { ...@@ -1186,7 +1177,7 @@ TEST_P(TabStripTest, GroupHeaderDoesntMoveReorderingTabsInGroup) {
TEST_P(TabStripTest, GroupHeaderMovesOnRegrouping) { TEST_P(TabStripTest, GroupHeaderMovesOnRegrouping) {
tab_strip_parent_->SetBounds(0, 0, 2000, 100); tab_strip_parent_->SetBounds(0, 0, 2000, 100);
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
tab_strip_->AddTabAt(i, TabRendererData(), false); controller_->AddTab(i, false);
tab_groups::TabGroupId group0 = tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId group0 = tab_groups::TabGroupId::GenerateNew();
controller_->MoveTabIntoGroup(0, group0); controller_->MoveTabIntoGroup(0, group0);
tab_groups::TabGroupId group1 = tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId group1 = tab_groups::TabGroupId::GenerateNew();
...@@ -1215,7 +1206,7 @@ TEST_P(TabStripTest, GroupHeaderMovesOnRegrouping) { ...@@ -1215,7 +1206,7 @@ TEST_P(TabStripTest, GroupHeaderMovesOnRegrouping) {
TEST_P(TabStripTest, UngroupedTabMovesLeftOfHeader) { TEST_P(TabStripTest, UngroupedTabMovesLeftOfHeader) {
tab_strip_parent_->SetBounds(0, 0, 2000, 100); tab_strip_parent_->SetBounds(0, 0, 2000, 100);
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
tab_strip_->AddTabAt(i, TabRendererData(), false); controller_->AddTab(i, false);
tab_groups::TabGroupId group = tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId group = tab_groups::TabGroupId::GenerateNew();
controller_->MoveTabIntoGroup(0, group); controller_->MoveTabIntoGroup(0, group);
CompleteAnimationAndLayout(); CompleteAnimationAndLayout();
...@@ -1234,9 +1225,9 @@ TEST_P(TabStripTest, DiscontinuousGroup) { ...@@ -1234,9 +1225,9 @@ TEST_P(TabStripTest, DiscontinuousGroup) {
tab_strip_parent_->SetBounds(0, 0, 1000, 100); tab_strip_parent_->SetBounds(0, 0, 1000, 100);
bounds_animator()->SetAnimationDuration(base::TimeDelta()); bounds_animator()->SetAnimationDuration(base::TimeDelta());
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
tab_strip_->AddTabAt(1, TabRendererData(), false); controller_->AddTab(1, false);
tab_strip_->AddTabAt(2, TabRendererData(), false); controller_->AddTab(2, false);
const int first_slot_x = tab_strip_->tab_at(0)->x(); const int first_slot_x = tab_strip_->tab_at(0)->x();
...@@ -1251,8 +1242,8 @@ TEST_P(TabStripTest, DiscontinuousGroup) { ...@@ -1251,8 +1242,8 @@ TEST_P(TabStripTest, DiscontinuousGroup) {
} }
TEST_P(TabStripTest, DeleteTabGroupViewsWhenEmpty) { TEST_P(TabStripTest, DeleteTabGroupViewsWhenEmpty) {
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
tab_strip_->AddTabAt(1, TabRendererData(), false); controller_->AddTab(1, false);
base::Optional<tab_groups::TabGroupId> group = base::Optional<tab_groups::TabGroupId> group =
tab_groups::TabGroupId::GenerateNew(); tab_groups::TabGroupId::GenerateNew();
controller_->MoveTabIntoGroup(0, group); controller_->MoveTabIntoGroup(0, group);
...@@ -1323,7 +1314,7 @@ TEST_P(TabStripTest, GroupHighlightBasics) { ...@@ -1323,7 +1314,7 @@ TEST_P(TabStripTest, GroupHighlightBasics) {
TEST_P(TabStripTest, ChangingLayoutTypeResizesTabs) { TEST_P(TabStripTest, ChangingLayoutTypeResizesTabs) {
tab_strip_parent_->SetBounds(0, 0, 1000, 100); tab_strip_parent_->SetBounds(0, 0, 1000, 100);
tab_strip_->AddTabAt(0, TabRendererData(), false); controller_->AddTab(0, false);
Tab* tab = tab_strip_->tab_at(0); Tab* tab = tab_strip_->tab_at(0);
const int initial_height = tab->height(); const int initial_height = tab->height();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment