diff --git a/app/brave_generated_resources.grd b/app/brave_generated_resources.grd index 1e5eab7e5d4c..77250048b2ea 100644 --- a/app/brave_generated_resources.grd +++ b/app/brave_generated_resources.grd @@ -196,6 +196,12 @@ Don't ask again + + Enable Widevine + + + Use Widevine digital rights management (DRM) component to view protected streaming video and other content in the browser. + Ask when a site wants to install Widevine on your computer. diff --git a/browser/brave_drm_tab_helper.cc b/browser/brave_drm_tab_helper.cc index e3cff42aefbe..e5a670cfe966 100644 --- a/browser/brave_drm_tab_helper.cc +++ b/browser/brave_drm_tab_helper.cc @@ -24,10 +24,9 @@ namespace { bool IsAlreadyRegistered(ComponentUpdateService* cus) { std::vector component_ids; component_ids = cus->GetComponentIDs(); - return std::find(component_ids.begin(), - component_ids.end(), + return std::find(component_ids.begin(), component_ids.end(), BraveDrmTabHelper::kWidevineComponentId) != - component_ids.end(); + component_ids.end(); } #if !defined(OS_LINUX) content::WebContents* GetActiveWebContents() { diff --git a/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_browser_proxy.js b/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_browser_proxy.js index d253972d0924..dec8ad8e6b22 100644 --- a/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_browser_proxy.js +++ b/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_browser_proxy.js @@ -19,6 +19,8 @@ cr.define('settings', function () { setTorEnabled (value) {} isTorEnabled () {} isTorManaged () {} + setWidevineEnabled() {} + isWidevineEnabled() {} getRestartNeeded () {} getWeb3ProviderList () {} wasSignInEnabledAtStartup () {} @@ -63,6 +65,14 @@ cr.define('settings', function () { return cr.sendWithPromise('isTorManaged') } + setWidevineEnabled (value) { + chrome.send('setWidevineEnabled', [value]) + } + + isWidevineEnabled () { + return cr.sendWithPromise('isWidevineEnabled') + } + getRestartNeeded () { return cr.sendWithPromise('getRestartNeeded') } diff --git a/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.html b/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.html index c69535fe46b3..bd08935b2fb4 100644 --- a/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.html +++ b/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.html @@ -175,6 +175,15 @@ label="Widevine" sub-label="$i18n{appearanceSettingsAskWidevineInstallDesc}"> + +
diff --git a/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.js b/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.js index 6e90ec3b1cbe..91b2455b1741 100644 --- a/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.js +++ b/browser/resources/settings/brave_default_extensions_page/brave_default_extensions_page.js @@ -21,6 +21,7 @@ Polymer({ properties: { showRestartToast_: Boolean, torEnabled_: Boolean, + widevineEnabled_: Boolean, disableTorOption_: Boolean, ipfsEnabled_: Boolean, showChangeIPFSGatewayDialog_: Boolean, @@ -42,6 +43,7 @@ Polymer({ this.onIPFSCompanionEnabledChange_ = this.onIPFSCompanionEnabledChange_.bind(this) this.openExtensionsPage_ = this.openExtensionsPage_.bind(this) this.openKeyboardShortcutsPage_ = this.openKeyboardShortcutsPage_.bind(this) + this.onWidevineEnabledChange_ = this.onWidevineEnabledChange_.bind(this) this.restartBrowser_ = this.restartBrowser_.bind(this) this.onTorEnabledChange_ = this.onTorEnabledChange_.bind(this) @@ -51,6 +53,9 @@ Polymer({ this.addWebUIListener('tor-enabled-changed', (enabled) => { this.torEnabled_ = enabled }) + this.addWebUIListener('widevine-enabled-changed', (enabled) => { + this.widevineEnabled_ = enabled + }) this.browserProxy_.getRestartNeeded().then(show => { this.showRestartToast_ = show; @@ -61,6 +66,9 @@ Polymer({ this.browserProxy_.isTorManaged().then(managed => { this.disableTorOption_ = managed }) + this.browserProxy_.isWidevineEnabled().then(enabled => { + this.widevineEnabled_ = enabled + }) this.browserProxy_.getWeb3ProviderList().then(list => { this.braveWeb3Providers_ = JSON.parse(list) }); @@ -101,6 +109,10 @@ Polymer({ this.browserProxy_.setTorEnabled(this.$.torEnabled.checked); }, + onWidevineEnabledChange_: function() { + this.browserProxy_.setWidevineEnabled(this.$.widevineEnabled.checked); + }, + openExtensionsPage_: function() { window.open("chrome://extensions", "_self"); }, diff --git a/browser/ui/BUILD.gn b/browser/ui/BUILD.gn index 623205b3493e..73c543954974 100644 --- a/browser/ui/BUILD.gn +++ b/browser/ui/BUILD.gn @@ -9,6 +9,7 @@ import("//brave/components/tor/buildflags/buildflags.gni") import("//build/config/features.gni") import("//chrome/common/features.gni") import("//components/gcm_driver/config.gni") +import("//third_party/widevine/cdm/widevine.gni") source_set("favicon_source") { # Remove when https://github.com/brave/brave-browser/issues/10614 is resolved @@ -323,6 +324,12 @@ source_set("ui") { "webui/settings/brave_default_extensions_handler.cc", "webui/settings/brave_default_extensions_handler.h", ] + + deps += [ "//third_party/widevine/cdm:buildflags" ] + + if (enable_widevine) { + deps += [ "//brave/browser/widevine" ] + } } if (brave_rewards_enabled) { diff --git a/browser/ui/webui/settings/brave_default_extensions_handler.cc b/browser/ui/webui/settings/brave_default_extensions_handler.cc index 556b17800c02..c13845f39352 100644 --- a/browser/ui/webui/settings/brave_default_extensions_handler.cc +++ b/browser/ui/webui/settings/brave_default_extensions_handler.cc @@ -43,8 +43,16 @@ #include "brave/components/brave_wallet/brave_wallet_constants.h" #endif +#if BUILDFLAG(ENABLE_WIDEVINE) +#include "brave/browser/widevine/widevine_utils.h" +#endif + BraveDefaultExtensionsHandler::BraveDefaultExtensionsHandler() - : weak_ptr_factory_(this) {} + : weak_ptr_factory_(this) { +#if BUILDFLAG(ENABLE_WIDEVINE) + was_widevine_enabled_ = IsWidevineOptedIn(); +#endif +} BraveDefaultExtensionsHandler::~BraveDefaultExtensionsHandler() {} @@ -92,6 +100,14 @@ void BraveDefaultExtensionsHandler::RegisterMessages() { "isTorManaged", base::BindRepeating(&BraveDefaultExtensionsHandler::IsTorManaged, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "setWidevineEnabled", + base::BindRepeating(&BraveDefaultExtensionsHandler::SetWidevineEnabled, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "isWidevineEnabled", + base::BindRepeating(&BraveDefaultExtensionsHandler::IsWidevineEnabled, + base::Unretained(this))); // Can't call this in ctor because it needs to access web_ui(). InitializePrefCallbacks(); @@ -108,13 +124,20 @@ void BraveDefaultExtensionsHandler::InitializePrefCallbacks() { prefs::kEnableMediaRouter, base::Bind(&BraveDefaultExtensionsHandler::OnMediaRouterEnabledChanged, base::Unretained(this))); -#if BUILDFLAG(ENABLE_TOR) local_state_change_registrar_.Init(g_brave_browser_process->local_state()); +#if BUILDFLAG(ENABLE_TOR) local_state_change_registrar_.Add( tor::prefs::kTorDisabled, base::Bind(&BraveDefaultExtensionsHandler::OnTorEnabledChanged, base::Unretained(this))); #endif + +#if BUILDFLAG(ENABLE_WIDEVINE) + local_state_change_registrar_.Add( + kWidevineOptedIn, + base::Bind(&BraveDefaultExtensionsHandler::OnWidevineEnabledChanged, + base::Unretained(this))); +#endif } void BraveDefaultExtensionsHandler::OnMediaRouterEnabledChanged() { @@ -126,7 +149,16 @@ bool BraveDefaultExtensionsHandler::IsRestartNeeded() { profile_->GetPrefs()->GetBoolean(prefs::kEnableMediaRouter); bool media_router_new_pref = profile_->GetPrefs()->GetBoolean(kBraveEnabledMediaRouter); - return media_router_current_pref != media_router_new_pref; + + if (media_router_current_pref != media_router_new_pref) + return true; + +#if BUILDFLAG(ENABLE_WIDEVINE) + if (was_widevine_enabled_ != IsWidevineOptedIn()) + return true; +#endif + + return false; } void BraveDefaultExtensionsHandler::GetRestartNeeded( @@ -274,6 +306,41 @@ void BraveDefaultExtensionsHandler::IsTorManaged(const base::ListValue* args) { ResolveJavascriptCallback(args->GetList()[0], base::Value(is_managed)); } +void BraveDefaultExtensionsHandler::SetWidevineEnabled( + const base::ListValue* args) { +#if BUILDFLAG(ENABLE_WIDEVINE) + CHECK_EQ(args->GetSize(), 1U); + bool enabled; + args->GetBoolean(0, &enabled); + enabled ? EnableWidevineCdmComponent() : DisableWidevineCdmComponent(); + AllowJavascript(); +#endif +} + +void BraveDefaultExtensionsHandler::IsWidevineEnabled( + const base::ListValue* args) { + CHECK_EQ(args->GetSize(), 1U); + AllowJavascript(); + ResolveJavascriptCallback(args->GetList()[0], +#if BUILDFLAG(ENABLE_WIDEVINE) + base::Value(IsWidevineOptedIn())); +#else + base::Value(false)); +#endif +} + +void BraveDefaultExtensionsHandler::OnWidevineEnabledChanged() { + if (IsJavascriptAllowed()) { + FireWebUIListener("widevine-enabled-changed", +#if BUILDFLAG(ENABLE_WIDEVINE) + base::Value(IsWidevineOptedIn())); +#else + base::Value(false)); +#endif + OnRestartNeededChanged(); + } +} + void BraveDefaultExtensionsHandler::SetIPFSCompanionEnabled( const base::ListValue* args) { CHECK_EQ(args->GetSize(), 1U); diff --git a/browser/ui/webui/settings/brave_default_extensions_handler.h b/browser/ui/webui/settings/brave_default_extensions_handler.h index 57a0ce1abfd6..e2507d662028 100644 --- a/browser/ui/webui/settings/brave_default_extensions_handler.h +++ b/browser/ui/webui/settings/brave_default_extensions_handler.h @@ -14,6 +14,7 @@ #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "chrome/common/extensions/webstore_install_result.h" #include "components/prefs/pref_change_registrar.h" +#include "third_party/widevine/cdm/buildflags.h" class Profile; @@ -40,6 +41,9 @@ class BraveDefaultExtensionsHandler : public settings::SettingsPageUIHandler { void IsTorEnabled(const base::ListValue* args); void OnTorEnabledChanged(); void IsTorManaged(const base::ListValue* args); + void SetWidevineEnabled(const base::ListValue* args); + void IsWidevineEnabled(const base::ListValue* args); + void OnWidevineEnabledChanged(); void InitializePrefCallbacks(); @@ -53,6 +57,9 @@ class BraveDefaultExtensionsHandler : public settings::SettingsPageUIHandler { void OnMediaRouterEnabledChanged(); bool IsRestartNeeded(); +#if BUILDFLAG(ENABLE_WIDEVINE) + bool was_widevine_enabled_ = false; +#endif Profile* profile_ = nullptr; PrefChangeRegistrar pref_change_registrar_; #if BUILDFLAG(ENABLE_TOR) diff --git a/browser/widevine/BUILD.gn b/browser/widevine/BUILD.gn index ade84ca67211..2d625702c452 100644 --- a/browser/widevine/BUILD.gn +++ b/browser/widevine/BUILD.gn @@ -7,10 +7,12 @@ source_set("widevine") { "//base", "//brave/app:brave_generated_resources_grit", "//brave/common:pref_names", - "//chrome/browser/ui", "//chrome/common", + "//components/component_updater/", "//components/content_settings/core/common", "//components/permissions", + "//components/pref_registry", + "//components/prefs", "//components/subresource_filter/content/browser", "//components/vector_icons", "//content/public/browser", diff --git a/browser/widevine/widevine_permission_request.cc b/browser/widevine/widevine_permission_request.cc index d6f5a2e28d7d..991bfcbfb055 100644 --- a/browser/widevine/widevine_permission_request.cc +++ b/browser/widevine/widevine_permission_request.cc @@ -18,9 +18,7 @@ bool WidevinePermissionRequest::is_test_ = false; WidevinePermissionRequest::WidevinePermissionRequest( content::WebContents* web_contents, bool for_restart) - : web_contents_(web_contents), - for_restart_(for_restart) { -} + : web_contents_(web_contents), for_restart_(for_restart) {} WidevinePermissionRequest::~WidevinePermissionRequest() = default; @@ -47,7 +45,7 @@ void WidevinePermissionRequest::PermissionGranted(bool is_one_time) { } #endif if (!for_restart_) - EnableWidevineCdmComponent(web_contents_); + EnableWidevineCdmComponent(); } void WidevinePermissionRequest::PermissionDenied() { diff --git a/browser/widevine/widevine_utils.cc b/browser/widevine/widevine_utils.cc index df53e522dcf3..b8d49f0750c6 100644 --- a/browser/widevine/widevine_utils.cc +++ b/browser/widevine/widevine_utils.cc @@ -10,16 +10,18 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "brave/browser/brave_browser_process_impl.h" +#include "brave/browser/brave_drm_tab_helper.h" #include "brave/browser/widevine/widevine_permission_request.h" #include "brave/common/pref_names.h" #include "brave/grit/brave_generated_resources.h" #include "chrome/browser/component_updater/widevine_cdm_component_installer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_paths.h" +#include "components/component_updater/component_updater_service.h" #include "components/permissions/permission_request_manager.h" +#include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -#include "components/pref_registry/pref_registry_syncable.h" #include "content/public/browser/browser_thread.h" #include "third_party/widevine/cdm/widevine_cdm_common.h" @@ -72,9 +74,7 @@ void ClearWidevinePrefs(Profile* profile) { } // namespace -void EnableWidevineCdmComponent(content::WebContents* web_contents) { - DCHECK(web_contents); - +void EnableWidevineCdmComponent() { if (IsWidevineOptedIn()) return; @@ -82,11 +82,20 @@ void EnableWidevineCdmComponent(content::WebContents* web_contents) { RegisterWidevineCdmComponent(g_brave_browser_process->component_updater()); } +void DisableWidevineCdmComponent() { + if (!IsWidevineOptedIn()) + return; + + SetWidevineOptedIn(false); + g_brave_browser_process->component_updater()->UnregisterComponent( + BraveDrmTabHelper::kWidevineComponentId); +} + int GetWidevinePermissionRequestTextFrangmentResourceId(bool for_restart) { #if defined(OS_LINUX) return for_restart - ? IDS_WIDEVINE_PERMISSION_REQUEST_TEXT_FRAGMENT_RESTART_BROWSER - : IDS_WIDEVINE_PERMISSION_REQUEST_TEXT_FRAGMENT_INSTALL; + ? IDS_WIDEVINE_PERMISSION_REQUEST_TEXT_FRAGMENT_RESTART_BROWSER + : IDS_WIDEVINE_PERMISSION_REQUEST_TEXT_FRAGMENT_INSTALL; #else return IDS_WIDEVINE_PERMISSION_REQUEST_TEXT_FRAGMENT; #endif @@ -149,8 +158,8 @@ void MigrateObsoleteWidevineLocalStatePrefs(PrefService* local_state) { #if defined(OS_LINUX) // If local state doesn't have default value, it means we've used old // widevine binary. Delete old widevine binary. - if (!local_state->FindPreference(kWidevineInstalledVersion)-> - IsDefaultValue()) { + if (!local_state->FindPreference(kWidevineInstalledVersion) + ->IsDefaultValue()) { DeleteOldWidevineBinary(); } #endif diff --git a/browser/widevine/widevine_utils.h b/browser/widevine/widevine_utils.h index 17fd69f43cf4..12b557bd3619 100644 --- a/browser/widevine/widevine_utils.h +++ b/browser/widevine/widevine_utils.h @@ -20,7 +20,8 @@ class PrefRegistrySimple; class PrefService; class Profile; -void EnableWidevineCdmComponent(content::WebContents* web_contents); +void EnableWidevineCdmComponent(); +void DisableWidevineCdmComponent(); void RegisterWidevineProfilePrefsForMigration( user_prefs::PrefRegistrySyncable* registry); int GetWidevinePermissionRequestTextFrangmentResourceId(bool for_restart); diff --git a/chromium_src/chrome/browser/component_updater/widevine_cdm_component_installer.cc b/chromium_src/chrome/browser/component_updater/widevine_cdm_component_installer.cc index 3af688fe65d0..10aeda33973a 100644 --- a/chromium_src/chrome/browser/component_updater/widevine_cdm_component_installer.cc +++ b/chromium_src/chrome/browser/component_updater/widevine_cdm_component_installer.cc @@ -7,7 +7,6 @@ #include "../../../../../chrome/browser/component_updater/widevine_cdm_component_installer.cc" // NOLINT #undef RegisterWidevineCdmComponent -#include "brave/browser/brave_browser_process_impl.h" #include "brave/browser/widevine/widevine_utils.h" #include "chrome/browser/component_updater/component_updater_utils.h" #include "components/component_updater/component_updater_service.h" @@ -15,25 +14,28 @@ namespace component_updater { +namespace { + void OnWidevineRegistered() { component_updater::BraveOnDemandUpdate(widevine_extension_id); } -void RegisterAndInstallWidevine() { +void RegisterAndInstallWidevine(ComponentUpdateService* cus) { // This code is similar to RegisterWidevineCdmComponent_ChromiumImpl // but that ignores the callback, and we handle it so we can force // an on demand update. auto installer = base::MakeRefCounted( std::make_unique()); - installer->Register(g_browser_process->component_updater(), - base::Bind(&OnWidevineRegistered)); + installer->Register(cus, base::Bind(&OnWidevineRegistered)); } +} // namespace + // Do nothing unless the user opts in! void RegisterWidevineCdmComponent(ComponentUpdateService* cus) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (IsWidevineOptedIn()) - RegisterAndInstallWidevine(); + RegisterAndInstallWidevine(cus); } } // namespace component_updater diff --git a/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 1158cb490d24..c96b0bef8eee 100644 --- a/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc @@ -240,6 +240,8 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source, {"torEnabledDesc", IDS_SETTINGS_ENABLE_TOR_DESC}, {"autoOnionLocationLabel", IDS_SETTINGS_AUTO_ONION_LOCATION_TITLE}, {"autoOnionLocationDesc", IDS_SETTINGS_AUTO_ONION_LOCATION_DESC}, + {"widevineEnabledLabel", IDS_SETTINGS_ENABLE_WIDEVINE_TITLE}, + {"widevineEnabledDesc", IDS_SETTINGS_ENABLE_WIDEVINE_DESC}, {"restartNotice", IDS_SETTINGS_RESTART_NOTICE}, {"relaunchButtonLabel", IDS_SETTINGS_RELAUNCH_BUTTON_LABEL}, {"manageExtensionsLabel", IDS_SETTINGS_MANAGE_EXTENSIONS_LABEL},