add other patch not in upstream

This commit is contained in:
Carmelo Messina
2022-09-23 17:00:07 +02:00
parent 98b3b06100
commit 3e0cdeebd4
9 changed files with 1465 additions and 0 deletions
+9
View File
@@ -198,3 +198,12 @@ Re-introduce-modal-dialog-flag-to-close-all-tabs.patch
sharing-hub-always-use-visible-URL.patch
Re-introduce-kWebAuthCable.patch
Revert-clipboard-user-gesture-requirement-removal.patch
Viewport-Protection.patch
Override-Navigator-Language.patch
Partition-blobs-by-top-frame-url.patch
Remove-http-referrals-in-cross-origin-navigation.patch
00Enable-ThirdPartyStoragePartitioning-flag.patch
00Enable-CrossSiteFlagNetworkAnonymizationKey-flag.patch
00Experimental-user-scripts-support--fixup-.patch
00Remove-navigator-connection-info--fixup-.patch
@@ -0,0 +1,22 @@
From: Your Name <you@example.com>
Date: Fri, 23 Sep 2022 11:26:07 +0000
Subject: Enable CrossSiteFlagNetworkAnonymizationKey flag
---
net/base/features.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/base/features.cc b/net/base/features.cc
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -168,7 +168,7 @@ const base::Feature kEnableDoubleKeyNetworkAnonymizationKey{
const base::Feature kEnableCrossSiteFlagNetworkAnonymizationKey{
"EnableCrossSiteFlagNetworkAnonymizationKey",
- base::FEATURE_DISABLED_BY_DEFAULT};
+ base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kExpectCTPruning{"ExpectCTPruning",
base::FEATURE_ENABLED_BY_DEFAULT};
--
2.25.1
@@ -0,0 +1,20 @@
From: Your Name <you@example.com>
Date: Fri, 23 Sep 2022 11:24:45 +0000
Subject: Enable ThirdPartyStoragePartitioning flag
---
net/base/features.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/base/features.cc b/net/base/features.cc
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -358,5 +358,5 @@ const base::FeatureParam<bool> kStorageAccessAPIGrantsUnpartitionedStorage(
// Enables partitioning of third party storage (IndexedDB, CacheStorage, etc.)
// by the top level site to reduce fingerprinting.
const base::Feature kThirdPartyStoragePartitioning{
- "ThirdPartyStoragePartitioning", base::FEATURE_DISABLED_BY_DEFAULT};
+ "ThirdPartyStoragePartitioning", base::FEATURE_ENABLED_BY_DEFAULT};
} // namespace net::features
--
2.25.1
@@ -0,0 +1,69 @@
From: Your Name <you@example.com>
Date: Mon, 12 Sep 2022 12:18:55 +0000
Subject: Experimental user scripts support (fixup)
---
.../renderer/user_scripts_renderer_client.cc | 12 ++++++------
.../renderer/user_scripts_renderer_client.h | 1 -
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/components/user_scripts/renderer/user_scripts_renderer_client.cc b/components/user_scripts/renderer/user_scripts_renderer_client.cc
--- a/components/user_scripts/renderer/user_scripts_renderer_client.cc
+++ b/components/user_scripts/renderer/user_scripts_renderer_client.cc
@@ -62,15 +62,15 @@ void UserScriptsRendererClient::RenderFrameCreated(
enabled_ = params.allow_userscript;
if (!enabled_) return;
- if (loaded_ == false) {
- loaded_ = true;
+ ExtensionFrameHelper* frame_helper = ExtensionFrameHelper::Get(render_frame);
+ if (!frame_helper) {
new user_scripts::ExtensionFrameHelper(render_frame);
dispatcher_->OnRenderFrameCreated(render_frame);
}
}
void UserScriptsRendererClient::RunScriptsAtDocumentStart(content::RenderFrame* render_frame) {
- if (!enabled_ || !loaded_) return;
+ if (!enabled_) return;
ExtensionFrameHelper* frame_helper = ExtensionFrameHelper::Get(render_frame);
if (!frame_helper)
@@ -81,7 +81,7 @@ void UserScriptsRendererClient::RunScriptsAtDocumentStart(content::RenderFrame*
}
void UserScriptsRendererClient::RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) {
- if (!enabled_ || !loaded_) return;
+ if (!enabled_) return;
ExtensionFrameHelper* frame_helper = ExtensionFrameHelper::Get(render_frame);
if (!frame_helper)
@@ -92,7 +92,7 @@ void UserScriptsRendererClient::RunScriptsAtDocumentEnd(content::RenderFrame* re
}
void UserScriptsRendererClient::RunScriptsAtDocumentIdle(content::RenderFrame* render_frame) {
- if (!enabled_ || !loaded_) return;
+ if (!enabled_) return;
ExtensionFrameHelper* frame_helper = ExtensionFrameHelper::Get(render_frame);
if (!frame_helper)
@@ -102,4 +102,4 @@ void UserScriptsRendererClient::RunScriptsAtDocumentIdle(content::RenderFrame* r
// |frame_helper| and |render_frame| might be dead by now.
}
-}
\ No newline at end of file
+}
diff --git a/components/user_scripts/renderer/user_scripts_renderer_client.h b/components/user_scripts/renderer/user_scripts_renderer_client.h
--- a/components/user_scripts/renderer/user_scripts_renderer_client.h
+++ b/components/user_scripts/renderer/user_scripts_renderer_client.h
@@ -29,7 +29,6 @@ class UserScriptsRendererClient {
private:
std::unique_ptr<UserScriptsDispatcher> dispatcher_;
bool enabled_ = false;
- bool loaded_ = false;
};
}
--
2.25.1
@@ -0,0 +1,87 @@
From: Your Name <you@example.com>
Date: Tue, 6 Sep 2022 08:35:08 +0000
Subject: Remove navigator.connection info (fixup)
---
.../renderer/modules/netinfo/network_information.cc | 6 +++---
.../renderer/modules/netinfo/network_information.h | 1 +
.../platform/network/network_state_notifier.cc | 11 +++++++++++
.../platform/network/network_state_notifier.h | 2 +-
4 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/third_party/blink/renderer/modules/netinfo/network_information.cc b/third_party/blink/renderer/modules/netinfo/network_information.cc
--- a/third_party/blink/renderer/modules/netinfo/network_information.cc
+++ b/third_party/blink/renderer/modules/netinfo/network_information.cc
@@ -61,7 +61,7 @@ NetworkInformation::~NetworkInformation() {
}
bool NetworkInformation::IsObserving() const {
- return false;
+ return !!connection_observer_handle_ || is_fake_observing_;
}
String NetworkInformation::type() const {
@@ -243,7 +243,7 @@ void NetworkInformation::ContextDestroyed() {
}
void NetworkInformation::StartObserving() {
- //is_fake_observing_ = true;
+ is_fake_observing_ = true;
if ((true)) return;
if (!IsObserving() && !context_stopped_) {
type_ = GetNetworkStateNotifier().ConnectionType();
@@ -255,7 +255,7 @@ void NetworkInformation::StartObserving() {
}
void NetworkInformation::StopObserving() {
- //is_fake_observing_ = false;
+ is_fake_observing_ = false;
if ((true)) return;
if (IsObserving()) {
DCHECK(connection_observer_handle_);
diff --git a/third_party/blink/renderer/modules/netinfo/network_information.h b/third_party/blink/renderer/modules/netinfo/network_information.h
--- a/third_party/blink/renderer/modules/netinfo/network_information.h
+++ b/third_party/blink/renderer/modules/netinfo/network_information.h
@@ -118,6 +118,7 @@ class NetworkInformation final
std::unique_ptr<NetworkStateNotifier::NetworkStateObserverHandle>
connection_observer_handle_;
+ bool is_fake_observing_ = false;
};
} // namespace blink
diff --git a/third_party/blink/renderer/platform/network/network_state_notifier.cc b/third_party/blink/renderer/platform/network/network_state_notifier.cc
--- a/third_party/blink/renderer/platform/network/network_state_notifier.cc
+++ b/third_party/blink/renderer/platform/network/network_state_notifier.cc
@@ -522,6 +522,17 @@ NetworkStateNotifier::GetWebHoldbackDownlinkThroughputMbps() const {
return absl::nullopt;
}
+NetworkStateNotifier::NetworkStateNotifier() : has_override_(false) {
+ // set default data
+ // see third_party/blink/renderer/platform/network/network_state_notifier_test.cc
+ SetNetworkConnectionInfoOverride(
+ /*on_line*/true,
+ /*type*/WebConnectionType::kWebConnectionTypeUnknown,
+ /*effective_type*/absl::nullopt,
+ /*http_rtt_msec*/0,
+ /*max_bandwidth_mbps*/0);
+}
+
void NetworkStateNotifier::GetMetricsWithWebHoldback(
WebConnectionType* type,
double* downlink_max_mbps,
diff --git a/third_party/blink/renderer/platform/network/network_state_notifier.h b/third_party/blink/renderer/platform/network/network_state_notifier.h
--- a/third_party/blink/renderer/platform/network/network_state_notifier.h
+++ b/third_party/blink/renderer/platform/network/network_state_notifier.h
@@ -122,7 +122,7 @@ class PLATFORM_EXPORT NetworkStateNotifier {
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
};
- NetworkStateNotifier() : has_override_(false) {}
+ NetworkStateNotifier();
NetworkStateNotifier(const NetworkStateNotifier&) = delete;
NetworkStateNotifier& operator=(const NetworkStateNotifier&) = delete;
--
2.25.1
@@ -0,0 +1,93 @@
From: uazo <uazo@users.noreply.github.com>
Date: Fri, 2 Sep 2022 07:44:58 +0000
Subject: Override Navigator Language
Uses the first of the accept-languages as the system language for blink
and fix the selection in the UI for the browser language
---
.../browser/language/AppLocaleUtils.java | 20 +++++++++++++++++++
.../AppLanguagePreferenceDelegate.java | 8 ++++++++
.../renderer_host/render_process_host_impl.cc | 6 +++++-
3 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
@@ -35,6 +35,10 @@ import java.util.Locale;
public class AppLocaleUtils {
private AppLocaleUtils(){};
+ public interface InstallListener {
+ void onComplete(boolean success);
+ }
+
// Value of AppLocale preference when the system language is used.
public static final String APP_LOCALE_USE_SYSTEM_LANGUAGE = null;
@@ -99,6 +103,22 @@ public class AppLocaleUtils {
return locale.toLanguageTag();
}
+ public static void setAppLanguagePref(
+ String languageName, InstallListener listener) {
+ InstallListener wrappedListener = (success) -> {
+ if (success) {
+ if (shouldUseSystemManagedLocale()) {
+ setSystemManagedAppLanguage(languageName);
+ } else {
+ SharedPreferencesManager.getInstance().writeString(
+ ChromePreferenceKeys.APPLICATION_OVERRIDE_LANGUAGE, languageName);
+ }
+ }
+ listener.onComplete(success);
+ };
+ wrappedListener.onComplete(true);
+ }
+
/**
* Gets the first original system locale from {@link LocaleManager}. This is the language that
* Chrome would use if there was no override set. If there are no possible UI languages en-US is
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java
@@ -87,6 +87,14 @@ public class AppLanguagePreferenceDelegate {
// Disable preference so a second downloaded cannot be started while one is in progress.
mPreference.setEnabled(false);
+
+ AppLocaleUtils.setAppLanguagePref(code, (success) -> {
+ if (success) {
+ languageSplitDownloadComplete();
+ } else {
+ languageSplitDownloadFailed();
+ }
+ });
}
/**
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -68,6 +68,7 @@
#include "cc/base/switches.h"
#include "components/discardable_memory/public/mojom/discardable_shared_memory_manager.mojom.h"
#include "components/discardable_memory/service/discardable_shared_memory_manager.h"
+#include "components/language/core/browser/language_prefs.h"
#include "components/metrics/single_sample_metrics.h"
#include "components/services/storage/privileged/mojom/indexed_db_control.mojom.h"
#include "components/services/storage/public/cpp/buckets/bucket_id.h"
@@ -3158,8 +3159,11 @@ void RenderProcessHostImpl::AppendRendererCommandLine(
PropagateBrowserCommandLineToRenderer(browser_command_line, command_line);
// Pass on the browser locale.
- const std::string locale =
+ std::string locale =
GetContentClient()->browser()->GetApplicationLocale();
+ const std::string accept_langs = GetContentClient()->browser()->GetAcceptLangs(browser_context_);
+ if (!accept_langs.empty())
+ locale = language::GetFirstLanguage(accept_langs);
command_line->AppendSwitchASCII(switches::kLang, locale);
// A non-empty RendererCmdPrefix implies that Zygote is disabled.
--
2.25.1
@@ -0,0 +1,214 @@
From: uazo <uazo@users.noreply.github.com>
Date: Tue, 20 Sep 2022 07:20:01 +0000
Subject: Partition blobs by top frame url
Verifies that the blob was created with the same top frame url
or, if not defined, by the same agent cluster.
---
storage/browser/blob/blob_url_store_impl.cc | 37 ++++++++++++++++++-
storage/browser/blob/blob_url_store_impl.h | 14 ++++++-
.../public/mojom/blob/blob_url_store.mojom | 12 ++++--
.../core/fileapi/public_url_manager.cc | 17 +++++++++
4 files changed, 75 insertions(+), 5 deletions(-)
diff --git a/storage/browser/blob/blob_url_store_impl.cc b/storage/browser/blob/blob_url_store_impl.cc
--- a/storage/browser/blob/blob_url_store_impl.cc
+++ b/storage/browser/blob/blob_url_store_impl.cc
@@ -72,6 +72,20 @@ BlobURLStoreImpl::~BlobURLStoreImpl() {
}
}
+bool BlobURLStoreImpl::IsSamePartition(
+ const GURL& blob_url,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site) {
+ const absl::optional<net::SchemefulSite>& top_level_site =
+ registry_->GetUnsafeTopLevelSite(blob_url);
+ if (top_level_site.has_value())
+ return top_level_site == unsafe_top_level_site;
+
+ absl::optional<base::UnguessableToken> agent_cluster_id =
+ registry_->GetUnsafeAgentClusterID(blob_url);
+ return agent_cluster_id == unsafe_agent_cluster_id;
+}
+
void BlobURLStoreImpl::Register(
mojo::PendingRemote<blink::mojom::Blob> blob,
const GURL& url,
@@ -102,11 +116,18 @@ void BlobURLStoreImpl::Revoke(const GURL& url) {
urls_.erase(url);
}
-void BlobURLStoreImpl::Resolve(const GURL& url, ResolveCallback callback) {
+void BlobURLStoreImpl::Resolve(const GURL& url,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
+ ResolveCallback callback) {
if (!registry_) {
std::move(callback).Run(mojo::NullRemote(), absl::nullopt);
return;
}
+ if (!IsSamePartition(url, unsafe_agent_cluster_id, unsafe_top_level_site)) {
+ std::move(callback).Run(mojo::NullRemote(), absl::nullopt);
+ return;
+ }
mojo::PendingRemote<blink::mojom::Blob> blob = registry_->GetBlobFromUrl(url);
std::move(callback).Run(std::move(blob),
registry_->GetUnsafeAgentClusterID(url));
@@ -115,6 +136,8 @@ void BlobURLStoreImpl::Resolve(const GURL& url, ResolveCallback callback) {
void BlobURLStoreImpl::ResolveAsURLLoaderFactory(
const GURL& url,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
ResolveAsURLLoaderFactoryCallback callback) {
if (!registry_) {
BlobURLLoaderFactory::Create(mojo::NullRemote(), url, std::move(receiver));
@@ -122,6 +145,12 @@ void BlobURLStoreImpl::ResolveAsURLLoaderFactory(
return;
}
+ if (!IsSamePartition(url, unsafe_agent_cluster_id, unsafe_top_level_site)) {
+ BlobURLLoaderFactory::Create(mojo::NullRemote(), url, std::move(receiver));
+ std::move(callback).Run(absl::nullopt, absl::nullopt);
+ return;
+ }
+
BlobURLLoaderFactory::Create(registry_->GetBlobFromUrl(url), url,
std::move(receiver));
std::move(callback).Run(registry_->GetUnsafeAgentClusterID(url),
@@ -131,11 +160,17 @@ void BlobURLStoreImpl::ResolveAsURLLoaderFactory(
void BlobURLStoreImpl::ResolveForNavigation(
const GURL& url,
mojo::PendingReceiver<blink::mojom::BlobURLToken> token,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
ResolveForNavigationCallback callback) {
if (!registry_) {
std::move(callback).Run(absl::nullopt);
return;
}
+ if (!IsSamePartition(url, unsafe_agent_cluster_id, unsafe_top_level_site)) {
+ std::move(callback).Run(absl::nullopt);
+ return;
+ }
mojo::PendingRemote<blink::mojom::Blob> blob = registry_->GetBlobFromUrl(url);
if (!blob) {
std::move(callback).Run(absl::nullopt);
diff --git a/storage/browser/blob/blob_url_store_impl.h b/storage/browser/blob/blob_url_store_impl.h
--- a/storage/browser/blob/blob_url_store_impl.h
+++ b/storage/browser/blob/blob_url_store_impl.h
@@ -39,14 +39,21 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) BlobURLStoreImpl
const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
RegisterCallback callback) override;
void Revoke(const GURL& url) override;
- void Resolve(const GURL& url, ResolveCallback callback) override;
+ void Resolve(const GURL& url,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
+ ResolveCallback callback) override;
void ResolveAsURLLoaderFactory(
const GURL& url,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
ResolveAsURLLoaderFactoryCallback callback) override;
void ResolveForNavigation(
const GURL& url,
mojo::PendingReceiver<blink::mojom::BlobURLToken> token,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site,
ResolveForNavigationCallback callback) override;
private:
@@ -54,6 +61,11 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) BlobURLStoreImpl
// Returns false and reports a bad mojo message if not.
bool BlobUrlIsValid(const GURL& url, const char* method) const;
+ bool IsSamePartition(
+ const GURL& blob_url,
+ const base::UnguessableToken& unsafe_agent_cluster_id,
+ const absl::optional<net::SchemefulSite>& unsafe_top_level_site);
+
const url::Origin origin_;
base::WeakPtr<BlobUrlRegistry> registry_;
diff --git a/third_party/blink/public/mojom/blob/blob_url_store.mojom b/third_party/blink/public/mojom/blob/blob_url_store.mojom
--- a/third_party/blink/public/mojom/blob/blob_url_store.mojom
+++ b/third_party/blink/public/mojom/blob/blob_url_store.mojom
@@ -28,7 +28,9 @@ interface BlobURLStore {
Revoke(url.mojom.Url url);
// Resolves a public Blob URL.
- Resolve(url.mojom.Url url) => (
+ Resolve(url.mojom.Url url,
+ mojo_base.mojom.UnguessableToken unsafe_agent_cluster_id,
+ network.mojom.SchemefulSite? unsafe_top_level_site) => (
pending_remote<blink.mojom.Blob>? blob,
// TODO(https://crbug.com/1224926): Remove this once experiment is over.
mojo_base.mojom.UnguessableToken? unsafe_agent_cluster_id);
@@ -42,7 +44,9 @@ interface BlobURLStore {
// both the blob URL and all other references to the blob have been dropped.
ResolveAsURLLoaderFactory(
url.mojom.Url url,
- pending_receiver<network.mojom.URLLoaderFactory> factory) => (
+ pending_receiver<network.mojom.URLLoaderFactory> factory,
+ mojo_base.mojom.UnguessableToken unsafe_agent_cluster_id,
+ network.mojom.SchemefulSite? unsafe_top_level_site) => (
// TODO(https://crbug.com/1224926): Remove these once experiment is over.
mojo_base.mojom.UnguessableToken? unsafe_agent_cluster_id,
network.mojom.SchemefulSite? unsafe_top_level_site);
@@ -52,7 +56,9 @@ interface BlobURLStore {
// refer to, even after the URL is revoked.
// As long as the token is alive, the resolved blob will also be kept alive.
ResolveForNavigation(url.mojom.Url url,
- pending_receiver<BlobURLToken> token) => (
+ pending_receiver<BlobURLToken> token,
+ mojo_base.mojom.UnguessableToken unsafe_agent_cluster_id,
+ network.mojom.SchemefulSite? unsafe_top_level_site) => (
// TODO(https://crbug.com/1224926): Remove this once experiment is over.
mojo_base.mojom.UnguessableToken? unsafe_agent_cluster_id);
};
diff --git a/third_party/blink/renderer/core/fileapi/public_url_manager.cc b/third_party/blink/renderer/core/fileapi/public_url_manager.cc
--- a/third_party/blink/renderer/core/fileapi/public_url_manager.cc
+++ b/third_party/blink/renderer/core/fileapi/public_url_manager.cc
@@ -56,6 +56,21 @@ static void RemoveFromNullOriginMapIfNecessary(const KURL& blob_url) {
BlobURLNullOriginMap::GetInstance()->Remove(blob_url);
}
+static absl::optional<BlinkSchemefulSite> GetInsecureTopLevelSite(
+ ExecutionContext* execution_context) {
+ absl::optional<BlinkSchemefulSite> top_level_site;
+ if (execution_context->IsWindow()) {
+ auto* window = To<LocalDOMWindow>(execution_context);
+ if (window->top() && window->top()->GetFrame()) {
+ top_level_site = BlinkSchemefulSite(window->top()
+ ->GetFrame()
+ ->GetSecurityContext()
+ ->GetSecurityOrigin());
+ }
+ }
+ return top_level_site;
+}
+
} // namespace
PublicURLManager::PublicURLManager(ExecutionContext* context)
@@ -176,6 +191,7 @@ void PublicURLManager::Resolve(
url_store_->ResolveAsURLLoaderFactory(
url, std::move(factory_receiver),
+ GetExecutionContext()->GetAgentClusterID(), GetInsecureTopLevelSite(GetExecutionContext()),
WTF::Bind(
[](ExecutionContext* execution_context,
const absl::optional<base::UnguessableToken>&
@@ -249,6 +265,7 @@ void PublicURLManager::Resolve(
url_store_->ResolveForNavigation(
url, std::move(token_receiver),
+ GetExecutionContext()->GetAgentClusterID(), GetInsecureTopLevelSite(GetExecutionContext()),
WTF::Bind(
[](ExecutionContext* execution_context,
const absl::optional<base::UnguessableToken>&
--
2.25.1
@@ -0,0 +1,103 @@
From: uazo <uazo@users.noreply.github.com>
Date: Wed, 21 Sep 2022 12:28:17 +0000
Subject: Remove http referrals in cross origin navigation
and adds a flag to disable them completely
---
chrome/android/java/res/xml/privacy_preferences.xml | 4 ++++
.../chrome/browser/privacy/settings/PrivacySettings.java | 8 ++++++++
.../browser/ui/android/strings/android_chrome_strings.grd | 3 +++
content/browser/renderer_host/navigation_request.cc | 7 +++++++
services/network/public/cpp/resource_request.h | 2 +-
5 files changed, 23 insertions(+), 1 deletion(-)
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
@@ -58,6 +58,10 @@
android:title="@string/close_tabs_on_exit_title"
android:summary="@string/close_tabs_on_exit_summary"
android:defaultValue="false" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="enable_referrers"
+ android:title="@string/enable_referrers_title"
+ android:defaultValue="false" />
<Preference
android:fragment="org.chromium.chrome.browser.privacy.settings.DoNotTrackSettings"
android:key="do_not_track"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -61,6 +61,7 @@ public class PrivacySettings
private static final String PREF_HTTPS_FIRST_MODE = "https_first_mode";
private static final String PREF_SECURE_DNS = "secure_dns";
private static final String PREF_DO_NOT_TRACK = "do_not_track";
+ private static final String PREF_ENABLE_REFERRERS = "enable_referrers";
private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data";
private static final String PREF_PROXY_OPTIONS = "proxy";
private static final String PREF_PRIVACY_GUIDE = "privacy_guide";
@@ -175,6 +176,9 @@ public class PrivacySettings
} else if (PREF_CAN_MAKE_PAYMENT.equals(key)) {
UserPrefs.get(Profile.getLastUsedRegularProfile())
.setBoolean(Pref.CAN_MAKE_PAYMENT_ENABLED, (boolean) newValue);
+ } else if (PREF_ENABLE_REFERRERS.equals(key)) {
+ UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .setBoolean(Pref.ENABLE_REFERRERS, (boolean) newValue);
} else if (PREF_HTTPS_FIRST_MODE.equals(key)) {
UserPrefs.get(Profile.getLastUsedRegularProfile())
.setBoolean(Pref.HTTPS_ONLY_MODE_ENABLED, (boolean) newValue);
@@ -228,6 +232,10 @@ public class PrivacySettings
: R.string.text_off);
}
+ ChromeSwitchPreference enableFeferrerPref = findPreference(PREF_ENABLE_REFERRERS);
+ enableFeferrerPref.setChecked(prefService.getBoolean(Pref.ENABLE_REFERRERS));
+ enableFeferrerPref.setOnPreferenceChangeListener(this);
+
Preference preloadPagesPreference = findPreference(PREF_PRELOAD_PAGES);
if (preloadPagesPreference != null) {
preloadPagesPreference.setSummary(
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -876,6 +876,9 @@ CHAR_LIMIT guidelines:
For example, some websites may respond to this request by showing you ads that arent based on other websites youve visited. Many websites will still collect and use your browsing data — for example to improve security, to provide content, ads and recommendations, and to generate reporting statistics.
</message>
+ <message name="IDS_ENABLE_REFERRERS_TITLE" desc="Title for 'Enable referrers' preference">
+ Enable http referrer header
+ </message>
<message name="IDS_CAN_MAKE_PAYMENT_TITLE" desc="Title for preference to allow websites to know whether you have payment methods available through PaymentRequest.CanMakePayment interface">
Access payment methods
</message>
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -430,6 +430,13 @@ void AddAdditionalRequestHeaders(
blink::mojom::Referrer(GURL(), network::mojom::ReferrerPolicy::kNever);
}
+ if (!url::IsSameOriginWith(referrer->url.GetAsReferrer(), url) &&
+ frame_tree_node->IsOutermostMainFrame()) {
+ // remove referrer if the navigation is done on the top frame
+ *referrer =
+ blink::mojom::Referrer(GURL(), network::mojom::ReferrerPolicy::kNever);
+ }
+
// 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/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h
--- a/services/network/public/cpp/resource_request.h
+++ b/services/network/public/cpp/resource_request.h
@@ -130,7 +130,7 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE) ResourceRequest {
std::vector<GURL> navigation_redirect_chain;
GURL referrer;
- net::ReferrerPolicy referrer_policy = net::ReferrerPolicy::NEVER_CLEAR;
+ net::ReferrerPolicy referrer_policy = net::ReferrerPolicy::REDUCE_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN;
net::HttpRequestHeaders headers;
net::HttpRequestHeaders cors_exempt_headers;
int load_flags = 0;
--
2.25.1
+848
View File
@@ -0,0 +1,848 @@
From: uazo <uazo@users.noreply.github.com>
Date: Fri, 26 Aug 2022 13:15:43 +0000
Subject: Viewport Protection
Scale the viewport and the screen by a random factor to prevent coordinate-based fingerprinting scripts.
The factor is changed at each change of origin.
The feature is controlled by a site setting (default disabled)
---
.../browser_ui/site_settings/android/BUILD.gn | 3 +
.../BromiteCustomContentSettingImpl.java | 1 +
.../BromiteViewportContentSetting.java | 86 +++++++++++++++++++
.../site_settings/SiteSettingsCategory.java | 5 +-
.../strings/android/browser_ui_strings.grd | 1 +
.../browser_ui/strings/android/viewport.grdp | 18 ++++
components/components_strings.grd | 1 +
.../core/browser/content_settings_registry.cc | 14 +++
.../core/browser/content_settings_utils.cc | 2 +
.../core/common/content_settings.cc | 4 +-
.../core/common/content_settings.h | 1 +
.../core/common/content_settings.mojom | 1 +
.../common/content_settings_mojom_traits.cc | 3 +-
.../common/content_settings_mojom_traits.h | 5 ++
.../core/common/content_settings_types.h | 2 +
.../renderer/content_settings_agent_impl.cc | 9 ++
.../renderer/content_settings_agent_impl.h | 1 +
.../platform/web_content_settings_client.h | 2 +
.../core/css/resolver/style_resolver.cc | 10 ++-
.../blink/renderer/core/events/mouse_event.h | 19 +++-
.../renderer/core/events/pointer_event.h | 11 +++
.../renderer/core/exported/web_view_impl.cc | 2 +-
.../renderer/core/frame/local_dom_window.cc | 27 +++++-
.../blink/renderer/core/frame/local_frame.cc | 12 ++-
.../blink/renderer/core/frame/local_frame.h | 6 +-
.../core/frame/screen_metrics_emulator.cc | 8 +-
.../core/frame/screen_metrics_emulator.h | 8 ++
.../core/frame/web_frame_widget_impl.cc | 8 ++
.../core/frame/web_remote_frame_impl.cc | 3 +-
.../blink/renderer/core/input/touch.cc | 17 +++-
third_party/blink/renderer/core/page/page.cc | 74 ++++++++++++++++
third_party/blink/renderer/core/page/page.h | 7 ++
32 files changed, 351 insertions(+), 20 deletions(-)
create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteViewportContentSetting.java
create mode 100644 components/browser_ui/strings/android/viewport.grdp
diff --git a/components/browser_ui/site_settings/android/BUILD.gn b/components/browser_ui/site_settings/android/BUILD.gn
--- a/components/browser_ui/site_settings/android/BUILD.gn
+++ b/components/browser_ui/site_settings/android/BUILD.gn
@@ -88,6 +88,9 @@ android_library("java") {
sources += [
"java/src/org/chromium/components/browser_ui/site_settings/BromiteWebRTCContentSetting.java",
]
+ sources += [
+ "java/src/org/chromium/components/browser_ui/site_settings/BromiteViewportContentSetting.java",
+ ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
resources_package = "org.chromium.components.browser_ui.site_settings"
deps = [
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteCustomContentSettingImpl.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteCustomContentSettingImpl.java
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteCustomContentSettingImpl.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteCustomContentSettingImpl.java
@@ -45,6 +45,7 @@ public abstract class BromiteCustomContentSettingImpl {
mItemList = new ArrayList<BromiteCustomContentSetting>();
mItemList.add(new BromiteWebGLContentSetting());
mItemList.add(new BromiteWebRTCContentSetting());
+ mItemList.add(new BromiteViewportContentSetting());
}
public static SiteSettingsCategory createFromType(
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteViewportContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteViewportContentSetting.java
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteViewportContentSetting.java
@@ -0,0 +1,86 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.components.browser_ui.site_settings;
+
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
+import org.chromium.components.content_settings.ContentSettingValues;
+import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.content_public.browser.BrowserContextHandle;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import java.util.ArrayList;
+
+public class BromiteViewportContentSetting extends BromiteCustomContentSetting {
+ public BromiteViewportContentSetting() {
+ super(/*contentSettingsType*/ ContentSettingsType.VIEWPORT,
+ /*siteSettingsCategory*/ SiteSettingsCategory.Type.VIEWPORT,
+ /*defaultEnabledValue*/ ContentSettingValues.ALLOW,
+ /*defaultDisabledValue*/ ContentSettingValues.BLOCK,
+ /*allowException*/ true,
+ /*preferenceKey*/ "viewport",
+ /*profilePrefKey*/ "viewport");
+ }
+
+ @Override
+ public ContentSettingsResources.ResourceItem getResourceItem() {
+ return new ContentSettingsResources.ResourceItem(
+ /*icon*/ R.drawable.web_asset,
+ /*title*/ R.string.viewport_permission_title,
+ /*defaultEnabledValue*/ getDefaultEnabledValue(),
+ /*defaultDisabledValue*/ getDefaultDisabledValue(),
+ /*enabledSummary*/ R.string.website_settings_category_viewport_enabled,
+ /*disabledSummary*/ R.string.website_settings_category_viewport_disabled);
+ }
+
+ @Override
+ public int getCategorySummary(@Nullable @ContentSettingValues int value) {
+ switch (value) {
+ case ContentSettingValues.ALLOW:
+ return R.string.website_settings_category_viewport_enabled;
+ case ContentSettingValues.BLOCK:
+ return R.string.website_settings_category_viewport_disabled;
+ default:
+ // this will cause a runtime exception
+ return 0;
+ }
+ }
+
+ @Override
+ public boolean requiresTriStateContentSetting() {
+ return false;
+ }
+
+ @Override
+ public boolean showOnlyDescriptions() {
+ return true;
+ }
+
+ @Override
+ public int getAddExceptionDialogMessage() {
+ return R.string.website_settings_category_viewport_enabled;
+ }
+
+ @Override
+ public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSettingValues int value) {
+ return value != ContentSettingValues.BLOCK;
+ }
+}
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
@@ -44,7 +44,7 @@ public class SiteSettingsCategory {
Type.PROTECTED_MEDIA, Type.SENSORS, Type.SOUND, Type.USB, Type.VIRTUAL_REALITY,
Type.USE_STORAGE, Type.AUTO_DARK_WEB_CONTENT, Type.REQUEST_DESKTOP_SITE,
Type.FEDERATED_IDENTITY_API, Type.TIMEZONE_OVERRIDE, Type.AUTOPLAY, Type.JAVASCRIPT_JIT,
- Type.IMAGES, Type.WEBGL, Type.WEBRTC})
+ Type.IMAGES, Type.WEBGL, Type.WEBRTC, Type.VIEWPORT})
@Retention(RetentionPolicy.SOURCE)
public @interface Type {
// All updates here must also be reflected in {@link #preferenceKey(int)
@@ -81,10 +81,11 @@ public class SiteSettingsCategory {
int IMAGES = 29;
int WEBGL = 30;
int WEBRTC = 31;
+ int VIEWPORT = 32;
/**
* Number of handled categories used for calculating array sizes.
*/
- int NUM_ENTRIES = 32;
+ int NUM_ENTRIES = 33;
}
private final BrowserContextHandle mBrowserContextHandle;
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
--- a/components/browser_ui/strings/android/browser_ui_strings.grd
+++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -176,6 +176,7 @@
<part file="site_settings.grdp" />
<part file="webgl.grdp" />
<part file="webrtc.grdp" />
+ <part file="viewport.grdp" />
<message name="IDS_GOT_IT" desc="Button for the user to accept a disclosure/message">
Got it
diff --git a/components/browser_ui/strings/android/viewport.grdp b/components/browser_ui/strings/android/viewport.grdp
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/strings/android/viewport.grdp
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_SITE_SETTINGS_TYPE_VIEWPORT" desc="The label used for viewport size change site settings controls.">
+ Viewport Size Protection
+ </message>
+ <message name="IDS_SITE_SETTINGS_TYPE_VIEWPORT_MID_SENTENCE" desc="The label used for viewport size change site settings controls when used mid-sentence.">
+ Viewport Size Protection
+ </message>
+ <message name="IDS_VIEWPORT_PERMISSION_TITLE" desc="Title of the permission to use viewport size change [CHAR-LIMIT=32]">
+ Viewport Size Protection
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_VIEWPORT_ENABLED" desc="Summary text explaining that viewport size change is full enabled.">
+ Enabled
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_VIEWPORT_DISABLED" desc="Summary text explaining that viewport size change is full disabled.">
+ Disabled
+ </message>
+</grit-part>
diff --git a/components/components_strings.grd b/components/components_strings.grd
--- a/components/components_strings.grd
+++ b/components/components_strings.grd
@@ -340,6 +340,7 @@
<part file="user_scripts/strings/userscripts_strings.grdp" />
<part file="browser_ui/strings/android/webgl.grdp" />
<part file="browser_ui/strings/android/webrtc.grdp" />
+ <part file="browser_ui/strings/android/viewport.grdp" />
<if expr="not is_ios">
<part file="history_clusters_strings.grdp" />
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -710,6 +710,20 @@ void ContentSettingsRegistry::Init() {
/*show_into_info_page*/ true,
/*permission_type_ui*/ IDS_SITE_SETTINGS_TYPE_WEBRTC,
/*permission_type_ui_mid_sentence*/ IDS_SITE_SETTINGS_TYPE_WEBRTC_MID_SENTENCE);
+
+ Register(ContentSettingsType::VIEWPORT, "viewport", CONTENT_SETTING_BLOCK,
+ WebsiteSettingsInfo::SYNCABLE,
+ AllowlistedSchemes(),
+ ValidSettings(CONTENT_SETTING_ALLOW,
+ CONTENT_SETTING_BLOCK),
+ WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE,
+ WebsiteSettingsRegistry::PLATFORM_ANDROID,
+ ContentSettingsInfo::INHERIT_IN_INCOGNITO,
+ ContentSettingsInfo::PERSISTENT,
+ ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS,
+ /*show_into_info_page*/ true,
+ /*permission_type_ui*/ IDS_SITE_SETTINGS_TYPE_VIEWPORT,
+ /*permission_type_ui_mid_sentence*/ IDS_SITE_SETTINGS_TYPE_VIEWPORT_MID_SENTENCE);
}
void ContentSettingsRegistry::Register(
diff --git a/components/content_settings/core/browser/content_settings_utils.cc b/components/content_settings/core/browser/content_settings_utils.cc
--- a/components/content_settings/core/browser/content_settings_utils.cc
+++ b/components/content_settings/core/browser/content_settings_utils.cc
@@ -159,6 +159,8 @@ void GetRendererContentSettingRules(const HostContentSettingsMap* map,
&(rules->webgl_rules));
map->GetSettingsForOneType(ContentSettingsType::WEBRTC,
&(rules->webrtc_rules));
+ map->GetSettingsForOneType(ContentSettingsType::VIEWPORT,
+ &(rules->viewport_rules));
}
bool IsMorePermissive(ContentSetting a, ContentSetting b) {
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
--- a/components/content_settings/core/common/content_settings.cc
+++ b/components/content_settings/core/common/content_settings.cc
@@ -208,7 +208,8 @@ bool RendererContentSettingRules::IsRendererContentSetting(
content_type == ContentSettingsType::AUTO_DARK_WEB_CONTENT ||
content_type == ContentSettingsType::TIMEZONE_OVERRIDE ||
content_type == ContentSettingsType::WEBGL ||
- content_type == ContentSettingsType::WEBRTC;
+ content_type == ContentSettingsType::WEBRTC ||
+ content_type == ContentSettingsType::VIEWPORT;
}
void RendererContentSettingRules::FilterRulesByOutermostMainFrameURL(
@@ -222,6 +223,7 @@ void RendererContentSettingRules::FilterRulesByOutermostMainFrameURL(
FilterRulesForType(autoplay_rules, outermost_main_frame_url);
FilterRulesForType(webgl_rules, outermost_main_frame_url);
FilterRulesForType(webrtc_rules, outermost_main_frame_url);
+ FilterRulesForType(viewport_rules, outermost_main_frame_url);
}
RendererContentSettingRules::RendererContentSettingRules() = default;
diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h
--- a/components/content_settings/core/common/content_settings.h
+++ b/components/content_settings/core/common/content_settings.h
@@ -99,6 +99,7 @@ struct RendererContentSettingRules {
std::string timezone_override_value;
ContentSettingsForOneType webgl_rules;
ContentSettingsForOneType webrtc_rules;
+ ContentSettingsForOneType viewport_rules;
};
namespace content_settings {
diff --git a/components/content_settings/core/common/content_settings.mojom b/components/content_settings/core/common/content_settings.mojom
--- a/components/content_settings/core/common/content_settings.mojom
+++ b/components/content_settings/core/common/content_settings.mojom
@@ -83,4 +83,5 @@ struct RendererContentSettingRules {
string timezone_override_value;
array<ContentSettingPatternSource> webgl_rules;
array<ContentSettingPatternSource> webrtc_rules;
+ array<ContentSettingPatternSource> viewport_rules;
};
diff --git a/components/content_settings/core/common/content_settings_mojom_traits.cc b/components/content_settings/core/common/content_settings_mojom_traits.cc
--- a/components/content_settings/core/common/content_settings_mojom_traits.cc
+++ b/components/content_settings/core/common/content_settings_mojom_traits.cc
@@ -106,7 +106,8 @@ bool StructTraits<content_settings::mojom::RendererContentSettingRulesDataView,
data.ReadTimezoneOverrideRules(&out->timezone_override_rules) &&
data.ReadTimezoneOverrideValue(&out->timezone_override_value) &&
data.ReadWebglRules(&out->webgl_rules) &&
- data.ReadWebrtcRules(&out->webrtc_rules);
+ data.ReadWebrtcRules(&out->webrtc_rules) &&
+ data.ReadViewportRules(&out->viewport_rules);
}
} // namespace mojo
diff --git a/components/content_settings/core/common/content_settings_mojom_traits.h b/components/content_settings/core/common/content_settings_mojom_traits.h
--- a/components/content_settings/core/common/content_settings_mojom_traits.h
+++ b/components/content_settings/core/common/content_settings_mojom_traits.h
@@ -175,6 +175,11 @@ struct StructTraits<
return r.webrtc_rules;
}
+ static const std::vector<ContentSettingPatternSource>& viewport_rules(
+ const RendererContentSettingRules& r) {
+ return r.viewport_rules;
+ }
+
static bool Read(
content_settings::mojom::RendererContentSettingRulesDataView data,
RendererContentSettingRules* out);
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h
--- a/components/content_settings/core/common/content_settings_types.h
+++ b/components/content_settings/core/common/content_settings_types.h
@@ -284,6 +284,8 @@ enum class ContentSettingsType : int32_t {
WEBRTC,
+ VIEWPORT,
+
// Setting to indicate whether browser should allow signing into a website via
// the browser FedCM API.
FEDERATED_IDENTITY_API,
diff --git a/components/content_settings/renderer/content_settings_agent_impl.cc b/components/content_settings/renderer/content_settings_agent_impl.cc
--- a/components/content_settings/renderer/content_settings_agent_impl.cc
+++ b/components/content_settings/renderer/content_settings_agent_impl.cc
@@ -467,6 +467,15 @@ bool ContentSettingsAgentImpl::AllowWebRTC(bool enabled_per_settings) {
url::Origin(frame->GetDocument().GetSecurityOrigin()).GetURL());
}
+bool ContentSettingsAgentImpl::AllowViewportChange(bool enabled_per_settings) {
+ if (!content_setting_rules_)
+ return false;
+ blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
+ return CONTENT_SETTING_ALLOW == GetContentSettingFromRules(
+ content_setting_rules_->viewport_rules,
+ url::Origin(frame->GetDocument().GetSecurityOrigin()).GetURL());
+}
+
bool ContentSettingsAgentImpl::IsAllowlistedForContentSettings() const {
if (should_allowlist_)
return true;
diff --git a/components/content_settings/renderer/content_settings_agent_impl.h b/components/content_settings/renderer/content_settings_agent_impl.h
--- a/components/content_settings/renderer/content_settings_agent_impl.h
+++ b/components/content_settings/renderer/content_settings_agent_impl.h
@@ -101,6 +101,7 @@ class ContentSettingsAgentImpl
bool ShouldAutoupgradeMixedContent() override;
bool AllowWebgl(bool enabled_per_settings) override;
bool AllowWebRTC(bool enabled_per_settings) override;
+ bool AllowViewportChange(bool enabled_per_settings) override;
bool allow_running_insecure_content() const {
return allow_running_insecure_content_;
diff --git a/third_party/blink/public/platform/web_content_settings_client.h b/third_party/blink/public/platform/web_content_settings_client.h
--- a/third_party/blink/public/platform/web_content_settings_client.h
+++ b/third_party/blink/public/platform/web_content_settings_client.h
@@ -103,6 +103,8 @@ class WebContentSettingsClient {
virtual bool AllowWebRTC(bool default_value) { return default_value; }
+ virtual bool AllowViewportChange(bool default_value) { return default_value; }
+
// Reports that passive mixed content was found at the provided URL.
virtual void PassiveInsecureContentFound(const WebURL&) {}
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -1499,8 +1499,14 @@ scoped_refptr<ComputedStyle> StyleResolver::InitialStyleForElement() const {
initial_style->SetRtlOrdering(
GetDocument().VisuallyOrdered() ? EOrder::kVisual : EOrder::kLogical);
- initial_style->SetZoom(InitialZoom());
- initial_style->SetEffectiveZoom(initial_style->Zoom());
+ if (GetDocument().GetPage() && GetDocument().GetPage()->IsScreenEmulated()) {
+ // hides the zoom override to the dom on the html tag
+ initial_style->SetZoom(1);
+ initial_style->SetEffectiveZoom(InitialZoom());
+ } else {
+ initial_style->SetZoom(InitialZoom());
+ initial_style->SetEffectiveZoom(initial_style->Zoom());
+ }
initial_style->SetInForcedColorsMode(GetDocument().InForcedColorsMode());
initial_style->SetTapHighlightColor(
ComputedStyleInitialValues::InitialTapHighlightColor());
diff --git a/third_party/blink/renderer/core/events/mouse_event.h b/third_party/blink/renderer/core/events/mouse_event.h
--- a/third_party/blink/renderer/core/events/mouse_event.h
+++ b/third_party/blink/renderer/core/events/mouse_event.h
@@ -31,6 +31,7 @@
#include "third_party/blink/renderer/core/dom/events/simulated_click_options.h"
#include "third_party/blink/renderer/core/events/ui_event_with_key_state.h"
#include "third_party/blink/renderer/platform/wtf/casting.h"
+#include "third_party/blink/renderer/core/page/page.h"
namespace blink {
@@ -141,8 +142,22 @@ class CORE_EXPORT MouseEvent : public UIEventWithKeyState {
// Note that these values are adjusted to counter the effects of zoom, so that
// values exposed via DOM APIs are invariant under zooming.
- virtual double screenX() const { return std::floor(screen_x_); }
- virtual double screenY() const { return std::floor(screen_y_); }
+ virtual double screenX() const {
+ if (view() && view()->GetFrame() &&
+ view()->GetFrame()->GetPage() &&
+ view()->GetFrame()->GetPage()->IsScreenEmulated()) {
+ return std::floor(page_x_);
+ }
+ return std::floor(screen_x_);
+ }
+ virtual double screenY() const {
+ if (view() && view()->GetFrame() &&
+ view()->GetFrame()->GetPage() &&
+ view()->GetFrame()->GetPage()->IsScreenEmulated()) {
+ return std::floor(page_y_);
+ }
+ return std::floor(screen_y_);
+ }
virtual double clientX() const { return std::floor(client_x_); }
virtual double clientY() const { return std::floor(client_y_); }
diff --git a/third_party/blink/renderer/core/events/pointer_event.h b/third_party/blink/renderer/core/events/pointer_event.h
--- a/third_party/blink/renderer/core/events/pointer_event.h
+++ b/third_party/blink/renderer/core/events/pointer_event.h
@@ -9,6 +9,7 @@
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/events/mouse_event.h"
#include "third_party/blink/renderer/platform/wtf/casting.h"
+#include "third_party/blink/renderer/core/page/page.h"
namespace blink {
@@ -57,11 +58,21 @@ class CORE_EXPORT PointerEvent : public MouseEvent {
double screenX() const override {
if (ShouldHaveIntegerCoordinates())
return MouseEvent::screenX();
+ if (view() && view()->GetFrame() &&
+ view()->GetFrame()->GetPage() &&
+ view()->GetFrame()->GetPage()->IsScreenEmulated()) {
+ return page_x_;
+ }
return screen_x_;
}
double screenY() const override {
if (ShouldHaveIntegerCoordinates())
return MouseEvent::screenY();
+ if (view() && view()->GetFrame() &&
+ view()->GetFrame()->GetPage() &&
+ view()->GetFrame()->GetPage()->IsScreenEmulated()) {
+ return page_y_;
+ }
return screen_y_;
}
double clientX() const override {
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
@@ -1026,7 +1026,7 @@ WebPagePopupImpl* WebViewImpl::OpenPagePopup(PagePopupClient* client) {
page_popup_ = WebPagePopupImpl::Create(
std::move(popup_widget_host), std::move(widget_host),
std::move(widget_receiver), this, agent_group_scheduler,
- opener_widget->GetOriginalScreenInfos(), client);
+ opener_widget->GetScreenInfos(), client);
EnablePopupMouseWheelEventListener(web_opener_frame->LocalRoot());
return page_popup_.get();
}
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1395,6 +1395,11 @@ int LocalDOMWindow::outerHeight() const {
if (!page)
return 0;
+ // If screen is emulated and this frame is remote cross-origin
+ // return innerHeight
+ if (page->IsScreenEmulated() && frame->IsCrossOriginToOutermostMainFrame())
+ return innerHeight();
+
ChromeClient& chrome_client = page->GetChromeClient();
if (page->GetSettings().GetReportScreenSizeInPhysicalPixelsQuirk()) {
return static_cast<int>(
@@ -1420,6 +1425,11 @@ int LocalDOMWindow::outerWidth() const {
if (!page)
return 0;
+ // If screen is emulated and this frame is remote cross-origin
+ // return innerWidth
+ if (page->IsScreenEmulated() && frame->IsCrossOriginToOutermostMainFrame())
+ return innerWidth();
+
ChromeClient& chrome_client = page->GetChromeClient();
if (page->GetSettings().GetReportScreenSizeInPhysicalPixelsQuirk()) {
return static_cast<int>(
@@ -1607,7 +1617,8 @@ double LocalDOMWindow::devicePixelRatio() const {
if (!GetFrame())
return 0.0;
- return GetFrame()->DevicePixelRatio();
+ // never send the zoom factor override value
+ return GetFrame()->DevicePixelRatio(/*with_zoom_factor*/false);
}
void LocalDOMWindow::scrollBy(double x, double y) const {
@@ -2149,6 +2160,20 @@ DOMWindow* LocalDOMWindow::open(v8::Isolate* isolate,
if (!completed_url.IsEmpty() || result.new_window)
result.frame->Navigate(frame_request, WebFrameLoadType::kStandard);
+ if (result.frame->IsLocalFrame()) {
+ // we need to use opener setting when opening a iframe without url
+ // (as "about:blank") to force emulated screen
+ // since result.frame.GetContentSettingsClient()->AllowViewportChange()
+ // in the Page::DidCommitLoad() event returns false for these urls
+ //
+ // prevent this js code:
+ // var w = window.open()
+ // var not_emulated_screen_info = w.screen
+ result.frame->GetPage()->CalculateEmulatedScreenSetting(
+ To<LocalFrame>(result.frame),
+ /*force*/ GetFrame()->GetContentSettingsClient()->AllowViewportChange(false));
+ }
+
// TODO(japhet): window-open-noopener.html?_top and several tests in
// html/browsers/windows/browsing-context-names/ appear to require that
// the special case target names (_top, _parent, _self) ignore opener
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1275,6 +1275,10 @@ gfx::SizeF LocalFrame::ResizePageRectsKeepingRatio(
return gfx::SizeF(result_width, result_height);
}
+void LocalFrame::SetPageZoomFactorBaseValue(float factor) {
+ page_zoom_factor_base_value_ = factor;
+}
+
void LocalFrame::SetPageZoomFactor(float factor) {
SetPageAndTextZoomFactors(factor, text_zoom_factor_);
}
@@ -1414,12 +1418,16 @@ device::mojom::blink::DevicePostureType LocalFrame::GetDevicePosture() {
return mojo_handler_->GetDevicePosture();
}
-double LocalFrame::DevicePixelRatio() const {
+double LocalFrame::DevicePixelRatio(bool with_zoom_factor) const {
if (!page_)
return 0;
double ratio = page_->InspectorDeviceScaleFactorOverride();
- ratio *= PageZoomFactor();
+ // with_zoom_factor is default true
+ if (with_zoom_factor)
+ ratio *= PageZoomFactor();
+ else
+ ratio = page_zoom_factor_;
return ratio;
}
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -373,13 +373,14 @@ class CORE_EXPORT LocalFrame final
void SetInViewSourceMode(bool = true);
void SetPageZoomFactor(float);
- float PageZoomFactor() const { return page_zoom_factor_; }
+ void SetPageZoomFactorBaseValue(float factor);
+ float PageZoomFactor() const { return page_zoom_factor_ + page_zoom_factor_base_value_; }
void SetTextZoomFactor(float);
float TextZoomFactor() const { return text_zoom_factor_; }
void SetPageAndTextZoomFactors(float page_zoom_factor,
float text_zoom_factor);
- double DevicePixelRatio() const;
+ double DevicePixelRatio(bool with_zoom_factor = true) const;
// Informs the local root's document and its local descendant subtree that a
// media query value changed.
@@ -904,6 +905,7 @@ class CORE_EXPORT LocalFrame final
unsigned hidden_ : 1;
float page_zoom_factor_;
+ float page_zoom_factor_base_value_ = 0;
float text_zoom_factor_;
Member<CoreProbeSink> probe_sink_;
diff --git a/third_party/blink/renderer/core/frame/screen_metrics_emulator.cc b/third_party/blink/renderer/core/frame/screen_metrics_emulator.cc
--- a/third_party/blink/renderer/core/frame/screen_metrics_emulator.cc
+++ b/third_party/blink/renderer/core/frame/screen_metrics_emulator.cc
@@ -163,6 +163,9 @@ void ScreenMetricsEmulator::Apply() {
frame_widget_->SetScreenInfoAndSize(emulated_screen_infos,
/*widget_size=*/widget_size,
/*visible_viewport_size=*/widget_size);
+
+ // save emulated window size
+ window_size_ = window_size;
}
void ScreenMetricsEmulator::UpdateVisualProperties(
@@ -191,9 +194,8 @@ void ScreenMetricsEmulator::OnUpdateScreenRects(
const gfx::Rect& window_screen_rect) {
original_view_screen_rect_ = view_screen_rect;
original_window_screen_rect_ = window_screen_rect;
- if (emulating_desktop()) {
- Apply();
- }
+ // needed as we need browser ui size
+ Apply();
}
} // namespace blink
diff --git a/third_party/blink/renderer/core/frame/screen_metrics_emulator.h b/third_party/blink/renderer/core/frame/screen_metrics_emulator.h
--- a/third_party/blink/renderer/core/frame/screen_metrics_emulator.h
+++ b/third_party/blink/renderer/core/frame/screen_metrics_emulator.h
@@ -61,6 +61,11 @@ class ScreenMetricsEmulator : public GarbageCollected<ScreenMetricsEmulator> {
// Emulated position of the main frame widget (aka view) rect.
gfx::Point ViewRectOrigin();
+ // Get emulated window size
+ const gfx::Size& ViewWindowSize() const {
+ return window_size_;
+ }
+
// Disables emulation and applies non-emulated values to the
// WebFrameWidgetImpl. Call this before destroying the ScreenMetricsEmulator.
void DisableAndApply();
@@ -96,6 +101,9 @@ class ScreenMetricsEmulator : public GarbageCollected<ScreenMetricsEmulator> {
gfx::Rect original_view_screen_rect_;
gfx::Rect original_window_screen_rect_;
std::vector<gfx::Rect> original_root_window_segments_;
+
+ // Actual size after apply
+ gfx::Size window_size_;
};
} // namespace blink
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -1581,6 +1581,14 @@ void WebFrameWidgetImpl::ApplyVisualPropertiesSizing(
if (auto* device_emulator = DeviceEmulator()) {
device_emulator->UpdateVisualProperties(visual_properties);
+ // Shink the view according to browsercontrols
+ size_ = widget_base_->DIPsToCeiledBlinkSpace(
+ device_emulator->ViewWindowSize());
+ View()->ResizeWithBrowserControls(
+ size_.value(),
+ widget_base_->DIPsToCeiledBlinkSpace(
+ widget_base_->VisibleViewportSizeInDIPs()),
+ visual_properties.browser_controls_params);
return;
}
diff --git a/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc b/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
--- a/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
@@ -348,7 +348,8 @@ void WebRemoteFrameImpl::InitializeFrameVisualProperties(
visual_properties.page_scale_factor = ancestor_widget->PageScaleInMainFrame();
visual_properties.is_pinch_gesture_active =
ancestor_widget->PinchGestureActiveInMainFrame();
- visual_properties.screen_infos = ancestor_widget->GetOriginalScreenInfos();
+ // for a cross-site iframe, set the actual (original or emulated) screen infos
+ visual_properties.screen_infos = ancestor_widget->GetScreenInfos();
visual_properties.visible_viewport_size =
ancestor_widget->VisibleViewportSizeInDIPs();
const WebVector<gfx::Rect>& window_segments =
diff --git a/third_party/blink/renderer/core/input/touch.cc b/third_party/blink/renderer/core/input/touch.cc
--- a/third_party/blink/renderer/core/input/touch.cc
+++ b/third_party/blink/renderer/core/input/touch.cc
@@ -30,6 +30,7 @@
#include "third_party/blink/renderer/core/frame/local_frame_view.h"
#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
#include "ui/gfx/geometry/point_f.h"
+#include "third_party/blink/renderer/core/page/page.h"
namespace blink {
@@ -75,7 +76,13 @@ Touch::Touch(LocalFrame* frame,
radius_(radius),
rotation_angle_(rotation_angle),
force_(force),
- absolute_location_(PageToAbsolute(frame, page_pos)) {}
+ absolute_location_(PageToAbsolute(frame, page_pos)) {
+ if (frame->GetPage() && frame->GetPage()->IsScreenEmulated()) {
+ // use page_pos instead of screen_pos
+ screen_pos_.set_x(page_pos_.x());
+ screen_pos_.set_y(page_pos_.y());
+ }
+ }
Touch::Touch(EventTarget* target,
int identifier,
@@ -105,7 +112,13 @@ Touch::Touch(LocalFrame* frame, const TouchInit* initializer)
radius_(initializer->radiusX(), initializer->radiusY()),
rotation_angle_(initializer->rotationAngle()),
force_(initializer->force()),
- absolute_location_(PageToAbsolute(frame, page_pos_)) {}
+ absolute_location_(PageToAbsolute(frame, page_pos_)) {
+ if (frame->GetPage() && frame->GetPage()->IsScreenEmulated()) {
+ // use page_pos instead of screen_pos
+ screen_pos_.set_x(page_pos_.x());
+ screen_pos_.set_y(page_pos_.y());
+ }
+ }
Touch* Touch::CloneWithNewTarget(EventTarget* event_target) const {
return MakeGarbageCollected<Touch>(
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -92,6 +92,9 @@
#include "third_party/blink/renderer/platform/scheduler/public/agent_group_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/skia/include/core/SkColor.h"
+#include "base/rand_util.h"
+#include "third_party/blink/public/common/widget/device_emulation_params.h"
+#include "third_party/blink/renderer/core/exported/web_view_impl.h"
namespace blink {
@@ -881,7 +884,78 @@ void Page::UpdateAcceleratedCompositingSettings() {
}
}
+void Page::CalculateEmulatedScreenSetting(LocalFrame* frame, bool force) {
+ blink::WebContentSettingsClient* settings = frame->GetContentSettingsClient();
+ if ( (settings && settings->AllowViewportChange(false)) || force) {
+ // this is the maximum (and minimum) value which in percentage
+ // corresponds to +- 0.03%
+ // more or less 3-6 pixels according to the resolution 300-600px
+ // little enough not to change the page view the user is used to,
+ // but enough to change all bounds, especially those in floating point
+ const int max_range = 300;
+
+ // only for the local main frame
+ // the other local frames use the values from main
+ // while the remote ones do not communicate the values to the parent
+ // (and they will be local main frame in their page context)
+ if (main_frame_ == frame) {
+ // set the scale factor
+ double scale_factor = 0;
+ if (override_window_scale_factor_ != 0) {
+ scale_factor = override_window_scale_factor_;
+ } else {
+ // we allow the increase or decrease of the screen size (and view)
+ scale_factor = 1.0 + base::RandInt(-max_range, max_range) / 10000.0;
+ }
+
+ // save the value, so a same domain navigation will reuse same value
+ override_window_scale_factor_ = scale_factor;
+
+ // we divide the value in half: half for the screen and the view,
+ // which then the latter will be scaled again by the zoom
+ double half_random = (scale_factor - 1.0) / 2.0;
+
+ // set emulation params
+ DeviceEmulationParams params;
+ // the screen size is changed to match the widget size for mobile emulation
+ params.screen_type = mojom::EmulatedScreenType::kMobile;
+ // scale the widget size (and the screen size) by half_random scale factor
+ params.scale = 1 / (1.0 + half_random);
+
+ GetChromeClient().GetWebView()->EnableDeviceEmulation(params);
+
+ // set zoom factor
+ // the zoom factor is used by all the functions that manage the bounds,
+ // which is multiplied by the values in pixels when computed
+ // we do not modify the actual value but only the one used internally
+ // it becomes the base value used as the zoom property of the css, but
+ // it does not appear on the dom (which always remains 1.0)
+ double zoom_factor = 0;
+ if (override_zoom_factor_ != 0) {
+ zoom_factor = override_zoom_factor_;
+ } else {
+ // we only allow the page size to decrease, otherwise the scroll
+ // bars would not be visible
+ zoom_factor = base::RandInt(0, max_range/2) / 10000.0;
+ }
+
+ // save the value, so a same domain navigation will reuse same value
+ override_zoom_factor_ = zoom_factor;
+
+ frame->SetPageZoomFactorBaseValue(zoom_factor);
+ }
+ is_screen_emulated = true;
+ } else {
+ if (is_screen_emulated && main_frame_ == frame) {
+ GetChromeClient().GetWebView()->DisableDeviceEmulation();
+ frame->SetPageZoomFactorBaseValue(0);
+ }
+ is_screen_emulated = false;
+ }
+}
+
void Page::DidCommitLoad(LocalFrame* frame) {
+ CalculateEmulatedScreenSetting(frame);
if (main_frame_ == frame) {
GetConsoleMessageStorage().Clear();
GetInspectorIssueStorage().Clear();
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h
--- a/third_party/blink/renderer/core/page/page.h
+++ b/third_party/blink/renderer/core/page/page.h
@@ -410,6 +410,9 @@ class CORE_EXPORT Page final : public GarbageCollected<Page>,
}
mojom::blink::FencedFrameMode FencedFrameMode() { return fenced_frame_mode_; }
+ void CalculateEmulatedScreenSetting(LocalFrame* frame, bool force = false);
+ bool IsScreenEmulated() { return is_screen_emulated; }
+
private:
friend class ScopedPagePauser;
@@ -539,6 +542,10 @@ class CORE_EXPORT Page final : public GarbageCollected<Page>,
// browser side FrameTree has the FrameTree::Type of kFencedFrame.
bool is_fenced_frame_tree_ = false;
+ bool is_screen_emulated = false;
+ double override_window_scale_factor_ = 0;
+ double override_zoom_factor_ = 0;
+
// If the page is hosted inside an MPArch fenced frame, this tracks the
// mode that the fenced frame is set to. This will always be set to kDefault
// for the ShadowDOM implementation of fenced frames.
--
2.25.1