Bug 1304273 - WIP rewrite of browser_offlineQuotaNotifications.js to fix timeout. Test passes on non-e10s but randomly fails on e10s. draft
authorJared Wein <jwein@mozilla.com>
Tue, 14 Feb 2017 16:38:01 -0500
changeset 484168 5090833f14813883314f74f8901f6c313b75ec2f
parent 483170 a6a6d6c7cbdc6f74ab8d2e51f4f2d2e103b26f95
child 484191 ce722c1aa3200fd3561774b229af9298442367be
child 484197 ccdc694eeb2536e9c7e5fa244a2b58f2fd039b17
push id45404
push userbmo:jaws@mozilla.com
push dateTue, 14 Feb 2017 21:39:40 +0000
bugs1304273
milestone54.0a1
Bug 1304273 - WIP rewrite of browser_offlineQuotaNotifications.js to fix timeout. Test passes on non-e10s but randomly fails on e10s. MozReview-Commit-ID: BF1ELuZ7Y62
browser/base/content/test/general/browser_offlineQuotaNotification.js
--- a/browser/base/content/test/general/browser_offlineQuotaNotification.js
+++ b/browser/base/content/test/general/browser_offlineQuotaNotification.js
@@ -8,86 +8,77 @@
 
 const URL = "http://mochi.test:8888/browser/browser/base/content/test/general/offlineQuotaNotification.html";
 
 registerCleanupFunction(function() {
   // Clean up after ourself
   let uri = Services.io.newURI(URL);
   let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
   Services.perms.removeFromPrincipal(principal, "offline-app");
-  Services.prefs.clearUserPref("offline-apps.quota.warn");
-  Services.prefs.clearUserPref("offline-apps.allow_by_default");
   let {OfflineAppCacheHelper} = Components.utils.import("resource:///modules/offlineAppCache.jsm", {});
   OfflineAppCacheHelper.clear();
 });
 
-// Same as the other one, but for in-content preferences
-function checkInContentPreferences(win) {
-  let doc = win.document;
-  let sel = doc.getElementById("categories").selectedItems[0].id;
-  let tab = doc.getElementById("advancedPrefs").selectedTab.id;
-  is(gBrowser.currentURI.spec, "about:preferences#advanced", "about:preferences loaded");
-  is(sel, "category-advanced", "Advanced pane was selected");
-  is(tab, "networkTab", "Network tab is selected");
-  // all good, we are done.
-  win.close();
-  finish();
-}
-
-function test() {
-  waitForExplicitFinish();
-
-  Services.prefs.setBoolPref("offline-apps.allow_by_default", false);
+add_task(function*() {
+  yield SpecialPowers.pushPrefEnv({set: [["offline-apps.allow_by_default", false]]});
 
   // Open a new tab.
-  gBrowser.selectedTab = gBrowser.addTab(URL);
-  registerCleanupFunction(() => gBrowser.removeCurrentTab());
-
+  yield BrowserTestUtils.withNewTab({gBrowser, url: URL}, function*(browser) {
+    let offlineStoragePopupPromise =
+      BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
 
-  Promise.all([
-    // Wait for a notification that asks whether to allow offline storage.
-    promiseNotification(),
-    // Wait for the tab to load.
-    BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser),
-  ]).then(() => {
     info("Loaded page, adding onCached handler");
     // Need a promise to keep track of when we've added our handler.
     let mm = gBrowser.selectedBrowser.messageManager;
     let onCachedAttached = BrowserTestUtils.waitForMessage(mm, "Test:OnCachedAttached");
     let gotCached = ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
       return new Promise(resolve => {
         content.window.applicationCache.oncached = function() {
           setTimeout(resolve, 0);
         };
         sendAsyncMessage("Test:OnCachedAttached");
       });
     });
-    gotCached.then(function() {
-      // We got cached - now we should have provoked the quota warning.
-      let notification = PopupNotifications.getNotification("offline-app-usage");
-      ok(notification, "have offline-app-usage notification");
-      // select the default action - this should cause the preferences
-      // tab to open - which we track via an "Initialized" event.
-      PopupNotifications.panel.firstElementChild.button.click();
-      let newTabBrowser = gBrowser.getBrowserForTab(gBrowser.selectedTab);
-      newTabBrowser.addEventListener("Initialized", function() {
-        executeSoon(function() {
-          checkInContentPreferences(newTabBrowser.contentWindow);
-        })
-      }, {capture: true, once: true});
+
+    // Wait for a notification that asks whether to allow offline storage.
+    info("Waiting for offlineStoragePopupPromise and onCachedAttached");
+    yield Promise.all([offlineStoragePopupPromise, onCachedAttached]);
+    info("The popup notification was shown and the cache has been attached.");
+    yield SpecialPowers.pushPrefEnv({set: [["offline-apps.quota.warn", 1]]});
+    info("The offline-apps.quota.warn pref has been set");
+
+    // Click the notification panel's "Allow" button.  This should kick
+    // off updates which will call our oncached handler above.
+    yield BrowserTestUtils.waitForCondition(() => PopupNotifications.panel.firstElementChild,
+      "Waiting for the PopupNotifications panel to be constructed");
+    info("About to click on the PopupNotifications panel's first button");
+    PopupNotifications.panel.firstElementChild.button.click();
+
+    yield gotCached;
+
+    // We got cached - now we should have provoked the quota warning.
+    let notification = PopupNotifications.getNotification("offline-app-usage");
+    ok(notification, "have offline-app-usage notification");
+
+    // select the default action - this should cause the preferences
+    // tab to open - which we track via an "Initialized" event.
+    yield BrowserTestUtils.waitForCondition(() => PopupNotifications.panel.firstElementChild,
+      "Waiting for the PopupNotifications panel to be constructed");
+    info("About to click on the PopupNotifications panel's first button again");
+    let preferencesTabOpened = BrowserTestUtils.waitForNewTab(gBrowser, "about:preferences#advanced");
+    PopupNotifications.panel.firstElementChild.button.click();
+    let newTab = yield preferencesTabOpened;
+    info("Preferences tab opened");
+
+    yield BrowserTestUtils.waitForEvent(newTab.linkedBrowser, "Initialized", true);
+    info("Got the Initialized event");
+
+    let [selectedPane, selectedTab] = yield ContentTask.spawn(newTab.linkedBrowser, null, function*() {
+      let sel = content.document.getElementById("categories").selectedItems[0].id;
+      let tab = content.document.getElementById("advancedPrefs").selectedTab.id;
+      return [sel, tab];
     });
-    onCachedAttached.then(function() {
-      Services.prefs.setIntPref("offline-apps.quota.warn", 1);
 
-      // Click the notification panel's "Allow" button.  This should kick
-      // off updates which will call our oncached handler above.
-      PopupNotifications.panel.firstElementChild.button.click();
-    });
+    is(selectedPane, "category-advanced", "Advanced pane was selected");
+    is(selectedTab, "networkTab", "Network tab is selected");
+    yield BrowserTestUtils.removeTab(newTab);
   });
-}
-
-function promiseNotification() {
-  return new Promise(resolve => {
-    PopupNotifications.panel.addEventListener("popupshown", function() {
-      resolve();
-    }, {once: true});
-  });
-}
+});