Bug 1263031 modernize and clarify test, r=jaws
authorShane Caraveo <scaraveo@mozilla.com>
Wed, 20 Apr 2016 12:47:30 -0700
changeset 331951 4e06b79654439c156c079d58892c989faa18a227
parent 331950 a4d77316a361dc337c167c5cad3fc943e0f6a844
child 331952 59ce733181109d13ec748b94d2069ebe699be33b
push id6048
push userkmoir@mozilla.com
push dateMon, 06 Jun 2016 19:02:08 +0000
treeherdermozilla-beta@46d72a56c57d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjaws
bugs1263031
milestone48.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1263031 modernize and clarify test, r=jaws
browser/base/content/test/general/browser_save_private_link_perwindowpb.js
--- a/browser/base/content/test/general/browser_save_private_link_perwindowpb.js
+++ b/browser/base/content/test/general/browser_save_private_link_perwindowpb.js
@@ -1,140 +1,116 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-var {LoadContextInfo} = Cu.import("resource://gre/modules/LoadContextInfo.jsm", null);
+function createTemporarySaveDirectory() {
+  var saveDir = Cc["@mozilla.org/file/directory_service;1"]
+                  .getService(Ci.nsIProperties)
+                  .get("TmpD", Ci.nsIFile);
+  saveDir.append("testsavedir");
+  if (!saveDir.exists())
+    saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+  return saveDir;
+}
 
-function test() {
-  // initialization
-  waitForExplicitFinish();
-  let windowsToClose = [];
-  let testURI = "http://mochi.test:8888/browser/browser/base/content/test/general/bug792517.html";
-  let fileName;
-  let MockFilePicker = SpecialPowers.MockFilePicker;
-  let cache = Cc["@mozilla.org/netwerk/cache-storage-service;1"]
-              .getService(Ci.nsICacheStorageService);
-
-  function checkDiskCacheFor(filename, goon) {
+function promiseNoCacheEntry(filename) {
+  return new Promise((resolve, reject) => {
     Visitor.prototype = {
       onCacheStorageInfo: function(num, consumption)
       {
         info("disk storage contains " + num + " entries");
       },
       onCacheEntryInfo: function(uri)
       {
-        var urispec = uri.asciiSpec;
+        let urispec = uri.asciiSpec;
         info(urispec);
         is(urispec.includes(filename), false, "web content present in disk cache");
       },
       onCacheEntryVisitCompleted: function()
       {
-        goon();
+        resolve();
       }
     };
     function Visitor() {}
 
-    var storage = cache.diskCacheStorage(LoadContextInfo.default, false);
+    let cache = Cc["@mozilla.org/netwerk/cache-storage-service;1"]
+                .getService(Ci.nsICacheStorageService);
+    let {LoadContextInfo} = Cu.import("resource://gre/modules/LoadContextInfo.jsm", null);
+    let storage = cache.diskCacheStorage(LoadContextInfo.default, false);
     storage.asyncVisitStorage(new Visitor(), true /* Do walk entries */);
-  }
-
-  function onTransferComplete(downloadSuccess) {
-    ok(downloadSuccess, "Image file should have been downloaded successfully");
-
-    // Give the request a chance to finish and create a cache entry
-    executeSoon(function() {
-      checkDiskCacheFor(fileName, finish);
-      mockTransferCallback = null;
-    });
-  }
-
-  function createTemporarySaveDirectory() {
-    var saveDir = Cc["@mozilla.org/file/directory_service;1"]
-                    .getService(Ci.nsIProperties)
-                    .get("TmpD", Ci.nsIFile);
-    saveDir.append("testsavedir");
-    if (!saveDir.exists())
-      saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
-    return saveDir;
-  }
-
-  function doTest(aIsPrivateMode, aWindow, aCallback) {
-    function contextMenuOpened(event) {
-      cache.clear();
+  });
+}
 
-      aWindow.document.removeEventListener("popupshown", contextMenuOpened);
-
-      // Create the folder the image will be saved into.
-      var destDir = createTemporarySaveDirectory();
-      var destFile = destDir.clone();
-
-      MockFilePicker.displayDirectory = destDir;
-      MockFilePicker.showCallback = function(fp) {
-        fileName = fp.defaultString;
-        destFile.append (fileName);
-        MockFilePicker.returnFiles = [destFile];
-        MockFilePicker.filterIndex = 1; // kSaveAsType_URL
-      };
+function promiseImageDownloaded() {
+  return new Promise((resolve, reject) => {
+    let fileName;
+    let MockFilePicker = SpecialPowers.MockFilePicker;
+    MockFilePicker.init(window);
 
-      mockTransferCallback = onTransferComplete;
-      mockTransferRegisterer.register();
+    function onTransferComplete(downloadSuccess) {
+      ok(downloadSuccess, "Image file should have been downloaded successfully " + fileName);
 
-      registerCleanupFunction(function () {
-        mockTransferRegisterer.unregister();
-        MockFilePicker.cleanup();
-        destDir.remove(true);
-      });
-
-      // Select "Save Image As" option from context menu
-      var saveVideoCommand = aWindow.document.getElementById("context-saveimage");
-      saveVideoCommand.doCommand();
-
-      event.target.hidePopup();
+      // Give the request a chance to finish and create a cache entry
+      resolve(fileName);
     }
 
-    aWindow.gBrowser.addEventListener("pageshow", function pageShown(event) {
-      // If data: --url PAC file isn't loaded soon enough, we may get about:privatebrowsing loaded
-      if (event.target.location == "about:blank" ||
-          event.target.location == "about:privatebrowsing") {
-        aWindow.gBrowser.selectedBrowser.loadURI(testURI);
-        return;
-      }
-      aWindow.gBrowser.removeEventListener("pageshow", pageShown);
-
-      waitForFocus(function () {
-        aWindow.document.addEventListener("popupshown", contextMenuOpened, false);
-        var img = aWindow.gBrowser.selectedBrowser.contentDocument.getElementById("img");
-        EventUtils.synthesizeMouseAtCenter(img,
-                                           { type: "contextmenu", button: 2 },
-                                           aWindow.gBrowser.contentWindow);
-      }, aWindow.gBrowser.selectedBrowser);
-    });
-  }
+    // Create the folder the image will be saved into.
+    var destDir = createTemporarySaveDirectory();
+    var destFile = destDir.clone();
 
-  function testOnWindow(aOptions, aCallback) {
-    whenNewWindowLoaded(aOptions, function(aWin) {
-      windowsToClose.push(aWin);
-      // execute should only be called when need, like when you are opening
-      // web pages on the test. If calling executeSoon() is not necesary, then
-      // call whenNewWindowLoaded() instead of testOnWindow() on your test.
-      executeSoon(() => aCallback(aWin));
-    });
-  };
+    MockFilePicker.displayDirectory = destDir;
+    MockFilePicker.showCallback = function(fp) {
+      fileName = fp.defaultString;
+      destFile.append (fileName);
+      MockFilePicker.returnFiles = [destFile];
+      MockFilePicker.filterIndex = 1; // kSaveAsType_URL
+    };
 
-   // this function is called after calling finish() on the test.
-  registerCleanupFunction(function() {
-    windowsToClose.forEach(function(aWin) {
-      aWin.close();
+    mockTransferCallback = onTransferComplete;
+    mockTransferRegisterer.register();
+
+    registerCleanupFunction(function () {
+      mockTransferCallback = null;
+      mockTransferRegisterer.unregister();
+      MockFilePicker.cleanup();
+      destDir.remove(true);
     });
-  });
 
-  MockFilePicker.init(window);
-  // then test when on private mode
-  testOnWindow({private: true}, function(aWin) {
-    doTest(true, aWin, finish);
   });
 }
 
+add_task(function* () {
+  let testURI = "http://mochi.test:8888/browser/browser/base/content/test/general/bug792517.html";
+  let privateWindow = yield BrowserTestUtils.openNewBrowserWindow({private: true});
+  let tab = yield BrowserTestUtils.openNewForegroundTab(privateWindow.gBrowser, testURI);
+
+  let contextMenu = privateWindow.document.getElementById("contentAreaContextMenu");
+  let popupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
+  let popupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
+  yield BrowserTestUtils.synthesizeMouseAtCenter("#img", {
+    type: "contextmenu",
+    button: 2
+  }, tab.linkedBrowser);
+  yield popupShown;
+
+  let cache = Cc["@mozilla.org/netwerk/cache-storage-service;1"]
+              .getService(Ci.nsICacheStorageService);
+  cache.clear();
+
+  let imageDownloaded = promiseImageDownloaded();
+  // Select "Save Image As" option from context menu
+  privateWindow.document.getElementById("context-saveimage").doCommand();
+
+  contextMenu.hidePopup();
+  yield popupHidden;
+
+  // wait for image download
+  let fileName = yield imageDownloaded;
+  yield promiseNoCacheEntry(fileName);
+
+  yield BrowserTestUtils.closeWindow(privateWindow);
+});
+
 Cc["@mozilla.org/moz/jssubscript-loader;1"]
   .getService(Ci.mozIJSSubScriptLoader)
   .loadSubScript("chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js",
                  this);