toolkit/mozapps/extensions/test/browser/browser_experiments.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/
     3  */
     5 let {AddonTestUtils} = Components.utils.import("resource://testing-common/AddonManagerTesting.jsm", {});
     6 let {HttpServer} = Components.utils.import("resource://testing-common/httpd.js", {});
     8 let gManagerWindow;
     9 let gCategoryUtilities;
    10 let gExperiments;
    11 let gHttpServer;
    13 let gSavedManifestURI;
    14 let gIsEnUsLocale;
    16 const SEC_IN_ONE_DAY = 24 * 60 * 60;
    17 const MS_IN_ONE_DAY  = SEC_IN_ONE_DAY * 1000;
    19 function getExperimentAddons() {
    20   let deferred = Promise.defer();
    21   AddonManager.getAddonsByTypes(["experiment"], (addons) => {
    22     deferred.resolve(addons);
    23   });
    24   return deferred.promise;
    25 }
    27 function getInstallItem() {
    28   let doc = gManagerWindow.document;
    29   let view = doc.getElementById("view-port").selectedPanel;
    30   let list = doc.getElementById("addon-list");
    32   let node = list.firstChild;
    33   while (node) {
    34     if (node.getAttribute("status") == "installing") {
    35       return node;
    36     }
    37     node = node.nextSibling;
    38   }
    40   return null;
    41 }
    43 function patchPolicy(policy, data) {
    44   for (let key of Object.keys(data)) {
    45     Object.defineProperty(policy, key, {
    46       value: data[key],
    47       writable: true,
    48     });
    49   }
    50 }
    52 function defineNow(policy, time) {
    53   patchPolicy(policy, { now: () => new Date(time) });
    54 }
    56 function openDetailsView(aId) {
    57   let item = get_addon_element(gManagerWindow, aId);
    58   Assert.ok(item, "Should have got add-on element.");
    59   is_element_visible(item, "Add-on element should be visible.");
    61   EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow);
    62   EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow);
    64   let deferred = Promise.defer();
    65   wait_for_view_load(gManagerWindow, deferred.resolve);
    66   return deferred.promise;
    67 }
    69 function clickRemoveButton(addonElement) {
    70   let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "remove-btn");
    71   if (!btn) {
    72     return Promise.reject();
    73   }
    75   EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow);
    76   let deferred = Promise.defer();
    77   setTimeout(deferred.resolve, 0);
    78   return deferred;
    79 }
    81 function clickUndoButton(addonElement) {
    82   let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "undo-btn");
    83   if (!btn) {
    84     return Promise.reject();
    85   }
    87   EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow);
    88   let deferred = Promise.defer();
    89   setTimeout(deferred.resolve, 0);
    90   return deferred;
    91 }
    93 add_task(function* initializeState() {
    94   gManagerWindow = yield open_manager();
    95   gCategoryUtilities = new CategoryUtilities(gManagerWindow);
    97   registerCleanupFunction(() => {
    98     Services.prefs.clearUserPref("experiments.enabled");
    99     if (gHttpServer) {
   100       gHttpServer.stop(() => {});
   101       Services.prefs.clearUserPref("experiments.manifest.cert.checkAttributes");
   102       if (gSavedManifestURI !== undefined) {
   103         Services.prefs.setCharPref("experments.manifest.uri", gSavedManifestURI);
   104       }
   105     }
   106     if (gExperiments) {
   107       let tmp = {};
   108       Cu.import("resource:///modules/experiments/Experiments.jsm", tmp);
   109       gExperiments._policy = new tmp.Experiments.Policy();
   110     }
   111   });
   113   let chrome = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry);
   114   gIsEnUsLocale = chrome.getSelectedLocale("global") == "en-US";
   116   // The Experiments Manager will interfere with us by preventing installs
   117   // of experiments it doesn't know about. We remove it from the equation
   118   // because here we are only concerned with core Addon Manager operation,
   119   // not the superset Experiments Manager has imposed.
   120   if ("@mozilla.org/browser/experiments-service;1" in Components.classes) {
   121     let tmp = {};
   122     Cu.import("resource:///modules/experiments/Experiments.jsm", tmp);
   123     // There is a race condition between XPCOM service initialization and
   124     // this test running. We have to initialize the instance first, then
   125     // uninitialize it to prevent this.
   126     gExperiments = tmp.Experiments.instance();
   127     yield gExperiments._mainTask;
   128     yield gExperiments.uninit();
   129   }
   130 });
   132 // On an empty profile with no experiments, the experiment category
   133 // should be hidden.
   134 add_task(function* testInitialState() {
   135   Assert.ok(gCategoryUtilities.get("experiment", false), "Experiment tab is defined.");
   136   Assert.ok(!gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab hidden by default.");
   137 });
   139 add_task(function* testExperimentInfoNotVisible() {
   140   yield gCategoryUtilities.openType("extension");
   141   let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0];
   142   is_element_hidden(el, "Experiment info not visible on other types.");
   143 });
   145 // If we have an active experiment, we should see the experiments tab
   146 // and that tab should have some messages.
   147 add_task(function* testActiveExperiment() {
   148   let addon = yield install_addon("addons/browser_experiment1.xpi");
   150   Assert.ok(addon.userDisabled, "Add-on is disabled upon initial install.");
   151   Assert.equal(addon.isActive, false, "Add-on is not active.");
   153   Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible.");
   155   yield gCategoryUtilities.openType("experiment");
   156   let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0];
   157   is_element_visible(el, "Experiment info is visible on experiment tab.");
   158 });
   160 add_task(function* testExperimentLearnMore() {
   161   // Actual URL is irrelevant.
   162   Services.prefs.setCharPref("toolkit.telemetry.infoURL",
   163                              "http://mochi.test:8888/server.js");
   165   yield gCategoryUtilities.openType("experiment");
   166   let btn = gManagerWindow.document.getElementById("experiments-learn-more");
   168   if (!gUseInContentUI) {
   169     is_element_hidden(btn, "Learn more button hidden if not using in-content UI.");
   170     Services.prefs.clearUserPref("toolkit.telemetry.infoURL");
   172     return;
   173   }
   175   is_element_visible(btn, "Learn more button visible.");
   177   let deferred = Promise.defer();
   178   window.addEventListener("DOMContentLoaded", function onLoad(event) {
   179     info("Telemetry privacy policy window opened.");
   180     window.removeEventListener("DOMContentLoaded", onLoad, false);
   182     let browser = gBrowser.selectedTab.linkedBrowser;
   183     let expected = Services.prefs.getCharPref("toolkit.telemetry.infoURL");
   184     Assert.equal(browser.currentURI.spec, expected, "New tab should have loaded privacy policy.");
   185     browser.contentWindow.close();
   187     Services.prefs.clearUserPref("toolkit.telemetry.infoURL");
   189     deferred.resolve();
   190   }, false);
   192   info("Opening telemetry privacy policy.");
   193   EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow);
   195   yield deferred.promise;
   196 });
   198 add_task(function* testOpenPreferences() {
   199   yield gCategoryUtilities.openType("experiment");
   200   let btn = gManagerWindow.document.getElementById("experiments-change-telemetry");
   201   if (!gUseInContentUI) {
   202     is_element_hidden(btn, "Change telemetry button not enabled in out of window UI.");
   203     info("Skipping preferences open test because not using in-content UI.");
   204     return;
   205   }
   207   is_element_visible(btn, "Change telemetry button visible in in-content UI.");
   209   let deferred = Promise.defer();
   210   Services.obs.addObserver(function observer(prefWin, topic, data) {
   211     Services.obs.removeObserver(observer, "advanced-pane-loaded");
   213     info("Advanced preference pane opened.");
   215     // We want this test to fail if the preferences pane changes.
   216     let el = prefWin.document.getElementById("dataChoicesPanel");
   217     is_element_visible(el);
   219     prefWin.close();
   220     info("Closed preferences pane.");
   222     deferred.resolve();
   223   }, "advanced-pane-loaded", false);
   225   info("Loading preferences pane.");
   226   EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow);
   228   yield deferred.promise;
   229 });
   231 add_task(function* testButtonPresence() {
   232   yield gCategoryUtilities.openType("experiment");
   233   let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
   234   Assert.ok(item, "Got add-on element.");
   235   item.parentNode.ensureElementIsVisible(item);
   237   let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn");
   238   // Corresponds to the uninstall permission.
   239   is_element_visible(el, "Remove button is visible.");
   240   // Corresponds to lack of disable permission.
   241   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn");
   242   is_element_hidden(el, "Disable button not visible.");
   243   // Corresponds to lack of enable permission.
   244   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn");
   245   is_element_hidden(el, "Enable button not visible.");
   246 });
   248 // Remove the add-on we've been testing with.
   249 add_task(function* testCleanup() {
   250   yield AddonTestUtils.uninstallAddonByID("test-experiment1@experiments.mozilla.org");
   251   // Verify some conditions, just in case.
   252   let addons = yield getExperimentAddons();
   253   Assert.equal(addons.length, 0, "No experiment add-ons are installed.");
   254 });
   256 // The following tests should ideally live in browser/experiments/. However,
   257 // they rely on some of the helper functions from head.js, which can't easily
   258 // be consumed from other directories. So, they live here.
   260 add_task(function* testActivateExperiment() {
   261   if (!gExperiments) {
   262     info("Skipping experiments test because that feature isn't available.");
   263     return;
   264   }
   266   gHttpServer = new HttpServer();
   267   gHttpServer.start(-1);
   268   let root = "http://localhost:" + gHttpServer.identity.primaryPort + "/";
   269   gHttpServer.registerPathHandler("/manifest", (request, response) => {
   270     response.setStatusLine(null, 200, "OK");
   271     response.write(JSON.stringify({
   272       "version": 1,
   273       "experiments": [
   274         {
   275           id: "experiment-1",
   276           xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
   277           xpiHash: "IRRELEVANT",
   278           startTime: Date.now() / 1000 - 3600,
   279           endTime: Date.now() / 1000 + 3600,
   280           maxActiveSeconds: 600,
   281           appName: [Services.appinfo.name],
   282           channel: [gExperiments._policy.updatechannel()],
   283         },
   284       ],
   285     }));
   286     response.processAsync();
   287     response.finish();
   288   });
   290   Services.prefs.setBoolPref("experiments.manifest.cert.checkAttributes", false);
   291   gSavedManifestURI = Services.prefs.getCharPref("experiments.manifest.uri");
   292   Services.prefs.setCharPref("experiments.manifest.uri", root + "manifest");
   294   // We need to remove the cache file to help ensure consistent state.
   295   yield OS.File.remove(gExperiments._cacheFilePath);
   297   Services.prefs.setBoolPref("experiments.enabled", true);
   299   info("Initializing experiments service.");
   300   yield gExperiments.init();
   301   info("Experiments service finished first run.");
   303   // Check conditions, just to be sure.
   304   let experiments = yield gExperiments.getExperiments();
   305   Assert.equal(experiments.length, 0, "No experiments known to the service.");
   307   // This makes testing easier.
   308   gExperiments._policy.ignoreHashes = true;
   310   info("Manually updating experiments manifest.");
   311   yield gExperiments.updateManifest();
   312   info("Experiments update complete.");
   314   let deferred = Promise.defer();
   315   gHttpServer.stop(() => {
   316     gHttpServer = null;
   318     info("getting experiment by ID");
   319     AddonManager.getAddonByID("test-experiment1@experiments.mozilla.org", (addon) => {
   320       Assert.ok(addon, "Add-on installed via Experiments manager.");
   322       deferred.resolve();
   323     });
   324   });
   326   yield deferred.promise;
   328   Assert.ok(gCategoryUtilities.isTypeVisible, "experiment", "Experiment tab visible.");
   329   yield gCategoryUtilities.openType("experiment");
   330   let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0];
   331   is_element_visible(el, "Experiment info is visible on experiment tab.");
   332 });
   334 add_task(function testDeactivateExperiment() {
   335   if (!gExperiments) {
   336     return;
   337   }
   339   // Fake an empty manifest to purge data from previous manifest.
   340   yield gExperiments._updateExperiments({
   341     "version": 1,
   342     "experiments": [],
   343   });
   345   yield gExperiments.disableExperiment("testing");
   347   // We should have a record of the previously-active experiment.
   348   let experiments = yield gExperiments.getExperiments();
   349   Assert.equal(experiments.length, 1, "1 experiment is known.");
   350   Assert.equal(experiments[0].active, false, "Experiment is not active.");
   352   // We should have a previous experiment in the add-ons manager.
   353   let deferred = Promise.defer();
   354   AddonManager.getAddonsByTypes(["experiment"], (addons) => {
   355     deferred.resolve(addons);
   356   });
   357   let addons = yield deferred.promise;
   358   Assert.equal(addons.length, 1, "1 experiment add-on known.");
   359   Assert.ok(addons[0].appDisabled, "It is a previous experiment.");
   360   Assert.equal(addons[0].id, "experiment-1", "Add-on ID matches expected.");
   362   // Verify the UI looks sane.
   364   Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible.");
   365   let item = get_addon_element(gManagerWindow, "experiment-1");
   366   Assert.ok(item, "Got add-on element.");
   367   Assert.ok(!item.active, "Element should not be active.");
   368   item.parentNode.ensureElementIsVisible(item);
   370   // User control buttons should not be present because previous experiments
   371   // should have no permissions.
   372   let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn");
   373   is_element_hidden(el, "Remove button is not visible.");
   374   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn");
   375   is_element_hidden(el, "Disable button is not visible.");
   376   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn");
   377   is_element_hidden(el, "Enable button is not visible.");
   378   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "preferences-btn");
   379   is_element_hidden(el, "Preferences button is not visible.");
   380 });
   382 add_task(function testActivateRealExperiments() {
   383   if (!gExperiments) {
   384     info("Skipping experiments test because that feature isn't available.");
   385     return;
   386   }
   388   yield gExperiments._updateExperiments({
   389     "version": 1,
   390     "experiments": [
   391       {
   392         id: "experiment-2",
   393         xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
   394         xpiHash: "IRRELEVANT",
   395         startTime: Date.now() / 1000 - 3600,
   396         endTime: Date.now() / 1000 + 3600,
   397         maxActiveSeconds: 600,
   398         appName: [Services.appinfo.name],
   399         channel: [gExperiments._policy.updatechannel()],
   400       },
   401     ],
   402   });
   403   yield gExperiments._run();
   405   // Check the active experiment.
   407   let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
   408   Assert.ok(item, "Got add-on element.");
   409   item.parentNode.ensureElementIsVisible(item);
   411   let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
   412   is_element_visible(el, "Experiment state label should be visible.");
   413   if (gIsEnUsLocale) {
   414     Assert.equal(el.value, "Active");
   415   }
   417   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
   418   is_element_visible(el, "Experiment time label should be visible.");
   419   if (gIsEnUsLocale) {
   420     Assert.equal(el.value, "Less than a day remaining");
   421   }
   423   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container");
   424   is_element_hidden(el, "error-container should be hidden.");
   425   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container");
   426   is_element_hidden(el, "warning-container should be hidden.");
   427   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container");
   428   is_element_hidden(el, "pending-container should be hidden.");
   429   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "version");
   430   is_element_hidden(el, "version should be hidden.");
   431   el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix");
   432   is_element_hidden(el, "disabled-postfix should be hidden.");
   433   el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix");
   434   is_element_hidden(el, "update-postfix should be hidden.");
   435   el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet");
   436   is_element_visible(el, "experiment-bullet should be visible.");
   438   // Check the previous experiment.
   440   item = get_addon_element(gManagerWindow, "experiment-1");
   441   Assert.ok(item, "Got add-on element.");
   442   item.parentNode.ensureElementIsVisible(item);
   444   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
   445   is_element_visible(el, "Experiment state label should be visible.");
   446   if (gIsEnUsLocale) {
   447     Assert.equal(el.value, "Complete");
   448   }
   450   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
   451   is_element_visible(el, "Experiment time label should be visible.");
   452   if (gIsEnUsLocale) {
   453     Assert.equal(el.value, "Less than a day ago");
   454   }
   456   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container");
   457   is_element_hidden(el, "error-container should be hidden.");
   458   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container");
   459   is_element_hidden(el, "warning-container should be hidden.");
   460   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container");
   461   is_element_hidden(el, "pending-container should be hidden.");
   462   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "version");
   463   is_element_hidden(el, "version should be hidden.");
   464   el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix");
   465   is_element_hidden(el, "disabled-postfix should be hidden.");
   466   el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix");
   467   is_element_hidden(el, "update-postfix should be hidden.");
   468   el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet");
   469   is_element_visible(el, "experiment-bullet should be visible.");
   471   // Install an "older" experiment.
   473   yield gExperiments.disableExperiment("experiment-2");
   475   let now = Date.now();
   476   let fakeNow = now - 5 * MS_IN_ONE_DAY;
   477   defineNow(gExperiments._policy, fakeNow);
   479   yield gExperiments._updateExperiments({
   480     "version": 1,
   481     "experiments": [
   482       {
   483         id: "experiment-3",
   484         xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
   485         xpiHash: "IRRELEVANT",
   486         startTime: fakeNow / 1000 - SEC_IN_ONE_DAY,
   487         endTime: now / 1000 + 10 * SEC_IN_ONE_DAY,
   488         maxActiveSeconds: 100 * SEC_IN_ONE_DAY,
   489         appName: [Services.appinfo.name],
   490         channel: [gExperiments._policy.updatechannel()],
   491       },
   492     ],
   493   });
   494   yield gExperiments._run();
   496   // Check the active experiment.
   498   item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
   499   Assert.ok(item, "Got add-on element.");
   500   item.parentNode.ensureElementIsVisible(item);
   502   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
   503   is_element_visible(el, "Experiment state label should be visible.");
   504   if (gIsEnUsLocale) {
   505     Assert.equal(el.value, "Active");
   506   }
   508   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
   509   is_element_visible(el, "Experiment time label should be visible.");
   510   if (gIsEnUsLocale) {
   511     Assert.equal(el.value, "10 days remaining");
   512   }
   514   // Disable it and check it's previous experiment entry.
   516   yield gExperiments.disableExperiment("experiment-3");
   518   item = get_addon_element(gManagerWindow, "experiment-3");
   519   Assert.ok(item, "Got add-on element.");
   520   item.parentNode.ensureElementIsVisible(item);
   522   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state");
   523   is_element_visible(el, "Experiment state label should be visible.");
   524   if (gIsEnUsLocale) {
   525     Assert.equal(el.value, "Complete");
   526   }
   528   el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time");
   529   is_element_visible(el, "Experiment time label should be visible.");
   530   if (gIsEnUsLocale) {
   531     Assert.equal(el.value, "5 days ago");
   532   }
   533 });
   535 add_task(function testDetailView() {
   536   if (!gExperiments) {
   537     info("Skipping experiments test because that feature isn't available.");
   538     return;
   539   }
   541   defineNow(gExperiments._policy, Date.now());
   542   yield gExperiments._updateExperiments({
   543     "version": 1,
   544     "experiments": [
   545       {
   546         id: "experiment-4",
   547         xpiURL: TESTROOT + "addons/browser_experiment1.xpi",
   548         xpiHash: "IRRELEVANT",
   549         startTime: Date.now() / 1000 - 3600,
   550         endTime: Date.now() / 1000 + 3600,
   551         maxActiveSeconds: 600,
   552         appName: [Services.appinfo.name],
   553         channel: [gExperiments._policy.updatechannel()],
   554       },
   555     ],
   556   });
   557   yield gExperiments._run();
   559   // Check active experiment.
   561   yield openDetailsView("test-experiment1@experiments.mozilla.org");
   563   let el = gManagerWindow.document.getElementById("detail-experiment-state");
   564   is_element_visible(el, "Experiment state label should be visible.");
   565   if (gIsEnUsLocale) {
   566     Assert.equal(el.value, "Active");
   567   }
   569   el = gManagerWindow.document.getElementById("detail-experiment-time");
   570   is_element_visible(el, "Experiment time label should be visible.");
   571   if (gIsEnUsLocale) {
   572     Assert.equal(el.value, "Less than a day remaining");
   573   }
   575   el = gManagerWindow.document.getElementById("detail-version");
   576   is_element_hidden(el, "detail-version should be hidden.");
   577   el = gManagerWindow.document.getElementById("detail-creator");
   578   is_element_hidden(el, "detail-creator should be hidden.");
   579   el = gManagerWindow.document.getElementById("detail-experiment-bullet");
   580   is_element_visible(el, "experiment-bullet should be visible.");
   582   // Check previous experiment.
   584   yield gCategoryUtilities.openType("experiment");
   585   yield openDetailsView("experiment-3");
   587   let el = gManagerWindow.document.getElementById("detail-experiment-state");
   588   is_element_visible(el, "Experiment state label should be visible.");
   589   if (gIsEnUsLocale) {
   590     Assert.equal(el.value, "Complete");
   591   }
   593   el = gManagerWindow.document.getElementById("detail-experiment-time");
   594   is_element_visible(el, "Experiment time label should be visible.");
   595   if (gIsEnUsLocale) {
   596     Assert.equal(el.value, "5 days ago");
   597   }
   599   el = gManagerWindow.document.getElementById("detail-version");
   600   is_element_hidden(el, "detail-version should be hidden.");
   601   el = gManagerWindow.document.getElementById("detail-creator");
   602   is_element_hidden(el, "detail-creator should be hidden.");
   603   el = gManagerWindow.document.getElementById("detail-experiment-bullet");
   604   is_element_visible(el, "experiment-bullet should be visible.");
   605 });
   607 add_task(function* testRemoveAndUndo() {
   608   if (!gExperiments) {
   609     info("Skipping experiments test because that feature isn't available.");
   610     return;
   611   }
   613   yield gCategoryUtilities.openType("experiment");
   615   let addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
   616   Assert.ok(addon, "Got add-on element.");
   618   yield clickRemoveButton(addon);
   619   addon.parentNode.ensureElementIsVisible(addon);
   621   let el = gManagerWindow.document.getAnonymousElementByAttribute(addon, "class", "pending");
   622   is_element_visible(el, "Uninstall undo information should be visible.");
   624   yield clickUndoButton(addon);
   625   addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
   626   Assert.ok(addon, "Got add-on element.");
   627 });
   629 add_task(function* testCleanup() {
   630   if (gExperiments) {
   631     Services.prefs.clearUserPref("experiments.enabled");
   632     Services.prefs.clearUserPref("experiments.manifest.cert.checkAttributes");
   633     Services.prefs.setCharPref("experiments.manifest.uri", gSavedManifestURI);
   635     // We perform the uninit/init cycle to purge any leftover state.
   636     yield OS.File.remove(gExperiments._cacheFilePath);
   637     yield gExperiments.uninit();
   638     yield gExperiments.init();
   639   }
   641   // Check post-conditions.
   642   let addons = yield getExperimentAddons();
   643   Assert.equal(addons.length, 0, "No experiment add-ons are installed.");
   645   yield close_manager(gManagerWindow);
   646 });

mercurial