diff --git a/src/package-manager.js b/src/package-manager.js index 7f7c8ee03..d9984e40c 100644 --- a/src/package-manager.js +++ b/src/package-manager.js @@ -648,6 +648,10 @@ module.exports = class PackageManager { }) } + registerUrlHandlerForPackage (packageName, handler) { + return this.urlHandlerRegistry.registerHostHandler(packageName, handler) + } + // another type of package manager can handle other package types. // See ThemeManager registerPackageActivator (activator, types) { diff --git a/src/package.coffee b/src/package.coffee index fdd89bc74..d5e13b6b9 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -84,6 +84,7 @@ class Package @loadMenus() @registerDeserializerMethods() @activateCoreStartupServices() + @registerUrlHandler() @configSchemaRegisteredOnLoad = @registerConfigSchemaFromMetadata() @requireMainModule() @settingsPromise = @loadSettings() @@ -114,6 +115,7 @@ class Package @loadStylesheets() @registerDeserializerMethods() @activateCoreStartupServices() + @registerUrlHandler() @registerTranspilerConfig() @configSchemaRegisteredOnLoad = @registerConfigSchemaFromMetadata() @settingsPromise = @loadSettings() @@ -318,6 +320,21 @@ class Package @activationDisposables.add @packageManager.serviceHub.consume(name, version, @mainModule[methodName].bind(@mainModule)) return + registerUrlHandler: -> + handlerConfig = @getUrlHandler() + if methodName = handlerConfig?.method + @urlHandlerSubscription = @packageManager.registerUrlHandlerForPackage @name, (url) => + @handleUrl(url, methodName) + + unregisterUrlHandler: -> + @urlHandlerSubscription?.dispose() + + handleUrl: (url, methodName) -> + @activate().then => + @mainModule[methodName]?(url) + unless @mainActivated + @activateNow() + registerTranspilerConfig: -> if @metadata.atomTranspilers CompileCache.addTranspilerConfigForPath(@path, @name, @metadata, @metadata.atomTranspilers) @@ -595,7 +612,7 @@ class Package @mainModulePath = fs.resolveExtension(mainModulePath, ["", CompileCache.supportedExtensions...]) activationShouldBeDeferred: -> - @hasActivationCommands() or @hasActivationHooks() + @hasActivationCommands() or @hasActivationHooks() or @hasDeferredUrlHandler() hasActivationHooks: -> @getActivationHooks()?.length > 0 @@ -605,6 +622,9 @@ class Package return true if commands.length > 0 false + hasDeferredUrlHandler: -> + @getUrlHandler() and @getUrlHandler().deferActivation isnt false + subscribeToDeferredActivation: -> @subscribeToActivationCommands() @subscribeToActivationHooks() @@ -673,6 +693,9 @@ class Package @activationHooks = _.uniq(@activationHooks) + getUrlHandler: -> + @metadata?.urlHandler + # Does the given module path contain native code? isNativeModule: (modulePath) -> try