view-browser.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*jshint esversion: 6 */
  2. class BrowserHost {
  3. constructor() {
  4. }
  5. get name() {
  6. return 'Netron';
  7. }
  8. initialize(view) {
  9. this._view = view;
  10. var fileElement = Array.from(document.getElementsByTagName('meta')).filter(e => e.name == 'file').shift();
  11. if (fileElement) {
  12. this._view.show('spinner');
  13. var file = fileElement.content;
  14. var request = new XMLHttpRequest();
  15. request.responseType = 'arraybuffer';
  16. request.onload = () => {
  17. if (request.status == 200) {
  18. var buffer = new Uint8Array(request.response);
  19. this._view.openBuffer(buffer, file, (err) => {
  20. if (err) {
  21. this.showError(err.toString());
  22. this._view.show(null);
  23. }
  24. else {
  25. document.title = file;
  26. }
  27. });
  28. }
  29. else {
  30. this._view.showError(request.status);
  31. }
  32. };
  33. request.onerror = () => {
  34. this._view.showError(request.status);
  35. };
  36. request.open('GET', '/data', true);
  37. request.send();
  38. }
  39. else {
  40. this._view.show('welcome');
  41. var openFileButton = document.getElementById('open-file-button');
  42. var openFileDialog = document.getElementById('open-file-dialog');
  43. if (openFileButton && openFileDialog) {
  44. openFileButton.addEventListener('click', (e) => {
  45. openFileDialog.value = '';
  46. openFileDialog.click();
  47. });
  48. openFileDialog.addEventListener('change', (e) => {
  49. if (e.target && e.target.files && e.target.files.length == 1) {
  50. this.openFile(e.target.files[0]);
  51. }
  52. });
  53. }
  54. document.addEventListener('dragover', (e) => {
  55. e.preventDefault();
  56. });
  57. document.addEventListener('drop', (e) => {
  58. e.preventDefault();
  59. });
  60. document.body.addEventListener('drop', (e) => {
  61. e.preventDefault();
  62. if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length == 1) {
  63. this.openFile(e.dataTransfer.files[0]);
  64. }
  65. return false;
  66. });
  67. }
  68. }
  69. showError(message) {
  70. alert(message);
  71. }
  72. import(file, callback) {
  73. var url = this.url(file);
  74. var script = document.createElement('script');
  75. script.onload = () => {
  76. callback(null);
  77. };
  78. script.onerror = (e) => {
  79. callback(new Error('The script \'' + e.target.src + '\' failed to load.'));
  80. };
  81. script.setAttribute('type', 'text/javascript');
  82. script.setAttribute('src', url);
  83. document.head.appendChild(script);
  84. }
  85. request(file, callback) {
  86. var url = this.url(file);
  87. var request = new XMLHttpRequest();
  88. if (file.endsWith('.pb')) {
  89. request.responseType = 'arraybuffer';
  90. }
  91. request.onload = () => {
  92. if (request.status == 200) {
  93. if (request.responseType == 'arraybuffer') {
  94. callback(null, new Uint8Array(request.response));
  95. }
  96. else {
  97. callback(null, request.responseText);
  98. }
  99. }
  100. else {
  101. callback(request.status, null);
  102. }
  103. };
  104. request.onerror = () => {
  105. callback(request.status, null);
  106. };
  107. request.open('GET', url, true);
  108. request.send();
  109. }
  110. url(file) {
  111. var url = file;
  112. if (window && window.location && window.location.href) {
  113. var location = window.location.href;
  114. if (location.endsWith('/')) {
  115. location = location.slice(0, -1);
  116. }
  117. url = location + file;
  118. }
  119. return url;
  120. }
  121. openURL(url) {
  122. window.open(url, '_target');
  123. }
  124. openFile(file) {
  125. this._view.show('spinner');
  126. this.openBuffer(file, (err) => {
  127. if (err) {
  128. this.showError(err.toString());
  129. this._view.show(null);
  130. return;
  131. }
  132. document.title = file.name;
  133. });
  134. }
  135. openBuffer(file, callback) {
  136. var size = file.size;
  137. var reader = new FileReader();
  138. reader.onloadend = () => {
  139. if (reader.error) {
  140. callback(reader.error);
  141. return;
  142. }
  143. var buffer = new Uint8Array(reader.result);
  144. this._view.openBuffer(buffer, file.name, (err) => {
  145. callback(err);
  146. });
  147. };
  148. reader.readAsArrayBuffer(file);
  149. }
  150. }
  151. window.host = new BrowserHost();