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