terriajs
Version:
Geospatial data visualization platform.
71 lines (61 loc) • 2.33 kB
JavaScript
const when = require('terriajs-cesium/Source/ThirdParty/when');
const TerriaError = require('./TerriaError');
/**
* Tells the web browser to print a given window, which my be an iframe window, and
* returns a promise that resolves when printing is safely over so that, for example
* the window can be removed.
* @param {Window} windowToPrint The window to print.
* @returns {Promise} A promise that resolves when printing is safely over. The prommise is rejected if
* there is no indication that the browser's print
*/
function printWindow(windowToPrint) {
const deferred = when.defer();
let printInProgressCount = 0;
const timeout = setTimeout(function() {
deferred.reject(new TerriaError({
title: 'Error printing',
message: 'Printing did not start within 10 seconds. Maybe this web browser does not support printing?'
}));
}, 10000);
function cancelTimeout() {
clearTimeout(timeout);
}
function resolveIfZero() {
if (printInProgressCount <= 0) {
deferred.resolve();
}
}
if (windowToPrint.matchMedia) {
windowToPrint.matchMedia('print').addListener(function (evt) {
cancelTimeout();
if (evt.matches) {
console.log('print media start');
++printInProgressCount;
} else {
console.log('print media end');
--printInProgressCount;
resolveIfZero();
}
});
}
windowToPrint.onbeforeprint = function () {
cancelTimeout();
console.log('onbeforeprint');
++printInProgressCount;
};
windowToPrint.onafterprint = function () {
cancelTimeout();
console.log('onafterprint');
--printInProgressCount;
resolveIfZero();
};
// First try printing with execCommand, because, in IE11, `printWindow.print()`
// prints the entire page instead of just the embedded iframe (if the window
// is an iframe, anyway).
const result = windowToPrint.document.execCommand('print', true, null);
if (!result) {
windowToPrint.print();
}
return deferred.promise;
}
module.exports = printWindow;