mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Update web-platform-tests to revision 4accec3d14ccdc7b170017c0df299b954019f06f
This commit is contained in:
parent
630cf2745b
commit
b30b1992ac
50 changed files with 1015 additions and 760 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -11,3 +11,6 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%0C]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[javascript-url-abort-return-value-string.tentative.html]
|
||||
[Aborting fetch for javascript:string navigation]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
[non-active-document.html]
|
||||
[DOMParser]
|
||||
expected: FAIL
|
||||
|
||||
[createHTMLDocument]
|
||||
expected: FAIL
|
||||
|
||||
[<template>]
|
||||
expected: FAIL
|
||||
|
|
@ -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
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[DOMContentLoaded-defer.html]
|
||||
[The end: DOMContentLoaded and defer scripts]
|
||||
expected: FAIL
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[realtime-conv.html]
|
||||
expected: ERROR
|
|
@ -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
|
||||
|
3
tests/wpt/web-platform-tests/.gitignore
vendored
3
tests/wpt/web-platform-tests/.gitignore
vendored
|
@ -47,3 +47,6 @@ scratch
|
|||
/css/dist_last
|
||||
/css/tools/cache
|
||||
/webaudio/idl/*
|
||||
|
||||
# w3c-test.org PR-branch mirroring
|
||||
submissions/
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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'));
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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";
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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(() => {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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 => {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 + '(';
|
||||
|
|
|
@ -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(
|
||||
{
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue