From 69e8c7acbc86e8cb51a47bcc12cc514b496128b9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 16 Sep 2016 12:21:41 +0200 Subject: [PATCH] buffer open-url requests related to #10340 --- src/main.js | 15 ++++++++++++++- .../platform/url/electron-main/urlService.ts | 19 +++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main.js b/src/main.js index 5693201c1a8..3176a92b153 100644 --- a/src/main.js +++ b/src/main.js @@ -132,9 +132,22 @@ app.on('open-file', function (event, path) { global.macOpenFiles.push(path); }); +const openUrls = []; +const onOpenUrl = (event, url) => { + event.preventDefault(); + openUrls.push(url); +}; + +app.on('will-finish-launching', () => app.on('open-url', onOpenUrl)); + +global.getOpenUrls = () => { + app.removeListener('open-url', onOpenUrl); + return openUrls; +}; + // Load our code once ready app.once('ready', function () { var nlsConfig = getNLSConfiguration(); process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); require('./bootstrap-amd').bootstrap('vs/code/electron-main/main'); -}); +}); \ No newline at end of file diff --git a/src/vs/platform/url/electron-main/urlService.ts b/src/vs/platform/url/electron-main/urlService.ts index 8bd871af356..993d0822571 100644 --- a/src/vs/platform/url/electron-main/urlService.ts +++ b/src/vs/platform/url/electron-main/urlService.ts @@ -5,7 +5,7 @@ 'use strict'; -import Event, {chain} from 'vs/base/common/event'; +import Event, {chain, mapEvent, buffer} from 'vs/base/common/event'; import {fromEventEmitter} from 'vs/base/node/event'; import {IURLService} from 'vs/platform/url/common/url'; import product from 'vs/platform/product'; @@ -19,12 +19,21 @@ export class URLService implements IURLService { onOpenURL: Event; constructor() { + app.setAsDefaultProtocolClient(product.urlProtocol); + const rawOnOpenUrl = fromEventEmitter(app, 'open-url', (event: Electron.Event, url: string) => ({ event, url })); - this.onOpenURL = chain(rawOnOpenUrl) - .map(({ event, url }) => { - event.preventDefault(); + // always prevent default and return the url as string + const onOpenUrl = mapEvent(rawOnOpenUrl, ({ event, url }) => { + event.preventDefault(); + return url; + }); + // buffer all `onOpenUrl` events until someone starts listening + const bufferedOnOpenUrl = buffer(onOpenUrl, true, global.getOpenUrls()); + + this.onOpenURL = chain(bufferedOnOpenUrl) + .map(url => { try { return URI.parse(url); } catch(e) { @@ -33,7 +42,5 @@ export class URLService implements IURLService { }) .filter(uri => !!uri) .event; - - app.setAsDefaultProtocolClient(product.urlProtocol); } } \ No newline at end of file