From: Your Name Date: Tue, 20 Dec 2022 14:27:02 +0000 Subject: Viewport Protection Site Setting --- chrome/app/settings_strings.grdp | 19 ++++ chrome/browser/resources/settings/icons.html | 2 + .../settings/privacy_page/privacy_page.html | 22 +++++ chrome/browser/resources/settings/route.ts | 1 + chrome/browser/resources/settings/router.ts | 1 + .../site_settings/category_default_setting.ts | 1 + .../settings/site_settings/constants.ts | 1 + .../settings_category_default_radio_group.ts | 1 + .../settings/site_settings/site_details.html | 5 ++ .../site_settings_page/site_settings_page.ts | 9 ++ .../site_settings_page_util.ts | 2 + .../views/page_info/page_info_view_factory.cc | 3 + .../settings_localized_strings_provider.cc | 7 ++ .../ui/webui/settings/site_settings_helper.cc | 1 + .../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 | 15 +++- .../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 + third_party/blink/common/features.cc | 2 +- .../platform/web_content_settings_client.h | 2 + .../renderer/core/frame/local_dom_window.cc | 1 + third_party/blink/renderer/core/page/page.cc | 2 + 35 files changed, 234 insertions(+), 6 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/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp @@ -4316,6 +4316,25 @@ Not allowed to use WebRTC + + Viewport Protection + + + Enable Viewport Protection + + + Viewport Protection is enabled + + + Viewport Protection is disabled + + + Allowed to use Viewport Protection + + + Not allowed to use Viewport Protection + + diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html --- a/chrome/browser/resources/settings/icons.html +++ b/chrome/browser/resources/settings/icons.html @@ -199,6 +199,8 @@ NOTE: Chrome OS icons go in ./chromeos/os_icons.html. + + diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html @@ -1213,4 +1213,26 @@ + diff --git a/chrome/browser/resources/settings/route.ts b/chrome/browser/resources/settings/route.ts --- a/chrome/browser/resources/settings/route.ts +++ b/chrome/browser/resources/settings/route.ts @@ -119,6 +119,7 @@ function addPrivacyChildRoutes(r: Partial) { r.SITE_SETTINGS_TIMEZONE_OVERRIDE = r.SITE_SETTINGS.createChild('timezone-override'); r.SITE_SETTINGS_WEBGL = r.SITE_SETTINGS.createChild('webgl'); r.SITE_SETTINGS_WEBRTC = r.SITE_SETTINGS.createChild('webrtc'); + r.SITE_SETTINGS_VIEWPORT = r.SITE_SETTINGS.createChild('viewport-protection'); } /** diff --git a/chrome/browser/resources/settings/router.ts b/chrome/browser/resources/settings/router.ts --- a/chrome/browser/resources/settings/router.ts +++ b/chrome/browser/resources/settings/router.ts @@ -106,6 +106,7 @@ export interface SettingsRoutes { SITE_SETTINGS_TIMEZONE_OVERRIDE: Route; SITE_SETTINGS_WEBGL: Route; SITE_SETTINGS_WEBRTC: Route; + SITE_SETTINGS_VIEWPORT: Route; } /** Class for navigable routes. */ diff --git a/chrome/browser/resources/settings/site_settings/category_default_setting.ts b/chrome/browser/resources/settings/site_settings/category_default_setting.ts --- a/chrome/browser/resources/settings/site_settings/category_default_setting.ts +++ b/chrome/browser/resources/settings/site_settings/category_default_setting.ts @@ -200,6 +200,7 @@ export class CategoryDefaultSettingElement extends case ContentSettingsTypes.TIMEZONE_OVERRIDE: case ContentSettingsTypes.WEBGL: case ContentSettingsTypes.WEBRTC: + case ContentSettingsTypes.VIEWPORT: // "Allowed" vs "Blocked". this.browserProxy.setDefaultValueForContentType( this.category, diff --git a/chrome/browser/resources/settings/site_settings/constants.ts b/chrome/browser/resources/settings/site_settings/constants.ts --- a/chrome/browser/resources/settings/site_settings/constants.ts +++ b/chrome/browser/resources/settings/site_settings/constants.ts @@ -51,6 +51,7 @@ export enum ContentSettingsTypes { TIMEZONE_OVERRIDE = 'timezone-override', WEBGL = 'webgl', WEBRTC = 'webrtc', + VIEWPORT = 'viewport', // The following items are not in the C++ kContentSettingsTypeGroupNames, but // are used everywhere where ContentSettingsTypes is used in JS. diff --git a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts --- a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts +++ b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts @@ -144,6 +144,7 @@ export class SettingsCategoryDefaultRadioGroupElement extends case ContentSettingsTypes.TIMEZONE_OVERRIDE: case ContentSettingsTypes.WEBGL: case ContentSettingsTypes.WEBRTC: + case ContentSettingsTypes.VIEWPORT: // "Allowed" vs "Blocked". return ContentSetting.ALLOW; case ContentSettingsTypes.AR: diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html --- a/chrome/browser/resources/settings/site_settings/site_details.html +++ b/chrome/browser/resources/settings/site_settings/site_details.html @@ -291,4 +291,9 @@ icon="settings:webrtc" label="$i18n{siteSettingsWebRTC}"> + + diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts @@ -374,6 +374,14 @@ function getCategoryItemMap(): Map { enabledLabel: 'siteSettingsWebRTCAllowed', disabledLabel: 'siteSettingsWebRTCBlocked', }, + { + route: routes.SITE_SETTINGS_VIEWPORT, + id: Id.VIEWPORT, + label: 'siteSettingsViewportProtection', + icon: 'settings:viewport-protection', + enabledLabel: 'siteSettingsViewportProtectionAllowed', + disabledLabel: 'siteSettingsViewportProtectionBlocked', + }, ]; categoryItemMap = new Map(categoryList.map(item => [item.id, item])); @@ -472,6 +480,7 @@ export class SettingsSiteSettingsPageElement extends Id.TIMEZONE_OVERRIDE, Id.WEBGL, Id.WEBRTC, + Id.VIEWPORT, ]), }; }, diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page_util.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page_util.ts --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page_util.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page_util.ts @@ -87,6 +87,8 @@ export function getLocalizationStringForContentType( return 'siteSettingsWebglMidSentence'; case ContentSettingsTypes.WEBRTC: return 'siteSettingsWebRTCMidSentence'; + case ContentSettingsTypes.VIEWPORT: + return 'siteSettingsViewportProtectionMidSentence'; // The following members do not have a mid-sentence localization. case ContentSettingsTypes.ANTI_ABUSE: case ContentSettingsTypes.PDF_DOCUMENTS: diff --git a/chrome/browser/ui/views/page_info/page_info_view_factory.cc b/chrome/browser/ui/views/page_info/page_info_view_factory.cc --- a/chrome/browser/ui/views/page_info/page_info_view_factory.cc +++ b/chrome/browser/ui/views/page_info/page_info_view_factory.cc @@ -353,6 +353,9 @@ const ui::ImageModel PageInfoViewFactory::GetPermissionIcon( case ContentSettingsType::WEBRTC: icon = &vector_icons::kProtectedContentIcon; break; + case ContentSettingsType::VIEWPORT: + icon = &vector_icons::kProtectedContentIcon; + break; default: // All other |ContentSettingsType|s do not have icons on desktop or are // not shown in the Page Info bubble. diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc @@ -2455,6 +2455,13 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, {"siteSettingsWebRTCAllowedExceptions",IDS_SETTINGS_SITE_SETTINGS_WEBRTC_ALLOWED_EXCEPTIONS}, {"siteSettingsWebRTCBlockedExceptions", IDS_SETTINGS_SITE_SETTINGS_WEBRTC_BLOCKED_EXCEPTIONS}, {"siteSettingsWebRTCMidSentence", IDS_SITE_SETTINGS_WEBRTC_TITLE}, + {"siteSettingsViewportProtection", IDS_SITE_SETTINGS_VIEWPORT_PROTECTION_TITLE}, + {"siteSettingsViewportProtectionDescription", IDS_SETTINGS_SITE_SETTINGS_VIEWPORT_PROTECTION_DESCRIPTION}, + {"siteSettingsViewportProtectionAllowed", IDS_SETTINGS_SITE_SETTINGS_VIEWPORT_PROTECTION_ALLOWED}, + {"siteSettingsViewportProtectionBlocked", IDS_SETTINGS_SITE_SETTINGS_VIEWPORT_PROTECTION_BLOCKED}, + {"siteSettingsViewportProtectionAllowedExceptions",IDS_SETTINGS_SITE_SETTINGS_VIEWPORT_PROTECTION_ALLOWED_EXCEPTIONS}, + {"siteSettingsViewportProtectionBlockedExceptions", IDS_SETTINGS_SITE_SETTINGS_VIEWPORT_PROTECTION_BLOCKED_EXCEPTIONS}, + {"siteSettingsViewportProtectionMidSentence", IDS_SITE_SETTINGS_VIEWPORT_PROTECTION_TITLE}, {"addSite", IDS_SETTINGS_ADD_SITE}, {"addSiteTitle", IDS_SETTINGS_ADD_SITE_TITLE}, #if BUILDFLAG(IS_CHROMEOS_ASH) diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc @@ -130,6 +130,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { {ContentSettingsType::TIMEZONE_OVERRIDE, "timezone-override"}, {ContentSettingsType::WEBGL, "webgl"}, {ContentSettingsType::WEBRTC, "webrtc"}, + {ContentSettingsType::VIEWPORT, "viewport"}, // Add new content settings here if a corresponding Javascript string // representation for it is not required, for example if the content setting 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 @@ -112,6 +112,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(); 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 . +*/ + +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 @@ -48,7 +48,7 @@ public class SiteSettingsCategory { Type.USE_STORAGE, Type.AUTO_DARK_WEB_CONTENT, Type.REQUEST_DESKTOP_SITE, Type.FEDERATED_IDENTITY_API, Type.THIRD_PARTY_COOKIES, Type.SITE_DATA, Type.ANTI_ABUSE, Type.TIMEZONE_OVERRIDE, Type.AUTOPLAY, Type.JAVASCRIPT_JIT, Type.IMAGES, - Type.NUM_ENTRIES, Type.WEBGL, Type.WEBRTC}) + Type.NUM_ENTRIES, Type.WEBGL, Type.WEBRTC, Type.VIEWPORT}) @Retention(RetentionPolicy.SOURCE) public @interface Type { // All updates here must also be reflected in {@link #preferenceKey(int) @@ -88,10 +88,11 @@ public class SiteSettingsCategory { int IMAGES = 32; int WEBGL = 33; int WEBRTC = 34; + int VIEWPORT = 35; /** * Number of handled categories used for calculating array sizes. */ - int NUM_ENTRIES = 35; + int NUM_ENTRIES = 36; } 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 @@ + 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 @@ + + + + Viewport Size Protection + + + Viewport Size Protection + + + Viewport Size Protection + + + Enabled + + + Disabled + + diff --git a/components/components_strings.grd b/components/components_strings.grd --- a/components/components_strings.grd +++ b/components/components_strings.grd @@ -341,6 +341,7 @@ + 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 @@ -622,12 +622,25 @@ void ContentSettingsRegistry::Init() { /*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK}, WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, - WebsiteSettingsRegistry::PLATFORM_ANDROID, + WebsiteSettingsRegistry::ALL_PLATFORMS, ContentSettingsInfo::INHERIT_IN_INCOGNITO, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS, /*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_ALLOW, + WebsiteSettingsInfo::SYNCABLE, + /*allowlisted_schemes=*/{}, + /*valid_settings=*/{CONTENT_SETTING_ALLOW, + CONTENT_SETTING_BLOCK}, + WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, + WebsiteSettingsRegistry::ALL_PLATFORMS, + ContentSettingsInfo::INHERIT_IN_INCOGNITO, + 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 @@ -162,6 +162,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 @@ -219,7 +219,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( @@ -233,6 +234,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 @@ -98,6 +98,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 webgl_rules; array webrtc_rules; + array 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 @@ -107,7 +107,8 @@ bool StructTraitstimezone_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& 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 @@ -281,6 +281,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 @@ -459,6 +459,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/common/features.cc b/third_party/blink/common/features.cc --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc @@ -219,7 +219,7 @@ BASE_FEATURE(kPath2DPaintCache, BASE_FEATURE(kViewportProtection, "ViewportProtection", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kPrivacySandboxAdsAPIs, "PrivacySandboxAdsAPIs", 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/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 @@ -2303,6 +2303,7 @@ DOMWindow* LocalDOMWindow::open(v8::Isolate* isolate, // var w = window.open() // var not_emulated_screen_info = w.screen bool protection_enabled = base::FeatureList::IsEnabled(features::kViewportProtection); + protection_enabled |= GetFrame()->GetContentSettingsClient()->AllowViewportChange(false); result.frame->GetPage()->CalculateEmulatedScreenSetting( To(result.frame), /*force*/ protection_enabled); 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 @@ -885,6 +885,8 @@ void Page::UpdateAcceleratedCompositingSettings() { void Page::CalculateEmulatedScreenSetting(LocalFrame* frame, bool force) { bool isEnabled = base::FeatureList::IsEnabled(features::kViewportProtection); + blink::WebContentSettingsClient* settings = frame->GetContentSettingsClient(); + isEnabled |= (settings && settings->AllowViewportChange(false)); if (isEnabled || force) { // this is the maximum (and minimum) value which in percentage // corresponds to +- 0.03% -- 2.25.1