mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 08:45:46 +00:00
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:
parent
0d2a8199d0
commit
7dc0b07882
@ -1822,6 +1822,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();
|
||||
|
Loading…
Reference in New Issue
Block a user