Bug 1364975 - Allow WebExtensions to disable WebRTC, r=aswan

Implement privacy.network.peerConnectionEnabled to allow WebExtensions to enable and disable RTCPeerConnections (aka WebRTC).

MozReview-Commit-ID: 5zGotQNwsko

--HG--
extra : rebase_source : 3543efa9fdbd7689581b3ffd3507cf2b4fee284d
This commit is contained in:
Bob Silverberg 2017-05-24 09:58:43 -04:00
parent f69c1db21b
commit b994507ee4
3 changed files with 76 additions and 41 deletions

View File

@ -60,6 +60,16 @@ ExtensionPreferencesManager.addSetting("network.networkPredictionEnabled", {
},
});
ExtensionPreferencesManager.addSetting("network.peerConnectionEnabled", {
prefNames: [
"media.peerconnection.enabled",
],
setCallback(value) {
return {[this.prefNames[0]]: value};
},
});
ExtensionPreferencesManager.addSetting("network.webRTCIPHandlingPolicy", {
prefNames: [
"media.peerconnection.ice.default_address_only",
@ -119,6 +129,11 @@ this.privacy = class extends ExtensionAPI {
Preferences.get("network.http.speculative-parallel-limit") > 0 &&
!Preferences.get("network.dns.disablePrefetch");
}),
peerConnectionEnabled: getAPI(extension,
"network.peerConnectionEnabled",
() => {
return Preferences.get("media.peerconnection.enabled");
}),
webRTCIPHandlingPolicy: getAPI(extension,
"network.webRTCIPHandlingPolicy",
() => {

View File

@ -38,6 +38,10 @@
"$ref": "types.Setting",
"description": "If enabled, the browser attempts to speed up your web browsing experience by pre-resolving DNS entries, prerendering sites (<code>&lt;link rel='prefetch' ...&gt;</code>), and preemptively opening TCP and SSL connections to servers. This preference's value is a boolean, defaulting to <code>true</code>."
},
"peerConnectionEnabled": {
"$ref": "types.Setting",
"description": "Allow users to enable and disable RTCPeerConnections (aka WebRTC)."
},
"webRTCIPHandlingPolicy": {
"$ref": "types.Setting",
"description": "Allow users to specify the media performance/privacy tradeoffs which impacts how WebRTC traffic will be routed and how much local address information is exposed. This preference's value is of type IPHandlingPolicy, defaulting to <code>default</code>."

View File

@ -214,46 +214,60 @@ add_task(async function test_privacy() {
await promiseShutdownManager();
});
add_task(async function test_privacy_webRTCIPHandlingPolicy() {
// Create a object to hold the default values of all the prefs.
const PREF_DEFAULTS = {
"media.peerconnection.ice.default_address_only": null,
"media.peerconnection.ice.no_host": null,
"media.peerconnection.ice.proxy_only": null,
// This test can be used for any settings that are added which utilize only
// boolean prefs.
add_task(async function test_privacy_boolean_prefs() {
// Create an object to hold the values to which we will initialize the prefs.
const SETTINGS = {
"network.webRTCIPHandlingPolicy": {
"media.peerconnection.ice.default_address_only": false,
"media.peerconnection.ice.no_host": false,
"media.peerconnection.ice.proxy_only": false,
},
"network.peerConnectionEnabled": {
"media.peerconnection.enabled": true,
},
};
// Store the default values of each pref.
for (let pref in PREF_DEFAULTS) {
PREF_DEFAULTS[pref] = ExtensionPreferencesManager.getDefaultValue(pref);
async function background() {
browser.test.onMessage.addListener(async (msg, ...args) => {
let data = args[0];
// The second argument is the end of the api name,
// e.g., "network.webRTCIPHandlingPolicy".
let apiObj = args[1].split(".").reduce((o, i) => o[i], browser.privacy);
let settingData;
switch (msg) {
case "set":
await apiObj.set(data);
settingData = await apiObj.get({});
browser.test.sendMessage("settingData", settingData);
break;
case "clear":
await apiObj.clear(data);
settingData = await apiObj.get({});
browser.test.sendMessage("settingData", settingData);
break;
}
});
}
// Set prefs to our initial values.
for (let setting in SETTINGS) {
for (let pref in SETTINGS[setting]) {
Preferences.set(pref, SETTINGS[setting][pref]);
}
}
do_register_cleanup(() => {
// Reset the prefs.
for (let pref in PREF_DEFAULTS) {
Preferences.reset(pref);
for (let setting in SETTINGS) {
for (let pref in SETTINGS[setting]) {
Preferences.reset(pref);
}
}
});
async function background() {
browser.test.onMessage.addListener(async (msg, value) => {
let rtcData;
switch (msg) {
case "set":
await browser.privacy.network.webRTCIPHandlingPolicy.set({value});
rtcData = await browser.privacy.network.webRTCIPHandlingPolicy.get({});
browser.test.sendMessage("rtcData", rtcData);
break;
case "clear":
await browser.privacy.network.webRTCIPHandlingPolicy.clear({});
rtcData = await browser.privacy.network.webRTCIPHandlingPolicy.get({});
browser.test.sendMessage("rtcData", rtcData);
break;
}
});
}
let extension = ExtensionTestUtils.loadExtension({
background,
manifest: {
@ -265,33 +279,35 @@ add_task(async function test_privacy_webRTCIPHandlingPolicy() {
await promiseStartupManager();
await extension.startup();
async function testSetting(value, truePrefs) {
extension.sendMessage("set", value);
let data = await extension.awaitMessage("rtcData");
async function testSetting(setting, value, truePrefs) {
extension.sendMessage("set", {value: value}, setting);
let data = await extension.awaitMessage("settingData");
equal(data.value, value);
for (let pref in PREF_DEFAULTS) {
for (let pref in SETTINGS[setting]) {
let prefValue = Preferences.get(pref);
if (truePrefs.includes(pref)) {
ok(prefValue, `${pref} set correctly for ${value}`);
} else {
equal(prefValue, PREF_DEFAULTS[pref], `${pref} contains default value for ${value}`);
}
equal(prefValue, truePrefs.includes(pref), `${pref} set correctly for ${value}`);
}
}
await testSetting(
"network.webRTCIPHandlingPolicy",
"default_public_and_private_interfaces",
["media.peerconnection.ice.default_address_only"]);
await testSetting(
"network.webRTCIPHandlingPolicy",
"default_public_interface_only",
["media.peerconnection.ice.default_address_only", "media.peerconnection.ice.no_host"]);
await testSetting(
"network.webRTCIPHandlingPolicy",
"disable_non_proxied_udp",
["media.peerconnection.ice.proxy_only"]);
await testSetting("default", []);
await testSetting("network.webRTCIPHandlingPolicy", "default", []);
await testSetting("network.peerConnectionEnabled", false, []);
await testSetting("network.peerConnectionEnabled", true, ["media.peerconnection.enabled"]);
await extension.unload();