Files
cromite/build/patches/Enable-Global-Privacy-Control.patch

762 lines
36 KiB
Diff

From: uazo <uazo@users.noreply.github.com>
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="gpc_switch"
+ android:summaryOn="@string/text_on"
+ android:summaryOff="@string/text_off" />
+
+ <org.chromium.components.browser_ui.settings.TextMessagePreference
+ android:title="@string/gpc_description"
+ app:allowDividerBelow="false" />
+
+</PreferenceScreen>
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" />
+ <Preference
+ android:key="gpc"
+ android:title="@string/gpc_title"
+ android:fragment="org.chromium.chrome.browser.privacy.settings.GpcSettings" />
<org.chromium.chrome.browser.about_settings.HyperlinkPreference
android:key="cromite_flags"
android:title="@string/cromite_flags_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/GpcSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/GpcSettings.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/GpcSettings.java
@@ -0,0 +1,58 @@
+package org.chromium.chrome.browser.privacy.settings;
+
+import android.os.Bundle;
+
+import org.chromium.base.supplier.MonotonicObservableSupplier;
+import org.chromium.base.supplier.ObservableSuppliers;
+import org.chromium.base.supplier.SettableMonotonicObservableSupplier;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.settings.ChromeBaseSettingsFragment;
+import org.chromium.components.browser_ui.settings.SettingsFragment;
+import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
+import org.chromium.components.browser_ui.settings.SettingsUtils;
+import org.chromium.components.prefs.PrefService;
+import org.chromium.components.user_prefs.UserPrefs;
+
+public class GpcSettings extends ChromeBaseSettingsFragment {
+ private static final String PREF_SWITCH = "gpc_switch";
+
+ private final SettableMonotonicObservableSupplier<String> 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<String> 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 @@
<message name="IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_LEARN_MORE_ACCESSIBILITY_LABEL" desc="The accessibility label for a link to learn more about Do Not Track">
Learn more about Do Not Track
</message>
+ <message name="IDS_SETTINGS_ENABLE_GPC" desc="">
+ Global Privacy Control "Sec-GPC"
+ </message>
+ <message name="IDS_SETTINGS_ENABLE_GPC_DIALOG_TITLE" desc="">
+ Global Privacy Control "Sec-GPC"
+ </message>
+ <message name="IDS_SETTINGS_ENABLE_GPC_DIALOG_TEXT" desc="">
+ 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).
+ </message>
<message name="IDS_SETTINGS_PERMISSIONS" desc="Name of the settings page which allows users to manage permissions and site content settings">
Permissions and content settings
</message>
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 @@
</h2>
<settings-do-not-track-toggle id="doNotTrack" prefs="{{prefs}}">
</settings-do-not-track-toggle>
+ <settings-gpc-toggle id="gpc" prefs="{{prefs}}">
+ </settings-gpc-toggle>
<cr-link-row id="siteDataTrigger" class="hr"
on-click="onSiteDataClick_" label="$i18n{cookiePageAllSitesLink}"
role-description="$i18n{subpageArrowRoleDescription}">
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 @@
+ <style include="settings-shared">
+ .toggle {
+ padding: 0 var(--cr-section-padding);
+ margin-bottom: var(--cr-section-vertical-padding);
+ }
+ </style>
+ <settings-toggle-button id="toggle" class="toggle"
+ label="$i18n{gpc}"
+ pref="{{prefs.enable_gpc}}"
+ on-settings-boolean-control-change="onToggleChange_"
+ icon="settings:forward"
+ no-set-pref>
+ </settings-toggle-button>
+ <template is="dom-if" if="[[showDialog_]]"
+ on-dom-change="onDomChange_" restamp>
+ <cr-dialog id="confirmDialog"
+ close-text="$i18n{close}" on-cancel="onDialogCancel_"
+ on-close="onDialogClosed_">
+ <div slot="title">$i18n{gpcDialogTitle}</div>
+ <div slot="body">$i18n{gpcDialogMessage}</div>
+ <div slot="button-container">
+ <cr-button class="cancel-button"
+ on-click="onDialogCancel_">
+ $i18n{cancel}
+ </cr-button>
+ <cr-button class="action-button"
+ on-click="onDialogConfirm_">
+ $i18n{confirm}
+ </cr-button>
+ </div>
+ </cr-dialog>
+ </template>
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<SettingsToggleButtonElement>(
+ '#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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_GPC_TITLE" desc="">
+ Global Privacy Control "Sec-GPC"
+ </message>
+ <message name="IDS_GPC_DESCRIPTION" desc="">
+ 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).
+ </message>
+</grit-part>
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 StructTraits<blink::mojom::RendererPreferencesDataView,
out->enable_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<WebURLRequestExtraData>();
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<WebURLRequestExtraData>();
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",
--