Procházet zdrojové kódy

make sure @media rules are always correct

Gildas před 7 roky
rodič
revize
f33ef5de44

+ 6 - 6
lib/single-file/css-fonts-minifier.js

@@ -151,7 +151,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
 
 	function getFontsInfo(cssRules, fontsInfo) {
 		cssRules.forEach(cssRule => {
-			if (cssRule.type == "Atrule" && cssRule.name == "media") {
+			if (cssRule.type == "Atrule" && cssRule.name == "media" && cssRule.block) {
 				getFontsInfo(cssRule.block.children, fontsInfo);
 			} else if (cssRule.type == "Rule") {
 				const fontFamilyNames = getFontFamilyNames(cssRule.block);
@@ -176,7 +176,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
 		const removedRules = [];
 		for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
 			const ruleData = cssRule.data;
-			if (ruleData.type == "Atrule" && ruleData.name == "media") {
+			if (ruleData.type == "Atrule" && ruleData.name == "media" && ruleData.block) {
 				filterUnusedFonts(ruleData.block.children, declaredFonts, unusedFonts, filteredUsedFonts, docContent);
 			} else if (ruleData.type == "Atrule" && ruleData.name == "font-face") {
 				const fontFamily = getFontFamily(getPropertyValue(ruleData, "font-family"));
@@ -214,7 +214,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
 		const removedRules = [];
 		for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
 			const ruleData = cssRule.data;
-			if (ruleData.type == "Atrule" && ruleData.name == "media") {
+			if (ruleData.type == "Atrule" && ruleData.name == "media" && ruleData.block && ruleData.prelude) {
 				const mediaText = cssTree.generate(ruleData.prelude);
 				processFontFaceRules(ruleData.block.children, fontsDetails, mediaText, stats);
 			} else if (ruleData.type == "Atrule" && ruleData.name == "font-face" && (media.includes("all") || media.includes("screen"))) {
@@ -295,7 +295,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
 			const findPreviousComma = node => {
 				for (; node && !(node.data.type == "Operator" && node.data.value == ","); node = node.prev);
 				return node;
-			}
+			};
 			for (let node = font.data.value.children.tail; node && (node.data.type != "WhiteSpace" || findPreviousComma(node)); node = node.prev) {
 				if (node.data.type == "Operator" && node.data.value == "," && familyName) {
 					fontFamilyNames.push(getFontFamily(familyName));
@@ -313,7 +313,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
 
 	function getFontsDetails(doc, cssRules, fontsDetails) {
 		cssRules.forEach(cssRule => {
-			if (cssRule.type == "Atrule" && cssRule.name == "media") {
+			if (cssRule.type == "Atrule" && cssRule.name == "media" && cssRule.block) {
 				getFontsDetails(doc, cssRule.block.children, fontsDetails);
 			} else {
 				if (cssRule.type == "Atrule" && cssRule.name == "font-face") {
@@ -371,7 +371,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
 
 	function getPseudoElementsContent(cssRules) {
 		return cssRules.toArray().map(cssRule => {
-			if (cssRule.type == "Atrule" && cssRule.name == "media") {
+			if (cssRule.type == "Atrule" && cssRule.name == "media" && cssRule.block) {
 				return getPseudoElementsContent(cssRule.block.children);
 			} else if (cssRule.type == "Rule") {
 				const selector = cssTree.generate(cssRule.prelude); // TODO use OM

+ 1 - 1
lib/single-file/css-medias-minifier.js

@@ -41,7 +41,7 @@ this.mediasMinifier = this.mediasMinifier || (() => {
 	function processRules(cssRules, stats, removedRules = []) {
 		for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
 			const cssRuleData = cssRule.data;
-			if (cssRuleData.type == "Atrule" && cssRuleData.name == "media") {
+			if (cssRuleData.type == "Atrule" && cssRuleData.name == "media" && cssRuleData.block && cssRuleData.prelude) {
 				stats.processed++;
 				if (matchesMediaType(cssTree.generate(cssRuleData.prelude), "screen")) {
 					processRules(cssRuleData.block.children, stats, removedRules);

+ 1 - 1
lib/single-file/css-rules-minifier.js

@@ -64,7 +64,7 @@ this.cssRulesMinifier = this.cssRulesMinifier || (() => {
 		const removedCssRules = [];
 		for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
 			const cssRuleData = cssRule.data;
-			if (cssRuleData.type == "Atrule" && cssRuleData.name == "media" && cssRuleData.block) {
+			if (cssRuleData.type == "Atrule" && cssRuleData.name == "media" && cssRuleData.block && cssRuleData.prelude) {
 				const mediaText = cssTree.generate(cssRuleData.prelude);
 				processRules(cssRuleData.block.children, sheetIndex, mediaInfo.medias.get("rule-" + sheetIndex + "-" + mediaRuleIndex + "-" + mediaText));
 				mediaRuleIndex++;

+ 1 - 1
lib/single-file/single-file-core.js

@@ -1162,7 +1162,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			await Promise.all(cssRules.map(async cssRule => {
 				if (cssRule.type == "Rule") {
 					await this.processStyle(cssRule.block.children.toArray(), baseURI, options, cssVariables, batchRequest);
-				} else if (cssRule.type == "Atrule" && cssRule.name == "media") {
+				} else if (cssRule.type == "Atrule" && cssRule.name == "media" && cssRule.block) {
 					await this.processStylesheet(cssRule.block.children.toArray(), baseURI, options, cssVariables, batchRequest);
 				} else if (cssRule.type == "Atrule" && cssRule.name == "font-face") {
 					await Promise.all(cssRule.block.children.toArray().map(async declaration => {