Bug 1608320 - DoH Rollout Extension: Don't show the doorhanger if the user has seen the post-DoH privacy statement. r=dragana

Differential Revision: https://phabricator.services.mozilla.com/D59830

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Nihanth Subramanya 2020-01-22 22:16:44 +00:00
Родитель 150f590937
Коммит ec2865c8d7
6 изменённых файлов: 110 добавлений и 8 удалений

Просмотреть файл

@ -1820,6 +1820,12 @@ pref("extensions.screenshots.disabled", false);
// disable uploading to the server.
pref("extensions.screenshots.upload-disabled", false);
// DoH Rollout: the earliest date of profile creation for which we don't need
// to show the doorhanger. This is when the version of the privacy statement
// that includes DoH went live - Oct 31, 2019. This has to be a string because
// the number is outside the signed 32-bit integer range.
pref("doh-rollout.profileCreationThreshold", "1572476400000");
// URL for Learn More link for browser error logging in preferences
pref("browser.chrome.errorReporter.infoURL",
"https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/nightly-error-collection");

Просмотреть файл

@ -190,15 +190,9 @@ const stateManager = {
},
async showDoorhanger() {
browser.experiments.doorhanger.onDoorhangerAccept.addListener(
rollout.doorhangerAcceptListener
);
rollout.addDoorhangerListeners();
browser.experiments.doorhanger.onDoorhangerDecline.addListener(
rollout.doorhangerDeclineListener
);
await browser.experiments.doorhanger.show({
let doorhangerShown = await browser.experiments.doorhanger.show({
name: browser.i18n.getMessage("doorhangerName"),
text: "<> " + browser.i18n.getMessage("doorhangerBody"),
okLabel: browser.i18n.getMessage("doorhangerButtonOk"),
@ -208,6 +202,16 @@ const stateManager = {
"doorhangerButtonCancelAccessKey"
),
});
if (!doorhangerShown) {
// The profile was created after the go-live date of the privacy statement
// that included DoH. Treat it as accepted.
log("Profile is new, doorhanger not shown.");
await stateManager.setState("UIOk");
await stateManager.rememberDoorhangerDecision("NewProfile");
await stateManager.rememberDoorhangerShown();
rollout.removeDoorhangerListeners();
}
},
};
@ -223,11 +227,32 @@ const rollout = {
return this._isTesting;
},
addDoorhangerListeners() {
browser.experiments.doorhanger.onDoorhangerAccept.addListener(
rollout.doorhangerAcceptListener
);
browser.experiments.doorhanger.onDoorhangerDecline.addListener(
rollout.doorhangerDeclineListener
);
},
removeDoorhangerListeners() {
browser.experiments.doorhanger.onDoorhangerAccept.removeListener(
rollout.doorhangerAcceptListener
);
browser.experiments.doorhanger.onDoorhangerDecline.removeListener(
rollout.doorhangerDeclineListener
);
},
async doorhangerAcceptListener(tabId) {
log("Doorhanger accepted on tab", tabId);
await stateManager.setState("UIOk");
await stateManager.rememberDoorhangerDecision("UIOk");
await stateManager.rememberDoorhangerShown();
rollout.removeDoorhangerListeners();
},
async doorhangerDeclineListener(tabId) {
@ -239,6 +264,7 @@ const rollout = {
browser.experiments.heuristics.sendHeuristicsPing("disable_doh", results);
await stateManager.rememberDisableHeuristics();
await stateManager.rememberDoorhangerShown();
rollout.removeDoorhangerListeners();
},
async heuristics(evaluateReason) {

Просмотреть файл

@ -7,6 +7,7 @@
/* global BrowserWindowTracker, ExtensionCommon, ExtensionAPI */
ChromeUtils.import("resource://gre/modules/Services.jsm", this);
ChromeUtils.import("resource://gre/modules/Preferences.jsm", this);
var { EventManager, EventEmitter } = ExtensionCommon;
const {
@ -97,7 +98,31 @@ this.doorhanger = class doorhanger extends ExtensionAPI {
experiments: {
doorhanger: {
async show(properties) {
let profileAge = await ChromeUtils.import(
"resource://gre/modules/ProfileAge.jsm",
{}
).ProfileAge();
let creationDate = await profileAge.created;
let firstUse = await profileAge.firstUse;
let resetDate = await profileAge.reset;
let profileDate = resetDate || firstUse || creationDate;
// We only need to show the doorhanger to users who have not been
// shown a version of the privacy statement that includes DoH at
// first-run.
let profileCreationThreshold = parseInt(
Preferences.get("doh-rollout.profileCreationThreshold")
);
if (
!isNaN(profileCreationThreshold) &&
profileDate > profileCreationThreshold
) {
return false;
}
await doorhangerEventEmitter.emitShow(properties);
return true;
},
onDoorhangerAccept: new EventManager({
context,

Просмотреть файл

@ -5,6 +5,7 @@ skip-if = debug # Bug 1548006 - reloading an addon upsets the leak checker.
[browser_cleanFlow.js]
[browser_dirtyEnable.js]
[browser_doorhangerUserReject.js]
[browser_doorhanger_newProfile.js]
[browser_policyOverride.js]
skip-if = (!debug && bits == 64) #Bug 1605297
[browser_userInterference.js]

Просмотреть файл

@ -0,0 +1,34 @@
"use strict";
add_task(setup);
add_task(async function testDoorhanger() {
Preferences.reset(prefs.PROFILE_CREATION_THRESHOLD_PREF);
// Set up a passing environment and enable DoH.
setPassingHeuristics();
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.");
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),
"NewProfile",
"Doorhanger decision saved."
);
is(
Preferences.get(prefs.DOH_SELF_ENABLED_PREF),
true,
"Breadcrumb not cleared."
);
});

Просмотреть файл

@ -12,6 +12,10 @@ ChromeUtils.defineModuleGetter(
"resource://gre/modules/Preferences.jsm"
);
const { CommonUtils } = ChromeUtils.import(
"resource://services-common/utils.js"
);
const ADDON_ID = "doh-rollout@mozilla.org";
const prefs = {
@ -27,6 +31,7 @@ const prefs = {
DOH_BALROG_MIGRATION_PREF: "doh-rollout.balrog-migration-done",
DOH_DEBUG_PREF: "doh-rollout.debug",
MOCK_HEURISTICS_PREF: "doh-rollout.heuristics.mockValues",
PROFILE_CREATION_THRESHOLD_PREF: "doh-rollout.profileCreationThreshold",
};
const fakePassingHeuristics = JSON.stringify({
@ -59,6 +64,11 @@ async function setup() {
Services.telemetry.canRecordExtended = true;
Services.telemetry.clearEvents();
// Set the profile creation threshold to very far in the future by defualt,
// so that we can test the doorhanger. browser_doorhanger_newProfile.js
// overrides this.
Preferences.set(prefs.PROFILE_CREATION_THRESHOLD_PREF, "99999999999999");
registerCleanupFunction(async () => {
Services.telemetry.canRecordExtended = oldCanRecord;
Services.telemetry.clearEvents();