Skip to content

Commit a82afcb

Browse files
committed
Uplift of #25983 (squashed) to beta
1 parent 9731eea commit a82afcb

File tree

7 files changed

+58
-42
lines changed

7 files changed

+58
-42
lines changed

browser/ui/tabs/brave_tab_strip_model.cc

-25
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,14 @@
1010
#include <iterator>
1111
#include <vector>
1212

13-
#include "base/containers/adapters.h"
1413
#include "base/containers/span.h"
1514
#include "base/ranges/algorithm.h"
1615
#include "brave/browser/ui/brave_browser_window.h"
17-
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
1816
#include "brave/components/constants/pref_names.h"
1917
#include "chrome/browser/profiles/profile.h"
2018
#include "chrome/browser/ui/browser.h"
2119
#include "chrome/browser/ui/browser_finder.h"
2220
#include "chrome/browser/ui/browser_window.h"
23-
#include "chrome/browser/ui/tabs/tab_group_model.h"
2421
#include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
2522
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
2623
#include "components/prefs/pref_service.h"
@@ -48,28 +45,6 @@ void BraveTabStripModel::SelectRelativeTab(TabRelativeDirection direction,
4845
}
4946
}
5047

51-
void BraveTabStripModel::ExecuteContextMenuCommand(
52-
int context_index,
53-
ContextMenuCommand command_id) {
54-
Browser* browser = chrome::FindBrowserWithTab(GetWebContentsAt(0));
55-
if (tabs::utils::ShouldShowVerticalTabs(browser) &&
56-
command_id == CommandTogglePinned && WillContextMenuPin(context_index)) {
57-
// For vertical tabs, we need to ungroup the tabs before pinning tabs in
58-
// order to avoid NOTREACHED.
59-
// https://github.com/brave/brave-browser/issues/40201
60-
auto indices = GetIndicesForCommand(context_index);
61-
for (auto index : base::Reversed(indices)) {
62-
if (!GetTabGroupForTab(index).has_value()) {
63-
continue;
64-
}
65-
66-
RemoveFromGroup({index});
67-
}
68-
}
69-
70-
TabStripModel::ExecuteContextMenuCommand(context_index, command_id);
71-
}
72-
7348
void BraveTabStripModel::SelectMRUTab(TabRelativeDirection direction,
7449
TabStripUserGestureDetails detail) {
7550
if (mru_cycle_list_.empty()) {

browser/ui/tabs/brave_tab_strip_model.h

-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ class BraveTabStripModel : public TabStripModel {
4545
// TabStripModel:
4646
void SelectRelativeTab(TabRelativeDirection direction,
4747
TabStripUserGestureDetails detail) override;
48-
void ExecuteContextMenuCommand(int context_index,
49-
ContextMenuCommand command_id) override;
5048

5149
private:
5250
// List of tab indexes sorted by most recently used

browser/ui/views/tabs/brave_tab.cc

+18
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <algorithm>
99
#include <optional>
10+
#include <utility>
1011

1112
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
1213
#include "brave/browser/ui/tabs/brave_tab_prefs.h"
@@ -193,3 +194,20 @@ void BraveTab::UpdateShadowForActiveTab() {
193194
DestroyLayer();
194195
}
195196
}
197+
198+
void BraveTab::SetData(TabRendererData data) {
199+
const bool data_changed = data != data_;
200+
Tab::SetData(std::move(data));
201+
202+
// Our vertical tab uses CompoundTabContainer.
203+
// When tab is moved from the group by pinning, it's moved to
204+
// pinned TabContainerImpl before its tab group id is cleared.
205+
// And it causes runtime crash as using this tab from pinned TabContainerImpl
206+
// has assumption that it's not included in any group.
207+
// So, clear in-advance when tab enters to pinned TabContainerImpl.
208+
if (data_changed &&
209+
tabs::utils::ShouldShowVerticalTabs(controller()->GetBrowser()) &&
210+
data_.pinned) {
211+
set_group(std::nullopt);
212+
}
213+
}

browser/ui/views/tabs/brave_tab.h

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class BraveTab : public Tab {
4040
void MaybeAdjustLeftForPinnedTab(gfx::Rect* bounds,
4141
int visual_width) const override;
4242
gfx::Insets GetInsets() const override;
43+
void SetData(TabRendererData data) override;
4344

4445
private:
4546
friend class BraveTabTest;

browser/ui/views/tabs/vertical_tab_strip_browsertest.cc

+37-13
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,23 @@ class VerticalTabStripBrowserTest : public InProcessBrowserTest {
138138
browser_non_client_frame_view()->DeprecatedLayoutImmediately();
139139
}
140140

141+
void AppendTab(Browser* browser) {
142+
chrome::AddTabAt(browser, GURL(), -1, true);
143+
}
144+
145+
tab_groups::TabGroupId AddTabToNewGroup(Browser* browser, int tab_index) {
146+
return browser->tab_strip_model()->AddToNewGroup({tab_index});
147+
}
148+
149+
void AddTabToExistingGroup(Browser* browser,
150+
int tab_index,
151+
tab_groups::TabGroupId group) {
152+
ASSERT_TRUE(browser->tab_strip_model()->SupportsTabGroups());
153+
browser->tab_strip_model()->AddToExistingGroup({tab_index}, group);
154+
}
155+
141156
TabStrip* GetTabStrip(Browser* browser) {
142-
BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
143-
return browser_view->tabstrip();
157+
return BrowserView::GetBrowserViewForBrowser(browser)->tabstrip();
144158
}
145159

146160
Tab* GetTabAt(Browser* browser, int index) {
@@ -301,7 +315,7 @@ IN_PROC_BROWSER_TEST_F(VerticalTabStripBrowserTest, MinHeight) {
301315
ToggleVerticalTabStrip();
302316

303317
// Add a tab to flush cached min size.
304-
chrome::AddTabAt(browser(), {}, -1, true);
318+
AppendTab(browser());
305319

306320
const auto browser_view_min_size = browser_view()->GetMinimumSize();
307321
const auto browser_non_client_frame_view_min_size =
@@ -311,7 +325,7 @@ IN_PROC_BROWSER_TEST_F(VerticalTabStripBrowserTest, MinHeight) {
311325
auto tab_strip_min_height =
312326
browser_view()->tab_strip_region_view()->GetMinimumSize().height();
313327
for (int i = 0; i < 10; i++) {
314-
chrome::AddTabAt(browser(), {}, -1, true);
328+
AppendTab(browser());
315329
}
316330
ASSERT_LE(tab_strip_min_height,
317331
browser_view()->tab_strip_region_view()->GetMinimumSize().height());
@@ -463,7 +477,7 @@ IN_PROC_BROWSER_TEST_F(VerticalTabStripBrowserTest, LayoutSanity) {
463477

464478
ToggleVerticalTabStrip();
465479

466-
chrome::AddTabAt(browser(), {}, -1, true);
480+
AppendTab(browser());
467481

468482
auto* widget_delegate_view =
469483
browser_view()->vertical_tab_strip_widget_delegate_view();
@@ -741,13 +755,23 @@ IN_PROC_BROWSER_TEST_F(VerticalTabStripBrowserTest, PinningGroupedTab) {
741755
// Regression check for https://github.com/brave/brave-browser/issues/40201
742756
ToggleVerticalTabStrip();
743757

744-
// Given that we have a grouped tab
745-
browser()->tab_strip_model()->ExecuteContextMenuCommand(
746-
0, TabStripModel::CommandToggleGrouped);
758+
AppendTab(browser());
759+
AppendTab(browser());
760+
AppendTab(browser());
761+
762+
tab_groups::TabGroupId group = AddTabToNewGroup(browser(), 0);
763+
AddTabToExistingGroup(browser(), 1, group);
764+
AddTabToExistingGroup(browser(), 2, group);
765+
AddTabToExistingGroup(browser(), 3, group);
766+
767+
browser()->tab_strip_model()->SetTabPinned(1, true);
768+
EXPECT_EQ(GetTabStrip(browser())->tab_at(0)->group(), std::nullopt);
769+
770+
browser()->tab_strip_model()->SetTabPinned(2, true);
771+
EXPECT_EQ(GetTabStrip(browser())->tab_at(1)->group(), std::nullopt);
747772

748-
// When pinning the tab shouldn't cause crash.
749-
browser()->tab_strip_model()->ExecuteContextMenuCommand(
750-
0, TabStripModel::CommandTogglePinned);
773+
EXPECT_EQ(GetTabStrip(browser())->tab_at(2)->group().value(), group);
774+
EXPECT_EQ(GetTabStrip(browser())->tab_at(3)->group().value(), group);
751775
}
752776

753777
class VerticalTabStripDragAndDropBrowserTest
@@ -840,7 +864,7 @@ class VerticalTabStripDragAndDropBrowserTest
840864
IN_PROC_BROWSER_TEST_F(VerticalTabStripDragAndDropBrowserTest,
841865
MAYBE_DragTabToReorder) {
842866
// Pre-conditions ------------------------------------------------------------
843-
chrome::AddTabAt(browser(), {}, -1, true);
867+
AppendTab(browser());
844868

845869
auto* widget_delegate_view =
846870
browser_view()->vertical_tab_strip_widget_delegate_view_.get();
@@ -895,7 +919,7 @@ IN_PROC_BROWSER_TEST_F(VerticalTabStripDragAndDropBrowserTest,
895919
IN_PROC_BROWSER_TEST_F(VerticalTabStripDragAndDropBrowserTest,
896920
MAYBE_DragTabToDetach) {
897921
// Pre-conditions ------------------------------------------------------------
898-
chrome::AddTabAt(browser(), {}, -1, true);
922+
AppendTab(browser());
899923

900924
// Drag a tab out of tab strip to create browser -----------------------------
901925
GetTabStrip(browser())->StopAnimating(

chromium_src/chrome/browser/ui/tabs/tab_strip_model.h

-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010
#define TAB_STRIP_MODEL_H_ friend class BraveTabStripModel;
1111
#define IsReadLaterSupportedForAny virtual IsReadLaterSupportedForAny
1212
#define TabDragController TabDragControllerChromium
13-
#define ExecuteContextMenuCommand virtual ExecuteContextMenuCommand
1413

1514
#include "src/chrome/browser/ui/tabs/tab_strip_model.h" // IWYU pragma: export
16-
#undef ExecuteContextMenuCommand
1715
#undef IsReadLaterSupportedForAny
1816
#undef SelectRelativeTab
1917
#undef TAB_STRIP_MODEL_H_

chromium_src/chrome/browser/ui/views/tabs/tab.h

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class BraveTab;
1818
#define GetWidthOfLargestSelectableRegion \
1919
virtual GetWidthOfLargestSelectableRegion
2020

21+
#define SetData virtual SetData
2122
#define ActiveStateChanged virtual ActiveStateChanged
2223
#define GetGroupColor virtual GetGroupColor
2324
#define UpdateIconVisibility virtual UpdateIconVisibility
@@ -33,5 +34,6 @@ class BraveTab;
3334
#undef ActiveStateChanged
3435
#undef GetWidthOfLargestSelectableRegion
3536
#undef kMinimumContentsWidthForCloseButtons
37+
#undef SetData
3638

3739
#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_TABS_TAB_H_

0 commit comments

Comments
 (0)