mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
Ensure grammar activation hooks are called after emitting new editors
This commit is contained in:
@@ -1273,21 +1273,29 @@ describe('Workspace', () => {
|
||||
|
||||
describe('the grammar-used hook', () => {
|
||||
it('fires when opening a file or changing the grammar of an open file', async () => {
|
||||
let resolveJavascriptGrammarUsed, resolveCoffeeScriptGrammarUsed
|
||||
const javascriptGrammarUsed = new Promise(resolve => { resolveJavascriptGrammarUsed = resolve })
|
||||
const coffeescriptGrammarUsed = new Promise(resolve => { resolveCoffeeScriptGrammarUsed = resolve })
|
||||
await atom.packages.activatePackage('language-javascript')
|
||||
await atom.packages.activatePackage('language-coffee-script')
|
||||
|
||||
const observeTextEditorsSpy = jasmine.createSpy('observeTextEditors')
|
||||
const javascriptGrammarUsed = jasmine.createSpy('javascript')
|
||||
const coffeeScriptGrammarUsed = jasmine.createSpy('coffeescript')
|
||||
|
||||
atom.packages.triggerDeferredActivationHooks()
|
||||
atom.packages.onDidTriggerActivationHook('language-javascript:grammar-used', resolveJavascriptGrammarUsed)
|
||||
atom.packages.onDidTriggerActivationHook('language-coffee-script:grammar-used', resolveCoffeeScriptGrammarUsed)
|
||||
atom.packages.onDidTriggerActivationHook('language-javascript:grammar-used', () => {
|
||||
atom.workspace.observeTextEditors(observeTextEditorsSpy)
|
||||
javascriptGrammarUsed()
|
||||
})
|
||||
atom.packages.onDidTriggerActivationHook('language-coffee-script:grammar-used', coffeeScriptGrammarUsed)
|
||||
|
||||
expect(javascriptGrammarUsed).not.toHaveBeenCalled()
|
||||
expect(observeTextEditorsSpy).not.toHaveBeenCalled()
|
||||
const editor = await atom.workspace.open('sample.js', {autoIndent: false})
|
||||
await atom.packages.activatePackage('language-javascript')
|
||||
await javascriptGrammarUsed
|
||||
expect(javascriptGrammarUsed).toHaveBeenCalled()
|
||||
expect(observeTextEditorsSpy.callCount).toBe(1)
|
||||
|
||||
await atom.packages.activatePackage('language-coffee-script')
|
||||
expect(coffeeScriptGrammarUsed).not.toHaveBeenCalled()
|
||||
atom.grammars.assignLanguageMode(editor, 'source.coffee')
|
||||
await coffeescriptGrammarUsed
|
||||
expect(coffeeScriptGrammarUsed).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -497,14 +497,19 @@ module.exports = class Workspace extends Model {
|
||||
if (item instanceof TextEditor) {
|
||||
const subscriptions = new CompositeDisposable(
|
||||
this.textEditorRegistry.add(item),
|
||||
this.textEditorRegistry.maintainConfig(item),
|
||||
item.observeGrammar(this.handleGrammarUsed.bind(this))
|
||||
this.textEditorRegistry.maintainConfig(item)
|
||||
)
|
||||
if (!this.project.findBufferForId(item.buffer.id)) {
|
||||
this.project.addBuffer(item.buffer)
|
||||
}
|
||||
item.onDidDestroy(() => { subscriptions.dispose() })
|
||||
this.emitter.emit('did-add-text-editor', {textEditor: item, pane, index})
|
||||
// It's important to call handleGrammarUsed after emitting the did-add event:
|
||||
// if we activate a package between adding the editor to the registry and emitting
|
||||
// the package may receive the editor twice from `observeTextEditors`.
|
||||
subscriptions.add(
|
||||
item.observeGrammar(this.handleGrammarUsed.bind(this))
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user