From 14b7d12b4abda9e3da4f0334a04b5e352de07162 Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Tue, 6 Dec 2022 13:55:19 +1300 Subject: [PATCH 01/11] Add toggle --- browser/brave_profile_prefs.cc | 1 + browser/extensions/api/settings_private/brave_prefs_util.cc | 2 ++ .../resources/settings/brave_appearance_page/toolbar.html | 5 +++++ components/constants/pref_names.cc | 1 + components/constants/pref_names.h | 1 + 5 files changed, 10 insertions(+) diff --git a/browser/brave_profile_prefs.cc b/browser/brave_profile_prefs.cc index 02d1735853df..7d299be49746 100644 --- a/browser/brave_profile_prefs.cc +++ b/browser/brave_profile_prefs.cc @@ -204,6 +204,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { registry->RegisterBooleanPref(brave_rewards::prefs::kShowButton, true); registry->RegisterBooleanPref(kMRUCyclingEnabled, false); registry->RegisterBooleanPref(kTabsSearchShow, true); + registry->RegisterBooleanPref(kBraveTabsMuteIndicatorClickable, true); brave_sync::Prefs::RegisterProfilePrefs(registry); diff --git a/browser/extensions/api/settings_private/brave_prefs_util.cc b/browser/extensions/api/settings_private/brave_prefs_util.cc index cc69dcb0b4ac..1f512de83b84 100644 --- a/browser/extensions/api/settings_private/brave_prefs_util.cc +++ b/browser/extensions/api/settings_private/brave_prefs_util.cc @@ -168,6 +168,8 @@ const PrefsUtil::TypedPrefMap& BravePrefsUtil::GetAllowlistedKeys() { settings_api::PrefType::PREF_TYPE_BOOLEAN; (*s_brave_allowlist)[brave_tabs::kTabHoverMode] = settings_api::PREF_TYPE_NUMBER; + (*s_brave_allowlist)[kBraveTabsMuteIndicatorClickable] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; #if BUILDFLAG(ENABLE_BRAVE_VPN) (*s_brave_allowlist)[brave_vpn::prefs::kBraveVPNShowButton] = settings_api::PrefType::PREF_TYPE_BOOLEAN; diff --git a/browser/resources/settings/brave_appearance_page/toolbar.html b/browser/resources/settings/brave_appearance_page/toolbar.html index 7d7367cfd234..fcf49b5ce9ae 100644 --- a/browser/resources/settings/brave_appearance_page/toolbar.html +++ b/browser/resources/settings/brave_appearance_page/toolbar.html @@ -20,6 +20,11 @@ class="cr-row" label="$i18n{showFullUrls}"> + + Date: Tue, 6 Dec 2022 14:59:38 +1300 Subject: [PATCH 02/11] Wip patch alert_indicator_button --- .../ui/views/tabs/alert_indicator_button.cc | 17 +++++++++++++++ .../ui/views/tabs/alert_indicator_button.h | 21 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc create mode 100644 chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.h diff --git a/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc b/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc new file mode 100644 index 000000000000..7a8c96048231 --- /dev/null +++ b/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc @@ -0,0 +1,17 @@ +// Copyright (c) 2022 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/. + +#include "chrome/browser/ui/views/tabs/alert_indicator_button.h" + +#define AlertIndicatorButton AlertIndicatorButtonBase + +#include "src/chrome/browser/ui/views/tabs/alert_indicator_button.cc" + +#undef AlertIndicatorButton + +void AlertIndicatorButton::UpdateEnabledForMuteToggle() { + LOG(ERROR) << "Toggled mute"; + AlertIndicatorButtonBase::UpdateEnabledForMuteToggle(); +} diff --git a/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.h b/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.h new file mode 100644 index 000000000000..057c626e823c --- /dev/null +++ b/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.h @@ -0,0 +1,21 @@ +// Copyright (c) 2022 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_ALERT_INDICATOR_BUTTON_H_ +#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_TABS_ALERT_INDICATOR_BUTTON_H_ + +#define AlertIndicatorButton AlertIndicatorButtonBase +#define UpdateEnabledForMuteToggle virtual UpdateEnabledForMuteToggle +#include "src/chrome/browser/ui/views/tabs/alert_indicator_button.h" +#undef UpdateEnabledForMuteToggle +#undef AlertIndicatorButton + +class AlertIndicatorButton : public AlertIndicatorButtonBase { + public: + using AlertIndicatorButtonBase::AlertIndicatorButtonBase; + void UpdateEnabledForMuteToggle() override; +}; + +#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_TABS_ALERT_INDICATOR_BUTTON_H_ From e6543db71fdb84ab00f8498f27b8ab0744525139 Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Wed, 7 Dec 2022 12:51:42 +1300 Subject: [PATCH 03/11] Wire up mute button --- app/brave_main_delegate_browsertest.cc | 2 +- app/brave_settings_strings.grdp | 3 +++ .../brave_appearance_page/toolbar.html | 5 ---- .../settings/brave_overrides/basic_page.ts | 9 +++++--- ...ave_settings_localized_strings_provider.cc | 1 + .../ui/views/tabs/alert_indicator_button.cc | 23 ++++++++++++++++++- .../ui/views/tabs/alert_indicator_button.h | 7 ++++++ chromium_src/media/base/media_switches.cc | 1 - 8 files changed, 40 insertions(+), 11 deletions(-) diff --git a/app/brave_main_delegate_browsertest.cc b/app/brave_main_delegate_browsertest.cc index 2713801ee542..ba67d760bbaa 100644 --- a/app/brave_main_delegate_browsertest.cc +++ b/app/brave_main_delegate_browsertest.cc @@ -151,6 +151,7 @@ IN_PROC_BROWSER_TEST_F(BraveMainDelegateBrowserTest, DisabledFeatures) { &history_clusters::internal::kPersistContextAnnotationsInHistoryDb, &lens::features::kLensStandalone, &lens::features::kLensUnifiedSidePanelFooter, + &media::kEnableTabMuting, &media::kLiveCaption, &net::features::kNoncedPartitionedCookies, &net::features::kPartitionedCookies, @@ -191,7 +192,6 @@ IN_PROC_BROWSER_TEST_F(BraveMainDelegateBrowserTest, EnabledFeatures) { #if BUILDFLAG(IS_WIN) &features::kWinrtGeolocationImplementation, #endif - &media::kEnableTabMuting, &net::features::kPartitionConnectionsByNetworkIsolationKey, &net::features::kPartitionExpectCTStateByNetworkIsolationKey, &net::features::kPartitionHttpServerPropertiesByNetworkIsolationKey, diff --git a/app/brave_settings_strings.grdp b/app/brave_settings_strings.grdp index 1658052b54b8..368fe7c80dd7 100644 --- a/app/brave_settings_strings.grdp +++ b/app/brave_settings_strings.grdp @@ -1171,6 +1171,9 @@ Close window when closing last tab + + Clickable tab mute indicators + diff --git a/browser/ui/tabs/brave_tab_menu_model.cc b/browser/ui/tabs/brave_tab_menu_model.cc index 7f5480c9b300..0b51663d5f26 100644 --- a/browser/ui/tabs/brave_tab_menu_model.cc +++ b/browser/ui/tabs/brave_tab_menu_model.cc @@ -52,6 +52,7 @@ int BraveTabMenuModel::GetRestoreTabCommandStringId() const { } void BraveTabMenuModel::Build() { + AddCheckItemWithStringId(CommandToggleTabMuted, IDS_TAB_CXMENU_TOGGLE_TAB_MUTED); AddSeparator(ui::NORMAL_SEPARATOR); AddItemWithStringId(CommandRestoreTab, GetRestoreTabCommandStringId()); AddItemWithStringId(CommandBookmarkAllTabs, IDS_TAB_CXMENU_BOOKMARK_ALL_TABS); diff --git a/browser/ui/tabs/brave_tab_menu_model.h b/browser/ui/tabs/brave_tab_menu_model.h index df633fd62499..b07eef3400b8 100644 --- a/browser/ui/tabs/brave_tab_menu_model.h +++ b/browser/ui/tabs/brave_tab_menu_model.h @@ -27,6 +27,7 @@ class BraveTabMenuModel : public TabMenuModel { CommandShowVerticalTabs, CommandShowTitleBar, CommandUseFloatingVerticalTabStrip, + CommandToggleTabMuted, CommandLast, }; 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 e796ab8fcf75..40138b359112 100644 --- a/browser/ui/views/tabs/brave_tab_context_menu_contents.cc +++ b/browser/ui/views/tabs/brave_tab_context_menu_contents.cc @@ -15,6 +15,7 @@ #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/tabs/tab_utils.h" #include "chrome/browser/ui/views/tabs/tab.h" #include "components/sessions/core/tab_restore_service.h" #include "ui/views/controls/menu/menu_runner.h" @@ -24,6 +25,7 @@ BraveTabContextMenuContents::BraveTabContextMenuContents( BraveBrowserTabStripController* controller, int index) : tab_(tab), + tab_index_(index), browser_(const_cast(controller->browser())), controller_(controller) { model_ = std::make_unique( @@ -42,9 +44,8 @@ void BraveTabContextMenuContents::Cancel() { controller_ = nullptr; } -void BraveTabContextMenuContents::RunMenuAt( - const gfx::Point& point, - ui::MenuSourceType source_type) { +void BraveTabContextMenuContents::RunMenuAt(const gfx::Point& point, + ui::MenuSourceType source_type) { menu_runner_->RunMenuAt(tab_->GetWidget(), nullptr, gfx::Rect(point, gfx::Size()), views::MenuAnchorPosition::kTopLeft, source_type); @@ -72,8 +73,7 @@ bool BraveTabContextMenuContents::IsCommandIdEnabled(int command_id) const { return IsBraveCommandIdEnabled(command_id); return controller_->IsCommandEnabledForTab( - static_cast(command_id), - tab_); + static_cast(command_id), tab_); } bool BraveTabContextMenuContents::IsCommandIdVisible(int command_id) const { @@ -111,8 +111,7 @@ void BraveTabContextMenuContents::ExecuteCommand(int command_id, // Executing the command destroys |this|, and can also end up destroying // |controller_|. So stop the highlights before executing the command. controller_->ExecuteCommandForTab( - static_cast(command_id), - tab_); + static_cast(command_id), tab_); } bool BraveTabContextMenuContents::IsBraveCommandIdEnabled( @@ -131,6 +130,8 @@ bool BraveTabContextMenuContents::IsBraveCommandIdEnabled( case BraveTabMenuModel::CommandShowVerticalTabs: case BraveTabMenuModel::CommandUseFloatingVerticalTabStrip: return true; + case BraveTabMenuModel::CommandToggleTabMuted: + return true; default: NOTREACHED(); break; @@ -161,6 +162,10 @@ void BraveTabContextMenuContents::ExecuteBraveCommand(int command_id) { brave::ToggleVerticalTabStripFloatingMode(browser_); return; } + case BraveTabMenuModel::CommandToggleTabMuted: { + controller_->ToggleTabAudioMute(tab_index_); + return; + } default: NOTREACHED(); return; diff --git a/browser/ui/views/tabs/brave_tab_context_menu_contents.h b/browser/ui/views/tabs/brave_tab_context_menu_contents.h index 9719a4168ea6..118c833f5c0e 100644 --- a/browser/ui/views/tabs/brave_tab_context_menu_contents.h +++ b/browser/ui/views/tabs/brave_tab_context_menu_contents.h @@ -60,6 +60,7 @@ class BraveTabContextMenuContents : public ui::SimpleMenuModel::Delegate { std::unique_ptr menu_runner_; raw_ptr tab_ = nullptr; + int tab_index_; raw_ptr browser_ = nullptr; sessions::TabRestoreService* restore_service_ = nullptr; raw_ptr controller_ = nullptr; From c43d44bbeac1550f78efc183e34f768897930a2b Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Wed, 7 Dec 2022 14:48:47 +1300 Subject: [PATCH 05/11] More idiomatic isMuted --- app/brave_generated_resources.grd | 14 +++++--- browser/ui/tabs/brave_tab_menu_model.cc | 33 ++++++++++++++--- browser/ui/tabs/brave_tab_menu_model.h | 2 +- browser/ui/tabs/brave_tab_strip_model.cc | 6 ++++ browser/ui/tabs/brave_tab_strip_model.h | 2 ++ .../tabs/brave_tab_context_menu_contents.cc | 36 +++++++++++++++++-- 6 files changed, 80 insertions(+), 13 deletions(-) diff --git a/app/brave_generated_resources.grd b/app/brave_generated_resources.grd index 56c190449db6..d824f8cc942e 100644 --- a/app/brave_generated_resources.grd +++ b/app/brave_generated_resources.grd @@ -852,8 +852,11 @@ Or change later at $2brave://settings/ext Float on mouseover - - Mute tab + + {NUM_TABS, plural, =1 {Mute tab} other {Mute tabs}} + + + {NUM_TABS, plural, =1 {Unmute tab} other {Unmute tabs}} @@ -869,8 +872,11 @@ Or change later at $2brave://settings/ext Float on Mouseover - - Mute Tab + + {NUM_TABS, plural, =1 {Mute Tab} other {Mute Tabs}} + + + {NUM_TABS, plural, =1 {Unmute Tab} other {Unmute Tabs}} diff --git a/browser/ui/tabs/brave_tab_menu_model.cc b/browser/ui/tabs/brave_tab_menu_model.cc index 0b51663d5f26..0cf98ea99b33 100644 --- a/browser/ui/tabs/brave_tab_menu_model.cc +++ b/browser/ui/tabs/brave_tab_menu_model.cc @@ -4,7 +4,11 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "brave/browser/ui/tabs/brave_tab_menu_model.h" +#include +#include +#include "brave/browser/ui/tabs/brave_tab_strip_model.h" +#include "brave/grit/brave_generated_resources.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/ui/browser.h" @@ -12,6 +16,8 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/grit/generated_resources.h" #include "components/sessions/core/tab_restore_service.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/models/list_selection_model.h" BraveTabMenuModel::BraveTabMenuModel( ui::SimpleMenuModel::Delegate* delegate, @@ -26,7 +32,7 @@ BraveTabMenuModel::BraveTabMenuModel( TabRestoreServiceFactory::GetForProfile(browser->profile()); } - Build(); + Build(tab_strip_model, index); } BraveTabMenuModel::~BraveTabMenuModel() = default; @@ -44,16 +50,33 @@ int BraveTabMenuModel::GetRestoreTabCommandStringId() const { return id; if (restore_service_->entries().front()->type == - sessions::TabRestoreService::WINDOW) { - id = IDS_RESTORE_WINDOW; + sessions::TabRestoreService::WINDOW) { + id = IDS_RESTORE_WINDOW; } return id; } -void BraveTabMenuModel::Build() { - AddCheckItemWithStringId(CommandToggleTabMuted, IDS_TAB_CXMENU_TOGGLE_TAB_MUTED); +void BraveTabMenuModel::Build(TabStripModel* tab_strip, int index) { + auto indices = + static_cast(tab_strip)->GetTabIndicesForCommandAt( + index); + AddSeparator(ui::NORMAL_SEPARATOR); + auto mute_site_index = + GetIndexOfCommandId(TabStripModel::CommandToggleSiteMuted); + auto is_muted = + std::all_of(indices.begin(), indices.end(), [&tab_strip](int index) { + return tab_strip->GetWebContentsAt(index)->IsAudioMuted(); + }); + + auto toggle_tab_mute_label = l10n_util::GetPluralStringFUTF16( + is_muted ? IDS_TAB_CXMENU_SOUND_UNMUTE_TAB + : IDS_TAB_CXMENU_SOUND_MUTE_TAB, + indices.size()); + InsertItemAt(mute_site_index.value_or(GetItemCount()), CommandToggleTabMuted, + toggle_tab_mute_label); + AddItemWithStringId(CommandRestoreTab, GetRestoreTabCommandStringId()); AddItemWithStringId(CommandBookmarkAllTabs, IDS_TAB_CXMENU_BOOKMARK_ALL_TABS); AddCheckItemWithStringId(CommandShowVerticalTabs, diff --git a/browser/ui/tabs/brave_tab_menu_model.h b/browser/ui/tabs/brave_tab_menu_model.h index b07eef3400b8..a51dbc89c95f 100644 --- a/browser/ui/tabs/brave_tab_menu_model.h +++ b/browser/ui/tabs/brave_tab_menu_model.h @@ -40,7 +40,7 @@ class BraveTabMenuModel : public TabMenuModel { ~BraveTabMenuModel() override; private: - void Build(); + void Build(TabStripModel* tab_strip, int index); int GetRestoreTabCommandStringId() const; raw_ptr web_contents_ = nullptr; diff --git a/browser/ui/tabs/brave_tab_strip_model.cc b/browser/ui/tabs/brave_tab_strip_model.cc index 8680c3a3e6cd..ab0898ecd71e 100644 --- a/browser/ui/tabs/brave_tab_strip_model.cc +++ b/browser/ui/tabs/brave_tab_strip_model.cc @@ -6,6 +6,7 @@ #include "brave/browser/ui/tabs/brave_tab_strip_model.h" #include +#include #include "brave/browser/ui/brave_browser_window.h" #include "brave/components/constants/pref_names.h" @@ -14,6 +15,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_contents.h" @@ -76,3 +78,7 @@ void BraveTabStripModel::SelectMRUTab(TabRelativeDirection direction, void BraveTabStripModel::StopMRUCycling() { mru_cycle_list_.clear(); } + +std::vector BraveTabStripModel::GetTabIndicesForCommandAt(int tab_index) { + return TabStripModel::GetIndicesForCommand(tab_index); +} diff --git a/browser/ui/tabs/brave_tab_strip_model.h b/browser/ui/tabs/brave_tab_strip_model.h index d3a9594f4deb..6de554f0dd3b 100644 --- a/browser/ui/tabs/brave_tab_strip_model.h +++ b/browser/ui/tabs/brave_tab_strip_model.h @@ -33,6 +33,8 @@ class BraveTabStripModel : public TabStripModel { // Stop MRU cycling, called when releasing the Ctrl key void StopMRUCycling(); + std::vector GetTabIndicesForCommandAt(int tab_index); + private: // List of tab indexes sorted by most recently used std::vector mru_cycle_list_; 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 40138b359112..afc6d9df0521 100644 --- a/browser/ui/views/tabs/brave_tab_context_menu_contents.cc +++ b/browser/ui/views/tabs/brave_tab_context_menu_contents.cc @@ -4,10 +4,14 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "brave/browser/ui/views/tabs/brave_tab_context_menu_contents.h" +#include +#include +#include #include "brave/browser/ui/browser_commands.h" #include "brave/browser/ui/tabs/brave_tab_menu_model.h" #include "brave/browser/ui/tabs/brave_tab_prefs.h" +#include "brave/browser/ui/tabs/brave_tab_strip_model.h" #include "brave/browser/ui/views/tabs/brave_browser_tab_strip_controller.h" #include "brave/browser/ui/views/tabs/features.h" #include "chrome/browser/defaults.h" @@ -15,9 +19,12 @@ #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/tabs/tab_enums.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "chrome/browser/ui/tabs/tab_utils.h" #include "chrome/browser/ui/views/tabs/tab.h" #include "components/sessions/core/tab_restore_service.h" +#include "content/public/browser/web_contents.h" #include "ui/views/controls/menu/menu_runner.h" BraveTabContextMenuContents::BraveTabContextMenuContents( @@ -130,8 +137,14 @@ bool BraveTabContextMenuContents::IsBraveCommandIdEnabled( case BraveTabMenuModel::CommandShowVerticalTabs: case BraveTabMenuModel::CommandUseFloatingVerticalTabStrip: return true; - case BraveTabMenuModel::CommandToggleTabMuted: - return true; + case BraveTabMenuModel::CommandToggleTabMuted: { + auto* model = static_cast(controller_->model()); + for (const auto& index : model->GetTabIndicesForCommandAt(tab_index_)) { + if (!model->GetWebContentsAt(index)->GetLastCommittedURL().is_empty()) + return true; + } + return false; + } default: NOTREACHED(); break; @@ -163,7 +176,24 @@ void BraveTabContextMenuContents::ExecuteBraveCommand(int command_id) { return; } case BraveTabMenuModel::CommandToggleTabMuted: { - controller_->ToggleTabAudioMute(tab_index_); + auto* model = static_cast(controller_->model()); + auto indices = model->GetTabIndicesForCommandAt(tab_index_); + std::vector contentses; + std::transform( + indices.begin(), indices.end(), std::back_inserter(contentses), + [&model](int index) { return model->GetWebContentsAt(index); }); + + auto all_muted = + std::all_of(contentses.begin(), contentses.end(), + [](content::WebContents* contents) { + return contents->IsAudioMuted(); + }); + + for (auto* contents : contentses) { + chrome::SetTabAudioMuted(contents, !all_muted, + TabMutedReason::AUDIO_INDICATOR, + std::string()); + } return; } default: From 6a41e292229868bbd2eac30f609bce53c4c69c5b Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Wed, 7 Dec 2022 15:01:00 +1300 Subject: [PATCH 06/11] Use the disabled by default logic --- app/brave_main_delegate_browsertest.cc | 2 +- .../ui/views/tabs/brave_tab_context_menu_contents.cc | 10 +++++----- .../browser/ui/views/tabs/alert_indicator_button.cc | 11 +++++------ chromium_src/media/base/media_switches.cc | 1 + components/constants/pref_names.cc | 3 ++- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/brave_main_delegate_browsertest.cc b/app/brave_main_delegate_browsertest.cc index ba67d760bbaa..2713801ee542 100644 --- a/app/brave_main_delegate_browsertest.cc +++ b/app/brave_main_delegate_browsertest.cc @@ -151,7 +151,6 @@ IN_PROC_BROWSER_TEST_F(BraveMainDelegateBrowserTest, DisabledFeatures) { &history_clusters::internal::kPersistContextAnnotationsInHistoryDb, &lens::features::kLensStandalone, &lens::features::kLensUnifiedSidePanelFooter, - &media::kEnableTabMuting, &media::kLiveCaption, &net::features::kNoncedPartitionedCookies, &net::features::kPartitionedCookies, @@ -192,6 +191,7 @@ IN_PROC_BROWSER_TEST_F(BraveMainDelegateBrowserTest, EnabledFeatures) { #if BUILDFLAG(IS_WIN) &features::kWinrtGeolocationImplementation, #endif + &media::kEnableTabMuting, &net::features::kPartitionConnectionsByNetworkIsolationKey, &net::features::kPartitionExpectCTStateByNetworkIsolationKey, &net::features::kPartitionHttpServerPropertiesByNetworkIsolationKey, 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 afc6d9df0521..a06634de4689 100644 --- a/browser/ui/views/tabs/brave_tab_context_menu_contents.cc +++ b/browser/ui/views/tabs/brave_tab_context_menu_contents.cc @@ -6,6 +6,7 @@ #include "brave/browser/ui/views/tabs/brave_tab_context_menu_contents.h" #include #include +#include #include #include "brave/browser/ui/browser_commands.h" @@ -183,11 +184,10 @@ void BraveTabContextMenuContents::ExecuteBraveCommand(int command_id) { indices.begin(), indices.end(), std::back_inserter(contentses), [&model](int index) { return model->GetWebContentsAt(index); }); - auto all_muted = - std::all_of(contentses.begin(), contentses.end(), - [](content::WebContents* contents) { - return contents->IsAudioMuted(); - }); + auto all_muted = std::all_of(contentses.begin(), contentses.end(), + [](content::WebContents* contents) { + return contents->IsAudioMuted(); + }); for (auto* contents : contentses) { chrome::SetTabAudioMuted(contents, !all_muted, diff --git a/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc b/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc index eac2c68ac0c1..101e63eb8818 100644 --- a/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc +++ b/chromium_src/chrome/browser/ui/views/tabs/alert_indicator_button.cc @@ -24,14 +24,13 @@ void AlertIndicatorButton::UpdateEnabledForMuteToggle() { const bool pref_enabled = profile->GetPrefs()->GetBoolean(kBraveTabsMuteIndicatorClickable); - // Upstream has clickable mute indicators disabled by default. Thus, if and - // only if our pref is enabled (and the mute button isn't) we should set - // enabled to true. - // Note: We have a test which checks the feature is disabled by default. If + // We have clickable mute indicators enabled by default. Thus, if our pref is + // disabled we can force the indicator off. + // Note: We have a test which checks the feature is enabled by default. If // that changes this may need to as well. - if (pref_enabled) { + if (!pref_enabled) { if (was_enabled != pref_enabled) - SetEnabled(true); + SetEnabled(false); return; } AlertIndicatorButtonBase::UpdateEnabledForMuteToggle(); diff --git a/chromium_src/media/base/media_switches.cc b/chromium_src/media/base/media_switches.cc index c8952546db8d..3c8a39f75985 100644 --- a/chromium_src/media/base/media_switches.cc +++ b/chromium_src/media/base/media_switches.cc @@ -11,6 +11,7 @@ namespace media { OVERRIDE_FEATURE_DEFAULT_STATES({{ {kLiveCaption, base::FEATURE_DISABLED_BY_DEFAULT}, + {kEnableTabMuting, base::FEATURE_ENABLED_BY_DEFAULT}, }}); } // namespace media diff --git a/components/constants/pref_names.cc b/components/constants/pref_names.cc index adee06177262..e24c7ce88ed3 100644 --- a/components/constants/pref_names.cc +++ b/components/constants/pref_names.cc @@ -79,7 +79,8 @@ const char kImportDialogExtensions[] = "import_dialog_extensions"; const char kImportDialogPayments[] = "import_dialog_payments"; const char kMRUCyclingEnabled[] = "brave.mru_cycling_enabled"; const char kTabsSearchShow[] = "brave.tabs_search_show"; -const char kBraveTabsMuteIndicatorClickable[] = "brave.tabs.mute_indicator_clickable"; +const char kBraveTabsMuteIndicatorClickable[] = + "brave.tabs.mute_indicator_clickable"; const char kDontAskForCrashReporting[] = "brave.dont_ask_for_crash_reporting"; const char kEnableMediaRouterOnRestart[] = "brave.enable_media_router_on_restart"; From 11c3b0f8c0e58a3352bd9c435559890c3a32be5d Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Thu, 8 Dec 2022 11:29:36 +1300 Subject: [PATCH 07/11] Changes for PR --- browser/ui/tabs/brave_tab_menu_model.cc | 25 +++++++++---------- browser/ui/tabs/brave_tab_menu_model.h | 5 +++- browser/ui/tabs/brave_tab_strip_model.h | 1 + .../tabs/brave_tab_context_menu_contents.cc | 9 +++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/browser/ui/tabs/brave_tab_menu_model.cc b/browser/ui/tabs/brave_tab_menu_model.cc index 0cf98ea99b33..6c21e838e48d 100644 --- a/browser/ui/tabs/brave_tab_menu_model.cc +++ b/browser/ui/tabs/brave_tab_menu_model.cc @@ -4,6 +4,7 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "brave/browser/ui/tabs/brave_tab_menu_model.h" + #include #include @@ -32,7 +33,13 @@ BraveTabMenuModel::BraveTabMenuModel( TabRestoreServiceFactory::GetForProfile(browser->profile()); } - Build(tab_strip_model, index); + auto indices = static_cast(tab_strip_model) + ->GetTabIndicesForCommandAt(index); + all_muted_ = std::all_of( + indices.begin(), indices.end(), [&tab_strip_model](int index) { + return tab_strip_model->GetWebContentsAt(index)->IsAudioMuted(); + }); + Build(indices.size()); } BraveTabMenuModel::~BraveTabMenuModel() = default; @@ -57,23 +64,15 @@ int BraveTabMenuModel::GetRestoreTabCommandStringId() const { return id; } -void BraveTabMenuModel::Build(TabStripModel* tab_strip, int index) { - auto indices = - static_cast(tab_strip)->GetTabIndicesForCommandAt( - index); - +void BraveTabMenuModel::Build(int selected_tab_count) { AddSeparator(ui::NORMAL_SEPARATOR); auto mute_site_index = GetIndexOfCommandId(TabStripModel::CommandToggleSiteMuted); - auto is_muted = - std::all_of(indices.begin(), indices.end(), [&tab_strip](int index) { - return tab_strip->GetWebContentsAt(index)->IsAudioMuted(); - }); auto toggle_tab_mute_label = l10n_util::GetPluralStringFUTF16( - is_muted ? IDS_TAB_CXMENU_SOUND_UNMUTE_TAB - : IDS_TAB_CXMENU_SOUND_MUTE_TAB, - indices.size()); + all_muted() ? IDS_TAB_CXMENU_SOUND_UNMUTE_TAB + : IDS_TAB_CXMENU_SOUND_MUTE_TAB, + selected_tab_count); InsertItemAt(mute_site_index.value_or(GetItemCount()), CommandToggleTabMuted, toggle_tab_mute_label); diff --git a/browser/ui/tabs/brave_tab_menu_model.h b/browser/ui/tabs/brave_tab_menu_model.h index a51dbc89c95f..9e6e1b5400d7 100644 --- a/browser/ui/tabs/brave_tab_menu_model.h +++ b/browser/ui/tabs/brave_tab_menu_model.h @@ -39,12 +39,15 @@ class BraveTabMenuModel : public TabMenuModel { BraveTabMenuModel& operator=(const BraveTabMenuModel&) = delete; ~BraveTabMenuModel() override; + bool all_muted() const { return all_muted_; } + private: - void Build(TabStripModel* tab_strip, int index); + void Build(int selected_tab_count); int GetRestoreTabCommandStringId() const; raw_ptr web_contents_ = nullptr; sessions::TabRestoreService* restore_service_ = nullptr; + bool all_muted_; }; #endif // BRAVE_BROWSER_UI_TABS_BRAVE_TAB_MENU_MODEL_H_ diff --git a/browser/ui/tabs/brave_tab_strip_model.h b/browser/ui/tabs/brave_tab_strip_model.h index 6de554f0dd3b..c192f59b2c9d 100644 --- a/browser/ui/tabs/brave_tab_strip_model.h +++ b/browser/ui/tabs/brave_tab_strip_model.h @@ -33,6 +33,7 @@ class BraveTabStripModel : public TabStripModel { // Stop MRU cycling, called when releasing the Ctrl key void StopMRUCycling(); + // Exposes a |TabStripModel| api to |BraveTabMenuModel|. std::vector GetTabIndicesForCommandAt(int tab_index); private: 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 a06634de4689..1584b8e62d8f 100644 --- a/browser/ui/views/tabs/brave_tab_context_menu_contents.cc +++ b/browser/ui/views/tabs/brave_tab_context_menu_contents.cc @@ -4,6 +4,7 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "brave/browser/ui/views/tabs/brave_tab_context_menu_contents.h" + #include #include #include @@ -184,15 +185,11 @@ void BraveTabContextMenuContents::ExecuteBraveCommand(int command_id) { indices.begin(), indices.end(), std::back_inserter(contentses), [&model](int index) { return model->GetWebContentsAt(index); }); - auto all_muted = std::all_of(contentses.begin(), contentses.end(), - [](content::WebContents* contents) { - return contents->IsAudioMuted(); - }); - + auto all_muted = model_->all_muted(); for (auto* contents : contentses) { chrome::SetTabAudioMuted(contents, !all_muted, TabMutedReason::AUDIO_INDICATOR, - std::string()); + /*extension_id=*/std::string()); } return; } From c89f46052f01d5be7cde9f16fd98a58c2f010546 Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Mon, 12 Dec 2022 13:03:36 +1300 Subject: [PATCH 08/11] Update UX to match mockup --- app/brave_settings_strings.grdp | 4 ++-- browser/brave_profile_prefs.cc | 2 +- .../extensions/api/settings_private/brave_prefs_util.cc | 2 +- .../settings/brave_appearance_page/toolbar.html | 5 +++++ browser/resources/settings/brave_overrides/basic_page.ts | 9 +++------ .../brave_settings_localized_strings_provider.cc | 2 +- .../browser/ui/views/tabs/alert_indicator_button.cc | 8 ++++---- components/constants/pref_names.cc | 4 ++-- components/constants/pref_names.h | 2 +- 9 files changed, 20 insertions(+), 18 deletions(-) diff --git a/app/brave_settings_strings.grdp b/app/brave_settings_strings.grdp index 368fe7c80dd7..a43d96ceda8f 100644 --- a/app/brave_settings_strings.grdp +++ b/app/brave_settings_strings.grdp @@ -1171,8 +1171,8 @@ Close window when closing last tab - - Clickable tab mute indicators + + Disable mute function in tab speaker icons