126 lines
3.3 KiB
JavaScript
126 lines
3.3 KiB
JavaScript
|
/* *
|
||
|
*
|
||
|
* (c) 2015-2024 Oystein Moseng
|
||
|
*
|
||
|
* License: www.highcharts.com/license
|
||
|
*
|
||
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
||
|
*
|
||
|
* Mixin for downloading content in the browser
|
||
|
*
|
||
|
* */
|
||
|
'use strict';
|
||
|
/* *
|
||
|
*
|
||
|
* Imports
|
||
|
*
|
||
|
* */
|
||
|
import H from '../Core/Globals.js';
|
||
|
const { isSafari, win, win: { document: doc } } = H;
|
||
|
/* *
|
||
|
*
|
||
|
* Constants
|
||
|
*
|
||
|
* */
|
||
|
const domurl = win.URL || win.webkitURL || win;
|
||
|
/* *
|
||
|
*
|
||
|
* Functions
|
||
|
*
|
||
|
* */
|
||
|
/**
|
||
|
* Convert base64 dataURL to Blob if supported, otherwise returns undefined.
|
||
|
* @private
|
||
|
* @function Highcharts.dataURLtoBlob
|
||
|
* @param {string} dataURL
|
||
|
* URL to convert
|
||
|
* @return {string|undefined}
|
||
|
* Blob
|
||
|
*/
|
||
|
function dataURLtoBlob(dataURL) {
|
||
|
const parts = dataURL
|
||
|
.replace(/filename=.*;/, '')
|
||
|
.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/);
|
||
|
if (parts &&
|
||
|
parts.length > 3 &&
|
||
|
(win.atob) &&
|
||
|
win.ArrayBuffer &&
|
||
|
win.Uint8Array &&
|
||
|
win.Blob &&
|
||
|
(domurl.createObjectURL)) {
|
||
|
// Try to convert data URL to Blob
|
||
|
const binStr = win.atob(parts[3]), buf = new win.ArrayBuffer(binStr.length), binary = new win.Uint8Array(buf);
|
||
|
for (let i = 0; i < binary.length; ++i) {
|
||
|
binary[i] = binStr.charCodeAt(i);
|
||
|
}
|
||
|
return domurl
|
||
|
.createObjectURL(new win.Blob([binary], { 'type': parts[1] }));
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Download a data URL in the browser. Can also take a blob as first param.
|
||
|
*
|
||
|
* @private
|
||
|
* @function Highcharts.downloadURL
|
||
|
* @param {string|global.URL} dataURL
|
||
|
* The dataURL/Blob to download
|
||
|
* @param {string} filename
|
||
|
* The name of the resulting file (w/extension)
|
||
|
* @return {void}
|
||
|
*/
|
||
|
function downloadURL(dataURL, filename) {
|
||
|
const nav = win.navigator, a = doc.createElement('a');
|
||
|
// IE specific blob implementation
|
||
|
// Don't use for normal dataURLs
|
||
|
if (typeof dataURL !== 'string' &&
|
||
|
!(dataURL instanceof String) &&
|
||
|
nav.msSaveOrOpenBlob) {
|
||
|
nav.msSaveOrOpenBlob(dataURL, filename);
|
||
|
return;
|
||
|
}
|
||
|
dataURL = '' + dataURL;
|
||
|
const // Some browsers have limitations for data URL lengths. Try to convert
|
||
|
// to Blob or fall back. Edge always needs that blob.
|
||
|
isOldEdgeBrowser = /Edge\/\d+/.test(nav.userAgent),
|
||
|
// Safari on iOS needs Blob in order to download PDF
|
||
|
safariBlob = (isSafari &&
|
||
|
typeof dataURL === 'string' &&
|
||
|
dataURL.indexOf('data:application/pdf') === 0);
|
||
|
if (safariBlob || isOldEdgeBrowser || dataURL.length > 2000000) {
|
||
|
dataURL = dataURLtoBlob(dataURL) || '';
|
||
|
if (!dataURL) {
|
||
|
throw new Error('Failed to convert to blob');
|
||
|
}
|
||
|
}
|
||
|
// Try HTML5 download attr if supported
|
||
|
if (typeof a.download !== 'undefined') {
|
||
|
a.href = dataURL;
|
||
|
a.download = filename; // HTML5 download attribute
|
||
|
doc.body.appendChild(a);
|
||
|
a.click();
|
||
|
doc.body.removeChild(a);
|
||
|
}
|
||
|
else {
|
||
|
// No download attr, just opening data URI
|
||
|
try {
|
||
|
if (!win.open(dataURL, 'chart')) {
|
||
|
throw new Error('Failed to open window');
|
||
|
}
|
||
|
}
|
||
|
catch {
|
||
|
// If window.open failed, try location.href
|
||
|
win.location.href = dataURL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
/* *
|
||
|
*
|
||
|
* Default Export
|
||
|
*
|
||
|
* */
|
||
|
const DownloadURL = {
|
||
|
dataURLtoBlob,
|
||
|
downloadURL
|
||
|
};
|
||
|
export default DownloadURL;
|