tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser_save_video.js (3989B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 var MockFilePicker = SpecialPowers.MockFilePicker;
      5 
      6 /**
      7 * TestCase for bug 564387
      8 * <https://bugzilla.mozilla.org/show_bug.cgi?id=564387>
      9 */
     10 async function testSaveVideo(isUsingHeader = true) {
     11  MockFilePicker.init(window.browsingContext);
     12  var fileName;
     13 
     14  let loadPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
     15  BrowserTestUtils.startLoadingURIString(
     16    gBrowser,
     17    "http://mochi.test:8888/browser/browser/base/content/test/general/web_video.html"
     18  );
     19  await loadPromise;
     20 
     21  let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown");
     22 
     23  await BrowserTestUtils.synthesizeMouseAtCenter(
     24    "#video1",
     25    { type: "contextmenu", button: 2 },
     26    gBrowser.selectedBrowser
     27  );
     28  info("context menu click on video1");
     29 
     30  await popupShownPromise;
     31 
     32  info("context menu opened on video1");
     33 
     34  // Create the folder the video will be saved into.
     35  var destDir = createTemporarySaveDirectory();
     36  var destFile = destDir.clone();
     37 
     38  MockFilePicker.displayDirectory = destDir;
     39  MockFilePicker.showCallback = function (fp) {
     40    fileName = fp.defaultString;
     41    destFile.append(fileName);
     42    MockFilePicker.setFiles([destFile]);
     43    MockFilePicker.filterIndex = 1; // kSaveAsType_URL
     44  };
     45 
     46  let transferCompletePromise = new Promise(resolve => {
     47    function onTransferComplete(downloadSuccess) {
     48      ok(
     49        downloadSuccess,
     50        "Video file should have been downloaded successfully"
     51      );
     52 
     53      if (isUsingHeader) {
     54        is(
     55          fileName,
     56          "web-video1-expectedName.webm",
     57          "Video file name is correctly retrieved from Content-Disposition http header"
     58        );
     59      }
     60      resolve();
     61    }
     62 
     63    mockTransferCallback = onTransferComplete;
     64    mockTransferRegisterer.register();
     65  });
     66 
     67  // Wrap in try...finally to ensure we clean up mocks and temp files.
     68  // We can't use registerCleanupFunction easily because we need to clean up
     69  // inside each task as well.
     70  try {
     71    // Select "Save Video As" option from context menu
     72    var saveVideoCommand = document.getElementById("context-savevideo");
     73    saveVideoCommand.doCommand();
     74    info("context-savevideo command executed");
     75 
     76    let contextMenu = document.getElementById("contentAreaContextMenu");
     77    let popupHiddenPromise = BrowserTestUtils.waitForEvent(
     78      contextMenu,
     79      "popuphidden"
     80    );
     81    contextMenu.hidePopup();
     82    await popupHiddenPromise;
     83 
     84    await transferCompletePromise;
     85  } finally {
     86    mockTransferRegisterer.unregister();
     87    MockFilePicker.cleanup();
     88    destDir.remove(true);
     89  }
     90 }
     91 
     92 Services.scriptloader.loadSubScript(
     93  "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js",
     94  this
     95 );
     96 
     97 function createTemporarySaveDirectory() {
     98  var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
     99  saveDir.append("testsavedir");
    100  if (!saveDir.exists()) {
    101    saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
    102  }
    103  return saveDir;
    104 }
    105 
    106 add_task(async function test_save_video_normal() {
    107  return testSaveVideo();
    108 });
    109 
    110 /**
    111 * Check that saving the file also works if the initial request times out.
    112 */
    113 add_task(async function test_save_video_timed_out_request() {
    114  await SpecialPowers.pushPrefEnv({
    115    set: [["browser.download.saveLinkAsFilenameTimeout", 0]],
    116  });
    117  /*
    118   * Note that this cannot rely on the header (we're deliberately trying to
    119   * test the case where we don't get the headers), but also cannot
    120   * assume that it is never present. That is, if network bits are very very
    121   * fast and/or our cancellation timeout fires late, we might be testing
    122   * the same thing as the previous test. So we just don't bother asserting
    123   * anything about the filename coming from the header - we just want to
    124   * make sure that the file is still saved in this case.
    125   */
    126  await testSaveVideo(/* isUsingHeader */ false);
    127  await SpecialPowers.popPrefEnv();
    128 });