| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | /* * * Mixin for downloading content in the browser * * (c) 2015-2019 Oystein Moseng * * License: www.highcharts.com/license */'use strict';import Highcharts from '../parts/Globals.js';var win = Highcharts.win,    nav = win.navigator,    doc = win.document,    domurl = win.URL || win.webkitURL || win,    isEdgeBrowser = /Edge\/\d+/.test(nav.userAgent);// Convert base64 dataURL to Blob if supported, otherwise returns undefinedHighcharts.dataURLtoBlob = function (dataURL) {    var parts = dataURL.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        var binStr = win.atob(parts[3]),            buf = new win.ArrayBuffer(binStr.length),            binary = new win.Uint8Array(buf),            blob;        for (var i = 0; i < binary.length; ++i) {            binary[i] = binStr.charCodeAt(i);        }        blob = new win.Blob([binary], { 'type': parts[1] });        return domurl.createObjectURL(blob);    }};/** * Download a data URL in the browser. Can also take a blob as first param. * * @private * @function Highcharts.downloadURL * * @param {string|object} dataURL *        The dataURL/Blob to download * * @param {string} filename *        The name of the resulting file (w/extension) */Highcharts.downloadURL = function (dataURL, filename) {    var a = doc.createElement('a'),        windowRef;    // IE specific blob implementation    // Don't use for normal dataURLs    if (        typeof dataURL !== 'string' &&        !(dataURL instanceof String) &&        nav.msSaveOrOpenBlob    ) {        nav.msSaveOrOpenBlob(dataURL, filename);        return;    }    // Some browsers have limitations for data URL lengths. Try to convert to    // Blob or fall back. Edge always needs that blob.    if (isEdgeBrowser || dataURL.length > 2000000) {        dataURL = Highcharts.dataURLtoBlob(dataURL);        if (!dataURL) {            throw new Error('Failed to convert to blob');        }    }    // Try HTML5 download attr if supported    if (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 {            windowRef = win.open(dataURL, 'chart');            if (windowRef === undefined || windowRef === null) {                throw new Error('Failed to open window');            }        } catch (e) {            // window.open failed, trying location.href            win.location.href = dataURL;        }    }};
 |