diff --git a/browser/ui/views/tabs/brave_browser_tab_strip_controller.cc b/browser/ui/views/tabs/brave_browser_tab_strip_controller.cc index 074b54d9be9c..edbc008bfb83 100644 --- a/browser/ui/views/tabs/brave_browser_tab_strip_controller.cc +++ b/browser/ui/views/tabs/brave_browser_tab_strip_controller.cc @@ -24,6 +24,11 @@ BraveBrowserTabStripController::~BraveBrowserTabStripController() { context_menu_contents_->Cancel(); } +const std::optional BraveBrowserTabStripController::GetModelIndexOf( + Tab* tab) { + return tabstrip_->GetModelIndexOf(tab); +} + void BraveBrowserTabStripController::ShowContextMenuForTab( Tab* tab, const gfx::Point& p, diff --git a/browser/ui/views/tabs/brave_browser_tab_strip_controller.h b/browser/ui/views/tabs/brave_browser_tab_strip_controller.h index 050951f07377..e6d57815640f 100644 --- a/browser/ui/views/tabs/brave_browser_tab_strip_controller.h +++ b/browser/ui/views/tabs/brave_browser_tab_strip_controller.h @@ -7,6 +7,7 @@ #define BRAVE_BROWSER_UI_VIEWS_TABS_BRAVE_BROWSER_TAB_STRIP_CONTROLLER_H_ #include +#include #include "chrome/browser/ui/views/tabs/browser_tab_strip_controller.h" @@ -24,6 +25,8 @@ class BraveBrowserTabStripController : public BrowserTabStripController { const BraveBrowserTabStripController&) = delete; ~BraveBrowserTabStripController() override; + const std::optional GetModelIndexOf(Tab* tab); + // BrowserTabStripController overrides: void ShowContextMenuForTab(Tab* tab, const gfx::Point& p, diff --git a/browser/ui/views/tabs/brave_tab_context_menu_contents.cc b/browser/ui/views/tabs/brave_tab_context_menu_contents.cc index 950a130392ad..d7696a986366 100644 --- a/browser/ui/views/tabs/brave_tab_context_menu_contents.cc +++ b/browser/ui/views/tabs/brave_tab_context_menu_contents.cc @@ -64,6 +64,10 @@ void BraveTabContextMenuContents::RunMenuAt(const gfx::Point& point, } bool BraveTabContextMenuContents::IsCommandIdChecked(int command_id) const { + if (!controller_->GetModelIndexOf(tab_)) { + return false; + } + if (command_id == BraveTabMenuModel::CommandShowVerticalTabs) { return tabs::utils::ShouldShowVerticalTabs(browser_); } @@ -72,6 +76,11 @@ bool BraveTabContextMenuContents::IsCommandIdChecked(int command_id) const { } bool BraveTabContextMenuContents::IsCommandIdEnabled(int command_id) const { + // This could be called after tab is closed. + if (!controller_->GetModelIndexOf(tab_)) { + return false; + } + if (IsBraveCommandId(command_id)) return IsBraveCommandIdEnabled(command_id); @@ -80,6 +89,10 @@ bool BraveTabContextMenuContents::IsCommandIdEnabled(int command_id) const { } bool BraveTabContextMenuContents::IsCommandIdVisible(int command_id) const { + if (!controller_->GetModelIndexOf(tab_)) { + return false; + } + if (command_id == BraveTabMenuModel::CommandShowVerticalTabs) { return tabs::utils::SupportsVerticalTabs(browser_); } @@ -90,6 +103,10 @@ bool BraveTabContextMenuContents::IsCommandIdVisible(int command_id) const { bool BraveTabContextMenuContents::GetAcceleratorForCommandId( int command_id, ui::Accelerator* accelerator) const { + if (!controller_->GetModelIndexOf(tab_)) { + return false; + } + if (IsBraveCommandId(command_id)) return false; @@ -103,6 +120,10 @@ bool BraveTabContextMenuContents::GetAcceleratorForCommandId( void BraveTabContextMenuContents::ExecuteCommand(int command_id, int event_flags) { + if (!controller_->GetModelIndexOf(tab_)) { + return; + } + if (IsBraveCommandId(command_id)) return ExecuteBraveCommand(command_id); @@ -114,6 +135,8 @@ void BraveTabContextMenuContents::ExecuteCommand(int command_id, bool BraveTabContextMenuContents::IsBraveCommandIdEnabled( int command_id) const { + CHECK(controller_->GetModelIndexOf(tab_)); + switch (command_id) { case BraveTabMenuModel::CommandRestoreTab: return restore_service_ && (!restore_service_->IsLoaded() || @@ -143,6 +166,8 @@ bool BraveTabContextMenuContents::IsBraveCommandIdEnabled( } void BraveTabContextMenuContents::ExecuteBraveCommand(int command_id) { + CHECK(controller_->GetModelIndexOf(tab_)); + switch (command_id) { case BraveTabMenuModel::CommandRestoreTab: chrome::RestoreTab(browser_); diff --git a/chromium_src/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chromium_src/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h new file mode 100644 index 000000000000..d5c5af1847d3 --- /dev/null +++ b/chromium_src/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h @@ -0,0 +1,18 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_ +#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_ + +#define CloseContextMenuForTesting \ + CloseContextMenuForTesting_UnUsed() {} \ + friend class BraveBrowserTabStripController; \ + void CloseContextMenuForTesting + +#include "src/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h" // IWYU pragma: export + +#undef CloseContextMenuForTesting + +#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_