1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/base/content/test/general/browser_bug839103.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,159 @@ 1.4 +const gTestRoot = getRootDirectory(gTestPath); 1.5 +const gStyleSheet = "bug839103.css"; 1.6 + 1.7 +var gTab = null; 1.8 +var needsInitialApplicableStateEvent = false; 1.9 +var needsInitialApplicableStateEventFor = null; 1.10 + 1.11 +function test() { 1.12 + waitForExplicitFinish(); 1.13 + gBrowser.addEventListener("StyleSheetAdded", initialStylesheetAdded, true); 1.14 + gTab = gBrowser.selectedTab = gBrowser.addTab(gTestRoot + "test_bug839103.html"); 1.15 + gTab.linkedBrowser.addEventListener("load", tabLoad, true); 1.16 +} 1.17 + 1.18 +function initialStylesheetAdded(evt) { 1.19 + gBrowser.removeEventListener("StyleSheetAdded", initialStylesheetAdded, true); 1.20 + ok(true, "received initial style sheet event"); 1.21 + is(evt.type, "StyleSheetAdded", "evt.type has expected value"); 1.22 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.23 + ok(evt.stylesheet, "evt.stylesheet is defined"); 1.24 + ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); 1.25 + ok(evt.documentSheet, "style sheet is a document sheet"); 1.26 +} 1.27 + 1.28 +function tabLoad(evt) { 1.29 + gTab.linkedBrowser.removeEventListener(evt.type, tabLoad, true); 1.30 + executeSoon(continueTest); 1.31 +} 1.32 + 1.33 +var gLinkElement = null; 1.34 + 1.35 +function unexpectedContentEvent(evt) { 1.36 + ok(false, "Received a " + evt.type + " event on content"); 1.37 +} 1.38 + 1.39 +// We've seen the original stylesheet in the document. 1.40 +// Now add a stylesheet on the fly and make sure we see it. 1.41 +function continueTest() { 1.42 + info("continuing test"); 1.43 + 1.44 + let doc = gBrowser.contentDocument; 1.45 + doc.styleSheetChangeEventsEnabled = true; 1.46 + doc.addEventListener("StyleSheetAdded", unexpectedContentEvent, false); 1.47 + doc.addEventListener("StyleSheetRemoved", unexpectedContentEvent, false); 1.48 + doc.addEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); 1.49 + doc.defaultView.addEventListener("StyleSheetAdded", unexpectedContentEvent, false); 1.50 + doc.defaultView.addEventListener("StyleSheetRemoved", unexpectedContentEvent, false); 1.51 + doc.defaultView.addEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); 1.52 + let link = doc.createElement('link'); 1.53 + link.setAttribute('rel', 'stylesheet'); 1.54 + link.setAttribute('type', 'text/css'); 1.55 + link.setAttribute('href', gTestRoot + gStyleSheet); 1.56 + gLinkElement = link; 1.57 + 1.58 + gBrowser.addEventListener("StyleSheetAdded", dynamicStylesheetAdded, true); 1.59 + gBrowser.addEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChanged, true); 1.60 + doc.body.appendChild(link); 1.61 +} 1.62 + 1.63 +function dynamicStylesheetAdded(evt) { 1.64 + gBrowser.removeEventListener("StyleSheetAdded", dynamicStylesheetAdded, true); 1.65 + ok(true, "received dynamic style sheet event"); 1.66 + is(evt.type, "StyleSheetAdded", "evt.type has expected value"); 1.67 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.68 + ok(evt.stylesheet, "evt.stylesheet is defined"); 1.69 + ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); 1.70 + ok(evt.documentSheet, "style sheet is a document sheet"); 1.71 +} 1.72 + 1.73 +function dynamicStylesheetApplicableStateChanged(evt) { 1.74 + gBrowser.removeEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChanged, true); 1.75 + ok(true, "received dynamic style sheet applicable state change event"); 1.76 + is(evt.type, "StyleSheetApplicableStateChanged", "evt.type has expected value"); 1.77 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.78 + is(evt.stylesheet, gLinkElement.sheet, "evt.stylesheet has the right value"); 1.79 + is(evt.applicable, true, "evt.applicable has the right value"); 1.80 + 1.81 + gBrowser.addEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChangedToFalse, true); 1.82 + gLinkElement.disabled = true; 1.83 +} 1.84 + 1.85 +function dynamicStylesheetApplicableStateChangedToFalse(evt) { 1.86 + gBrowser.removeEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChangedToFalse, true); 1.87 + is(evt.type, "StyleSheetApplicableStateChanged", "evt.type has expected value"); 1.88 + ok(true, "received dynamic style sheet applicable state change event after media=\"\" changed"); 1.89 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.90 + is(evt.stylesheet, gLinkElement.sheet, "evt.stylesheet has the right value"); 1.91 + is(evt.applicable, false, "evt.applicable has the right value"); 1.92 + 1.93 + gBrowser.addEventListener("StyleSheetRemoved", dynamicStylesheetRemoved, true); 1.94 + gBrowser.contentDocument.body.removeChild(gLinkElement); 1.95 +} 1.96 + 1.97 +function dynamicStylesheetRemoved(evt) { 1.98 + gBrowser.removeEventListener("StyleSheetRemoved", dynamicStylesheetRemoved, true); 1.99 + ok(true, "received dynamic style sheet removal"); 1.100 + is(evt.type, "StyleSheetRemoved", "evt.type has expected value"); 1.101 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.102 + ok(evt.stylesheet, "evt.stylesheet is defined"); 1.103 + ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); 1.104 + ok(evt.stylesheet.href.contains(gStyleSheet), "evt.stylesheet is the removed stylesheet"); 1.105 + 1.106 + gBrowser.addEventListener("StyleRuleAdded", styleRuleAdded, true); 1.107 + gBrowser.contentDocument.querySelector("style").sheet.insertRule("*{color:black}", 0); 1.108 +} 1.109 + 1.110 +function styleRuleAdded(evt) { 1.111 + gBrowser.removeEventListener("StyleRuleAdded", styleRuleAdded, true); 1.112 + ok(true, "received style rule added event"); 1.113 + is(evt.type, "StyleRuleAdded", "evt.type has expected value"); 1.114 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.115 + ok(evt.stylesheet, "evt.stylesheet is defined"); 1.116 + ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); 1.117 + ok(evt.rule, "evt.rule is defined"); 1.118 + is(evt.rule.cssText, "* { color: black; }", "evt.rule.cssText has expected value"); 1.119 + 1.120 + gBrowser.addEventListener("StyleRuleChanged", styleRuleChanged, true); 1.121 + evt.rule.style.cssText = "color:green"; 1.122 +} 1.123 + 1.124 +function styleRuleChanged(evt) { 1.125 + gBrowser.removeEventListener("StyleRuleChanged", styleRuleChanged, true); 1.126 + ok(true, "received style rule changed event"); 1.127 + is(evt.type, "StyleRuleChanged", "evt.type has expected value"); 1.128 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.129 + ok(evt.stylesheet, "evt.stylesheet is defined"); 1.130 + ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); 1.131 + ok(evt.rule, "evt.rule is defined"); 1.132 + is(evt.rule.cssText, "* { color: green; }", "evt.rule.cssText has expected value"); 1.133 + 1.134 + gBrowser.addEventListener("StyleRuleRemoved", styleRuleRemoved, true); 1.135 + evt.stylesheet.deleteRule(0); 1.136 +} 1.137 + 1.138 +function styleRuleRemoved(evt) { 1.139 + gBrowser.removeEventListener("StyleRuleRemoved", styleRuleRemoved, true); 1.140 + ok(true, "received style rule removed event"); 1.141 + is(evt.type, "StyleRuleRemoved", "evt.type has expected value"); 1.142 + is(evt.target, gBrowser.contentDocument, "event targets correct document"); 1.143 + ok(evt.stylesheet, "evt.stylesheet is defined"); 1.144 + ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet"); 1.145 + ok(evt.rule, "evt.rule is defined"); 1.146 + 1.147 + executeSoon(concludeTest); 1.148 +} 1.149 + 1.150 +function concludeTest() { 1.151 + let doc = gBrowser.contentDocument; 1.152 + doc.removeEventListener("StyleSheetAdded", unexpectedContentEvent, false); 1.153 + doc.removeEventListener("StyleSheetRemoved", unexpectedContentEvent, false); 1.154 + doc.removeEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); 1.155 + doc.defaultView.removeEventListener("StyleSheetAdded", unexpectedContentEvent, false); 1.156 + doc.defaultView.removeEventListener("StyleSheetRemoved", unexpectedContentEvent, false); 1.157 + doc.defaultView.removeEventListener("StyleSheetApplicableStateChanged", unexpectedContentEvent, false); 1.158 + gBrowser.removeCurrentTab(); 1.159 + gLinkElement = null; 1.160 + gTab = null; 1.161 + finish(); 1.162 +}