Update web-platform-tests to revision 4accec3d14ccdc7b170017c0df299b954019f06f

This commit is contained in:
WPT Sync Bot 2019-04-26 23:48:44 -04:00
parent 630cf2745b
commit b30b1992ac
50 changed files with 1015 additions and 760 deletions

View file

@ -11,6 +11,9 @@
[Blob.arrayBuffer() empty Blob data]
expected: FAIL
[Blob.arrayBuffer() concurrent reads]
expected: FAIL
[Blob-array-buffer.any.worker.html]
[Blob.arrayBuffer() non-unicode input]
@ -25,3 +28,6 @@
[Blob.arrayBuffer() empty Blob data]
expected: FAIL
[Blob.arrayBuffer() concurrent reads]
expected: FAIL

View file

@ -8,6 +8,9 @@
[Blob.stream() non-unicode input]
expected: FAIL
[Blob.stream() garbage collection of blob shouldn't break streamconsumption]
expected: FAIL
[Blob-stream.any.html]
[Blob.stream() empty Blob]
@ -19,3 +22,6 @@
[Blob.stream() non-unicode input]
expected: FAIL
[Blob.stream() garbage collection of blob shouldn't break streamconsumption]
expected: FAIL

View file

@ -20,6 +20,9 @@
[Blob.text() empty blob data]
expected: FAIL
[Blob.text() concurrent reads]
expected: FAIL
[Blob-text.any.worker.html]
[Blob.text() different charset param in type option]
@ -43,3 +46,6 @@
[Blob.text() empty blob data]
expected: FAIL
[Blob.text() concurrent reads]
expected: FAIL

View file

@ -14,6 +14,9 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL
[url-with-fetch.any.html]
[Untitled]

View file

@ -133177,6 +133177,18 @@
{}
]
],
"css/css-position/position-sticky-change-top.html": [
[
"css/css-position/position-sticky-change-top.html",
[
[
"/css/css-position/position-sticky-change-top-ref.html",
"=="
]
],
{}
]
],
"css/css-position/position-sticky-child-multicolumn.html": [
[
"css/css-position/position-sticky-child-multicolumn.html",
@ -206136,11 +206148,6 @@
{}
]
],
"animation-worklet/worklet-animation-duration-ref.html": [
[
{}
]
],
"animation-worklet/worklet-animation-local-time-after-duration-ref.html": [
[
{}
@ -272246,6 +272253,11 @@
{}
]
],
"css/css-position/position-sticky-change-top-ref.html": [
[
{}
]
],
"css/css-position/position-sticky-child-multicolumn-ref.html": [
[
{}
@ -326991,311 +327003,6 @@
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/CompositionEvent.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.attrChange.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.attrName.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.newValue.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.prevValue.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.relatedNode.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMCharacterDataModified.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMNodeInserted.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMNodeRemoved.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMSubtreeModified.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/Event.defaultPrevented.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/Event.eventPhase.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/Event.stopPropagation.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/KeyboardEvent.key.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/KeyboardEvent.location.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/KeyboardEvent.modifiers.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MouseEvent.button.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MouseEvent.image.map.area.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MouseEvent.preventDefault.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MutationEvent.hasFeature.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MutationEvent.initMutationEvent.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MutationEvent.relatedNode.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/ProcessingInstruction.DOMCharacterDataModified.fail.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/ProcessingInstruction.DOMCharacterDataModified.xml": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.hasFeature.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.initTextEvent.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.IME.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.drop.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.keyboard.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.paste.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.script.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/UIEvent.load.stylesheet.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.Capture.Bubble.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.ctrlKey.zoom.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.deltaMode.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.hasFeature.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.initWheelEvent.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.preventDefault.scroll.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/abort.img.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/abort.testresult.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/blur.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/compositionstart.data.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/compositionstart.keydown.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/compositionstart.preventDefault.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/converted/support/ProcessingInstruction.DOMCharacterDataModified.xml": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/dispatchEvent.click.checkbox.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/error.image.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/focusin.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/focusin.relatedTarget.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/focusout.relatedTarget.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/hasFeature.Events.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/hasFeature.feature.string.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/load.image.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/mouseenter.ctrlKey.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/mouseenter.relatedTarget.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/mouseleave.relatedTarget.html": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/16kb.js": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/InvalidBitMap.png": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/iepreview.png": [
[
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/style01.css": [
[
{}
]
],
"uievents/order-of-events/README.md": [
[
{}
@ -337877,6 +337584,10 @@
[
"script",
"../support/Blob.js"
],
[
"script",
"../../streams/resources/test-utils.js"
]
]
}
@ -337892,6 +337603,10 @@
[
"script",
"../support/Blob.js"
],
[
"script",
"../../streams/resources/test-utils.js"
]
]
}
@ -347669,6 +347384,12 @@
{}
]
],
"animation-worklet/worklet-animation-without-target.https.html": [
[
"animation-worklet/worklet-animation-without-target.https.html",
{}
]
],
"apng/supported-in-source-type.html": [
[
"apng/supported-in-source-type.html",
@ -393760,6 +393481,12 @@
{}
]
],
"html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml": [
[
"html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml",
{}
]
],
"html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html": [
[
"html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html",
@ -401045,6 +400772,12 @@
{}
]
],
"intersection-observer/v2/inline-occlusion.html": [
[
"intersection-observer/v2/inline-occlusion.html",
{}
]
],
"intersection-observer/v2/scaled-target.html": [
[
"intersection-observer/v2/scaled-target.html",
@ -401069,6 +400802,12 @@
{}
]
],
"intersection-observer/v2/text-editor-occlusion.html": [
[
"intersection-observer/v2/text-editor-occlusion.html",
{}
]
],
"intersection-observer/v2/text-shadow.html": [
[
"intersection-observer/v2/text-shadow.html",
@ -401375,6 +401114,12 @@
{}
]
],
"lifecycle/child-out-of-viewport.tentative.html": [
[
"lifecycle/child-out-of-viewport.tentative.html",
{}
]
],
"lifecycle/freeze.html": [
[
"lifecycle/freeze.html",
@ -438723,12 +438468,6 @@
{}
]
],
"uievents/legacy-domevents-tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html": [
[
"uievents/legacy-domevents-tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html",
{}
]
],
"uievents/legacy/Event-subclasses-init.html": [
[
"uievents/legacy/Event-subclasses-init.html",
@ -444182,6 +443921,12 @@
{}
]
],
"webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html": [
[
"webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html",
{}
]
],
"webaudio/the-audio-api/the-delaynode-interface/ctor-delay.html": [
[
"webaudio/the-audio-api/the-delaynode-interface/ctor-delay.html",
@ -444320,6 +444065,12 @@
{}
]
],
"webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html": [
[
"webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html",
{}
]
],
"webaudio/the-audio-api/the-offlineaudiocontext-interface/ctor-offlineaudiocontext.html": [
[
"webaudio/the-audio-api/the-offlineaudiocontext-interface/ctor-offlineaudiocontext.html",
@ -475534,7 +475285,7 @@
"support"
],
".gitignore": [
"0f080ca986bcf8f3394385c0f5c257073ca94551",
"60d06876d962c726907f0bc0d5d46e1ae5382875",
"support"
],
".gitmodules": [
@ -479962,7 +479713,7 @@
"support"
],
"FileAPI/blob/Blob-array-buffer.any.js": [
"b72427fd5cfaf60ab665eb30e31a4654c4169d01",
"2310646e5fdeab300bcea66e4035adbdf3651685",
"testharness"
],
"FileAPI/blob/Blob-constructor-endings.html": [
@ -479986,11 +479737,11 @@
"testharness"
],
"FileAPI/blob/Blob-stream.any.js": [
"894f09f8ece47cab1301b8b474285204a4b7c4f1",
"bd4f8dc40bca12eb10a2f471dee417d3e31075a0",
"testharness"
],
"FileAPI/blob/Blob-text.any.js": [
"960c96054627fce66631f7bf59516cc6797d8521",
"d04fa97cffe6a3d81f520f7ac92ac44e699fa004",
"testharness"
],
"FileAPI/file/File-constructor-endings.html": [
@ -483562,15 +483313,11 @@
"reftest"
],
"animation-worklet/worklet-animation-creation.https.html": [
"02886c444dc6c1d68afed9ee6c130b2f85b25240",
"5d033b30099dc34017f54d0a3afd10278bbb31a6",
"testharness"
],
"animation-worklet/worklet-animation-duration-ref.html": [
"81b01bdca813caccb4a3b5e635db21d4f9411a63",
"support"
],
"animation-worklet/worklet-animation-duration.https.html": [
"1526004eaf17d5e420e3989a91ba49bc61f4b704",
"1a8afc1e89278d06572e337965a6d1ff1572d0d9",
"testharness"
],
"animation-worklet/worklet-animation-local-time-after-duration-ref.html": [
@ -483677,6 +483424,10 @@
"000517162af20406e39831afc0b6cefa0b367f2c",
"reftest"
],
"animation-worklet/worklet-animation-without-target.https.html": [
"bfb6b4faee4ea6db233c1ca825e786bc9eafc4bf",
"testharness"
],
"annotation-model/.editorconfig": [
"842ce7b6bf1386ff997f7c2f2baf3c3819a4967f",
"support"
@ -487114,7 +486865,7 @@
"support"
],
"common/security-features/resources/common.js": [
"782e428c66f80b94b289a9cce5d6fec0498ef564",
"2b4349d24e56c6e8ae325aae2a18b874a7006db8",
"support"
],
"common/security-features/scope/document.py": [
@ -597729,6 +597480,14 @@
"ba23f0145cf497c4d21b36f387d2017acf45bf34",
"testharness"
],
"css/css-position/position-sticky-change-top-ref.html": [
"8ccc1548ef6abcd82b04e242a747228e47cffd75",
"support"
],
"css/css-position/position-sticky-change-top.html": [
"054a8a610d968a6743bd3c2634b2f7226bdaec0e",
"reftest"
],
"css/css-position/position-sticky-child-multicolumn-ref.html": [
"c44f9f43eb51df8a8499a53db3d7c47d76f38829",
"support"
@ -642274,7 +642033,7 @@
"support"
],
"docs/_running-tests/safari.md": [
"e81383d498c57af0a64b05947e04bbaa2928efc5",
"89f329a2986b381d4560fb39124a57afd944f86e",
"support"
],
"docs/_writing-tests/ahem.md": [
@ -664389,6 +664148,10 @@
"bdf52a77f873069e2e49972e4ea484555f59975b",
"testharness"
],
"html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml": [
"57326bb4a80d26ac109db1fbef9015fda1b31b54",
"testharness"
],
"html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html": [
"66b5e30a04e7734c211ee2df391d44b678e8ecf1",
"testharness"
@ -671789,6 +671552,10 @@
"3e53ee5f5814e8ef69d8454011ceafabfe8d1f17",
"testharness"
],
"intersection-observer/v2/inline-occlusion.html": [
"e4b097e62ae3902cb971dba751d496685c566bf6",
"testharness"
],
"intersection-observer/v2/scaled-target.html": [
"f48f0792d0fab626101f8a612a8c1108401134c7",
"testharness"
@ -671805,6 +671572,10 @@
"ea1ee31ebe4519f9563987934c1a9db7fac77136",
"testharness"
],
"intersection-observer/v2/text-editor-occlusion.html": [
"2edb7bbbe65ab2d09ae13b38b98d66a2d790b1ff",
"testharness"
],
"intersection-observer/v2/text-shadow.html": [
"c6445c514eecaf978e95d75f5d37a1387939c5e2",
"testharness"
@ -672046,7 +671817,11 @@
"support"
],
"lifecycle/child-display-none.tentative.html": [
"f76b4e7b608d3e4e97dfac100bee6fa63602e0bb",
"d4ca6dab1e068703c1b5e94e22b8cb31f786879f",
"testharness"
],
"lifecycle/child-out-of-viewport.tentative.html": [
"4d8f868bfb55043b4b65a93cd7f8e282dcf12f79",
"testharness"
],
"lifecycle/freeze.html": [
@ -672074,7 +671849,7 @@
"reftest"
],
"lint.whitelist": [
"0ec256a7525fd32851aa7d251e3ae38fcb2b2436",
"a7a4600d9cdceb5df65422ca08404d44df7c9989",
"support"
],
"loading/preloader-css-import-no-quote.tentative.html": [
@ -695018,7 +694793,7 @@
"support"
],
"resource-timing/resources/nested-contexts.js": [
"0c202243702aec81426a2dfbca05ce1118c5978b",
"07ef33851b012599f2a0103636b3f7db669af881",
"support"
],
"resource-timing/resources/nested.css": [
@ -695030,15 +694805,15 @@
"support"
],
"resource-timing/resources/object-navigate-back.html": [
"64e5f584731fdf5fe89e8e60e19fea6bd0f24125",
"df32ab0c19956164582ac41265ecb33ad5bae87c",
"support"
],
"resource-timing/resources/object-navigate.html": [
"cbb862e7e00fcb7391107fdfe7e7870388f62a4a",
"3ae39c8bc44fa78f26646b64d8cd4dae1f3f07fb",
"support"
],
"resource-timing/resources/object-refresh.html": [
"b14cf7f17c9d807eaa904f92d170e9ee96435464",
"9e43e19de19fc7c364e68e0b2415963f55e9ddb2",
"support"
],
"resource-timing/resources/resource_timing_test0.css": [
@ -701638,7 +701413,7 @@
"support"
],
"streams/resources/test-utils.js": [
"871ab49fa81dbf674efcda94de57bba936f4f87b",
"5a9e2479faadf6bacfd95849f4eb6b013d45a8af",
"support"
],
"streams/transform-streams/backpressure.any.js": [
@ -706002,7 +705777,7 @@
"support"
],
"tools/ci/ci_wptrunner_infrastructure.sh": [
"f3ce3e73ea796479529da554c17f61293d138d3a",
"e5b485dbff8040d797af4d9ce6b0681c6b3d9574",
"support"
],
"tools/ci/commands.json": [
@ -710778,7 +710553,7 @@
"support"
],
"tools/wpt/browser.py": [
"3f578c09481c8e323baf2dc146be922e19c301cd",
"66ad8b50e8c00cce6aa49c28ec8dbfa07a2db31e",
"support"
],
"tools/wpt/commands.json": [
@ -710806,7 +710581,7 @@
"support"
],
"tools/wpt/run.py": [
"c54d5aaba01c66095760541be766e8e673a02a47",
"c0cfa58950edfdf8a814624b5e0a232c995cdd0f",
"support"
],
"tools/wpt/testfiles.py": [
@ -710826,7 +710601,7 @@
"support"
],
"tools/wpt/tests/test_wpt.py": [
"49d2b8758f70aafc3e6eea657389262f0be6534d",
"4685fa7abd2a55ed4c7ec2c1ed8f00929bd5dcbb",
"support"
],
"tools/wpt/tox.ini": [
@ -712169,254 +711944,6 @@
"4c95ae29dff774960c2d7d69ccfb7c2ecc3056cf",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/CompositionEvent.html": [
"0f8242b07d5aec992e14cea6b046ddbaa1c521f2",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.attrChange.html": [
"12c45fc848e6c86483cee19babc0b9351aac298f",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.attrName.html": [
"ca1ad97d24dbad89c54dbfb12cc0ff8f54d25b18",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.html": [
"c229abe96e3294a720bc04f82456f6c6b60b720c",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.newValue.html": [
"77b8a41e1a35499cdc4a37ff05b57fad054f7e9a",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.prevValue.html": [
"31fbec77644391fdcae9d6e6c96e7c144d1b448d",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMAttrModified.relatedNode.html": [
"5c30dabe22fd110f4540d8a7e6e97e2e0a3425bc",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMCharacterDataModified.html": [
"31d4fbf08f31f3b776ae970fc33f1285cd9f1ffe",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMNodeInserted.html": [
"0e0d26d1aaece67a685021b07e97edbc6db3e81c",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMNodeRemoved.html": [
"34d7112027c32bdac32b37aface0c89c659d50be",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/DOMSubtreeModified.html": [
"1819f563dacd442ed07eb9ef2d69e4732533b36f",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/Event.defaultPrevented.html": [
"8acd3cb979f4286affde5556b6d74c7a278b80d5",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/Event.eventPhase.html": [
"4bd3b51b46c3527ce4a961a90dea53582e22fddd",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/Event.stopPropagation.html": [
"019143e366c87215ca38ba21613e41280532f835",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/KeyboardEvent.key.html": [
"ea1adb0751f129637391d007c9cfeb6460ec8d5d",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/KeyboardEvent.location.html": [
"63fe460f3d3f986a5cd70e42eda9a6e090e77dc7",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/KeyboardEvent.modifiers.html": [
"ee490b47ec6745351e295dd0a28a89f86eb615df",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MouseEvent.button.html": [
"605565a7814e00eea908d47d0eab7df683c53228",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MouseEvent.image.map.area.html": [
"17b7dd5ccee436e6241d773728611b2e9efa3b72",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MouseEvent.preventDefault.html": [
"e6cb57806db7cd4233d7a0a832d0e17d1238ac27",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MutationEvent.hasFeature.html": [
"f550a5366df2099f510d7b9f3281d9169c7bc721",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MutationEvent.initMutationEvent.html": [
"3b2bceabf45ea60d1f84977ea63fd0a44adc998e",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/MutationEvent.relatedNode.html": [
"6b92079ef618ca62850c9795621d99cde51bc049",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/ProcessingInstruction.DOMCharacterDataModified.fail.html": [
"9b0843c115ee1b5f93450982dd9065b0b8abb4af",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/ProcessingInstruction.DOMCharacterDataModified.xml": [
"34ad59064ffb9147e211df34c056ebf927e89432",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.hasFeature.html": [
"853cc7c43572f0e79389ce69da30c809b59b7daa",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.initTextEvent.html": [
"52eae11aa9cffc077528e3354e353c20263ebd7d",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.IME.html": [
"af5c73624267ca9372077e5063e967a88068fd8d",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.drop.html": [
"14ffc19765bb9e4cc5772a32ac4f665152d8d86d",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.keyboard.html": [
"9d679d708e77a6c0915b79f9565e47c8bb2e1199",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.paste.html": [
"a93259cd60892be6aa34e1f2d32725fd2f01a2a9",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/TextEvent.inputMode.script.html": [
"c1327ebae57ada70477c7a721eb38df0cf8f597f",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/UIEvent.load.stylesheet.html": [
"a948a2f71a4905e181698710e598d806b7e0a4c9",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.Capture.Bubble.html": [
"4dfe246136af7e0d12db94c9ce122becfca4a958",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.ctrlKey.zoom.html": [
"52b17ced96cd8e122f8ac5fee412b1da8ebbba02",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.deltaMode.html": [
"11761f4083d286097321309fd195bfa55ebff5e5",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.hasFeature.html": [
"8bd224fa98eefd6f29dfd6b101f0f53f93acff61",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.initWheelEvent.html": [
"cd8c192e41b21b68ee750e456b2db0fa289706b9",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/WheelEvent.preventDefault.scroll.html": [
"6cb55a071f3f79f12d67c254dcc8c1f6cba14727",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/abort.img.html": [
"c0fb1eaf97d8fbebe691218aa5e57d895ca4c5dd",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/abort.testresult.html": [
"e0f6243b8acf5de965ab53fefa1c56f9293abb12",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/blur.html": [
"cef282bfe5963fafe75f9dc8dda98d31f308d9b2",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/compositionstart.data.html": [
"177c37e8d768bccaa8a09b7458d32719a3c0c04b",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/compositionstart.keydown.html": [
"7316d1a8a30e6be7af4fabdedc24008a22875fea",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/compositionstart.preventDefault.html": [
"74fc52b57990c63808b160cac154a88c79217612",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html": [
"e0ab7e0d3e417cd4595d7590d9d12d6d25bbc366",
"testharness"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/converted/support/ProcessingInstruction.DOMCharacterDataModified.xml": [
"4c95ae29dff774960c2d7d69ccfb7c2ecc3056cf",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/dispatchEvent.click.checkbox.html": [
"757bb126460ba499a1dfdcd98f32bcd480c8f956",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/error.image.html": [
"a629652d4f7c541600df9c7041960e920e71fe8f",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/focusin.html": [
"a6eb1b663801bab4f522994a44fb60a399dfb2a0",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/focusin.relatedTarget.html": [
"a36d254666dc00385c1ab8653dce93fbfe5e97c8",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/focusout.relatedTarget.html": [
"bc02267ed7a13ae223605b67bd72a49e50ec09e6",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/hasFeature.Events.html": [
"e0c9ba18d82f2a952f6ee813c4e8fb6a4f02f2da",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/hasFeature.feature.string.html": [
"e96c39c8556e3fae603a9f25e9370fda6fad2eac",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/load.image.html": [
"19414eaf022747f9fce17130a66c80adb15be7e1",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/mouseenter.ctrlKey.html": [
"dac16046cf90a2fd02e7292a94a7554579f2ebb5",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/mouseenter.relatedTarget.html": [
"f2d449dae85778c06d3d83f636a188cf2299a283",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/mouseleave.relatedTarget.html": [
"37ca7197507aac95d1950e56a575bee5da314acd",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/16kb.js": [
"fb3c0d64b15ea7d764fa87e1eb0c1aef56ef8e75",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/InvalidBitMap.png": [
"0a15a8e10d8dcce5fc3cf33ee9079d63b25e47f4",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/iepreview.png": [
"63959a05626aa3225f963570ec4a54631efca19e",
"support"
],
"uievents/legacy-domevents-tests/submissions/Microsoft/support/style01.css": [
"961757bf3da5cb22fb389a02d2d8b9713772e637",
"support"
],
"uievents/legacy/Event-subclasses-init.html": [
"676eec9280907b86201ca98963c36bc1e5263c33",
"testharness"
@ -714094,7 +713621,7 @@
"manual"
],
"wake-lock/wakelock-disabled-by-feature-policy.https.sub.html": [
"75064767ceebeb3abfad31f9dc9a8a2b91e10e44",
"ad7eeb075f44430dbe4f9ed7a55c2ce3f155d0c0",
"testharness"
],
"wake-lock/wakelock-disabled-by-feature-policy.https.sub.html.headers": [
@ -715410,7 +714937,7 @@
"testharness"
],
"webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html": [
"4163a8439cd08c1f8cdcb587c569653c2618e021",
"5703a2a6c7f565f8705a5630d0b9e2b67394985c",
"testharness"
],
"webaudio/the-audio-api/the-audionode-interface/audionode-connect-order.html": [
@ -715502,7 +715029,7 @@
"testharness"
],
"webaudio/the-audio-api/the-audioparam-interface/event-insertion.html": [
"07a54c3bbf68a7af3d651140df5ddcc99ac0f823",
"2eef895c8e8750bc25c45ba67c8c67c60e2f17bc",
"testharness"
],
"webaudio/the-audio-api/the-audioparam-interface/k-rate-audioworklet.https.html": [
@ -715710,7 +715237,7 @@
"testharness"
],
"webaudio/the-audio-api/the-biquadfilternode-interface/biquad-getFrequencyResponse.html": [
"2389b334fb86b71ac38f3c6f60f917175caf8c28",
"23222e4df9698d408b886ea108cc4c732a7d61fe",
"testharness"
],
"webaudio/the-audio-api/the-biquadfilternode-interface/biquad-highpass.html": [
@ -715853,6 +715380,10 @@
"935ceeb715edd2ffdeb7979d6824736fa82b6d2f",
"testharness"
],
"webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html": [
"c1686da964532db87b51d0cdb79081b14046c5cb",
"testharness"
],
"webaudio/the-audio-api/the-delaynode-interface/.gitkeep": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"support"
@ -715965,6 +715496,10 @@
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"support"
],
"webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html": [
"5d3fd0c26f4aa0347e2682b303d9bedbcc2b7600",
"testharness"
],
"webaudio/the-audio-api/the-mediastreamaudiosourcenode-interface/.gitkeep": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"support"

View file

@ -2,7 +2,6 @@
type: testharness
[single-byte-decoder.html?document]
expected: TIMEOUT
[ISO-8859-4: iso_8859-4:1988 (document.characterSet and document.inputEncoding)]
expected: FAIL

View file

@ -163,7 +163,7 @@
expected: NOTRUN
[<iframe>: combined response Content-Type: text/html;" " text/plain]
expected: TIMEOUT
expected: FAIL
[Request: combined response Content-Type: text/plain;charset=gbk;x=foo text/plain]
expected: NOTRUN
@ -172,7 +172,7 @@
expected: NOTRUN
[<iframe>: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
expected: TIMEOUT
expected: FAIL
[Response: combined response Content-Type: text/html;x=" text/plain]
expected: NOTRUN
@ -202,7 +202,7 @@
expected: NOTRUN
[<iframe>: separate response Content-Type: text/html;" " text/plain]
expected: TIMEOUT
expected: FAIL
[fetch(): separate response Content-Type: text/plain */*;charset=gbk]
expected: NOTRUN
@ -286,7 +286,7 @@
expected: NOTRUN
[<iframe>: separate response Content-Type: text/html;" \\" text/plain ";charset=GBK]
expected: TIMEOUT
expected: FAIL
[fetch(): combined response Content-Type: text/html;" " text/plain]
expected: NOTRUN
@ -312,33 +312,12 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" text/plain]
expected: TIMEOUT
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: TIMEOUT
[<iframe>: separate response Content-Type: text/html */*]
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;charset=gbk text/plain text/html]
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
expected: TIMEOUT
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: TIMEOUT
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: TIMEOUT
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: TIMEOUT

View file

@ -11,3 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
[Content-Type-Options%3A%20nosniff]
expected: FAIL

View file

@ -1,4 +0,0 @@
[javascript-url-abort-return-value-string.tentative.html]
[Aborting fetch for javascript:string navigation]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -1,4 +0,0 @@
[traverse_the_history_5.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -1,10 +0,0 @@
[non-active-document.html]
[DOMParser]
expected: FAIL
[createHTMLDocument]
expected: FAIL
[<template>]
expected: FAIL

View file

@ -0,0 +1,4 @@
[textarea-selection-while-parsing.xhtml]
[Value setter while parsing textarea children should move selection{Start,End} to the end]
expected: FAIL

View file

@ -1,4 +0,0 @@
[DOMContentLoaded-defer.html]
[The end: DOMContentLoaded and defer scripts]
expected: FAIL

View file

@ -1,5 +1,5 @@
[nested-context-navigations-iframe.html]
expected: TIMEOUT
expected: CRASH
[Test that iframe navigations are not observable by the parent, even after history navigations by the parent]
expected: TIMEOUT

View file

@ -0,0 +1,2 @@
[realtime-conv.html]
expected: ERROR

View file

@ -0,0 +1,5 @@
[ctor-mediastreamaudiodestination.html]
expected: ERROR
[X node0 = new MediaStreamAudioDestinationNode(context) incorrectly threw TypeError: "window[name\] is not a constructor".]
expected: FAIL

View file

@ -47,3 +47,6 @@ scratch
/css/dist_last
/css/tools/cache
/webaudio/idl/*
# w3c-test.org PR-branch mirroring
submissions/

View file

@ -32,3 +32,14 @@ promise_test(async () => {
const array_buffer = await blob.arrayBuffer();
assert_equals_typed_array(new Uint8Array(array_buffer), typed_arr);
}, "Blob.arrayBuffer() non-unicode input")
promise_test(async () => {
const input_arr = new TextEncoder().encode("PASS");
const blob = new Blob([input_arr]);
const array_buffer_results = await Promise.all([blob.arrayBuffer(),
blob.arrayBuffer(), blob.arrayBuffer()]);
for (let array_buffer of array_buffer_results) {
assert_true(array_buffer instanceof ArrayBuffer);
assert_equals_typed_array(new Uint8Array(array_buffer), input_arr);
}
}, "Blob.arrayBuffer() concurrent reads")

View file

@ -1,5 +1,6 @@
// META: title=Blob Stream
// META: script=../support/Blob.js
// META: script=../../streams/resources/test-utils.js
'use strict';
// Takes in a ReadableStream and reads from it until it is done, returning
@ -25,7 +26,7 @@ async function read_all_chunks(stream) {
promise_test(async () => {
const blob = new Blob(["PASS"]);
const stream = await blob.stream()
const stream = blob.stream();
const chunks = await read_all_chunks(stream);
for (let [index, value] of chunks.entries()) {
assert_equals(value, "PASS".charCodeAt(index));
@ -34,9 +35,8 @@ promise_test(async () => {
promise_test(async () => {
const blob = new Blob();
const stream = await blob.stream()
const stream = blob.stream();
const chunks = await read_all_chunks(stream);
assert_array_equals(chunks, []);
}, "Blob.stream() empty Blob")
@ -44,7 +44,19 @@ promise_test(async () => {
const input_arr = [8, 241, 48, 123, 151];
const typed_arr = new Uint8Array(input_arr);
const blob = new Blob([typed_arr]);
const stream = await blob.stream()
const stream = blob.stream();
const chunks = await read_all_chunks(stream);
assert_array_equals(chunks, input_arr)
assert_array_equals(chunks, input_arr);
}, "Blob.stream() non-unicode input")
promise_test(async() => {
const input_arr = [8, 241, 48, 123, 151];
const typed_arr = new Uint8Array(input_arr);
let blob = new Blob([typed_arr]);
const stream = blob.stream();
blob = null;
garbageCollect();
const chunks = await read_all_chunks(stream);
assert_array_equals(chunks, input_arr);
}, "Blob.stream() garbage collection of blob shouldn't break stream" +
"consumption")

View file

@ -50,3 +50,15 @@ promise_test(async () => {
assert_equals(text, "\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd" +
"\ufffd\ufffd\ufffd\ufffd");
}, "Blob.text() invalid utf-8 input")
promise_test(async () => {
const input_arr = new Uint8Array([192, 193, 245, 246, 247, 248, 249, 250, 251,
252, 253, 254, 255]);
const blob = new Blob([input_arr]);
const text_results = await Promise.all([blob.text(), blob.text(),
blob.text()]);
for (let text of text_results) {
assert_equals(text, "\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd" +
"\ufffd\ufffd\ufffd\ufffd");
}
}, "Blob.text() concurrent reads")

View file

@ -130,21 +130,6 @@ function CreateKeyframeEffect(element) {
assert_equals(workletAnimation.playState, 'idle');
}, 'Creating animation with effects from different documents is allowed');
promise_test(async t => {
await runInAnimationWorklet(document.getElementById('simple_animate').textContent);
// TODO(crbug.com/781816): Allow KeyframeEffects with no target in AnimationWorklet.
let effect = CreateKeyframeEffect(null);
let effect2 = CreateKeyframeEffect(document.querySelector('#element'));
let constructorFunc = function() { new WorkletAnimation(
'test-animator', [ effect, effect2 ]); };
assert_throws('NotSupportedError', constructorFunc);
let constructorFunc2 = function() { new WorkletAnimation(
'test-animator', [ effect2, effect ]); };
assert_throws('NotSupportedError', constructorFunc2);
}, 'If an effect has no target, object construction should fail');
promise_test(async t => {
await runInAnimationWorklet(document.getElementById('simple_animate').textContent);
let effect = CreateKeyframeEffect(document.querySelector('#element'));

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<title>Reference for WorkletAnimation should continue to be in effect forever, even if its duration is passed</title>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
transform: translateY(100px);
}
</style>
<div id="box"></div>

View file

@ -1,7 +1,6 @@
<html>
<title>WorkletAnimation should continue to be in effect forever, even if its duration is passed</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<link rel="match" href="worklet-animation-duration-ref.html">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

View file

@ -0,0 +1,76 @@
<!DOCTYPE html>
<title>Verify that effect without target is supported</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="common.js"></script>
<div id="box"></div>
<script>
setup(setupAndRegisterTests, {explicit_done: true});
async function setupAndRegisterTests() {
await registerPassthroughAnimator();
promise_test(async t => {
const effect = new KeyframeEffect(null,
{ transform: ['translateY(100px)', 'translateY(200px)'] },
{ duration: Infinity, iterations: 1 }
);
const animation = new WorkletAnimation('passthrough', effect);
animation.play();
// Allow one async animation frame to pass so that animation is running.
await waitForAsyncAnimationFrames(1);
assert_equals(animation.playState, "running");
// Allow time to advance so that we have a non-zero current time.
await waitForDocumentTimelineAdvance();
const t0 = document.timeline.currentTime;
assert_greater_than(animation.currentTime, 0);
assert_times_equal(animation.currentTime, (t0 - animation.startTime));
assert_equals(animation.playState, "running");
animation.cancel();
}, 'Animating effect with no target should work.');
promise_test(async t => {
const effect = new KeyframeEffect(document.getElementById('box'),
{ transform: ['translateY(100px)', 'translateY(200px)'] },
{ duration: Infinity, iterations: 1 }
);
const animation = new WorkletAnimation('passthrough', effect);
animation.play();
// Allow one async animation frame to pass so that animation is running.
await waitForAsyncAnimationFrames(1);
assert_equals(animation.playState, "running");
// Allow time to advance so that we have a non-zero current time.
await waitForDocumentTimelineAdvance();
const t0 = document.timeline.currentTime;
assert_greater_than(animation.currentTime, 0);
assert_times_equal(animation.currentTime, (t0 - animation.startTime));
assert_equals(animation.playState, "running");
await waitForDocumentTimelineAdvance();
animation.effect.target = null;
const t1 = document.timeline.currentTime;
assert_times_equal(animation.currentTime, (t1 - animation.startTime));
assert_equals(animation.playState, "running");
await waitForDocumentTimelineAdvance();
animation.effect.target = document.getElementById('box');
const t2 = document.timeline.currentTime;
assert_times_equal(animation.currentTime, (t2 - animation.startTime));
assert_equals(animation.playState, "running");
animation.cancel();
}, 'The existence of a target does not affect the animation.');
done();
}
</script>

View file

@ -425,7 +425,8 @@ function requestViaIframe(url, additionalAttributes) {
false);
return bindEvents2(window, "message", iframe, "error", window, "error")
.then(event => {
assert_equals(event.source, iframe.contentWindow);
if (event.source !== iframe.contentWindow)
return Promise.reject(new Error('Unexpected event.source'));
return event.data;
});
}
@ -570,8 +571,7 @@ function get_worklet(type) {
if (type == 'audio')
return new OfflineAudioContext(2,44100*40,44100).audioWorklet;
assert_unreached('unknown worklet type is passed.');
return undefined;
throw new Error('unknown worklet type is passed.');
}
function requestViaWorklet(type, url) {
@ -599,7 +599,8 @@ function requestViaNavigable(navigableElement, url) {
const promise =
bindEvents2(window, "message", iframe, "error", window, "error")
.then(event => {
assert_equals(event.source, iframe.contentWindow, "event.source");
if (event.source !== iframe.contentWindow)
return Promise.reject(new Error('Unexpected event.source'));
return event.data;
});
navigableElement.click();

View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<title>Reference for sticky elements should invalidate when top/left/bottom/right changes</title>
<style>
.box {
/* Triggers promotion without creating stacking context. */
backface-visibility: hidden;
background: green;
position: sticky;
top: 200px;
width: 100px;
height: 100px;
}
.spacer {
height: 200vh;
}
</style>
<div class="box"></div>
<div class="spacer"></div>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html class='reftest-wait'>
<title>Sticky elements should invalidate when top/left/bottom/right changes</title>
<link rel="match" href="position-sticky-change-top-ref.html" />
<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
<link rel="help" href="https://crbug.com/939632">
<meta name="assert" content="This test checks that sticky elements are invalidated correctly when top/left/bottom/right change "/>
<script src="/common/reftest-wait.js"></script>
<!--
It is important for this test that the sticky element is viewport-bound, and
that multiple animation frames pass before changing the style.
-->
<style>
.marker {
background: red;
position: absolute;
top: 200px;
height: 100px;
width: 100px;
}
.sticky {
/* Triggers promotion without creating stacking context. */
backface-visibility: hidden;
background: green;
position: sticky;
top: 0;
width: 100px;
height: 100px;
}
.spacer {
height: 200vh;
}
</style>
<div class="marker"></div>
<div class="sticky"></div>
<div class="spacer"></div>
<script>
requestAnimationFrame(() => {
requestAnimationFrame(() => {
document.querySelector('.sticky').style.setProperty('top', '200px');
takeScreenshot();
});
});
</script>
</html>

View file

@ -3,7 +3,7 @@ layout: page
title: Safari
---
To run Safari on macOS, some manual setup is required. Some steps are different
for Safari and Safari Technology Preview, in which case only step is needed.
for Safari and Safari Technology Preview.
* Allow Safari to be controlled by SafariDriver:
* `safaridriver --enable` or

View file

@ -0,0 +1,20 @@
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<textarea>
a
<script>document.querySelector('textarea').value = 'ggg';</script>
b
</textarea>
<script>
test(() => {
let ta = document.querySelector('textarea');
assert_equals(ta.selectionStart, 3);
assert_equals(ta.selectionEnd, 3);
}, 'Value setter while parsing textarea children should move ' +
'selection{Start,End} to the end');
</script>
</body>
</html>

View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/intersection-observer-test-utils.js"></script>
<style>
body, html {
margin: 0;
}
pre, #log {
position: absolute;
top: 0;
left: 200px;
}
.testdiv {
font-size: 24px;
}
</style>
<div class="testdiv">This is the <span id="target">target</span>.</div>
<div class="testdiv" id="occluder">This is the occluder.</div>
<script>
var delay = 100;
var entries = [];
var target;
var occluder;
runTestCycle(function() {
target = document.getElementById("target");
occluder = document.getElementById("occluder");
assert_true(!!target, "target exists");
assert_true(!!occluder, "occluder exists");
var observer = new IntersectionObserver(function(changes) {
entries = entries.concat(changes)
}, {trackVisibility: true, delay: delay});
observer.observe(target);
entries = entries.concat(observer.takeRecords());
assert_equals(entries.length, 0, "No initial notifications.");
runTestCycle(step0, "First rAF.", delay);
}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.", delay);
function step0() {
occluder.style.marginTop = "-10px";
runTestCycle(step1, "occluder.style.marginTop = '-10px'", delay);
assert_equals(entries.length, 1);
assert_true(entries[0].isVisible);
}
function step1() {
// Occluding elements with opacity=0 should not affect target visibility.
occluder.style.opacity = "0";
runTestCycle(step2, "occluder.style.opacity = 0", delay);
assert_equals(entries.length, 2);
assert_false(entries[1].isVisible);
}
function step2() {
assert_equals(entries.length, 3);
assert_true(entries[2].isVisible);
}
</script>

View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/intersection-observer-test-utils.js"></script>
<style>
body, html {
margin: 0;
}
pre, #log {
position: absolute;
top: 0;
left: 200px;
}
.testdiv {
font-size: 24px;
}
</style>
<div class="testdiv">Target: <input id="target" type="text"></input></div>
<div class="testdiv" id="occluder">This is the occluder.</div>
<script>
var delay = 100;
var entries = [];
var target;
var occluder;
runTestCycle(function() {
target = document.getElementById("target");
occluder = document.getElementById("occluder");
assert_true(!!target, "target exists");
assert_true(!!occluder, "occluder exists");
var observer = new IntersectionObserver(function(changes) {
entries = entries.concat(changes)
}, {trackVisibility: true, delay: delay});
observer.observe(target);
entries = entries.concat(observer.takeRecords());
assert_equals(entries.length, 0, "No initial notifications.");
runTestCycle(step0, "First rAF.", delay);
}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.", delay);
function step0() {
occluder.style.marginTop = "-10px";
runTestCycle(step1, "occluder.style.marginTop = '-10px'", delay);
assert_equals(entries.length, 1);
assert_true(entries[0].isVisible);
}
function step1() {
// Occluding elements with opacity=0 should not affect target visibility.
occluder.style.opacity = "0";
runTestCycle(step2, "occluder.style.opacity = 0", delay);
assert_equals(entries.length, 2);
assert_false(entries[1].isVisible);
}
function step2() {
assert_equals(entries.length, 3);
assert_true(entries[2].isVisible);
}
</script>

View file

@ -26,6 +26,7 @@ async_test((t) => {
}
}));
child.allow = "execution-while-not-rendered 'none'";
child.src = "resources/subframe.html";
document.body.appendChild(child);
child.style = "display: none";

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Child frame marked as frozen</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<div style="width: 200px; height: 4000px"></div>
<script>
async_test((t) => {
var child = document.createElement('iframe');
var loaded = false;
var frozen = false;
window.addEventListener('message', t.step_func((e) => {
if (e.data == "load") {
loaded = true;
} else if (e.data == "freeze") {
assert_true(loaded);
frozen = true;
child.scrollIntoView();
} else if (e.data == "resume") {
assert_true(loaded);
assert_true(frozen);
t.done();
}
}));
child.allow = "execution-while-out-of-viewport 'none'";
child.src = "resources/subframe.html";
document.body.appendChild(child);
}, "Child frame frozen");
</script>
</body>

View file

@ -64,6 +64,9 @@ TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.sxg
TRAILING WHITESPACE: xhr/resources/headers-some-are-empty.asis
## .gitignore
W3C-TEST.ORG: .gitignore
## Documentation ##
W3C-TEST.ORG: README.md

View file

@ -44,7 +44,7 @@ function setup_refresh_test() {
}
function setup_back_navigation(pushed_url) {
function verify_document_navigate_not_observable() {
function verify_document_navigate_not_observable(navigated_back) {
let entries = performance.getEntriesByType("resource");
let found_first_document = false;
for (entry of entries) {
@ -57,16 +57,18 @@ function setup_back_navigation(pushed_url) {
}
}
if (!found_first_document) {
opener.postMessage("FAIL - first document not exposed", "*");
opener.postMessage("FAIL - first document not exposed. navigated_back is " + navigated_back, "*");
return;
}
opener.postMessage("PASS", "*");
if (navigated_back) {
opener.postMessage("PASS", "*");
}
}
window.addEventListener("message", e=>{
if (e.data == "navigated") {
verify_document_navigate_not_observable(sessionStorage.navigated);
if (sessionStorage.navigated) {
delete sessionStorage.navigated;
verify_document_navigate_not_observable();
} else {
sessionStorage.navigated = true;
setTimeout(() => {

View file

@ -8,7 +8,7 @@
<script>
setup_back_navigation("object-navigate-back.html");
</script>
<object></object>
<object type="text/html"></object>
<script>
document.getElementsByTagName("object")[0].data = pre_navigate_url;
</script>

View file

@ -9,7 +9,7 @@
setup_navigate_test();
</script>
<div id=log></div>
<object></object>
<object type="text/html"></object>
<script>
document.getElementsByTagName("object")[0].data = pre_navigate_url;
</script>

View file

@ -9,7 +9,7 @@
setup_refresh_test();
</script>
<div id=log></div>
<object></object>
<object type="text/html"></object>
<script>
document.getElementsByTagName("object")[0].data = pre_refresh_url;
</script>

View file

@ -50,6 +50,7 @@ self.constructorThrowsForAll = (constructor, firstArgs) => {
self.garbageCollect = () => {
if (self.gc) {
// Use --expose_gc for V8 (and Node.js)
// to pass this flag at chrome launch use: --js-flags="--expose-gc"
// Exposed in SpiderMonkey shell as well
self.gc();
} else if (self.GCController) {

View file

@ -25,7 +25,7 @@ main() {
for PRODUCT in "${PRODUCTS[@]}"; do
if [[ "$PRODUCT" == "chrome" ]]; then
add_wpt_hosts
test_infrastructure "--binary=$(which google-chrome-unstable)"
test_infrastructure "--binary=$(which google-chrome-unstable) --channel dev"
else
test_infrastructure
fi

View file

@ -461,36 +461,48 @@ class Chrome(Browser):
def find_webdriver(self, channel=None):
return find_executable("chromedriver")
def _latest_chromedriver_url(self, browser_binary=None):
latest = None
chrome_version = self.version(browser_binary)
assert chrome_version, "Cannot detect the version of Chrome"
# Remove channel suffixes (e.g. " dev").
chrome_version = chrome_version.split(' ')[0]
def _official_chromedriver_url(self, chrome_version):
# http://chromedriver.chromium.org/downloads/version-selection
parts = chrome_version.split(".")
if len(parts) == 4:
latest_url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_%s.%s.%s" % tuple(parts[:-1])
assert len(parts) == 4
latest_url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_%s.%s.%s" % tuple(parts[:-1])
try:
latest = get(latest_url).text.strip()
except requests.RequestException:
latest_url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_%s" % parts[0]
try:
latest = get(latest_url).text.strip()
except requests.RequestException:
latest_url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_%s" % parts[0]
try:
latest = get(latest_url).text.strip()
except requests.RequestException:
pass
if latest is None:
# Fall back to *Chromium* build archives.
return None
return "https://chromedriver.storage.googleapis.com/%s/chromedriver_%s.zip" % (
latest, self.platform_string())
def _chromium_chromedriver_url(self, chrome_version):
try:
# Try to find the Chromium build with the same revision.
omaha = get("https://omahaproxy.appspot.com/deps.json?version=" + chrome_version).json()
revision = omaha['chromium_base_position']
url = "https://storage.googleapis.com/chromium-browser-snapshots/%s/%s/chromedriver_%s.zip" % (
self.chromium_platform_string(), revision, self.platform_string())
else:
url = "https://chromedriver.storage.googleapis.com/%s/chromedriver_%s.zip" % (
latest, self.platform_string())
# Check the status without downloading the content (this is a streaming request).
get(url)
except requests.RequestException:
# Fall back to the tip-of-tree Chromium build.
revision_url = "https://storage.googleapis.com/chromium-browser-snapshots/%s/LAST_CHANGE" % (
self.chromium_platform_string())
revision = get(revision_url).text.strip()
url = "https://storage.googleapis.com/chromium-browser-snapshots/%s/%s/chromedriver_%s.zip" % (
self.chromium_platform_string(), revision, self.platform_string())
return url
def _latest_chromedriver_url(self, browser_binary=None):
chrome_version = self.version(browser_binary)
assert chrome_version, "Cannot detect the version of Chrome"
# Remove channel suffixes (e.g. " dev").
chrome_version = chrome_version.split(' ')[0]
return (self._official_chromedriver_url(chrome_version) or
self._chromium_chromedriver_url(chrome_version))
def install_webdriver(self, dest=None, channel=None, browser_binary=None):
if dest is None:
dest = os.pwd

View file

@ -277,6 +277,8 @@ class Chrome(BrowserSetup):
if kwargs["browser_channel"] == "dev":
logger.info("Automatically turning on experimental features for Chrome Dev")
kwargs["binary_args"].append("--enable-experimental-web-platform-features")
# HACK(Hexcles): work around https://github.com/web-platform-tests/wpt/issues/16448
kwargs["webdriver_args"].append("--disable-build-check")
class ChromeAndroid(BrowserSetup):

View file

@ -102,7 +102,8 @@ def test_list_tests(manifest_dir):
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--metadata", manifest_dir, "--list-tests",
"--yes", "chrome", "/dom/nodes/Element-tagName.html"])
"--channel", "dev", "--yes", "chrome",
"/dom/nodes/Element-tagName.html"])
assert excinfo.value.code == 0
@ -173,12 +174,13 @@ def test_run_zero_tests():
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--no-pause", "--binary-arg", "headless",
"chrome", "/non-existent-dir/non-existent-file.html"])
"--channel", "dev", "chrome",
"/non-existent-dir/non-existent-file.html"])
assert excinfo.value.code != 0
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--no-pause", "--binary-arg", "headless",
"--no-fail-on-unexpected",
"--no-fail-on-unexpected", "--channel", "dev",
"chrome", "/non-existent-dir/non-existent-file.html"])
assert excinfo.value.code != 0
@ -197,12 +199,12 @@ def test_run_failing_test():
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--no-pause", "--binary-arg", "headless",
"chrome", failing_test])
"--channel", "dev", "chrome", failing_test])
assert excinfo.value.code != 0
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--no-pause", "--binary-arg", "headless",
"--no-fail-on-unexpected",
"--no-fail-on-unexpected", "--channel", "dev",
"chrome", failing_test])
assert excinfo.value.code == 0
@ -228,14 +230,14 @@ def test_run_verify_unstable(temp_test):
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--verify", "--binary-arg", "headless",
"chrome", unstable_test])
"--channel", "dev", "chrome", unstable_test])
assert excinfo.value.code != 0
stable_test = temp_test("test(function() {}, 'my test');")
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--verify", "--binary-arg", "headless",
"chrome", stable_test])
"--channel", "dev", "chrome", stable_test])
assert excinfo.value.code == 0

View file

@ -12,7 +12,7 @@
"https://{{domains[www]}}:{{ports[https][0]}}" + same_origin_src;
promise_test(t => {
return promise_rejects(t, "SecurityError", navigator.getWakeLock("screen"));
return promise_rejects(t, "NotAllowedError", navigator.getWakeLock("screen"));
}, 'Feature-Policy header {"wake-lock" : []} disallows the top-level document.');
async_test(t => {

View file

@ -91,8 +91,9 @@
context, should,
{name: 'MediaElementSource', args: [mediaElement]});
testConnectMethod(context, should, {name: 'MediaStreamDestination'});
// MediaStreamAudioDestinationNode has no output so it connect method
// chaining isn't possible.
// MediaStreamSourceNode requires 'stream' object to be constructed,
// which is a part of MediaStreamDestinationNode.
let streamDestination = context.createMediaStreamDestination();

View file

@ -211,6 +211,31 @@
.then(() => task.done());
});
audit.define(
{
label: 'Multiple linear ramps at the same time',
description: 'Verify output'
},
(task, should) => {
testMultipleSameEvents(should, {
method: 'linearRampToValueAtTime',
prefix: 'Multiple linear ramps: ',
threshold: 0
}).then(() => task.done());
});
audit.define(
{
label: 'Multiple exponential ramps at the same time',
description: 'Verify output'
},
(task, should) => {
testMultipleSameEvents(should, {
method: 'exponentialRampToValueAtTime',
prefix: 'Multiple exponential ramps: ',
threshold: 5.3924e-7
}).then(() => task.done());
});
audit.run();
@ -297,6 +322,71 @@
};
}
// Test output when two events of the same time are scheduled at the same
// time.
function testMultipleSameEvents(should, options) {
let {method, prefix, threshold} = options;
// Context for testing.
let context =
new OfflineAudioContext({length: 16384, sampleRate: sampleRate});
let src = new ConstantSourceNode(context);
src.connect(context.destination);
let initialValue = 1;
// Informative print
should(() => {
src.offset.setValueAtTime(initialValue, 0);
}, prefix + `setValueAtTime(${initialValue}, 0)`).notThrow();
let frame = 64;
let time = frame / context.sampleRate;
let values = [2, 7, 10];
// Schedule two events of the same type at the same time, but with
// different values.
values.forEach(value => {
// Informative prints to show what we're doing in this test.
should(
() => {
src.offset[method](value, time);
},
prefix +
eventToString(
method,
value,
time,
))
.notThrow();
})
src.start();
return context.startRendering().then(audioBuffer => {
let actual = audioBuffer.getChannelData(0);
// The output should be a ramp from time 0 to the event time. But we
// only verify the value just before the event time, which should be
// fairly close to values[0]. (But compute the actual expected value
// to be sure.)
let expected = methodMap[method](
(frame - 1) / context.sampleRate, initialValue, 0, values[0],
time);
should(actual[frame - 1], prefix + `Output at frame ${frame - 1}`)
.beCloseTo(expected, {threshold: threshold, precision: 3});
// Any other values shouldn't show up in the output. Only the value
// from last event should appear. We only check the value at the
// event time.
should(
actual[frame], prefix + `Output at frame ${frame} (${time} sec)`)
.beEqualTo(values[values.length - 1]);
});
}
// Convert an automation method to a string for printing.
function eventToString(method, value, time, extras) {
let string = method + '(';

View file

@ -36,12 +36,6 @@
let filterQ = 1;
let filterGain = 5; // Decibels.
// The maximum allowed error in the magnitude response.
let maxAllowedMagError = 1.09931e-6;
// The maximum allowed error in the phase response.
let maxAllowedPhaseError = 6.4724e-8;
// The magnitudes and phases of the reference frequency response.
let expectedMagnitudes;
let expectedPhases;
@ -148,6 +142,10 @@
}
}
function decibelsToLinear(x) {
return Math.pow(10, x/20);
}
// Look through the array and find any NaN or infinity. Returns the index
// of the first occurence or -1 if none.
function findBadNumber(signal) {
@ -171,8 +169,17 @@
}
// Compare the frequency response with our expected response.
//
// should - The |should| method provided by audit.define
// filter - The filter node used in the test
// frequencies - array of frequencies provided to |getFrequencyResponse|
// magResponse - mag response from |getFrequencyResponse|
// phaseResponse - phase response from |getFrequencyResponse|
// maxAllowedMagError - error threshold for mag response, in dB
// maxAllowedPhaseError - error threshold for phase response, in rad.
function compareResponses(
should, filter, frequencies, magResponse, phaseResponse) {
should, filter, frequencies, magResponse, phaseResponse,
maxAllowedMagError, maxAllowedPhaseError) {
let expectedResponse = frequencyResponseReference(filter, frequencies);
expectedMagnitudes = expectedResponse.magnitudes;
@ -188,16 +195,19 @@
let hasBadNumber;
hasBadNumber = findBadNumber(magResponse);
badResponse = !should(
hasBadNumber >= 0 ? 1 : 0,
'Number of non-finite values in magnitude response')
.beEqualTo(0);
badResponse =
!should(
hasBadNumber >= 0 ? 1 : 0,
filter.type +
': Number of non-finite values in magnitude response')
.beEqualTo(0);
hasBadNumber = findBadNumber(phaseResponse);
badResponse = !should(
hasBadNumber >= 0 ? 1 : 0,
'Number of non-finte values in phase response')
.beEqualTo(0);
badResponse =
!should(
hasBadNumber >= 0 ? 1 : 0,
filter.type + ': Number of non-finte values in phase response')
.beEqualTo(0);
// These aren't testing the implementation itself. Instead, these are
// sanity checks on the reference. Failure here does not imply an error
@ -206,14 +216,16 @@
badResponse =
!should(
hasBadNumber >= 0 ? 1 : 0,
'Number of non-finite values in the expected magnitude response')
filter.type +
': Number of non-finite values in the expected magnitude response')
.beEqualTo(0);
hasBadNumber = findBadNumber(expectedPhases);
badResponse =
!should(
hasBadNumber >= 0 ? 1 : 0,
'Number of non-finite values in expected phase response')
filter.type +
': Number of non-finite values in expected phase response')
.beEqualTo(0);
// If we found a NaN or infinity, the following tests aren't very
@ -221,7 +233,8 @@
// warning message.
should(
!badResponse,
'Actual and expected results contained only finite values')
filter.type +
': Actual and expected results contained only finite values')
.beTrue();
for (k = 0; k < n; ++k) {
@ -236,7 +249,7 @@
should(
linearToDecibels(maxMagError),
'Max error (' + linearToDecibels(maxMagError) +
filter.type + ': Max error (' + linearToDecibels(maxMagError) +
' dB) of magnitude response at frequency ' +
frequencies[maxMagErrorIndex] + ' Hz')
.beLessThanOrEqualTo(linearToDecibels(maxAllowedMagError));
@ -254,7 +267,7 @@
should(
radToDegree(maxPhaseError),
'Max error (' + radToDegree(maxPhaseError) +
filter.type + ': Max error (' + radToDegree(maxPhaseError) +
' deg) in phase response at frequency ' +
frequencies[maxPhaseErrorIndex] + ' Hz')
.beLessThanOrEqualTo(radToDegree(maxAllowedPhaseError));
@ -265,32 +278,78 @@
return rad * 180 / Math.PI;
}
audit.define(
{label: 'test', description: 'Biquad frequency response'},
function(task, should) {
context = new AudioContext();
// Test the getFrequencyResponse for each of filter types. Each entry in
// this array is a dictionary with these elements:
//
// type: filter type to be tested
// maxErrorInMagnitude: Allowed error in computed magnitude response
// maxErrorInPhase: Allowed error in computed magnitude phase
[{
type: 'lowpass',
maxErrorInMagnitude: decibelsToLinear(-73.0178),
maxErrorInPhase: 8.04360e-6
},
{
type: 'highpass',
maxErrorInMagnitude: decibelsToLinear(-117.5461),
maxErrorInPhase: 6.9691e-6
},
{
type: 'bandpass',
maxErrorInMagnitude: decibelsToLinear(-79.0139),
maxErrorInPhase: 4.9371e-6
},
{
type: 'lowshelf',
maxErrorInMagnitude: decibelsToLinear(-120.4038),
maxErrorInPhase: 4.0724e-6
},
{
type: 'highshelf',
maxErrorInMagnitude: decibelsToLinear(-120, 1303),
maxErrorInPhase: 4.0724e-6
},
{
type: 'peaking',
maxErrorInMagnitude: decibelsToLinear(-119.1176),
maxErrorInPhase: 6.4724e-8
},
{
type: 'notch',
maxErrorInMagnitude: decibelsToLinear(-87.0808),
maxErrorInPhase: 6.6300e-6
},
{
type: 'allpass',
maxErrorInMagnitude: decibelsToLinear(-265.3517),
maxErrorInPhase: 1.3260e-5
}].forEach(test => {
audit.define(
{label: test.type, description: 'Frequency response'},
(task, should) => {
let context = new AudioContext();
filter = context.createBiquadFilter();
let filter = new BiquadFilterNode(context, {
type: test.type,
frequency: filterCutoff,
Q: filterQ,
gain: filterGain
});
// Arbitrarily test a peaking filter, but any kind of filter can be
// tested.
filter.type = 'peaking';
filter.frequency.value = filterCutoff;
filter.Q.value = filterQ;
filter.gain.value = filterGain;
let frequencies =
createFrequencies(numberOfFrequencies, context.sampleRate);
magResponse = new Float32Array(numberOfFrequencies);
phaseResponse = new Float32Array(numberOfFrequencies);
let frequencies =
createFrequencies(numberOfFrequencies, context.sampleRate);
magResponse = new Float32Array(numberOfFrequencies);
phaseResponse = new Float32Array(numberOfFrequencies);
filter.getFrequencyResponse(
frequencies, magResponse, phaseResponse);
compareResponses(
should, filter, frequencies, magResponse, phaseResponse,
test.maxErrorInMagnitude, test.maxErrorInPhase);
filter.getFrequencyResponse(
frequencies, magResponse, phaseResponse);
compareResponses(
should, filter, frequencies, magResponse, phaseResponse);
task.done();
});
task.done();
});
});
audit.define(
{

View file

@ -0,0 +1,149 @@
<!DOCTYPE html>
<html>
<head>
<title>
Test Convolver on Real-time Context
</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/convolution-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
const audit = Audit.createTaskRunner();
// Choose a length that is larger enough to cause multiple threads to be
// used in the convolver. For browsers that don't support this, this
// value doesn't matter.
const pulseLength = 16384;
// The computed SNR should be at least this large. This value depends on
// teh platform and browser. Don't set this value to be to much lower
// than this. It probably indicates a fairly inaccurate convolver or
// constant source node automations that should be fixed instead.
const minRequiredSNR = 88.457;
// To test the real-time convolver, we convolve two square pulses together
// to produce a triangular pulse. To verify the result is correct we
// compare it against a constant source node configured to generate the
// expected ramp.
audit.define(
{label: 'test', description: 'Test convolver with real-time context'},
(task, should) => {
// Use a power of two for the sample rate to eliminate round-off in
// computing times from frames.
const context = new AudioContext({sampleRate: 16384});
// Square pulse for the convolver impulse response.
const squarePulse = new AudioBuffer(
{length: pulseLength, sampleRate: context.sampleRate});
squarePulse.getChannelData(0).fill(1);
const convolver = new ConvolverNode(
context, {buffer: squarePulse, disableNormalization: true});
// Square pulse for testing
const srcSquare = new ConstantSourceNode(context, {offset: 0});
srcSquare.connect(convolver);
// Reference ramp. Automations on this constant source node will
// generate the desired ramp.
const srcRamp = new ConstantSourceNode(context, {offset: 0});
// Use these gain nodes to compute the difference between the
// convolver output and the expected ramp to create the error
// signal.
const inverter = new GainNode(context, {gain: -1});
const sum = new GainNode(context, {gain: 1});
convolver.connect(sum);
srcRamp.connect(inverter).connect(sum);
// Square the error signal using this gain node.
const squarer = new GainNode(context, {gain: 0});
sum.connect(squarer);
sum.connect(squarer.gain);
// Merge the error signal and the square source so we can integrate
// the error signal to find an SNR.
const merger = new ChannelMergerNode(context, {numberOfInputs: 2});
squarer.connect(merger, 0, 0);
srcSquare.connect(merger, 0, 1);
// For simplicity, use a ScriptProcessor to integrate the error
// signal. The square pulse signal is used as a gate over which the
// integration is done. When the pulse ends, the SNR is computed
// and the test ends.
// |doSum| is used to determine when to integrate and when it
// becomes false, it signals the end of integration.
let doSum = false;
// |signalSum| is the energy in the square pulse. |errorSum| is the
// energy in the error signal.
let signalSum = 0;
let errorSum = 0;
let spn = context.createScriptProcessor(0, 2, 1);
spn.onaudioprocess = (event) => {
// Sum the values on the first channel when the second channel is
// not zero. When the second channel goes from non-zero to 0,
// dump the value out and terminate the test.
let c0 = event.inputBuffer.getChannelData(0);
let c1 = event.inputBuffer.getChannelData(1);
for (let k = 0; k < c1.length; ++k) {
if (c1[k] == 0) {
if (doSum) {
doSum = false;
// Square wave is now silent and we were integration, so we
// can stop now and verify the SNR.
should(10 * Math.log10(signalSum / errorSum), 'SNR')
.beGreaterThanOrEqualTo(minRequiredSNR);
spn.onaudioprocess = null;
task.done();
}
} else {
// Signal is non-zero so sum up the values.
doSum = true;
errorSum += c0[k];
signalSum += c1[k] * c1[k];
}
}
};
merger.connect(spn).connect(context.destination);
// Schedule everything to start a bit in the futurefrom now, and end
// pulseLength frames later.
let now = context.currentTime;
// |startFrame| is the number of frames to schedule ahead for
// testing.
const startFrame = 512;
const startTime = startFrame / context.sampleRate;
const pulseDuration = pulseLength / context.sampleRate;
// Create a square pulse in the constant source node.
srcSquare.offset.setValueAtTime(1, now + startTime);
srcSquare.offset.setValueAtTime(0, now + startTime + pulseDuration);
// Create the reference ramp.
srcRamp.offset.setValueAtTime(1, now + startTime);
srcRamp.offset.linearRampToValueAtTime(
pulseLength,
now + startTime + pulseDuration - 1 / context.sampleRate);
srcRamp.offset.linearRampToValueAtTime(
0,
now + startTime + 2 * pulseDuration - 1 / context.sampleRate);
// Start the ramps!
srcRamp.start();
srcSquare.start();
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html>
<head>
<title>
Test Constructor: MediaStreamAudioDestinationNode
</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/audionodeoptions.js"></script>
</head>
<body>
<script id="layout-test-code">
let context = new AudioContext();
let audit = Audit.createTaskRunner();
audit.define('initialize', (task, should) => {
// Need AudioContext, not OfflineAudioContext, for these tests.
should(() => {
context = new AudioContext();
}, 'context = new AudioContext()').notThrow();
task.done();
});
audit.define('invalid constructor', (task, should) => {
testInvalidConstructor(
should, 'MediaStreamAudioDestinationNode', context);
task.done();
});
audit.define('default constructor', (task, should) => {
let prefix = 'node0';
let node = testDefaultConstructor(
should, 'MediaStreamAudioDestinationNode', context, {
prefix: prefix,
numberOfInputs: 1,
numberOfOutputs: 0,
channelCount: 2,
channelCountMode: 'explicit',
channelInterpretation: 'speakers'
});
testDefaultAttributes(should, node, prefix, []);
task.done();
});
audit.define('test AudioNodeOptions', (task, should) => {
testAudioNodeOptions(
should, context, 'MediaStreamAudioDestinationNode', {
channelCount: {
// An arbitrary but valid, non-default count for this node.
value: 7
}
});
task.done();
});
audit.run();
</script>
</body>
</html>