From 8111ba6c1ede4674ce0f52603e7f321531eca911 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Thu, 19 Oct 2017 15:47:57 -0700 Subject: [PATCH] Allow core URI handlers to determine which window to trigger the URI on --- src/core-uri-handlers.js | 22 +++++++++++++--- src/main-process/atom-application.coffee | 32 ++++++++++++++---------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/core-uri-handlers.js b/src/core-uri-handlers.js index c575b3f40..2af00f610 100644 --- a/src/core-uri-handlers.js +++ b/src/core-uri-handlers.js @@ -8,17 +8,31 @@ function openFile (atom, {query}) { }) } +function windowShouldOpenFile ({query}) { + const {filename} = query + return (win) => win.containsPath(filename) +} + const ROUTER = { - '/open/file': openFile + '/open/file': { handler: openFile, getWindowPredicate: windowShouldOpenFile } } module.exports = { create (atomEnv) { return function coreURIHandler (parsed) { - const handler = ROUTER[parsed.pathname] - if (handler) { - handler(atomEnv, parsed) + const config = ROUTER[parsed.pathname] + if (config) { + config.handler(atomEnv, parsed) } } + }, + + windowPredicate (parsed) { + const config = ROUTER[parsed.pathname] + if (config && config.getWindowPredicate) { + return config.getWindowPredicate(parsed) + } else { + return (win) => true + } } } diff --git a/src/main-process/atom-application.coffee b/src/main-process/atom-application.coffee index 76b0d2bed..1f4d7214f 100644 --- a/src/main-process/atom-application.coffee +++ b/src/main-process/atom-application.coffee @@ -655,28 +655,34 @@ class AtomApplication # :devMode - Boolean to control the opened window's dev mode. # :safeMode - Boolean to control the opened window's safe mode. openUrl: ({urlToOpen, devMode, safeMode, env}) -> - parsedUrl = url.parse(urlToOpen) + parsedUrl = url.parse(urlToOpen, true) return unless parsedUrl.protocol is "atom:" pack = @findPackageWithName(parsedUrl.host, devMode) if pack?.urlMain @openPackageUrlMain(parsedUrl.host, pack.urlMain, urlToOpen, devMode, safeMode, env) else - @openPackageUriHandler(urlToOpen, devMode, safeMode, env) + @openPackageUriHandler(urlToOpen, parsedUrl, devMode, safeMode, env) - openPackageUriHandler: (url, devMode, safeMode, env) -> - resourcePath = @resourcePath - if devMode - try - windowInitializationScript = require.resolve(path.join(@devResourcePath, 'src', 'initialize-application-window')) - resourcePath = @devResourcePath + openPackageUriHandler: (url, parsedUrl, devMode, safeMode, env) -> + bestWindow = null + if parsedUrl.host is 'core' + predicate = require('../core-uri-handlers').windowPredicate(parsedUrl) + bestWindow = @getLastFocusedWindow (win) -> + !win.isSpecWindow() && predicate(win) - windowInitializationScript ?= require.resolve('../initialize-application-window') - lastNonSpecWindow = @getLastFocusedWindow (win) -> !win.isSpecWindow() - if lastNonSpecWindow? - lastNonSpecWindow.sendURIMessage url - lastNonSpecWindow.focus() + bestWindow ?= @getLastFocusedWindow (win) -> !win.isSpecWindow() + if bestWindow? + bestWindow.sendURIMessage url + bestWindow.focus() else + resourcePath = @resourcePath + if devMode + try + windowInitializationScript = require.resolve(path.join(@devResourcePath, 'src', 'initialize-application-window')) + resourcePath = @devResourcePath + + windowInitializationScript ?= require.resolve('../initialize-application-window') windowDimensions = @getDimensionsForNewWindow() win = new AtomWindow(this, @fileRecoveryService, {resourcePath, windowInitializationScript, devMode, safeMode, windowDimensions, env}) @windows.addWindow(win)