diff --git a/spec/theme-manager-spec.coffee b/spec/theme-manager-spec.coffee
index 1eaaf0a0b..831b34ee6 100644
--- a/spec/theme-manager-spec.coffee
+++ b/spec/theme-manager-spec.coffee
@@ -131,15 +131,21 @@ describe "ThemeManager", ->
describe "requireStylesheet(path)", ->
it "synchronously loads css at the given path and installs a style tag for it in the head", ->
+ themeManager.on 'stylesheets-changed', stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
+ themeManager.on 'stylesheet-added', stylesheetAddedHandler = jasmine.createSpy("stylesheetAddedHandler")
cssPath = atom.project.resolve('css.css')
lengthBefore = $('head style').length
themeManager.requireStylesheet(cssPath)
expect($('head style').length).toBe lengthBefore + 1
+ expect(stylesheetAddedHandler).toHaveBeenCalled()
+ expect(stylesheetsChangedHandler).toHaveBeenCalled()
+
element = $('head style[id*="css.css"]')
expect(element.attr('id')).toBe themeManager.stringToId(cssPath)
expect(element.text()).toBe fs.readFileSync(cssPath, 'utf8')
+ expect(element[0].sheet).toBe stylesheetAddedHandler.argsForCall[0][0]
# doesn't append twice
themeManager.requireStylesheet(cssPath)
@@ -187,9 +193,18 @@ describe "ThemeManager", ->
themeManager.requireStylesheet(cssPath)
expect($(document.body).css('font-weight')).toBe("bold")
+ themeManager.on 'stylesheet-removed', stylesheetRemovedHandler = jasmine.createSpy("stylesheetRemovedHandler")
themeManager.on 'stylesheets-changed', stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
+
themeManager.removeStylesheet(cssPath)
+
expect($(document.body).css('font-weight')).not.toBe("bold")
+
+ expect(stylesheetRemovedHandler).toHaveBeenCalled()
+ stylesheet = stylesheetRemovedHandler.argsForCall[0][0]
+ expect(stylesheet instanceof CSSStyleSheet).toBe true
+ expect(stylesheet.cssRules[0].selectorText).toBe 'body'
+
expect(stylesheetsChangedHandler).toHaveBeenCalled()
describe "base stylesheet loading", ->
@@ -219,20 +234,21 @@ describe "ThemeManager", ->
describe "when the user stylesheet changes", ->
it "reloads it", ->
+ [stylesheetRemovedHandler, stylesheetAddedHandler, stylesheetsChangedHandler] = []
userStylesheetPath = path.join(temp.mkdirSync("atom"), 'styles.less')
fs.writeFileSync(userStylesheetPath, 'body {border-style: dotted !important;}')
-
spyOn(themeManager, 'getUserStylesheetPath').andReturn userStylesheetPath
- themeManager.on 'stylesheets-changed', stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
waitsForPromise ->
themeManager.activateThemes()
runs ->
- expect($(document.body).css('border-style')).toBe 'dotted'
- expect(stylesheetsChangedHandler).toHaveBeenCalled()
- stylesheetsChangedHandler.reset()
+ themeManager.on 'stylesheets-changed', stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
+ themeManager.on 'stylesheet-removed', stylesheetRemovedHandler = jasmine.createSpy("stylesheetRemovedHandler")
+ themeManager.on 'stylesheet-added', stylesheetAddedHandler = jasmine.createSpy("stylesheetAddedHandler")
spyOn(themeManager, 'loadUserStylesheet').andCallThrough()
+
+ expect($(document.body).css('border-style')).toBe 'dotted'
fs.writeFileSync(userStylesheetPath, 'body {border-style: dashed}')
waitsFor ->
@@ -240,7 +256,16 @@ describe "ThemeManager", ->
runs ->
expect($(document.body).css('border-style')).toBe 'dashed'
+
+ expect(stylesheetRemovedHandler).toHaveBeenCalled()
+ expect(stylesheetRemovedHandler.argsForCall[0][0].cssRules[0].style.border).toBe 'dotted'
+
+ expect(stylesheetAddedHandler).toHaveBeenCalled()
+ expect(stylesheetAddedHandler.argsForCall[0][0].cssRules[0].style.border).toBe 'dashed'
+
expect(stylesheetsChangedHandler).toHaveBeenCalled()
+
+ stylesheetRemovedHandler.reset()
stylesheetsChangedHandler.reset()
fs.removeSync(userStylesheetPath)
@@ -248,6 +273,8 @@ describe "ThemeManager", ->
themeManager.loadUserStylesheet.callCount is 2
runs ->
+ expect(stylesheetRemovedHandler).toHaveBeenCalled()
+ expect(stylesheetRemovedHandler.argsForCall[0][0].cssRules[0].style.border).toBe 'dashed'
expect($(document.body).css('border-style')).toBe 'none'
expect(stylesheetsChangedHandler).toHaveBeenCalled()
diff --git a/src/theme-manager.coffee b/src/theme-manager.coffee
index 3570bef69..6ec9bd282 100644
--- a/src/theme-manager.coffee
+++ b/src/theme-manager.coffee
@@ -158,10 +158,10 @@ class ThemeManager
# load path.
#
# Returns the absolute path to the required stylesheet.
- requireStylesheet: (stylesheetPath, ttype = 'bundled', htmlElement) ->
+ requireStylesheet: (stylesheetPath, type = 'bundled', htmlElement) ->
if fullPath = @resolveStylesheet(stylesheetPath)
content = @loadStylesheet(fullPath)
- @applyStylesheet(fullPath, content, ttype = 'bundled', htmlElement)
+ @applyStylesheet(fullPath, content, type = 'bundled', htmlElement)
else
throw new Error("Could not find a file at path '#{stylesheetPath}'")
@@ -192,16 +192,24 @@ class ThemeManager
removeStylesheet: (stylesheetPath) ->
fullPath = @resolveStylesheet(stylesheetPath) ? stylesheetPath
- @stylesheetElementForId(@stringToId(fullPath)).remove()
- @emit 'stylesheets-changed'
+ element = @stylesheetElementForId(@stringToId(fullPath))
+ if element.length > 0
+ stylesheet = element[0].sheet
+ element.remove()
+ @emit 'stylesheet-removed', stylesheet
+ @emit 'stylesheets-changed'
- applyStylesheet: (path, text, ttype = 'bundled', htmlElement=$('html')) ->
+ applyStylesheet: (path, text, type = 'bundled', htmlElement=$('html')) ->
styleElement = @stylesheetElementForId(@stringToId(path), htmlElement)
if styleElement.length
+ @emit 'stylesheet-removed', styleElement[0].sheet
styleElement.text(text)
else
- if htmlElement.find("head style.#{ttype}").length
- htmlElement.find("head style.#{ttype}:last").after ""
+ styleElement = $("")
+ if htmlElement.find("head style.#{type}").length
+ htmlElement.find("head style.#{type}:last").after(styleElement)
else
- htmlElement.find("head").append ""
+ htmlElement.find("head").append(styleElement)
+
+ @emit 'stylesheet-added', styleElement[0].sheet
@emit 'stylesheets-changed'