From b6bf66a27e828c596bd7a1aa52390c01e2cc9c35 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Tue, 15 Nov 2022 18:39:23 +0300 Subject: [PATCH 1/5] fix(html/minifier): remove empty script and style with attributes --- crates/swc_html_minifier/src/lib.rs | 61 ++++++++++++++----- .../empty-metadata-elements/input.html | 16 +++++ .../empty-metadata-elements/output.min.html | 10 ++- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/crates/swc_html_minifier/src/lib.rs b/crates/swc_html_minifier/src/lib.rs index 634e7fa0e98c..b6295df69a29 100644 --- a/crates/swc_html_minifier/src/lib.rs +++ b/crates/swc_html_minifier/src/lib.rs @@ -608,6 +608,15 @@ impl Minifier<'_> { } } + fn is_type_text_css(&self, value: &JsWord) -> bool { + let value = value.trim().to_ascii_lowercase(); + + match &*value { + "text/css" => true, + _ => false, + } + } + fn is_default_attribute_value(&self, element: &Element, attribute: &Attribute) -> bool { let attribute_value = match &attribute.value { Some(value) => value, @@ -652,7 +661,7 @@ impl Minifier<'_> { }, js_word!("link") => { if attribute.name == js_word!("type") - && &*attribute_value.trim().to_ascii_lowercase() == "text/css" + && self.is_type_text_css(attribute_value) { return true; } @@ -1305,9 +1314,38 @@ impl Minifier<'_> { fn is_empty_metadata_element(&self, child: &Child) -> bool { if let Child::Element(element) = child { - if (!self.is_element_displayed(element) - || (matches!(element.namespace, Namespace::HTML | Namespace::SVG) - && element.tag_name == js_word!("script")) + if matches!(element.namespace, Namespace::HTML | Namespace::SVG) + && element.tag_name == js_word!("style") + && self.is_empty_children(&element.children) + { + if element.attributes.is_empty() { + return true; + } + + if element.attributes.len() == 1 { + return element.attributes.iter().all(|attr| { + attr.name == js_word!("type") + && attr.value.is_some() + && self.is_type_text_css(attr.value.as_ref().unwrap()) + }); + } + } else if matches!(element.namespace, Namespace::HTML | Namespace::SVG) + && element.tag_name == js_word!("script") + && self.is_empty_children(&element.children) + { + if element.attributes.is_empty() { + return true; + } + + if element.attributes.len() == 1 { + return element.attributes.iter().all(|attr| { + attr.name == js_word!("type") + && attr.value.is_some() + && (attr.value == Some(js_word!("module")) + || self.is_type_text_javascript(attr.value.as_ref().unwrap())) + }); + } + } else if (!self.is_element_displayed(element) || (element.namespace == Namespace::HTML && element.tag_name == js_word!("noscript"))) && element.attributes.is_empty() @@ -1360,7 +1398,7 @@ impl Minifier<'_> { } js_word!("type") => { if let Some(value) = &attribute.value { - if (is_style_tag && value.trim().to_ascii_lowercase() == "text/css") + if (is_style_tag && self.is_type_text_css(value)) || (is_script_tag && self.is_type_text_javascript(value)) { false @@ -1402,7 +1440,7 @@ impl Minifier<'_> { } js_word!("type") => { if let Some(value) = &attribute.value { - if (is_style_tag && value.trim().to_ascii_lowercase() == "text/css") + if (is_style_tag && self.is_type_text_css(value)) || (is_script_tag && self.is_type_text_javascript(value)) { false @@ -3005,21 +3043,14 @@ impl VisitMut for Minifier<'_> { for attribute in ¤t_element.attributes { if attribute.name == js_word!("type") && attribute.value.is_some() { - type_attribute_value = Some( - attribute - .value - .as_ref() - .unwrap() - .trim() - .to_ascii_lowercase(), - ); + type_attribute_value = Some(attribute.value.as_ref().unwrap()); break; } } if type_attribute_value.is_none() - || type_attribute_value == Some("text/css".into()) + || self.is_type_text_css(type_attribute_value.as_ref().unwrap()) { text_type = Some(MinifierType::Css) } diff --git a/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/input.html b/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/input.html index ef1a405fd9de..8bcbb4fba303 100644 --- a/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/input.html +++ b/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/input.html @@ -19,5 +19,21 @@ + +Empty modules + + +Empty scripts + +Empty styles + \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html b/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html index d92d186dfaa6..8e426f24108a 100644 --- a/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html @@ -1,4 +1,12 @@ - \ No newline at end of file + + + +Empty modules + + +Empty scripts + +Empty styles \ No newline at end of file From 3997b2090459db122d62e291c24582ece88b8140 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 16 Nov 2022 02:35:24 +0300 Subject: [PATCH 2/5] fix: clippy --- crates/swc_html_minifier/src/lib.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/swc_html_minifier/src/lib.rs b/crates/swc_html_minifier/src/lib.rs index b6295df69a29..bf6f343c271b 100644 --- a/crates/swc_html_minifier/src/lib.rs +++ b/crates/swc_html_minifier/src/lib.rs @@ -611,10 +611,7 @@ impl Minifier<'_> { fn is_type_text_css(&self, value: &JsWord) -> bool { let value = value.trim().to_ascii_lowercase(); - match &*value { - "text/css" => true, - _ => false, - } + matches!(&*value, "text/css") } fn is_default_attribute_value(&self, element: &Element, attribute: &Attribute) -> bool { From ecd0c5816ff257c89a654a60d8b21a6a77f368e1 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 16 Nov 2022 04:45:50 +0300 Subject: [PATCH 3/5] test: more --- .../fixture/element/script-group/input.html | 27 +++++++++++++++++++ .../element/script-group/output.min.html | 13 ++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/input.html b/crates/swc_html_minifier/tests/fixture/element/script-group/input.html index 1b9a6d7be4d5..e234ef4e7c29 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/input.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/input.html @@ -223,5 +223,32 @@ + + + +
breaker
+ + + + + + +
breaker
+ + + +
breaker
+ + + + \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html index 61f332ee80bc..e088303cc1f4 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html @@ -94,8 +94,19 @@
breaker
+
breaker
- \ No newline at end of file + + + + + +
breaker
+ + + +
breaker
+ \ No newline at end of file From 26daa59af82a4857bc34efdf4991d5cc35cae1e5 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 16 Nov 2022 20:47:02 +0300 Subject: [PATCH 4/5] test: update --- .../tests/fixture/element/script-group/input.html | 3 --- .../tests/fixture/element/script-group/output.min.html | 3 --- 2 files changed, 6 deletions(-) diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/input.html b/crates/swc_html_minifier/tests/fixture/element/script-group/input.html index e234ef4e7c29..3bd9d8bcb8ce 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/input.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/input.html @@ -234,9 +234,6 @@ - - -
breaker
diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html index e088303cc1f4..99aab8cb4780 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html @@ -101,9 +101,6 @@ - - -
breaker
From bd648623510261f5a50a9d783594d1dc5f95f2fa Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 16 Nov 2022 20:53:08 +0300 Subject: [PATCH 5/5] test: update --- .../empty-metadata-elements/output.min.html | 4 ---- .../fixture/element/script-group/output.min.html | 15 +++++++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html b/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html index 8e426f24108a..c667b4c4f227 100644 --- a/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/empty-metadata-elements/output.min.html @@ -2,11 +2,7 @@ - - Empty modules - - Empty scripts Empty styles \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html index 99aab8cb4780..761bfadc4b90 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html @@ -94,16 +94,19 @@
breaker
-
breaker
- - -
breaker
- + + +
breaker
- \ No newline at end of file + +
breaker
+ + + +
breaker
\ No newline at end of file