diff --git a/browser/ui/webui/brave_shields/shields_panel_handler.cc b/browser/ui/webui/brave_shields/shields_panel_handler.cc index 9021d3e9a9cc..2cac9a13479b 100644 --- a/browser/ui/webui/brave_shields/shields_panel_handler.cc +++ b/browser/ui/webui/brave_shields/shields_panel_handler.cc @@ -8,6 +8,8 @@ #include #include "brave/browser/ui/brave_browser_window.h" +#include "brave/components/constants/pref_names.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "ui/gfx/geometry/vector2d.h" @@ -16,10 +18,12 @@ ShieldsPanelHandler::ShieldsPanelHandler( mojo::PendingReceiver receiver, ui::MojoBubbleWebUIController* webui_controller, - BraveBrowserWindow* brave_browser_window) + BraveBrowserWindow* brave_browser_window, + Profile* profile) : receiver_(this, std::move(receiver)), webui_controller_(webui_controller), - brave_browser_window_(brave_browser_window) {} + brave_browser_window_(brave_browser_window), + profile_(profile) {} ShieldsPanelHandler::~ShieldsPanelHandler() = default; @@ -43,3 +47,18 @@ void ShieldsPanelHandler::GetPosition(GetPositionCallback callback) { brave_browser_window_->GetShieldsBubbleRect().y()); std::move(callback).Run(vec); } + +void ShieldsPanelHandler::SetAdvancedViewEnabled(bool is_enabled) { + DCHECK(profile_); + + profile_->GetPrefs()->SetBoolean(kShieldsAdvancedViewEnabled, is_enabled); +} + +void ShieldsPanelHandler::GetAdvancedViewEnabled( + GetAdvancedViewEnabledCallback callback) { + DCHECK(profile_); + + bool is_enabled = + profile_->GetPrefs()->GetBoolean(kShieldsAdvancedViewEnabled); + std::move(callback).Run(is_enabled); +} diff --git a/browser/ui/webui/brave_shields/shields_panel_handler.h b/browser/ui/webui/brave_shields/shields_panel_handler.h index a36c9326b26e..c55c14b07ebc 100644 --- a/browser/ui/webui/brave_shields/shields_panel_handler.h +++ b/browser/ui/webui/brave_shields/shields_panel_handler.h @@ -18,6 +18,7 @@ namespace content { class WebUI; } // namespace content +class Profile; class BraveBrowserWindow; class ShieldsPanelHandler : public brave_shields::mojom::PanelHandler { @@ -25,7 +26,8 @@ class ShieldsPanelHandler : public brave_shields::mojom::PanelHandler { ShieldsPanelHandler( mojo::PendingReceiver receiver, ui::MojoBubbleWebUIController* webui_controller, - BraveBrowserWindow* brave_browser_window); + BraveBrowserWindow* brave_browser_window, + Profile* profile); ShieldsPanelHandler(const ShieldsPanelHandler&) = delete; ShieldsPanelHandler& operator=(const ShieldsPanelHandler&) = delete; @@ -35,11 +37,14 @@ class ShieldsPanelHandler : public brave_shields::mojom::PanelHandler { void ShowUI() override; void CloseUI() override; void GetPosition(GetPositionCallback callback) override; + void SetAdvancedViewEnabled(bool is_enabled) override; + void GetAdvancedViewEnabled(GetAdvancedViewEnabledCallback callback) override; private: mojo::Receiver receiver_; raw_ptr const webui_controller_; raw_ptr brave_browser_window_ = nullptr; + raw_ptr profile_ = nullptr; }; #endif // BRAVE_BROWSER_UI_WEBUI_BRAVE_SHIELDS_SHIELDS_PANEL_HANDLER_H_ diff --git a/browser/ui/webui/brave_shields/shields_panel_ui.cc b/browser/ui/webui/brave_shields/shields_panel_ui.cc index 41fbd599bb41..9e6e1b8c0af1 100644 --- a/browser/ui/webui/brave_shields/shields_panel_ui.cc +++ b/browser/ui/webui/brave_shields/shields_panel_ui.cc @@ -11,6 +11,7 @@ #include "brave/browser/ui/brave_browser_window.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" #include "brave/components/brave_shields/resources/panel/grit/brave_shields_panel_generated_map.h" +#include "brave/components/constants/pref_names.h" #include "brave/components/constants/webui_url_constants.h" #include "brave/components/l10n/common/locale_util.h" #include "chrome/browser/profiles/profile.h" @@ -39,6 +40,9 @@ ShieldsPanelUI::ShieldsPanelUI(content::WebUI* web_ui) source->AddString(str.name, l10n_str); } + source->AddBoolean("isAdvancedViewEnabled", profile_->GetPrefs()->GetBoolean( + kShieldsAdvancedViewEnabled)); + content::URLDataSource::Add( profile_, std::make_unique( profile_, chrome::FaviconUrlFormat::kFavicon2)); @@ -71,7 +75,7 @@ void ShieldsPanelUI::CreatePanelHandler( panel_handler_ = std::make_unique( std::move(panel_receiver), this, - static_cast(browser_->window())); + static_cast(browser_->window()), profile); data_handler_ = std::make_unique( std::move(data_handler_receiver), this, browser_->tab_strip_model()); } diff --git a/components/brave_shields/common/brave_shields_panel.mojom b/components/brave_shields/common/brave_shields_panel.mojom index aeea0be7e24b..da104a002d21 100644 --- a/components/brave_shields/common/brave_shields_panel.mojom +++ b/components/brave_shields/common/brave_shields_panel.mojom @@ -24,6 +24,8 @@ interface PanelHandler { CloseUI(); GetPosition() => (gfx.mojom.Vector2d vec); + SetAdvancedViewEnabled(bool is_enabled); + GetAdvancedViewEnabled() => (bool is_enabled); }; // WebUI-side handler for requests from the browser. diff --git a/components/brave_shields/resources/panel/components/main-panel/index.tsx b/components/brave_shields/resources/panel/components/main-panel/index.tsx index b840bff390cf..66100967a1ab 100644 --- a/components/brave_shields/resources/panel/components/main-panel/index.tsx +++ b/components/brave_shields/resources/panel/components/main-panel/index.tsx @@ -8,9 +8,10 @@ import { getLocale, splitStringForTag } from '../../../../../common/locale' import DataContext from '../../state/context' import getPanelBrowserAPI from '../../api/panel_browser_api' import Button from '$web-components/button' +import { useIsExpanded } from '../../state/hooks' function MainPanel () { - const [isExpanded, setIsExpanded] = React.useState(false) + const { isExpanded, toggleIsExpanded } = useIsExpanded() const { siteBlockInfo, getSiteSettings } = React.useContext(DataContext) const braveShieldsStatusText = splitStringForTag(siteBlockInfo?.isShieldsEnabled ? getLocale('braveShieldsUp') : getLocale('braveShieldsDown')) @@ -46,12 +47,12 @@ function MainPanel () { ) - let advancedControlButtonElement = ( + let advancedControlButtonElement = (isExpanded != null) && ( setIsExpanded(x => !x)} + onClick={toggleIsExpanded} > diff --git a/components/brave_shields/resources/panel/state/hooks.ts b/components/brave_shields/resources/panel/state/hooks.ts index 15fbb27a1f13..0dd725c1a01d 100644 --- a/components/brave_shields/resources/panel/state/hooks.ts +++ b/components/brave_shields/resources/panel/state/hooks.ts @@ -1,5 +1,6 @@ import * as React from 'react' import getPanelBrowserAPI, { UIHandlerReceiver, SiteBlockInfo, SiteSettings } from '../api/panel_browser_api' +import { loadTimeData } from '../../../../common/loadTimeData' export function useSiteBlockInfoData () { const [siteBlockInfo, setSiteBlockInfo] = React.useState() @@ -43,3 +44,30 @@ export function useSiteSettingsData () { return { siteSettings, getSiteSettings } } + +export function useIsExpanded () { + const [isExpanded, setIsExpanded] = React.useState(loadTimeData.getBoolean('isAdvancedViewEnabled')) + + const toggleIsExpanded = () => { + const newValue = !isExpanded + setIsExpanded(newValue) + getPanelBrowserAPI().panelHandler.setAdvancedViewEnabled(newValue) + } + + React.useEffect(() => { + const onVisibilityChange = () => { + if (document.visibilityState === 'visible') { + getPanelBrowserAPI().panelHandler.getAdvancedViewEnabled().then(res => setIsExpanded(res.isEnabled)) + } + } + + document.addEventListener('visibilitychange', onVisibilityChange) + onVisibilityChange() + + return () => { + document.removeEventListener('visibilitychange', onVisibilityChange) + } + }, []) + + return { isExpanded, toggleIsExpanded } +}