From d3371dbcd21adea48887fbc5c216ca51a54b6e66 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Oct 2014 11:56:17 -0600 Subject: [PATCH] Start on StyleManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will take over raw stylesheet management from the theme manager now that it’s becoming more complex with the need to target specific host elements. Instead of actually adding nodes to the head of the document, it will instead simply manage a set of stylesheets we want to apply and leave actual DOM manipulation to custom elements that can render the set of active stylesheets in the appropriate locations. --- spec/style-manager-spec.coffee | 29 +++++++++++++++++++++++++++++ src/style-manager.coffee | 30 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 spec/style-manager-spec.coffee create mode 100644 src/style-manager.coffee 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}