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 | 58 +++++++++ .../privacy/settings/PrivacySettings.java | 9 ++ chrome/app/settings_strings.grdp | 15 +++ .../api/settings_private/prefs_util.cc | 1 + chrome/browser/renderer_preferences_util.cc | 2 + 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/browser_ui_prefs.cc | 1 + chrome/browser/ui/prefs/pref_watcher.cc | 2 + .../settings_localized_strings_provider.cc | 3 + chrome/common/pref_names.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 + ...shared_worker_global_scope_context_impl.cc | 3 + .../platform/runtime_enabled_features.json5 | 5 + 38 files changed, 368 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 @@ -667,6 +667,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 @@ -1003,6 +1003,7 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.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/PasswordEchoSettingHandler.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 @@ -42,6 +42,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 = + ObservableSuppliers.createMonotonic(); + + @Override + public @SettingsFragment.AnimationType int getAnimationType() { + return SettingsFragment.AnimationType.PROPERTY; + } + + @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 MonotonicObservableSupplier 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 @@ -136,6 +136,7 @@ public class PrivacySettings extends ChromeBaseSettingsFragment private static final String PREF_HTTPS_FIRST_MODE_LEGACY = "https_first_mode_legacy"; private static final String PREF_SECURE_DNS = "secure_dns"; private static final String PREF_USAGE_STATS = "usage_stats_reporting"; + private static final String PREF_GPC = "gpc"; private static final String PREF_SAFE_BROWSING = "safe_browsing"; private static final String PREF_PASSWORD_LEAK_DETECTION = "password_leak_detection"; private static final String PREF_SYNC_AND_SERVICES_LINK = "sync_and_services_link"; @@ -611,6 +612,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 tabGridUseIcons = (ChromeSwitchPreference) findPreference(PREF_TABGRID_USE_ICONS); tabGridUseIcons.setOnPreferenceChangeListener(this); 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 @@ -1937,6 +1937,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 @@ -450,6 +450,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() { (*s_allowlist)[::prefs::kBlockAll3pcToggleEnabled] = settings_api::PrefType::kBoolean; (*s_allowlist)[::prefs::kEnableDoNotTrack] = settings_api::PrefType::kBoolean; + (*s_allowlist)[::prefs::kEnableGPC] = settings_api::PrefType::kBoolean; // Sync and personalization page. (*s_allowlist)[::prefs::kSearchSuggestEnabled] = 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 @@ -153,6 +153,8 @@ void UpdateFromSystemSettings(blink::RendererPreferences* prefs, prefs->referrers_policy = pref_service->GetInteger(prefs::kReferrersPolicy); prefs->enable_do_not_track = pref_service->GetBoolean(prefs::kEnableDoNotTrack); + prefs->enable_gpc = + pref_service->GetBoolean(prefs::kEnableGPC); prefs->enable_encrypted_media = pref_service->GetBoolean(prefs::kEnableEncryptedMedia); 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 @@ -129,6 +129,7 @@ build_webui("build") { "performance_page/tab_discard/exception_tabbed_add_dialog.ts", "privacy_page/cookies_page.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 @@ -145,6 +145,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 @@ -22,6 +22,7 @@ import '../privacy_icons.html.js'; import '../settings_page/settings_subpage.js'; import '../settings_shared.css.js'; import '../site_settings/site_list.js'; +import './gpc_toggle.js'; import './do_not_track_toggle.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,32 @@ + + + + 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, + }, + }; + } + + declare prefs: {enable_gpc: chrome.settingsPrivate.PrefObject}; + declare 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/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc --- a/chrome/browser/ui/browser_ui_prefs.cc +++ b/chrome/browser/ui/browser_ui_prefs.cc @@ -144,6 +144,7 @@ void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) { registry->RegisterBooleanPref( prefs::kEnableDoNotTrack, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref(prefs::kEnableGPC, true); #if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID) registry->RegisterBooleanPref(prefs::kPrintPreviewUseSystemDefaultPrinter, false); 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 @@ -153,6 +153,8 @@ PrefWatcher::PrefWatcher(Profile* profile) : profile_(profile) { renderer_callback); profile_pref_change_registrar_.Add(prefs::kEnableDoNotTrack, renderer_callback); + profile_pref_change_registrar_.Add(prefs::kEnableGPC, + renderer_callback); #if !BUILDFLAG(IS_MAC) profile_pref_change_registrar_.Add(prefs::kFullscreenAllowed, 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 @@ -2253,6 +2253,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}, {"siteSettingsSublabel", IDS_SETTINGS_PERMISSIONS_DESCRIPTION}, diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -1096,6 +1096,8 @@ inline constexpr char kEnableReferrers[] = "enable_referrers"; // Whether to send the DNT header. inline constexpr char kEnableDoNotTrack[] = "enable_do_not_track"; +inline constexpr char kEnableGPC[] = "enable_gpc"; + // Whether to allow the use of Encrypted Media Extensions (EME), except for the // use of Clear Key key sytems, which is always allowed as required by the spec. // TODO(crbug.com/40549758): This pref was used as a WebPreference which is why 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 @@ -33,6 +33,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 @@ -4472,6 +4472,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 @@ -54,6 +54,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 @@ -53,6 +53,7 @@ struct BLINK_COMMON_EXPORT RendererPreferences { uint32_t referrers_policy{2}; bool allow_cross_origin_auth_prompt{false}; bool enable_do_not_track{false}; + bool enable_gpc{false}; bool enable_encrypted_media{true}; #if BUILDFLAG(IS_CHROMEOS) bool use_overlay_scrollbar{false}; 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 @@ -128,6 +128,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 @@ -89,6 +89,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 @@ -1288,6 +1288,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 @@ -3754,6 +3754,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 @@ -167,6 +167,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 @@ -150,6 +150,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_global_scope_context_impl.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_global_scope_context_impl.cc --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_global_scope_context_impl.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_global_scope_context_impl.cc @@ -377,6 +377,9 @@ void DedicatedOrSharedWorkerGlobalScopeContextImpl::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 @@ -3791,6 +3791,11 @@ status: "stable", base_feature: "none", }, + { + name: "GlobalPrivacyControl", + base_feature_status: "disabled", + public: true, + }, { name: "MediaSessionChapterInformation", status: "stable", --