From 6741457092d134b21f6a996a8b63417336e2106e Mon Sep 17 00:00:00 2001 From: Simon Hong Date: Thu, 13 Jan 2022 11:39:03 +0900 Subject: [PATCH] Updated widevine permission bubble fix https://github.com/brave/brave-browser/issues/9907 Permission bubble for widevine has custom footnote style. --- app/brave_generated_resources.grd | 24 +++- .../permission_prompt_bubble_view.cc | 115 +++++++++++++----- common/url_constants.cc | 4 +- common/url_constants.h | 2 +- 4 files changed, 104 insertions(+), 41 deletions(-) diff --git a/app/brave_generated_resources.grd b/app/brave_generated_resources.grd index 010bf477b33a..ee8a702fb915 100644 --- a/app/brave_generated_resources.grd +++ b/app/brave_generated_resources.grd @@ -214,8 +214,9 @@ Payment methods + - Install and run Widevine + Install and run Google Widevine Don't ask again @@ -237,16 +238,27 @@ - Install Widevine + Install Google Widevine - Restart browser to enable Widevine + Restart browser to enable Google Widevine - Google Widevine is a piece of Digital Rights Management (DRM) code that we at Brave Software do not own and cannot inspect. The Google Widevine code is loaded from Google servers, not from our servers. It is loaded only when you enable this option. We discourage the use of DRM, but we respect user choice and acknowledge that some Brave users would like to use services that require it. - -By installing this extension, you are agreeing to the Google Widevine Terms of Use. You agree that Brave is not responsible for any damages or losses in connection with your use of Google Widevine. + Widevine is sometimes needed to play media on a webpage. It's a Google extension loaded from Google servers, which Brave cannot inspect. By installing, you'll agree to Google's terms of use. + + + $1Learn more about Widevine. +Or change later at $2brave://settings/extensions. + + + Learn more about Widevine + + + brave://settings/extensions + + + $1google.com is asking you to diff --git a/chromium_src/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc b/chromium_src/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc index c461f79cb20c..708526892883 100644 --- a/chromium_src/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc +++ b/chromium_src/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc @@ -8,8 +8,10 @@ #include "base/feature_list.h" #include "brave/common/url_constants.h" #include "brave/components/permissions/permission_lifetime_utils.h" +#include "brave/grit/brave_generated_resources.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/common/webui_url_constants.h" +#include "chrome/grit/generated_resources.h" #include "components/grit/brave_components_strings.h" #include "components/permissions/features.h" #include "components/permissions/permission_prompt.h" @@ -25,7 +27,7 @@ #if BUILDFLAG(ENABLE_WIDEVINE) #include "brave/browser/widevine/widevine_permission_request.h" -#include "brave/grit/brave_generated_resources.h" +#include "brave/common/webui_url_constants.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "components/permissions/request_type.h" #include "ui/base/l10n/l10n_util.h" @@ -37,6 +39,48 @@ namespace { +std::unique_ptr CreateStyledLabelForFootnote( + Browser* browser, + const std::u16string& footnote, + const std::vector& replacements, + const std::vector& urls) { + // For now, only two links are added to permission bubble footnote. + DCHECK_EQ(2UL, replacements.size()); + DCHECK_EQ(replacements.size(), urls.size()); + + std::vector offsets; + std::u16string footnote_text = + base::ReplaceStringPlaceholders(footnote, replacements, &offsets); + + auto label = std::make_unique(); + label->SetText(footnote_text); + label->SetDefaultTextStyle(views::style::STYLE_SECONDARY); + + auto add_link = [&](size_t idx, GURL url) { + DCHECK(idx < offsets.size()); + DCHECK(idx < replacements.size()); + + gfx::Range link_range(offsets[idx], + offsets[idx] + replacements[idx].length()); + + views::StyledLabel::RangeStyleInfo link_style = + views::StyledLabel::RangeStyleInfo::CreateForLink(base::BindRepeating( + [](Browser* browser, const GURL& url) { + chrome::AddSelectedTabWithURL(browser, url, + ui::PAGE_TRANSITION_LINK); + }, + base::Unretained(browser), std::move(url))); + + label->AddStyleRange(link_range, link_style); + }; + + for (size_t i = 0; i < urls.size(); ++i) { + add_link(i, urls[i]); + } + + return label; +} + #if BUILDFLAG(ENABLE_WIDEVINE) class DontAskAgainCheckbox : public views::Checkbox { public: @@ -95,6 +139,22 @@ void AddAdditionalWidevineViewControlsIfNeeded( dialog_delegate_view->AddChildView( new DontAskAgainCheckbox(widevine_request)); } + +void AddWidevineFootnoteView( + views::BubbleDialogDelegateView* dialog_delegate_view, + Browser* browser) { + const std::u16string footnote = + l10n_util::GetStringUTF16(IDS_WIDEVINE_PERMISSIONS_BUBBLE_FOOTNOTE_TEXT); + const std::vector replacements{ + l10n_util::GetStringUTF16(IDS_WIDEVINE_PERMISSIONS_BUBBLE_LEARN_MORE), + l10n_util::GetStringUTF16( + IDS_PERMISSIONS_BUBBLE_SETTINGS_EXTENSIONS_LINK)}; + const std::vector urls{GURL(kWidevineLearnMoreUrl), + GURL(kExtensionSettingsURL)}; + + dialog_delegate_view->SetFootnoteView( + CreateStyledLabelForFootnote(browser, footnote, replacements, urls)); +} #else void AddAdditionalWidevineViewControlsIfNeeded( views::BubbleDialogDelegateView* dialog_delegate_view, @@ -173,46 +233,31 @@ views::View* AddPermissionLifetimeComboboxIfNeeded( void AddFootnoteViewIfNeeded( views::BubbleDialogDelegateView* dialog_delegate_view, + const std::vector& requests, Browser* browser) { +#if BUILDFLAG(ENABLE_WIDEVINE) + // Widevine permission bubble has custom footnote. + if (HasWidevinePermissionRequest(requests)) { + AddWidevineFootnoteView(dialog_delegate_view, browser); + return; + } +#endif + if (!base::FeatureList::IsEnabled( permissions::features::kPermissionLifetime)) { return; } - std::vector replacements{ + const std::u16string footnote = + l10n_util::GetStringUTF16(IDS_PERMISSIONS_BUBBLE_FOOTNOTE_TEXT); + const std::vector replacements{ l10n_util::GetStringUTF16(IDS_PERMISSIONS_BUBBLE_SITE_PERMISSION_LINK), l10n_util::GetStringUTF16(IDS_LEARN_MORE)}; - std::vector offsets; - std::u16string footnote_text = base::ReplaceStringPlaceholders( - l10n_util::GetStringUTF16(IDS_PERMISSIONS_BUBBLE_FOOTNOTE_TEXT), - replacements, &offsets); - - auto label = std::make_unique(); - label->SetText(footnote_text); - label->SetDefaultTextStyle(views::style::STYLE_SECONDARY); - - auto add_link = [&](size_t idx, GURL url) { - DCHECK(idx < offsets.size()); - DCHECK(idx < replacements.size()); - - gfx::Range link_range(offsets[idx], - offsets[idx] + replacements[idx].length()); - - views::StyledLabel::RangeStyleInfo link_style = - views::StyledLabel::RangeStyleInfo::CreateForLink(base::BindRepeating( - [](Browser* browser, const GURL& url) { - chrome::AddSelectedTabWithURL(browser, url, - ui::PAGE_TRANSITION_LINK); - }, - base::Unretained(browser), std::move(url))); - - label->AddStyleRange(link_range, link_style); - }; - - add_link(0, GURL(chrome::kChromeUIContentSettingsURL)); - add_link(1, GURL(kPermissionPromptLearnMoreUrl)); + const std::vector urls{GURL(chrome::kChromeUIContentSettingsURL), + GURL(kPermissionPromptLearnMoreUrl)}; - dialog_delegate_view->SetFootnoteView(std::move(label)); + dialog_delegate_view->SetFootnoteView( + CreateStyledLabelForFootnote(browser, footnote, replacements, urls)); } } // namespace @@ -221,7 +266,7 @@ void AddFootnoteViewIfNeeded( AddAdditionalWidevineViewControlsIfNeeded(this, delegate_->Requests()); \ auto* permission_lifetime_view = \ AddPermissionLifetimeComboboxIfNeeded(this, delegate_); \ - AddFootnoteViewIfNeeded(this, browser_); \ + AddFootnoteViewIfNeeded(this, delegate_->Requests(), browser_); \ if (permission_lifetime_view) { \ set_fixed_width( \ std::max(GetPreferredSize().width(), \ @@ -230,5 +275,9 @@ void AddFootnoteViewIfNeeded( set_should_ignore_snapping(true); \ } +// undef upstream one first then define it with our one. +#undef IDS_PERMISSIONS_BUBBLE_PROMPT +#define IDS_PERMISSIONS_BUBBLE_PROMPT IDS_BRAVE_PERMISSIONS_BUBBLE_PROMPT #include "src/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc" #undef BRAVE_PERMISSION_PROMPT_BUBBLE_VIEW +#undef IDS_PERMISSIONS_BUBBLE_PROMPT diff --git a/common/url_constants.cc b/common/url_constants.cc index 287c0537c2aa..b9f1ad000382 100644 --- a/common/url_constants.cc +++ b/common/url_constants.cc @@ -11,7 +11,6 @@ const char kMagnetScheme[] = "magnet"; const char kBinanceScheme[] = "com.brave.binance"; const char kGeminiScheme[] = "com.brave.gemini"; const char kFTXScheme[] = "com.brave.ftx"; -const char kWidevineMoreInfoURL[] = "https://www.eff.org/issues/drm"; const char kWidevineTOS[] = "https://policies.google.com/terms"; const char kRewardsUpholdSupport[] = "https://uphold.com/en/brave/support"; const char kP3ALearnMoreURL[] = "https://brave.com/P3A"; @@ -28,3 +27,6 @@ const char kSpeedreaderLearnMoreUrl[] = const char kWebDiscoveryLearnMoreUrl[] = "https://brave.com/browser/privacy/#web-discovery-project"; const char kBraveSearchUrl[] = "https://search.brave.com/"; +const char kWidevineLearnMoreUrl[] = + "https://support.brave.com/hc/en-us/articles/" + "360023851591-How-do-I-view-DRM-protected-content-"; diff --git a/common/url_constants.h b/common/url_constants.h index a2e18c2a61d9..7f8eafa3b997 100644 --- a/common/url_constants.h +++ b/common/url_constants.h @@ -13,7 +13,6 @@ extern const char kMagnetScheme[]; extern const char kBinanceScheme[]; extern const char kGeminiScheme[]; extern const char kFTXScheme[]; -extern const char kWidevineMoreInfoURL[]; extern const char kWidevineTOS[]; extern const char kRewardsUpholdSupport[]; extern const char kP3ALearnMoreURL[]; @@ -24,6 +23,7 @@ extern const char kPermissionPromptLearnMoreUrl[]; extern const char kSpeedreaderLearnMoreUrl[]; extern const char kWebDiscoveryLearnMoreUrl[]; extern const char kBraveSearchUrl[]; +extern const char kWidevineLearnMoreUrl[]; // This is introduced to replace |kDownloadChromeUrl| in // outdated_upgrade_bubble_view.cc"