webview.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /**
  2. Template Controllers
  3. @module Templates
  4. */
  5. /**
  6. The tab template
  7. @class [template] views_webview
  8. @constructor
  9. */
  10. Template['views_webview'].onRendered(function() {
  11. var template = this,
  12. tabId = template.data._id,
  13. webview = template.find('webview');
  14. ipc.on('uiAction_reloadSelectedTab', function(e) {
  15. console.log('uiAction_reloadSelectedTab', LocalStore.get('selectedTab'));
  16. if (LocalStore.get('selectedTab') === this._id) {
  17. var webview = Helpers.getWebview(LocalStore.get('selectedTab'));
  18. webview.reload();
  19. }
  20. });
  21. webview.addEventListener('did-start-loading', function(e) {
  22. TemplateVar.set(template, 'loading', true);
  23. });
  24. webview.addEventListener('did-stop-loading', function(e) {
  25. TemplateVar.set(template, 'loading', false);
  26. });
  27. // change url
  28. webview.addEventListener(
  29. 'did-navigate',
  30. webviewChangeUrl.bind(webview, tabId)
  31. );
  32. webview.addEventListener(
  33. 'did-navigate-in-page',
  34. webviewChangeUrl.bind(webview, tabId)
  35. );
  36. webview.addEventListener(
  37. 'did-get-redirect-request',
  38. webviewChangeUrl.bind(webview, tabId)
  39. );
  40. webview.addEventListener(
  41. 'did-stop-loading',
  42. webviewChangeUrl.bind(webview, tabId)
  43. );
  44. // set page history
  45. webview.addEventListener('dom-ready', function(e) {
  46. var titleFull = webview.getTitle(),
  47. title = titleFull;
  48. if (titleFull && titleFull.length > 40) {
  49. title = titleFull.substr(0, 40);
  50. title += '…';
  51. }
  52. // update the title
  53. Tabs.update(tabId, {
  54. $set: {
  55. name: title,
  56. nameFull: titleFull
  57. // url: webview.getURL(),
  58. }
  59. });
  60. webviewLoadStop.call(this, tabId, e);
  61. });
  62. // show error pages
  63. webview.addEventListener('did-fail-load', showError.bind(webview, tabId));
  64. webview.addEventListener('crashed', showError.bind(webview, tabId));
  65. // Forward SWARM status code errors to showError
  66. webview.addEventListener('did-get-response-details', function(e) {
  67. if (e && e.resourceType === 'mainFrame' && /^bzz:\//i.test(e.newURL)) {
  68. switch (e.httpResponseCode) {
  69. case 500:
  70. showError.call(webview, tabId, {
  71. isMainFrame: true,
  72. errorCode: 404
  73. });
  74. break;
  75. }
  76. }
  77. });
  78. // navigate page, and redirect to browser tab if necessary
  79. webview.addEventListener(
  80. 'will-navigate',
  81. webviewLoadStart.bind(webview, tabId)
  82. );
  83. webview.addEventListener(
  84. 'did-get-redirect-request',
  85. webviewLoadStart.bind(webview, tabId)
  86. );
  87. webview.addEventListener('new-window', webviewLoadStart.bind(webview, tabId));
  88. // MIST API for installed tabs/dapps
  89. webview.addEventListener(
  90. 'ipc-message',
  91. mistAPIBackend.bind({
  92. template: template,
  93. webview: webview
  94. })
  95. );
  96. });
  97. Template['views_webview'].helpers({
  98. /**
  99. Gets the correct preloader file
  100. @method (preloaderFile)
  101. */
  102. preloaderFile: function() {
  103. switch (this._id) {
  104. case 'browser':
  105. return 'file://' + Helpers.preloaderDirname + '/browser.js';
  106. case 'tests':
  107. return 'file://' + Helpers.preloaderDirname + '/tests.js';
  108. default:
  109. return 'file://' + Helpers.preloaderDirname + '/dapps.js';
  110. }
  111. },
  112. /**
  113. Determines if the current tab is visible
  114. @method (isVisible)
  115. */
  116. isVisible: function() {
  117. return LocalStore.get('selectedTab') === this._id ? '' : 'hidden';
  118. },
  119. /**
  120. Gets the current url
  121. @method (checkedUrl)
  122. */
  123. checkedUrl: function() {
  124. var template = Template.instance();
  125. var tab = Tabs.findOne(this._id, { fields: { redirect: 1 } });
  126. var url;
  127. if (tab) {
  128. // set url only once
  129. if (tab.redirect) {
  130. url = tab.redirect;
  131. // remove redirect
  132. Tabs.update(this._id, {
  133. $unset: {
  134. redirect: ''
  135. }
  136. });
  137. }
  138. // allow error pages
  139. if (url && url.indexOf(`file://${dirname}/errorPages/`) === 0) {
  140. return url;
  141. }
  142. // allow local wallet
  143. if (url && url.indexOf(`file://${dirname}/wallet/index.html`) === 0) {
  144. return url;
  145. }
  146. // CHECK URL and throw error if not allowed
  147. if (!Helpers.sanitizeUrl(url, true)) {
  148. // Prevent websites using the history back attacks
  149. if (template.view.isRendered) {
  150. // get the current webview
  151. var webview = template.find('webview');
  152. webview.clearHistory();
  153. }
  154. console.warn('Not allowed URL: ' + template.url);
  155. return 'file://' + dirname + '/errorPages/400.html';
  156. }
  157. // add url
  158. if (url) {
  159. template.url = url;
  160. Tabs.update(this._id, {
  161. $set: {
  162. url: url
  163. }
  164. });
  165. }
  166. return Helpers.formatUrl(url);
  167. }
  168. }
  169. });