diff --git a/browser/ui/brave_shields_data_controller.cc b/browser/ui/brave_shields_data_controller.cc index 8028a1b43676..5302fa355d11 100644 --- a/browser/ui/brave_shields_data_controller.cc +++ b/browser/ui/brave_shields_data_controller.cc @@ -13,7 +13,11 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/profiles/profile.h" +#include "components/favicon/content/content_favicon_driver.h" #include "content/public/browser/navigation_handle.h" +#include "net/base/url_util.h" + +using net::AppendQueryParameter; namespace brave_shields { @@ -22,7 +26,10 @@ BraveShieldsDataController::~BraveShieldsDataController() = default; BraveShieldsDataController::BraveShieldsDataController( content::WebContents* web_contents) : content::WebContentsObserver(web_contents), - content::WebContentsUserData(*web_contents) {} + content::WebContentsUserData(*web_contents) { + favicon::ContentFaviconDriver::FromWebContents(web_contents) + ->AddObserver(this); +} void BraveShieldsDataController::DidFinishNavigation( content::NavigationHandle* navigation_handle) { @@ -32,6 +39,23 @@ void BraveShieldsDataController::DidFinishNavigation( } } +void BraveShieldsDataController::WebContentsDestroyed() { + favicon::ContentFaviconDriver::FromWebContents(web_contents()) + ->RemoveObserver(this); +} + +void BraveShieldsDataController::OnFaviconUpdated( + favicon::FaviconDriver* favicon_driver, + NotificationIconType notification_icon_type, + const GURL& icon_url, + bool icon_url_changed, + const gfx::Image& image) { + if (icon_url_changed) { + for (Observer& obs : observer_list_) + obs.OnFaviconUpdated(); + } +} + void BraveShieldsDataController::ReloadWebContents() { web_contents()->GetController().Reload(content::ReloadType::NORMAL, true); } @@ -112,6 +136,22 @@ GURL BraveShieldsDataController::GetCurrentSiteURL() { return web_contents()->GetLastCommittedURL(); } +GURL BraveShieldsDataController::GetFaviconURL(bool refresh) { + auto url = GURL("chrome://favicon2/"); + url = AppendQueryParameter(url, "size", "16"); + url = AppendQueryParameter(url, "scale_factor", "2x"); + url = AppendQueryParameter(url, "show_fallback_monogram", ""); + url = AppendQueryParameter(url, "page_url", + GetCurrentSiteURL().GetWithoutFilename().spec()); + + if (refresh) { + url = AppendQueryParameter(url, "v", + std::to_string(base::Time::Now().ToJsTime())); + } + + return url; +} + AdBlockMode BraveShieldsDataController::GetAdBlockMode() { auto* map = HostContentSettingsMapFactory::GetForProfile( web_contents()->GetBrowserContext()); diff --git a/browser/ui/brave_shields_data_controller.h b/browser/ui/brave_shields_data_controller.h index 431cc5007659..0d37577d8219 100644 --- a/browser/ui/brave_shields_data_controller.h +++ b/browser/ui/brave_shields_data_controller.h @@ -12,6 +12,7 @@ #include "base/observer_list.h" #include "brave/components/brave_shields/common/brave_shields_panel.mojom.h" +#include "components/favicon/core/favicon_driver_observer.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" @@ -26,7 +27,8 @@ namespace brave_shields { // Per-tab class to manage Shields panel data class BraveShieldsDataController : public content::WebContentsObserver, - public content::WebContentsUserData { + public content::WebContentsUserData, + public favicon::FaviconDriverObserver { public: BraveShieldsDataController(const BraveShieldsDataController&) = delete; BraveShieldsDataController& operator=(const BraveShieldsDataController&) = @@ -36,6 +38,7 @@ class BraveShieldsDataController class Observer : public base::CheckedObserver { public: virtual void OnResourcesChanged() = 0; + virtual void OnFaviconUpdated() {} }; void HandleItemBlocked(const std::string& block_type, @@ -49,6 +52,7 @@ class BraveShieldsDataController bool GetBraveShieldsEnabled(); void SetBraveShieldsEnabled(bool is_enabled); GURL GetCurrentSiteURL(); + GURL GetFaviconURL(bool refresh); AdBlockMode GetAdBlockMode(); FingerprintMode GetFingerprintMode(); @@ -70,8 +74,17 @@ class BraveShieldsDataController explicit BraveShieldsDataController(content::WebContents* web_contents); + // content::WebContentsObserver void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; + void WebContentsDestroyed() override; + + // favicon::FaviconDriverObserver + void OnFaviconUpdated(favicon::FaviconDriver* favicon_driver, + NotificationIconType notification_icon_type, + const GURL& icon_url, + bool icon_url_changed, + const gfx::Image& image) override; void ReloadWebContents(); diff --git a/browser/ui/brave_shields_data_controller_unittest.cc b/browser/ui/brave_shields_data_controller_unittest.cc index ca9026c66610..bb512432f7d4 100644 --- a/browser/ui/brave_shields_data_controller_unittest.cc +++ b/browser/ui/brave_shields_data_controller_unittest.cc @@ -17,6 +17,7 @@ #include "chrome/test/base/testing_profile_manager.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings_types.h" +#include "components/favicon/content/content_favicon_driver.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_renderer_host.h" @@ -49,6 +50,8 @@ class BraveShieldsDataControllerTest : public testing::Test { test_web_contents_ = content::WebContentsTester::CreateTestWebContents(profile_, nullptr); + favicon::ContentFaviconDriver::CreateForWebContents( + test_web_contents_.get(), nullptr); BraveShieldsDataController::CreateForWebContents(test_web_contents_.get()); } diff --git a/browser/ui/views/brave_actions/brave_shields_action_view.cc b/browser/ui/views/brave_actions/brave_shields_action_view.cc index 367abea83d76..6f3040cdbd41 100644 --- a/browser/ui/views/brave_actions/brave_shields_action_view.cc +++ b/browser/ui/views/brave_actions/brave_shields_action_view.cc @@ -10,6 +10,7 @@ #include #include "brave/browser/ui/brave_actions/brave_action_icon_with_badge_image_source.h" +#include "brave/common/pref_names.h" #include "brave/common/webui_url_constants.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -17,6 +18,8 @@ #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" #include "components/grit/brave_components_resources.h" #include "components/grit/brave_components_strings.h" +#include "components/prefs/pref_service.h" +#include "content/public/common/url_constants.h" #include "extensions/common/constants.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/image_model.h" @@ -104,8 +107,8 @@ BraveShieldsActionView::GetImageSource() { auto* shields_data_controller = brave_shields::BraveShieldsDataController::FromWebContents( web_contents); - int count = shields_data_controller->GetTotalBlockedCount(); + int count = shields_data_controller->GetTotalBlockedCount(); if (count > 0) { badge_text = count > 99 ? "99+" : std::to_string(count); } @@ -116,10 +119,18 @@ BraveShieldsActionView::GetImageSource() { badge = std::make_unique( badge_text, SK_ColorWHITE, kBadgeBg); } + + SetTooltipText(l10n_util::GetStringUTF16(IDS_BRAVE_SHIELDS)); + + if (is_enabled) { + SetTooltipText( + l10n_util::GetStringFUTF16Int(IDS_BRAVE_SHIELDS_ICON_TOOLTIP, count)); + } } image_source->SetIcon(gfx::Image(GetIconImage(is_enabled))); - if (is_enabled) + + if (is_enabled && profile_->GetPrefs()->GetBoolean(kShieldsStatsBadgeVisible)) image_source->SetBadge(std::move(badge)); return image_source; @@ -145,6 +156,11 @@ void BraveShieldsActionView::UpdateIconState() { } void BraveShieldsActionView::ButtonPressed() { + auto* web_content = tab_strip_model_->GetActiveWebContents(); + if (web_content && SchemeIsLocal(web_content->GetLastCommittedURL())) { + return; // Do not show bubble if it's a local scheme + } + if (!webui_bubble_manager_) { webui_bubble_manager_ = std::make_unique>( @@ -159,6 +175,13 @@ void BraveShieldsActionView::ButtonPressed() { webui_bubble_manager_->ShowBubble(); } +bool BraveShieldsActionView::SchemeIsLocal(GURL url) { + return url.SchemeIs(url::kAboutScheme) || url.SchemeIs(url::kBlobScheme) || + url.SchemeIs(url::kDataScheme) || + url.SchemeIs(url::kFileSystemScheme) || + url.SchemeIs(content::kChromeUIScheme); +} + std::unique_ptr BraveShieldsActionView::CreateDefaultBorder() const { std::unique_ptr border = diff --git a/browser/ui/views/brave_actions/brave_shields_action_view.h b/browser/ui/views/brave_actions/brave_shields_action_view.h index 73d6aff5e9b3..0d3d111e4c6c 100644 --- a/browser/ui/views/brave_actions/brave_shields_action_view.h +++ b/browser/ui/views/brave_actions/brave_shields_action_view.h @@ -37,6 +37,7 @@ class BraveShieldsActionView private: void ButtonPressed(); + bool SchemeIsLocal(GURL url); void UpdateIconState(); gfx::ImageSkia GetIconImage(bool is_enabled); std::unique_ptr GetImageSource(); diff --git a/browser/ui/webui/brave_shields/shields_panel_data_handler.cc b/browser/ui/webui/brave_shields/shields_panel_data_handler.cc index aac0fdff675e..c53a0c26495a 100644 --- a/browser/ui/webui/brave_shields/shields_panel_data_handler.cc +++ b/browser/ui/webui/brave_shields/shields_panel_data_handler.cc @@ -6,6 +6,7 @@ #include #include "brave/browser/ui/webui/brave_shields/shields_panel_data_handler.h" +#include "brave/browser/webcompat_reporter/webcompat_reporter_dialog.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -107,6 +108,13 @@ void ShieldsPanelDataHandler::SetBraveShieldsEnabled(bool is_enabled) { shields_data_ctrlr->SetBraveShieldsEnabled(is_enabled); } +void ShieldsPanelDataHandler::OpenWebCompatWindow() { + auto* shields_data_ctrlr = GetActiveShieldsDataController(); + DCHECK(shields_data_ctrlr); + + OpenWebcompatReporterDialog(shields_data_ctrlr->web_contents()); +} + BraveShieldsDataController* ShieldsPanelDataHandler::GetActiveShieldsDataController() { auto* profile = Profile::FromWebUI(webui_controller_->web_ui()); @@ -139,6 +147,12 @@ void ShieldsPanelDataHandler::UpdateSiteBlockInfo() { site_block_info_.is_shields_enabled = shields_data_ctrlr->GetBraveShieldsEnabled(); + // This method gets called from various callsites. Constantly updating favicon + // url will replace the hashed version too. So, we update this once only + if (site_block_info_.favicon_url.is_empty()) { + site_block_info_.favicon_url = shields_data_ctrlr->GetFaviconURL(false); + } + // Notify remote that data changed if (ui_handler_remote_) { ui_handler_remote_.get()->OnSiteBlockInfoChanged(site_block_info_.Clone()); @@ -149,6 +163,19 @@ void ShieldsPanelDataHandler::OnResourcesChanged() { UpdateSiteBlockInfo(); } +void ShieldsPanelDataHandler::OnFaviconUpdated() { + auto* shields_data_ctrlr = GetActiveShieldsDataController(); + if (!shields_data_ctrlr) + return; + + site_block_info_.favicon_url = shields_data_ctrlr->GetFaviconURL(true); + + // Notify remote that favicon changed + if (ui_handler_remote_) { + ui_handler_remote_.get()->OnSiteBlockInfoChanged(site_block_info_.Clone()); + } +} + void ShieldsPanelDataHandler::OnTabStripModelChanged( TabStripModel* tab_strip_model, const TabStripModelChange& change, diff --git a/browser/ui/webui/brave_shields/shields_panel_data_handler.h b/browser/ui/webui/brave_shields/shields_panel_data_handler.h index 4b07687d1642..04f919cecb04 100644 --- a/browser/ui/webui/brave_shields/shields_panel_data_handler.h +++ b/browser/ui/webui/brave_shields/shields_panel_data_handler.h @@ -20,6 +20,7 @@ class MojoBubbleWebUIController; using brave_shields::BraveShieldsDataController; using brave_shields::mojom::SiteBlockInfo; using brave_shields::mojom::SiteSettings; +using favicon::FaviconDriver; class ShieldsPanelDataHandler : public brave_shields::mojom::DataHandler, public BraveShieldsDataController::Observer, @@ -45,13 +46,16 @@ class ShieldsPanelDataHandler : public brave_shields::mojom::DataHandler, void SetIsNoScriptsEnabled(bool is_enabled) override; void SetHTTPSEverywhereEnabled(bool is_enabled) override; void SetBraveShieldsEnabled(bool is_enabled) override; + void OpenWebCompatWindow() override; private: BraveShieldsDataController* GetActiveShieldsDataController(); void UpdateSiteBlockInfo(); - // brave_shields::BraveShieldsDataController + // BraveShieldsDataController::Observer void OnResourcesChanged() override; + void OnFaviconUpdated() override; + // TabStripModelObserver void OnTabStripModelChanged( TabStripModel* tab_strip_model, diff --git a/browser/ui/webui/brave_shields/shields_panel_handler.cc b/browser/ui/webui/brave_shields/shields_panel_handler.cc index 7da903f50f32..a637c39a7753 100644 --- a/browser/ui/webui/brave_shields/shields_panel_handler.cc +++ b/browser/ui/webui/brave_shields/shields_panel_handler.cc @@ -32,13 +32,3 @@ void ShieldsPanelHandler::CloseUI() { embedder->CloseUI(); } } - -void ShieldsPanelHandler::OpenURL(const GURL& url) { - Browser* browser = chrome::FindBrowserWithWebContents( - webui_controller_->web_ui()->GetWebContents()); - - if (!browser) - return; - - chrome::AddTabAt(browser, url, -1, true); -} diff --git a/browser/ui/webui/brave_shields/shields_panel_handler.h b/browser/ui/webui/brave_shields/shields_panel_handler.h index 0690c64ef11a..8bbd6c1f8a3a 100644 --- a/browser/ui/webui/brave_shields/shields_panel_handler.h +++ b/browser/ui/webui/brave_shields/shields_panel_handler.h @@ -31,7 +31,6 @@ class ShieldsPanelHandler : public brave_shields::mojom::PanelHandler { // brave_shields::mojom::PanelHandler: void ShowUI() override; void CloseUI() override; - void OpenURL(const GURL& url) override; private: mojo::Receiver receiver_; diff --git a/common/extensions/api/_api_features.json b/common/extensions/api/_api_features.json index 539ea3d8df5e..7e72b1dc3dba 100644 --- a/common/extensions/api/_api_features.json +++ b/common/extensions/api/_api_features.json @@ -72,7 +72,8 @@ "chrome://read-later.top-chrome/*", "chrome://tab-strip/*", "chrome://wallet-panel.top-chrome/*", - "chrome://wallet/*" + "chrome://wallet/*", + "chrome://brave-shields.top-chrome/*" ] }, { "channel": "stable", diff --git a/components/brave_shields/common/brave_shields_panel.mojom b/components/brave_shields/common/brave_shields_panel.mojom index 2b2a04386166..26991af69cf9 100644 --- a/components/brave_shields/common/brave_shields_panel.mojom +++ b/components/brave_shields/common/brave_shields_panel.mojom @@ -21,8 +21,6 @@ interface PanelHandler { // Notify the backend that the dialog should be closed. CloseUI(); - - OpenURL(url.mojom.Url url); }; // WebUI-side handler for requests from the browser. @@ -40,12 +38,14 @@ interface DataHandler { SetIsNoScriptsEnabled(bool is_enabled); SetHTTPSEverywhereEnabled(bool is_enabled); SetBraveShieldsEnabled(bool is_enabled); + OpenWebCompatWindow(); }; struct SiteBlockInfo { string host; int32 total_blocked_resources; bool is_shields_enabled; + url.mojom.Url favicon_url; array ads_list; array http_redirects_list; array js_list; diff --git a/components/brave_shields/resources/panel/components/advanced-controls-content/index.tsx b/components/brave_shields/resources/panel/components/advanced-controls-content/index.tsx index 292e741fde7b..038a96e7d67b 100644 --- a/components/brave_shields/resources/panel/components/advanced-controls-content/index.tsx +++ b/components/brave_shields/resources/panel/components/advanced-controls-content/index.tsx @@ -27,21 +27,29 @@ const fingerprintModeOptions = [ ] function GlobalSettings () { + const onAdBlockListsClick = () => { + chrome.tabs.create({ url: 'chrome://adblock', active: true }) + } + + const onSettingsClick = () => { + chrome.tabs.create({ url: 'chrome://settings/shields', active: true }) + } + return (
@@ -97,7 +105,9 @@ function AdvancedControlsContent () { > {adBlockModeOptions.map(entry => { return ( - + ) })} @@ -113,6 +123,7 @@ function AdvancedControlsContent () {
- setViewType?.(ViewType.Main)} > {getLocale('braveShields').replace('Brave ', '').trim()} - + ) diff --git a/components/brave_shields/resources/panel/components/tree-list/style.ts b/components/brave_shields/resources/panel/components/tree-list/style.ts index f8241aa5dc77..0c377142277a 100644 --- a/components/brave_shields/resources/panel/components/tree-list/style.ts +++ b/components/brave_shields/resources/panel/components/tree-list/style.ts @@ -21,7 +21,7 @@ export const TreeBox = styled.section` background-color: ${(p) => p.theme.color.background02}; padding: 10px 17px 10px 17px; height: calc(100% - 94px - 96px); /* subtract offset top from height of footer */ - overflow-y: scroll; + overflow: auto; position: relative; z-index: 2; ` @@ -32,6 +32,22 @@ export const Footer = styled.section` bottom: 0; width: 100%; z-index: 2; + + button { + width: 100%; + + div { + display: flex; + align-items: center; + justify-content: space-between; + } + + svg { + width: 20px; + height: 20px; + margin-right: 8px; + } + } ` export const SiteTitleBox = styled.div` @@ -89,7 +105,7 @@ export const BackButton = styled.button` export const Grid = styled.div` display: grid; - grid-template-columns: 20px 2fr 1fr; + grid-template-columns: 20px 2fr 0.5fr; grid-gap: 5px; align-items: center; font-family: ${(p) => p.theme.fontFamily.heading}; diff --git a/components/brave_shields/resources/panel/components/tree-list/tree-node.tsx b/components/brave_shields/resources/panel/components/tree-list/tree-node.tsx index 90c9158d2df1..aa278ca382e0 100644 --- a/components/brave_shields/resources/panel/components/tree-list/tree-node.tsx +++ b/components/brave_shields/resources/panel/components/tree-list/tree-node.tsx @@ -47,6 +47,7 @@ const ExpandToggleButton = styled.button` height: 14px; display: flex; align-items: center; + cursor: pointer; &:focus-visible { --border: 2px solid ${(p) => p.theme.color.focusBorder}; diff --git a/components/brave_shields/resources/panel/components/tree-list/url-element.tsx b/components/brave_shields/resources/panel/components/tree-list/url-element.tsx index b2a73354f239..8159ebb24e04 100644 --- a/components/brave_shields/resources/panel/components/tree-list/url-element.tsx +++ b/components/brave_shields/resources/panel/components/tree-list/url-element.tsx @@ -25,7 +25,6 @@ const Box = styled.div` ${p => p.isHost && css` direction: unset; - cursor: unset; margin-bottom: 12px; `} diff --git a/components/brave_shields/resources/panel/state/hooks.ts b/components/brave_shields/resources/panel/state/hooks.ts index 1bec959f9789..15fbb27a1f13 100644 --- a/components/brave_shields/resources/panel/state/hooks.ts +++ b/components/brave_shields/resources/panel/state/hooks.ts @@ -43,19 +43,3 @@ export function useSiteSettingsData () { return { siteSettings, getSiteSettings } } - -export function useFavIconUrl (url?: string) { - const [favIconUrl, setfavIconUrl] = React.useState() - - React.useEffect(() => { - if (!url) return - const faviconUrl = new URL('chrome://favicon2/') - faviconUrl.searchParams.set('size', '16') - faviconUrl.searchParams.set('scale_factor', '2x') - faviconUrl.searchParams.set('show_fallback_monogram', '') - faviconUrl.searchParams.set('page_url', `https://${url}`) - setfavIconUrl(faviconUrl.toString()) - }, [url]) - - return { favIconUrl } -} diff --git a/components/brave_shields/resources/panel/stories/component-panel.tsx b/components/brave_shields/resources/panel/stories/component-panel.tsx index baa28ade77df..080d83289d72 100644 --- a/components/brave_shields/resources/panel/stories/component-panel.tsx +++ b/components/brave_shields/resources/panel/stories/component-panel.tsx @@ -26,7 +26,9 @@ const LIST_JS = [ { 'url': 'https://www.redditstatic.com/desktop2x/Governance~Reddit~Subreddit~reddit-components-BlankPost~reddit-components-ClassicPost~reddit-compone~3b56c92e.14312dc2a044d45449c9.js' }, { 'url': 'https://www.redditstatic.com/desktop2x/ModListing~PostCreation~Reddit~StandalonePostPage~Subreddit.b725e7ecf5d621c30c53.js' }, { 'url': 'https://www.redditstatic.com/desktop2x/PostCreation~Reddit~StandalonePostPage~SubredditTopContent~TopWeekPostsDiscoveryUnit~reddit-componen~2583c786.1cc84f65074a696c0941.js' }, - { 'url': 'https://www.redditstatic.com/desktop2x/PostCreation~Reddit~StandalonePostPage~Subreddit~reddit-components-ClassicPost~reddit-components-Com~82e48dd3.85bb0a8c6be58f085676.js' }] + { 'url': 'https://www.redditstatic.com/desktop2x/PostCreation~Reddit~StandalonePostPage~Subreddit~reddit-components-ClassicPost~reddit-components-Com~82e48dd3.85bb0a8c6be58f085676.js' }, + { 'url': 'https://api.github.com/_private/browser/stats' } +] const LIST_ADS = [ { url: 'ads.brave.com' }, @@ -52,7 +54,8 @@ export default { adsList: LIST_ADS, jsList: LIST_JS, httpRedirectsList: [], - fingerprintsList: [] + fingerprintsList: [], + faviconUrl: { url: 'https://brave.com/static-assets/images/brave-favicon.png' } }, siteSettings: { adBlockMode: AdBlockMode.ALLOW, diff --git a/components/brave_shields/resources/panel/stories/locale.ts b/components/brave_shields/resources/panel/stories/locale.ts index 1868c70fdfd1..e1fc698907a0 100644 --- a/components/brave_shields/resources/panel/stories/locale.ts +++ b/components/brave_shields/resources/panel/stories/locale.ts @@ -5,7 +5,7 @@ provideStrings({ braveShieldsEnable: 'Enable Brave Shields', braveShieldsUp: 'Shields are UP $1for$2', braveShieldsDown: 'Shields are DOWN $1for$2', - braveShieldsBroken: 'If this site seems broken, try Shields down. $1Note: this may reduce Brave privacy protections.$2', + braveShieldsBroken: 'If this site seems broken, try Shields down. $1Note: this may reduce Brave\'s privacy protections.$2', braveShieldsBlockedNote: 'Trackers, ads, and more blocked $1Learn more$2', braveShieldsAdvancedCtrls: 'Advanced Controls', braveShieldSettingsDescription: 'Changing these settings might break sites.', @@ -29,5 +29,5 @@ provideStrings({ braveShieldsFingerprintingAllowAll: 'Allow all Fingerprinting', braveShieldsReportSite: 'Report site', braveShieldsReportSiteDesc: 'Tell us if the site wasn\'t working properly with Shields up.', - braveShieldsDownDesc: 'You are viewing this site without brave\'s privacy protection' + braveShieldsDownDesc: 'You are viewing this site without Brave\'s privacy protection' }) diff --git a/components/brave_shields/resources/panel/theme/shields-light.ts b/components/brave_shields/resources/panel/theme/shields-light.ts index 3623e5a9a5d7..0c21ee97022d 100644 --- a/components/brave_shields/resources/panel/theme/shields-light.ts +++ b/components/brave_shields/resources/panel/theme/shields-light.ts @@ -12,7 +12,8 @@ color: { ...defaultTheme.color, background03: '#F8F9FA', - text01: '#212529' + text01: '#212529', + warningIcon: '#EA3A0D' } } diff --git a/components/resources/brave_shields_strings.grdp b/components/resources/brave_shields_strings.grdp index b0b43a5eb4f8..5be4390aaf2f 100644 --- a/components/resources/brave_shields_strings.grdp +++ b/components/resources/brave_shields_strings.grdp @@ -18,7 +18,7 @@ If this site seems broken, try Shields down. - $1Note: this may reduce Brave privacy protections.$2 + $1Note: this may reduce Brave's privacy protections.$2 @@ -114,6 +114,10 @@ - You are viewing this site without brave's privacy protection + You are viewing this site without Brave's privacy protection + + + + Brave Shields $1 Trackers, ads and more blocked diff --git a/components/web-components/select/style.ts b/components/web-components/select/style.ts index ddecc34dd99d..059f8edfe8f8 100644 --- a/components/web-components/select/style.ts +++ b/components/web-components/select/style.ts @@ -23,9 +23,20 @@ export const Select = styled.select` color: ${(p) => p.theme.color.text01}; background-color: ${(p) => p.theme.color.background01}; border-radius: 4px; - border: 0; + border: 2px solid transparent; width: 100%; appearance: none; + transition: box-shadow 0.1s ease-in-out; + + &:hover { + @media (prefers-color-scheme: dark) { + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.36); + } + + @media (prefers-color-scheme: light) { + box-shadow: 0px 1px 4px rgba(99, 105, 110, 0.2); + } + } &:focus-visible { outline: 0; diff --git a/test/BUILD.gn b/test/BUILD.gn index e03a4e00c05f..2075f2bc2da9 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -343,6 +343,7 @@ test("brave_unit_tests") { deps += [ "//brave/app:brave_generated_resources_grit", "//brave/components/brave_shields/common:mojom", + "//components/favicon/content", ] }