LeOSium_webview/mulch/patches/0001-Vanadium/0108-make-cross-origin-refe...

943 lines
45 KiB
Diff
Raw Permalink Normal View History

2023-11-18 11:46:19 +01:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Zoraver Kang <Zoraver@users.noreply.github.com>
Date: Sun, 30 Jul 2023 14:08:17 -0400
Subject: [PATCH] make cross-origin referrer behavior configurable
This is implemented in a similar manner to the enable_referrers
preference.
The chrome for the cross-origin referrer policy preference is based on
0089-Implement-UI-for-WebRTC-toggle.patch.
---
chrome/android/chrome_ext_java_resources.gni | 2 +
chrome/android/chrome_ext_java_sources.gni | 3 +
...ross_origin_referrer_policy_preference.xml | 45 ++++++++++
...oss_origin_referrer_policy_preferences.xml | 9 ++
.../java/res/xml/privacy_preferences_ext.xml | 4 +
.../privacy/settings/PrivacySettingsExt.java | 15 ++++
.../CrossOriginReferrerPolicyPreference.java | 89 +++++++++++++++++++
.../CrossOriginReferrerPolicySettings.java | 54 +++++++++++
.../CrossOriginReferrerPolicyUtils.java | 45 ++++++++++
.../net/profile_network_context_service.cc | 19 ++++
.../net/profile_network_context_service.h | 2 +
chrome/browser/renderer_preferences_util.cc | 3 +
.../strings/android_chrome_ext_strings.grdp | 13 +++
chrome/browser/ui/prefs/pref_watcher.cc | 2 +
chrome/common/pref_names.h | 4 +
.../renderer_host/navigation_request.cc | 23 +++++
content/renderer/render_frame_impl.cc | 25 ++++++
services/network/network_context.cc | 10 +++
services/network/network_context.h | 3 +
.../network_service_network_delegate.cc | 29 ++++++
.../network_service_network_delegate.h | 8 ++
.../public/mojom/network_context.mojom | 14 +++
.../renderer_preferences_mojom_traits.cc | 1 +
.../renderer_preferences.h | 4 +
.../renderer_preferences_mojom_traits.h | 5 ++
.../public/mojom/renderer_preferences.mojom | 5 ++
.../web_service_worker_fetch_context_impl.cc | 27 ++++++
...ted_or_shared_worker_fetch_context_impl.cc | 27 ++++++
28 files changed, 490 insertions(+)
create mode 100644 chrome/android/java/res/layout/cross_origin_referrer_policy_preference.xml
create mode 100644 chrome/android/java/res/xml/cross_origin_referrer_policy_preferences.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyPreference.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicySettings.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyUtils.java
diff --git a/chrome/android/chrome_ext_java_resources.gni b/chrome/android/chrome_ext_java_resources.gni
index 4b55afd038612..06942accf63b8 100644
--- a/chrome/android/chrome_ext_java_resources.gni
+++ b/chrome/android/chrome_ext_java_resources.gni
@@ -6,4 +6,6 @@ chrome_ext_java_resources = [
"java/res/xml/privacy_preferences_ext.xml",
"java/res/layout/webrtc_policy_preference.xml",
"java/res/xml/webrtc_policy_preferences.xml",
+ "java/res/layout/cross_origin_referrer_policy_preference.xml",
+ "java/res/xml/cross_origin_referrer_policy_preferences.xml",
]
diff --git a/chrome/android/chrome_ext_java_sources.gni b/chrome/android/chrome_ext_java_sources.gni
index 77963fdccafca..27518fd27d8b2 100644
--- a/chrome/android/chrome_ext_java_sources.gni
+++ b/chrome/android/chrome_ext_java_sources.gni
@@ -9,4 +9,7 @@ chrome_ext_java_sources = [
"java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyPreference.java",
"java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicySettings.java",
"java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyUtils.java",
+ "java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyPreference.java",
+ "java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicySettings.java",
+ "java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyUtils.java",
]
diff --git a/chrome/android/java/res/layout/cross_origin_referrer_policy_preference.xml b/chrome/android/java/res/layout/cross_origin_referrer_policy_preference.xml
new file mode 100644
index 0000000000000..26b4e20337b93
--- /dev/null
+++ b/chrome/android/java/res/layout/cross_origin_referrer_policy_preference.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Brave Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:focusable="false">
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout
+ android:id="@+id/radio_button_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/cross_origin_referrer_policy_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:primaryText="@string/cross_origin_referrer_policy_default" />
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/cross_origin_referrer_policy_reduce"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_touch_target_size"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ app:primaryText="@string/cross_origin_referrer_policy_reduce" />
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/cross_origin_referrer_policy_disable"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_touch_target_size"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ app:primaryText="@string/cross_origin_referrer_policy_disable" />
+
+ </org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout>
+
+</LinearLayout>
diff --git a/chrome/android/java/res/xml/cross_origin_referrer_policy_preferences.xml b/chrome/android/java/res/xml/cross_origin_referrer_policy_preferences.xml
new file mode 100644
index 0000000000000..b59eb277d52c2
--- /dev/null
+++ b/chrome/android/java/res/xml/cross_origin_referrer_policy_preferences.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Brave Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <org.chromium.chrome.browser.referrer.settings.CrossOriginReferrerPolicyPreference
+ android:key="cross_origin_referrer_policy" />
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/privacy_preferences_ext.xml b/chrome/android/java/res/xml/privacy_preferences_ext.xml
index 6e955e33c0109..356e4204e1cd2 100644
--- a/chrome/android/java/res/xml/privacy_preferences_ext.xml
+++ b/chrome/android/java/res/xml/privacy_preferences_ext.xml
@@ -24,5 +24,9 @@ that can be found in the LICENSE file.
android:key="webrtc_policy"
android:title="@string/webrtc_policy_title"
android:fragment="org.chromium.chrome.browser.webrtc.settings.WebRtcPolicySettings"/>
+ <org.chromium.components.browser_ui.settings.ChromeBasePreference
+ android:key="cross_origin_referrer_policy"
+ android:title="@string/cross_origin_referrer_policy_title"
+ android:fragment="org.chromium.chrome.browser.referrer.settings.CrossOriginReferrerPolicySettings"/>
</PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java
index e356a9feb6f77..0fff8771be060 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java
@@ -15,6 +15,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.referrer.settings.CrossOriginReferrerPolicySettings;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.chrome.browser.settings.SettingsExtUtils;
import org.chromium.chrome.browser.webrtc.settings.WebRtcPolicySettings;
@@ -31,6 +32,7 @@ final class PrivacySettingsExt {
private static final String PREF_OPEN_LINKS_IN_INCOGNITO =
SharedPrefsExt.OPEN_LINKS_IN_INCOGNITO.getKey();
private static final String PREF_WEBRTC_POLICY = "webrtc_policy";
+ private static final String PREF_CROSS_ORIGIN_REFERRER_POLICY = "cross_origin_referrer_policy";
private static final Preference.OnPreferenceChangeListener getListener(@NonNull Profile profile) {
return (pref, val) -> {
@@ -106,6 +108,12 @@ final class PrivacySettingsExt {
if (webRtcPolicyPref != null) {
webRtcPolicyPref.setOrder(PRIVACY_PREFERENCES_ORDER);
}
+
+ final Preference crossOriginReferrerPolicyPref =
+ prefFragment.findPreference(PREF_CROSS_ORIGIN_REFERRER_POLICY);
+ if (crossOriginReferrerPolicyPref != null) {
+ crossOriginReferrerPolicyPref.setOrder(PRIVACY_PREFERENCES_ORDER);
+ }
}
static void updatePreferences(@NonNull PreferenceFragmentCompat prefFragment, @NonNull Profile profile) {
@@ -132,5 +140,12 @@ final class PrivacySettingsExt {
Preference webRtcPolicyPref = prefFragment.findPreference(PREF_WEBRTC_POLICY);
SettingsExtUtils.safelyUpdatePreference(/* preference */ webRtcPolicyPref,
/* newSummary */ WebRtcPolicySettings.getWebRtcPolicySummaryString(prefFragment.getContext()));
+
+ final Preference crossOriginReferrerPolicyPref =
+ prefFragment.findPreference(PREF_CROSS_ORIGIN_REFERRER_POLICY);
+ SettingsExtUtils.safelyUpdatePreference(/* preference */ crossOriginReferrerPolicyPref,
+ /* newSummary */ CrossOriginReferrerPolicySettings
+ .getCrossOriginReferrerPolicySummaryString(
+ prefFragment.getContext()));
}
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyPreference.java
new file mode 100644
index 0000000000000..24feef642b0fa
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyPreference.java
@@ -0,0 +1,89 @@
+/* Copyright (c) 2021 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.chromium.chrome.browser.referrer.settings;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.RadioGroup;
+
+import androidx.annotation.IntDef;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import org.chromium.chrome.R;
+import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
+import org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class CrossOriginReferrerPolicyPreference
+ extends Preference implements RadioGroup.OnCheckedChangeListener {
+ @IntDef({CrossOriginReferrerPolicy.DEFAULT, CrossOriginReferrerPolicy.REDUCE,
+ CrossOriginReferrerPolicy.DISABLE})
+ public @interface CrossOriginReferrerPolicy {
+ int DEFAULT = 0;
+ int REDUCE = 1;
+ int DISABLE = 2;
+
+ int NUM_ENTRIES = 3;
+ }
+
+ private @CrossOriginReferrerPolicy int mSetting;
+ private RadioButtonWithDescription mSettingRadioButton;
+ private RadioButtonWithDescriptionLayout mGroup;
+ private ArrayList<RadioButtonWithDescription> mButtons;
+
+ @SuppressLint("WrongConstant")
+ public CrossOriginReferrerPolicyPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ setLayoutResource(R.layout.cross_origin_referrer_policy_preference);
+
+ mButtons = new ArrayList<>(Collections.nCopies(CrossOriginReferrerPolicy.NUM_ENTRIES, null));
+ }
+
+ public void initialize(@CrossOriginReferrerPolicy int policy) {
+ mSetting = policy;
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+
+ mGroup = (RadioButtonWithDescriptionLayout) holder.findViewById(R.id.radio_button_layout);
+ mGroup.setOnCheckedChangeListener(this);
+
+ mButtons.set(CrossOriginReferrerPolicy.DEFAULT,
+ (RadioButtonWithDescription) holder.findViewById(
+ R.id.cross_origin_referrer_policy_default));
+ mButtons.set(CrossOriginReferrerPolicy.REDUCE,
+ (RadioButtonWithDescription) holder.findViewById(
+ R.id.cross_origin_referrer_policy_reduce));
+ mButtons.set(CrossOriginReferrerPolicy.DISABLE,
+ (RadioButtonWithDescription) holder.findViewById(
+ R.id.cross_origin_referrer_policy_disable));
+
+ mSettingRadioButton = mButtons.get(mSetting);
+ mSettingRadioButton.setChecked(true);
+ }
+
+ @Override
+ @SuppressLint("WrongConstant")
+ public void onCheckedChanged(RadioGroup group, int checkedId) {
+ for (int i = 0; i < CrossOriginReferrerPolicy.NUM_ENTRIES; i++) {
+ if (mButtons.get(i).isChecked()) {
+ mSetting = i;
+ mSettingRadioButton = mButtons.get(i);
+ break;
+ }
+ }
+ assert mSetting >= 0 && mSetting < CrossOriginReferrerPolicy.NUM_ENTRIES : "No matching setting found.";
+
+ callChangeListener(mSetting);
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicySettings.java
new file mode 100644
index 0000000000000..b6767fbeb733f
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicySettings.java
@@ -0,0 +1,54 @@
+/* Copyright (c) 2021 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.chromium.chrome.browser.referrer.settings;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceFragmentCompat;
+
+import org.chromium.chrome.R;
+import org.chromium.components.browser_ui.settings.SettingsUtils;
+import org.chromium.ui.UiUtils;
+
+public class CrossOriginReferrerPolicySettings extends PreferenceFragmentCompat {
+ static final String PREF_CROSS_ORIGIN_REFERRER_POLICY = "cross_origin_referrer_policy";
+
+ @Override
+ public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
+ SettingsUtils.addPreferencesFromResource(this,
+ R.xml.cross_origin_referrer_policy_preferences);
+ getActivity().setTitle(R.string.cross_origin_referrer_policy_title);
+
+ CrossOriginReferrerPolicyPreference crossOriginReferrerPolicyPreference =
+ (CrossOriginReferrerPolicyPreference) findPreference(
+ PREF_CROSS_ORIGIN_REFERRER_POLICY);
+ crossOriginReferrerPolicyPreference.initialize(CrossOriginReferrerPolicyUtils.getPolicy());
+
+ crossOriginReferrerPolicyPreference.setOnPreferenceChangeListener((preference, newValue) -> {
+ CrossOriginReferrerPolicyUtils.setPolicy((int) newValue);
+ return true;
+ });
+ }
+
+ public static String getCrossOriginReferrerPolicySummaryString(Context context) {
+ return CrossOriginReferrerPolicyUtils.getSummary(context);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
+ UiUtils.setNavigationBarIconColor(getActivity().getWindow().getDecorView(),
+ getResources().getBoolean(R.bool.window_light_navigation_bar));
+ }
+
+ setDivider(null);
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyUtils.java
new file mode 100644
index 0000000000000..08edd73498493
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/referrer/settings/CrossOriginReferrerPolicyUtils.java
@@ -0,0 +1,45 @@
+// Copyright 2023 GrapheneOS
+// Use of this source code is governed by a GPLv2 only-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.referrer.settings;
+
+import android.content.Context;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.referrer.settings.CrossOriginReferrerPolicyPreference.CrossOriginReferrerPolicy;
+import org.chromium.components.user_prefs.UserPrefs;
+
+/**
+ * Utility class for fetching and setting native pref values for cross-origin referrer policy
+ * and retrieving their corresponding descriptions.
+ */
+class CrossOriginReferrerPolicyUtils {
+ static String getSummary(Context context) {
+ switch (getPolicy()) {
+ case CrossOriginReferrerPolicy.DEFAULT:
+ return context.getString(R.string.cross_origin_referrer_policy_default);
+ case CrossOriginReferrerPolicy.REDUCE:
+ return context.getString(R.string.cross_origin_referrer_policy_reduce);
+ case CrossOriginReferrerPolicy.DISABLE:
+ return context.getString(R.string.cross_origin_referrer_policy_disable);
+ default:
+ assert false;
+ return "";
+ }
+ }
+
+ static @CrossOriginReferrerPolicy int getPolicy() {
+ return UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .getInteger(Pref.CROSS_ORIGIN_REFERRER_POLICY);
+ }
+
+ static void setPolicy(@CrossOriginReferrerPolicy int policy) {
+ UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .setInteger(Pref.CROSS_ORIGIN_REFERRER_POLICY, policy);
+ }
+
+ private CrossOriginReferrerPolicyUtils() {}
+}
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index a3c64d526dd54..a57bcf955df98 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -74,6 +74,7 @@
#include "services/network/public/cpp/cors/origin_access_list.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/mojom/first_party_sets_access_delegate.mojom.h"
+#include "services/network/public/mojom/network_context.mojom-shared.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/network_service.mojom.h"
#include "third_party/blink/public/common/features.h"
@@ -318,6 +319,11 @@ ProfileNetworkContextService::ProfileNetworkContextService(Profile* profile)
prefs::kEnableReferrers, profile_prefs,
base::BindRepeating(&ProfileNetworkContextService::UpdateReferrersEnabled,
base::Unretained(this)));
+ cross_origin_referrer_policy_.Init(
+ prefs::kCrossOriginReferrerPolicy, profile_prefs,
+ base::BindRepeating(
+ &ProfileNetworkContextService::UpdateCrossOriginReferrerPolicy,
+ base::Unretained(this)));
cookie_settings_ = CookieSettingsFactory::GetForProfile(profile);
cookie_settings_observation_.Observe(cookie_settings_.get());
privacy_sandbox_settings_observer_.Observe(
@@ -416,6 +422,8 @@ void ProfileNetworkContextService::RegisterProfilePrefs(
registry->RegisterBooleanPref(prefs::kGloballyScopeHTTPAuthCacheEnabled,
false);
registry->RegisterListPref(prefs::kHSTSPolicyBypassList);
+ registry->RegisterIntegerPref(prefs::kCrossOriginReferrerPolicy,
+ static_cast<int>(network::mojom::CrossOriginReferrerPolicy::kDefault));
}
// static
@@ -520,6 +528,17 @@ void ProfileNetworkContextService::UpdateReferrersEnabled() {
enable_referrers_.GetValue()));
}
+void ProfileNetworkContextService::UpdateCrossOriginReferrerPolicy() {
+ profile_->ForEachLoadedStoragePartition(base::BindRepeating(
+ [](int cross_origin_referrer_policy,
+ content::StoragePartition* storage_partition) {
+ storage_partition->GetNetworkContext()->SetCrossOriginReferrerPolicy(
+ static_cast<network::mojom::CrossOriginReferrerPolicy>(
+ cross_origin_referrer_policy));
+ },
+ cross_origin_referrer_policy_.GetValue()));
+}
+
network::mojom::CTPolicyPtr ProfileNetworkContextService::GetCTPolicy() {
auto* prefs = profile_->GetPrefs();
const base::Value::List& ct_excluded =
diff --git a/chrome/browser/net/profile_network_context_service.h b/chrome/browser/net/profile_network_context_service.h
index 3a05ed05828c3..e8482e1274794 100644
--- a/chrome/browser/net/profile_network_context_service.h
+++ b/chrome/browser/net/profile_network_context_service.h
@@ -132,6 +132,7 @@ class ProfileNetworkContextService
std::string ComputeAcceptLanguage() const;
void UpdateReferrersEnabled();
+ void UpdateCrossOriginReferrerPolicy();
// Gets the current CTPolicy from preferences.
network::mojom::CTPolicyPtr GetCTPolicy();
@@ -192,6 +193,7 @@ class ProfileNetworkContextService
BooleanPrefMember quic_allowed_;
StringPrefMember pref_accept_language_;
BooleanPrefMember enable_referrers_;
+ IntegerPrefMember cross_origin_referrer_policy_;
PrefChangeRegistrar pref_change_registrar_;
scoped_refptr<content_settings::CookieSettings> cookie_settings_;
diff --git a/chrome/browser/renderer_preferences_util.cc b/chrome/browser/renderer_preferences_util.cc
index 91192e62431b1..27bf3d8410d81 100644
--- a/chrome/browser/renderer_preferences_util.cc
+++ b/chrome/browser/renderer_preferences_util.cc
@@ -110,6 +110,9 @@ void UpdateFromSystemSettings(blink::RendererPreferences* prefs,
prefs->accept_languages = GetLanguageListForProfile(
profile, pref_service->GetString(language::prefs::kAcceptLanguages));
prefs->enable_referrers = pref_service->GetBoolean(prefs::kEnableReferrers);
+ prefs->cross_origin_referrer_policy =
+ static_cast<network::mojom::CrossOriginReferrerPolicy>(
+ pref_service->GetInteger(prefs::kCrossOriginReferrerPolicy));
prefs->enable_do_not_track =
TrackingProtectionSettingsFactory::GetForProfile(profile)
->IsDoNotTrackEnabled();
diff --git a/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp b/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp
index 11457f2fbc577..97c468723891d 100644
--- a/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp
+++ b/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp
@@ -9,6 +9,19 @@
<message name="IDS_CLOSE_TABS_ON_EXIT_SUMMARY" desc="Summary of closing tabs on exit menu item">
Don't persist tabs between browsing sessions
</message>
+ <!-- Referrer toggle -->
+ <message name="IDS_CROSS_ORIGIN_REFERRER_POLICY_TITLE" desc="Cross-origin referrer policy setting label">
+ Cross-origin referrer policy
+ </message>
+ <message name="IDS_CROSS_ORIGIN_REFERRER_POLICY_DEFAULT" desc="Select value">
+ Default
+ </message>
+ <message name="IDS_CROSS_ORIGIN_REFERRER_POLICY_REDUCE" desc="Select value">
+ Reduce cross-origin referrer
+ </message>
+ <message name="IDS_CROSS_ORIGIN_REFERRER_POLICY_DISABLE" desc="Select value">
+ Disable cross-origin referrer
+ </message>
<message name="IDS_OPEN_LINKS_IN_INCOGNITO_TITLE" desc="Title of opening external links in incognito tabs menu item">
Open external links in incognito
</message>
diff --git a/chrome/browser/ui/prefs/pref_watcher.cc b/chrome/browser/ui/prefs/pref_watcher.cc
index ea104d567ce33..4770ffe28269a 100644
--- a/chrome/browser/ui/prefs/pref_watcher.cc
+++ b/chrome/browser/ui/prefs/pref_watcher.cc
@@ -93,6 +93,8 @@ PrefWatcher::PrefWatcher(Profile* profile)
renderer_callback);
profile_pref_change_registrar_.Add(prefs::kEnableReferrers,
renderer_callback);
+ profile_pref_change_registrar_.Add(prefs::kCrossOriginReferrerPolicy,
+ renderer_callback);
profile_pref_change_registrar_.Add(prefs::kEnableEncryptedMedia,
renderer_callback);
profile_pref_change_registrar_.Add(prefs::kWebRTCIPHandlingPolicy,
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index aea2708b9c97a..f5a138449c2df 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -1456,6 +1456,10 @@ inline constexpr char kEnableHyperlinkAuditing[] = "enable_a_ping";
// Whether to enable sending referrers.
inline constexpr char kEnableReferrers[] = "enable_referrers";
+// Preference to configure what referrers are sent cross-origin.
+inline constexpr char kCrossOriginReferrerPolicy[] =
+ "cross_origin_referrer_policy";
+
// 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/784675): This pref was used as a WebPreference which is why
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 8ba07ea436976..9e1e8b31d7c34 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -393,6 +393,29 @@ void AddAdditionalRequestHeaders(
blink::mojom::Referrer(GURL(), network::mojom::ReferrerPolicy::kNever);
}
+ // Enforce cross-origin referrer policy
+ switch (render_prefs.cross_origin_referrer_policy) {
+ case network::mojom::CrossOriginReferrerPolicy::kDefault:
+ break;
+ case network::mojom::CrossOriginReferrerPolicy::kReduce: {
+ if (!referrer->url.is_empty() &&
+ !url::IsSameOriginWith(url, referrer->url)) {
+ auto capped_referrer = url::Origin::Create(referrer->url);
+ *referrer = blink::mojom::Referrer(capped_referrer.GetURL(),
+ network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin);
+ }
+ break;
+ }
+ case network::mojom::CrossOriginReferrerPolicy::kDisable: {
+ if (!referrer->url.is_empty() &&
+ !url::IsSameOriginWith(url, referrer->url)) {
+ *referrer = blink::mojom::Referrer(GURL(),
+ network::mojom::ReferrerPolicy::kSameOrigin);
+ }
+ break;
+ }
+ }
+
// Next, set the HTTP Origin if needed.
if (NeedsHTTPOrigin(headers, method)) {
url::Origin origin_header_value = initiator_origin.value_or(url::Origin());
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 47a2bc8e75e24..819e7a5f81ed1 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4307,6 +4307,31 @@ void RenderFrameImpl::WillSendRequestInternal(
request.SetReferrerString(WebString());
request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kNever);
}
+
+ // Enforce cross-origin referrer policy
+ switch (GetWebView()->GetRendererPreferences().cross_origin_referrer_policy) {
+ case network::mojom::CrossOriginReferrerPolicy::kDefault:
+ break;
+ case network::mojom::CrossOriginReferrerPolicy::kReduce: {
+ GURL referrer_url = GURL(request.ReferrerString().Utf8());
+ if (!referrer_url.is_empty() &&
+ !url::IsSameOriginWith(request.Url(), referrer_url)) {
+ auto capped_referrer = url::Origin::Create(referrer_url);
+ request.SetReferrerString(WebString::FromUTF8(capped_referrer.GetURL().spec()));
+ request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin);
+ }
+ break;
+ }
+ case network::mojom::CrossOriginReferrerPolicy::kDisable: {
+ GURL referrer_url = GURL(request.ReferrerString().Utf8());
+ if (!referrer_url.is_empty() &&
+ !url::IsSameOriginWith(request.Url(), referrer_url)) {
+ request.SetReferrerString(WebString());
+ request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kSameOrigin);
+ }
+ break;
+ }
+ }
}
void RenderFrameImpl::DidLoadResourceFromMemoryCache(
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 0a0fa8772cab9..08339f127f52a 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -1467,6 +1467,15 @@ void NetworkContext::SetEnableReferrers(bool enable_referrers) {
network_delegate_->set_enable_referrers(enable_referrers);
}
+void NetworkContext::SetCrossOriginReferrerPolicy(
+ mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy) {
+ // This may only be called on NetworkContexts created with the constructor
+ // that calls MakeURLRequestContext().
+ DCHECK(network_delegate_);
+ network_delegate_->set_cross_origin_referrer_policy(
+ cross_origin_referrer_policy);
+}
+
#if BUILDFLAG(IS_CHROMEOS)
void NetworkContext::UpdateAdditionalCertificates(
mojom::AdditionalCertificatesPtr additional_certificates) {
@@ -2478,6 +2487,7 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext(
std::unique_ptr<NetworkServiceNetworkDelegate> network_delegate =
std::make_unique<NetworkServiceNetworkDelegate>(
params_->enable_referrers,
+ params_->cross_origin_referrer_policy,
params_->validate_referrer_policy_on_initial_request,
std::move(params_->proxy_error_client), this);
network_delegate_ = network_delegate.get();
diff --git a/services/network/network_context.h b/services/network/network_context.h
index ef4140d740e23..86b2094011cc5 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -57,6 +57,7 @@
#include "services/network/public/mojom/cookie_manager.mojom-shared.h"
#include "services/network/public/mojom/host_resolver.mojom.h"
#include "services/network/public/mojom/network_context.mojom-forward.h"
+#include "services/network/public/mojom/network_context.mojom-shared.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/network_service.mojom-forward.h"
#include "services/network/public/mojom/proxy_lookup_client.mojom.h"
@@ -315,6 +316,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
mojom::NetworkConditionsPtr conditions) override;
void SetAcceptLanguage(const std::string& new_accept_language) override;
void SetEnableReferrers(bool enable_referrers) override;
+ void SetCrossOriginReferrerPolicy(
+ mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy) override;
#if BUILDFLAG(IS_CHROMEOS)
void UpdateAdditionalCertificates(
mojom::AdditionalCertificatesPtr additional_certificates) override;
diff --git a/services/network/network_service_network_delegate.cc b/services/network/network_service_network_delegate.cc
index 82829ecd40058..646d2ddfa4798 100644
--- a/services/network/network_service_network_delegate.cc
+++ b/services/network/network_service_network_delegate.cc
@@ -37,10 +37,12 @@ namespace network {
NetworkServiceNetworkDelegate::NetworkServiceNetworkDelegate(
bool enable_referrers,
+ mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy,
bool validate_referrer_policy_on_initial_request,
mojo::PendingRemote<mojom::ProxyErrorClient> proxy_error_client_remote,
NetworkContext* network_context)
: enable_referrers_(enable_referrers),
+ cross_origin_referrer_policy_(cross_origin_referrer_policy),
validate_referrer_policy_on_initial_request_(
validate_referrer_policy_on_initial_request),
network_context_(network_context) {
@@ -59,12 +61,39 @@ void NetworkServiceNetworkDelegate::MaybeTruncateReferrer(
return;
}
+ // Enforce cross-origin referrer policy
+ switch (cross_origin_referrer_policy_) {
+ case mojom::CrossOriginReferrerPolicy::kDefault: {
if (base::FeatureList::IsEnabled(
net::features::kCapReferrerToOriginOnCrossOrigin)) {
if (!url::IsSameOriginWith(effective_url, GURL(request->referrer()))) {
auto capped_referrer = url::Origin::Create(GURL(request->referrer()));
request->SetReferrer(capped_referrer.GetURL().spec());
}
+ }
+ break;
+ }
+ case mojom::CrossOriginReferrerPolicy::kReduce: {
+ GURL referrer_url = GURL(request->referrer());
+ if (!referrer_url.is_empty() &&
+ !url::IsSameOriginWith(effective_url, referrer_url)) {
+ auto capped_referrer = url::Origin::Create(referrer_url);
+ request->SetReferrer(capped_referrer.GetURL().spec());
+ request->set_referrer_policy(
+ net::ReferrerPolicy::REDUCE_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN);
+ }
+ break;
+ }
+ case mojom::CrossOriginReferrerPolicy::kDisable: {
+ GURL referrer_url = GURL(request->referrer());
+ if (!referrer_url.is_empty() &&
+ !url::IsSameOriginWith(effective_url, referrer_url)) {
+ request->SetReferrer(std::string());
+ request->set_referrer_policy(
+ net::ReferrerPolicy::CLEAR_ON_TRANSITION_CROSS_ORIGIN);
+ }
+ break;
+ }
}
}
diff --git a/services/network/network_service_network_delegate.h b/services/network/network_service_network_delegate.h
index cfcd91f7e47e4..0464219210160 100644
--- a/services/network/network_service_network_delegate.h
+++ b/services/network/network_service_network_delegate.h
@@ -16,6 +16,7 @@
#include "net/first_party_sets/first_party_sets_cache_filter.h"
#include "services/network/cookie_settings.h"
#include "services/network/network_context.h"
+#include "services/network/public/mojom/network_context.mojom-shared.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace net {
@@ -32,6 +33,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate
// |network_context| is guaranteed to outlive this class.
NetworkServiceNetworkDelegate(
bool enable_referrers,
+ mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy,
bool validate_referrer_policy_on_initial_request,
mojo::PendingRemote<mojom::ProxyErrorClient> proxy_error_client_remote,
NetworkContext* network_context);
@@ -46,6 +48,11 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate
enable_referrers_ = enable_referrers;
}
+ void set_cross_origin_referrer_policy(
+ mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy) {
+ cross_origin_referrer_policy_ = cross_origin_referrer_policy;
+ }
+
private:
// net::NetworkDelegateImpl implementation.
int OnBeforeURLRequest(net::URLRequest* request,
@@ -113,6 +120,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate
const GURL& effective_url);
bool enable_referrers_;
+ mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy_;
bool validate_referrer_policy_on_initial_request_;
mojo::Remote<mojom::ProxyErrorClient> proxy_error_client_;
raw_ptr<NetworkContext> network_context_;
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index 3d95f8cd1adeb..4ca34fbade5d5 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -316,6 +316,12 @@ struct NetworkContextFilePaths {
bool trigger_migration = false;
};
+enum CrossOriginReferrerPolicy {
+ kDefault,
+ kReduce,
+ kDisable,
+};
+
// Parameters for constructing a network context.
struct NetworkContextParams {
// The user agent string.
@@ -335,6 +341,10 @@ struct NetworkContextParams {
// If false, the referrer of requests is never populated.
bool enable_referrers = true;
+ // Configures what referrers are sent cross-origin.
+ CrossOriginReferrerPolicy cross_origin_referrer_policy =
+ CrossOriginReferrerPolicy.kDefault;
+
// If true, requests initiated with referrers that don't match their referrer
// policy will fail.
bool validate_referrer_policy_on_initial_request = true;
@@ -1232,6 +1242,10 @@ interface NetworkContext {
// If false, the referrer of requests is never populated.
SetEnableReferrers(bool enable_referrers);
+ // Updates the cross-origin referrer policy.
+ SetCrossOriginReferrerPolicy(
+ CrossOriginReferrerPolicy cross_origin_referrer_policy);
+
// Updates the additional trust anchors for certificate verification.
[EnableIf=is_chromeos]
UpdateAdditionalCertificates(AdditionalCertificates? additional_certificates);
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
index 66f99b12ba32b..1a910ebc352c9 100644
--- a/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc
+++ b/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc
@@ -42,6 +42,7 @@ bool StructTraits<blink::mojom::RendererPreferencesDataView,
out->use_custom_colors = data.use_custom_colors();
out->enable_referrers = data.enable_referrers();
+ out->cross_origin_referrer_policy = data.cross_origin_referrer_policy();
out->allow_cross_origin_auth_prompt = data.allow_cross_origin_auth_prompt();
out->enable_do_not_track = data.enable_do_not_track();
out->enable_encrypted_media = data.enable_encrypted_media();
diff --git a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
index ecda061e4a22b..59aaed7572fa7 100644
--- a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
+++ b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
@@ -12,6 +12,7 @@
#include "base/time/time.h"
#include "build/build_config.h"
+#include "services/network/public/mojom/network_context.mojom-shared.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/common/common_export.h"
#include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
@@ -53,6 +54,9 @@ struct BLINK_COMMON_EXPORT RendererPreferences {
absl::optional<base::TimeDelta> caret_blink_interval;
bool use_custom_colors{true};
bool enable_referrers{true};
+ network::mojom::CrossOriginReferrerPolicy cross_origin_referrer_policy {
+ network::mojom::CrossOriginReferrerPolicy::kDefault
+ };
bool allow_cross_origin_auth_prompt{false};
bool enable_do_not_track{false};
bool enable_encrypted_media{true};
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
index 8bbeee8821c39..488254d319810 100644
--- 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
@@ -107,6 +107,11 @@ struct BLINK_COMMON_EXPORT
return data.enable_referrers;
}
+ static const network::mojom::CrossOriginReferrerPolicy&
+ cross_origin_referrer_policy(const ::blink::RendererPreferences& data) {
+ return data.cross_origin_referrer_policy;
+ }
+
static const bool& allow_cross_origin_auth_prompt(
const ::blink::RendererPreferences& data) {
return data.allow_cross_origin_auth_prompt;
diff --git a/third_party/blink/public/mojom/renderer_preferences.mojom b/third_party/blink/public/mojom/renderer_preferences.mojom
index 271672f8a7a0b..a1da19a1e41c1 100644
--- a/third_party/blink/public/mojom/renderer_preferences.mojom
+++ b/third_party/blink/public/mojom/renderer_preferences.mojom
@@ -6,6 +6,7 @@ module blink.mojom;
import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/time.mojom";
+import "services/network/public/mojom/network_context.mojom";
import "ui/gfx/mojom/font_render_params.mojom";
import "third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom";
@@ -70,6 +71,10 @@ struct RendererPreferences {
// Set to false to not send referrers.
bool enable_referrers = true;
+ // Configures what referrers are sent cross-origin
+ network.mojom.CrossOriginReferrerPolicy cross_origin_referrer_policy =
+ network.mojom.CrossOriginReferrerPolicy.kDefault;
+
// Set to true to allow third-party sub-content to pop-up HTTP basic auth
// dialog boxes.
bool allow_cross_origin_auth_prompt = false;
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
index 247ea6ca9f7b3..2547438937e9a 100644
--- 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
@@ -156,6 +156,33 @@ void WebServiceWorkerFetchContextImpl::WillSendRequest(WebURLRequest& request) {
request.SetReferrerString(WebString());
request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kNever);
}
+
+ // Enforce cross-origin referrer policy
+ switch (renderer_preferences_.cross_origin_referrer_policy) {
+ case network::mojom::CrossOriginReferrerPolicy::kDefault:
+ break;
+ case network::mojom::CrossOriginReferrerPolicy::kReduce: {
+ KURL referrerUrl = KURL(request.ReferrerString());
+ if (!referrerUrl.IsEmpty() &&
+ !SecurityOrigin::AreSameOrigin(request.Url(), referrerUrl)) {
+ String originUrl = String(
+ SecurityOrigin::Create(referrerUrl)->ToUrlOrigin().GetURL().spec());
+ request.SetReferrerString(originUrl);
+ request.SetReferrerPolicy(
+ network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin);
+ }
+ break;
+ }
+ case network::mojom::CrossOriginReferrerPolicy::kDisable: {
+ KURL referrerUrl = KURL(request.ReferrerString());
+ if (!referrerUrl.IsEmpty() &&
+ !SecurityOrigin::AreSameOrigin(request.Url(), referrerUrl)) {
+ request.SetReferrerString(WebString());
+ request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kSameOrigin);
+ }
+ break;
+ }
+ }
}
WebVector<std::unique_ptr<URLLoaderThrottle>>
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
index cb0b854156bb0..e0fef1e7df19f 100644
--- 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,33 @@ void DedicatedOrSharedWorkerFetchContextImpl::WillSendRequest(
request.SetReferrerString(WebString());
request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kNever);
}
+
+ // Enforce cross-origin referrer policy
+ switch (renderer_preferences_.cross_origin_referrer_policy) {
+ case network::mojom::CrossOriginReferrerPolicy::kDefault:
+ break;
+ case network::mojom::CrossOriginReferrerPolicy::kReduce: {
+ KURL referrerUrl = KURL(request.ReferrerString());
+ if (!referrerUrl.IsEmpty() &&
+ !SecurityOrigin::AreSameOrigin(request.Url(), referrerUrl)) {
+ String originUrl = String(
+ SecurityOrigin::Create(referrerUrl)->ToUrlOrigin().GetURL().spec());
+ request.SetReferrerString(originUrl);
+ request.SetReferrerPolicy(
+ network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin);
+ }
+ break;
+ }
+ case network::mojom::CrossOriginReferrerPolicy::kDisable: {
+ KURL referrerUrl = KURL(request.ReferrerString());
+ if (!referrerUrl.IsEmpty() &&
+ !SecurityOrigin::AreSameOrigin(request.Url(), referrerUrl)) {
+ request.SetReferrerString(WebString());
+ request.SetReferrerPolicy(network::mojom::ReferrerPolicy::kSameOrigin);
+ }
+ break;
+ }
+ }
}
WebVector<std::unique_ptr<URLLoaderThrottle>>