michael@0: const gTestRoot = getRootDirectory(gTestPath); michael@0: const gStyleSheet = "bug839103.css"; michael@0: michael@0: var gTab = null; michael@0: var needsInitialApplicableStateEvent = false; michael@0: var needsInitialApplicableStateEventFor = null; michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: gBrowser.addEventListener("StyleSheetAdded", initialStylesheetAdded, true); michael@0: gTab = gBrowser.selectedTab = gBrowser.addTab(gTestRoot + "test_bug839103.html"); michael@0: gTab.linkedBrowser.addEventListener("load", tabLoad, true); michael@0: } michael@0: michael@0: function initialStylesheetAdded(evt) { michael@0: gBrowser.removeEventListener("StyleSheetAdded", initialStylesheetAdded, true); michael@0: ok(true, "received initial style sheet event"); michael@0: is(evt.type, "StyleSheetAdded", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: ok(evt.stylesheet, "evt.stylesheet is defined"); michael@0: ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); michael@0: ok(evt.documentSheet, "style sheet is a document sheet"); michael@0: } michael@0: michael@0: function tabLoad(evt) { michael@0: gTab.linkedBrowser.removeEventListener(evt.type, tabLoad, true); michael@0: executeSoon(continueTest); michael@0: } michael@0: michael@0: var gLinkElement = null; michael@0: michael@0: function unexpectedContentEvent(evt) { michael@0: ok(false, "Received a " + evt.type + " event on content"); michael@0: } michael@0: michael@0: // We've seen the original stylesheet in the document. michael@0: // Now add a stylesheet on the fly and make sure we see it. michael@0: function continueTest() { michael@0: info("continuing test"); michael@0: michael@0: let doc = gBrowser.contentDocument; michael@0: doc.styleSheetChangeEventsEnabled = true; michael@0: doc.addEventListener("StyleSheetAdded", unexpectedContentEvent, false); michael@0: doc.addEventListener("StyleSheetRemoved", unexpectedContentEvent, false); michael@0: doc.addEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); michael@0: doc.defaultView.addEventListener("StyleSheetAdded", unexpectedContentEvent, false); michael@0: doc.defaultView.addEventListener("StyleSheetRemoved", unexpectedContentEvent, false); michael@0: doc.defaultView.addEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); michael@0: let link = doc.createElement('link'); michael@0: link.setAttribute('rel', 'stylesheet'); michael@0: link.setAttribute('type', 'text/css'); michael@0: link.setAttribute('href', gTestRoot + gStyleSheet); michael@0: gLinkElement = link; michael@0: michael@0: gBrowser.addEventListener("StyleSheetAdded", dynamicStylesheetAdded, true); michael@0: gBrowser.addEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChanged, true); michael@0: doc.body.appendChild(link); michael@0: } michael@0: michael@0: function dynamicStylesheetAdded(evt) { michael@0: gBrowser.removeEventListener("StyleSheetAdded", dynamicStylesheetAdded, true); michael@0: ok(true, "received dynamic style sheet event"); michael@0: is(evt.type, "StyleSheetAdded", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: ok(evt.stylesheet, "evt.stylesheet is defined"); michael@0: ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); michael@0: ok(evt.documentSheet, "style sheet is a document sheet"); michael@0: } michael@0: michael@0: function dynamicStylesheetApplicableStateChanged(evt) { michael@0: gBrowser.removeEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChanged, true); michael@0: ok(true, "received dynamic style sheet applicable state change event"); michael@0: is(evt.type, "StyleSheetApplicableStateChanged", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: is(evt.stylesheet, gLinkElement.sheet, "evt.stylesheet has the right value"); michael@0: is(evt.applicable, true, "evt.applicable has the right value"); michael@0: michael@0: gBrowser.addEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChangedToFalse, true); michael@0: gLinkElement.disabled = true; michael@0: } michael@0: michael@0: function dynamicStylesheetApplicableStateChangedToFalse(evt) { michael@0: gBrowser.removeEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChangedToFalse, true); michael@0: is(evt.type, "StyleSheetApplicableStateChanged", "evt.type has expected value"); michael@0: ok(true, "received dynamic style sheet applicable state change event after media=\"\" changed"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: is(evt.stylesheet, gLinkElement.sheet, "evt.stylesheet has the right value"); michael@0: is(evt.applicable, false, "evt.applicable has the right value"); michael@0: michael@0: gBrowser.addEventListener("StyleSheetRemoved", dynamicStylesheetRemoved, true); michael@0: gBrowser.contentDocument.body.removeChild(gLinkElement); michael@0: } michael@0: michael@0: function dynamicStylesheetRemoved(evt) { michael@0: gBrowser.removeEventListener("StyleSheetRemoved", dynamicStylesheetRemoved, true); michael@0: ok(true, "received dynamic style sheet removal"); michael@0: is(evt.type, "StyleSheetRemoved", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: ok(evt.stylesheet, "evt.stylesheet is defined"); michael@0: ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); michael@0: ok(evt.stylesheet.href.contains(gStyleSheet), "evt.stylesheet is the removed stylesheet"); michael@0: michael@0: gBrowser.addEventListener("StyleRuleAdded", styleRuleAdded, true); michael@0: gBrowser.contentDocument.querySelector("style").sheet.insertRule("*{color:black}", 0); michael@0: } michael@0: michael@0: function styleRuleAdded(evt) { michael@0: gBrowser.removeEventListener("StyleRuleAdded", styleRuleAdded, true); michael@0: ok(true, "received style rule added event"); michael@0: is(evt.type, "StyleRuleAdded", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: ok(evt.stylesheet, "evt.stylesheet is defined"); michael@0: ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); michael@0: ok(evt.rule, "evt.rule is defined"); michael@0: is(evt.rule.cssText, "* { color: black; }", "evt.rule.cssText has expected value"); michael@0: michael@0: gBrowser.addEventListener("StyleRuleChanged", styleRuleChanged, true); michael@0: evt.rule.style.cssText = "color:green"; michael@0: } michael@0: michael@0: function styleRuleChanged(evt) { michael@0: gBrowser.removeEventListener("StyleRuleChanged", styleRuleChanged, true); michael@0: ok(true, "received style rule changed event"); michael@0: is(evt.type, "StyleRuleChanged", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: ok(evt.stylesheet, "evt.stylesheet is defined"); michael@0: ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); michael@0: ok(evt.rule, "evt.rule is defined"); michael@0: is(evt.rule.cssText, "* { color: green; }", "evt.rule.cssText has expected value"); michael@0: michael@0: gBrowser.addEventListener("StyleRuleRemoved", styleRuleRemoved, true); michael@0: evt.stylesheet.deleteRule(0); michael@0: } michael@0: michael@0: function styleRuleRemoved(evt) { michael@0: gBrowser.removeEventListener("StyleRuleRemoved", styleRuleRemoved, true); michael@0: ok(true, "received style rule removed event"); michael@0: is(evt.type, "StyleRuleRemoved", "evt.type has expected value"); michael@0: is(evt.target, gBrowser.contentDocument, "event targets correct document"); michael@0: ok(evt.stylesheet, "evt.stylesheet is defined"); michael@0: ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); michael@0: ok(evt.rule, "evt.rule is defined"); michael@0: michael@0: executeSoon(concludeTest); michael@0: } michael@0: michael@0: function concludeTest() { michael@0: let doc = gBrowser.contentDocument; michael@0: doc.removeEventListener("StyleSheetAdded", unexpectedContentEvent, false); michael@0: doc.removeEventListener("StyleSheetRemoved", unexpectedContentEvent, false); michael@0: doc.removeEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); michael@0: doc.defaultView.removeEventListener("StyleSheetAdded", unexpectedContentEvent, false); michael@0: doc.defaultView.removeEventListener("StyleSheetRemoved", unexpectedContentEvent, false); michael@0: doc.defaultView.removeEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); michael@0: gBrowser.removeCurrentTab(); michael@0: gLinkElement = null; michael@0: gTab = null; michael@0: finish(); michael@0: }