diff options
50 files changed, 1019 insertions, 764 deletions
diff --git a/tests/wpt/metadata/FileAPI/blob/Blob-array-buffer.any.js.ini b/tests/wpt/metadata/FileAPI/blob/Blob-array-buffer.any.js.ini index aff6150a13b..a9548bac2f9 100644 --- a/tests/wpt/metadata/FileAPI/blob/Blob-array-buffer.any.js.ini +++ b/tests/wpt/metadata/FileAPI/blob/Blob-array-buffer.any.js.ini @@ -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 + diff --git a/tests/wpt/metadata/FileAPI/blob/Blob-stream.any.js.ini b/tests/wpt/metadata/FileAPI/blob/Blob-stream.any.js.ini index c827cd7661f..facf4573cb3 100644 --- a/tests/wpt/metadata/FileAPI/blob/Blob-stream.any.js.ini +++ b/tests/wpt/metadata/FileAPI/blob/Blob-stream.any.js.ini @@ -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 + diff --git a/tests/wpt/metadata/FileAPI/blob/Blob-text.any.js.ini b/tests/wpt/metadata/FileAPI/blob/Blob-text.any.js.ini index 1038fd55d04..aa09d7ecbe6 100644 --- a/tests/wpt/metadata/FileAPI/blob/Blob-text.any.js.ini +++ b/tests/wpt/metadata/FileAPI/blob/Blob-text.any.js.ini @@ -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 + diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini index 3b874fc1748..3a3d15b8406 100644 --- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini @@ -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] diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 09fb70cf5d7..02d83856b52 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -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" diff --git a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini index 3d135f3bd66..939a36eb9d9 100644 --- a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini +++ b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini @@ -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 diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index 3423b4af7bf..e516f579627 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -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 - diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini index 87c807a49ff..a639f15230c 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,3 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%0C] expected: FAIL + [Content-Type-Options%3A%20nosniff] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-abort/javascript-url-abort-return-value-string.tentative.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-abort/javascript-url-abort-return-value-string.tentative.html.ini deleted file mode 100644 index 9bacb9f5c4e..00000000000 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-abort/javascript-url-abort-return-value-string.tentative.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[javascript-url-abort-return-value-string.tentative.html] - [Aborting fetch for javascript:string navigation] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini new file mode 100644 index 00000000000..87b07c3e670 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini @@ -0,0 +1,4 @@ +[traverse_the_history_1.html] + [Multiple history traversals from the same task] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini deleted file mode 100644 index dc2e45516de..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_5.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini deleted file mode 100644 index 8cc42056d34..00000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini +++ /dev/null @@ -1,10 +0,0 @@ -[non-active-document.html] - [DOMParser] - expected: FAIL - - [createHTMLDocument] - expected: FAIL - - [<template>] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml.ini b/tests/wpt/metadata/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml.ini new file mode 100644 index 00000000000..ad6e0b4e9a2 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml.ini @@ -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 + diff --git a/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini b/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini deleted file mode 100644 index a9677391662..00000000000 --- a/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[DOMContentLoaded-defer.html] - [The end: DOMContentLoaded and defer scripts] - expected: FAIL - diff --git a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini index 9c3272b35da..87d3c09909f 100644 --- a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini +++ b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini @@ -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 diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html.ini new file mode 100644 index 00000000000..87a247cb5ad --- /dev/null +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html.ini @@ -0,0 +1,2 @@ +[realtime-conv.html] + expected: ERROR diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html.ini new file mode 100644 index 00000000000..bc21843f0de --- /dev/null +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html.ini @@ -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 + diff --git a/tests/wpt/web-platform-tests/.gitignore b/tests/wpt/web-platform-tests/.gitignore index 0f080ca986b..60d06876d96 100644 --- a/tests/wpt/web-platform-tests/.gitignore +++ b/tests/wpt/web-platform-tests/.gitignore @@ -47,3 +47,6 @@ scratch /css/dist_last /css/tools/cache /webaudio/idl/* + +# w3c-test.org PR-branch mirroring +submissions/ diff --git a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-array-buffer.any.js b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-array-buffer.any.js index b72427fd5cf..2310646e5fd 100644 --- a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-array-buffer.any.js +++ b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-array-buffer.any.js @@ -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") diff --git a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-stream.any.js b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-stream.any.js index 894f09f8ece..bd4f8dc40bc 100644 --- a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-stream.any.js +++ b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-stream.any.js @@ -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") diff --git a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-text.any.js b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-text.any.js index 960c9605462..d04fa97cffe 100644 --- a/tests/wpt/web-platform-tests/FileAPI/blob/Blob-text.any.js +++ b/tests/wpt/web-platform-tests/FileAPI/blob/Blob-text.any.js @@ -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") diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-creation.https.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-creation.https.html index 02886c444dc..5d033b30099 100644 --- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-creation.https.html +++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-creation.https.html @@ -132,21 +132,6 @@ function CreateKeyframeEffect(element) { 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')); let constructorFunc = function() { new WorkletAnimation('unregistered-animator', effect); diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration-ref.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration-ref.html deleted file mode 100644 index 81b01bdca81..00000000000 --- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration-ref.html +++ /dev/null @@ -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> diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration.https.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration.https.html index 1526004eaf1..1a8afc1e892 100644 --- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration.https.html +++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration.https.html @@ -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> diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-without-target.https.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-without-target.https.html new file mode 100644 index 00000000000..bfb6b4faee4 --- /dev/null +++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-without-target.https.html @@ -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> diff --git a/tests/wpt/web-platform-tests/common/security-features/resources/common.js b/tests/wpt/web-platform-tests/common/security-features/resources/common.js index 782e428c66f..2b4349d24e5 100644 --- a/tests/wpt/web-platform-tests/common/security-features/resources/common.js +++ b/tests/wpt/web-platform-tests/common/security-features/resources/common.js @@ -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(); diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top-ref.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top-ref.html new file mode 100644 index 00000000000..8ccc1548ef6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top-ref.html @@ -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> diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top.html new file mode 100644 index 00000000000..054a8a610d9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top.html @@ -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> diff --git a/tests/wpt/web-platform-tests/docs/_running-tests/safari.md b/tests/wpt/web-platform-tests/docs/_running-tests/safari.md index e81383d498c..89f329a2986 100644 --- a/tests/wpt/web-platform-tests/docs/_running-tests/safari.md +++ b/tests/wpt/web-platform-tests/docs/_running-tests/safari.md @@ -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 diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml new file mode 100644 index 00000000000..57326bb4a80 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml @@ -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> diff --git a/tests/wpt/web-platform-tests/intersection-observer/v2/inline-occlusion.html b/tests/wpt/web-platform-tests/intersection-observer/v2/inline-occlusion.html new file mode 100644 index 00000000000..e4b097e62ae --- /dev/null +++ b/tests/wpt/web-platform-tests/intersection-observer/v2/inline-occlusion.html @@ -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> diff --git a/tests/wpt/web-platform-tests/intersection-observer/v2/text-editor-occlusion.html b/tests/wpt/web-platform-tests/intersection-observer/v2/text-editor-occlusion.html new file mode 100644 index 00000000000..2edb7bbbe65 --- /dev/null +++ b/tests/wpt/web-platform-tests/intersection-observer/v2/text-editor-occlusion.html @@ -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> diff --git a/tests/wpt/web-platform-tests/lifecycle/child-display-none.tentative.html b/tests/wpt/web-platform-tests/lifecycle/child-display-none.tentative.html index f76b4e7b608..d4ca6dab1e0 100644 --- a/tests/wpt/web-platform-tests/lifecycle/child-display-none.tentative.html +++ b/tests/wpt/web-platform-tests/lifecycle/child-display-none.tentative.html @@ -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"; diff --git a/tests/wpt/web-platform-tests/lifecycle/child-out-of-viewport.tentative.html b/tests/wpt/web-platform-tests/lifecycle/child-out-of-viewport.tentative.html new file mode 100644 index 00000000000..4d8f868bfb5 --- /dev/null +++ b/tests/wpt/web-platform-tests/lifecycle/child-out-of-viewport.tentative.html @@ -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> diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index 0ec256a7525..a7a4600d9cd 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -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 diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/nested-contexts.js b/tests/wpt/web-platform-tests/resource-timing/resources/nested-contexts.js index 0c202243702..07ef33851b0 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resources/nested-contexts.js +++ b/tests/wpt/web-platform-tests/resource-timing/resources/nested-contexts.js @@ -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(() => { diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate-back.html b/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate-back.html index 64e5f584731..df32ab0c199 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate-back.html +++ b/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate-back.html @@ -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> diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate.html b/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate.html index cbb862e7e00..3ae39c8bc44 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate.html +++ b/tests/wpt/web-platform-tests/resource-timing/resources/object-navigate.html @@ -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> diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/object-refresh.html b/tests/wpt/web-platform-tests/resource-timing/resources/object-refresh.html index b14cf7f17c9..9e43e19de19 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resources/object-refresh.html +++ b/tests/wpt/web-platform-tests/resource-timing/resources/object-refresh.html @@ -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> diff --git a/tests/wpt/web-platform-tests/streams/resources/test-utils.js b/tests/wpt/web-platform-tests/streams/resources/test-utils.js index 871ab49fa81..5a9e2479faa 100644 --- a/tests/wpt/web-platform-tests/streams/resources/test-utils.js +++ b/tests/wpt/web-platform-tests/streams/resources/test-utils.js @@ -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) { diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_wptrunner_infrastructure.sh b/tests/wpt/web-platform-tests/tools/ci/ci_wptrunner_infrastructure.sh index f3ce3e73ea7..e5b485dbff8 100755 --- a/tests/wpt/web-platform-tests/tools/ci/ci_wptrunner_infrastructure.sh +++ b/tests/wpt/web-platform-tests/tools/ci/ci_wptrunner_infrastructure.sh @@ -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 diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index 3f578c09481..66ad8b50e8c 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -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 diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index c54d5aaba01..c0cfa58950e 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -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): diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py index 49d2b8758f7..4685fa7abd2 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py @@ -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 diff --git a/tests/wpt/web-platform-tests/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html index 75064767cee..ad7eeb075f4 100644 --- a/tests/wpt/web-platform-tests/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html +++ b/tests/wpt/web-platform-tests/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html @@ -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 => { diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html index 4163a8439cd..5703a2a6c7f 100644 --- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html @@ -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(); diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/event-insertion.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/event-insertion.html index 07a54c3bbf6..2eef895c8e8 100644 --- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/event-insertion.html +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/event-insertion.html @@ -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 + '('; diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-getFrequencyResponse.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-getFrequencyResponse.html index 2389b334fb8..23222e4df96 100644 --- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-getFrequencyResponse.html +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-getFrequencyResponse.html @@ -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(); - - filter = context.createBiquadFilter(); - - // 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); - - filter.getFrequencyResponse( - frequencies, magResponse, phaseResponse); - compareResponses( - should, filter, frequencies, magResponse, phaseResponse); - - task.done(); - }); + // 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(); + + let filter = new BiquadFilterNode(context, { + type: test.type, + frequency: filterCutoff, + Q: filterQ, + gain: filterGain + }); + + 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); + + task.done(); + }); + }); audit.define( { diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html new file mode 100644 index 00000000000..c1686da9645 --- /dev/null +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html @@ -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> diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html new file mode 100644 index 00000000000..5d3fd0c26f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html @@ -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> |