DownloadURL.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* *
  2. *
  3. * (c) 2015-2020 Oystein Moseng
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * Mixin for downloading content in the browser
  10. *
  11. * */
  12. 'use strict';
  13. import Highcharts from '../Core/Globals.js';
  14. var win = Highcharts.win, nav = win.navigator, doc = win.document, domurl = win.URL || win.webkitURL || win, isEdgeBrowser = /Edge\/\d+/.test(nav.userAgent);
  15. /**
  16. * Convert base64 dataURL to Blob if supported, otherwise returns undefined.
  17. * @private
  18. * @function Highcharts.dataURLtoBlob
  19. * @param {string} dataURL
  20. * URL to convert
  21. * @return {string|undefined}
  22. * Blob
  23. */
  24. var dataURLtoBlob = Highcharts.dataURLtoBlob = function (dataURL) {
  25. var parts = dataURL.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/);
  26. if (parts &&
  27. parts.length > 3 &&
  28. win.atob &&
  29. win.ArrayBuffer &&
  30. win.Uint8Array &&
  31. win.Blob &&
  32. domurl.createObjectURL) {
  33. // Try to convert data URL to Blob
  34. var binStr = win.atob(parts[3]), buf = new win.ArrayBuffer(binStr.length), binary = new win.Uint8Array(buf), blob;
  35. for (var i = 0; i < binary.length; ++i) {
  36. binary[i] = binStr.charCodeAt(i);
  37. }
  38. blob = new win.Blob([binary], { 'type': parts[1] });
  39. return domurl.createObjectURL(blob);
  40. }
  41. };
  42. /**
  43. * Download a data URL in the browser. Can also take a blob as first param.
  44. *
  45. * @private
  46. * @function Highcharts.downloadURL
  47. * @param {string|global.URL} dataURL
  48. * The dataURL/Blob to download
  49. * @param {string} filename
  50. * The name of the resulting file (w/extension)
  51. * @return {void}
  52. */
  53. var downloadURL = Highcharts.downloadURL = function (dataURL, filename) {
  54. var a = doc.createElement('a'), windowRef;
  55. // IE specific blob implementation
  56. // Don't use for normal dataURLs
  57. if (typeof dataURL !== 'string' &&
  58. !(dataURL instanceof String) &&
  59. nav.msSaveOrOpenBlob) {
  60. nav.msSaveOrOpenBlob(dataURL, filename);
  61. return;
  62. }
  63. dataURL = "" + dataURL;
  64. // Some browsers have limitations for data URL lengths. Try to convert to
  65. // Blob or fall back. Edge always needs that blob.
  66. if (isEdgeBrowser || dataURL.length > 2000000) {
  67. dataURL = dataURLtoBlob(dataURL) || '';
  68. if (!dataURL) {
  69. throw new Error('Failed to convert to blob');
  70. }
  71. }
  72. // Try HTML5 download attr if supported
  73. if (typeof a.download !== 'undefined') {
  74. a.href = dataURL;
  75. a.download = filename; // HTML5 download attribute
  76. doc.body.appendChild(a);
  77. a.click();
  78. doc.body.removeChild(a);
  79. }
  80. else {
  81. // No download attr, just opening data URI
  82. try {
  83. windowRef = win.open(dataURL, 'chart');
  84. if (typeof windowRef === 'undefined' || windowRef === null) {
  85. throw new Error('Failed to open window');
  86. }
  87. }
  88. catch (e) {
  89. // window.open failed, trying location.href
  90. win.location.href = dataURL;
  91. }
  92. }
  93. };
  94. var exports = {
  95. dataURLtoBlob: dataURLtoBlob,
  96. downloadURL: downloadURL
  97. };
  98. export default exports;