From 3aaa738944cc49117bc87e18cd9231453aac258f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 14 Sep 2016 13:26:03 -0700 Subject: [PATCH] Activate atom.directory-provider services before deserialization Signed-off-by: Nathan Sobo --- .../package-with-directory-provider/index.js | 3 +++ .../package-with-directory-provider/package.json | 12 ++++++++++++ spec/package-manager-spec.coffee | 10 ++++++++++ src/package.coffee | 12 ++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 spec/fixtures/packages/package-with-directory-provider/index.js create mode 100644 spec/fixtures/packages/package-with-directory-provider/package.json diff --git a/spec/fixtures/packages/package-with-directory-provider/index.js b/spec/fixtures/packages/package-with-directory-provider/index.js new file mode 100644 index 000000000..7b18f567b --- /dev/null +++ b/spec/fixtures/packages/package-with-directory-provider/index.js @@ -0,0 +1,3 @@ +exports.provideDirectoryProvider = function () { + return 'directory provider from package-with-directory-provider' +} diff --git a/spec/fixtures/packages/package-with-directory-provider/package.json b/spec/fixtures/packages/package-with-directory-provider/package.json new file mode 100644 index 000000000..15c6150f8 --- /dev/null +++ b/spec/fixtures/packages/package-with-directory-provider/package.json @@ -0,0 +1,12 @@ +{ + "name": "package-with-directory-provider", + + "providedServices": { + "atom.directory-provider": { + "description": "Provides custom Directory instances", + "versions": { + "0.1.1": "provideDirectoryProvider" + } + } + } +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 43e21eeff..e17d6abe7 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -120,6 +120,16 @@ describe "PackageManager", -> state: state2 } + it "early-activates any atom.directory-provider or atom.repository-provider services that the package provide", -> + jasmine.useRealClock() + + providers = [] + atom.packages.serviceHub.consume 'atom.directory-provider', '^0.1.0', (provider) -> + providers.push(provider) + + atom.packages.loadPackage('package-with-directory-provider') + expect(providers).toEqual(['directory provider from package-with-directory-provider']) + describe "when there are view providers specified in the package's package.json", -> model1 = {worksWithViewProvider1: true} model2 = {worksWithViewProvider2: true} diff --git a/src/package.coffee b/src/package.coffee index bb8707ede..dc994f10d 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -85,6 +85,7 @@ class Package @loadMenus() @loadStylesheets() @registerDeserializerMethods() + @activateCoreStartupServices() @configSchemaRegisteredOnLoad = @registerConfigSchemaFromMetadata() @settingsPromise = @loadSettings() if @shouldRequireMainModuleOnLoad() and not @mainModule? @@ -290,6 +291,17 @@ class Package @mainModule[methodName](state, atomEnvironment) return + activateCoreStartupServices: -> + if directoryProviderService = @metadata.providedServices?['atom.directory-provider'] + @requireMainModule() + servicesByVersion = {} + for version, methodName of directoryProviderService.versions + if typeof @mainModule[methodName] is 'function' + servicesByVersion[version] = @mainModule[methodName]() + + disposable = @packageManager.serviceHub.provide('atom.directory-provider', servicesByVersion) + @activationDisposables.add(disposable) + registerViewProviders: -> if @metadata.viewProviders? and not @registeredViewProviders @requireMainModule()