diff --git a/build/patches/Add-webrtc-site-setting.patch b/build/patches/Add-webrtc-site-setting.patch new file mode 100644 index 00000000..82c0062a --- /dev/null +++ b/build/patches/Add-webrtc-site-setting.patch @@ -0,0 +1,381 @@ +From: uazo +Date: Fri, 6 May 2022 14:27:17 +0000 +Subject: Add webRTC site settings + +Require: Content-settings-infrastructure.patch +--- + .../browser_ui/site_settings/android/BUILD.gn | 3 + + .../BromiteCustomContentSettingImpl.java | 1 + + .../BromiteWebRTCContentSetting.java | 85 +++++++++++++++++++ + .../site_settings/SiteSettingsCategory.java | 5 +- + .../strings/android/browser_ui_strings.grd | 1 + + .../browser_ui/strings/android/webrtc.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 | 3 +- + .../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 + + .../peer_connection_dependency_factory.cc | 5 ++ + 19 files changed, 158 insertions(+), 4 deletions(-) + create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteWebRTCContentSetting.java + create mode 100644 components/browser_ui/strings/android/webrtc.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 +@@ -75,6 +75,9 @@ android_library("java") { + sources += [ + "java/src/org/chromium/components/browser_ui/site_settings/BromiteWebGLContentSetting.java", + ] ++ sources += [ ++ "java/src/org/chromium/components/browser_ui/site_settings/BromiteWebRTCContentSetting.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 +@@ -44,6 +44,7 @@ public abstract class BromiteCustomContentSettingImpl { + static { + mItemList = new ArrayList(); + mItemList.add(new BromiteWebGLContentSetting()); ++ mItemList.add(new BromiteWebRTCContentSetting()); + } + + public static SiteSettingsCategory createFromType( +diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteWebRTCContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteWebRTCContentSetting.java +new file mode 100644 +--- /dev/null ++++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/BromiteWebRTCContentSetting.java +@@ -0,0 +1,85 @@ ++/* ++ 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 BromiteWebRTCContentSetting extends BromiteCustomContentSetting { ++ public BromiteWebRTCContentSetting() { ++ super(/*contentSettingsType*/ ContentSettingsType.WEBRTC, ++ /*siteSettingsCategory*/ SiteSettingsCategory.Type.WEBRTC, ++ /*initialDefaultValue*/ ContentSettingValues.BLOCK, ++ /*defaultDisabledValue*/ ContentSettingValues.BLOCK, ++ /*allowException*/ true, ++ /*preferenceKey*/ "webrtc", ++ /*profilePrefKey*/ "webrtc"); ++ } ++ ++ @Override ++ public ContentSettingsResources.ResourceItem getResourceItem() { ++ return new ContentSettingsResources.ResourceItem( ++ /*icon*/ R.drawable.web_asset, ++ /*title*/ R.string.webrtc_permission_title, ++ /*defaultEnabledValue*/ getInitialDefaultValue(), ++ /*defaultDisabledValue*/ getDefaultDisabledValue(), ++ /*enabledSummary*/ R.string.website_settings_category_webrtc_enabled, ++ /*disabledSummary*/ R.string.website_settings_category_webrtc_disabled); ++ } ++ ++ @Override ++ public int getCategorySummary(@Nullable @ContentSettingValues int value) { ++ switch (value) { ++ case ContentSettingValues.ALLOW: ++ return R.string.website_settings_category_webrtc_enabled; ++ case ContentSettingValues.BLOCK: ++ return R.string.website_settings_category_webrtc_disabled; ++ default: ++ return 0; ++ } ++ } ++ ++ @Override ++ public boolean requiresTriStateContentSetting() { ++ return false; ++ } ++ ++ @Override ++ public boolean showOnlyDescriptions() { ++ return true; ++ } ++ ++ @Override ++ public int getAddExceptionDialogMessage() { ++ return R.string.website_settings_category_webrtc_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.IMAGES, Type.WEBGL, Type.WEBRTC}) + @Retention(RetentionPolicy.SOURCE) + public @interface Type { + // All updates here must also be reflected in {@link #preferenceKey(int) +@@ -80,10 +80,11 @@ public class SiteSettingsCategory { + int JAVASCRIPT_JIT = 28; + int IMAGES = 29; + int WEBGL = 30; ++ int WEBRTC = 31; + /** + * Number of handled categories used for calculating array sizes. + */ +- int NUM_ENTRIES = 31; ++ int NUM_ENTRIES = 32; + } + + 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 +@@ -174,6 +174,7 @@ + + + ++ + + + Got it +diff --git a/components/browser_ui/strings/android/webrtc.grdp b/components/browser_ui/strings/android/webrtc.grdp +new file mode 100644 +--- /dev/null ++++ b/components/browser_ui/strings/android/webrtc.grdp +@@ -0,0 +1,18 @@ ++ ++ ++ ++ WebRTC ++ ++ ++ webRTC ++ ++ ++ WebRTC ++ ++ ++ Enabled ++ ++ ++ Disabled ++ ++ +diff --git a/components/components_strings.grd b/components/components_strings.grd +--- a/components/components_strings.grd ++++ b/components/components_strings.grd +@@ -335,6 +335,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 +@@ -681,6 +681,20 @@ void ContentSettingsRegistry::Init() { + /*show_into_info_page*/ true, + /*permission_type_ui*/ IDS_SITE_SETTINGS_TYPE_WEBGL, + /*permission_type_ui_mid_sentence*/ IDS_SITE_SETTINGS_TYPE_WEBGL_MID_SENTENCE); ++ ++ Register(ContentSettingsType::WEBRTC, "webrtc", CONTENT_SETTING_BLOCK, ++ WebsiteSettingsInfo::SYNCABLE, ++ AllowlistedSchemes(), ++ ValidSettings(CONTENT_SETTING_ALLOW, ++ CONTENT_SETTING_BLOCK), ++ WebsiteSettingsInfo::SINGLE_ORIGIN_WITH_EMBEDDED_EXCEPTIONS_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_WEBRTC, ++ /*permission_type_ui_mid_sentence*/ IDS_SITE_SETTINGS_TYPE_WEBRTC_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 +@@ -157,6 +157,8 @@ void GetRendererContentSettingRules(const HostContentSettingsMap* map, + rules->timezone_override_value = timezone; + map->GetSettingsForOneType(ContentSettingsType::WEBGL, + &(rules->webgl_rules)); ++ map->GetSettingsForOneType(ContentSettingsType::WEBRTC, ++ &(rules->webrtc_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 +@@ -196,7 +196,8 @@ bool RendererContentSettingRules::IsRendererContentSetting( + content_type == ContentSettingsType::MIXEDSCRIPT || + content_type == ContentSettingsType::AUTO_DARK_WEB_CONTENT || + content_type == ContentSettingsType::TIMEZONE_OVERRIDE || +- content_type == ContentSettingsType::WEBGL; ++ content_type == ContentSettingsType::WEBGL || ++ content_type == ContentSettingsType::WEBRTC; + } + + RendererContentSettingRules::RendererContentSettingRules() {} +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 +@@ -86,6 +86,7 @@ struct RendererContentSettingRules { + ContentSettingsForOneType timezone_override_rules; + std::string timezone_override_value; + ContentSettingsForOneType webgl_rules; ++ ContentSettingsForOneType webrtc_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 +@@ -82,4 +82,5 @@ struct RendererContentSettingRules { + array timezone_override_rules; + string timezone_override_value; + array webgl_rules; ++ array webrtc_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 +@@ -105,7 +105,8 @@ bool StructTraitsauto_dark_content_rules) && + data.ReadTimezoneOverrideRules(&out->timezone_override_rules) && + data.ReadTimezoneOverrideValue(&out->timezone_override_value) && +- data.ReadWebglRules(&out->webgl_rules); ++ data.ReadWebglRules(&out->webgl_rules) && ++ data.ReadWebrtcRules(&out->webrtc_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 +@@ -170,6 +170,11 @@ struct StructTraits< + return r.webgl_rules; + } + ++ static const std::vector& webrtc_rules( ++ const RendererContentSettingRules& r) { ++ return r.webrtc_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 +@@ -286,6 +286,8 @@ enum class ContentSettingsType : int32_t { + + WEBGL, + ++ WEBRTC, ++ + // 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 +@@ -486,6 +486,15 @@ bool ContentSettingsAgentImpl::AllowWebgl(bool enabled_per_settings) { + url::Origin(frame->GetDocument().GetSecurityOrigin()).GetURL()); + } + ++bool ContentSettingsAgentImpl::AllowWebRTC(bool enabled_per_settings) { ++ if (!content_setting_rules_) ++ return false; ++ blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); ++ return CONTENT_SETTING_ALLOW == GetContentSettingFromRules( ++ content_setting_rules_->webrtc_rules, frame, ++ 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 +@@ -102,6 +102,7 @@ class ContentSettingsAgentImpl + bool AllowPopupsAndRedirects(bool default_value) override; + bool ShouldAutoupgradeMixedContent() override; + bool AllowWebgl(bool enabled_per_settings) override; ++ bool AllowWebRTC(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 +@@ -101,6 +101,8 @@ class WebContentSettingsClient { + + virtual bool AllowWebgl(bool default_value) { return default_value; } + ++ virtual bool AllowWebRTC(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/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc +--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc ++++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc +@@ -756,6 +756,11 @@ PeerConnectionDependencyFactory::CreatePortAllocator( + // origin. + WebRTCIPHandlingPolicy policy = + GetWebRTCIPHandlingPolicy(webrtc_ip_handling_policy); ++ blink::WebContentSettingsClient* settings = web_frame->GetContentSettingsClient(); ++ if (settings && settings->AllowWebRTC(false)) { ++ policy = kDefault; ++ } ++ + switch (policy) { + // TODO(guoweis): specify the flag of disabling local candidate + // collection when webrtc is updated. +-- +2.25.1