Skip to content
This repository has been archived by the owner on Aug 4, 2022. It is now read-only.

Commit

Permalink
Bug 1613659 - Remove network listeners and reset TRR mode when enable…
Browse files Browse the repository at this point in the history
…d pref is rolled back. r=dragana

Differential Revision: https://phabricator.services.mozilla.com/D61845
  • Loading branch information
nhnt11 committed Feb 6, 2020
1 parent b24e9ac commit 45e1d3a
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 22 deletions.
62 changes: 40 additions & 22 deletions browser/extensions/doh-rollout/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -574,14 +574,6 @@ const rollout = {

const setup = {
async start() {
DEBUG = await browser.experiments.preferences.getBoolPref(
DOH_DEBUG_PREF,
false
);

// Run Migration First, to continue to run rest of start up logic
await rollout.migrateLocalStoragePrefs();

const isAddonDisabled = await rollout.getSetting(DOH_DISABLED_PREF, false);
const runAddonPref = await rollout.getSetting(DOH_ENABLED_PREF, false);
const runAddonBypassPref = await rollout.getSetting(
Expand Down Expand Up @@ -617,21 +609,47 @@ const setup = {
) {
rollout.init();
} else {
log(
"Disabled, aborting! Watching `doh-rollout.enabled` pref for change event"
);
// Listen for changes to the enabled pref. TODO: Also listen after init
// and properly handle the value of enabled changing to false.
browser.experiments.preferences.onPrefChanged.addListener(
function listener() {
browser.experiments.preferences.onPrefChanged.removeListener(
listener
);
setup.start();
}
);
log("Disabled, aborting!");
}
},
};

setup.start();
(async () => {
DEBUG = await browser.experiments.preferences.getBoolPref(
DOH_DEBUG_PREF,
false
);

// Run Migration First, to continue to run rest of start up logic
await rollout.migrateLocalStoragePrefs();

log("Watching `doh-rollout.enabled` pref");
browser.experiments.preferences.onPrefChanged.addListener(async () => {
let enabled = await rollout.getSetting(DOH_ENABLED_PREF, false);
if (enabled) {
setup.start();
} else {
// Reset the TRR mode if we were running normally with no user-interference.
if (await stateManager.shouldRunHeuristics()) {
await stateManager.setState("disabled");
}

// Remove our listeners.
browser.networkStatus.onConnectionChanged.removeListener(
rollout.onConnectionChanged
);

try {
browser.captivePortal.onStateChange.removeListener(
rollout.onCaptiveStateChanged
);
} catch (e) {
// Captive Portal Service is disabled.
}
}
});

if (await rollout.getSetting(DOH_ENABLED_PREF, false)) {
setup.start();
}
})();
1 change: 1 addition & 0 deletions browser/extensions/doh-rollout/test/browser/browser.ini
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ skip-if = debug # Bug 1548006 - reloading an addon upsets the leak checker.
[browser_doorhanger_newProfile.js]
[browser_policyOverride.js]
skip-if = (!debug && bits == 64) #Bug 1605297
[browser_rollback.js]
[browser_userInterference.js]
110 changes: 110 additions & 0 deletions browser/extensions/doh-rollout/test/browser/browser_rollback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
"use strict";

add_task(setup);

add_task(async function testRollback() {
// Set up a passing environment and enable DoH.
setPassingHeuristics();
let promise = waitForDoorhanger();
Preferences.set(prefs.DOH_ENABLED_PREF, true);

await BrowserTestUtils.waitForCondition(() => {
return Preferences.get(prefs.DOH_SELF_ENABLED_PREF);
});
is(Preferences.get(prefs.DOH_SELF_ENABLED_PREF), true, "Breadcrumb saved.");

let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, EXAMPLE_URL);
let panel = await promise;
is(
Preferences.get(prefs.DOH_DOORHANGER_SHOWN_PREF),
undefined,
"Doorhanger shown pref undefined before user interaction."
);

// Click the doorhanger's "accept" button.
let button = panel.querySelector(".popup-notification-primary-button");
promise = BrowserTestUtils.waitForEvent(panel, "popuphidden");
EventUtils.synthesizeMouseAtCenter(button, {});
await promise;

await ensureTRRMode(2);
await checkHeuristicsTelemetry("enable_doh", "startup");

await BrowserTestUtils.waitForCondition(() => {
return Preferences.get(prefs.DOH_DOORHANGER_SHOWN_PREF);
});
is(
Preferences.get(prefs.DOH_DOORHANGER_SHOWN_PREF),
true,
"Doorhanger shown pref saved."
);
is(
Preferences.get(prefs.DOH_DOORHANGER_USER_DECISION_PREF),
"UIOk",
"Doorhanger decision saved."
);
is(
Preferences.get(prefs.DOH_SELF_ENABLED_PREF),
true,
"Breadcrumb not cleared."
);

BrowserTestUtils.removeTab(tab);

// Change the environment to failing and simulate a network change.
setFailingHeuristics();
simulateNetworkChange();
await ensureTRRMode(0);
await checkHeuristicsTelemetry("disable_doh", "netchange");

// Trigger another network change.
simulateNetworkChange();
await ensureNoTRRModeChange(0);
await checkHeuristicsTelemetry("disable_doh", "netchange");

// Rollback!
setPassingHeuristics();
Preferences.reset(prefs.DOH_ENABLED_PREF);
await ensureTRRMode(0);
simulateNetworkChange();
await ensureNoTRRModeChange(0);
await ensureNoHeuristicsTelemetry();

// Re-enable.
Preferences.set(prefs.DOH_ENABLED_PREF, true);

await ensureTRRMode(2);
await checkHeuristicsTelemetry("enable_doh", "startup");

// Change the environment to failing and simulate a network change.
setFailingHeuristics();
simulateNetworkChange();
await ensureTRRMode(0);
await checkHeuristicsTelemetry("disable_doh", "netchange");

// Rollback again for good measure! This time with failing heuristics.
Preferences.reset(prefs.DOH_ENABLED_PREF);
await ensureTRRMode(0);
simulateNetworkChange();
await ensureNoTRRModeChange(0);
await ensureNoHeuristicsTelemetry();

// Re-enable.
Preferences.set(prefs.DOH_ENABLED_PREF, true);

await ensureNoTRRModeChange(0);
await checkHeuristicsTelemetry("disable_doh", "startup");

// Change the environment to passing and simulate a network change.
setPassingHeuristics();
simulateNetworkChange();
await ensureTRRMode(2);
await checkHeuristicsTelemetry("enable_doh", "netchange");

// Rollback again, this time with TRR mode set to 2 prior to doing so.
Preferences.reset(prefs.DOH_ENABLED_PREF);
await ensureTRRMode(0);
simulateNetworkChange();
await ensureNoTRRModeChange(0);
await ensureNoHeuristicsTelemetry();
});

0 comments on commit 45e1d3a

Please sign in to comment.