Commit 25bb6d11 authored by Collin Baker's avatar Collin Baker Committed by Commit Bot

Display custom context menu for WebUI tab strip

The existing context menu is the same as the native tab strip. This is
problematic since some features aren't implemented in the WebUI tab
strip. Additionally, some wording is specific to the native tab strip
(e.g. "New tab to the right").

This replaces it with a pared down context menu.

Bug: 997887
Change-Id: I5bcbd4b7182794fc9669afa0c22f6a3f657e9c11
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1926921
Commit-Queue: Collin Baker <collinbaker@chromium.org>
Reviewed-by: default avatarJohn Lee <johntlee@chromium.org>
Cr-Commit-Position: refs/heads/master@{#717873}
parent 53a61579
...@@ -197,6 +197,11 @@ void WebUITabStripContainerView::UpdateButtons() { ...@@ -197,6 +197,11 @@ void WebUITabStripContainerView::UpdateButtons() {
} }
} }
const ui::AcceleratorProvider*
WebUITabStripContainerView::GetAcceleratorProvider() const {
return BrowserView::GetBrowserViewForBrowser(browser_);
}
void WebUITabStripContainerView::CloseContainer() { void WebUITabStripContainerView::CloseContainer() {
SetContainerTargetVisibility(false); SetContainerTargetVisibility(false);
} }
......
...@@ -63,6 +63,7 @@ class WebUITabStripContainerView : public TabStripUI::Embedder, ...@@ -63,6 +63,7 @@ class WebUITabStripContainerView : public TabStripUI::Embedder,
bool EventShouldPropagate(const ui::Event& event); bool EventShouldPropagate(const ui::Event& event);
// TabStripUI::Embedder: // TabStripUI::Embedder:
const ui::AcceleratorProvider* GetAcceleratorProvider() const override;
void CloseContainer() override; void CloseContainer() override;
void ShowContextMenuAtPoint( void ShowContextMenuAtPoint(
gfx::Point point, gfx::Point point,
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/strings/string_piece.h" #include "base/strings/string_piece.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/favicon/favicon_utils.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
#include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/tabs/tab_menu_model.h" #include "chrome/browser/ui/tabs/tab_menu_model.h"
#include "chrome/browser/ui/tabs/tab_network_state.h" #include "chrome/browser/ui/tabs/tab_network_state.h"
#include "chrome/browser/ui/tabs/tab_renderer_data.h" #include "chrome/browser/ui/tabs/tab_renderer_data.h"
...@@ -47,6 +49,8 @@ ...@@ -47,6 +49,8 @@
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "third_party/skia/include/core/SkImageEncoder.h" #include "third_party/skia/include/core/SkImageEncoder.h"
#include "third_party/skia/include/core/SkStream.h" #include "third_party/skia/include/core/SkStream.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/simple_menu_model.h" #include "ui/base/models/simple_menu_model.h"
#include "ui/base/theme_provider.h" #include "ui/base/theme_provider.h"
#include "ui/gfx/color_utils.h" #include "ui/gfx/color_utils.h"
...@@ -97,23 +101,77 @@ std::string EncodePNGAndMakeDataURI(gfx::ImageSkia image, float scale_factor) { ...@@ -97,23 +101,77 @@ std::string EncodePNGAndMakeDataURI(gfx::ImageSkia image, float scale_factor) {
base::as_bytes(base::make_span(stream.GetBuffer())), "png"); base::as_bytes(base::make_span(stream.GetBuffer())), "png");
} }
class WebUITabMenuModel : public ui::SimpleMenuModel {
public:
WebUITabMenuModel(ui::SimpleMenuModel::Delegate* delegate,
TabStripModel* tab_strip_model,
int tab_index)
: ui::SimpleMenuModel(delegate) {
AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB);
AddSeparator(ui::NORMAL_SEPARATOR);
AddItemWithStringId(TabStripModel::CommandReload, IDS_TAB_CXMENU_RELOAD);
AddItemWithStringId(TabStripModel::CommandDuplicate,
IDS_TAB_CXMENU_DUPLICATE);
const int pin_str = tab_strip_model->WillContextMenuPin(tab_index)
? IDS_TAB_CXMENU_PIN_TAB
: IDS_TAB_CXMENU_UNPIN_TAB;
AddItemWithStringId(TabStripModel::CommandTogglePinned, pin_str);
const int mute_str = chrome::IsSiteMuted(*tab_strip_model, tab_index)
? IDS_TAB_CXMENU_SOUND_UNMUTE_SITE
: IDS_TAB_CXMENU_SOUND_MUTE_SITE;
AddItem(TabStripModel::CommandToggleSiteMuted,
l10n_util::GetPluralStringFUTF16(mute_str, 1));
AddSeparator(ui::NORMAL_SEPARATOR);
AddItemWithStringId(TabStripModel::CommandCloseTab,
IDS_TAB_CXMENU_CLOSETAB);
AddItemWithStringId(TabStripModel::CommandCloseTabsToRight,
IDS_TAB_CXMENU_CLOSETABSTORIGHT);
}
};
class WebUITabContextMenu : public ui::SimpleMenuModel::Delegate, class WebUITabContextMenu : public ui::SimpleMenuModel::Delegate,
public TabMenuModel { public WebUITabMenuModel {
public: public:
WebUITabContextMenu(TabStripModel* tab_strip_model, int tab_index) WebUITabContextMenu(Browser* browser,
: TabMenuModel(this, tab_strip_model, tab_index), const ui::AcceleratorProvider* accelerator_provider,
tab_strip_model_(tab_strip_model), int tab_index)
: WebUITabMenuModel(this, browser->tab_strip_model(), tab_index),
browser_(browser),
accelerator_provider_(accelerator_provider),
tab_index_(tab_index) {} tab_index_(tab_index) {}
~WebUITabContextMenu() override = default; ~WebUITabContextMenu() override = default;
void ExecuteCommand(int command_id, int event_flags) override { void ExecuteCommand(int command_id, int event_flags) override {
DCHECK_LT(tab_index_, tab_strip_model_->count()); DCHECK_LT(tab_index_, browser_->tab_strip_model()->count());
tab_strip_model_->ExecuteContextMenuCommand( if (command_id == IDC_NEW_TAB) {
chrome::NewTab(browser_);
return;
}
browser_->tab_strip_model()->ExecuteContextMenuCommand(
tab_index_, static_cast<TabStripModel::ContextMenuCommand>(command_id)); tab_index_, static_cast<TabStripModel::ContextMenuCommand>(command_id));
} }
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) const override {
int real_command = -1;
if (command_id == IDC_NEW_TAB) {
real_command = IDC_NEW_TAB;
} else {
TabStripModel::ContextMenuCommandToBrowserCommand(command_id,
&real_command);
}
if (real_command != -1) {
return accelerator_provider_->GetAcceleratorForCommandId(real_command,
accelerator);
} else {
return false;
}
}
private: private:
TabStripModel* const tab_strip_model_; Browser* const browser_;
const ui::AcceleratorProvider* const accelerator_provider_;
const int tab_index_; const int tab_index_;
}; };
...@@ -367,18 +425,19 @@ class TabStripUIHandler : public content::WebUIMessageHandler, ...@@ -367,18 +425,19 @@ class TabStripUIHandler : public content::WebUIMessageHandler,
point = gfx::PointF(x, y); point = gfx::PointF(x, y);
} }
TabStripModel* tab_strip_model = nullptr; Browser* browser = nullptr;
int tab_index = -1; int tab_index = -1;
const bool got_tab = extensions::ExtensionTabUtil::GetTabById( const bool got_tab = extensions::ExtensionTabUtil::GetTabById(
tab_id, browser_->profile(), true /* include_incognito */, nullptr, tab_id, browser_->profile(), true /* include_incognito */, &browser,
&tab_strip_model, nullptr, &tab_index); nullptr, nullptr, &tab_index);
DCHECK(got_tab); DCHECK(got_tab);
DCHECK_EQ(tab_strip_model, browser_->tab_strip_model()); DCHECK_EQ(browser, browser_);
DCHECK(embedder_); DCHECK(embedder_);
embedder_->ShowContextMenuAtPoint( embedder_->ShowContextMenuAtPoint(
gfx::ToRoundedPoint(point), gfx::ToRoundedPoint(point),
std::make_unique<WebUITabContextMenu>(tab_strip_model, tab_index)); std::make_unique<WebUITabContextMenu>(
browser, embedder_->GetAcceleratorProvider(), tab_index));
} }
void HandleGetLayout(const base::ListValue* args) { void HandleGetLayout(const base::ListValue* args) {
......
...@@ -20,6 +20,7 @@ class Point; ...@@ -20,6 +20,7 @@ class Point;
} // namespace gfx } // namespace gfx
namespace ui { namespace ui {
class AcceleratorProvider;
class MenuModel; class MenuModel;
} }
...@@ -34,6 +35,8 @@ class TabStripUI : public content::WebUIController { ...@@ -34,6 +35,8 @@ class TabStripUI : public content::WebUIController {
Embedder() = default; Embedder() = default;
virtual ~Embedder() {} virtual ~Embedder() {}
virtual const ui::AcceleratorProvider* GetAcceleratorProvider() const = 0;
virtual void CloseContainer() = 0; virtual void CloseContainer() = 0;
virtual void ShowContextMenuAtPoint( virtual void ShowContextMenuAtPoint(
......
...@@ -34,6 +34,10 @@ namespace { ...@@ -34,6 +34,10 @@ namespace {
class MockTabStripUIEmbedder : public TabStripUI::Embedder { class MockTabStripUIEmbedder : public TabStripUI::Embedder {
public: public:
MOCK_METHOD(const ui::AcceleratorProvider*,
GetAcceleratorProvider,
(),
(const override));
MOCK_METHOD(void, CloseContainer, (), (override)); MOCK_METHOD(void, CloseContainer, (), (override));
MOCK_METHOD(void, MOCK_METHOD(void,
ShowContextMenuAtPoint, ShowContextMenuAtPoint,
......
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