Skip to content

Commit

Permalink
fix(html/minifier): Avoid ; at the end of js (#6188)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Oct 18, 2022
1 parent 8ec2e8d commit 5571c0c
Show file tree
Hide file tree
Showing 24 changed files with 54 additions and 53 deletions.
1 change: 1 addition & 0 deletions crates/swc_html_minifier/src/lib.rs
Expand Up @@ -1740,6 +1740,7 @@ impl Minifier<'_> {

options.codegen.minify = true;
options.codegen.target = options.parser.target;
options.codegen.omit_last_semi = true;

let mut emitter = swc_ecma_codegen::Emitter {
cfg: options.codegen,
Expand Down
@@ -1,5 +1,5 @@
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"><title>Document</title><button type=button onclick=a(3); ng-click=a(3); data-click=a(3);></button>
<button type=button onclick=a(3); ng-click=a(3); data-click=a(3);></button>
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"><title>Document</title><button type=button onclick=a(3) ng-click=a(3) data-click=a(3)></button>
<button type=button onclick=a(3) ng-click=a(3) data-click=a(3)></button>
<div data-json='{"foo":"bar"}'></div>
<div data-style=color:red;background-color:red></div>
<iframe srcdoc="<p>test." src=nosrcdoc.html></iframe>
Expand Down
@@ -1,2 +1,2 @@
<!doctype html><html lang=en><title>Document</title><link rel=stylesheet href=test.css media="screen and (min-width:1024px)"><a rel="bar baz foo"></a>
<div onclick='t:alert("test");'></div>
<div onclick='t:alert("test")'></div>
Expand Up @@ -6,6 +6,6 @@

<div>test</div>
<div>test</div>
<div onblur='alert("test");'>test</div>
<div onblur='alert("test")'>test</div>
<div>test</div>
<div onblur=#>test</div>
@@ -1,12 +1,12 @@
<!doctype html><html lang=en><title>Document</title><form action=/test>
<input onkeydown=myFunction();>
<input onkeydown=myFunction()>
</form>
<div type=text onmouseover=myFunction();>test</div>
<div type=text onmouseover=myFunction();>test</div>
<div type=text onmouseover=myFunction()>test</div>
<div type=text onmouseover=myFunction()>test</div>
<div type=text>test</div>
<svg version=1.1 viewBox="0 0 100 100" preserveAspectRatio="xMidYMid slice" style=width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1>
<circle onmouseover='alert("test");' cx=50 cy=50 r=30 style=fill:url(#gradient) />
<circle onmouseover='alert("test")' cx=50 cy=50 r=30 style=fill:url(#gradient) />
</svg>
<div type=text onmouseover=myFunction();>test</div>
<a href=https://datacadamia.com onclick="console.log(`Navigation to ${this.href} cancelled`);return false;">Click me</a>
<a href=https://datacadamia.com onclick="console.log(`Navigation to ${this.href} cancelled`);return false;">Click me</a>
<div type=text onmouseover=myFunction()>test</div>
<a href=https://datacadamia.com onclick="console.log(`Navigation to ${this.href} cancelled`);return false">Click me</a>
<a href=https://datacadamia.com onclick="console.log(`Navigation to ${this.href} cancelled`);return false">Click me</a>
@@ -1,2 +1,2 @@
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"><meta http-equiv=X-UA-Compatible content="ie=edge"><title>Document</title><a href=http://www.google.co.uk/ onclick='return confirm("Follow this link?");'>Google</a>
<a href=http://www.google.co.uk/ onclick='alert("testtest");'>Google</a>
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"><meta http-equiv=X-UA-Compatible content="ie=edge"><title>Document</title><a href=http://www.google.co.uk/ onclick='return confirm("Follow this link?")'>Google</a>
<a href=http://www.google.co.uk/ onclick='alert("testtest")'>Google</a>
@@ -1,6 +1,6 @@
<!doctype html><script defer>console.log();</script><script>console.log();</script><script>console.log();</script><script type=module>console.log();</script><script type=module>console.log();</script><script>window.jQuery||document.write('<script src="jquery.js"></script>');</script><script type=text/html>
<!doctype html><script defer>console.log()</script><script>console.log()</script><script>console.log()</script><script type=module>console.log()</script><script type=module>console.log()</script><script>window.jQuery||document.write('<script src="jquery.js"></script>')</script><script type=text/html>
<div>
test
</div>
<!-- aa -->\n
</script><script type="">alert(1)</script><script type=modules>alert(1)</script><script>alert(1);</script><script>alert(1);</script><script type=module src=app.mjs></script><script nomodule defer src=classic-app-bundle.js></script><script>alert(1)</script><script type=text/vbscript>MsgBox("foo bar")</script><script type="">MsgBox("foo bar")</script><script type=;;;;;>MsgBox("foo bar")</script><script>alert(1);</script><script>alert(1);</script><script>alert(1);</script><script>alert(1);</script><script>alert(1);</script><script>alert(1);</script><script>alert(1);</script><script></script>
</script><script type="">alert(1)</script><script type=modules>alert(1)</script><script>alert(1)</script><script>alert(1)</script><script type=module src=app.mjs></script><script nomodule defer src=classic-app-bundle.js></script><script>alert(1)</script><script type=text/vbscript>MsgBox("foo bar")</script><script type="">MsgBox("foo bar")</script><script type=;;;;;>MsgBox("foo bar")</script><script>alert(1)</script><script>alert(1)</script><script>alert(1)</script><script>alert(1)</script><script>alert(1)</script><script>alert(1)</script><script>alert(1)</script><script></script>
Expand Up @@ -8,8 +8,8 @@


<div>baz</div>
<script></script><script>alert(1);</script><style>p{color:red}</style><script>alert(8);</script>
<script>alert(10);</script>
<script></script><script>alert(1)</script><style>p{color:red}</style><script>alert(8)</script>
<script>alert(10)</script>
<!-- @preserve foo -->
<!-- @copyright foo -->
<!-- @lic foo -->
Expand Down
Expand Up @@ -10,8 +10,8 @@
<!-- foo --><div>baz</div><!-- bar
moo -->
<script></script><script>alert(1);</script><style>p{color:red}</style><script>alert(8);</script>
<script>alert(10);</script>
<script></script><script>alert(1)</script><style>p{color:red}</style><script>alert(8)</script>
<script>alert(10)</script>
<!-- @preserve foo -->
<!-- @copyright foo -->
<!-- @lic foo -->
Expand Down
Expand Up @@ -2,7 +2,7 @@


<div>baz</div>
<script></script><script>alert(1);</script><style>p{color:red}</style><script>alert(8);</script>
<script>alert(10);</script>
<script></script><script>alert(1)</script><style>p{color:red}</style><script>alert(8)</script>
<script>alert(10)</script>
<!--! test -->
<!-- ko if: someExpressionGoesHere --><li>test</li><!-- /ko -->
@@ -1,3 +1,3 @@
<!doctype html><html lang=en><title>Document</title><body><script type=text/custom-module>console.log("testtest");</script><script type=text/custom-script>console.log("testtest");</script><script type=text/custom-json>{"foo":"bar"}</script><script type=text/custom-css>a{color:#fff}</script><script type=text/html><div data-foo=bar> <span> foobar </span>
<!doctype html><html lang=en><title>Document</title><body><script type=text/custom-module>console.log("testtest")</script><script type=text/custom-script>console.log("testtest")</script><script type=text/custom-json>{"foo":"bar"}</script><script type=text/custom-css>a{color:#fff}</script><script type=text/html><div data-foo=bar> <span> foobar </span>

</div></script>
Expand Up @@ -11,4 +11,4 @@
"description": "This coffee cake is awesome and perfect for parties.",
"prepTime": "PT20M"
}
</script><script>alert("testtest");</script>
</script><script>alert("testtest")</script>
@@ -1,4 +1,4 @@
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"><title>Document</title><form oninput="result.value=parseInt(a.value)+parseInt(b.value);">
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"><title>Document</title><form oninput="result.value=parseInt(a.value)+parseInt(b.value)">
<input type=range id=b name=b value=50> +
<input type=number id=a name=a value=10> =
<output name=result for="a b">60</output>
Expand Down
@@ -1,2 +1,2 @@
<!doctype html><html lang=en><title>Document</title><body><script type=module>/* Keep comment */ debugger;// Keep comment
console.log("test \u{1F600} test");</script>
console.log("test \u{1F600} test")</script>
@@ -1,4 +1,4 @@
<!doctype html><title>Party Coffee Cake</title><!--[if lte IE 8]><script>alert("ie8!test");</script><![endif]--><script type=application/ld+json>{"@context":"https://schema.org/","@type":"Recipe","author":{"@type":"Person","name":"Mary Stone"},"datePublished":"2018-03-10","description":"This coffee cake is awesome and perfect for parties.","name":"Party Coffee Cake","prepTime":"PT20M"}</script><script type=application/ld+json crossorigin=anonymous>{"@context":"https://schema.org/","@type":"Recipe","author":{"@type":"Person","name":"Mary Stone"},"datePublished":"2018-03-10","description":"This coffee cake is awesome and perfect for parties.","name":"Party Coffee Cake","prepTime":"PT20M"}</script><script type=application/ld+json crossorigin=anonymous>
<!doctype html><title>Party Coffee Cake</title><!--[if lte IE 8]><script>alert("ie8!test")</script><![endif]--><script type=application/ld+json>{"@context":"https://schema.org/","@type":"Recipe","author":{"@type":"Person","name":"Mary Stone"},"datePublished":"2018-03-10","description":"This coffee cake is awesome and perfect for parties.","name":"Party Coffee Cake","prepTime":"PT20M"}</script><script type=application/ld+json crossorigin=anonymous>{"@context":"https://schema.org/","@type":"Recipe","author":{"@type":"Person","name":"Mary Stone"},"datePublished":"2018-03-10","description":"This coffee cake is awesome and perfect for parties.","name":"Party Coffee Cake","prepTime":"PT20M"}</script><script type=application/ld+json crossorigin=anonymous>
{
broken
</script><script type=unknown>
Expand All @@ -19,15 +19,15 @@

</script><script id=data type=application/json>{"foo":"bar"}</script><script>
broken broken
</script><script>var a=3;</script><script>var a=9;</script><script type=module>import t from"foo.js";let o=58800,e="testtest";</script><script>let e=new Date;alert("Today's date is "+e);</script><script src=javascript.js>
</script><script>var a=3</script><script>var a=9</script><script type=module>import t from"foo.js";let o=58800,e="testtest"</script><script>let e=new Date;alert("Today's date is "+e)</script><script src=javascript.js>



</script><script src=javascript.js>

var q = "WRONG" ;

</script><script>let t="testtest";</script><script>alert("<!--");</script><script>alert("<!-- foo -->");</script><script>alert("-->");</script><script></script><script>alert("testtest");</script><script>function a(){var a=1,n=2;alert(a+" "+n)}</script><script></script><h2>Party coffee cake recipe</h2>
</script><script>let t="testtest"</script><script>alert("<!--")</script><script>alert("<!-- foo -->")</script><script>alert("-->")</script><script></script><script>alert("testtest")</script><script>function a(){var a=1,n=2;alert(a+" "+n)}</script><script></script><h2>Party coffee cake recipe</h2>
<p>
<i>by Mary Stone, 2018-03-10</i>
</p>
Expand All @@ -38,11 +38,11 @@
Preparation time: 20 minutes
</p>
<svg>
<script>alert("test");</script>
<script>alert("test")</script>
<script>alert(1)</script>
</svg>
<svg viewBox="0 0 10 10">
<script>window.addEventListener("DOMContentLoaded",()=>{function t(){let t=Math.round(255*Math.random()).toString(16).padStart(2,"0"),n=Math.round(255*Math.random()).toString(16).padStart(2,"0"),r=Math.round(255*Math.random()).toString(16).padStart(2,"0");return`#${t}${n}${r}`}document.querySelector("circle").addEventListener("click",n=>{n.target.style.fill=t()})});</script>
<script>window.addEventListener("DOMContentLoaded",()=>{function t(){let t=Math.round(255*Math.random()).toString(16).padStart(2,"0"),n=Math.round(255*Math.random()).toString(16).padStart(2,"0"),r=Math.round(255*Math.random()).toString(16).padStart(2,"0");return`#${t}${n}${r}`}document.querySelector("circle").addEventListener("click",n=>{n.target.style.fill=t()})})</script>

<circle cx=5 cy=5 r=4 />
</svg>
Expand All @@ -54,4 +54,4 @@
alert('test')
</script>
</math>
<script blocking="a render">console.log("block");</script><script>(function(t){var t="test"+Math.random()+t,a=1,o=2+Math.random();alert(a+" "+o);console.log(Math.random())})("test");</script>
<script blocking="a render">console.log("block")</script><script>(function(t){var t="test"+Math.random()+t,a=1,o=2+Math.random();alert(a+" "+o);console.log(Math.random())})("test")</script>
Expand Up @@ -278,15 +278,15 @@

<svg viewBox="0 0 220 100">

<rect width=100 height=100 onclick='alert("testtest");'/>
<rect width=100 height=100 onclick='alert("testtest");'/>
<rect width=100 height=100 onclick='alert("testtest")'/>
<rect width=100 height=100 onclick='alert("testtest")'/>


<rect x=120 width=100 height=100 rx=15 />
</svg>

<svg>
<a href=" test.html " ondragexit='alert("testtest");' rel="nofollow noindex">Test</a>
<a href=" test.html " ondragexit='alert("testtest")' rel="nofollow noindex">Test</a>
</svg>

<svg viewBox="0 0 100 100" width=160 height=60 y=30>
Expand Down

1 comment on commit 5571c0c

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 5571c0c Previous: a4acc7a Ratio
es/full/minify/libraries/antd 1738436473 ns/iter (± 43001236) 1909597719 ns/iter (± 53347292) 0.91
es/full/minify/libraries/d3 407545338 ns/iter (± 38618226) 433130176 ns/iter (± 25176552) 0.94
es/full/minify/libraries/echarts 1508277781 ns/iter (± 32292965) 1753659822 ns/iter (± 84140472) 0.86
es/full/minify/libraries/jquery 101713229 ns/iter (± 7236603) 106717014 ns/iter (± 4167257) 0.95
es/full/minify/libraries/lodash 128533366 ns/iter (± 13463964) 122953984 ns/iter (± 10876829) 1.05
es/full/minify/libraries/moment 61125493 ns/iter (± 6934638) 60073411 ns/iter (± 5602582) 1.02
es/full/minify/libraries/react 22546022 ns/iter (± 1783689) 20460327 ns/iter (± 1403960) 1.10
es/full/minify/libraries/terser 336585087 ns/iter (± 11097788) 301614761 ns/iter (± 10522920) 1.12
es/full/minify/libraries/three 535459828 ns/iter (± 9773021) 548762534 ns/iter (± 16047860) 0.98
es/full/minify/libraries/typescript 3360677952 ns/iter (± 100746693) 3457348762 ns/iter (± 558271844) 0.97
es/full/minify/libraries/victory 860272756 ns/iter (± 307288267) 874350916 ns/iter (± 56319603) 0.98
es/full/minify/libraries/vue 168109641 ns/iter (± 27485653) 151179525 ns/iter (± 9793157) 1.11
es/full/codegen/es3 34722 ns/iter (± 1401) 38741 ns/iter (± 5939) 0.90
es/full/codegen/es5 33717 ns/iter (± 4714) 49259 ns/iter (± 7667) 0.68
es/full/codegen/es2015 33212 ns/iter (± 642) 37237 ns/iter (± 7307) 0.89
es/full/codegen/es2016 33465 ns/iter (± 1301) 43224 ns/iter (± 8500) 0.77
es/full/codegen/es2017 33802 ns/iter (± 5744) 40353 ns/iter (± 8037) 0.84
es/full/codegen/es2018 33398 ns/iter (± 1101) 35040 ns/iter (± 4843) 0.95
es/full/codegen/es2019 33402 ns/iter (± 867) 36147 ns/iter (± 4502) 0.92
es/full/codegen/es2020 33311 ns/iter (± 1279) 36524 ns/iter (± 5276) 0.91
es/full/all/es3 211963740 ns/iter (± 29065958) 203398641 ns/iter (± 15810554) 1.04
es/full/all/es5 191002111 ns/iter (± 31450852) 193367542 ns/iter (± 20017270) 0.99
es/full/all/es2015 150678918 ns/iter (± 9518374) 151886487 ns/iter (± 14029725) 0.99
es/full/all/es2016 181957349 ns/iter (± 30727350) 169033923 ns/iter (± 21125912) 1.08
es/full/all/es2017 175693868 ns/iter (± 19397752) 175591754 ns/iter (± 23432186) 1.00
es/full/all/es2018 143224221 ns/iter (± 13996092) 165901126 ns/iter (± 27962451) 0.86
es/full/all/es2019 146807423 ns/iter (± 17197445) 170486310 ns/iter (± 21513715) 0.86
es/full/all/es2020 160208479 ns/iter (± 24574098) 154737318 ns/iter (± 13425932) 1.04
es/full/parser 719417 ns/iter (± 47384) 805762 ns/iter (± 136190) 0.89
es/full/base/fixer 27049 ns/iter (± 5376) 31050 ns/iter (± 4414) 0.87
es/full/base/resolver_and_hygiene 92911 ns/iter (± 11027) 98035 ns/iter (± 13250) 0.95
serialization of ast node 212 ns/iter (± 18) 232 ns/iter (± 49) 0.91
serialization of serde 218 ns/iter (± 28) 225 ns/iter (± 41) 0.97

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.