diff --git a/spec/style-manager-spec.coffee b/spec/style-manager-spec.coffee new file mode 100644 index 000000000..496e70419 --- /dev/null +++ b/spec/style-manager-spec.coffee @@ -0,0 +1,29 @@ +StyleManager = require '../src/style-manager' + +describe "StyleManager", -> + manager = null + + beforeEach -> + manager = new StyleManager + + describe "::addStyleSheet(source, params)", -> + it "adds a stylesheet based on the given source and returns a disposable allowing it to be removed", -> + addEvents = [] + removeEvents = [] + manager.onDidAddStyleSheet (event) -> addEvents.push(event) + manager.onDidRemoveStyleSheet (event) -> removeEvents.push(event) + + disposable = manager.addStyleSheet("a {color: red;}") + + expect(addEvents.length).toBe 1 + expect(addEvents[0].styleElement.textContent).toBe "a {color: red;}" + + styleElements = manager.getStyleElements() + expect(styleElements.length).toBe 1 + expect(styleElements[0].textContent).toBe "a {color: red;}" + + disposable.dispose() + + expect(removeEvents.length).toBe 1 + expect(removeEvents[0].styleElement.textContent).toBe "a {color: red;}" + expect(manager.getStyleElements().length).toBe 0 diff --git a/src/style-manager.coffee b/src/style-manager.coffee new file mode 100644 index 000000000..6d67bfce0 --- /dev/null +++ b/src/style-manager.coffee @@ -0,0 +1,30 @@ +{Emitter, Disposable} = require 'event-kit' + +module.exports = +class StyleManager + constructor: -> + @emitter = new Emitter + @styleElements = [] + + onDidAddStyleSheet: (callback) -> + @emitter.on 'did-add-style-sheet', callback + + onDidRemoveStyleSheet: (callback) -> + @emitter.on 'did-remove-style-sheet', callback + + getStyleElements: -> + @styleElements.slice() + + addStyleSheet: (source) -> + styleElement = document.createElement('style') + styleElement.textContent = source + @styleElements.push(styleElement) + @emitter.emit 'did-add-style-sheet', {styleElement} + + new Disposable => @removeStyleElement(styleElement) + + removeStyleElement: (styleElement) -> + index = @styleElements.indexOf(styleElement) + unless index is -1 + @styleElements.splice(index, 1) + @emitter.emit 'did-remove-style-sheet', {styleElement}