LibWeb: Allow parsing of <quirky-color>

This commit is contained in:
Callum Law 2025-05-15 19:10:14 +12:00 committed by Tim Ledbetter
commit 2bb40b615a
Notes: github-actions[bot] 2025-05-17 05:48:55 +00:00
5 changed files with 1154 additions and 1 deletions

View file

@ -1936,7 +1936,7 @@ RefPtr<CSSStyleValue const> Parser::parse_color_value(TokenStream<ComponentValue
}
for (auto i = 1u; i < m_value_context.size() && quirky_color_allowed; i++) {
quirky_color_allowed = m_value_context[i].visit(
[](PropertyID const& property_id) { return property_has_quirk(property_id, Quirk::UnitlessLength); },
[](PropertyID const& property_id) { return property_has_quirk(property_id, Quirk::HashlessHexColor); },
[](FunctionContext const&) { return false; },
[](DescriptorContext const&) { return false; });
}

View file

@ -0,0 +1,697 @@
Harness status: OK
Found 692 tests
692 Pass
Pass 123
Pass 123 (SVG)
Pass 023
Pass 023 (SVG)
Pass 003
Pass 003 (SVG)
Pass 000
Pass 000 (SVG)
Pass abc
Pass abc (SVG)
Pass ABC
Pass ABC (SVG)
Pass 1ab
Pass 1ab (SVG)
Pass 1AB
Pass 1AB (SVG)
Pass 112233
Pass 112233 (SVG)
Pass 012233
Pass 012233 (SVG)
Pass 002233
Pass 002233 (SVG)
Pass 000233
Pass 000233 (SVG)
Pass 000033
Pass 000033 (SVG)
Pass 000003
Pass 000003 (SVG)
Pass 000000
Pass 000000 (SVG)
Pass aabbcc
Pass aabbcc (SVG)
Pass AABBCC
Pass AABBCC (SVG)
Pass 11aabb
Pass 11aabb (SVG)
Pass 11AABB
Pass 11AABB (SVG)
Pass \31 23
Pass \31 23 (SVG)
Pass \61 bc
Pass \61 bc (SVG)
Pass \41 BC
Pass \41 BC (SVG)
Pass \31 ab
Pass \31 ab (SVG)
Pass \31 AB
Pass \31 AB (SVG)
Pass \31 12233
Pass \31 12233 (SVG)
Pass \61 abbcc
Pass \61 abbcc (SVG)
Pass \41 ABBCC
Pass \41 ABBCC (SVG)
Pass \31 1aabb
Pass \31 1aabb (SVG)
Pass \31 1AABB
Pass \31 1AABB (SVG)
Pass 12\33
Pass 12\33 (SVG)
Pass 1
Pass 1 (SVG)
Pass 12
Pass 12 (SVG)
Pass 1234
Pass 1234 (SVG)
Pass 12345
Pass 12345 (SVG)
Pass 1234567
Pass 1234567 (SVG)
Pass 12345678
Pass 12345678 (SVG)
Pass a
Pass a (SVG)
Pass aa
Pass aa (SVG)
Pass aaaa
Pass aaaa (SVG)
Pass aaaaa
Pass aaaaa (SVG)
Pass aaaaaaa
Pass aaaaaaa (SVG)
Pass aaaaaaaa
Pass aaaaaaaa (SVG)
Pass A
Pass A (SVG)
Pass AA
Pass AA (SVG)
Pass AAAA
Pass AAAA (SVG)
Pass AAAAA
Pass AAAAA (SVG)
Pass AAAAAAA
Pass AAAAAAA (SVG)
Pass AAAAAAAA
Pass AAAAAAAA (SVG)
Pass 1a
Pass 1a (SVG)
Pass 1abc
Pass 1abc (SVG)
Pass 1abcd
Pass 1abcd (SVG)
Pass 1abcdef
Pass 1abcdef (SVG)
Pass 1abcdeff
Pass 1abcdeff (SVG)
Pass +1
Pass +1 (SVG)
Pass +12
Pass +12 (SVG)
Pass +123
Pass +123 (SVG)
Pass +1234
Pass +1234 (SVG)
Pass +12345
Pass +12345 (SVG)
Pass +123456
Pass +123456 (SVG)
Pass +1234567
Pass +1234567 (SVG)
Pass +12345678
Pass +12345678 (SVG)
Pass -1
Pass -1 (SVG)
Pass -12
Pass -12 (SVG)
Pass -123
Pass -123 (SVG)
Pass -1234
Pass -1234 (SVG)
Pass -12345
Pass -12345 (SVG)
Pass -123456
Pass -123456 (SVG)
Pass -1234567
Pass -1234567 (SVG)
Pass -12345678
Pass -12345678 (SVG)
Pass +1a
Pass +1a (SVG)
Pass +12a
Pass +12a (SVG)
Pass +123a
Pass +123a (SVG)
Pass +1234a
Pass +1234a (SVG)
Pass +12345a
Pass +12345a (SVG)
Pass +123456a
Pass +123456a (SVG)
Pass +1234567a
Pass +1234567a (SVG)
Pass -1a
Pass -1a (SVG)
Pass -12a
Pass -12a (SVG)
Pass -123a
Pass -123a (SVG)
Pass -1234a
Pass -1234a (SVG)
Pass -12345a
Pass -12345a (SVG)
Pass -123456a
Pass -123456a (SVG)
Pass -1234567a
Pass -1234567a (SVG)
Pass -12345678a
Pass -12345678a (SVG)
Pass +1A
Pass +1A (SVG)
Pass +12A
Pass +12A (SVG)
Pass +123A
Pass +123A (SVG)
Pass +1234A
Pass +1234A (SVG)
Pass +12345A
Pass +12345A (SVG)
Pass +123456A
Pass +123456A (SVG)
Pass +1234567A
Pass +1234567A (SVG)
Pass -1A
Pass -1A (SVG)
Pass -12A
Pass -12A (SVG)
Pass -123A
Pass -123A (SVG)
Pass -1234A
Pass -1234A (SVG)
Pass -12345A
Pass -12345A (SVG)
Pass -123456A
Pass -123456A (SVG)
Pass -1234567A
Pass -1234567A (SVG)
Pass -12345678A
Pass -12345678A (SVG)
Pass +a
Pass +a (SVG)
Pass +aa
Pass +aa (SVG)
Pass +aaa
Pass +aaa (SVG)
Pass +aaaa
Pass +aaaa (SVG)
Pass +aaaaa
Pass +aaaaa (SVG)
Pass +aaaaaa
Pass +aaaaaa (SVG)
Pass +aaaaaaa
Pass +aaaaaaa (SVG)
Pass +aaaaaaaa
Pass +aaaaaaaa (SVG)
Pass -a
Pass -a (SVG)
Pass -aa
Pass -aa (SVG)
Pass -aaa
Pass -aaa (SVG)
Pass -aaaa
Pass -aaaa (SVG)
Pass -aaaaa
Pass -aaaaa (SVG)
Pass -aaaaaa
Pass -aaaaaa (SVG)
Pass -aaaaaaa
Pass -aaaaaaa (SVG)
Pass -aaaaaaaa
Pass -aaaaaaaa (SVG)
Pass -aaaaaaaaa
Pass -aaaaaaaaa (SVG)
Pass +A
Pass +A (SVG)
Pass +AA
Pass +AA (SVG)
Pass +AAA
Pass +AAA (SVG)
Pass +AAAA
Pass +AAAA (SVG)
Pass +AAAAA
Pass +AAAAA (SVG)
Pass +AAAAAA
Pass +AAAAAA (SVG)
Pass +AAAAAAA
Pass +AAAAAAA (SVG)
Pass +AAAAAAAA
Pass +AAAAAAAA (SVG)
Pass -A
Pass -A (SVG)
Pass -AA
Pass -AA (SVG)
Pass -AAA
Pass -AAA (SVG)
Pass -AAAA
Pass -AAAA (SVG)
Pass -AAAAA
Pass -AAAAA (SVG)
Pass -AAAAAA
Pass -AAAAAA (SVG)
Pass -AAAAAAA
Pass -AAAAAAA (SVG)
Pass -AAAAAAAA
Pass -AAAAAAAA (SVG)
Pass -AAAAAAAAA
Pass -AAAAAAAAA (SVG)
Pass 1.1
Pass 1.1 (SVG)
Pass 1.11
Pass 1.11 (SVG)
Pass 1.111
Pass 1.111 (SVG)
Pass 1.1111
Pass 1.1111 (SVG)
Pass 1.11111
Pass 1.11111 (SVG)
Pass 1.111111
Pass 1.111111 (SVG)
Pass 1.1111111
Pass 1.1111111 (SVG)
Pass +1.1
Pass +1.1 (SVG)
Pass +1.11
Pass +1.11 (SVG)
Pass +1.111
Pass +1.111 (SVG)
Pass +1.1111
Pass +1.1111 (SVG)
Pass +1.11111
Pass +1.11111 (SVG)
Pass +1.111111
Pass +1.111111 (SVG)
Pass +1.1111111
Pass +1.1111111 (SVG)
Pass -1.1
Pass -1.1 (SVG)
Pass -1.11
Pass -1.11 (SVG)
Pass -1.111
Pass -1.111 (SVG)
Pass -1.1111
Pass -1.1111 (SVG)
Pass -1.11111
Pass -1.11111 (SVG)
Pass -1.111111
Pass -1.111111 (SVG)
Pass -1.1111111
Pass -1.1111111 (SVG)
Pass 1.1a
Pass 1.1a (SVG)
Pass 1.11a
Pass 1.11a (SVG)
Pass 1.111a
Pass 1.111a (SVG)
Pass 1.1111a
Pass 1.1111a (SVG)
Pass 1.11111a
Pass 1.11111a (SVG)
Pass 1.111111a
Pass 1.111111a (SVG)
Pass +1.1a
Pass +1.1a (SVG)
Pass +1.11a
Pass +1.11a (SVG)
Pass +1.111a
Pass +1.111a (SVG)
Pass +1.1111a
Pass +1.1111a (SVG)
Pass +1.11111a
Pass +1.11111a (SVG)
Pass +1.111111a
Pass +1.111111a (SVG)
Pass -1.1a
Pass -1.1a (SVG)
Pass -1.11a
Pass -1.11a (SVG)
Pass -1.111a
Pass -1.111a (SVG)
Pass -1.1111a
Pass -1.1111a (SVG)
Pass -1.11111a
Pass -1.11111a (SVG)
Pass -1.111111a
Pass -1.111111a (SVG)
Pass 1.0
Pass 1.0 (SVG)
Pass 11.0
Pass 11.0 (SVG)
Pass 111.0
Pass 111.0 (SVG)
Pass 1111.0
Pass 1111.0 (SVG)
Pass 11111.0
Pass 11111.0 (SVG)
Pass 111111.0
Pass 111111.0 (SVG)
Pass 1111111.0
Pass 1111111.0 (SVG)
Pass 11111111.0
Pass 11111111.0 (SVG)
Pass +1.0
Pass +1.0 (SVG)
Pass +11.0
Pass +11.0 (SVG)
Pass +111.0
Pass +111.0 (SVG)
Pass +1111.0
Pass +1111.0 (SVG)
Pass +11111.0
Pass +11111.0 (SVG)
Pass +111111.0
Pass +111111.0 (SVG)
Pass +1111111.0
Pass +1111111.0 (SVG)
Pass +11111111.0
Pass +11111111.0 (SVG)
Pass -1.0
Pass -1.0 (SVG)
Pass -11.0
Pass -11.0 (SVG)
Pass -111.0
Pass -111.0 (SVG)
Pass -1111.0
Pass -1111.0 (SVG)
Pass -11111.0
Pass -11111.0 (SVG)
Pass -111111.0
Pass -111111.0 (SVG)
Pass -1111111.0
Pass -1111111.0 (SVG)
Pass -11111111.0
Pass -11111111.0 (SVG)
Pass 1.0a
Pass 1.0a (SVG)
Pass 11.0a
Pass 11.0a (SVG)
Pass 111.0a
Pass 111.0a (SVG)
Pass 1111.0a
Pass 1111.0a (SVG)
Pass 11111.0a
Pass 11111.0a (SVG)
Pass 111111.0a
Pass 111111.0a (SVG)
Pass 1111111.0a
Pass 1111111.0a (SVG)
Pass +1.0a
Pass +1.0a (SVG)
Pass +11.0a
Pass +11.0a (SVG)
Pass +111.0a
Pass +111.0a (SVG)
Pass +1111.0a
Pass +1111.0a (SVG)
Pass +11111.0a
Pass +11111.0a (SVG)
Pass +111111.0a
Pass +111111.0a (SVG)
Pass +1111111.0a
Pass +1111111.0a (SVG)
Pass -1.0a
Pass -1.0a (SVG)
Pass -11.0a
Pass -11.0a (SVG)
Pass -111.0a
Pass -111.0a (SVG)
Pass -1111.0a
Pass -1111.0a (SVG)
Pass -11111.0a
Pass -11111.0a (SVG)
Pass -111111.0a
Pass -111111.0a (SVG)
Pass -1111111.0a
Pass -1111111.0a (SVG)
Pass +/**/123
Pass +/**/123 (SVG)
Pass -/**/123
Pass -/**/123 (SVG)
Pass +/**/123456
Pass +/**/123456 (SVG)
Pass -/**/123456
Pass -/**/123456 (SVG)
Pass +/**/abc
Pass +/**/abc (SVG)
Pass -/**/abc
Pass -/**/abc (SVG)
Pass +/**/abcdef
Pass +/**/abcdef (SVG)
Pass -/**/abcdef
Pass -/**/abcdef (SVG)
Pass +/**/12a
Pass +/**/12a (SVG)
Pass -/**/12a
Pass -/**/12a (SVG)
Pass +/**/12345a
Pass +/**/12345a (SVG)
Pass -/**/12345a
Pass -/**/12345a (SVG)
Pass abg
Pass abg (SVG)
Pass aabbcg
Pass aabbcg (SVG)
Pass 1ag
Pass 1ag (SVG)
Pass 1122ag
Pass 1122ag (SVG)
Pass ABG
Pass ABG (SVG)
Pass AABBCG
Pass AABBCG (SVG)
Pass 1AG
Pass 1AG (SVG)
Pass 1122AG
Pass 1122AG (SVG)
Pass @a
Pass @a (SVG)
Pass @ab
Pass @ab (SVG)
Pass @abc
Pass @abc (SVG)
Pass @abcd
Pass @abcd (SVG)
Pass @abcde
Pass @abcde (SVG)
Pass @abcdef
Pass @abcdef (SVG)
Pass @1
Pass @1 (SVG)
Pass @11
Pass @11 (SVG)
Pass @111
Pass @111 (SVG)
Pass @1111
Pass @1111 (SVG)
Pass @11111
Pass @11111 (SVG)
Pass @111111
Pass @111111 (SVG)
Pass @1a
Pass @1a (SVG)
Pass @11a
Pass @11a (SVG)
Pass @111a
Pass @111a (SVG)
Pass @1111a
Pass @1111a (SVG)
Pass @11111a
Pass @11111a (SVG)
Pass "a"
Pass "a" (SVG)
Pass "ab"
Pass "ab" (SVG)
Pass "abc"
Pass "abc" (SVG)
Pass "abcd"
Pass "abcd" (SVG)
Pass "abcde"
Pass "abcde" (SVG)
Pass "abcdef"
Pass "abcdef" (SVG)
Pass "1"
Pass "1" (SVG)
Pass "11"
Pass "11" (SVG)
Pass "111"
Pass "111" (SVG)
Pass "1111"
Pass "1111" (SVG)
Pass "11111"
Pass "11111" (SVG)
Pass "111111"
Pass "111111" (SVG)
Pass "1a"
Pass "1a" (SVG)
Pass "11a"
Pass "11a" (SVG)
Pass "111a"
Pass "111a" (SVG)
Pass "1111a"
Pass "1111a" (SVG)
Pass "11111a"
Pass "11111a" (SVG)
Pass url(a)
Pass url(a) (SVG)
Pass url(aa)
Pass url(aa) (SVG)
Pass url(aaa)
Pass url(aaa) (SVG)
Pass url(aaaa)
Pass url(aaaa) (SVG)
Pass url(aaaaa)
Pass url(aaaaa) (SVG)
Pass url(aaaaaa)
Pass url(aaaaaa) (SVG)
Pass url('a')
Pass url('a') (SVG)
Pass url('aa')
Pass url('aa') (SVG)
Pass url('aaa')
Pass url('aaa') (SVG)
Pass url('aaaa')
Pass url('aaaa') (SVG)
Pass url('aaaaa')
Pass url('aaaaa') (SVG)
Pass url('aaaaaa')
Pass url('aaaaaa') (SVG)
Pass #a
Pass #a (SVG)
Pass #aa
Pass #aa (SVG)
Pass #aaaaa
Pass #aaaaa (SVG)
Pass #aaaaaaa
Pass #aaaaaaa (SVG)
Pass #1
Pass #1 (SVG)
Pass #11
Pass #11 (SVG)
Pass #11111
Pass #11111 (SVG)
Pass #1111111
Pass #1111111 (SVG)
Pass #1a
Pass #1a (SVG)
Pass #1111a
Pass #1111a (SVG)
Pass #111111a
Pass #111111a (SVG)
Pass 1%
Pass 1% (SVG)
Pass 11%
Pass 11% (SVG)
Pass 111%
Pass 111% (SVG)
Pass 1111%
Pass 1111% (SVG)
Pass 11111%
Pass 11111% (SVG)
Pass 111111%
Pass 111111% (SVG)
Pass calc(123)
Pass calc(123) (SVG)
Pass rgb(119, 255, 255)
Pass rgb(119, 255, 255) (SVG)
Pass rgba(119, 255, 255, 001)
Pass rgba(119, 255, 255, 001) (SVG)
Pass hsl(100, 100%, 100%)
Pass hsl(100, 100%, 100%) (SVG)
Pass hsla(100, 100%, 100%, 001)
Pass hsla(100, 100%, 100%, 001) (SVG)
Pass rgb(calc(100 + 155), 255, 255)
Pass rgb(calc(100 + 155), 255, 255) (SVG)
Pass rgba(calc(100 + 155), 255, 255, 001)
Pass rgba(calc(100 + 155), 255, 255, 001) (SVG)
Pass hsl(calc(050 + 050), 100%, 100%)
Pass hsl(calc(050 + 050), 100%, 100%) (SVG)
Pass hsla(calc(050 + 050), 100%, 100%, 001)
Pass hsla(calc(050 + 050), 100%, 100%, 001) (SVG)
Pass rgb(/**/255, 255, 255)
Pass rgb(/**/255, 255, 255) (SVG)
Pass rgb(/**/255/**/, /**/255/**/, /**/255/**/)
Pass rgb(/**/255/**/, /**/255/**/, /**/255/**/) (SVG)
Pass rgb(calc(/**/100/**/ + /**/155/**/), 255, 255)
Pass rgb(calc(/**/100/**/ + /**/155/**/), 255, 255) (SVG)
Pass #123 123 abc 12a
Pass #123 123 abc 12a (SVG)
Pass rgb(119, 255, 255) 123
Pass rgb(119, 255, 255) 123 (SVG)
Pass 123 rgb(119, 255, 255)
Pass 123 rgb(119, 255, 255) (SVG)
Pass 1e1
Pass 1e1 (SVG)
Pass 11e1
Pass 11e1 (SVG)
Pass 111e1
Pass 111e1 (SVG)
Pass 1111e1
Pass 1111e1 (SVG)
Pass 11111e1
Pass 11111e1 (SVG)
Pass 111111e1
Pass 111111e1 (SVG)
Pass 1e+1
Pass 1e+1 (SVG)
Pass 11e+1
Pass 11e+1 (SVG)
Pass 111e+1
Pass 111e+1 (SVG)
Pass 1111e+1
Pass 1111e+1 (SVG)
Pass 11111e+1
Pass 11111e+1 (SVG)
Pass 111111e+1
Pass 111111e+1 (SVG)
Pass 1e-0
Pass 1e-0 (SVG)
Pass 11e-0
Pass 11e-0 (SVG)
Pass 111e-0
Pass 111e-0 (SVG)
Pass 1111e-0
Pass 1111e-0 (SVG)
Pass 11111e-0
Pass 11111e-0 (SVG)
Pass 111111e-0
Pass 111111e-0 (SVG)
Pass 1e1a
Pass 1e1a (SVG)
Pass 11e1a
Pass 11e1a (SVG)
Pass 111e1a
Pass 111e1a (SVG)
Pass 1111e1a
Pass 1111e1a (SVG)
Pass 11111e1a
Pass 11111e1a (SVG)
Pass 111111e1a
Pass 111111e1a (SVG)
Pass 1111111111...
Pass 1111111111... (SVG)
Pass 1111111111...a
Pass 1111111111...a (SVG)
Pass a1111111111...
Pass a1111111111... (SVG)
Pass The hashless hex color quirk (quirks), excluded property background:abc
Pass The hashless hex color quirk (quirks), excluded property border-top:1px solid abc
Pass The hashless hex color quirk (quirks), excluded property border-right:1px solid abc
Pass The hashless hex color quirk (quirks), excluded property border-bottom:1px solid abc
Pass The hashless hex color quirk (quirks), excluded property border-left:1px solid abc
Pass The hashless hex color quirk (quirks), excluded property border:1px solid abc
Pass The hashless hex color quirk (quirks), excluded property outline-color:abc
Pass The hashless hex color quirk (quirks), excluded property outline:1px solid abc

View file

@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<title>The hashless hex color quirk (quirks)</title>
<meta name="timeout" content="long">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<style> iframe { width:20px; height:20px; } </style>
</head>
<body>
<div id=log></div>
<iframe class=quirks></iframe>
<script src=../support/test-ref-iframe.js></script>
<script src=support/common.js></script>
</body>
</html>

View file

@ -0,0 +1,423 @@
setup({explicit_done:true});
onload = function() {
setupIframe();
var tests = [
{input:"123", q:"#000123"},
{input:"023", q:"#000023"},
{input:"003", q:"#000003"},
{input:"000", q:"#000"},
{input:"abc", q:"#abc"},
{input:"ABC", q:"#abc"},
{input:"1ab", q:"#0001ab"},
{input:"1AB", q:"#0001ab"},
{input:"112233", q:"#123"},
{input:"012233", q:"#012233"},
{input:"002233", q:"#023"},
{input:"000233", q:"#000233"},
{input:"000033", q:"#003"},
{input:"000003", q:"#000003"},
{input:"000000", q:"#000000"},
{input:"aabbcc", q:"#abc"},
{input:"AABBCC", q:"#abc"},
{input:"11aabb", q:"#1ab"},
{input:"11AABB", q:"#1ab"},
{input:"\\31 23", q:"#123"},
{input:"\\61 bc", q:"#abc"},
{input:"\\41 BC", q:"#abc"},
{input:"\\31 ab", q:"#1ab"},
{input:"\\31 AB", q:"#1ab"},
{input:"\\31 12233", q:"#123"},
{input:"\\61 abbcc", q:"#abc"},
{input:"\\41 ABBCC", q:"#abc"},
{input:"\\31 1aabb", q:"#1ab"},
{input:"\\31 1AABB", q:"#1ab"},
{input:"12\\33 ", q:"#000123"},
{input:"1", q:"#000001"},
{input:"12", q:"#000012"},
{input:"1234", q:"#001234"},
{input:"12345", q:"#012345"},
{input:"1234567"},
{input:"12345678"},
{input:"a"},
{input:"aa"},
{input:"aaaa"},
{input:"aaaaa"},
{input:"aaaaaaa"},
{input:"aaaaaaaa"},
{input:"A"},
{input:"AA"},
{input:"AAAA"},
{input:"AAAAA"},
{input:"AAAAAAA"},
{input:"AAAAAAAA"},
{input:"1a", q:"#00001a"},
{input:"1abc", q:"#001abc"},
{input:"1abcd", q:"#01abcd"},
{input:"1abcdef"},
{input:"1abcdeff"},
{input:"+1", q:"#000001"},
{input:"+12", q:"#000012"},
{input:"+123", q:"#000123"},
{input:"+1234", q:"#001234"},
{input:"+12345", q:"#012345"},
{input:"+123456", q:"#123456"},
{input:"+1234567"},
{input:"+12345678"},
{input:"-1"},
{input:"-12"},
{input:"-123"},
{input:"-1234"},
{input:"-12345"},
{input:"-123456"},
{input:"-1234567"},
{input:"-12345678"},
{input:"+1a", q:"#00001a"},
{input:"+12a", q:"#00012a"},
{input:"+123a", q:"#00123a"},
{input:"+1234a", q:"#01234a"},
{input:"+12345a", q:"#12345a"},
{input:"+123456a"},
{input:"+1234567a"},
{input:"-1a"},
{input:"-12a"},
{input:"-123a"},
{input:"-1234a"},
{input:"-12345a"},
{input:"-123456a"},
{input:"-1234567a"},
{input:"-12345678a"},
{input:"+1A", q:"#00001a"},
{input:"+12A", q:"#00012a"},
{input:"+123A", q:"#00123a"},
{input:"+1234A", q:"#01234a"},
{input:"+12345A", q:"#12345a"},
{input:"+123456A"},
{input:"+1234567A"},
{input:"-1A"},
{input:"-12A"},
{input:"-123A"},
{input:"-1234A"},
{input:"-12345A"},
{input:"-123456A"},
{input:"-1234567A"},
{input:"-12345678A"},
{input:"+a"},
{input:"+aa"},
{input:"+aaa"},
{input:"+aaaa"},
{input:"+aaaaa"},
{input:"+aaaaaa"},
{input:"+aaaaaaa"},
{input:"+aaaaaaaa"},
{input:"-a"},
{input:"-aa"},
{input:"-aaa"},
{input:"-aaaa"},
{input:"-aaaaa"},
{input:"-aaaaaa"},
{input:"-aaaaaaa"},
{input:"-aaaaaaaa"},
{input:"-aaaaaaaaa"},
{input:"+A"},
{input:"+AA"},
{input:"+AAA"},
{input:"+AAAA"},
{input:"+AAAAA"},
{input:"+AAAAAA"},
{input:"+AAAAAAA"},
{input:"+AAAAAAAA"},
{input:"-A"},
{input:"-AA"},
{input:"-AAA"},
{input:"-AAAA"},
{input:"-AAAAA"},
{input:"-AAAAAA"},
{input:"-AAAAAAA"},
{input:"-AAAAAAAA"},
{input:"-AAAAAAAAA"},
{input:"1.1"},
{input:"1.11"},
{input:"1.111"},
{input:"1.1111"},
{input:"1.11111"},
{input:"1.111111"},
{input:"1.1111111"},
{input:"+1.1"},
{input:"+1.11"},
{input:"+1.111"},
{input:"+1.1111"},
{input:"+1.11111"},
{input:"+1.111111"},
{input:"+1.1111111"},
{input:"-1.1"},
{input:"-1.11"},
{input:"-1.111"},
{input:"-1.1111"},
{input:"-1.11111"},
{input:"-1.111111"},
{input:"-1.1111111"},
{input:"1.1a"},
{input:"1.11a"},
{input:"1.111a"},
{input:"1.1111a"},
{input:"1.11111a"},
{input:"1.111111a"},
{input:"+1.1a"},
{input:"+1.11a"},
{input:"+1.111a"},
{input:"+1.1111a"},
{input:"+1.11111a"},
{input:"+1.111111a"},
{input:"-1.1a"},
{input:"-1.11a"},
{input:"-1.111a"},
{input:"-1.1111a"},
{input:"-1.11111a"},
{input:"-1.111111a"},
{input:"1.0"},
{input:"11.0"},
{input:"111.0"},
{input:"1111.0"},
{input:"11111.0"},
{input:"111111.0"},
{input:"1111111.0"},
{input:"11111111.0"},
{input:"+1.0"},
{input:"+11.0"},
{input:"+111.0"},
{input:"+1111.0"},
{input:"+11111.0"},
{input:"+111111.0"},
{input:"+1111111.0"},
{input:"+11111111.0"},
{input:"-1.0"},
{input:"-11.0"},
{input:"-111.0"},
{input:"-1111.0"},
{input:"-11111.0"},
{input:"-111111.0"},
{input:"-1111111.0"},
{input:"-11111111.0"},
{input:"1.0a"},
{input:"11.0a"},
{input:"111.0a"},
{input:"1111.0a"},
{input:"11111.0a"},
{input:"111111.0a"},
{input:"1111111.0a"},
{input:"+1.0a"},
{input:"+11.0a"},
{input:"+111.0a"},
{input:"+1111.0a"},
{input:"+11111.0a"},
{input:"+111111.0a"},
{input:"+1111111.0a"},
{input:"-1.0a"},
{input:"-11.0a"},
{input:"-111.0a"},
{input:"-1111.0a"},
{input:"-11111.0a"},
{input:"-111111.0a"},
{input:"-1111111.0a"},
{input:"+/**/123"},
{input:"-/**/123"},
{input:"+/**/123456"},
{input:"-/**/123456"},
{input:"+/**/abc"},
{input:"-/**/abc"},
{input:"+/**/abcdef"},
{input:"-/**/abcdef"},
{input:"+/**/12a"},
{input:"-/**/12a"},
{input:"+/**/12345a"},
{input:"-/**/12345a"},
{input:"abg"},
{input:"aabbcg"},
{input:"1ag"},
{input:"1122ag"},
{input:"ABG"},
{input:"AABBCG"},
{input:"1AG"},
{input:"1122AG"},
{input:"@a"},
{input:"@ab"},
{input:"@abc"},
{input:"@abcd"},
{input:"@abcde"},
{input:"@abcdef"},
{input:"@1"},
{input:"@11"},
{input:"@111"},
{input:"@1111"},
{input:"@11111"},
{input:"@111111"},
{input:"@1a"},
{input:"@11a"},
{input:"@111a"},
{input:"@1111a"},
{input:"@11111a"},
{input:'"a"'},
{input:'"ab"'},
{input:'"abc"'},
{input:'"abcd"'},
{input:'"abcde"'},
{input:'"abcdef"'},
{input:'"1"'},
{input:'"11"'},
{input:'"111"'},
{input:'"1111"'},
{input:'"11111"'},
{input:'"111111"'},
{input:'"1a"'},
{input:'"11a"'},
{input:'"111a"'},
{input:'"1111a"'},
{input:'"11111a"'},
{input:"url(a)", svg:'url(a)'},
{input:"url(aa)", svg:'url(aa)'},
{input:"url(aaa)", svg:'url(aaa)'},
{input:"url(aaaa)", svg:'url(aaaa)'},
{input:"url(aaaaa)", svg:'url(aaaaa)'},
{input:"url(aaaaaa)", svg:'url(aaaaaa)'},
{input:"url('a')", svg:'url(a)'},
{input:"url('aa')", svg:'url(aa)'},
{input:"url('aaa')", svg:'url(aaa)'},
{input:"url('aaaa')", svg:'url(aaaa)'},
{input:"url('aaaaa')", svg:'url(aaaaa)'},
{input:"url('aaaaaa')", svg:'url(aaaaaa)'},
{input:"#a"},
{input:"#aa"},
{input:"#aaaaa"},
{input:"#aaaaaaa"},
{input:"#1"},
{input:"#11"},
{input:"#11111"},
{input:"#1111111"},
{input:"#1a"},
{input:"#1111a"},
{input:"#111111a"},
{input:"1%"},
{input:"11%"},
{input:"111%"},
{input:"1111%"},
{input:"11111%"},
{input:"111111%"},
{input:"calc(123)"},
{input:"rgb(119, 255, 255)", q:"#7ff", s:"#7ff", svg:"#7ff"},
{input:"rgba(119, 255, 255, 001)", q:"#7ff", s:"#7ff", svg:"#7ff"},
{input:"hsl(100, 100%, 100%)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"hsla(100, 100%, 100%, 001)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"rgb(calc(100 + 155), 255, 255)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"rgba(calc(100 + 155), 255, 255, 001)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"hsl(calc(050 + 050), 100%, 100%)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"hsla(calc(050 + 050), 100%, 100%, 001)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"rgb(/**/255, 255, 255)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"rgb(/**/255/**/, /**/255/**/, /**/255/**/)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"rgb(calc(/**/100/**/ + /**/155/**/), 255, 255)", q:"#fff", s:"#fff", svg:"#fff"},
{input:"#123 123 abc 12a", q:"#123 #000123 #abc #00012a", shorthand:true},
{input:"rgb(119, 255, 255) 123", q:"#7ff #000123", shorthand:true},
{input:"123 rgb(119, 255, 255)", q:"#000123 #7ff", shorthand:true},
{input:"1e1"},
{input:"11e1"},
{input:"111e1"},
{input:"1111e1"},
{input:"11111e1"},
{input:"111111e1"},
{input:"1e+1"},
{input:"11e+1"},
{input:"111e+1"},
{input:"1111e+1"},
{input:"11111e+1"},
{input:"111111e+1"},
{input:"1e-0"},
{input:"11e-0"},
{input:"111e-0"},
{input:"1111e-0"},
{input:"11111e-0"},
{input:"111111e-0"},
{input:"1e1a"},
{input:"11e1a"},
{input:"111e1a"},
{input:"1111e1a"},
{input:"11111e1a"},
{input:"111111e1a"},
{desc:"1111111111...", input:"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"},
{desc:"1111111111...a", input:"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111a"},
{desc:"a1111111111...", input:"a1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"},
];
var props = [
{prop:'background-color', check:'background-color'},
{prop:'border-color', check:'border-top-color', check_also:['border-right-color', 'border-bottom-color', 'border-left-color']},
{prop:'border-top-color', check:'border-top-color'},
{prop:'border-right-color', check:'border-right-color'},
{prop:'border-bottom-color', check:'border-bottom-color'},
{prop:'border-left-color', check:'border-left-color'},
{prop:'color', check:'color'},
];
var style_template = '#test{{prop}:{test};}' +
'#ref{{prop}:{ref};}';
tests.forEach(function(t) {
var name = t.desc || t.input;
var test_html = async_test(name);
var test_svg = async_test(name + ' (SVG)');
for (var i in props) {
if (t.shorthand && !(props[i].check_also)) {
continue;
}
test_html.step(function() {
win.style.textContent = style_template.replace('{test}', t.input)
.replace('{ref}', quirks ? t.q : t.s).replace(/\{prop\}/g, props[i].prop);
assert_equals(win.getComputedStyle(win.test).getPropertyValue(props[i].check),
win.getComputedStyle(win.ref).getPropertyValue(props[i].check),
props[i].prop);
if (t.shorthand && props[i].check_also) {
for (var j in props[i].check_also) {
assert_equals(win.getComputedStyle(win.test).getPropertyValue(props[i].check_also[j]),
win.getComputedStyle(win.ref).getPropertyValue(props[i].check_also[j]),
props[i].prop + ' checking ' + props[i].check_also[j]);
}
}
});
test_svg.step(function() {
win.svg.setAttribute('fill', t.input);
if (t.svg) {
win.svg_ref.setAttribute('fill', t.svg);
} else {
win.svg_ref.removeAttribute('fill');
}
assert_equals(win.getComputedStyle(win.svg).fill, win.getComputedStyle(win.svg_ref).fill, 'SVG fill=""');
});
}
test_html.done();
test_svg.done();
});
if (quirks) {
var other_tests = [
{input:'background:abc', prop:'background-color'},
{input:'border-top:1px solid abc', prop:'border-top-color'},
{input:'border-right:1px solid abc', prop:'border-right-color'},
{input:'border-bottom:1px solid abc', prop:'border-bottom-color'},
{input:'border-left:1px solid abc', prop:'border-left-color'},
{input:'border:1px solid abc', prop:'border-top-color'},
{input:'outline-color:abc', prop:'outline-color'},
{input:'outline:1px solid abc', prop:'outline-color'}
];
var other_template = "#test{{test};}"
other_tests.forEach(function(t) {
test(function() {
win.style.textContent = other_template.replace('{test}', t.input);
assert_equals(win.getComputedStyle(win.test).getPropertyValue(t.prop),
win.getComputedStyle(win.ref).getPropertyValue(t.prop),
'quirk was supported');
}, document.title+', excluded property '+t.input);
});
}
done();
}

View file

@ -0,0 +1,17 @@
function setupIframe() {
var iframe = document.querySelector('iframe');
var html = "<style id=style></style><div id=test></div><div id=ref></div><svg><circle id=svg /><circle id=svg_ref /></svg>";
if (iframe.className === "limited-quirks") {
html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' + html;
} else if (iframe.className === "no-quirks") {
html = '<!DOCTYPE HTML>' + html;
}
window.quirks = iframe.className === "quirks";
window.win = iframe.contentWindow;
win.document.open();
win.document.write(html);
win.document.close();
['style', 'test', 'ref', 'svg', 'svg_ref'].forEach(function(id) {
win[id] = win.document.getElementById(id);
});
}