فهرست منبع

prevent removing selectors containing pseudo-classes

Gildas 7 سال پیش
والد
کامیت
381a572e50
2فایلهای تغییر یافته به همراه13 افزوده شده و 6 حذف شده
  1. 7 2
      lib/single-file/css-matched-rules.js
  2. 6 4
      lib/single-file/css-rules-minifier.js

+ 7 - 2
lib/single-file/css-matched-rules.js

@@ -71,7 +71,7 @@ this.matchedRules = this.matchedRules || (() => {
 	};
 
 	function createMediaInfo(media) {
-		const mediaInfo = { media: media, elements: new Map(), pseudos: new Map(), medias: new Map(), rules: new Map(), pseudoSelectors: new Set() };
+		const mediaInfo = { media: media, elements: new Map(), pseudos: new Map(), medias: new Map(), rules: new Map(), pseudoRules: new Map() };
 		if (media == MEDIA_ALL) {
 			mediaInfo.matchedStyles = new Map();
 		}
@@ -139,7 +139,12 @@ this.matchedRules = this.matchedRules || (() => {
 				if (filteredSelectorText == selectorInfo.selectorText) {
 					matchedElements.forEach(element => addRule(element, selectorInfo, docStyle.styles));
 				} else {
-					selectorInfo.ruleInfo.mediaInfo.pseudoSelectors.add(selectorInfo.ruleInfo.cssRule);
+					let pseudoSelectors = selectorInfo.ruleInfo.mediaInfo.pseudoRules.get(selectorInfo.ruleInfo.cssRule);
+					if (!pseudoSelectors) {
+						pseudoSelectors = new Set();
+						selectorInfo.ruleInfo.mediaInfo.pseudoRules.set(selectorInfo.ruleInfo.cssRule, pseudoSelectors);
+					}
+					pseudoSelectors.add(selectorInfo.selectorText);
 					matchedElements.forEach(element => addPseudoRule(element, selectorInfo));
 				}
 			}

+ 6 - 4
lib/single-file/css-rules-minifier.js

@@ -74,10 +74,11 @@ this.cssRulesMinifier = this.cssRulesMinifier || (() => {
 					mediaRuleIndex++;
 				} else if (cssRuleData.type == "Rule") {
 					const ruleInfo = mediaInfo.rules.get(cssRuleData);
-					if (!ruleInfo && !mediaInfo.pseudoSelectors.has(cssRuleData)) {
+					const pseudoSelectors = mediaInfo.pseudoRules.get(cssRuleData);
+					if (!ruleInfo && !pseudoSelectors) {
 						removedCssRules.push(cssRule);
 					} else if (ruleInfo) {
-						processRuleInfo(cssRuleData, ruleInfo);
+						processRuleInfo(cssRuleData, ruleInfo, pseudoSelectors);
 						if (!cssRuleData.prelude.children.getSize() || !cssRuleData.block.children.getSize()) {
 							removedCssRules.push(cssRule);
 						}
@@ -91,7 +92,7 @@ this.cssRulesMinifier = this.cssRulesMinifier || (() => {
 		}
 	}
 
-	function processRuleInfo(cssRule, ruleInfo) {
+	function processRuleInfo(cssRule, ruleInfo, pseudoSelectors) {
 		const removedDeclarations = [];
 		const removedSelectors = [];
 		for (let declaration = cssRule.block.children.head; declaration; declaration = declaration.next) {
@@ -100,7 +101,8 @@ this.cssRulesMinifier = this.cssRulesMinifier || (() => {
 			}
 		}
 		for (let selector = cssRule.prelude.children.head; selector; selector = selector.next) {
-			if (!ruleInfo.matchedSelectors.has(cssTree.generate(selector.data))) {
+			const selectorText = cssTree.generate(selector.data);
+			if (!ruleInfo.matchedSelectors.has(selectorText) && (!pseudoSelectors || !pseudoSelectors.has(selectorText))) {
 				removedSelectors.push(selector);
 			}
 		}