index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /* eslint-env es2015 */
  2. /* eslint-disable no-var */
  3. /* eslint-disable prefer-arrow-callback */
  4. /* eslint-disable prefer-template */
  5. /* eslint-disable prefer-destructuring */
  6. /* eslint-disable vars-on-top */
  7. window.exports = {};
  8. window.exports.require = function(id, callback) {
  9. let base = window.location.href || '';
  10. base = base.split('?')[0].split('#')[0];
  11. const index = base.lastIndexOf('/');
  12. base = index > 0 ? base.substring(0, index + 1) : base;
  13. base = base.lastIndexOf('/') === base.length - 1 ? base : base + '/';
  14. var url = base + id + '.js';
  15. var scripts = document.head.getElementsByTagName('script');
  16. for (var i = 0; i < scripts.length; i++) {
  17. if (url === scripts[i].getAttribute('src')) {
  18. throw new Error("Duplicate import of '" + url + "'.");
  19. }
  20. }
  21. var script = document.createElement('script');
  22. script.setAttribute('id', id);
  23. script.setAttribute('type', 'module');
  24. /* eslint-disable no-use-before-define */
  25. var loadHandler = function() {
  26. script.removeEventListener('load', loadHandler);
  27. script.removeEventListener('error', errorHandler);
  28. callback();
  29. };
  30. var errorHandler = function(e) {
  31. script.removeEventListener('load', loadHandler);
  32. script.removeEventListener('error', errorHandler);
  33. callback(null, new Error("The script '" + e.target.src + "' failed to load."));
  34. };
  35. /* eslint-enable no-use-before-define */
  36. script.addEventListener('load', loadHandler, false);
  37. script.addEventListener('error', errorHandler, false);
  38. script.setAttribute('src', url);
  39. document.head.appendChild(script);
  40. };
  41. window.exports.preload = function(callback) {
  42. var modules = [
  43. ['view'],
  44. ['json', 'xml', 'protobuf', 'hdf5', 'grapher', 'browser'],
  45. ['base', 'text', 'flatbuffers', 'flexbuffers', 'zip', 'tar', 'python']
  46. ];
  47. var next = function() {
  48. if (modules.length === 0) {
  49. callback();
  50. } else {
  51. var ids = modules.pop();
  52. /* eslint-disable no-loop-func */
  53. var resolved = ids.length;
  54. for (var i = 0; i < ids.length; i++) {
  55. window.exports.require(ids[i], function(module, error) {
  56. if (error) {
  57. callback(null, error);
  58. } else {
  59. resolved--;
  60. if (resolved === 0) {
  61. next();
  62. }
  63. }
  64. }, true);
  65. }
  66. /* eslint-enable no-loop-func */
  67. }
  68. };
  69. next();
  70. };
  71. window.exports.terminate = function(message) {
  72. document.getElementById('message-text').innerText = message;
  73. var button = document.getElementById('message-button');
  74. button.style.display = 'none';
  75. button.onclick = null;
  76. document.body.setAttribute('class', 'welcome message');
  77. if (window.__view__) {
  78. /* eslint-disable no-unused-vars */
  79. try {
  80. window.__view__.show('welcome message');
  81. } catch (error) {
  82. // continue regardless of error
  83. }
  84. /* eslint-enable no-unused-vars */
  85. }
  86. };
  87. window.addEventListener('error', function (event) {
  88. var error = event instanceof ErrorEvent && event.error && event.error instanceof Error ? event.error : new Error(event && event.message ? event.message : JSON.stringify(event));
  89. window.exports.terminate(error.message);
  90. });
  91. window.addEventListener('load', function() {
  92. if (typeof Symbol !== 'function' || typeof Symbol.asyncIterator !== 'symbol' ||
  93. typeof BigInt !== 'function' || typeof BigInt.asIntN !== 'function' || typeof BigInt.asUintN !== 'function' || typeof DataView.prototype.getBigInt64 !== 'function') {
  94. throw new Error('Please update your browser to use this application.');
  95. }
  96. var ua = window.navigator.userAgent;
  97. var chrome = ua.match(/Chrom(e|ium)\/([0-9]+)\./);
  98. var safari = ua.match(/Version\/(\d+).*Safari/);
  99. var firefox = ua.match(/Firefox\/([0-9]+)\./);
  100. if ((Array.isArray(chrome) && parseInt(chrome[2], 10) < 80) ||
  101. (Array.isArray(safari) && parseInt(safari[1], 10) < 15) ||
  102. (Array.isArray(firefox) && parseInt(firefox[1], 10) < 114)) {
  103. throw new Error('Please update your browser to use this application.');
  104. }
  105. window.exports.preload(function(value, error) {
  106. if (error) {
  107. window.exports.terminate(error.message);
  108. } else {
  109. var host = new window.exports.browser.Host();
  110. window.__view__ = new window.exports.view.View(host);
  111. window.__view__.start();
  112. }
  113. });
  114. });