Bug 1504159 - add test to verify we can save a mixed content image from the context menu, r=jkt a=jcristau
authorGijs Kruitbosch <gijskruitbosch@gmail.com>
Fri, 09 Nov 2018 10:59:52 +0000
changeset 498435 1c5b308487dcd3b785d5f910ea4b736e8aad0bf1
parent 498434 a9a646d4a15837e3e19f4f68253f953de3c30cbd
child 498436 aca73ccfac914d9659470c4c257ceb049b5603b6
push id10159
push userncsoregi@mozilla.com
push dateSun, 11 Nov 2018 18:41:31 +0000
treeherdermozilla-beta@aca73ccfac91 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjkt, jcristau
bugs1504159
milestone64.0
Bug 1504159 - add test to verify we can save a mixed content image from the context menu, r=jkt a=jcristau Depends on D11411 Differential Revision: https://phabricator.services.mozilla.com/D11412
dom/tests/browser/browser.ini
dom/tests/browser/browser_persist_mixed_content_image.js
dom/tests/browser/dummy.png
dom/tests/browser/test_mixed_content_image.html
--- a/dom/tests/browser/browser.ini
+++ b/dom/tests/browser/browser.ini
@@ -55,16 +55,20 @@ skip-if = !e10s || os != "win" || proces
 skip-if = !e10s || (os == "win" && processor == "x86") || (verify && debug && (os == 'linux')) || (os == 'linux') || (os == 'mac' && debug)  # Large-Allocation requires e10s # Bug 1336075
 [browser_localStorage_e10s.js]
 skip-if = !e10s || verify # This is a test of e10s functionality.
 [browser_localStorage_privatestorageevent.js]
 [browser_persist_cookies.js]
 support-files =
   set-samesite-cookies-and-redirect.sjs
   mimeme.sjs
+[browser_persist_mixed_content_image.js]
+support-files =
+  test_mixed_content_image.html
+  dummy.png
 [browser_test_focus_after_modal_state.js]
 skip-if = verify
 support-files =
   focus_after_prompt.html
 [browser_test_new_window_from_content.js]
 tags = openwindow
 skip-if = toolkit == 'android'  || (os == "linux" && debug) # see bug 1261495 for Linux debug time outs
 support-files =
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/browser_persist_mixed_content_image.js
@@ -0,0 +1,102 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const TEST_PATH = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "https://example.org");
+
+var MockFilePicker = SpecialPowers.MockFilePicker;
+MockFilePicker.init(window);
+
+registerCleanupFunction(async function() {
+  info("Running the cleanup code");
+  MockFilePicker.cleanup();
+  if (gTestDir && gTestDir.exists()) {
+    // On Windows, sometimes nsIFile.remove() throws, probably because we're
+    // still writing to the directory we're trying to remove, despite
+    // waiting for the download to complete. Just retry a bit later...
+    let succeeded = false;
+    while (!succeeded) {
+      try {
+        gTestDir.remove(true);
+        succeeded = true;
+      } catch (ex) {
+        await new Promise(requestAnimationFrame);
+      }
+    }
+  }
+});
+
+let gTestDir = null;
+
+function createTemporarySaveDirectory() {
+  var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
+  saveDir.append("testsavedir");
+  if (!saveDir.exists()) {
+    info("create testsavedir!");
+    saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+  }
+  info("return from createTempSaveDir: " + saveDir.path);
+  return saveDir;
+}
+
+
+add_task(async function test_image_download() {
+  await BrowserTestUtils.withNewTab(TEST_PATH + "test_mixed_content_image.html", async (browser) => {
+    // Add the image, and wait for it to load.
+    await ContentTask.spawn(browser, null, function() {
+      let loc = content.document.location.href;
+      let httpRoot = loc.replace("https", "http");
+      let imgloc = new content.URL("dummy.png", httpRoot);
+      let img = content.document.createElement("img");
+      img.src = imgloc;
+      return new Promise(resolve => {
+        img.onload = resolve;
+        content.document.body.appendChild(img);
+      });
+    });
+    gTestDir = createTemporarySaveDirectory();
+
+    let destFile = gTestDir.clone();
+
+    MockFilePicker.displayDirectory = gTestDir;
+    let fileName;
+    MockFilePicker.showCallback = function(fp) {
+      info("showCallback");
+      fileName = fp.defaultString;
+      info("fileName: " + fileName);
+      destFile.append(fileName);
+      info("path: " + destFile.path);
+      MockFilePicker.setFiles([destFile]);
+      MockFilePicker.filterIndex = 0; // just save the file
+      info("done showCallback");
+    };
+    let downloadFinishedPromise = new Promise(async (resolve) => {
+      let dls = await Downloads.getList(Downloads.PUBLIC);
+      dls.addView({
+        onDownloadChanged(download) {
+          info("Download changed!");
+          if (download.succeeded || download.error) {
+            info("Download succeeded or errored");
+            dls.removeView(this);
+            dls.removeFinished();
+            resolve(download);
+          }
+        }
+      });
+    });
+    // open the context menu.
+    let popup = document.getElementById("contentAreaContextMenu");
+    let popupShown = BrowserTestUtils.waitForEvent(popup, "popupshown");
+    BrowserTestUtils.synthesizeMouseAtCenter("img", {type: "contextmenu", button: 2}, browser);
+    await popupShown;
+    let popupHidden = BrowserTestUtils.waitForEvent(popup, "popuphidden");
+    popup.querySelector("#context-saveimage").click();
+    popup.hidePopup();
+    await popupHidden;
+    info("Context menu hidden, waiting for download to finish");
+    let imageDownload = await downloadFinishedPromise;
+    ok(imageDownload.succeeded, "Image should have downloaded successfully");
+  });
+
+});
copy from browser/themes/windows/preferences/saveFile.png
copy to dom/tests/browser/dummy.png
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/test_mixed_content_image.html
@@ -0,0 +1,1 @@
+<body></body>