Wed, 31 Dec 2014 06:09:35 +0100
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 });