From 79f412a7734af461ea40bcdc75b86ab97a631dae Mon Sep 17 00:00:00 2001 From: vsvipul Date: Sat, 27 Jul 2019 21:33:52 +0530 Subject: [PATCH] BrowserView: Add logic to handle external links. --- app/main/view.ts | 13 +++++++++++++ app/main/viewmanager.ts | 6 ++++++ app/renderer/js/components/handle-external-link.ts | 13 ++++--------- app/renderer/js/components/webview.ts | 4 ++-- app/renderer/js/main.ts | 5 +++++ 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/app/main/view.ts b/app/main/view.ts index 97734c590..8f26d4b12 100644 --- a/app/main/view.ts +++ b/app/main/view.ts @@ -83,6 +83,11 @@ export class View extends BrowserView { } } }); + + this.webContents.addListener('new-window', (e: Event, urlToOpen: string) => { + e.preventDefault(); + this.sendAction('handle-link', this.index, urlToOpen); + }); } zoomIn(): void { @@ -149,6 +154,14 @@ export class View extends BrowserView { return messageCountInTitle ? Number(messageCountInTitle[1]) : 0; } + downloadUrl(url: string): void { + this.webContents.downloadURL(url); + } + + loadUrl(url: string): void { + this.webContents.loadURL(url); + } + sendAction(action: any, ...params: any[]): void { const win = BrowserWindow.getAllWindows()[0]; diff --git a/app/main/viewmanager.ts b/app/main/viewmanager.ts index cee549918..d0ab1c452 100644 --- a/app/main/viewmanager.ts +++ b/app/main/viewmanager.ts @@ -45,6 +45,12 @@ class ViewManager { // So, using a workaround here. (this.views[this.selectedIndex] as any)[name as keyof View](...params); }); + + ipcMain.on('call-specific-view-function', (e: Event, index: number, name: string, ...params: any[]) => { + // Type checking requires spread elements to match up with a rest parameter. + // So, using a workaround here. + (this.views[index] as any)[name as keyof View](...params); + }); } create(props: ViewProps): void { diff --git a/app/renderer/js/components/handle-external-link.ts b/app/renderer/js/components/handle-external-link.ts index 076e978b1..49f28b811 100644 --- a/app/renderer/js/components/handle-external-link.ts +++ b/app/renderer/js/components/handle-external-link.ts @@ -8,10 +8,8 @@ const { shell, app } = remote; const dingSound = new Audio('../resources/sounds/ding.ogg'); -// TODO: TypeScript - Figure out a way to pass correct type here. -function handleExternalLink(this: any, event: any): void { - const { url } = event; - const domainPrefix = DomainUtil.getDomain(this.props.index).url; +function handleExternalLink(index: number, url: string): void { + const domainPrefix = DomainUtil.getDomain(index).url; const downloadPath = ConfigUtil.getConfigItem('downloadsPath', `${app.getPath('downloads')}`); const shouldShowInFolder = ConfigUtil.getConfigItem('showDownloadFolder', false); @@ -22,8 +20,6 @@ function handleExternalLink(this: any, event: any): void { } = LinkUtil.isInternal(domainPrefix, url); if (isWhiteListURL) { - event.preventDefault(); - // Code to show pdf in a new BrowserWindow (currently commented out due to bug-upstream) // Show pdf attachments in a new window // if (LinkUtil.isPDF(url) && isUploadsURL) { @@ -66,16 +62,15 @@ function handleExternalLink(this: any, event: any): void { ipcRenderer.once('downloadFileFailed', () => { // Automatic download failed, so show save dialog prompt and download // through webview - this.$el.downloadURL(url); + ipcRenderer.send('call-specific-view-function', index, 'downloadUrl', url); ipcRenderer.removeAllListeners('downloadFileCompleted'); }); return; } // open internal urls inside the current webview. - this.$el.loadURL(url); + ipcRenderer.send('call-specific-view-function', index, 'loadUrl', url); } else { - event.preventDefault(); shell.openExternal(url); } } diff --git a/app/renderer/js/components/webview.ts b/app/renderer/js/components/webview.ts index 8a9f01a32..05475a247 100644 --- a/app/renderer/js/components/webview.ts +++ b/app/renderer/js/components/webview.ts @@ -6,7 +6,7 @@ import fs = require('fs'); import ConfigUtil = require('../utils/config-util'); import SystemUtil = require('../utils/system-util'); import BaseComponent = require('../components/base'); -import handleExternalLink = require('../components/handle-external-link'); +// import handleExternalLink = require('../components/handle-external-link'); const { app, dialog } = remote; @@ -64,7 +64,7 @@ class WebView extends BaseComponent { registerListeners(): void { this.$el.addEventListener('new-window', event => { - handleExternalLink.call(this, event); + // handleExternalLink.call(this, event); }); if (shouldSilentWebview) { diff --git a/app/renderer/js/main.ts b/app/renderer/js/main.ts index de40c2ef9..a694c2d7b 100644 --- a/app/renderer/js/main.ts +++ b/app/renderer/js/main.ts @@ -19,6 +19,7 @@ import DNDUtil = require('./utils/dnd-util'); import ReconnectUtil = require('./utils/reconnect-util'); import Logger = require('./utils/logger-util'); import CommonUtil = require('./utils/common-util'); +import handleExternalLink = require('./components/handle-external-link'); const logger = new Logger({ file: 'errors.log', @@ -802,6 +803,10 @@ class ServerManagerView { this.badgeCounts[url] = count; this.updateBadge(); }); + + ipcRenderer.on('handle-link', (e: Event, index: number, url: string) => { + handleExternalLink(index, url); + }); } }