UNPKG

rue-mist-interface

Version:

Mist interface application

173 lines (138 loc) 5.05 kB
/** Template Controllers @module Templates */ /** The tab template @class [template] views_webview @constructor */ Template['views_webview'].onRendered(function () { var template = this, tabId = template.data._id, webview = template.find('webview'); ipc.on('uiAction_reloadSelectedTab', function (e) { console.log('uiAction_reloadSelectedTab', LocalStore.get('selectedTab')); if (LocalStore.get('selectedTab') === this._id) { var webview = Helpers.getWebview(LocalStore.get('selectedTab')); webview.reload(); } }); webview.addEventListener('did-start-loading', function (e) { TemplateVar.set(template, 'loading', true); }); webview.addEventListener('did-stop-loading', function (e) { TemplateVar.set(template, 'loading', false); }); // change url webview.addEventListener('did-navigate', webviewChangeUrl.bind(webview, tabId)); webview.addEventListener('did-navigate-in-page', webviewChangeUrl.bind(webview, tabId)); webview.addEventListener('did-get-redirect-request', webviewChangeUrl.bind(webview, tabId)); webview.addEventListener('did-stop-loading', webviewChangeUrl.bind(webview, tabId)); // set page history webview.addEventListener('dom-ready', function (e) { var titleFull = webview.getTitle(), title = titleFull; if (titleFull && titleFull.length > 40) { title = titleFull.substr(0, 40); title += '…'; } // update the title Tabs.update(tabId, { $set: { name: title, nameFull: titleFull, // url: webview.getURL(), } }); webviewLoadStop.call(this, tabId, e); }); // show error pages webview.addEventListener('did-fail-load', showError.bind(webview, tabId)); webview.addEventListener('crashed', showError.bind(webview, tabId)); // Forward SWARM status code errors to showError webview.addEventListener('did-get-response-details', function (e) { if (e && e.resourceType === 'mainFrame' && /^bzz:\//i.test(e.newURL)) { switch (e.httpResponseCode) { case 500: showError.call(webview, tabId, { isMainFrame: true, errorCode: 404 }); break; } } }); // navigate page, and redirect to browser tab if necessary webview.addEventListener('will-navigate', webviewLoadStart.bind(webview, tabId)); webview.addEventListener('did-get-redirect-request', webviewLoadStart.bind(webview, tabId)); webview.addEventListener('new-window', webviewLoadStart.bind(webview, tabId)); // MIST API for installed tabs/dapps webview.addEventListener('ipc-message', mistAPIBackend.bind({ template: template, webview: webview })); }); Template['views_webview'].helpers({ /** Gets the correct preloader file @method (preloaderFile) */ 'preloaderFile': function () { switch (this._id) { case 'browser': return 'file://' + Helpers.preloaderDirname + '/browser.js'; case 'tests': return 'file://' + Helpers.preloaderDirname + '/tests.js'; default: return 'file://' + Helpers.preloaderDirname + '/dapps.js'; } }, /** Determines if the current tab is visible @method (isVisible) */ 'isVisible': function () { return (LocalStore.get('selectedTab') === this._id) ? '' : 'hidden'; }, /** Gets the current url @method (checkedUrl) */ 'checkedUrl': function () { var template = Template.instance(); var tab = Tabs.findOne(this._id, { fields: { redirect: 1 } }); var url; if (tab) { // set url only once if (tab.redirect) { url = tab.redirect; // remove redirect Tabs.update(this._id, { $unset: { redirect: '' } }); } // allow error pages if (url && url.indexOf('file://' + dirname + '/errorPages/') === 0) { return url; } // CHECK URL and throw error if not allowed if (!Helpers.sanitizeUrl(url, true)) { // Prevent websites usingt the history back attacks if (template.view.isRendered) { // get the current webview var webview = template.find('webview'); webview.clearHistory(); } console.warn('Not allowed URL: ' + template.url); return 'file://' + dirname + '/errorPages/400.html'; } // add url if (url) { template.url = url; Tabs.update(this._id, { $set: { url: url } }); } return Helpers.formatUrl(url); } } });