LeOSium_webview/mulch/patches/0001-Vanadium/0089-Implement-UI-for-WebRT...

471 lines
22 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: fgei <fgei@gmail.com>
Date: Thu, 23 Jun 2022 16:38:51 +0000
Subject: [PATCH] Implement UI for WebRTC toggle
This is based on Brave's implementation for webRTC policy toggle, but reuses
PrivacySettings logic on saving, loading preference values from
PrefService for the said policy.
---
chrome/android/chrome_ext_java_resources.gni | 2 +
chrome/android/chrome_ext_java_sources.gni | 3 +
.../res/layout/webrtc_policy_preference.xml | 54 +++++++++++
.../java/res/xml/privacy_preferences_ext.xml | 4 +
.../res/xml/webrtc_policy_preferences.xml | 9 ++
.../privacy/settings/PrivacySettingsExt.java | 11 +++
.../settings/WebRtcPolicyPreference.java | 97 +++++++++++++++++++
.../webrtc/settings/WebRtcPolicySettings.java | 58 +++++++++++
.../webrtc/settings/WebRtcPolicyUtils.java | 92 ++++++++++++++++++
.../strings/android_chrome_ext_strings.grdp | 16 +++
10 files changed, 346 insertions(+)
create mode 100644 chrome/android/java/res/layout/webrtc_policy_preference.xml
create mode 100644 chrome/android/java/res/xml/webrtc_policy_preferences.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyPreference.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicySettings.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyUtils.java
diff --git a/chrome/android/chrome_ext_java_resources.gni b/chrome/android/chrome_ext_java_resources.gni
index 164ef483d5a44..4b55afd038612 100644
--- a/chrome/android/chrome_ext_java_resources.gni
+++ b/chrome/android/chrome_ext_java_resources.gni
@@ -4,4 +4,6 @@
chrome_ext_java_resources = [
"java/res/xml/privacy_preferences_ext.xml",
+ "java/res/layout/webrtc_policy_preference.xml",
+ "java/res/xml/webrtc_policy_preferences.xml",
]
diff --git a/chrome/android/chrome_ext_java_sources.gni b/chrome/android/chrome_ext_java_sources.gni
index b4e048ed73ef3..77963fdccafca 100644
--- a/chrome/android/chrome_ext_java_sources.gni
+++ b/chrome/android/chrome_ext_java_sources.gni
@@ -6,4 +6,7 @@ chrome_ext_java_sources = [
"java/src/org/chromium/chrome/browser/settings/SettingsExtUtils.java",
"java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java",
"java/src/org/chromium/chrome/browser/TabPreferencesUtils.java",
+ "java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyPreference.java",
+ "java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicySettings.java",
+ "java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyUtils.java",
]
diff --git a/chrome/android/java/res/layout/webrtc_policy_preference.xml b/chrome/android/java/res/layout/webrtc_policy_preference.xml
new file mode 100644
index 0000000000000..8addab2ecf1e1
--- /dev/null
+++ b/chrome/android/java/res/layout/webrtc_policy_preference.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Brave Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:focusable="false">
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout
+ android:id="@+id/radio_button_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/webrtc_policy_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:primaryText="@string/webrtc_policy_default" />
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/webrtc_policy_default_public_and_private_interfaces"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_touch_target_size"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ app:primaryText="@string/webrtc_policy_default_public_and_private_interfaces" />
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/webrtc_policy_default_public_interface_only"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_touch_target_size"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ app:primaryText="@string/webrtc_policy_default_public_interface_only" />
+
+ <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
+ android:id="@+id/webrtc_policy_disable_non_proxied_udp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_touch_target_size"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ app:primaryText="@string/webrtc_policy_disable_non_proxied_udp" />
+
+ </org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout>
+
+</LinearLayout>
diff --git a/chrome/android/java/res/xml/privacy_preferences_ext.xml b/chrome/android/java/res/xml/privacy_preferences_ext.xml
index 4f6b5a3ae75a5..6e955e33c0109 100644
--- a/chrome/android/java/res/xml/privacy_preferences_ext.xml
+++ b/chrome/android/java/res/xml/privacy_preferences_ext.xml
@@ -20,5 +20,9 @@ that can be found in the LICENSE file.
android:title="@string/open_links_in_incognito_title"
android:summary="@string/open_links_in_incognito_summary"
android:persistent="false"/>
+ <org.chromium.components.browser_ui.settings.ChromeBasePreference
+ android:key="webrtc_policy"
+ android:title="@string/webrtc_policy_title"
+ android:fragment="org.chromium.chrome.browser.webrtc.settings.WebRtcPolicySettings"/>
</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/webrtc_policy_preferences.xml b/chrome/android/java/res/xml/webrtc_policy_preferences.xml
new file mode 100644
index 0000000000000..f90f9d7231ff9
--- /dev/null
+++ b/chrome/android/java/res/xml/webrtc_policy_preferences.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Brave Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <org.chromium.chrome.browser.webrtc.settings.WebRtcPolicyPreference
+ android:key="webrtc_policy" />
+</PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java
index da4a5e6b1eba2..e356a9feb6f77 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsExt.java
@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.chrome.browser.settings.SettingsExtUtils;
+import org.chromium.chrome.browser.webrtc.settings.WebRtcPolicySettings;
import org.chromium.components.browser_ui.settings.ChromeBasePreference;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.components.browser_ui.settings.SettingsUtils;
@@ -29,6 +30,7 @@ final class PrivacySettingsExt {
private static final String PREF_CLOSE_TABS_ON_EXIT = SharedPrefsExt.CLOSE_TABS_ON_EXIT.getKey();
private static final String PREF_OPEN_LINKS_IN_INCOGNITO =
SharedPrefsExt.OPEN_LINKS_IN_INCOGNITO.getKey();
+ private static final String PREF_WEBRTC_POLICY = "webrtc_policy";
private static final Preference.OnPreferenceChangeListener getListener(@NonNull Profile profile) {
return (pref, val) -> {
@@ -99,6 +101,11 @@ final class PrivacySettingsExt {
openLinksInIncognitoPref.setOrder(PRIVACY_PREFERENCES_ORDER);
openLinksInIncognitoPref.setOnPreferenceChangeListener(getListener(profile));
}
+
+ Preference webRtcPolicyPref = prefFragment.findPreference(PREF_WEBRTC_POLICY);
+ if (webRtcPolicyPref != null) {
+ webRtcPolicyPref.setOrder(PRIVACY_PREFERENCES_ORDER);
+ }
}
static void updatePreferences(@NonNull PreferenceFragmentCompat prefFragment, @NonNull Profile profile) {
@@ -121,5 +128,9 @@ final class PrivacySettingsExt {
SettingsExtUtils.safelyUpdateSwitchPreference(/* switchPref */ openLinksInIncognitoPref,
/* newSummary*/ null,
/* newCheckedValue*/ SharedPrefsExt.OPEN_LINKS_IN_INCOGNITO.get());
+
+ Preference webRtcPolicyPref = prefFragment.findPreference(PREF_WEBRTC_POLICY);
+ SettingsExtUtils.safelyUpdatePreference(/* preference */ webRtcPolicyPref,
+ /* newSummary */ WebRtcPolicySettings.getWebRtcPolicySummaryString(prefFragment.getContext()));
}
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyPreference.java
new file mode 100644
index 0000000000000..2026f9461b632
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyPreference.java
@@ -0,0 +1,97 @@
+/* Copyright (c) 2021 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.chromium.chrome.browser.webrtc.settings;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Browser;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import androidx.annotation.IntDef;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import org.chromium.chrome.R;
+import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
+import org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class WebRtcPolicyPreference
+ extends Preference implements RadioGroup.OnCheckedChangeListener {
+ @IntDef({WebRtcPolicy.DEFAULT, WebRtcPolicy.DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES,
+ WebRtcPolicy.DEFAULT_PUBLIC_INTERFACE_ONLY, WebRtcPolicy.DISABLE_NON_PROXIED_UDP})
+ public @interface WebRtcPolicy {
+ int DEFAULT = 0;
+ int DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES = 1;
+ int DEFAULT_PUBLIC_INTERFACE_ONLY = 2;
+ int DISABLE_NON_PROXIED_UDP = 3;
+
+ int NUM_ENTRIES = 4;
+ }
+
+ private @WebRtcPolicy int mSetting;
+ private RadioButtonWithDescription mSettingRadioButton;
+ private RadioButtonWithDescriptionLayout mGroup;
+ private ArrayList<RadioButtonWithDescription> mButtons;
+
+ @SuppressLint("WrongConstant")
+ public WebRtcPolicyPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ setLayoutResource(R.layout.webrtc_policy_preference);
+
+ mButtons = new ArrayList<>(Collections.nCopies(WebRtcPolicy.NUM_ENTRIES, null));
+ }
+
+ public void initialize(@WebRtcPolicy int policy) {
+ mSetting = policy;
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+
+ mGroup = (RadioButtonWithDescriptionLayout) holder.findViewById(R.id.radio_button_layout);
+ mGroup.setOnCheckedChangeListener(this);
+
+ mButtons.set(WebRtcPolicy.DEFAULT,
+ (RadioButtonWithDescription) holder.findViewById(R.id.webrtc_policy_default));
+ mButtons.set(WebRtcPolicy.DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES,
+ (RadioButtonWithDescription) holder.findViewById(
+ R.id.webrtc_policy_default_public_and_private_interfaces));
+ mButtons.set(WebRtcPolicy.DEFAULT_PUBLIC_INTERFACE_ONLY,
+ (RadioButtonWithDescription) holder.findViewById(
+ R.id.webrtc_policy_default_public_interface_only));
+ mButtons.set(WebRtcPolicy.DISABLE_NON_PROXIED_UDP,
+ (RadioButtonWithDescription) holder.findViewById(
+ R.id.webrtc_policy_disable_non_proxied_udp));
+
+ mSettingRadioButton = mButtons.get(mSetting);
+ mSettingRadioButton.setChecked(true);
+ }
+
+ @Override
+ @SuppressLint("WrongConstant")
+ public void onCheckedChanged(RadioGroup group, int checkedId) {
+ for (int i = 0; i < WebRtcPolicy.NUM_ENTRIES; i++) {
+ if (mButtons.get(i).isChecked()) {
+ mSetting = i;
+ mSettingRadioButton = mButtons.get(i);
+ break;
+ }
+ }
+ assert mSetting >= 0 && mSetting < WebRtcPolicy.NUM_ENTRIES : "No matching setting found.";
+
+ callChangeListener(mSetting);
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicySettings.java
new file mode 100644
index 0000000000000..5ee1893382254
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicySettings.java
@@ -0,0 +1,58 @@
+/* Copyright (c) 2021 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.chromium.chrome.browser.webrtc.settings;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.Browser;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceFragmentCompat;
+
+import org.chromium.chrome.R;
+import org.chromium.components.browser_ui.settings.SettingsUtils;
+import org.chromium.ui.UiUtils;
+
+public class WebRtcPolicySettings extends PreferenceFragmentCompat {
+ static final String PREF_WEBRTC_POLICY = "webrtc_policy";
+
+ @Override
+ public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
+ SettingsUtils.addPreferencesFromResource(this, R.xml.webrtc_policy_preferences);
+ getActivity().setTitle(R.string.webrtc_policy_title);
+
+ WebRtcPolicyPreference webRtcPolicyPreference =
+ (WebRtcPolicyPreference) findPreference(PREF_WEBRTC_POLICY);
+ webRtcPolicyPreference.initialize(WebRtcPolicyUtils.getPolicy());
+
+ webRtcPolicyPreference.setOnPreferenceChangeListener((preference, newValue) -> {
+ WebRtcPolicyUtils.setPolicy((int) newValue);
+ return true;
+ });
+ }
+
+ public static String getWebRtcPolicySummaryString(Context context) {
+ return WebRtcPolicyUtils.getSummary(context);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
+ UiUtils.setNavigationBarIconColor(getActivity().getWindow().getDecorView(),
+ getResources().getBoolean(R.bool.window_light_navigation_bar));
+ }
+
+ setDivider(null);
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyUtils.java
new file mode 100644
index 0000000000000..296e59fc57167
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webrtc/settings/WebRtcPolicyUtils.java
@@ -0,0 +1,92 @@
+// Copyright 2023 GrapheneOS
+// Use of this source code is governed by a GPLv2 only-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.webrtc.settings;
+
+import android.content.Context;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.webrtc.settings.WebRtcPolicyPreference.WebRtcPolicy;
+import org.chromium.components.user_prefs.UserPrefs;
+
+/**
+ * Utility class for fetching and converting native pref value for WebRTC
+ * policy to Java int equivalent and its corresponding description.
+ */
+class WebRtcPolicyUtils {
+ // Pref values mirrored in Java, copied from
+ // third_party/blink/common/peerconnection/webrtc_ip_handling_policy.cc
+ private static final String WEBRTC_DEFAULT = "default";
+ private static final String WEBRTC_DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES =
+ "default_public_and_private_interfaces";
+ private static final String WEBRTC_DEFAULT_PUBLIC_INTERFACE_ONLY =
+ "default_public_interface_only";
+ private static final String WEBRTC_DISABLE_NON_PROXIED_UDP =
+ "disable_non_proxied_udp";
+
+ static String getSummary(Context context) {
+ switch (convertToWebRtcPolicyInt(getPolicyFromNative())) {
+ case WebRtcPolicy.DEFAULT:
+ return context.getString(R.string.webrtc_policy_default);
+ case WebRtcPolicy.DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES:
+ return context.getString(
+ R.string.webrtc_policy_default_public_and_private_interfaces);
+ case WebRtcPolicy.DEFAULT_PUBLIC_INTERFACE_ONLY:
+ return context.getString(R.string.webrtc_policy_default_public_interface_only);
+ case WebRtcPolicy.DISABLE_NON_PROXIED_UDP:
+ return context.getString(R.string.webrtc_policy_disable_non_proxied_udp);
+ default:
+ assert false;
+ return "";
+ }
+ }
+
+ static String convertToWebRtcPolicyString(@WebRtcPolicy int policy) {
+ switch (policy) {
+ case WebRtcPolicy.DEFAULT:
+ return WEBRTC_DEFAULT;
+ case WebRtcPolicy.DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES:
+ return WEBRTC_DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES;
+ case WebRtcPolicy.DEFAULT_PUBLIC_INTERFACE_ONLY:
+ return WEBRTC_DEFAULT_PUBLIC_INTERFACE_ONLY;
+ case WebRtcPolicy.DISABLE_NON_PROXIED_UDP:
+ return WEBRTC_DISABLE_NON_PROXIED_UDP;
+ default:
+ return WEBRTC_DISABLE_NON_PROXIED_UDP;
+ }
+ }
+
+ static @WebRtcPolicy int convertToWebRtcPolicyInt(String value) {
+ switch (value) {
+ case WEBRTC_DEFAULT:
+ return WebRtcPolicy.DEFAULT;
+ case WEBRTC_DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES:
+ return WebRtcPolicy.DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES;
+ case WEBRTC_DEFAULT_PUBLIC_INTERFACE_ONLY:
+ return WebRtcPolicy.DEFAULT_PUBLIC_INTERFACE_ONLY;
+ case WEBRTC_DISABLE_NON_PROXIED_UDP:
+ return WebRtcPolicy.DISABLE_NON_PROXIED_UDP;
+ default:
+ return WebRtcPolicy.DISABLE_NON_PROXIED_UDP;
+ }
+ }
+
+ private static String getPolicyFromNative() {
+ return UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .getString(Pref.WEB_RTCIP_HANDLING_POLICY);
+ }
+
+ static @WebRtcPolicy int getPolicy() {
+ return convertToWebRtcPolicyInt(getPolicyFromNative());
+ }
+
+ static void setPolicy(@WebRtcPolicy int policy) {
+ UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .setString(Pref.WEB_RTCIP_HANDLING_POLICY, convertToWebRtcPolicyString(policy));
+ }
+
+ private WebRtcPolicyUtils() {}
+}
diff --git a/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp b/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp
index 52b9ca2042bee..11457f2fbc577 100644
--- a/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp
+++ b/chrome/browser/ui/android/strings/android_chrome_ext_strings.grdp
@@ -15,4 +15,20 @@
<message name="IDS_OPEN_LINKS_IN_INCOGNITO_SUMMARY" desc="Summary of opening external links in incognito tabs menu item">
Open links navigated by external apps in incognito tabs
</message>
+ <!-- WebRTC toggle -->
+ <message name="IDS_WEBRTC_POLICY_TITLE" desc="WebRTC policy setting label">
+ WebRTC IP handling policy
+ </message>
+ <message name="IDS_WEBRTC_POLICY_DEFAULT" desc="Select value">
+ Default
+ </message>
+ <message name="IDS_WEBRTC_POLICY_DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES" desc="Select value">
+ Default public and private interfaces
+ </message>
+ <message name="IDS_WEBRTC_POLICY_DEFAULT_PUBLIC_INTERFACE_ONLY" desc="Select value">
+ Default public interface only
+ </message>
+ <message name="IDS_WEBRTC_POLICY_DISABLE_NON_PROXIED_UDP" desc="Select value">
+ Disable non-proxied UDP
+ </message>
</grit-part>