Defer loading view providers until activation or deserializer use

Signed-off-by: Nathan Sobo <nathan@github.com>
This commit is contained in:
Max Brunsfeld
2015-11-23 16:28:08 -08:00
committed by Nathan Sobo
parent d6e5ea8564
commit 24938c0361
4 changed files with 60 additions and 16 deletions

View File

@@ -0,0 +1,3 @@
module.exports = function (state) {
return {state: state}
}

View File

@@ -2,6 +2,9 @@
"name": "package-with-view-providers",
"main": "./index",
"version": "1.0.0",
"deserializers": {
"DeserializerFromPackageWithViewProviders": "./deserializer"
},
"viewProviders": [
"./view-provider-1",
"./view-provider-2"

View File

@@ -96,20 +96,57 @@ describe "PackageManager", ->
expect(pack.mainModule).toBeNull()
it "registers any view providers specified in the package's package.json", ->
pack = atom.packages.loadPackage("package-with-view-providers")
describe "when there are view providers specified in the package's package.json", ->
model1 = {worksWithViewProvider1: true}
element1 = atom.views.getView(model1)
expect(element1 instanceof HTMLDivElement).toBe true
expect(element1.dataset.createdBy).toBe 'view-provider-1'
model2 = {worksWithViewProvider2: true}
element2 = atom.views.getView(model2)
expect(element2 instanceof HTMLDivElement).toBe true
expect(element2.dataset.createdBy).toBe 'view-provider-2'
expect(pack.mainModule).toBeNull()
afterEach ->
atom.packages.deactivatePackage('package-with-view-providers')
atom.packages.unloadPackage('package-with-view-providers')
it "does not load the view providers immediately", ->
pack = atom.packages.loadPackage("package-with-view-providers")
expect(pack.mainModule).toBeNull()
expect(-> atom.views.getView(model1)).toThrow()
expect(-> atom.views.getView(model2)).toThrow()
it "registers the view providers when the package is activated", ->
pack = atom.packages.loadPackage("package-with-view-providers")
waitsForPromise ->
atom.packages.activatePackage("package-with-view-providers").then ->
element1 = atom.views.getView(model1)
expect(element1 instanceof HTMLDivElement).toBe true
expect(element1.dataset.createdBy).toBe 'view-provider-1'
element2 = atom.views.getView(model2)
expect(element2 instanceof HTMLDivElement).toBe true
expect(element2.dataset.createdBy).toBe 'view-provider-2'
it "registers the view providers when any of the package's deserializers are used", ->
pack = atom.packages.loadPackage("package-with-view-providers")
spyOn(atom.views, 'addViewProvider').andCallThrough()
atom.deserializers.deserialize({
deserializer: 'DeserializerFromPackageWithViewProviders',
a: 'b'
})
expect(atom.views.addViewProvider.callCount).toBe 2
atom.deserializers.deserialize({
deserializer: 'DeserializerFromPackageWithViewProviders',
a: 'b'
})
expect(atom.views.addViewProvider.callCount).toBe 2
element1 = atom.views.getView(model1)
expect(element1 instanceof HTMLDivElement).toBe true
expect(element1.dataset.createdBy).toBe 'view-provider-1'
element2 = atom.views.getView(model2)
expect(element2 instanceof HTMLDivElement).toBe true
expect(element2.dataset.createdBy).toBe 'view-provider-2'
it "registers the config schema in the package's metadata, if present", ->
pack = atom.packages.loadPackage("package-with-json-config-schema")

View File

@@ -85,7 +85,6 @@ class Package
@loadMenus()
@loadStylesheets()
@loadDeserializers()
@loadViewProviders()
@registerConfigSchemaFromMetadata()
@settingsPromise = @loadSettings()
if @shouldRequireMainModuleOnLoad() and not @mainModule?
@@ -131,6 +130,7 @@ class Package
try
@requireMainModule() unless @mainModule?
@registerConfigSchemaFromMainModule()
@registerViewProviders()
@activateStylesheets()
if @mainModule? and not @mainActivated
@mainModule.activateConfig?()
@@ -279,16 +279,17 @@ class Package
deserializeFunction = null
atom.deserializers.add
name: name,
deserialize: ->
deserialize: =>
@registerViewProviders()
deserializeFunction ?= require(deserializePath)
deserializeFunction.apply(this, arguments)
return
loadViewProviders: ->
if @metadata.viewProviders?
registerViewProviders: ->
if @metadata.viewProviders? and not @registeredViewProviders
for implementationPath in @metadata.viewProviders
@viewRegistry.addViewProvider(require(path.join(@path, implementationPath)))
return
@registeredViewProviders = true
getStylesheetsPath: ->
path.join(@path, 'styles')