diff --git a/other/GPC.patch b/other/GPC.patch new file mode 100644 index 00000000..9cad50c7 --- /dev/null +++ b/other/GPC.patch @@ -0,0 +1,842 @@ +From: uazo +Date: Wed, 29 May 2024 13:43:50 +0000 +Subject: Enable Global Privacy Control + +License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html +--- + chrome/android/chrome_java_resources.gni | 1 + + chrome/android/chrome_java_sources.gni | 1 + + .../android/java/res/xml/gpc_preferences.xml | 15 +++ + .../java/res/xml/privacy_preferences.xml | 4 + + .../browser/privacy/settings/GpcSettings.java | 50 ++++++++ + .../privacy/settings/PrivacySettings.java | 9 ++ + chrome/app/settings_strings.grdp | 15 +++ + .../api/settings_private/prefs_util.cc | 1 + + chrome/browser/renderer_preferences_util.cc | 3 + + chrome/browser/resources/settings/BUILD.gn | 1 + + .../settings/privacy_page/cookies_page.html | 2 + + .../settings/privacy_page/cookies_page.ts | 1 + + .../settings/privacy_page/gpc_toggle.html | 32 +++++ + .../settings/privacy_page/gpc_toggle.ts | 112 ++++++++++++++++++ + .../Enable-Global-Privacy-Control.grdp | 15 +++ + chrome/browser/ui/prefs/pref_watcher.cc | 4 + + chrome/browser/ui/prefs/pref_watcher.h | 1 + + .../settings_localized_strings_provider.cc | 3 + + .../tracking_protection_prefs.cc | 1 + + .../tracking_protection_prefs.h | 2 + + .../tracking_protection_settings.cc | 15 +++ + .../tracking_protection_settings.h | 3 + + .../tracking_protection_settings_observer.h | 2 + + .../browser_initiated_resource_request.cc | 6 + + content/renderer/render_frame_impl.cc | 4 + + .../blink/common/loader/loader_constants.cc | 1 + + .../renderer_preferences_mojom_traits.cc | 1 + + .../public/common/loader/loader_constants.h | 1 + + .../renderer_preferences.h | 1 + + .../renderer_preferences_mojom_traits.h | 5 + + .../public/mojom/renderer_preferences.mojom | 2 + + .../renderer/bindings/idl_in_modules.gni | 5 + + .../renderer/core/exported/web_view_impl.cc | 3 + + third_party/blink/renderer/modules/BUILD.gn | 4 + + .../modules/global_privacy_control/BUILD.gn | 8 ++ + .../global_privacy_control.cc | 12 ++ + .../global_privacy_control.h | 15 +++ + .../navigator_global_privacy_control.idl | 6 + + ...orker_navigator_global_privacy_control.idl | 6 + + .../web_service_worker_fetch_context_impl.cc | 3 + + ...ted_or_shared_worker_fetch_context_impl.cc | 3 + + .../platform/runtime_enabled_features.json5 | 5 + + 42 files changed, 384 insertions(+) + create mode 100644 chrome/android/java/res/xml/gpc_preferences.xml + create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/GpcSettings.java + create mode 100644 chrome/browser/resources/settings/privacy_page/gpc_toggle.html + create mode 100644 chrome/browser/resources/settings/privacy_page/gpc_toggle.ts + create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Enable-Global-Privacy-Control.grdp + create mode 100644 third_party/blink/renderer/modules/global_privacy_control/BUILD.gn + create mode 100644 third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.cc + create mode 100644 third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.h + create mode 100644 third_party/blink/renderer/modules/global_privacy_control/navigator_global_privacy_control.idl + create mode 100644 third_party/blink/renderer/modules/global_privacy_control/worker_navigator_global_privacy_control.idl + +diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni +--- a/chrome/android/chrome_java_resources.gni ++++ b/chrome/android/chrome_java_resources.gni +@@ -628,6 +628,7 @@ chrome_java_resources = [ + "java/res/xml/contextual_search_preferences.xml", + "java/res/xml/developer_preferences.xml", + "java/res/xml/do_not_track_preferences.xml", ++ "java/res/xml/gpc_preferences.xml", + "java/res/xml/google_services_preferences.xml", + "java/res/xml/homepage_preferences.xml", + "java/res/xml/legal_information_preferences.xml", +diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni +--- a/chrome/android/chrome_java_sources.gni ++++ b/chrome/android/chrome_java_sources.gni +@@ -944,6 +944,7 @@ chrome_java_sources = [ + "java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java", + "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java", + "java/src/org/chromium/chrome/browser/policy/PolicyAuditorBridge.java", ++ "java/src/org/chromium/chrome/browser/privacy/settings/GpcSettings.java", + "java/src/org/chromium/chrome/browser/privacy/settings/DoNotTrackSettings.java", + "java/src/org/chromium/chrome/browser/privacy/settings/IncognitoLockSettings.java", + "java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java", +diff --git a/chrome/android/java/res/xml/gpc_preferences.xml b/chrome/android/java/res/xml/gpc_preferences.xml +new file mode 100644 +--- /dev/null ++++ b/chrome/android/java/res/xml/gpc_preferences.xml +@@ -0,0 +1,15 @@ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml +--- a/chrome/android/java/res/xml/privacy_preferences.xml ++++ b/chrome/android/java/res/xml/privacy_preferences.xml +@@ -55,6 +55,10 @@ found in the LICENSE file. + android:key="do_not_track" + android:title="@string/do_not_track_title" + android:fragment="org.chromium.chrome.browser.privacy.settings.DoNotTrackSettings" /> ++ + mPageTitle = new ObservableSupplierImpl<>(); ++ ++ @Override ++ public void onActivityCreated(Bundle savedInstanceState) { ++ super.onActivityCreated(savedInstanceState); ++ ++ mPageTitle.set(getString(R.string.gpc_title)); ++ } ++ ++ @Override ++ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { ++ SettingsUtils.addPreferencesFromResource(this, R.xml.gpc_preferences); ++ ++ ChromeSwitchPreference switchPreference = ++ (ChromeSwitchPreference) findPreference(PREF_SWITCH); ++ ++ PrefService prefService = UserPrefs.get(getProfile()); ++ boolean isEnabled = prefService.getBoolean(Pref.ENABLE_GPC); ++ switchPreference.setChecked(isEnabled); ++ ++ switchPreference.setOnPreferenceChangeListener( ++ (preference, newValue) -> { ++ prefService.setBoolean(Pref.ENABLE_GPC, (boolean) newValue); ++ return true; ++ }); ++ } ++ ++ @Override ++ public ObservableSupplier getPageTitle() { ++ return mPageTitle; ++ } ++} +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java +@@ -61,6 +61,7 @@ public class PrivacySettings extends ChromeBaseSettingsFragment + private static final String PREF_SECURE_DNS = "secure_dns"; + private static final String PREF_USAGE_STATS = "usage_stats_reporting"; + private static final String PREF_DO_NOT_TRACK = "do_not_track"; ++ private static final String PREF_GPC = "gpc"; + private static final String PREF_SAFE_BROWSING = "safe_browsing"; + private static final String PREF_SYNC_AND_SERVICES_LINK = "sync_and_services_link"; + private static final String PREF_PRIVACY_SANDBOX = "privacy_sandbox"; +@@ -322,6 +323,14 @@ public class PrivacySettings extends ChromeBaseSettingsFragment + : R.string.text_off); + } + ++ Preference gpcPref = findPreference(PREF_GPC); ++ if (gpcPref != null) { ++ gpcPref.setSummary( ++ UserPrefs.get(getProfile()).getBoolean(Pref.ENABLE_GPC) ++ ? R.string.text_on ++ : R.string.text_off); ++ } ++ + Preference ipProtectionPref = findPreference(PREF_IP_PROTECTION); + if (ipProtectionPref != null) { + ipProtectionPref.setSummary( +diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp +--- a/chrome/app/settings_strings.grdp ++++ b/chrome/app/settings_strings.grdp +@@ -2180,6 +2180,21 @@ + + Learn more about Do Not Track + ++ ++ Global Privacy Control "Sec-GPC" ++ ++ ++ Global Privacy Control "Sec-GPC" ++ ++ ++ Enables support for Global Privacy Control signals. ++ ++Right to opt-out of sale or sharing: You may request that businesses stop selling or sharing your personal information (“opt-out”). ++ ++Businesses cannot sell or share your personal information after they receive your opt-out request unless you later authorize them to do so again. ++ ++Please note that it only applies to the states of California (under CCPA and CPRA) and Colorado (under CoPA). ++ + + Permissions and content settings + +diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc +--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc ++++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc +@@ -370,6 +370,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() { + (*s_allowlist)[::prefs::kTrackingProtectionLevel] = + settings_api::PrefType::kNumber; + (*s_allowlist)[::prefs::kEnableDoNotTrack] = settings_api::PrefType::kBoolean; ++ (*s_allowlist)[::prefs::kEnableGPC] = settings_api::PrefType::kBoolean; + (*s_allowlist)[::prefs::kIpProtectionEnabled] = + settings_api::PrefType::kBoolean; + (*s_allowlist)[::prefs::kFingerprintingProtectionEnabled] = +diff --git a/chrome/browser/renderer_preferences_util.cc b/chrome/browser/renderer_preferences_util.cc +--- a/chrome/browser/renderer_preferences_util.cc ++++ b/chrome/browser/renderer_preferences_util.cc +@@ -117,6 +117,9 @@ void UpdateFromSystemSettings(blink::RendererPreferences* prefs, + prefs->enable_do_not_track = + TrackingProtectionSettingsFactory::GetForProfile(profile) + ->IsDoNotTrackEnabled(); ++ prefs->enable_gpc = ++ TrackingProtectionSettingsFactory::GetForProfile(profile) ++ ->IsGPCEnabled(); + prefs->enable_encrypted_media = + pref_service->GetBoolean(prefs::kEnableEncryptedMedia); + prefs->webrtc_ip_handling_policy = std::string(); +diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn +--- a/chrome/browser/resources/settings/BUILD.gn ++++ b/chrome/browser/resources/settings/BUILD.gn +@@ -121,6 +121,7 @@ build_webui("build") { + "privacy_page/cookies_page.ts", + "privacy_page/fingerprint_progress_arc.ts", + "privacy_page/do_not_track_toggle.ts", ++ "privacy_page/gpc_toggle.ts", + "privacy_page/personalization_options.ts", + "privacy_page/privacy_guide/privacy_guide_ad_topics_fragment.ts", + "privacy_page/privacy_guide/privacy_guide_completion_fragment.ts", +diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.html b/chrome/browser/resources/settings/privacy_page/cookies_page.html +--- a/chrome/browser/resources/settings/privacy_page/cookies_page.html ++++ b/chrome/browser/resources/settings/privacy_page/cookies_page.html +@@ -260,6 +260,8 @@ + + + ++ ++ + +diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.ts b/chrome/browser/resources/settings/privacy_page/cookies_page.ts +--- a/chrome/browser/resources/settings/privacy_page/cookies_page.ts ++++ b/chrome/browser/resources/settings/privacy_page/cookies_page.ts +@@ -19,6 +19,7 @@ import '../settings_shared.css.js'; + import '../site_settings/site_list.js'; + import './collapse_radio_button.js'; + import './do_not_track_toggle.js'; ++import './gpc_toggle.js'; + import '../controls/settings_radio_group.js'; + + import {PrefsMixin} from '/shared/settings/prefs/prefs_mixin.js'; +diff --git a/chrome/browser/resources/settings/privacy_page/gpc_toggle.html b/chrome/browser/resources/settings/privacy_page/gpc_toggle.html +new file mode 100644 +--- /dev/null ++++ b/chrome/browser/resources/settings/privacy_page/gpc_toggle.html +@@ -0,0 +1,39 @@ ++ ++ ++ ++ +diff --git a/chrome/browser/resources/settings/privacy_page/gpc_toggle.ts b/chrome/browser/resources/settings/privacy_page/gpc_toggle.ts +new file mode 100644 +--- /dev/null ++++ b/chrome/browser/resources/settings/privacy_page/gpc_toggle.ts +@@ -0,0 +1,112 @@ ++// Copyright 2020 The Chromium Authors ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++import 'chrome://resources/cr_elements/cr_button/cr_button.js'; ++import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; ++import '../settings_shared.css.js'; ++import '../controls/settings_toggle_button.js'; ++ ++import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; ++import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; ++ ++import type {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; ++ ++import {getTemplate} from './gpc_toggle.html.js'; ++ ++export interface SettingsGpcToggleElement { ++ $: { ++ toggle: SettingsToggleButtonElement, ++ }; ++} ++ ++export class SettingsGpcToggleElement extends PolymerElement { ++ static get is() { ++ return 'settings-gpc-toggle'; ++ } ++ ++ static get template() { ++ return getTemplate(); ++ } ++ ++ static get properties() { ++ return { ++ /** ++ * Preferences state. ++ */ ++ prefs: { ++ type: Object, ++ notify: true, ++ }, ++ ++ showDialog_: { ++ type: Boolean, ++ value: false, ++ }, ++ }; ++ } ++ ++ prefs: {enable_gpc: chrome.settingsPrivate.PrefObject}; ++ private showDialog_: boolean; ++ ++ private onDomChange_() { ++ if (this.showDialog_) { ++ this.shadowRoot!.querySelector('cr-dialog')!.showModal(); ++ } ++ } ++ ++ /** ++ * Handles the change event for the do-not-track toggle. Shows a ++ * confirmation dialog when enabling the setting. ++ */ ++ private onToggleChange_(event: Event) { ++ const target = event.target as SettingsToggleButtonElement; ++ if (!target.checked) { ++ // Always allow disabling the pref. ++ target.sendPrefChange(); ++ return; ++ } ++ ++ this.showDialog_ = true; ++ } ++ ++ private closeDialog_() { ++ this.shadowRoot!.querySelector('cr-dialog')!.close(); ++ this.showDialog_ = false; ++ } ++ ++ private onDialogClosed_() { ++ focusWithoutInk(this.toggle_); ++ } ++ ++ /** ++ * Handles the shared proxy confirmation dialog 'Confirm' button. ++ */ ++ private onDialogConfirm_() { ++ this.toggle_.sendPrefChange(); ++ this.closeDialog_(); ++ } ++ ++ /** ++ * Handles the shared proxy confirmation dialog 'Cancel' button or a cancel ++ * event. ++ */ ++ private onDialogCancel_() { ++ this.toggle_.resetToPrefValue(); ++ this.closeDialog_(); ++ } ++ ++ private get toggle_(): SettingsToggleButtonElement { ++ return this.shadowRoot!.querySelector( ++ '#toggle')!; ++ } ++} ++ ++declare global { ++ interface HTMLElementTagNameMap { ++ 'settings-gpc-toggle': SettingsGpcToggleElement; ++ } ++} ++ ++customElements.define( ++ SettingsGpcToggleElement.is, SettingsGpcToggleElement); +diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Enable-Global-Privacy-Control.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Enable-Global-Privacy-Control.grdp +new file mode 100644 +--- /dev/null ++++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Enable-Global-Privacy-Control.grdp +@@ -0,0 +1,15 @@ ++ ++ ++ ++ Global Privacy Control "Sec-GPC" ++ ++ ++ Enables support for Global Privacy Control signals. ++ ++Right to opt-out of sale or sharing: You may request that businesses stop selling or sharing your personal information (“opt-out”). ++ ++Businesses cannot sell or share your personal information after they receive your opt-out request unless you later authorize them to do so again. ++ ++Please note that it only applies to the states of California (under CCPA and CPRA) and Colorado (under CoPA). ++ ++ +diff --git a/chrome/browser/ui/prefs/pref_watcher.cc b/chrome/browser/ui/prefs/pref_watcher.cc +--- a/chrome/browser/ui/prefs/pref_watcher.cc ++++ b/chrome/browser/ui/prefs/pref_watcher.cc +@@ -168,6 +168,10 @@ void PrefWatcher::OnDoNotTrackEnabledChanged() { + UpdateRendererPreferences(); + } + ++void PrefWatcher::OnGPCEnabledChanged() { ++ UpdateRendererPreferences(); ++} ++ + void PrefWatcher::UpdateRendererPreferences() { + for (PrefsTabHelper* helper : tab_helpers_) { + helper->UpdateRendererPreferences(); +diff --git a/chrome/browser/ui/prefs/pref_watcher.h b/chrome/browser/ui/prefs/pref_watcher.h +--- a/chrome/browser/ui/prefs/pref_watcher.h ++++ b/chrome/browser/ui/prefs/pref_watcher.h +@@ -44,6 +44,7 @@ class PrefWatcher : public KeyedService, + void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override; + + void OnDoNotTrackEnabledChanged() override; ++ void OnGPCEnabledChanged() override; + + void UpdateRendererPreferences(); + void OnWebPrefChanged(const std::string& pref_name); +diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc ++++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +@@ -1680,6 +1680,9 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, + {"doNotTrackDialogMessage", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TEXT}, + {"doNotTrackDialogLearnMoreA11yLabel", + IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_LEARN_MORE_ACCESSIBILITY_LABEL}, ++ {"gpc", IDS_SETTINGS_ENABLE_GPC}, ++ {"gpcDialogTitle", IDS_SETTINGS_ENABLE_GPC_DIALOG_TITLE}, ++ {"gpcDialogMessage", IDS_SETTINGS_ENABLE_GPC_DIALOG_TEXT}, + // TODO(crbug.com/40122957): This string is no longer used. Remove. + {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS}, + {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION}, +diff --git a/components/privacy_sandbox/tracking_protection_prefs.cc b/components/privacy_sandbox/tracking_protection_prefs.cc +--- a/components/privacy_sandbox/tracking_protection_prefs.cc ++++ b/components/privacy_sandbox/tracking_protection_prefs.cc +@@ -49,6 +49,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref( + prefs::kEnableDoNotTrack, true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); ++ registry->RegisterBooleanPref(prefs::kEnableGPC, true); + registry->RegisterBooleanPref(prefs::kUserBypass3pcExceptionsMigrated, false); + + // TODO(https://b/333527273): Deprecate +diff --git a/components/privacy_sandbox/tracking_protection_prefs.h b/components/privacy_sandbox/tracking_protection_prefs.h +--- a/components/privacy_sandbox/tracking_protection_prefs.h ++++ b/components/privacy_sandbox/tracking_protection_prefs.h +@@ -104,6 +104,8 @@ inline constexpr char kFingerprintingProtectionEnabled[] = + // Whether to send the DNT header. + inline constexpr char kEnableDoNotTrack[] = "enable_do_not_track"; + ++inline constexpr char kEnableGPC[] = "enable_gpc"; ++ + // Whether User Bypass 3PC exceptions have been migrated to Tracking Protection + // exceptions. + inline constexpr char kUserBypass3pcExceptionsMigrated[] = +diff --git a/components/privacy_sandbox/tracking_protection_settings.cc b/components/privacy_sandbox/tracking_protection_settings.cc +--- a/components/privacy_sandbox/tracking_protection_settings.cc ++++ b/components/privacy_sandbox/tracking_protection_settings.cc +@@ -38,6 +38,11 @@ TrackingProtectionSettings::TrackingProtectionSettings( + base::BindRepeating( + &TrackingProtectionSettings::OnDoNotTrackEnabledPrefChanged, + base::Unretained(this))); ++ pref_change_registrar_.Add( ++ prefs::kEnableGPC, ++ base::BindRepeating( ++ &TrackingProtectionSettings::OnGPCEnabledPrefChanged, ++ base::Unretained(this))); + pref_change_registrar_.Add( + prefs::kIpProtectionEnabled, + base::BindRepeating( +@@ -214,6 +219,16 @@ void TrackingProtectionSettings::OnDoNotTrackEnabledPrefChanged() { + } + } + ++bool TrackingProtectionSettings::IsGPCEnabled() const { ++ return pref_service_->GetBoolean(prefs::kEnableGPC); ++} ++ ++void TrackingProtectionSettings::OnGPCEnabledPrefChanged() { ++ for (auto& observer : observers_) { ++ observer.OnGPCEnabledChanged(); ++ } ++} ++ + void TrackingProtectionSettings::OnIpProtectionPrefChanged() { + for (auto& observer : observers_) { + observer.OnIpProtectionEnabledChanged(); +diff --git a/components/privacy_sandbox/tracking_protection_settings.h b/components/privacy_sandbox/tracking_protection_settings.h +--- a/components/privacy_sandbox/tracking_protection_settings.h ++++ b/components/privacy_sandbox/tracking_protection_settings.h +@@ -38,6 +38,8 @@ class TrackingProtectionSettings : public KeyedService { + // Returns whether "do not track" is enabled. + bool IsDoNotTrackEnabled() const; + ++ bool IsGPCEnabled() const; ++ + // Returns whether tracking protection for 3PCD (prefs + UX) is enabled. + bool IsTrackingProtection3pcdEnabled() const; + +@@ -72,6 +74,7 @@ class TrackingProtectionSettings : public KeyedService { + + // Callbacks for pref observation. + void OnDoNotTrackEnabledPrefChanged(); ++ void OnGPCEnabledPrefChanged(); + void OnBlockAllThirdPartyCookiesPrefChanged(); + void OnTrackingProtection3pcdPrefChanged(); + void OnIpProtectionPrefChanged(); +diff --git a/components/privacy_sandbox/tracking_protection_settings_observer.h b/components/privacy_sandbox/tracking_protection_settings_observer.h +--- a/components/privacy_sandbox/tracking_protection_settings_observer.h ++++ b/components/privacy_sandbox/tracking_protection_settings_observer.h +@@ -22,6 +22,8 @@ class TrackingProtectionSettingsObserver { + // For observation of DNT. + virtual void OnDoNotTrackEnabledChanged() {} + ++ virtual void OnGPCEnabledChanged() {} ++ + // For observation of IP protection. + virtual void OnIpProtectionEnabledChanged() {} + +diff --git a/content/browser/loader/browser_initiated_resource_request.cc b/content/browser/loader/browser_initiated_resource_request.cc +--- a/content/browser/loader/browser_initiated_resource_request.cc ++++ b/content/browser/loader/browser_initiated_resource_request.cc +@@ -30,6 +30,12 @@ void UpdateAdditionalHeadersForBrowserInitiatedRequest( + } + headers->SetHeaderIfMissing(blink::kDoNotTrackHeader, "1"); + } ++ if (renderer_preferences.enable_gpc) { ++ if (should_update_existing_headers) { ++ headers->RemoveHeader(blink::kSecGPCHeader); ++ } ++ headers->SetHeaderIfMissing(blink::kSecGPCHeader, "1"); ++ } + + // TODO(crbug.com/40833603): WARNING: This bypasses the permissions policy. + // Unfortunately, workers lack a permissions policy and to derive proper hints +diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc +--- a/content/renderer/render_frame_impl.cc ++++ b/content/renderer/render_frame_impl.cc +@@ -4610,6 +4610,10 @@ void RenderFrameImpl::FinalizeRequestInternal( + request.SetHttpHeaderField( + blink::WebString::FromUTF8(blink::kDoNotTrackHeader), "1"); + } ++ if (GetWebView()->GetRendererPreferences().enable_gpc) { ++ request.SetHttpHeaderField( ++ blink::WebString::FromUTF8(blink::kSecGPCHeader), "1"); ++ } + + // The request's extra data may indicate that we should set a custom user + // agent. This needs to be done here, after WebKit is through with setting the +diff --git a/third_party/blink/common/loader/loader_constants.cc b/third_party/blink/common/loader/loader_constants.cc +--- a/third_party/blink/common/loader/loader_constants.cc ++++ b/third_party/blink/common/loader/loader_constants.cc +@@ -7,5 +7,6 @@ + namespace blink { + + const char kDoNotTrackHeader[] = "DNT"; ++const char kSecGPCHeader[] = "Sec-GPC"; + + } // namespace blink +diff --git a/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc b/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc +--- a/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc ++++ b/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc +@@ -49,6 +49,7 @@ bool StructTraitsenable_referrers = data.enable_referrers(); + out->allow_cross_origin_auth_prompt = data.allow_cross_origin_auth_prompt(); + out->enable_do_not_track = data.enable_do_not_track(); ++ out->enable_gpc = data.enable_gpc(); + out->enable_encrypted_media = data.enable_encrypted_media(); + + if (!data.ReadWebrtcIpHandlingPolicy(&out->webrtc_ip_handling_policy)) +diff --git a/third_party/blink/public/common/loader/loader_constants.h b/third_party/blink/public/common/loader/loader_constants.h +--- a/third_party/blink/public/common/loader/loader_constants.h ++++ b/third_party/blink/public/common/loader/loader_constants.h +@@ -11,6 +11,7 @@ namespace blink { + + // HTTP header set in requests to indicate they should be marked DoNotTrack. + BLINK_COMMON_EXPORT extern const char kDoNotTrackHeader[]; ++BLINK_COMMON_EXPORT extern const char kSecGPCHeader[]; + + // These values indicate the load progress constants shared between both + // //content and //blink. +diff --git a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h +--- a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h ++++ b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h +@@ -57,6 +57,7 @@ struct BLINK_COMMON_EXPORT RendererPreferences { + bool enable_referrers{true}; + bool allow_cross_origin_auth_prompt{false}; + bool enable_do_not_track{false}; ++ bool enable_gpc{false}; + bool enable_encrypted_media{true}; + std::string webrtc_ip_handling_policy; + uint16_t webrtc_udp_min_port{0}; +diff --git a/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h b/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h +--- a/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h ++++ b/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h +@@ -126,6 +126,11 @@ struct BLINK_COMMON_EXPORT + return data.enable_do_not_track; + } + ++ static const bool& enable_gpc( ++ const ::blink::RendererPreferences& data) { ++ return data.enable_gpc; ++ } ++ + static const bool& enable_encrypted_media( + const ::blink::RendererPreferences& data) { + return data.enable_encrypted_media; +diff --git a/third_party/blink/public/mojom/renderer_preferences.mojom b/third_party/blink/public/mojom/renderer_preferences.mojom +--- a/third_party/blink/public/mojom/renderer_preferences.mojom ++++ b/third_party/blink/public/mojom/renderer_preferences.mojom +@@ -84,6 +84,8 @@ struct RendererPreferences { + // Set to true to indicate that the preference to set DNT to 1 is enabled. + bool enable_do_not_track = false; + ++ bool enable_gpc = false; ++ + // Whether to allow the use of Encrypted Media Extensions (EME), except for + // the use of Clear Key key system which is always allowed as required by the + // spec. +diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni +--- a/third_party/blink/renderer/bindings/idl_in_modules.gni ++++ b/third_party/blink/renderer/bindings/idl_in_modules.gni +@@ -1269,6 +1269,11 @@ static_idl_files_in_modules = [ + "//third_party/blink/renderer/modules/xr/xr_webgl_sub_image.idl", + ] + ++static_idl_files_in_modules += [ ++ "//third_party/blink/renderer/modules/global_privacy_control/navigator_global_privacy_control.idl", ++ "//third_party/blink/renderer/modules/global_privacy_control/worker_navigator_global_privacy_control.idl", ++] ++ + # Direct Sockets + # This uses target_os rather than current_os (which is what is_android is set + # from) for the case of generating the v8 context snapshot for android. When +diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc +--- a/third_party/blink/renderer/core/exported/web_view_impl.cc ++++ b/third_party/blink/renderer/core/exported/web_view_impl.cc +@@ -3535,6 +3535,9 @@ void WebViewImpl::UpdateRendererPreferences( + GetSettings()->SetCaretBrowsingEnabled( + renderer_preferences_.caret_browsing_enabled); + ++ WebRuntimeFeatures::EnableGlobalPrivacyControl( ++ renderer_preferences_.enable_gpc); ++ + #if BUILDFLAG(IS_OZONE) + GetSettings()->SetSelectionClipboardBufferAvailable( + renderer_preferences_.selection_clipboard_buffer_available); +diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn +--- a/third_party/blink/renderer/modules/BUILD.gn ++++ b/third_party/blink/renderer/modules/BUILD.gn +@@ -172,6 +172,10 @@ component("modules") { + "//third_party/blink/renderer/modules/xr", + ] + ++ sub_modules += [ ++ "//third_party/blink/renderer/modules/global_privacy_control", ++ ] ++ + # This uses target_os rather than current_os (which is what is_android is set + # from) for the case of generating the v8 context snapshot for android. When + # generating the snapshot for android, blink is compiled with +diff --git a/third_party/blink/renderer/modules/global_privacy_control/BUILD.gn b/third_party/blink/renderer/modules/global_privacy_control/BUILD.gn +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/modules/global_privacy_control/BUILD.gn +@@ -0,0 +1,8 @@ ++import("//third_party/blink/renderer/modules/modules.gni") ++ ++blink_modules_sources("global_privacy_control") { ++ sources = [ ++ "global_privacy_control.cc", ++ "global_privacy_control.h", ++ ] ++} +diff --git a/third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.cc b/third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.cc +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.cc +@@ -0,0 +1,12 @@ ++#include "third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.h" ++ ++#include "base/feature_list.h" ++#include "third_party/blink/public/common/features.h" ++ ++namespace blink { ++ ++bool GlobalPrivacyControl::globalPrivacyControl(NavigatorBase& navigator) { ++ return true; ++} ++ ++} // namespace blink +diff --git a/third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.h b/third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.h +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/modules/global_privacy_control/global_privacy_control.h +@@ -0,0 +1,15 @@ ++#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_GLOBAL_PRIVACY_CONTROL_GLOBAL_PRIVACY_CONTROL_H_ ++#define THIRD_PARTY_BLINK_RENDERER_MODULES_GLOBAL_PRIVACY_CONTROL_GLOBAL_PRIVACY_CONTROL_H_ ++ ++#include "third_party/blink/renderer/core/execution_context/navigator_base.h" ++ ++namespace blink { ++ ++class GlobalPrivacyControl final { ++ public: ++ static bool globalPrivacyControl(NavigatorBase&); ++}; ++ ++} // namespace blink ++ ++#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_GLOBAL_PRIVACY_CONTROL_GLOBAL_PRIVACY_CONTROL_H_ +diff --git a/third_party/blink/renderer/modules/global_privacy_control/navigator_global_privacy_control.idl b/third_party/blink/renderer/modules/global_privacy_control/navigator_global_privacy_control.idl +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/modules/global_privacy_control/navigator_global_privacy_control.idl +@@ -0,0 +1,6 @@ ++[ ++ RuntimeEnabled=GlobalPrivacyControl, ++ ImplementedAs=GlobalPrivacyControl ++] partial interface Navigator { ++ readonly attribute boolean globalPrivacyControl; ++}; +diff --git a/third_party/blink/renderer/modules/global_privacy_control/worker_navigator_global_privacy_control.idl b/third_party/blink/renderer/modules/global_privacy_control/worker_navigator_global_privacy_control.idl +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/modules/global_privacy_control/worker_navigator_global_privacy_control.idl +@@ -0,0 +1,6 @@ ++[ ++ RuntimeEnabled=GlobalPrivacyControl, ++ ImplementedAs=GlobalPrivacyControl ++] partial interface WorkerNavigator { ++ readonly attribute boolean globalPrivacyControl; ++}; +diff --git a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc +--- a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc ++++ b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc +@@ -154,6 +154,9 @@ void WebServiceWorkerFetchContextImpl::FinalizeRequest(WebURLRequest& request) { + if (renderer_preferences_.enable_do_not_track) { + request.SetHttpHeaderField(WebString::FromUTF8(kDoNotTrackHeader), "1"); + } ++ if (renderer_preferences_.enable_gpc) { ++ request.SetHttpHeaderField(WebString::FromUTF8(kSecGPCHeader), "1"); ++ } + auto url_request_extra_data = base::MakeRefCounted(); + url_request_extra_data->set_originated_from_service_worker(true); + +diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc +--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc ++++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc +@@ -384,6 +384,9 @@ void DedicatedOrSharedWorkerFetchContextImpl::FinalizeRequest( + if (renderer_preferences_.enable_do_not_track) { + request.SetHttpHeaderField(WebString::FromUTF8(kDoNotTrackHeader), "1"); + } ++ if (renderer_preferences_.enable_gpc) { ++ request.SetHttpHeaderField(WebString::FromUTF8(kSecGPCHeader), "1"); ++ } + + auto url_request_extra_data = base::MakeRefCounted(); + request.SetURLRequestExtraData(std::move(url_request_extra_data)); +diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 +--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 ++++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5 +@@ -2142,6 +2142,11 @@ + status: "stable", + base_feature: "none", + }, ++ { ++ name: "GlobalPrivacyControl", ++ base_feature_status: "enabled", ++ public: true, ++ }, + { + name: "ForcedColorsPreserveParentColor", + status: "stable", +-- diff --git a/other/ffmpeg_hevc_ac3.patch b/other/ffmpeg_hevc_ac3.patch index de57b597..299a7360 100644 --- a/other/ffmpeg_hevc_ac3.patch +++ b/other/ffmpeg_hevc_ac3.patch @@ -362,7 +362,7 @@ diff --git a/ffmpeg_generated.gni b/ffmpeg_generated.gni index c279607332..012c89422f 100644 --- a/ffmpeg_generated.gni +++ b/ffmpeg_generated.gni -@@ -232,7 +232,19 @@ if ((is_apple && ffmpeg_branding == "Chrome") || +@@ -235,7 +235,19 @@ if ((is_apple && ffmpeg_branding == "Chrome") || "libavcodec/hevc_sei.c", "libavcodec/hevcdec.c", "libavcodec/hevcdsp.c", @@ -383,7 +383,7 @@ index c279607332..012c89422f 100644 ] ffmpeg_c_sources += [ -@@ -287,7 +299,10 @@ if ((is_apple && current_cpu == "x64" && ffmpeg_branding == "Chrome") || +@@ -469,7 +481,10 @@ if ((is_apple && current_cpu == "x64" && ffmpeg_branding == "Chrome") || "libavcodec/x86/hevc_mc.asm", "libavcodec/x86/hevc_sao.asm", "libavcodec/x86/hevc_sao_10bit.asm", diff --git a/other/ftp-support-thorium.patch b/other/ftp-support-thorium.patch index 6a32a168..4fb99fb1 100644 --- a/other/ftp-support-thorium.patch +++ b/other/ftp-support-thorium.patch @@ -68,7 +68,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index c9e74052c7afb..d271ccc0dca71 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc -@@ -8540,6 +8540,12 @@ const FeatureEntry kFeatureEntries[] = { +@@ -8542,6 +8542,12 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE( heavy_ad_intervention::features::kHeavyAdPrivacyMitigations)}, diff --git a/other/thorium-2024-ui.patch b/other/thorium-2024-ui.patch index 43513a8a..88ec75f8 100644 --- a/other/thorium-2024-ui.patch +++ b/other/thorium-2024-ui.patch @@ -99,7 +99,7 @@ index 0d93ca4713624..98abb80818124 100644 + if (severity < g_min_log_level) { return false; + } -+ if (IsVerbose()) { ++ if (features::IsVerbose()) { + return true; + } @@ -113,7 +113,7 @@ index 0d93ca4713624..98abb80818124 100644 + if (g_logging_destination & LOG_TO_STDERR) { return true; + } -+ if (IsVerbose()) { ++ if (features::IsVerbose()) { + return true; + } diff --git a/setup.sh b/setup.sh index 25792dc4..e2eb5111 100755 --- a/setup.sh +++ b/setup.sh @@ -93,6 +93,7 @@ patchThor () { cp -v other/fix-policy-templates.patch ${CR_SRC_DIR}/ && cp -v other/ftp-support-thorium.patch ${CR_SRC_DIR}/ && cp -v other/thorium-2024-ui.patch ${CR_SRC_DIR}/ && + cp -v other/GPC.patch ${CR_SRC_DIR}/ && printf "\n" && printf "${YEL}Patching FFMPEG for HEVC...${c0}\n" && @@ -109,6 +110,11 @@ patchThor () { cd ${CR_SRC_DIR} && git apply --reject ./ftp-support-thorium.patch && + printf "\n" && + printf "${YEL}Patching in GPC support...${c0}\n" && + cd ${CR_SRC_DIR} && + git apply --reject ./GPC.patch + printf "\n" && printf "${YEL}Patching for Thorium 2024 UI...${c0}\n" && cd ${CR_SRC_DIR} && diff --git a/src/media/base/media_switches.cc b/src/media/base/media_switches.cc index a056ad07..d2f8bec3 100644 --- a/src/media/base/media_switches.cc +++ b/src/media/base/media_switches.cc @@ -1423,7 +1423,7 @@ BASE_FEATURE(kPlatformEncryptedDolbyVision, #if BUILDFLAG(IS_WIN) base::FEATURE_ENABLED_BY_DEFAULT #else - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT #endif );