Update web-platform-tests to revision 9659a35d816ff1b32835a2eccf3e0117dea4e5ce

This commit is contained in:
WPT Sync Bot 2018-02-26 20:17:41 -05:00
parent 6df0dc5b27
commit 4f0af2af66
54 changed files with 1873 additions and 137 deletions

View file

@ -48785,6 +48785,18 @@
{} {}
] ]
], ],
"css/CSS2/floats/floated-table-wider-than-specified.html": [
[
"/css/CSS2/floats/floated-table-wider-than-specified.html",
[
[
"/css/reference/ref-filled-green-200px-square.html",
"=="
]
],
{}
]
],
"css/CSS2/floats/floats-placement-vertical-001a.xht": [ "css/CSS2/floats/floats-placement-vertical-001a.xht": [
[ [
"/css/CSS2/floats/floats-placement-vertical-001a.xht", "/css/CSS2/floats/floats-placement-vertical-001a.xht",
@ -294093,6 +294105,11 @@
{} {}
] ]
], ],
"webaudio/resources/delay-testing.js": [
[
{}
]
],
"webaudio/resources/distance-model-testing.js": [ "webaudio/resources/distance-model-testing.js": [
[ [
{} {}
@ -315974,6 +315991,12 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/border-image-source.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/border-image-source.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/border-style.html": [ "css/css-typed-om/the-stylepropertymap/properties/border-style.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/border-style.html", "/css/css-typed-om/the-stylepropertymap/properties/border-style.html",
@ -315992,12 +316015,24 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/box-sizing.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/box-sizing.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/caret-color.html": [ "css/css-typed-om/the-stylepropertymap/properties/caret-color.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/caret-color.html", "/css/css-typed-om/the-stylepropertymap/properties/caret-color.html",
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/clear.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/clear.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/color.html": [ "css/css-typed-om/the-stylepropertymap/properties/color.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/color.html", "/css/css-typed-om/the-stylepropertymap/properties/color.html",
@ -316016,6 +316051,24 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/float.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/float.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/font-style.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/font-style.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/font-weight.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/font-weight.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/height.html": [ "css/css-typed-om/the-stylepropertymap/properties/height.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/height.html", "/css/css-typed-om/the-stylepropertymap/properties/height.html",
@ -316028,12 +316081,30 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/line-height.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/line-height.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/list-style-position.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/list-style-position.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/margin.html": [ "css/css-typed-om/the-stylepropertymap/properties/margin.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/margin.html", "/css/css-typed-om/the-stylepropertymap/properties/margin.html",
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/mask-image.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/mask-image.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/object-position.html": [ "css/css-typed-om/the-stylepropertymap/properties/object-position.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/object-position.html", "/css/css-typed-om/the-stylepropertymap/properties/object-position.html",
@ -316052,6 +316123,18 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/outline-style.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/outline-style.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/overflow.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/overflow.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/padding.html": [ "css/css-typed-om/the-stylepropertymap/properties/padding.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/padding.html", "/css/css-typed-om/the-stylepropertymap/properties/padding.html",
@ -316070,6 +316153,12 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/shape-outside.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/shape-outside.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/text-align.html": [ "css/css-typed-om/the-stylepropertymap/properties/text-align.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/text-align.html", "/css/css-typed-om/the-stylepropertymap/properties/text-align.html",
@ -316094,6 +316183,12 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/text-transform.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-transform.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/top.html": [ "css/css-typed-om/the-stylepropertymap/properties/top.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/top.html", "/css/css-typed-om/the-stylepropertymap/properties/top.html",
@ -316124,6 +316219,12 @@
{} {}
] ]
], ],
"css/css-typed-om/the-stylepropertymap/properties/whitespace.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/whitespace.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/width.html": [ "css/css-typed-om/the-stylepropertymap/properties/width.html": [
[ [
"/css/css-typed-om/the-stylepropertymap/properties/width.html", "/css/css-typed-om/the-stylepropertymap/properties/width.html",
@ -327698,6 +327799,12 @@
{} {}
] ]
], ],
"html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html": [
[
"/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html",
{}
]
],
"html/infrastructure/safe-passing-of-structured-data/structured_clone_blob.html": [ "html/infrastructure/safe-passing-of-structured-data/structured_clone_blob.html": [
[ [
"/html/infrastructure/safe-passing-of-structured-data/structured_clone_blob.html", "/html/infrastructure/safe-passing-of-structured-data/structured_clone_blob.html",
@ -336642,6 +336749,26 @@
{} {}
] ]
], ],
"infrastructure/assumptions/non-secure-context.any.js": [
[
"/infrastructure/assumptions/non-secure-context.any.html",
{}
],
[
"/infrastructure/assumptions/non-secure-context.any.worker.html",
{}
]
],
"infrastructure/assumptions/secure-context.https.any.js": [
[
"/infrastructure/assumptions/secure-context.https.any.html",
{}
],
[
"/infrastructure/assumptions/secure-context.https.any.worker.html",
{}
]
],
"infrastructure/expected-fail/failing-test.html": [ "infrastructure/expected-fail/failing-test.html": [
[ [
"/infrastructure/expected-fail/failing-test.html", "/infrastructure/expected-fail/failing-test.html",
@ -362910,18 +363037,84 @@
{} {}
] ]
], ],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-max-default-delay.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/delaynode-max-default-delay.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-max-nondefault-delay.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/delaynode-max-nondefault-delay.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-maxdelay.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/delaynode-maxdelay.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-maxdelaylimit.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/delaynode-maxdelaylimit.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-scheduling.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/delaynode-scheduling.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/delaynode.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [ "webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [
[ [
"/webaudio/the-audio-api/the-delaynode-interface/idl-test.html", "/webaudio/the-audio-api/the-delaynode-interface/idl-test.html",
{} {}
] ]
], ],
"webaudio/the-audio-api/the-delaynode-interface/no-dezippering.html": [
[
"/webaudio/the-audio-api/the-delaynode-interface/no-dezippering.html",
{}
]
],
"webaudio/the-audio-api/the-dynamicscompressornode-interface/dynamicscompressor-basic.html": [
[
"/webaudio/the-audio-api/the-dynamicscompressornode-interface/dynamicscompressor-basic.html",
{}
]
],
"webaudio/the-audio-api/the-gainnode-interface/gain-basic.html": [
[
"/webaudio/the-audio-api/the-gainnode-interface/gain-basic.html",
{}
]
],
"webaudio/the-audio-api/the-gainnode-interface/gain.html": [
[
"/webaudio/the-audio-api/the-gainnode-interface/gain.html",
{}
]
],
"webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [ "webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [
[ [
"/webaudio/the-audio-api/the-gainnode-interface/idl-test.html", "/webaudio/the-audio-api/the-gainnode-interface/idl-test.html",
{} {}
] ]
], ],
"webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html": [
[
"/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html",
{}
]
],
"webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [ "webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
[ [
"/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html", "/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html",
@ -439531,6 +439724,10 @@
"078e1dd6dd61d36cec239ed75d02051f61fe60a5", "078e1dd6dd61d36cec239ed75d02051f61fe60a5",
"support" "support"
], ],
"css/CSS2/floats/floated-table-wider-than-specified.html": [
"4081cd8860323434f2461673c39c872f7e9c55e2",
"reftest"
],
"css/CSS2/floats/floats-placement-vertical-001-ref.xht": [ "css/CSS2/floats/floats-placement-vertical-001-ref.xht": [
"219c3d13a6859b58907f35df0a5602ba215a0335", "219c3d13a6859b58907f35df0a5602ba215a0335",
"support" "support"
@ -506384,7 +506581,7 @@
"reftest" "reftest"
], ],
"css/css-style-attr/style-attr-braces-002-quirks.htm": [ "css/css-style-attr/style-attr-braces-002-quirks.htm": [
"134c9965cb75e87bb97a52040088755dbaf4eaa0", "e96cc484f81fd01c4d9975445b7d00d08dd37441",
"reftest" "reftest"
], ],
"css/css-style-attr/style-attr-braces-002.xht": [ "css/css-style-attr/style-attr-braces-002.xht": [
@ -519855,6 +520052,10 @@
"5b8adde602ac79d8b1ea92bd29f25d8756d72f8a", "5b8adde602ac79d8b1ea92bd29f25d8756d72f8a",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/border-image-source.html": [
"08934e205f88aecda9809ff98d63f2d8784080c3",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/border-style.html": [ "css/css-typed-om/the-stylepropertymap/properties/border-style.html": [
"5d258827fb6a26d07efbdf5b47a440300f0aa307", "5d258827fb6a26d07efbdf5b47a440300f0aa307",
"testharness" "testharness"
@ -519867,10 +520068,18 @@
"e710943711544b28d07676df15966950c0d76efa", "e710943711544b28d07676df15966950c0d76efa",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/box-sizing.html": [
"6fb5b014ffbbe4fe9c0019cea618a001fefdbedd",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/caret-color.html": [ "css/css-typed-om/the-stylepropertymap/properties/caret-color.html": [
"d4139aeff755abe89ee1e04fcd34ccfba4efe91c", "d4139aeff755abe89ee1e04fcd34ccfba4efe91c",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/clear.html": [
"376585635ab5752db4b2078f6247fa621a954282",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/color.html": [ "css/css-typed-om/the-stylepropertymap/properties/color.html": [
"291f8e058d1fa6e342f4316c0760ec4cbdbc403c", "291f8e058d1fa6e342f4316c0760ec4cbdbc403c",
"testharness" "testharness"
@ -519883,6 +520092,18 @@
"26ba44d8d5146b9d606a1668659ee16876b371c5", "26ba44d8d5146b9d606a1668659ee16876b371c5",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/float.html": [
"1dfca0045c2b57f36d5165139087301ffe54c63a",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/font-style.html": [
"c4a42872dca602b71f021799d29e404cfa7ed90e",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/font-weight.html": [
"6429fa7266a227e93cb0a5d3eb19468b0f73fce8",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/height.html": [ "css/css-typed-om/the-stylepropertymap/properties/height.html": [
"36b8677eb45f8555da4381e1644624df2f2060e0", "36b8677eb45f8555da4381e1644624df2f2060e0",
"testharness" "testharness"
@ -519891,10 +520112,22 @@
"354512fcb071a863f11305f36cf3605ceef733b8", "354512fcb071a863f11305f36cf3605ceef733b8",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/line-height.html": [
"8b28d0af963cd08b63a446107af4bd476b239531",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/list-style-position.html": [
"d1644d7633a8fa097caa5d52f81a84c5cd62f9d0",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/margin.html": [ "css/css-typed-om/the-stylepropertymap/properties/margin.html": [
"b475a6446e769e44237bb9d99176069dae10b4fb", "b475a6446e769e44237bb9d99176069dae10b4fb",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/mask-image.html": [
"2a20c6818e9d71adbf3902fde74cb26136917e72",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/object-position.html": [ "css/css-typed-om/the-stylepropertymap/properties/object-position.html": [
"c3040ca9284c50c2149dc09502fde5f20d0a4baa", "c3040ca9284c50c2149dc09502fde5f20d0a4baa",
"testharness" "testharness"
@ -519907,6 +520140,14 @@
"612e77914108dbba0b271b20eb3e9e80199349b3", "612e77914108dbba0b271b20eb3e9e80199349b3",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/outline-style.html": [
"c9a622aacc8c61581110670cb7044a89b11956d4",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/overflow.html": [
"b6ba9ba8ebc6433caffe0c8f83e1f679a26ba7c4",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/padding.html": [ "css/css-typed-om/the-stylepropertymap/properties/padding.html": [
"70c2e29badef7528469bcf11e1cb7bbc6cd519ea", "70c2e29badef7528469bcf11e1cb7bbc6cd519ea",
"testharness" "testharness"
@ -519923,6 +520164,10 @@
"68a2611eaf9eecb7393c2b0db0f4378ebe285f22", "68a2611eaf9eecb7393c2b0db0f4378ebe285f22",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/shape-outside.html": [
"3189c7b3903d30f31836ea845aebecf599198c79",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-align.html": [ "css/css-typed-om/the-stylepropertymap/properties/text-align.html": [
"88a1f5866a767c25dec2ef75728c68c5631d371f", "88a1f5866a767c25dec2ef75728c68c5631d371f",
"testharness" "testharness"
@ -519932,13 +520177,17 @@
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-style.html": [ "css/css-typed-om/the-stylepropertymap/properties/text-decoration-style.html": [
"aa9698c5b4cb896fc43c58794df84ec0bbb0e3e9", "b541bd8b57f8b85f6e5f3a17a3266169debee876",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [ "css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [
"9419ab219034d1fb732965ebd3a03934bcaddf5a", "9419ab219034d1fb732965ebd3a03934bcaddf5a",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/text-transform.html": [
"53f0482b667f049170dcdfb5de29dedc6897d09a",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/top.html": [ "css/css-typed-om/the-stylepropertymap/properties/top.html": [
"218b50f6b7d8209514bca8d0a8121263b07ab1e2", "218b50f6b7d8209514bca8d0a8121263b07ab1e2",
"testharness" "testharness"
@ -519952,13 +520201,17 @@
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/visibility.html": [ "css/css-typed-om/the-stylepropertymap/properties/visibility.html": [
"8e0a268686a82cc4b4c5531b324da106e8d13856", "5b8de5bb7b87b82729c5ea92d80409128124acaf",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/white-space.html": [ "css/css-typed-om/the-stylepropertymap/properties/white-space.html": [
"f8afed394e920abbaa9eb8d2e6f4405ae4453c2c", "f8afed394e920abbaa9eb8d2e6f4405ae4453c2c",
"testharness" "testharness"
], ],
"css/css-typed-om/the-stylepropertymap/properties/whitespace.html": [
"b51dea7a7d0f93f13fda93c0f27e5084fa4c3b3e",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/width.html": [ "css/css-typed-om/the-stylepropertymap/properties/width.html": [
"d429f7a88012179ef3d604b79b3db4aaba0ca426", "d429f7a88012179ef3d604b79b3db4aaba0ca426",
"testharness" "testharness"
@ -542296,11 +542549,11 @@
"testharness" "testharness"
], ],
"custom-elements/Document-createElement.html": [ "custom-elements/Document-createElement.html": [
"07de690760040f025455b1588ea00e57c669795f", "46e64c9f412fb04582f8ec287e08783ac83cb933",
"testharness" "testharness"
], ],
"custom-elements/Document-createElementNS.html": [ "custom-elements/Document-createElementNS.html": [
"57791273d1721711dcb456fe7409a734d37278a3", "da90b2a1c13cf18fd5cade85dcae2dadef6243c9",
"testharness" "testharness"
], ],
"custom-elements/HTMLElement-constructor.html": [ "custom-elements/HTMLElement-constructor.html": [
@ -542628,7 +542881,7 @@
"support" "support"
], ],
"docs/_running-tests/chrome_android.md": [ "docs/_running-tests/chrome_android.md": [
"32e0d149423f84c3602ee1f87a83746bf331f582", "6780ea4857d5fa34517b73af926201166269faa5",
"support" "support"
], ],
"docs/_running-tests/index.md": [ "docs/_running-tests/index.md": [
@ -542664,7 +542917,7 @@
"support" "support"
], ],
"docs/_writing-tests/index.md": [ "docs/_writing-tests/index.md": [
"8ef1c49c0692116968994e66483a318f6f40f5d3", "4d35975e9f1d02caf4ed0d78021d06ef8eed7648",
"support" "support"
], ],
"docs/_writing-tests/lint-tool.md": [ "docs/_writing-tests/lint-tool.md": [
@ -542684,7 +542937,7 @@
"support" "support"
], ],
"docs/_writing-tests/server-features.md": [ "docs/_writing-tests/server-features.md": [
"d89a6d340ebb3808293d5b480772a65e765945a7", "c9ed5970c091c7fe7aa16847b8c68783b133a25a",
"support" "support"
], ],
"docs/_writing-tests/submission-process.md": [ "docs/_writing-tests/submission-process.md": [
@ -542700,7 +542953,7 @@
"support" "support"
], ],
"docs/_writing-tests/testharness.md": [ "docs/_writing-tests/testharness.md": [
"154bd922b6f50ec003280616381522a24faffb14", "569eef734f09d83c9a30eac5529087dd43e802ba",
"support" "support"
], ],
"docs/_writing-tests/visual.md": [ "docs/_writing-tests/visual.md": [
@ -554016,7 +554269,7 @@
"testharness" "testharness"
], ],
"html/dom/usvstring-reflection.html": [ "html/dom/usvstring-reflection.html": [
"221d4baf1cf0f7c06bef865aa8c5e01ce6436569", "4172dd8fe39cedc772a5b7afd12201e6cbf36b90",
"testharness" "testharness"
], ],
"html/editing/.gitkeep": [ "html/editing/.gitkeep": [
@ -558519,6 +558772,10 @@
"7c0b8b2e411236aeeed3a8b7962dc70d8a94969f", "7c0b8b2e411236aeeed3a8b7962dc70d8a94969f",
"testharness" "testharness"
], ],
"html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html": [
"5ca99a8e8550e55246e16980bdf5f5b65ceafd09",
"testharness"
],
"html/infrastructure/safe-passing-of-structured-data/structured_clone_blob.html": [ "html/infrastructure/safe-passing-of-structured-data/structured_clone_blob.html": [
"2a3deba2534cad6f5e0aa85cfc3c90debcead20a", "2a3deba2534cad6f5e0aa85cfc3c90debcead20a",
"testharness" "testharness"
@ -561628,7 +561885,7 @@
"testharness" "testharness"
], ],
"html/semantics/embedded-content/media-elements/user-interface/muted.html": [ "html/semantics/embedded-content/media-elements/user-interface/muted.html": [
"74deefbbc4b8f96ff4856db1c32c6428183cc040", "758b7ed13655c906334d4541f4758f17f58b186c",
"testharness" "testharness"
], ],
"html/semantics/embedded-content/media-elements/video_008.htm": [ "html/semantics/embedded-content/media-elements/video_008.htm": [
@ -568852,7 +569109,7 @@
"reftest" "reftest"
], ],
"infrastructure/assumptions/html-elements.html": [ "infrastructure/assumptions/html-elements.html": [
"dacd5dc7e1d723046d5e9eea0a0eb8046d501fca", "9585f8fff4f585b8b4f31ea485f9d0195173772d",
"testharness" "testharness"
], ],
"infrastructure/assumptions/initial-color-ref.html": [ "infrastructure/assumptions/initial-color-ref.html": [
@ -568879,6 +569136,14 @@
"df47a9a9342da260175776c3406856be096d0012", "df47a9a9342da260175776c3406856be096d0012",
"reftest" "reftest"
], ],
"infrastructure/assumptions/non-secure-context.any.js": [
"7fc2a5023259d6dbddf93a018409c45b891a8c86",
"testharness"
],
"infrastructure/assumptions/secure-context.https.any.js": [
"6f246bdc6d67a92a6518870542c20d2f8b2b5f5d",
"testharness"
],
"infrastructure/assumptions/tools/ahem-generate-table.py": [ "infrastructure/assumptions/tools/ahem-generate-table.py": [
"24ddd1f2cbd478653820899aa63c35f02d0a551c", "24ddd1f2cbd478653820899aa63c35f02d0a551c",
"support" "support"
@ -568984,7 +569249,7 @@
"support" "support"
], ],
"interfaces/dom.idl": [ "interfaces/dom.idl": [
"773c449a2f9a6bd9e35d0dd8a4c2e1eaa0266150", "605bb139c7695e46f8657097cf2d9bc6240a2d38",
"support" "support"
], ],
"interfaces/fullscreen.idl": [ "interfaces/fullscreen.idl": [
@ -587688,7 +587953,7 @@
"testharness" "testharness"
], ],
"screen-orientation/lock-bad-argument.html": [ "screen-orientation/lock-bad-argument.html": [
"4d06c44e347ae7326e928ed0fd09b8ae3991e11b", "89abd7337374b1cd4b1b33133e2f55d737f94d7c",
"testharness" "testharness"
], ],
"screen-orientation/lock-basic.html": [ "screen-orientation/lock-basic.html": [
@ -598019,6 +598284,10 @@
"914a0268776de98f3b608babfa5699a93a2cd723", "914a0268776de98f3b608babfa5699a93a2cd723",
"support" "support"
], ],
"webaudio/resources/delay-testing.js": [
"aeb4554e50589738c94600cc2ed1e84be7381cac",
"support"
],
"webaudio/resources/distance-model-testing.js": [ "webaudio/resources/distance-model-testing.js": [
"0be27d8bddd91a2c4c6e54d3b52af58bff2ed023", "0be27d8bddd91a2c4c6e54d3b52af58bff2ed023",
"support" "support"
@ -598183,26 +598452,70 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709", "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support" "support"
], ],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-max-default-delay.html": [
"c732635549f5eab61f8bdce05b27f0f3e8a3f6c2",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-max-nondefault-delay.html": [
"8c1a46ae95f921d78a59473c6f1f5d12315f07e8",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-maxdelay.html": [
"d3ed5ccd10c62ca00edadcfd54cbe6a05ce2e1c0",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-maxdelaylimit.html": [
"2effacd5886d0af8c615f294fcd50dc4df8940f3",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode-scheduling.html": [
"6f7c363e610fe141458b77d3ca7ec69bca8012a6",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/delaynode.html": [
"622ca5f882644f183674cc07e55a69e63e5c85d9",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [ "webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [
"8507a293b696d2d3fc51b429864373606a75eeb6", "8507a293b696d2d3fc51b429864373606a75eeb6",
"testharness" "testharness"
], ],
"webaudio/the-audio-api/the-delaynode-interface/no-dezippering.html": [
"96b405fd00ee657194de348ea46b263ba43f98a4",
"testharness"
],
"webaudio/the-audio-api/the-dynamicscompressornode-interface/.gitkeep": [ "webaudio/the-audio-api/the-dynamicscompressornode-interface/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709", "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support" "support"
], ],
"webaudio/the-audio-api/the-dynamicscompressornode-interface/dynamicscompressor-basic.html": [
"6ceaf50b8cacdfa246bc997f2c8e46aefd789659",
"testharness"
],
"webaudio/the-audio-api/the-gainnode-interface/.gitkeep": [ "webaudio/the-audio-api/the-gainnode-interface/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709", "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support" "support"
], ],
"webaudio/the-audio-api/the-gainnode-interface/gain-basic.html": [
"70165c60c482d6507670af965756f639e7b3ba78",
"testharness"
],
"webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav": [ "webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav": [
"823f7ae1a5f5eb0c630e7d1881c50a1f710f9350", "823f7ae1a5f5eb0c630e7d1881c50a1f710f9350",
"support" "support"
], ],
"webaudio/the-audio-api/the-gainnode-interface/gain.html": [
"5f50c22eaa77f09d0fa8c6f6f5249fdbf7db4b24",
"testharness"
],
"webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [ "webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [
"30843d3b74e8ec33bedd849f3f2b1bbd4bcc9f5e", "30843d3b74e8ec33bedd849f3f2b1bbd4bcc9f5e",
"testharness" "testharness"
], ],
"webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html": [
"2205ec8f56472bd45e102cf57f10b4532b18a554",
"testharness"
],
"webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [ "webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
"bf2de43e568c79b96fd5b0602e26346c483162a5", "bf2de43e568c79b96fd5b0602e26346c483162a5",
"testharness" "testharness"

View file

@ -0,0 +1,2 @@
[floated-table-wider-than-specified.html]
expected: FAIL

View file

@ -5,3 +5,6 @@
[document.createElement must create an instance of autonomous custom elements when it has is attribute] [document.createElement must create an instance of autonomous custom elements when it has is attribute]
expected: FAIL expected: FAIL
[document.createElement()'s second argument is to be ignored when it's a string]
expected: FAIL

View file

@ -0,0 +1,4 @@
[Document-createElementNS.html]
[document.createElementNS()'s third argument is to be ignored when it's a string]
expected: FAIL

View file

@ -29,3 +29,6 @@
[RTCDataChannel.send: unpaired surrogate codepoint should be replaced with U+FFFD.] [RTCDataChannel.send: unpaired surrogate codepoint should be replaced with U+FFFD.]
expected: FAIL expected: FAIL
[RegisterPtotocolHandler URL: unpaired surrogate codepoint should not make any exceptions.]
expected: FAIL

View file

@ -0,0 +1,4 @@
[structured_clone_bigint.html]
[2.7 Safe passing of structured data]
expected: FAIL

View file

@ -63,3 +63,15 @@
[getting video.muted with muted="" (document.write-created)] [getting video.muted with muted="" (document.write-created)]
expected: FAIL expected: FAIL
[cloning audio propagates muted (script-created)]
expected: FAIL
[cloning audio propagates muted (innerHTML-created)]
expected: FAIL
[cloning video propagates muted (script-created)]
expected: FAIL
[cloning video propagates muted (innerHTML-created)]
expected: FAIL

View file

@ -1,6 +1,5 @@
[iframe_javascript_url_01.htm] [iframe_javascript_url_01.htm]
type: testharness type: testharness
expected: TIMEOUT
[javascript: URL creating a document in an about:blank iframe] [javascript: URL creating a document in an about:blank iframe]
expected: NOTRUN expected: FAIL

View file

@ -1,5 +1,6 @@
[shader-with-non-reserved-words.html] [shader-with-non-reserved-words.html]
type: testharness type: testharness
expected: TIMEOUT
[WebGL test #1696: shader with: 'dmat2' failed to compile] [WebGL test #1696: shader with: 'dmat2' failed to compile]
expected: FAIL expected: FAIL
@ -144,3 +145,6 @@
[WebGL test #1862: shader with: 'dmat4x4' failed to compile] [WebGL test #1862: shader with: 'dmat4x4' failed to compile]
expected: FAIL expected: FAIL
[Overall test]
expected: NOTRUN

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<title>Floated table that becomes wider than its specified width, due to wide contents</title>
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#float-width" title="10.3.5 Floating, non-replaced elements">
<link rel="help" href="https://www.w3.org/TR/CSS22/tables.html#auto-table-layout" title="17.5.2.2 Automatic table layout">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="width:200px; height:200px; background:red;">
<div style="width:300px;">
<div style="float:left; width:200px; height:100px; margin-right:10px; background:green;"></div>
<div style="float:left; display:table; width:50px; height:10px; background:green;">
<div style="width:200px; height:100px;"></div>
</div>
</div>
</div>

View file

@ -8,7 +8,7 @@
<meta name="assert" content="Style attribute values are the content of a <meta name="assert" content="Style attribute values are the content of a
declaration block: the braces must not be included and are therefore invalid."/> declaration block: the braces must not be included and are therefore invalid."/>
<style type="text/css"> <style type="text/css">
p { background: lime; color: green; } p { background: lime; color: green; margin-top: 1em; }
</style> </style>
</head> </head>
<body> <body>

View file

@ -0,0 +1,21 @@
<!doctype html>
<meta charset="utf-8">
<title>'border-image-source' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('border-image-source', [
{ syntax: 'none' },
{ syntax: '<image>' },
]);
</script>

View file

@ -0,0 +1,21 @@
<!doctype html>
<meta charset="utf-8">
<title>'box-sizing' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('box-sizing', [
{ syntax: 'content-box'},
{ syntax: 'border-box' }
]);
</script>

View file

@ -0,0 +1,23 @@
<!doctype html>
<meta charset="utf-8">
<title>'clear' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('clear', [
{ syntax: 'none' },
{ syntax: 'left' },
{ syntax: 'right' },
{ syntax: 'both' },
]);
</script>

View file

@ -0,0 +1,22 @@
<!doctype html>
<meta charset="utf-8">
<title>'float' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('float', [
{ syntax: 'left' },
{ syntax: 'right' },
{ syntax: 'none' },
]);
</script>

View file

@ -0,0 +1,22 @@
<!doctype html>
<meta charset="utf-8">
<title>'font-style' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('font-style', [
{ syntax: 'normal' },
{ syntax: 'italic' },
{ syntax: 'oblique' },
]);
</script>

View file

@ -0,0 +1,50 @@
<!doctype html>
<meta charset="utf-8">
<title>'font-weight' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
function assert_is_font_weight(weight, result) {
assert_style_value_equals(result, new CSSUnitValue(weight, 'number'));
}
runPropertyTests('font-weight', [
{
syntax: 'normal',
computed: (_, result) => assert_is_font_weight(400, result)
},
{
syntax: 'bold',
computed: (_, result) => assert_is_font_weight(700, result)
},
{
syntax: 'bolder',
computed: (_, result) => assert_is_unit('number', result)
},
{
syntax: 'lighter',
computed: (_, result) => assert_is_unit('number', result)
},
{
syntax: '<number>',
specified: (input, result) => {
if (input instanceof CSSUnitValue &&
(input.value < 0 || input.value > 1000))
assert_style_value_equals(result, new CSSMathSum(input));
else
assert_style_value_equals(result, input);
}
},
]);
</script>

View file

@ -0,0 +1,35 @@
<!doctype html>
<meta charset="utf-8">
<title>'line-height' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('line-height', [
{ syntax: 'normal' },
{
syntax: '<length>',
specified: assert_is_equal_with_range_handling,
computed: (_, result) => assert_is_unit('px', result)
},
{
syntax: '<number>',
specified: assert_is_equal_with_range_handling,
computed: (_, result) => assert_is_unit('px', result)
},
{
syntax: '<percentage>',
specified: assert_is_equal_with_range_handling,
computed: (_, result) => assert_is_unit('px', result)
},
]);
</script>

View file

@ -0,0 +1,21 @@
<!doctype html>
<meta charset="utf-8">
<title>'list-style-position' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('list-style-position', [
{ syntax: 'inside' },
{ syntax: 'outside' },
]);
</script>

View file

@ -0,0 +1,22 @@
<!doctype html>
<meta charset="utf-8">
<title>'mask-image' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
// FIXME: mask-image is list-valued. Run list-valued tests here too.
runPropertyTests('mask-image', [
{ syntax: 'none' },
{ syntax: '<image>' },
]);
</script>

View file

@ -0,0 +1,29 @@
<!doctype html>
<meta charset="utf-8">
<title>'outline-style' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('outline-style', [
{ syntax: 'auto' },
{ syntax: 'none' },
{ syntax: 'dotted' },
{ syntax: 'dashed' },
{ syntax: 'solid' },
{ syntax: 'double' },
{ syntax: 'groove' },
{ syntax: 'ridge' },
{ syntax: 'inset' },
{ syntax: 'outset' },
]);
</script>

View file

@ -0,0 +1,26 @@
<!doctype html>
<meta charset="utf-8">
<title>'overflow' properties</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
for (const suffix of ['x', 'y']) {
runPropertyTests(`overflow-${suffix}`, [
{ syntax: 'visible' },
{ syntax: 'hidden' },
{ syntax: 'clip' },
{ syntax: 'scroll' },
{ syntax: 'auto' },
]);
}
</script>

View file

@ -0,0 +1,33 @@
<!doctype html>
<meta charset="utf-8">
<title>'shape-outside' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('shape-outside', [
{ syntax: 'none' },
{ syntax: 'margin-box' },
{ syntax: 'border-box' },
{ syntax: 'padding-box' },
{ syntax: 'content-box' },
{ syntax: '<image>' },
]);
// <basic-shape>s are not supported in level 1
runUnsupportedPropertyTests('shape-outside', [
'inset(22% 12% 15px 35px)',
'circle(6rem at 12rem 6rem)',
'ellipse(115px 55px at 50% 40%)',
'polygon(50% 20%, 90% 80%, 10% 80%)',
]);
</script>

View file

@ -16,7 +16,9 @@
runPropertyTests('text-decoration-style', [ runPropertyTests('text-decoration-style', [
{ syntax: 'solid' }, { syntax: 'solid' },
{ syntax: 'double' }, { syntax: 'double' },
// and other keywords { syntax: 'dotted' },
{ syntax: 'dashed' },
{ syntax: 'wavy' },
]); ]);
</script> </script>

View file

@ -0,0 +1,24 @@
<!doctype html>
<meta charset="utf-8">
<title>'text-transform' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('text-transform', [
{ syntax: 'none' },
{ syntax: 'captialize' },
{ syntax: 'uppercase' },
{ syntax: 'lowercase' },
{ syntax: 'full-width' },
]);
</script>

View file

@ -15,8 +15,8 @@
runPropertyTests('visibility', [ runPropertyTests('visibility', [
{ syntax: 'visible'}, { syntax: 'visible'},
{ syntax: 'hidden' } { syntax: 'hidden' },
// and other keywords { syntax: 'collapse' },
]); ]);
</script> </script>

View file

@ -0,0 +1,24 @@
<!doctype html>
<meta charset="utf-8">
<title>'white-space' property</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script src="resources/testsuite.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
runPropertyTests('white-space', [
{ syntax: 'normal'},
{ syntax: 'pre' },
{ syntax: 'nowrap' },
{ syntax: 'pre-wrap' },
{ syntax: 'pre-line' },
]);
</script>

View file

@ -50,6 +50,21 @@ test(function () {
assert_true(instance2 instanceof DefinedLater); assert_true(instance2 instanceof DefinedLater);
}, 'document.createElement must create an instance of autonomous custom elements when it has is attribute'); }, 'document.createElement must create an instance of autonomous custom elements when it has is attribute');
test(() => {
class SuperP extends HTMLParagraphElement {}
customElements.define("super-p", SuperP, { extends: "p" });
const superP = document.createElement("p", { is: "super-p" });
assert_true(superP instanceof HTMLParagraphElement);
assert_true(superP instanceof SuperP);
assert_equals(superP.localName, "p");
const notSuperP = document.createElement("p", "super-p");
assert_true(notSuperP instanceof HTMLParagraphElement);
assert_false(notSuperP instanceof SuperP);
assert_equals(notSuperP.localName, "p");
}, "document.createElement()'s second argument is to be ignored when it's a string");
function assert_reports(expected, testFunction, message) { function assert_reports(expected, testFunction, message) {
var uncaughtError = null; var uncaughtError = null;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }

View file

@ -49,5 +49,20 @@ test(() => {
assert_false(element instanceof MyBuiltinElement2); assert_false(element instanceof MyBuiltinElement2);
assert_false(element.hasAttribute('is')); assert_false(element.hasAttribute('is'));
}, 'builtin: document.createElementNS should check namespaces.'); }, 'builtin: document.createElementNS should check namespaces.');
test(() => {
class SuperP extends HTMLParagraphElement {}
customElements.define("super-p", SuperP, { extends: "p" });
const superP = document.createElementNS("http://www.w3.org/1999/xhtml", "p", { is: "super-p" });
assert_true(superP instanceof HTMLParagraphElement);
assert_true(superP instanceof SuperP);
assert_equals(superP.localName, "p");
const notSuperP = document.createElementNS("http://www.w3.org/1999/xhtml", "p", "super-p");
assert_true(notSuperP instanceof HTMLParagraphElement);
assert_false(notSuperP instanceof SuperP);
assert_equals(notSuperP.localName, "p");
}, "document.createElementNS()'s third argument is to be ignored when it's a string");
</script> </script>
</body> </body>

View file

@ -1,9 +1,9 @@
To run WPT on Chrome on an android device, some additional set up is required. To run WPT on Chrome on an Android device, some additional set up is required.
First of all, as usual Android development, we need to have `adb` and be able to First of all, as usual Android development, we need to have `adb` and be able to
connect to the device. connect to the device.
Furthermore, until we find a better way, we need to root the android device and Furthermore, until we find a better way, we need to root the Android device and
update the /etc/hosts file to include update the /etc/hosts file to include
``` ```

View file

@ -40,6 +40,9 @@ first two, and it is at times advisable to use testharness.js tests
for things which would typically be tested using reftests but for for things which would typically be tested using reftests but for
which it would be overly cumbersome. which it would be overly cumbersome.
See [file names][] for test types and features determined by the file names,
and [server features][] for advanced testing features.
In addition to the four main test types, there are also WebDriver In addition to the four main test types, there are also WebDriver
tests, which are used exclusively for testing the WebDriver protocol tests, which are used exclusively for testing the WebDriver protocol
itself. There is currently no documentation about these tests, itself. There is currently no documentation about these tests,
@ -52,8 +55,10 @@ the [typical GitHub Pull Request workflow][submission-process]; please
make sure you run the [`lint` script][lint-tool] before opening a pull request! make sure you run the [`lint` script][lint-tool] before opening a pull request!
[introduction]: {{ site.baseurl }}{% link introduction.md %} [introduction]: {{ site.baseurl }}{% link introduction.md %}
[file names]: {{ site.baseurl }}{% link _writing-tests/file-names.md %}
[general guidelines]: {{ site.baseurl }}{% link _writing-tests/general-guidelines.md %} [general guidelines]: {{ site.baseurl }}{% link _writing-tests/general-guidelines.md %}
[reftests]: {{ site.baseurl }}{% link _writing-tests/reftests.md %} [reftests]: {{ site.baseurl }}{% link _writing-tests/reftests.md %}
[server features]: {{ site.baseurl }}{% link _writing-tests/server-features.md %}
[testharness.js]: {{ site.baseurl }}{% link _writing-tests/testharness.md %} [testharness.js]: {{ site.baseurl }}{% link _writing-tests/testharness.md %}
[visual]: {{ site.baseurl }}{% link _writing-tests/visual.md %} [visual]: {{ site.baseurl }}{% link _writing-tests/visual.md %}
[manual]: {{ site.baseurl }}{% link _writing-tests/manual.md %} [manual]: {{ site.baseurl }}{% link _writing-tests/manual.md %}

View file

@ -8,8 +8,8 @@ order: 12
Certain test scenarios require more than just static HTML Certain test scenarios require more than just static HTML
generation. This is supported through the generation. This is supported through the
[wptserve](http://wptserve.readthedocs.io) server. Several scenarios [wptserve](http://wptserve.readthedocs.io) server, and controlled by
in particular are common: [file name flags][file names]. Several scenarios in particular are common:
### Tests Involving Multiple Origins ### Tests Involving Multiple Origins
@ -85,3 +85,6 @@ responses. It also provides the ability to write Python scripts that
have access to request data and can manipulate the content and timing have access to request data and can manipulate the content and timing
of the response. For details see the of the response. For details see the
[wptserve documentation](https://wptserve.readthedocs.org). [wptserve documentation](https://wptserve.readthedocs.org).
[file names]: {{ site.baseurl }}{% link _writing-tests/file-names.md %}

View file

@ -16,8 +16,8 @@ documented in two sections:
* [idlharness.js Documentation][idlharness] — A library for testing * [idlharness.js Documentation][idlharness] — A library for testing
IDL interfaces using `testharness.js`. IDL interfaces using `testharness.js`.
As always, we recommend reading over the [general guidelines][] for See [server features][] for advanced testing features that are commonly used
all test types. with testharness.js. See also the [general guidelines][] for all test types.
## Auto-generated test boilerplate ## Auto-generated test boilerplate
@ -103,3 +103,4 @@ Use `// META: timeout=long` at the beginning of the resource.
[general guidelines]: {{ site.baseurl }}{% link _writing-tests/general-guidelines.md %} [general guidelines]: {{ site.baseurl }}{% link _writing-tests/general-guidelines.md %}
[testharness-api]: {{ site.baseurl }}{% link _writing-tests/testharness-api.md %} [testharness-api]: {{ site.baseurl }}{% link _writing-tests/testharness-api.md %}
[idlharness]: {{ site.baseurl }}{% link _writing-tests/idlharness.md %} [idlharness]: {{ site.baseurl }}{% link _writing-tests/idlharness.md %}
[server features]: {{ site.baseurl }}{% link _writing-tests/server-features.md %}

View file

@ -104,10 +104,18 @@ test(() => {
} }
}, "sendBeacon URL: unpaired surrogate codepoint should not make any exceptions.") }, "sendBeacon URL: unpaired surrogate codepoint should not make any exceptions.")
test(() => {
// This shouldn't throw an exception.
window.navigator.registerProtocolHandler('web+myprotocol', "custom-scheme\uD800/url=%s", "title");
}, "RegisterPtotocolHandler URL: unpaired surrogate codepoint should not make any exceptions.")
test(() => { test(() => {
var w = window.open("about:blank#\uD800"); var w = window.open("about:blank#\uD800");
assert_equals(w.document.URL, 'about:blank#%EF%BF%BD'); assert_equals(w.document.URL, 'about:blank#%EF%BF%BD');
assert_equals(w.document.documentURI, 'about:blank#%EF%BF%BD'); assert_equals(w.document.documentURI, 'about:blank#%EF%BF%BD');
// TODO(gyuyoung): How to test document.origin? When opening a URL with an
// unpaired surrogate codepoint, invalid URL exception happens.
// e.g) var w = window.open("http://test.com\uDB89");
}, "Document URLs: unpaired surrogate codepoint should be replaced with U+FFFD") }, "Document URLs: unpaired surrogate codepoint should be replaced with U+FFFD")
promise_test(t => { promise_test(t => {

View file

@ -0,0 +1,76 @@
<!doctype html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
<title>2.7 Safe passing of structured data</title>
<link rel="help" href="https://html.spec.whatwg.org/multipage/#safe-passing-of-structured-data" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"></div>
<script type="text/javascript">
// Note, this test is designed to be in a similar style to
// html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html
// It is in a separate file to avoid causing a syntax error on UAs which
// do not yet support BigInt, so the rest of the test can continue running.
var worker;
var testCollection;
setup(function()
{
//the worker is used for each test in sequence
//worker's callback will be set for each test
//worker's internal onmessage echoes the data back to this thread through postMessage
worker = new Worker("./echo.js");
testCollection = [
function() {
var t = async_test("Primitive BigInt is cloned");
t.id = 0;
worker.onmessage = t.step_func(function(e) {assert_equals(1n, e.data, "1n === event.data"); t.done(); });
t.step(function() { worker.postMessage(1n);});
},
function() {
var t = async_test("Instance of BigInt is cloned");
t.id = 1;
var obj;
t.step(function() {obj = Object(1n);});
worker.onmessage = t.step_func(function(e) {
assert_equals(obj.constructor, e.data.constructor, "BigInt === event.data.constructor");
assert_equals(obj.valueOf(), e.data.valueOf(), "(BigInt(1n)).valueOf() === event.data.valueOf()");
t.done();
});
t.step(function() { worker.postMessage(obj);});
},
];
}, {explicit_done:true});
//Callback for result_callback
//queues the next test in the array testCollection
//serves to make test execution sequential from the async worker callbacks
//alternatively, we would have to create a worker for each test
function testFinished(test) {
if(test.id < testCollection.length - 1) {
//queue the function so that stack remains shallow
queue(testCollection[test.id+1]);
} else {
//when the last test has run, explicitly end test suite
done();
}
}
function queue(func) {
step_timeout(func, 10);
}
add_result_callback(testFinished);
//start the first test manually
queue(testCollection[0]);
</script>
</body>
</html>

View file

@ -148,5 +148,22 @@ async_test(function(t) {
assert_true(m.hasAttribute('muted')); assert_true(m.hasAttribute('muted'));
assert_true(m.muted); assert_true(m.muted);
}, 'getting ' + tagName + '.muted with muted="" (document.write-created)'); }, 'getting ' + tagName + '.muted with muted="" (document.write-created)');
test(function() {
var m = document.createElement(tagName);
m.setAttribute('muted', '');
var c = m.cloneNode(true);
assert_true(c.muted);
}, 'cloning ' + tagName + ' propagates muted (script-created)');
test(function() {
var div = document.createElement('div');
div.innerHTML = '<' + tagName + ' muted>';
m = div.firstChild;
var c = m.cloneNode(true);
assert_true(c.muted);
}, 'cloning ' + tagName + ' propagates muted (innerHTML-created)');
}); });
</script> </script>

View file

@ -10,7 +10,7 @@
div.b { div.b {
all: initial; all: initial;
direction: initial; direction: initial;
unicode-bidi: initial; unicode-bidi: isolate;
display: block; display: block;
} }

View file

@ -0,0 +1,9 @@
test(() => {
assert_false(self.isSecureContext);
}, "Lack of .https file name flag implies non-secure context");
test(() => {
assert_equals(location.protocol, "http:");
}, "Lack of .https file name flag implies HTTP scheme");
done();

View file

@ -0,0 +1,9 @@
test(() => {
assert_true(self.isSecureContext);
}, "Use of .https file name flag implies secure context");
test(() => {
assert_equals(location.protocol, "https:");
}, "Use of .https file name flag implies HTTPS scheme");
done();

View file

@ -266,8 +266,8 @@ interface Document : Node {
HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName); HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
HTMLCollection getElementsByClassName(DOMString classNames); HTMLCollection getElementsByClassName(DOMString classNames);
[NewObject] Element createElement(DOMString localName, optional ElementCreationOptions options); [NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options);
[NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional ElementCreationOptions options); [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options);
[NewObject] DocumentFragment createDocumentFragment(); [NewObject] DocumentFragment createDocumentFragment();
[NewObject] Text createTextNode(DOMString data); [NewObject] Text createTextNode(DOMString data);
[NewObject] CDATASection createCDATASection(DOMString data); [NewObject] CDATASection createCDATASection(DOMString data);

View file

@ -4,69 +4,24 @@
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script> <script>
promise_test(t => {
const invalid_lock_types = [
"invalid-orientation",
null,
undefined,
123,
window,
["portrait-primary", "landscape-primary"],
];
const promisesToReject = invalid_lock_types.map(type =>
promise_rejects(t, new TypeError(), screen.orientation.lock(type))
);
return Promise.all(promisesToReject);
}, "screen.orientation.lock() must throw given invalid input.");
var test = async_test("Test that screen.orientation.lock() throws when the input isn't valid."); promise_test(t => {
return promise_rejects(t, new TypeError(), screen.orientation.lock());
function onOrientationChangeEvent(ev) { }, "screen.orientation.lock() must throw when the input is missing.");
assert_unreached('Unexpected orientation change');
}
window.screen.orientation.addEventListener('change', test.step_func(onOrientationChangeEvent));
test.step(function() {
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock('invalid-orientation');
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(null);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(undefined);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(undefined);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(123);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(window);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(['portrait-primary']);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock(['portrait-primary', 'landscape-primary']);
});
assert_equals(screen.orientation.type, 'portrait-primary');
assert_throws(new TypeError(), function() {
screen.orientation.lock();
});
});
// Finish asynchronously to give events a chance to fire.
setTimeout(test.step_func(function() {
assert_equals(screen.orientation.type, 'portrait-primary');
screen.orientation.unlock();
test.done();
}));
</script> </script>
</body> </body>
</html> </html>

View file

@ -45,12 +45,6 @@ class Browser(object):
"""Name of the browser-specific wptrunner requirements file""" """Name of the browser-specific wptrunner requirements file"""
return NotImplemented return NotImplemented
def prepare_environment(self):
"""Do any additional setup of the environment required to start the
browser successfully
"""
pass
class Firefox(Browser): class Firefox(Browser):
"""Firefox-specific interface. """Firefox-specific interface.
@ -262,26 +256,6 @@ class Chrome(Browser):
output = call(self.binary, "--version") output = call(self.binary, "--version")
return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0) return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0)
def prepare_environment(self):
# https://bugs.chromium.org/p/chromium/issues/detail?id=713947
logger.debug("DBUS_SESSION_BUS_ADDRESS %s" % os.environ.get("DBUS_SESSION_BUS_ADDRESS"))
if "DBUS_SESSION_BUS_ADDRESS" not in os.environ:
if find_executable("dbus-launch"):
logger.debug("Attempting to start dbus")
dbus_conf = subprocess.check_output(["dbus-launch"])
logger.debug(dbus_conf)
# From dbus-launch(1):
#
# > When dbus-launch prints bus information to standard output,
# > by default it is in a simple key-value pairs format.
for line in dbus_conf.strip().split("\n"):
key, _, value = line.partition("=")
os.environ[key] = value
else:
logger.critical("dbus not running and can't be started")
sys.exit(1)
class ChromeAndroid(Browser): class ChromeAndroid(Browser):
"""Chrome-specific interface for Android. """Chrome-specific interface for Android.
@ -364,26 +338,6 @@ class Opera(Browser):
output = call(self.binary, "--version") output = call(self.binary, "--version")
return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0) return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0)
def prepare_environment(self):
# https://bugs.chromium.org/p/chromium/issues/detail?id=713947
logger.debug("DBUS_SESSION_BUS_ADDRESS %s" % os.environ.get("DBUS_SESSION_BUS_ADDRESS"))
if "DBUS_SESSION_BUS_ADDRESS" not in os.environ:
if find_executable("dbus-launch"):
logger.debug("Attempting to start dbus")
dbus_conf = subprocess.check_output(["dbus-launch"])
logger.debug(dbus_conf)
# From dbus-launch(1):
#
# > When dbus-launch prints bus information to standard output,
# > by default it is in a simple key-value pairs format.
for line in dbus_conf.strip().split("\n"):
key, _, value = line.partition("=")
os.environ[key] = value
else:
logger.critical("dbus not running and can't be started")
sys.exit(1)
class Edge(Browser): class Edge(Browser):
"""Edge-specific interface.""" """Edge-specific interface."""

View file

@ -0,0 +1,66 @@
let sampleRate = 44100.0;
let renderLengthSeconds = 4;
let delayTimeSeconds = 0.5;
let toneLengthSeconds = 2;
function createToneBuffer(context, frequency, numberOfCycles, sampleRate) {
let duration = numberOfCycles / frequency;
let sampleFrameLength = duration * sampleRate;
let audioBuffer = context.createBuffer(1, sampleFrameLength, sampleRate);
let n = audioBuffer.length;
let data = audioBuffer.getChannelData(0);
for (let i = 0; i < n; ++i)
data[i] = Math.sin(frequency * 2.0 * Math.PI * i / sampleRate);
return audioBuffer;
}
function checkDelayedResult(renderedBuffer, toneBuffer, should) {
let sourceData = toneBuffer.getChannelData(0);
let renderedData = renderedBuffer.getChannelData(0);
let delayTimeFrames = delayTimeSeconds * sampleRate;
let toneLengthFrames = toneLengthSeconds * sampleRate;
let success = true;
let n = renderedBuffer.length;
for (let i = 0; i < n; ++i) {
if (i < delayTimeFrames) {
// Check that initial portion is 0 (since signal is delayed).
if (renderedData[i] != 0) {
should(
renderedData[i], 'Initial portion expected to be 0 at frame ' + i)
.beEqualTo(0);
success = false;
break;
}
} else if (i >= delayTimeFrames && i < delayTimeFrames + toneLengthFrames) {
// Make sure that the tone data is delayed by exactly the expected number
// of frames.
let j = i - delayTimeFrames;
if (renderedData[i] != sourceData[j]) {
should(renderedData[i], 'Actual data at frame ' + i)
.beEqualTo(sourceData[j]);
success = false;
break;
}
} else {
// Make sure we have silence after the delayed tone.
if (renderedData[i] != 0) {
should(renderedData[j], 'Final portion at frame ' + i).beEqualTo(0);
success = false;
break;
}
}
}
should(
success, 'Delaying test signal by ' + delayTimeSeconds + ' sec was done')
.message('correctly', 'incorrectly')
}

View file

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-max-default-delay.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description: 'DelayNode with delay set to default maximum delay'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let delay = context.createDelay();
delayTimeSeconds = 1;
delay.delayTime.value = delayTimeSeconds;
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-max-nondefault-delay.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description: 'DelayNode with delay set to non-default maximum delay'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let maxDelay = 1.5;
let delay = context.createDelay(maxDelay);
delayTimeSeconds = maxDelay;
delay.delayTime.value = delayTimeSeconds;
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
;
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-maxdelay.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description:
'Basic functionality of DelayNode with a non-default max delay time'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
// Create a delay node with an explicit max delay time (greater than
// the default of 1 second).
let delay = context.createDelay(2);
// Set the delay time to a value greater than the default max delay
// so we can verify the delay is working for this case.
delayTimeSeconds = 1.5;
delay.delayTime.value = delayTimeSeconds;
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-maxdelaylimit.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description:
'Tests attribute and maximum allowed delay of DelayNode'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
window.context = context;
should(() => context.createDelay(180)).throw();
should(() => context.createDelay(0)).throw();
should(() => context.createDelay(-1)).throw();
should(() => context.createDelay(NaN)).throw();
;
let delay = context.createDelay(179);
delay.delayTime.value = delayTimeSeconds;
window.delay = delay;
should(
delay.delayTime.value,
'delay.delayTime.value = ' + delayTimeSeconds)
.beEqualTo(delayTimeSeconds);
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-scheduling.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description:
'DelayNode delayTime parameter can be scheduled at a given time'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let delay = context.createDelay();
// Schedule delay time at time zero.
delay.delayTime.setValueAtTime(delayTimeSeconds, 0);
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description: 'Tests attribute and basic functionality of DelayNode'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let delay = context.createDelay();
window.delay = delay;
should(delay.numberOfInputs, 'delay.numberOfInputs').beEqualTo(1);
should(delay.numberOfOutputs, 'delay.numberOfOutputs').beEqualTo(1);
should(delay.delayTime.defaultValue, 'delay.delayTime.defaultValue')
.beEqualTo(0.0);
should(delay.delayTime.value, 'delay.delayTime.value')
.beEqualTo(0.0);
delay.delayTime.value = delayTimeSeconds;
should(
delay.delayTime.value,
'delay.delayTime.value = ' + delayTimeSeconds)
.beEqualTo(delayTimeSeconds);
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(task.done.bind(task));
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,183 @@
<!DOCTYPE html>
<html>
<head>
<title>
Test DelayNode Has No Dezippering
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
// The sample rate must be a power of two to avoid any round-off errors in
// computing when to suspend a context on a rendering quantum boundary.
// Otherwise this is pretty arbitrary.
let sampleRate = 16384;
let audit = Audit.createTaskRunner();
audit.define(
{label: 'test0', description: 'Test DelayNode has no dezippering'},
(task, should) => {
let context = new OfflineAudioContext(1, sampleRate, sampleRate);
// Simple integer ramp for testing delay node
let buffer = new AudioBuffer(
{length: context.length, sampleRate: context.sampleRate});
let rampData = buffer.getChannelData(0);
for (let k = 0; k < rampData.length; ++k) {
rampData[k] = k + 1;
}
// |delay0Frame| is the initial delay in frames. |delay1Frame| is
// the new delay in frames. These must be integers.
let delay0Frame = 64;
let delay1Frame = 16;
let src = new AudioBufferSourceNode(context, {buffer: buffer});
let delay = new DelayNode(
context, {delayTime: delay0Frame / context.sampleRate});
src.connect(delay).connect(context.destination);
// After a render quantum, change the delay to |delay1Frame|.
context.suspend(RENDER_QUANTUM_FRAMES / context.sampleRate)
.then(() => {
delay.delayTime.value = delay1Frame / context.sampleRate;
})
.then(() => context.resume());
src.start();
context.startRendering()
.then(renderedBuffer => {
let renderedData = renderedBuffer.getChannelData(0);
// The first |delay0Frame| frames should be zero.
should(
renderedData.slice(0, delay0Frame),
'output[0:' + (delay0Frame - 1) + ']')
.beConstantValueOf(0);
// Now we have the ramp should show up from the delay.
let ramp0 =
new Float32Array(RENDER_QUANTUM_FRAMES - delay0Frame);
for (let k = 0; k < ramp0.length; ++k) {
ramp0[k] = rampData[k];
}
should(
renderedData.slice(delay0Frame, RENDER_QUANTUM_FRAMES),
'output[' + delay0Frame + ':' +
(RENDER_QUANTUM_FRAMES - 1) + ']')
.beEqualToArray(ramp0);
// After one rendering quantum, the delay is changed to
// |delay1Frame|.
let ramp1 =
new Float32Array(context.length - RENDER_QUANTUM_FRAMES);
for (let k = 0; k < ramp1.length; ++k) {
// ramp1[k] = 1 + k + RENDER_QUANTUM_FRAMES - delay1Frame;
ramp1[k] =
rampData[k + RENDER_QUANTUM_FRAMES - delay1Frame];
}
should(
renderedData.slice(RENDER_QUANTUM_FRAMES),
'output[' + RENDER_QUANTUM_FRAMES + ':]')
.beEqualToArray(ramp1);
})
.then(() => task.done());
});
audit.define(
{label: 'test1', description: 'Test value setter and setValueAtTime'},
(task, should) => {
testWithAutomation(should, {prefix: ''}).then(() => task.done());
});
audit.define(
{label: 'test2', description: 'Test value setter and modulation'},
(task, should) => {
testWithAutomation(should, {
prefix: 'With modulation: ',
modulator: true
}).then(() => task.done());
});
// Compare .value setter with setValueAtTime, Optionally allow modulation
// of |delayTime|.
function testWithAutomation(should, options) {
let prefix = options.prefix;
// Channel 0 is the output of delay node using the setter and channel 1
// is the output using setValueAtTime.
let context = new OfflineAudioContext(2, sampleRate, sampleRate);
let merger = new ChannelMergerNode(
context, {numberOfInputs: context.destination.channelCount});
merger.connect(context.destination);
let src = new OscillatorNode(context);
// |delay0Frame| is the initial delay value in frames. |delay1Frame| is
// the new delay in frames. The values here are constrained only by the
// constraints for a DelayNode. These are pretty arbitrary except we
// wanted them to be fractional so as not be on a frame boundary to
// test interpolation compared with |setValueAtTime()|..
let delay0Frame = 3.1;
let delay1Frame = 47.2;
let delayTest = new DelayNode(
context, {delayTime: delay0Frame / context.sampleRate});
let delayRef = new DelayNode(
context, {delayTime: delay0Frame / context.sampleRate});
src.connect(delayTest).connect(merger, 0, 0);
src.connect(delayRef).connect(merger, 0, 1);
if (options.modulator) {
// Fairly arbitrary modulation of the delay time, with a peak
// variation of 10 ms.
let mod = new OscillatorNode(context, {frequency: 1000});
let modGain = new GainNode(context, {gain: .01});
mod.connect(modGain);
modGain.connect(delayTest.delayTime);
modGain.connect(delayRef.delayTime);
mod.start();
}
// The time at which the delay time of |delayTest| node will be
// changed. This MUST be on a render quantum boundary, but is
// otherwise arbitrary.
let changeTime = 3 * RENDER_QUANTUM_FRAMES / context.sampleRate;
// Schedule the delay change on |delayRef| and also apply the value
// setter for |delayTest| at |changeTime|.
delayRef.delayTime.setValueAtTime(
delay1Frame / context.sampleRate, changeTime);
context.suspend(changeTime)
.then(() => {
delayTest.delayTime.value = delay1Frame / context.sampleRate;
})
.then(() => context.resume());
src.start();
return context.startRendering().then(renderedBuffer => {
let actual = renderedBuffer.getChannelData(0);
let expected = renderedBuffer.getChannelData(1);
let match = should(actual, prefix + '.value setter output')
.beEqualToArray(expected);
should(
match,
prefix + '.value setter output matches setValueAtTime output')
.beTrue();
});
}
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<title>
dynamicscompressor-basic.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
let context;
let compressor;
audit.define(
{
label: 'test',
description: 'Basic tests for DynamicsCompressorNode API'
},
function(task, should) {
context = new AudioContext();
compressor = context.createDynamicsCompressor();
should(compressor.threshold.value, 'compressor.threshold.value')
.beEqualTo(-24);
should(compressor.knee.value, 'compressor.knee.value')
.beEqualTo(30);
should(compressor.ratio.value, 'compressor.ratio.value')
.beEqualTo(12);
should(compressor.attack.value, 'compressor.attack.value')
.beEqualTo(Math.fround(0.003));
should(compressor.release.value, 'compressor.release.value')
.beEqualTo(0.25);
should(typeof compressor.reduction, 'typeof compressor.reduction')
.beEqualTo('number');
should(compressor.reduction, 'compressor.reduction').beEqualTo(0);
task.done();
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,37 @@
<!DOCTYPE html>
<!--
Verifies GainNode attributes and their type.
-->
<html>
<head>
<title>
gain-basic.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define('test', function(task, should) {
// Create audio context.
let context = new AudioContext();
// Create gain node.
let gainNode = context.createGain();
should(
gainNode.gain instanceof AudioParam,
'gainNode.gain instanceof AudioParam')
.beTrue();
task.done();
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,154 @@
<!DOCTYPE html>
<html>
<head>
<title>
Basic GainNode Functionality
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
// Tests that GainNode is properly scaling the gain. We'll render 11
// notes, starting at a gain of 1.0, decreasing in gain by 0.1. The 11th
// note will be of gain 0.0, so it should be silent (at the end in the
// rendered output).
let audit = Audit.createTaskRunner();
let sampleRate = 44100.0;
let bufferDurationSeconds = 0.125;
let numberOfNotes = 11;
let noteSpacing = bufferDurationSeconds +
0.020; // leave 20ms of silence between each "note"
let lengthInSeconds = numberOfNotes * noteSpacing;
let context = 0;
let sinWaveBuffer = 0;
// Create a stereo AudioBuffer of duration |lengthInSeconds| consisting of
// a pure sine wave with the given |frequency|. Both channels contain the
// same data.
function createSinWaveBuffer(lengthInSeconds, frequency) {
let audioBuffer =
context.createBuffer(2, lengthInSeconds * sampleRate, sampleRate);
let n = audioBuffer.length;
let channelL = audioBuffer.getChannelData(0);
let channelR = audioBuffer.getChannelData(1);
for (let i = 0; i < n; ++i) {
channelL[i] = Math.sin(frequency * 2.0 * Math.PI * i / sampleRate);
channelR[i] = channelL[i];
}
return audioBuffer;
}
function playNote(time, gain, merger) {
let source = context.createBufferSource();
source.buffer = sinWaveBuffer;
let gainNode = context.createGain();
gainNode.gain.value = gain;
let sourceSplitter = context.createChannelSplitter(2);
let gainSplitter = context.createChannelSplitter(2);
// Split the stereo channels from the source output and the gain output
// and merge them into the desired channels of the merger.
source.connect(gainNode).connect(gainSplitter);
source.connect(sourceSplitter);
gainSplitter.connect(merger, 0, 0);
gainSplitter.connect(merger, 1, 1);
sourceSplitter.connect(merger, 0, 2);
sourceSplitter.connect(merger, 1, 3);
source.start(time);
}
audit.define(
{label: 'create context', description: 'Create context for test'},
function(task, should) {
// Create offline audio context.
context = new OfflineAudioContext(
4, sampleRate * lengthInSeconds, sampleRate);
task.done();
});
audit.define(
{label: 'test', description: 'GainNode functionality'},
function(task, should) {
let merger = new ChannelMergerNode(
context, {numberOfInputs: context.destination.channelCount});
merger.connect(context.destination);
// Create a buffer for a short "note".
sinWaveBuffer = createSinWaveBuffer(bufferDurationSeconds, 880.0);
let startTimes = [];
let gainValues = [];
// Render 11 notes, starting at a gain of 1.0, decreasing in gain by
// 0.1. The last note will be of gain 0.0, so shouldn't be
// perceptible in the rendered output.
for (let i = 0; i < numberOfNotes; ++i) {
let time = i * noteSpacing;
let gain = 1.0 - i / (numberOfNotes - 1);
startTimes.push(time);
gainValues.push(gain);
playNote(time, gain, merger);
}
context.startRendering()
.then(buffer => {
let actual0 = buffer.getChannelData(0);
let actual1 = buffer.getChannelData(1);
let reference0 = buffer.getChannelData(2);
let reference1 = buffer.getChannelData(3);
// It's ok to a frame too long since the sine pulses are
// followed by silence.
let bufferDurationFrames =
Math.ceil(bufferDurationSeconds * context.sampleRate);
// Apply the gains to the reference signal.
for (let k = 0; k < startTimes.length; ++k) {
// It's ok to be a frame early because the sine pulses are
// preceded by silence.
let startFrame =
Math.floor(startTimes[k] * context.sampleRate);
let gain = gainValues[k];
for (let n = 0; n < bufferDurationFrames; ++n) {
reference0[startFrame + n] *= gain;
reference1[startFrame + n] *= gain;
}
}
// Verify the channels are clsoe to the reference.
should(actual0, 'Left output from gain node')
.beCloseToArray(
reference0, {relativeThreshold: 1.1908e-7});
should(actual1, 'Right output from gain node')
.beCloseToArray(
reference1, {relativeThreshold: 1.1908e-7});
// Test the SNR too for both channels.
let snr0 = 10 * Math.log10(computeSNR(actual0, reference0));
let snr1 = 10 * Math.log10(computeSNR(actual1, reference1));
should(snr0, 'Left SNR (in dB)')
.beGreaterThanOrEqualTo(148.69);
should(snr1, 'Right SNR (in dB)')
.beGreaterThanOrEqualTo(148.69);
})
.then(() => task.done());
;
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,121 @@
<!DOCTYPE html>
<html>
<head>
<title>
Gain Dezippering Test: Dezippering Removed
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{label: 'test0', description: 'Dezippering of GainNode removed'},
(task, should) => {
// Only need a few frames to verify that dezippering has been
// removed from the GainNode. Sample rate is pretty arbitrary.
let context = new OfflineAudioContext(1, 1024, 16000);
// Send a unit source to the gain node so we can measure the effect
// of the gain node.
let src = new ConstantSourceNode(context, {offset: 1});
let g = new GainNode(context, {gain: 1});
src.connect(g).connect(context.destination);
context.suspend(RENDER_QUANTUM_FRAMES / context.sampleRate)
.then(() => {
g.gain.value = .5;
})
.then(() => context.resume());
src.start();
context.startRendering()
.then(audio => {
let c = audio.getChannelData(0);
// If dezippering has been removed, the gain output should
// instantly jump at frame 128 to 0.5.
should(c.slice(0, 128), 'output[0:127]').beConstantValueOf(1);
should(c.slice(128), 'output[128:]').beConstantValueOf(0.5);
})
.then(() => task.done());
});
audit.define(
{
label: 'test2',
description: 'Compare value setter and setValueAtTime'
},
(task, should) => {
testWithAutomation(should, {prefix: ''}).then(() => task.done());
});
audit.define(
{label: 'test3', description: 'Automation effects'},
(task, should) => {
testWithAutomation(should, {
prefix: 'With modulation: ',
modulator: true
}).then(() => task.done());
});
audit.run();
function testWithAutomation(should, options) {
// Sample rate must be a power of two to eliminate round-off in
// computing the time at render quantum boundaries.
let context = new OfflineAudioContext(2, 1024, 16384);
let merger = new ChannelMergerNode(context, {numberOfChannels: 2});
merger.connect(context.destination);
let src = new OscillatorNode(context);
let gainTest = new GainNode(context);
let gainRef = new GainNode(context);
src.connect(gainTest).connect(merger, 0, 0);
src.connect(gainRef).connect(merger, 0, 1);
if (options.modulator) {
let mod = new OscillatorNode(context, {frequency: 1000});
let modGain = new GainNode(context);
mod.connect(modGain);
modGain.connect(gainTest.gain);
modGain.connect(gainRef.gain);
mod.start();
}
// Change the gains. Must do the change on a render boundary!
let changeTime = 3 * RENDER_QUANTUM_FRAMES / context.sampleRate;
let newGain = .3;
gainRef.gain.setValueAtTime(newGain, changeTime);
context.suspend(changeTime)
.then(() => gainTest.gain.value = newGain)
.then(() => context.resume());
src.start();
return context.startRendering().then(audio => {
let actual = audio.getChannelData(0);
let expected = audio.getChannelData(1);
// The values using the .value setter must be identical to the
// values using setValueAtTime.
let match = should(actual, options.prefix + '.value setter output')
.beEqualToArray(expected);
should(
match,
options.prefix +
'.value setter output matches setValueAtTime output')
.beTrue();
});
}
</script>
</body>
</html>