tor-browser

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

browser_save_video_frame.js (3157B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 const VIDEO_URL =
      5  "http://mochi.test:8888/browser/browser/base/content/test/general/web_video.html";
      6 
      7 /**
      8 * mockTransfer.js provides a utility that lets us mock out
      9 * the "Save File" dialog.
     10 */
     11 Services.scriptloader.loadSubScript(
     12  "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js",
     13  this
     14 );
     15 
     16 /**
     17 * Creates and returns an nsIFile for a new temporary save
     18 * directory.
     19 *
     20 * @return nsIFile
     21 */
     22 function createTemporarySaveDirectory() {
     23  let saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
     24  saveDir.append("testsavedir");
     25  if (!saveDir.exists()) {
     26    saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
     27  }
     28  return saveDir;
     29 }
     30 /**
     31 * MockTransfer exposes a "mockTransferCallback" global which
     32 * allows us to define a callback to be called once the mock file
     33 * selector has selected where to save the file.
     34 */
     35 function waitForTransferComplete() {
     36  return new Promise(resolve => {
     37    mockTransferCallback = () => {
     38      ok(true, "Transfer completed");
     39      mockTransferCallback = () => {};
     40      resolve();
     41    };
     42  });
     43 }
     44 
     45 /**
     46 * Loads a page with a <video> element, right-clicks it and chooses
     47 * to save a frame screenshot to the disk. Completes once we've
     48 * verified that the frame has been saved to disk.
     49 */
     50 add_task(async function () {
     51  let MockFilePicker = SpecialPowers.MockFilePicker;
     52  MockFilePicker.init(window.browsingContext);
     53 
     54  // Create the folder the video will be saved into.
     55  let destDir = createTemporarySaveDirectory();
     56  let destFile = destDir.clone();
     57 
     58  MockFilePicker.displayDirectory = destDir;
     59  MockFilePicker.showCallback = function (fp) {
     60    destFile.append(fp.defaultString);
     61    MockFilePicker.setFiles([destFile]);
     62    MockFilePicker.filterIndex = 1; // kSaveAsType_URL
     63  };
     64 
     65  mockTransferRegisterer.register();
     66 
     67  // Make sure that we clean these things up when we're done.
     68  registerCleanupFunction(function () {
     69    mockTransferRegisterer.unregister();
     70    MockFilePicker.cleanup();
     71    destDir.remove(true);
     72  });
     73 
     74  let tab = BrowserTestUtils.addTab(gBrowser);
     75  gBrowser.selectedTab = tab;
     76  let browser = tab.linkedBrowser;
     77  info("Loading video tab");
     78  await BrowserTestUtils.loadURIString({
     79    browser: tab.linkedBrowser,
     80    uriString: VIDEO_URL,
     81  });
     82  info("Video tab loaded.");
     83 
     84  let context = document.getElementById("contentAreaContextMenu");
     85  let popupPromise = promisePopupShown(context);
     86 
     87  info("Synthesizing right-click on video element");
     88  await BrowserTestUtils.synthesizeMouseAtCenter(
     89    "#video1",
     90    { type: "contextmenu", button: 2 },
     91    browser
     92  );
     93  info("Waiting for popup to fire popupshown.");
     94  await popupPromise;
     95  info("Popup fired popupshown");
     96 
     97  let saveSnapshotCommand = document.getElementById("context-video-saveimage");
     98  let promiseTransfer = waitForTransferComplete();
     99  info("Firing save snapshot command");
    100  saveSnapshotCommand.doCommand();
    101  context.hidePopup();
    102  info("Waiting for transfer completion");
    103  await promiseTransfer;
    104  info("Transfer complete");
    105  gBrowser.removeTab(tab);
    106 });