mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Update web-platform-tests to revision 9659a35d816ff1b32835a2eccf3e0117dea4e5ce
This commit is contained in:
parent
6df0dc5b27
commit
4f0af2af66
54 changed files with 1873 additions and 137 deletions
|
@ -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"
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[floated-table-wider-than-specified.html]
|
||||||
|
expected: FAIL
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[Document-createElementNS.html]
|
||||||
|
[document.createElementNS()'s third argument is to be ignored when it's a string]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[structured_clone_bigint.html]
|
||||||
|
[2.7 Safe passing of structured data]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -15,8 +15,8 @@
|
||||||
|
|
||||||
runPropertyTests('visibility', [
|
runPropertyTests('visibility', [
|
||||||
{ syntax: 'visible'},
|
{ syntax: 'visible'},
|
||||||
{ syntax: 'hidden' }
|
{ syntax: 'hidden' },
|
||||||
// and other keywords
|
{ syntax: 'collapse' },
|
||||||
]);
|
]);
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -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>
|
|
@ -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; }
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 => {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
@ -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();
|
|
@ -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);
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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."""
|
||||||
|
|
|
@ -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')
|
||||||
|
}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue