mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-27 21:38:34 +00:00
83 lines
2.4 KiB
JavaScript
83 lines
2.4 KiB
JavaScript
/* 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/. */
|
|
|
|
/* eslint-env browser */
|
|
|
|
"use strict";
|
|
|
|
const {
|
|
TAKE_SCREENSHOT_START,
|
|
TAKE_SCREENSHOT_END,
|
|
} = require("./index");
|
|
|
|
const { getFormatStr } = require("../utils/l10n");
|
|
const { getToplevelWindow } = require("sdk/window/utils");
|
|
const { Task: { spawn } } = require("devtools/shared/task");
|
|
const e10s = require("../utils/e10s");
|
|
|
|
const CAMERA_AUDIO_URL = "resource://devtools/client/themes/audio/shutter.wav";
|
|
|
|
const animationFrame = () => new Promise(resolve => {
|
|
window.requestAnimationFrame(resolve);
|
|
});
|
|
|
|
function getFileName() {
|
|
let date = new Date();
|
|
let month = ("0" + (date.getMonth() + 1)).substr(-2);
|
|
let day = ("0" + date.getDate()).substr(-2);
|
|
let dateString = [date.getFullYear(), month, day].join("-");
|
|
let timeString = date.toTimeString().replace(/:/g, ".").split(" ")[0];
|
|
|
|
return getFormatStr("responsive.screenshotGeneratedFilename", dateString,
|
|
timeString);
|
|
}
|
|
|
|
function createScreenshotFor(node) {
|
|
let mm = node.frameLoader.messageManager;
|
|
|
|
return e10s.request(mm, "RequestScreenshot");
|
|
}
|
|
|
|
function saveToFile(data, filename) {
|
|
return spawn(function* () {
|
|
const chromeWindow = getToplevelWindow(window);
|
|
const chromeDocument = chromeWindow.document;
|
|
|
|
// append .png extension to filename if it doesn't exist
|
|
filename = filename.replace(/\.png$|$/i, ".png");
|
|
|
|
chromeWindow.saveURL(data, filename, null,
|
|
true, true,
|
|
chromeDocument.documentURIObject, chromeDocument);
|
|
});
|
|
}
|
|
|
|
function simulateCameraEffects(node) {
|
|
let cameraAudio = new window.Audio(CAMERA_AUDIO_URL);
|
|
cameraAudio.play();
|
|
node.animate({ opacity: [ 0, 1 ] }, 500);
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
takeScreenshot() {
|
|
return function* (dispatch, getState) {
|
|
yield dispatch({ type: TAKE_SCREENSHOT_START });
|
|
|
|
// Waiting the next repaint, to ensure the react components
|
|
// can be properly render after the action dispatched above
|
|
yield animationFrame();
|
|
|
|
let iframe = document.querySelector("iframe");
|
|
let data = yield createScreenshotFor(iframe);
|
|
|
|
simulateCameraEffects(iframe);
|
|
|
|
yield saveToFile(data, getFileName());
|
|
|
|
dispatch({ type: TAKE_SCREENSHOT_END });
|
|
};
|
|
}
|
|
};
|