mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-27 12:50:09 +00:00
Bug 1450801 Part 1: Remove front-end (about:addons) support for telemetry experiments. r=kmag
MozReview-Commit-ID: 9J4cPZxG2z0 --HG-- extra : rebase_source : 94ea557ac66d0383421054d085c592acb7d46fec extra : histedit_source : f8e35b9f477d046e4a1ccff8d16090f45b5d9e46
This commit is contained in:
parent
0ea63dd8ce
commit
a46219a92b
@ -1514,8 +1514,6 @@ pref("toolkit.telemetry.hybridContent.enabled", true);
|
||||
pref("experiments.enabled", true);
|
||||
pref("experiments.manifest.fetchIntervalSeconds", 86400);
|
||||
pref("experiments.manifest.uri", "https://telemetry-experiment.cdn.mozilla.net/manifest/v1/firefox/%VERSION%/%CHANNEL%");
|
||||
// Whether experiments are supported by the current application profile.
|
||||
pref("experiments.supported", true);
|
||||
|
||||
// Ping Centre Telemetry settings.
|
||||
pref("browser.ping-centre.telemetry", true);
|
||||
|
@ -1071,8 +1071,6 @@ pref("toolkit.scrollbox.clickToScroll.scrollDelay", 150);
|
||||
pref("toolkit.telemetry.server", "https://incoming.telemetry.mozilla.org");
|
||||
// Telemetry server owner. Please change if you set toolkit.telemetry.server to a different server
|
||||
pref("toolkit.telemetry.server_owner", "Mozilla");
|
||||
// Information page about telemetry (temporary ; will be about:telemetry in the end)
|
||||
pref("toolkit.telemetry.infoURL", "https://www.mozilla.org/legal/privacy/firefox.html#telemetry");
|
||||
// Determines whether full SQL strings are returned when they might contain sensitive info
|
||||
// i.e. dynamically constructed SQL strings or SQL executed by addons against addon DBs
|
||||
pref("toolkit.telemetry.debugSlowSql", false);
|
||||
|
@ -72,8 +72,6 @@ user_pref("font.size.inflation.minTwips", 0);
|
||||
// Disable the caret blinking so we get stable snapshot
|
||||
user_pref("ui.caretBlinkTime", -1);
|
||||
|
||||
// AddonManager tests require that the experiments provider be present.
|
||||
user_pref("experiments.supported", true);
|
||||
// Point the manifest at something local so we don't risk it hitting production
|
||||
// data and installing experiments that may vary over time.
|
||||
user_pref("experiments.manifest.uri", "http://%(server)s/experiments-dummy/manifest");
|
||||
|
@ -210,17 +210,6 @@
|
||||
|
||||
<!ENTITY settings.path.button.label "Browse…">
|
||||
|
||||
<!-- LOCALIZATION NOTE (experiment.info.label): The strings related to
|
||||
experiments are present on the "Experiments" tab of the add-ons manager.
|
||||
This tab won't be displayed unless an Experiment add-on is installed.
|
||||
Install https://people.mozilla.org/~gszorc/dummy-experiment-addon.xpi
|
||||
to cause this tab to appear. -->
|
||||
<!ENTITY experiment.info.label "What’s this? Telemetry may install and run experiments from time to time.">
|
||||
<!ENTITY experiment.info.learnmore "Learn More">
|
||||
<!ENTITY experiment.info.learnmore.accesskey "L">
|
||||
<!ENTITY experiment.info.changetelemetry "Telemetry Settings">
|
||||
<!ENTITY experiment.info.changetelemetry.accesskey "T">
|
||||
|
||||
<!ENTITY setting.learnmore "Learn More…">
|
||||
|
||||
<!ENTITY disabledUnsigned.heading "Some add-ons have been disabled">
|
||||
|
@ -84,44 +84,6 @@ details.notification.restartless-uninstall=%1$S will be uninstalled after you cl
|
||||
#LOCALIZATION NOTE (details.notification.gmpPending) %1$S is the add-on name
|
||||
details.notification.gmpPending=%1$S will be installed shortly.
|
||||
|
||||
# LOCALIZATION NOTE (details.experiment.time.daysRemaining):
|
||||
# Semicolon-separated list of plural forms.
|
||||
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
# #1 is the number of days from now that the experiment will remain active (detail view).
|
||||
details.experiment.time.daysRemaining=#1 day remaining;#1 days remaining
|
||||
#LOCALIZATION NOTE (details.experiment.time.endsToday) The experiment will end in less than a day (detail view).
|
||||
details.experiment.time.endsToday=Less than a day remaining
|
||||
# LOCALIZATION NOTE (details.experiment.time.daysPassed):
|
||||
# Semicolon-separated list of plural forms.
|
||||
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
# #1 is the number of days since the experiment ran (detail view).
|
||||
details.experiment.time.daysPassed=#1 day ago;#1 days ago
|
||||
#LOCALIZATION NOTE (details.experiment.time.endedToday) The experiment ended less than a day ago (detail view).
|
||||
details.experiment.time.endedToday=Less than a day ago
|
||||
#LOCALIZATION NOTE (details.experiment.state.active) This experiment is active (detail view).
|
||||
details.experiment.state.active=Active
|
||||
#LOCALIZATION NOTE (details.experiment.state.complete) This experiment is complete (it was previously active) (detail view).
|
||||
details.experiment.state.complete=Complete
|
||||
|
||||
# LOCALIZATION NOTE (experiment.time.daysRemaining):
|
||||
# Semicolon-separated list of plural forms.
|
||||
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
# #1 is the number of days from now that the experiment will remain active (list view item).
|
||||
experiment.time.daysRemaining=#1 day remaining;#1 days remaining
|
||||
#LOCALIZATION NOTE (experiment.time.endsToday) The experiment will end in less than a day (list view item).
|
||||
experiment.time.endsToday=Less than a day remaining
|
||||
# LOCALIZATION NOTE (experiment.time.daysPassed):
|
||||
# Semicolon-separated list of plural forms.
|
||||
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
# #1 is the number of days since the experiment ran (list view item).
|
||||
experiment.time.daysPassed=#1 day ago;#1 days ago
|
||||
#LOCALIZATION NOTE (experiment.time.endedToday) The experiment ended less than a day ago (list view item).
|
||||
experiment.time.endedToday=Less than a day ago
|
||||
#LOCALIZATION NOTE (experiment.state.active) This experiment is active (list view item).
|
||||
experiment.state.active=Active
|
||||
#LOCALIZATION NOTE (experiment.state.complete) This experiment is complete (it was previously active) (list view item).
|
||||
experiment.state.complete=Complete
|
||||
|
||||
installFromFile.dialogTitle=Select add-on to install
|
||||
installFromFile.filterName=Add-ons
|
||||
|
||||
@ -138,7 +100,6 @@ type.locale.name=Languages
|
||||
type.plugin.name=Plugins
|
||||
type.dictionary.name=Dictionaries
|
||||
type.service.name=Services
|
||||
type.experiment.name=Experiments
|
||||
type.legacy.name=Legacy Extensions
|
||||
type.unsupported.name=Unsupported
|
||||
|
||||
|
@ -141,8 +141,7 @@ row[unsupported="true"] {
|
||||
}
|
||||
|
||||
#addons-page .view-pane:not([type="theme"]) #getthemes-container,
|
||||
#addons-page .view-pane:not([type="plugin"]) #plugindeprecation-notice,
|
||||
#addons-page .view-pane:not([type="experiment"]) .experiment-info-container {
|
||||
#addons-page .view-pane:not([type="plugin"]) #plugindeprecation-notice {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@ -176,39 +175,6 @@ richlistitem:not([selected]) * {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#experiments-learn-more[disabled="true"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#experiments-change-telemetry[disabled="true"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.view-pane:not(#legacy-view) .addon-control.replacement {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.view-pane[type="experiment"] .error,
|
||||
.view-pane[type="experiment"] .warning,
|
||||
.view-pane[type="experiment"] .addon:not([pending="uninstall"]) .pending,
|
||||
.view-pane[type="experiment"] .disabled-postfix,
|
||||
.view-pane[type="experiment"] .update-postfix,
|
||||
.view-pane[type="experiment"] .addon-control.enable,
|
||||
.view-pane[type="experiment"] .addon-control.disable,
|
||||
#detail-view[type="experiment"] .alert-container,
|
||||
#detail-view[type="experiment"] #detail-version,
|
||||
#detail-view[type="experiment"] #detail-creator,
|
||||
#detail-view[type="experiment"] #detail-enable-btn,
|
||||
#detail-view[type="experiment"] #detail-disable-btn {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.view-pane:not([type="experiment"]) .experiment-container,
|
||||
.view-pane:not([type="experiment"]) #detail-experiment-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.addon[type="experiment"][status="installing"] .experiment-time,
|
||||
.addon[type="experiment"][status="installing"] .experiment-state {
|
||||
display: none;
|
||||
}
|
||||
|
@ -31,9 +31,6 @@ ChromeUtils.defineModuleGetter(this, "PluralForm",
|
||||
ChromeUtils.defineModuleGetter(this, "Preferences",
|
||||
"resource://gre/modules/Preferences.jsm");
|
||||
|
||||
ChromeUtils.defineModuleGetter(this, "Experiments",
|
||||
"resource:///modules/experiments/Experiments.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(this, "WEBEXT_PERMISSION_PROMPTS",
|
||||
"extensions.webextPermissionPrompts", false);
|
||||
XPCOMUtils.defineLazyPreferenceGetter(this, "XPINSTALL_ENABLED",
|
||||
@ -282,23 +279,6 @@ function isDiscoverEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function getExperimentEndDate(aAddon) {
|
||||
if (!("@mozilla.org/browser/experiments-service;1" in Cc)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!aAddon.isActive) {
|
||||
return aAddon.endDate;
|
||||
}
|
||||
|
||||
let experiment = Experiments.instance().getActiveExperiment();
|
||||
if (!experiment) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return experiment.endDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain the main DOMWindow for the current context.
|
||||
*/
|
||||
@ -317,23 +297,6 @@ function getBrowserElement() {
|
||||
.chromeEventHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain the DOMWindow that can open a preferences pane.
|
||||
*
|
||||
* This is essentially "get the browser chrome window" with the added check
|
||||
* that the supposed browser chrome window is capable of opening a preferences
|
||||
* pane.
|
||||
*
|
||||
* This may return null if we can't find the browser chrome window.
|
||||
*/
|
||||
function getMainWindowWithPreferencesPane() {
|
||||
let mainWindow = getMainWindow();
|
||||
if (mainWindow && "openPreferences" in mainWindow) {
|
||||
return mainWindow;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* A wrapper around the HTML5 session history service that allows the browser
|
||||
* back/forward controls to work within the manager
|
||||
@ -1383,27 +1346,6 @@ var gViewController = {
|
||||
}
|
||||
},
|
||||
|
||||
cmd_experimentsLearnMore: {
|
||||
isEnabled() {
|
||||
let mainWindow = getMainWindow();
|
||||
return mainWindow && "switchToTabHavingURI" in mainWindow;
|
||||
},
|
||||
doCommand() {
|
||||
let url = Services.prefs.getCharPref("toolkit.telemetry.infoURL");
|
||||
openOptionsInTab(url);
|
||||
},
|
||||
},
|
||||
|
||||
cmd_experimentsOpenTelemetryPreferences: {
|
||||
isEnabled() {
|
||||
return !!getMainWindowWithPreferencesPane();
|
||||
},
|
||||
doCommand() {
|
||||
let mainWindow = getMainWindowWithPreferencesPane();
|
||||
mainWindow.openPreferences("privacy-reports", { origin: "experimentsOpenPref" });
|
||||
},
|
||||
},
|
||||
|
||||
cmd_showUnsignedExtensions: {
|
||||
isEnabled() {
|
||||
return true;
|
||||
@ -1515,10 +1457,6 @@ function shouldShowVersionNumber(aAddon) {
|
||||
if (!aAddon.version)
|
||||
return false;
|
||||
|
||||
// The version number is hidden for experiments.
|
||||
if (aAddon.type == "experiment")
|
||||
return false;
|
||||
|
||||
// The version number is hidden for lightweight themes.
|
||||
if (aAddon.type == "theme")
|
||||
return !/@personas\.mozilla\.org$/.test(aAddon.id);
|
||||
@ -1551,10 +1489,6 @@ function createItem(aObj, aIsInstall) {
|
||||
// the binding handles the rest
|
||||
item.setAttribute("value", aObj.id);
|
||||
|
||||
if (aObj.type == "experiment") {
|
||||
item.endDate = getExperimentEndDate(aObj);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
@ -2570,13 +2504,6 @@ var gListView = {
|
||||
// the existing item
|
||||
if (aInstall.existingAddon)
|
||||
this.removeItem(aInstall, true);
|
||||
|
||||
if (aInstall.addon.type == "experiment") {
|
||||
let item = this.getListItemForID(aInstall.addon.id);
|
||||
if (item) {
|
||||
item.endDate = getExperimentEndDate(aInstall.addon);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
addItem(aObj, aIsInstall) {
|
||||
@ -2833,34 +2760,6 @@ var gDetailView = {
|
||||
}
|
||||
}
|
||||
|
||||
if (this._addon.type == "experiment") {
|
||||
let prefix = "details.experiment.";
|
||||
let active = this._addon.isActive;
|
||||
|
||||
let stateKey = prefix + "state." + (active ? "active" : "complete");
|
||||
let node = document.getElementById("detail-experiment-state");
|
||||
node.value = gStrings.ext.GetStringFromName(stateKey);
|
||||
|
||||
let now = Date.now();
|
||||
let end = getExperimentEndDate(this._addon);
|
||||
let days = Math.abs(end - now) / (24 * 60 * 60 * 1000);
|
||||
|
||||
let timeKey = prefix + "time.";
|
||||
let timeMessage;
|
||||
if (days < 1) {
|
||||
timeKey += (active ? "endsToday" : "endedToday");
|
||||
timeMessage = gStrings.ext.GetStringFromName(timeKey);
|
||||
} else {
|
||||
timeKey += (active ? "daysRemaining" : "daysPassed");
|
||||
days = Math.round(days);
|
||||
let timeString = gStrings.ext.GetStringFromName(timeKey);
|
||||
timeMessage = PluralForm.get(days, timeString)
|
||||
.replace("#1", days);
|
||||
}
|
||||
|
||||
document.getElementById("detail-experiment-time").value = timeMessage;
|
||||
}
|
||||
|
||||
this.fillSettingsRows(aScrollToPreferences, () => {
|
||||
this.updateState();
|
||||
gViewController.notifyViewChanged();
|
||||
|
@ -741,15 +741,6 @@
|
||||
<xul:label anonid="date-updated" class="date-updated"
|
||||
unknown="&addon.unknownDate;"/>
|
||||
</xul:hbox>
|
||||
<xul:hbox class="experiment-container">
|
||||
<svg width="6" height="6" viewBox="0 0 6 6" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="experiment-bullet-container">
|
||||
<circle cx="3" cy="3" r="3" class="experiment-bullet"/>
|
||||
</svg>
|
||||
<xul:label anonid="experiment-state" class="experiment-state"/>
|
||||
<xul:label anonid="experiment-time" class="experiment-time"/>
|
||||
</xul:hbox>
|
||||
|
||||
<xul:hbox class="advancedinfo-container" flex="1">
|
||||
<xul:vbox class="description-outer-container" flex="1">
|
||||
@ -915,12 +906,6 @@
|
||||
document.getAnonymousElementByAttribute(this, "anonid",
|
||||
"info");
|
||||
</field>
|
||||
<field name="_experimentState">
|
||||
document.getAnonymousElementByAttribute(this, "anonid", "experiment-state");
|
||||
</field>
|
||||
<field name="_experimentTime">
|
||||
document.getAnonymousElementByAttribute(this, "anonid", "experiment-time");
|
||||
</field>
|
||||
<field name="_icon">
|
||||
document.getAnonymousElementByAttribute(this, "anonid", "icon");
|
||||
</field>
|
||||
@ -1298,37 +1283,6 @@
|
||||
var showProgress = (this.mAddon.install &&
|
||||
this.mAddon.install.state != AddonManager.STATE_INSTALLED);
|
||||
this._showStatus(showProgress ? "progress" : "none");
|
||||
|
||||
if (this.mAddon.type == "experiment") {
|
||||
this.removeAttribute("notification");
|
||||
let prefix = "experiment.";
|
||||
let active = this.mAddon.isActive;
|
||||
|
||||
if (!showProgress) {
|
||||
let stateKey = prefix + "state." + (active ? "active" : "complete");
|
||||
this._experimentState.value = gStrings.ext.GetStringFromName(stateKey);
|
||||
|
||||
let now = Date.now();
|
||||
let end = this.endDate;
|
||||
let days = Math.abs(end - now) / (24 * 60 * 60 * 1000);
|
||||
|
||||
let timeKey = prefix + "time.";
|
||||
let timeMessage;
|
||||
|
||||
if (days < 1) {
|
||||
timeKey += (active ? "endsToday" : "endedToday");
|
||||
timeMessage = gStrings.ext.GetStringFromName(timeKey);
|
||||
} else {
|
||||
timeKey += (active ? "daysRemaining" : "daysPassed");
|
||||
days = Math.round(days);
|
||||
let timeString = gStrings.ext.GetStringFromName(timeKey);
|
||||
timeMessage = PluralForm.get(days, timeString)
|
||||
.replace("#1", days);
|
||||
}
|
||||
|
||||
this._experimentTime.value = timeMessage;
|
||||
}
|
||||
}
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
|
@ -104,8 +104,6 @@
|
||||
<command id="cmd_enableUpdateSecurity"/>
|
||||
<command id="cmd_toggleAutoUpdateDefault"/>
|
||||
<command id="cmd_resetAddonAutoUpdate"/>
|
||||
<command id="cmd_experimentsLearnMore"/>
|
||||
<command id="cmd_experimentsOpenTelemetryPreferences"/>
|
||||
<command id="cmd_showUnsignedExtensions"/>
|
||||
<command id="cmd_showAllExtensions"/>
|
||||
</commandset>
|
||||
@ -324,25 +322,6 @@
|
||||
<spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
|
||||
</hbox>
|
||||
</hbox>
|
||||
<vbox class="alert-container experiment-info-container">
|
||||
<vbox class="alert">
|
||||
<description>
|
||||
&experiment.info.label;
|
||||
<hbox>
|
||||
<button id="experiments-learn-more"
|
||||
label="&experiment.info.learnmore;"
|
||||
tooltiptext="&experiment.info.learnmore;"
|
||||
accesskey="&experiment.info.learnmore.accesskey;"
|
||||
command="cmd_experimentsLearnMore"/>
|
||||
<button id="experiments-change-telemetry"
|
||||
label="&experiment.info.changetelemetry;"
|
||||
tooltiptext="&experiment.info.changetelemetry;"
|
||||
accesskey="&experiment.info.changetelemetry.accesskey;"
|
||||
command="cmd_experimentsOpenTelemetryPreferences"/>
|
||||
</hbox>
|
||||
</description>
|
||||
</vbox>
|
||||
</vbox>
|
||||
<vbox id="addon-list-empty" class="alert-container"
|
||||
flex="1" hidden="true">
|
||||
<spacer class="alert-spacer-before"/>
|
||||
@ -515,15 +494,6 @@
|
||||
</hbox>
|
||||
<label id="detail-creator" class="creator"/>
|
||||
</vbox>
|
||||
<hbox id="detail-experiment-container">
|
||||
<svg width="8" height="8" viewBox="0 0 8 8" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="detail-experiment-bullet-container">
|
||||
<circle cx="4" cy="4" r="4" id="detail-experiment-bullet"/>
|
||||
</svg>
|
||||
<label id="detail-experiment-state"/>
|
||||
<label id="detail-experiment-time"/>
|
||||
</hbox>
|
||||
<hbox id="detail-desc-container" align="start">
|
||||
<vbox id="detail-screenshot-box" pack="center" hidden="true"> <!-- Necessary to work around bug 394738 -->
|
||||
<image id="detail-screenshot"/>
|
||||
|
@ -6432,17 +6432,4 @@ var addonTypes = [
|
||||
AddonManager.TYPE_UI_HIDE_EMPTY | AddonManager.TYPE_SUPPORTS_UNDO_RESTARTLESS_UNINSTALL),
|
||||
];
|
||||
|
||||
// We only register experiments support if the application supports them.
|
||||
// Ideally, we would install an observer to watch the pref. Installing
|
||||
// an observer for this pref is not necessary here and may be buggy with
|
||||
// regards to registering this XPIProvider twice.
|
||||
if (Services.prefs.getBoolPref("experiments.supported", false)) {
|
||||
addonTypes.push(
|
||||
new AddonManagerPrivate.AddonType("experiment",
|
||||
URI_EXTENSION_STRINGS,
|
||||
"type.experiment.name",
|
||||
AddonManager.VIEW_TYPE_LIST, 11000,
|
||||
AddonManager.TYPE_UI_HIDE_EMPTY | AddonManager.TYPE_SUPPORTS_UNDO_RESTARTLESS_UNINSTALL));
|
||||
}
|
||||
|
||||
AddonManagerPrivate.registerProvider(XPIProvider, addonTypes);
|
||||
|
Binary file not shown.
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
||||
|
||||
<Description about="urn:mozilla:install-manifest">
|
||||
<em:id>test-experiment1@experiments.mozilla.org</em:id>
|
||||
<em:version>1.0</em:version>
|
||||
<em:type>128</em:type>
|
||||
|
||||
<!-- Front End MetaData -->
|
||||
<em:name>Test Experiment 1</em:name>
|
||||
<em:description>Test Description</em:description>
|
||||
|
||||
</Description>
|
||||
</RDF>
|
@ -61,7 +61,6 @@ skip-if = os == "linux" && !debug # Bug 1395539 - fails on multi-core
|
||||
[browser_dragdrop.js]
|
||||
skip-if = buildapp == 'mulet'
|
||||
[browser_dragdrop_incompat.js]
|
||||
[browser_experiments.js]
|
||||
[browser_file_xpi_no_process_switch.js]
|
||||
skip-if = !debug && ((os == 'linux' && bits == '64') || (os == 'win' && os_version == '6.1')) # Bug 1449071 - disable on Linux64 and Windows 7 due to frequent failures
|
||||
[browser_getmorethemes.js]
|
||||
|
@ -1,617 +0,0 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
ChromeUtils.import("resource://gre/modules/Promise.jsm", this);
|
||||
|
||||
var {AddonManagerTesting} = ChromeUtils.import("resource://testing-common/AddonManagerTesting.jsm", {});
|
||||
var {HttpServer} = ChromeUtils.import("resource://testing-common/httpd.js", {});
|
||||
|
||||
var gManagerWindow;
|
||||
var gCategoryUtilities;
|
||||
var gExperiments;
|
||||
var gHttpServer;
|
||||
|
||||
var gSavedManifestURI;
|
||||
var gIsEnUsLocale;
|
||||
|
||||
const SEC_IN_ONE_DAY = 24 * 60 * 60;
|
||||
const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
|
||||
|
||||
function getExperimentAddons() {
|
||||
return new Promise(resolve => {
|
||||
AddonManager.getAddonsByTypes(["experiment"], (addons) => {
|
||||
resolve(addons);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function patchPolicy(policy, data) {
|
||||
for (let key of Object.keys(data)) {
|
||||
Object.defineProperty(policy, key, {
|
||||
value: data[key],
|
||||
writable: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function defineNow(policy, time) {
|
||||
patchPolicy(policy, { now: () => new Date(time) });
|
||||
}
|
||||
|
||||
function openDetailsView(aId) {
|
||||
let item = get_addon_element(gManagerWindow, aId);
|
||||
Assert.ok(item, "Should have got add-on element.");
|
||||
is_element_visible(item, "Add-on element should be visible.");
|
||||
|
||||
EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow);
|
||||
EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow);
|
||||
|
||||
return new Promise(resolve => {
|
||||
wait_for_view_load(gManagerWindow, resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function clickRemoveButton(addonElement) {
|
||||
let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "remove-btn");
|
||||
if (!btn) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow);
|
||||
let deferred = Promise.defer();
|
||||
setTimeout(deferred.resolve, 0);
|
||||
return deferred;
|
||||
}
|
||||
|
||||
function clickUndoButton(addonElement) {
|
||||
let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "undo-btn");
|
||||
if (!btn) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow);
|
||||
let deferred = Promise.defer();
|
||||
setTimeout(deferred.resolve, 0);
|
||||
return deferred;
|
||||
}
|
||||
|
||||
add_task(async function initializeState() {
|
||||
gManagerWindow = await open_manager();
|
||||
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
|
||||
|
||||
registerCleanupFunction(() => {
|
||||
Services.prefs.clearUserPref("experiments.enabled");
|
||||
if (gHttpServer) {
|
||||
gHttpServer.stop(() => {});
|
||||
if (gSavedManifestURI !== undefined) {
|
||||
Services.prefs.setCharPref("experments.manifest.uri", gSavedManifestURI);
|
||||
}
|
||||
}
|
||||
if (gExperiments) {
|
||||
let tmp = {};
|
||||
ChromeUtils.import("resource:///modules/experiments/Experiments.jsm", tmp);
|
||||
gExperiments._policy = new tmp.Experiments.Policy();
|
||||
}
|
||||
});
|
||||
|
||||
gIsEnUsLocale = Services.locale.getAppLocaleAsLangTag() == "en-US";
|
||||
|
||||
// The Experiments Manager will interfere with us by preventing installs
|
||||
// of experiments it doesn't know about. We remove it from the equation
|
||||
// because here we are only concerned with core Addon Manager operation,
|
||||
// not the superset Experiments Manager has imposed.
|
||||
if ("@mozilla.org/browser/experiments-service;1" in Cc) {
|
||||
let tmp = {};
|
||||
ChromeUtils.import("resource:///modules/experiments/Experiments.jsm", tmp);
|
||||
// There is a race condition between XPCOM service initialization and
|
||||
// this test running. We have to initialize the instance first, then
|
||||
// uninitialize it to prevent this.
|
||||
gExperiments = tmp.Experiments.instance();
|
||||
await gExperiments._mainTask;
|
||||
await gExperiments.uninit();
|
||||
}
|
||||
});
|
||||
|
||||
// On an empty profile with no experiments, the experiment category
|
||||
// should be hidden.
|
||||
add_task(async function testInitialState() {
|
||||
Assert.ok(gCategoryUtilities.get("experiment", false), "Experiment tab is defined.");
|
||||
Assert.ok(!gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab hidden by default.");
|
||||
});
|
||||
|
||||
add_task(async function testExperimentInfoNotVisible() {
|
||||
await gCategoryUtilities.openType("extension");
|
||||
let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0];
|
||||
is_element_hidden(el, "Experiment info not visible on other types.");
|
||||
});
|
||||
|
||||
// If we have an active experiment, we should see the experiments tab
|
||||
// and that tab should have some messages.
|
||||
add_task(async function testActiveExperiment() {
|
||||
let addon = await install_addon("addons/browser_experiment1.xpi");
|
||||
|
||||
Assert.ok(addon.userDisabled, "Add-on is disabled upon initial install.");
|
||||
Assert.equal(addon.isActive, false, "Add-on is not active.");
|
||||
|
||||
Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible.");
|
||||
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0];
|
||||
is_element_visible(el, "Experiment info is visible on experiment tab.");
|
||||
});
|
||||
|
||||
add_task(async function testExperimentLearnMore() {
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
let btn = gManagerWindow.document.getElementById("experiments-learn-more");
|
||||
|
||||
is_element_visible(btn, "Learn more button visible.");
|
||||
|
||||
// Actual URL is irrelevant.
|
||||
let expected = "http://mochi.test:8888/server.js";
|
||||
Services.prefs.setCharPref("toolkit.telemetry.infoURL", expected);
|
||||
|
||||
info("Opening telemetry privacy policy.");
|
||||
let loadPromise = BrowserTestUtils.waitForNewTab(gBrowser, expected);
|
||||
EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow);
|
||||
await loadPromise;
|
||||
|
||||
Services.prefs.clearUserPref("toolkit.telemetry.infoURL");
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab);
|
||||
});
|
||||
|
||||
add_task(async function testOpenPreferences() {
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
let btn = gManagerWindow.document.getElementById("experiments-change-telemetry");
|
||||
|
||||
is_element_visible(btn, "Change telemetry button visible in in-content UI.");
|
||||
|
||||
let deferred = Promise.defer();
|
||||
|
||||
function ensureElementIsVisible(preferencesPane, visibleElement) {
|
||||
Services.obs.addObserver(function observer(prefWin, topic, data) {
|
||||
Services.obs.removeObserver(observer, preferencesPane + "-pane-loaded");
|
||||
info(preferencesPane + " preference pane opened.");
|
||||
executeSoon(function() {
|
||||
// We want this test to fail if the preferences pane changes,
|
||||
// but we can't check if the data-choices button is visible
|
||||
// since it is only in the DOM when MOZ_TELEMETRY_REPORTING=1.
|
||||
let el = prefWin.document.getElementById(visibleElement);
|
||||
is_element_visible(el);
|
||||
|
||||
prefWin.close();
|
||||
info("Closed preferences pane.");
|
||||
|
||||
deferred.resolve();
|
||||
});
|
||||
}, preferencesPane + "-pane-loaded");
|
||||
}
|
||||
|
||||
ensureElementIsVisible("privacy", "dataCollectionGroup");
|
||||
|
||||
info("Loading preferences pane.");
|
||||
// We need to focus before synthesizing the mouse event (bug 1240052) as
|
||||
// synthesizeMouseAtCenter currently only synthesizes the mouse in the child process.
|
||||
// This can cause some subtle differences if the child isn't focused.
|
||||
await SimpleTest.promiseFocus();
|
||||
await BrowserTestUtils.synthesizeMouseAtCenter("#experiments-change-telemetry", {},
|
||||
gBrowser.selectedBrowser);
|
||||
|
||||
await deferred.promise;
|
||||
});
|
||||
|
||||
add_task(async function testButtonPresence() {
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
|
||||
Assert.ok(item, "Got add-on element.");
|
||||
item.parentNode.ensureElementIsVisible(item);
|
||||
|
||||
let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn");
|
||||
// Corresponds to the uninstall permission.
|
||||
is_element_visible(el, "Remove button is visible.");
|
||||
// Corresponds to lack of disable permission.
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn");
|
||||
is_element_hidden(el, "Disable button not visible.");
|
||||
// Corresponds to lack of enable permission.
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn");
|
||||
is_element_hidden(el, "Enable button not visible.");
|
||||
});
|
||||
|
||||
// Remove the add-on we've been testing with.
|
||||
add_task(async function testCleanup() {
|
||||
await AddonManagerTesting.uninstallAddonByID("test-experiment1@experiments.mozilla.org");
|
||||
// Verify some conditions, just in case.
|
||||
let addons = await getExperimentAddons();
|
||||
Assert.equal(addons.length, 0, "No experiment add-ons are installed.");
|
||||
});
|
||||
|
||||
// The following tests should ideally live in browser/experiments/. However,
|
||||
// they rely on some of the helper functions from head.js, which can't easily
|
||||
// be consumed from other directories. So, they live here.
|
||||
|
||||
add_task(async function testActivateExperiment() {
|
||||
if (!gExperiments) {
|
||||
info("Skipping experiments test because that feature isn't available.");
|
||||
return;
|
||||
}
|
||||
|
||||
gHttpServer = new HttpServer();
|
||||
gHttpServer.start(-1);
|
||||
let root = "http://localhost:" + gHttpServer.identity.primaryPort + "/";
|
||||
gHttpServer.registerPathHandler("/manifest", (request, response) => {
|
||||
response.setStatusLine(null, 200, "OK");
|
||||
response.write(JSON.stringify({
|
||||
"version": 1,
|
||||
"experiments": [
|
||||
{
|
||||
id: "experiment-1",
|
||||
xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
|
||||
xpiHash: "IRRELEVANT",
|
||||
startTime: Date.now() / 1000 - 3600,
|
||||
endTime: Date.now() / 1000 + 3600,
|
||||
maxActiveSeconds: 600,
|
||||
appName: [Services.appinfo.name],
|
||||
channel: [gExperiments._policy.updatechannel()],
|
||||
},
|
||||
],
|
||||
}));
|
||||
response.processAsync();
|
||||
response.finish();
|
||||
});
|
||||
|
||||
gSavedManifestURI = Services.prefs.getCharPref("experiments.manifest.uri");
|
||||
Services.prefs.setCharPref("experiments.manifest.uri", root + "manifest");
|
||||
|
||||
// We need to remove the cache file to help ensure consistent state.
|
||||
await OS.File.remove(gExperiments._cacheFilePath);
|
||||
|
||||
Services.telemetry.canRecordExtended = true;
|
||||
Services.prefs.setBoolPref("experiments.enabled", true);
|
||||
|
||||
info("Initializing experiments service.");
|
||||
await gExperiments.init();
|
||||
info("Experiments service finished first run.");
|
||||
|
||||
// Check conditions, just to be sure.
|
||||
let experiments = await gExperiments.getExperiments();
|
||||
Assert.equal(experiments.length, 0, "No experiments known to the service.");
|
||||
|
||||
// This makes testing easier.
|
||||
gExperiments._policy.ignoreHashes = true;
|
||||
|
||||
info("Manually updating experiments manifest.");
|
||||
await gExperiments.updateManifest();
|
||||
info("Experiments update complete.");
|
||||
|
||||
await new Promise(resolve => {
|
||||
gHttpServer.stop(() => {
|
||||
gHttpServer = null;
|
||||
|
||||
info("getting experiment by ID");
|
||||
AddonManager.getAddonByID("test-experiment1@experiments.mozilla.org", (addon) => {
|
||||
Assert.ok(addon, "Add-on installed via Experiments manager.");
|
||||
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Assert.ok(gCategoryUtilities.isTypeVisible, "experiment", "Experiment tab visible.");
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0];
|
||||
is_element_visible(el, "Experiment info is visible on experiment tab.");
|
||||
});
|
||||
|
||||
add_task(async function testDeactivateExperiment() {
|
||||
if (!gExperiments) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Fake an empty manifest to purge data from previous manifest.
|
||||
await gExperiments._updateExperiments({
|
||||
"version": 1,
|
||||
"experiments": [],
|
||||
});
|
||||
|
||||
await gExperiments.disableExperiment("testing");
|
||||
|
||||
// We should have a record of the previously-active experiment.
|
||||
let experiments = await gExperiments.getExperiments();
|
||||
Assert.equal(experiments.length, 1, "1 experiment is known.");
|
||||
Assert.equal(experiments[0].active, false, "Experiment is not active.");
|
||||
|
||||
// We should have a previous experiment in the add-ons manager.
|
||||
let addons = await new Promise(resolve => {
|
||||
AddonManager.getAddonsByTypes(["experiment"], (addons) => {
|
||||
resolve(addons);
|
||||
});
|
||||
});
|
||||
Assert.equal(addons.length, 1, "1 experiment add-on known.");
|
||||
Assert.ok(addons[0].appDisabled, "It is a previous experiment.");
|
||||
Assert.equal(addons[0].id, "experiment-1", "Add-on ID matches expected.");
|
||||
|
||||
// Verify the UI looks sane.
|
||||
|
||||
Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible.");
|
||||
let item = get_addon_element(gManagerWindow, "experiment-1");
|
||||
Assert.ok(item, "Got add-on element.");
|
||||
Assert.ok(!item.active, "Element should not be active.");
|
||||
item.parentNode.ensureElementIsVisible(item);
|
||||
|
||||
// User control buttons should not be present because previous experiments
|
||||
// should have no permissions.
|
||||
let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn");
|
||||
is_element_hidden(el, "Remove button is not visible.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn");
|
||||
is_element_hidden(el, "Disable button is not visible.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn");
|
||||
is_element_hidden(el, "Enable button is not visible.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "preferences-btn");
|
||||
is_element_hidden(el, "Preferences button is not visible.");
|
||||
});
|
||||
|
||||
add_task(async function testActivateRealExperiments() {
|
||||
if (!gExperiments) {
|
||||
info("Skipping experiments test because that feature isn't available.");
|
||||
return;
|
||||
}
|
||||
|
||||
await gExperiments._updateExperiments({
|
||||
"version": 1,
|
||||
"experiments": [
|
||||
{
|
||||
id: "experiment-2",
|
||||
xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
|
||||
xpiHash: "IRRELEVANT",
|
||||
startTime: Date.now() / 1000 - 3600,
|
||||
endTime: Date.now() / 1000 + 3600,
|
||||
maxActiveSeconds: 600,
|
||||
appName: [Services.appinfo.name],
|
||||
channel: [gExperiments._policy.updatechannel()],
|
||||
},
|
||||
],
|
||||
});
|
||||
await gExperiments._run();
|
||||
|
||||
// Check the active experiment.
|
||||
|
||||
let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
|
||||
Assert.ok(item, "Got add-on element.");
|
||||
item.parentNode.ensureElementIsVisible(item);
|
||||
|
||||
let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
|
||||
is_element_visible(el, "Experiment state label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Active");
|
||||
}
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
|
||||
is_element_visible(el, "Experiment time label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Less than a day remaining");
|
||||
}
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container");
|
||||
is_element_hidden(el, "error-container should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container");
|
||||
is_element_hidden(el, "warning-container should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container");
|
||||
is_element_hidden(el, "pending-container should be hidden.");
|
||||
let { version } = await get_tooltip_info(item);
|
||||
Assert.equal(version, undefined, "version should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix");
|
||||
is_element_hidden(el, "disabled-postfix should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix");
|
||||
is_element_hidden(el, "update-postfix should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet");
|
||||
is_element_visible(el, "experiment-bullet should be visible.");
|
||||
|
||||
// Check the previous experiment.
|
||||
|
||||
item = get_addon_element(gManagerWindow, "experiment-1");
|
||||
Assert.ok(item, "Got add-on element.");
|
||||
item.parentNode.ensureElementIsVisible(item);
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
|
||||
is_element_visible(el, "Experiment state label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Complete");
|
||||
}
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
|
||||
is_element_visible(el, "Experiment time label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Less than a day ago");
|
||||
}
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container");
|
||||
is_element_hidden(el, "error-container should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container");
|
||||
is_element_hidden(el, "warning-container should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container");
|
||||
is_element_hidden(el, "pending-container should be hidden.");
|
||||
({ version } = await get_tooltip_info(item));
|
||||
Assert.equal(version, undefined, "version should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix");
|
||||
is_element_hidden(el, "disabled-postfix should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix");
|
||||
is_element_hidden(el, "update-postfix should be hidden.");
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet");
|
||||
is_element_visible(el, "experiment-bullet should be visible.");
|
||||
|
||||
// Install an "older" experiment.
|
||||
|
||||
await gExperiments.disableExperiment("experiment-2");
|
||||
|
||||
let now = Date.now();
|
||||
let fakeNow = now - 5 * MS_IN_ONE_DAY;
|
||||
defineNow(gExperiments._policy, fakeNow);
|
||||
|
||||
await gExperiments._updateExperiments({
|
||||
"version": 1,
|
||||
"experiments": [
|
||||
{
|
||||
id: "experiment-3",
|
||||
xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
|
||||
xpiHash: "IRRELEVANT",
|
||||
startTime: fakeNow / 1000 - SEC_IN_ONE_DAY,
|
||||
endTime: now / 1000 + 10 * SEC_IN_ONE_DAY,
|
||||
maxActiveSeconds: 100 * SEC_IN_ONE_DAY,
|
||||
appName: [Services.appinfo.name],
|
||||
channel: [gExperiments._policy.updatechannel()],
|
||||
},
|
||||
],
|
||||
});
|
||||
await gExperiments._run();
|
||||
|
||||
// Check the active experiment.
|
||||
|
||||
item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
|
||||
Assert.ok(item, "Got add-on element.");
|
||||
item.parentNode.ensureElementIsVisible(item);
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
|
||||
is_element_visible(el, "Experiment state label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Active");
|
||||
}
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
|
||||
is_element_visible(el, "Experiment time label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "10 days remaining");
|
||||
}
|
||||
|
||||
// Disable it and check it's previous experiment entry.
|
||||
|
||||
await gExperiments.disableExperiment("experiment-3");
|
||||
|
||||
item = get_addon_element(gManagerWindow, "experiment-3");
|
||||
Assert.ok(item, "Got add-on element.");
|
||||
item.parentNode.ensureElementIsVisible(item);
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
|
||||
is_element_visible(el, "Experiment state label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Complete");
|
||||
}
|
||||
|
||||
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
|
||||
is_element_visible(el, "Experiment time label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "5 days ago");
|
||||
}
|
||||
});
|
||||
|
||||
add_task(async function testDetailView() {
|
||||
if (!gExperiments) {
|
||||
info("Skipping experiments test because that feature isn't available.");
|
||||
return;
|
||||
}
|
||||
|
||||
defineNow(gExperiments._policy, Date.now());
|
||||
await gExperiments._updateExperiments({
|
||||
"version": 1,
|
||||
"experiments": [
|
||||
{
|
||||
id: "experiment-4",
|
||||
xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
|
||||
xpiHash: "IRRELEVANT",
|
||||
startTime: Date.now() / 1000 - 3600,
|
||||
endTime: Date.now() / 1000 + 3600,
|
||||
maxActiveSeconds: 600,
|
||||
appName: [Services.appinfo.name],
|
||||
channel: [gExperiments._policy.updatechannel()],
|
||||
},
|
||||
],
|
||||
});
|
||||
await gExperiments._run();
|
||||
|
||||
// Check active experiment.
|
||||
|
||||
await openDetailsView("test-experiment1@experiments.mozilla.org");
|
||||
|
||||
let el = gManagerWindow.document.getElementById("detail-experiment-state");
|
||||
is_element_visible(el, "Experiment state label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Active");
|
||||
}
|
||||
|
||||
el = gManagerWindow.document.getElementById("detail-experiment-time");
|
||||
is_element_visible(el, "Experiment time label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Less than a day remaining");
|
||||
}
|
||||
|
||||
el = gManagerWindow.document.getElementById("detail-version");
|
||||
is_element_hidden(el, "detail-version should be hidden.");
|
||||
el = gManagerWindow.document.getElementById("detail-creator");
|
||||
is_element_hidden(el, "detail-creator should be hidden.");
|
||||
el = gManagerWindow.document.getElementById("detail-experiment-bullet");
|
||||
is_element_visible(el, "experiment-bullet should be visible.");
|
||||
|
||||
// Check previous experiment.
|
||||
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
await openDetailsView("experiment-3");
|
||||
|
||||
el = gManagerWindow.document.getElementById("detail-experiment-state");
|
||||
is_element_visible(el, "Experiment state label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "Complete");
|
||||
}
|
||||
|
||||
el = gManagerWindow.document.getElementById("detail-experiment-time");
|
||||
is_element_visible(el, "Experiment time label should be visible.");
|
||||
if (gIsEnUsLocale) {
|
||||
Assert.equal(el.value, "5 days ago");
|
||||
}
|
||||
|
||||
el = gManagerWindow.document.getElementById("detail-version");
|
||||
is_element_hidden(el, "detail-version should be hidden.");
|
||||
el = gManagerWindow.document.getElementById("detail-creator");
|
||||
is_element_hidden(el, "detail-creator should be hidden.");
|
||||
el = gManagerWindow.document.getElementById("detail-experiment-bullet");
|
||||
is_element_visible(el, "experiment-bullet should be visible.");
|
||||
});
|
||||
|
||||
add_task(async function testRemoveAndUndo() {
|
||||
if (!gExperiments) {
|
||||
info("Skipping experiments test because that feature isn't available.");
|
||||
return;
|
||||
}
|
||||
|
||||
await gCategoryUtilities.openType("experiment");
|
||||
|
||||
let addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
|
||||
Assert.ok(addon, "Got add-on element.");
|
||||
|
||||
await clickRemoveButton(addon);
|
||||
addon.parentNode.ensureElementIsVisible(addon);
|
||||
|
||||
let el = gManagerWindow.document.getAnonymousElementByAttribute(addon, "class", "pending");
|
||||
is_element_visible(el, "Uninstall undo information should be visible.");
|
||||
|
||||
await clickUndoButton(addon);
|
||||
addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
|
||||
Assert.ok(addon, "Got add-on element.");
|
||||
});
|
||||
|
||||
add_task(async function testCleanup() {
|
||||
if (gExperiments) {
|
||||
Services.prefs.clearUserPref("experiments.enabled");
|
||||
Services.prefs.setCharPref("experiments.manifest.uri", gSavedManifestURI);
|
||||
|
||||
// We perform the uninit/init cycle to purge any leftover state.
|
||||
await OS.File.remove(gExperiments._cacheFilePath);
|
||||
await gExperiments.uninit();
|
||||
await gExperiments.init();
|
||||
}
|
||||
|
||||
// Check post-conditions.
|
||||
let addons = await getExperimentAddons();
|
||||
Assert.equal(addons.length, 0, "No experiment add-ons are installed.");
|
||||
|
||||
await close_manager(gManagerWindow);
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user