aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/FileAPI/blob/Blob-array-buffer.any.js.ini6
-rw-r--r--tests/wpt/metadata/FileAPI/blob/Blob-stream.any.js.ini6
-rw-r--r--tests/wpt/metadata/FileAPI/blob/Blob-text.any.js.ini6
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini3
-rw-r--r--tests/wpt/metadata/MANIFEST.json717
-rw-r--r--tests/wpt/metadata/encoding/single-byte-decoder.html.ini1
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini33
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-abort/javascript-url-abort-return-value-string.tentative.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini10
-rw-r--r--tests/wpt/metadata/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml.ini4
-rw-r--r--tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini4
-rw-r--r--tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini2
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html.ini2
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html.ini5
-rw-r--r--tests/wpt/web-platform-tests/.gitignore3
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/blob/Blob-array-buffer.any.js11
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/blob/Blob-stream.any.js22
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/blob/Blob-text.any.js12
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-creation.https.html15
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-duration.https.html1
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-without-target.https.html76
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/resources/common.js9
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top-ref.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/position-sticky-change-top.html51
-rw-r--r--tests/wpt/web-platform-tests/docs/_running-tests/safari.md2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/textarea-selection-while-parsing.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/v2/inline-occlusion.html62
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/v2/text-editor-occlusion.html62
-rw-r--r--tests/wpt/web-platform-tests/lifecycle/child-display-none.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/lifecycle/child-out-of-viewport.tentative.html36
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist3
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/nested-contexts.js10
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/object-navigate-back.html2
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/object-navigate.html2
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/object-refresh.html2
-rw-r--r--tests/wpt/web-platform-tests/streams/resources/test-utils.js1
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/ci_wptrunner_infrastructure.sh2
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py52
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py16
-rw-r--r--tests/wpt/web-platform-tests/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html2
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html5
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/event-insertion.html90
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/biquad-getFrequencyResponse.html151
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv.html149
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html64
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>