mirror of
https://github.com/servo/servo.git
synced 2025-06-29 03:23:41 +01:00
Auto merge of #22847 - servo-wpt-sync:wpt_update_07-02-2019, r=jdm
Sync WPT with upstream (07-02-2019) Automated downstream sync of changes from upstream as of 07-02-2019. [no-wpt-sync] <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22847) <!-- Reviewable:end -->
This commit is contained in:
commit
71ba247942
75 changed files with 2476 additions and 391 deletions
|
@ -13537,6 +13537,24 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"payment-request/payment-request-abort-method-manual.https.html": [
|
||||||
|
[
|
||||||
|
"/payment-request/payment-request-abort-method-manual.https.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"payment-request/payment-request-multiple-show-manual.https.html": [
|
||||||
|
[
|
||||||
|
"/payment-request/payment-request-multiple-show-manual.https.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"payment-request/payment-request-show-method-manual.https.html": [
|
||||||
|
[
|
||||||
|
"/payment-request/payment-request-show-method-manual.https.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"payment-request/payment-response/complete-method-manual.https.html": [
|
"payment-request/payment-response/complete-method-manual.https.html": [
|
||||||
[
|
[
|
||||||
"/payment-request/payment-response/complete-method-manual.https.html",
|
"/payment-request/payment-response/complete-method-manual.https.html",
|
||||||
|
@ -19377,6 +19395,30 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-after-duration.https.html": [
|
||||||
|
[
|
||||||
|
"/animation-worklet/worklet-animation-local-time-after-duration.https.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/animation-worklet/worklet-animation-local-time-after-duration-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-before-start.https.html": [
|
||||||
|
[
|
||||||
|
"/animation-worklet/worklet-animation-local-time-before-start.https.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/animation-worklet/worklet-animation-local-time-before-start-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"apng/animated-png-timeout.html": [
|
"apng/animated-png-timeout.html": [
|
||||||
[
|
[
|
||||||
"/apng/animated-png-timeout.html",
|
"/apng/animated-png-timeout.html",
|
||||||
|
@ -103753,6 +103795,30 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-align/baseline-of-scrollable-1a.html": [
|
||||||
|
[
|
||||||
|
"/css/css-align/baseline-of-scrollable-1a.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-align/reference/baseline-of-scrollable-1-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"css/css-align/baseline-of-scrollable-1b.html": [
|
||||||
|
[
|
||||||
|
"/css/css-align/baseline-of-scrollable-1b.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-align/reference/baseline-of-scrollable-1-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-align/content-distribution/place-content-shorthand-007.html": [
|
"css/css-align/content-distribution/place-content-shorthand-007.html": [
|
||||||
[
|
[
|
||||||
"/css/css-align/content-distribution/place-content-shorthand-007.html",
|
"/css/css-align/content-distribution/place-content-shorthand-007.html",
|
||||||
|
@ -127929,6 +127995,30 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-masking/clip/clip-transform-order-2.html": [
|
||||||
|
[
|
||||||
|
"/css/css-masking/clip/clip-transform-order-2.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-masking/clip/clip-filter-order-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"css/css-masking/clip/clip-transform-order.html": [
|
||||||
|
[
|
||||||
|
"/css/css-masking/clip/clip-transform-order.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-masking/clip/clip-filter-order-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-masking/mask-image/mask-image-url-image-hash.html": [
|
"css/css-masking/mask-image/mask-image-url-image-hash.html": [
|
||||||
[
|
[
|
||||||
"/css/css-masking/mask-image/mask-image-url-image-hash.html",
|
"/css/css-masking/mask-image/mask-image-url-image-hash.html",
|
||||||
|
@ -162577,6 +162667,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-writing-modes/baseline-with-orthogonal-flow-001.html": [
|
||||||
|
[
|
||||||
|
"/css/css-writing-modes/baseline-with-orthogonal-flow-001.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-writing-modes/reference/baseline-with-orthogonal-flow-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-writing-modes/bidi-embed-001.html": [
|
"css/css-writing-modes/bidi-embed-001.html": [
|
||||||
[
|
[
|
||||||
"/css/css-writing-modes/bidi-embed-001.html",
|
"/css/css-writing-modes/bidi-embed-001.html",
|
||||||
|
@ -170745,6 +170847,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/cssom-view/long_scroll_composited.html": [
|
||||||
|
[
|
||||||
|
"/css/cssom-view/long_scroll_composited.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/cssom-view/long_scroll_composited-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/cssom-view/offsetTopLeftInline.html": [
|
"css/cssom-view/offsetTopLeftInline.html": [
|
||||||
[
|
[
|
||||||
"/css/cssom-view/offsetTopLeftInline.html",
|
"/css/cssom-view/offsetTopLeftInline.html",
|
||||||
|
@ -170877,18 +170991,6 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"css/filter-effects/backdrop-filter-border-radius.html": [
|
|
||||||
[
|
|
||||||
"/css/filter-effects/backdrop-filter-border-radius.html",
|
|
||||||
[
|
|
||||||
[
|
|
||||||
"/css/filter-effects/backdrop-filter-border-radius-ref.html",
|
|
||||||
"=="
|
|
||||||
]
|
|
||||||
],
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"css/filter-effects/backdrop-filter-clip-rect.html": [
|
"css/filter-effects/backdrop-filter-clip-rect.html": [
|
||||||
[
|
[
|
||||||
"/css/filter-effects/backdrop-filter-clip-rect.html",
|
"/css/filter-effects/backdrop-filter-clip-rect.html",
|
||||||
|
@ -178101,6 +178203,30 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html": [
|
||||||
|
[
|
||||||
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html": [
|
||||||
|
[
|
||||||
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001.xhtml": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001.xhtml": [
|
||||||
[
|
[
|
||||||
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001.xhtml",
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001.xhtml",
|
||||||
|
@ -202513,6 +202639,16 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-after-duration-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-before-start-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"annotation-model/.editorconfig": [
|
"annotation-model/.editorconfig": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -253348,6 +253484,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-align/reference/baseline-of-scrollable-1-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-align/reference/ttwf-reftest-alignContent-ref.html": [
|
"css/css-align/reference/ttwf-reftest-alignContent-ref.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -277278,6 +277419,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-writing-modes/reference/baseline-with-orthogonal-flow-001-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-writing-modes/reference/bidi-embed-001.html": [
|
"css/css-writing-modes/reference/bidi-embed-001.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -279508,6 +279654,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/cssom-view/long_scroll_composited-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/cssom-view/resources/elementsFromPoint.js": [
|
"css/cssom-view/resources/elementsFromPoint.js": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -280058,11 +280209,6 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"css/filter-effects/backdrop-filter-border-radius-ref.html": [
|
|
||||||
[
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"css/filter-effects/backdrop-filter-clip-rect-ref.html": [
|
"css/filter-effects/backdrop-filter-clip-rect-ref.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -283043,6 +283189,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001-ref.xhtml": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001-ref.xhtml": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -286983,6 +287134,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"element-timing/resources/TAOImage.py": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"element-timing/resources/circle.svg": [
|
"element-timing/resources/circle.svg": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -302408,6 +302564,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"lifecycle/resources/subframe.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"lifecycle/resources/window.html": [
|
"lifecycle/resources/window.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -322788,11 +322949,6 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/resources/sub-sample-scheduling.html": [
|
|
||||||
[
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"webaudio/the-audio-api/the-audiocontext-interface/.gitkeep": [
|
"webaudio/the-audio-api/the-audiocontext-interface/.gitkeep": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -359117,15 +359273,21 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"element-timing/cross-origin-element.html": [
|
"element-timing/cross-origin-element.sub.html": [
|
||||||
[
|
[
|
||||||
"/element-timing/cross-origin-element.html",
|
"/element-timing/cross-origin-element.sub.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"element-timing/cross-origin-iframe-element.html": [
|
"element-timing/cross-origin-iframe-element.sub.html": [
|
||||||
[
|
[
|
||||||
"/element-timing/cross-origin-iframe-element.html",
|
"/element-timing/cross-origin-iframe-element.sub.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"element-timing/image-TAO-wildcard.sub.html": [
|
||||||
|
[
|
||||||
|
"/element-timing/image-TAO-wildcard.sub.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
@ -374253,18 +374415,6 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"html/semantics/document-metadata/the-link-element/link-multiple-error-events.html": [
|
|
||||||
[
|
|
||||||
"/html/semantics/document-metadata/the-link-element/link-multiple-error-events.html",
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"html/semantics/document-metadata/the-link-element/link-multiple-load-events.html": [
|
|
||||||
[
|
|
||||||
"/html/semantics/document-metadata/the-link-element/link-multiple-load-events.html",
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"html/semantics/document-metadata/the-link-element/link-rel-attribute.html": [
|
"html/semantics/document-metadata/the-link-element/link-rel-attribute.html": [
|
||||||
[
|
[
|
||||||
"/html/semantics/document-metadata/the-link-element/link-rel-attribute.html",
|
"/html/semantics/document-metadata/the-link-element/link-rel-attribute.html",
|
||||||
|
@ -384897,6 +385047,12 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"lifecycle/child-display-none.tentative.html": [
|
||||||
|
[
|
||||||
|
"/lifecycle/child-display-none.tentative.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"lifecycle/freeze.html": [
|
"lifecycle/freeze.html": [
|
||||||
[
|
[
|
||||||
"/lifecycle/freeze.html",
|
"/lifecycle/freeze.html",
|
||||||
|
@ -384999,13 +385155,9 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"longtask-timing/supported-longtask-types.any.js": [
|
"longtask-timing/supported-longtask-types.window.js": [
|
||||||
[
|
[
|
||||||
"/longtask-timing/supported-longtask-types.any.html",
|
"/longtask-timing/supported-longtask-types.window.html",
|
||||||
{}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"/longtask-timing/supported-longtask-types.any.worker.html",
|
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
@ -389005,13 +389157,9 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"navigation-timing/supported_navigation_type.any.js": [
|
"navigation-timing/supported_navigation_type.window.js": [
|
||||||
[
|
[
|
||||||
"/navigation-timing/supported_navigation_type.any.html",
|
"/navigation-timing/supported_navigation_type.window.html",
|
||||||
{}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"/navigation-timing/supported_navigation_type.any.worker.html",
|
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
@ -398961,13 +399109,9 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"paint-timing/supported-paint-type.any.js": [
|
"paint-timing/supported-paint-type.window.js": [
|
||||||
[
|
[
|
||||||
"/paint-timing/supported-paint-type.any.html",
|
"/paint-timing/supported-paint-type.window.html",
|
||||||
{}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"/paint-timing/supported-paint-type.any.worker.html",
|
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
@ -399326,9 +399470,7 @@
|
||||||
"payment-request/payment-request-show-method.https.html": [
|
"payment-request/payment-request-show-method.https.html": [
|
||||||
[
|
[
|
||||||
"/payment-request/payment-request-show-method.https.html",
|
"/payment-request/payment-request-show-method.https.html",
|
||||||
{
|
{}
|
||||||
"testdriver": true
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"payment-request/payment-response/onpayerdetailchange-attribute.https.html": [
|
"payment-request/payment-response/onpayerdetailchange-attribute.https.html": [
|
||||||
|
@ -413887,6 +414029,30 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"streams/readable-streams/async-iterator.any.js": [
|
||||||
|
[
|
||||||
|
"/streams/readable-streams/async-iterator.any.html",
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"/streams/readable-streams/async-iterator.any.js",
|
||||||
|
{
|
||||||
|
"jsshell": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"/streams/readable-streams/async-iterator.any.serviceworker.html",
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"/streams/readable-streams/async-iterator.any.sharedworker.html",
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"/streams/readable-streams/async-iterator.any.worker.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"streams/readable-streams/bad-strategies.any.js": [
|
"streams/readable-streams/bad-strategies.any.js": [
|
||||||
[
|
[
|
||||||
"/streams/readable-streams/bad-strategies.any.html",
|
"/streams/readable-streams/bad-strategies.any.html",
|
||||||
|
@ -418907,6 +419073,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html": [
|
||||||
|
[
|
||||||
|
"/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-scheduling.html": [
|
||||||
|
[
|
||||||
|
"/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-scheduling.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"webaudio/the-audio-api/the-audiocontext-interface/audiocontext-getoutputtimestamp.html": [
|
"webaudio/the-audio-api/the-audiocontext-interface/audiocontext-getoutputtimestamp.html": [
|
||||||
[
|
[
|
||||||
"/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-getoutputtimestamp.html",
|
"/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-getoutputtimestamp.html",
|
||||||
|
@ -456488,6 +456666,22 @@
|
||||||
"5b20f03bfadb5790c79ddd51e1f3d89a9f948852",
|
"5b20f03bfadb5790c79ddd51e1f3d89a9f948852",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-after-duration-ref.html": [
|
||||||
|
"96acf1ad96c7c41e870429d55142269f4468bb97",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-after-duration.https.html": [
|
||||||
|
"adc90f1d3f6befa906473dd1bfb500b605431d0a",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-before-start-ref.html": [
|
||||||
|
"cda4ca4132cabcb13719f12248773026b0642df2",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"animation-worklet/worklet-animation-local-time-before-start.https.html": [
|
||||||
|
"addb16e7d1751280c8d4f3e0052b808ab807cd7e",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"animation-worklet/worklet-animation-with-fill-mode.https.html": [
|
"animation-worklet/worklet-animation-with-fill-mode.https.html": [
|
||||||
"b910ab280ec80725eee7894e8331cf72f6c24492",
|
"b910ab280ec80725eee7894e8331cf72f6c24492",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -542684,6 +542878,14 @@
|
||||||
"bd26585d9e639e3133a650c26d3f3cb93579e4ae",
|
"bd26585d9e639e3133a650c26d3f3cb93579e4ae",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"css/css-align/baseline-of-scrollable-1a.html": [
|
||||||
|
"a55e2318ca40f68500754bfccb582dd06c9f29c3",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
|
"css/css-align/baseline-of-scrollable-1b.html": [
|
||||||
|
"79db8a85434beb60f7f6ef259bc2eff62d83bea3",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-align/content-distribution/parse-align-content-001.html": [
|
"css/css-align/content-distribution/parse-align-content-001.html": [
|
||||||
"c5cd4254f707824dacd0475eab9e8e1c59c02632",
|
"c5cd4254f707824dacd0475eab9e8e1c59c02632",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -542916,6 +543118,10 @@
|
||||||
"7e2fa130be24214fa8c21f58d0f88a744beb6b79",
|
"7e2fa130be24214fa8c21f58d0f88a744beb6b79",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"css/css-align/reference/baseline-of-scrollable-1-ref.html": [
|
||||||
|
"422660aff6b6b486ce3288469b4769e1497b071e",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"css/css-align/reference/ttwf-reftest-alignContent-ref.html": [
|
"css/css-align/reference/ttwf-reftest-alignContent-ref.html": [
|
||||||
"a94c1d5e9e85dfe0aec20145b25e55dc5b1a673d",
|
"a94c1d5e9e85dfe0aec20145b25e55dc5b1a673d",
|
||||||
"support"
|
"support"
|
||||||
|
@ -566033,7 +566239,7 @@
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-lists/inheritance.html": [
|
"css/css-lists/inheritance.html": [
|
||||||
"ff1bcdcfb4690df571dc2d5c93df71b55ffad5e6",
|
"590319d63fd09466f4d5fffe6943b4ff0430fcee",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-lists/li-with-height-001-ref.html": [
|
"css/css-lists/li-with-height-001-ref.html": [
|
||||||
|
@ -567013,11 +567219,11 @@
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-masking/clip/clip-filter-order-ref.html": [
|
"css/css-masking/clip/clip-filter-order-ref.html": [
|
||||||
"e5763bfdf707fc7219bb0f7431e5c48a2b45952a",
|
"fe9511a8dfce2b4f597597871abccd03727f136f",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/css-masking/clip/clip-filter-order.html": [
|
"css/css-masking/clip/clip-filter-order.html": [
|
||||||
"79f2f71488d31185cbf1011db9e4d2e489d0377c",
|
"0570d02b85ec9710d1b201ad44d12801e3db2758",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-masking/clip/clip-fixed-pos-transform-descendant-001-ref.html": [
|
"css/css-masking/clip/clip-fixed-pos-transform-descendant-001-ref.html": [
|
||||||
|
@ -567108,6 +567314,14 @@
|
||||||
"2a8b9305dfe7c7c1b4d971e1de2f6b6e508e8e65",
|
"2a8b9305dfe7c7c1b4d971e1de2f6b6e508e8e65",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-masking/clip/clip-transform-order-2.html": [
|
||||||
|
"bd8e909d76d877c37effc2d54a3fb26f3a836736",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
|
"css/css-masking/clip/clip-transform-order.html": [
|
||||||
|
"1f24864bc96507405c534af1d2648c3f7ec17c16",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-masking/clip/reference/clip-absolute-positioned-ref.html": [
|
"css/css-masking/clip/reference/clip-absolute-positioned-ref.html": [
|
||||||
"2a9a49fd3ab9bdef973bd09f919deb73808abafd",
|
"2a9a49fd3ab9bdef973bd09f919deb73808abafd",
|
||||||
"support"
|
"support"
|
||||||
|
@ -575253,7 +575467,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-syntax/urange-parsing.html": [
|
"css/css-syntax/urange-parsing.html": [
|
||||||
"0a69faa39c1d661e17084fe63d86c826cfa58848",
|
"2d34e05a98ba895cd0c98415bed32f248b235187",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-syntax/whitespace.html": [
|
"css/css-syntax/whitespace.html": [
|
||||||
|
@ -593480,6 +593694,10 @@
|
||||||
"742c011d2c645f99e193671b3f665f260f0176d1",
|
"742c011d2c645f99e193671b3f665f260f0176d1",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-writing-modes/baseline-with-orthogonal-flow-001.html": [
|
||||||
|
"f054c59b6d7d7b253ec8221577de4713c955b237",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-writing-modes/bidi-embed-001.html": [
|
"css/css-writing-modes/bidi-embed-001.html": [
|
||||||
"d8215ad264d0fa47d855fd1a135c2cc05772c319",
|
"d8215ad264d0fa47d855fd1a135c2cc05772c319",
|
||||||
"reftest"
|
"reftest"
|
||||||
|
@ -595692,6 +595910,10 @@
|
||||||
"ef66b4e0d6248a8bc5b49c2654bfc77a2ac2e298",
|
"ef66b4e0d6248a8bc5b49c2654bfc77a2ac2e298",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"css/css-writing-modes/reference/baseline-with-orthogonal-flow-001-ref.html": [
|
||||||
|
"dda75ca1ef495507c75c27f4a1de638bbf5506f8",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"css/css-writing-modes/reference/bidi-embed-001.html": [
|
"css/css-writing-modes/reference/bidi-embed-001.html": [
|
||||||
"24723ad3c6bdb0124ad41f23ad201055da19805a",
|
"24723ad3c6bdb0124ad41f23ad201055da19805a",
|
||||||
"support"
|
"support"
|
||||||
|
@ -599084,6 +599306,14 @@
|
||||||
"d3de0cfa595381e0b7c0f3188ac9322ef10608f5",
|
"d3de0cfa595381e0b7c0f3188ac9322ef10608f5",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"css/cssom-view/long_scroll_composited-ref.html": [
|
||||||
|
"6914cba30972387b929113817fa56c6bd1384387",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"css/cssom-view/long_scroll_composited.html": [
|
||||||
|
"aa91023c1ac456902f34ccf6a4df0fed1e852bf2",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/cssom-view/matchMedia.xht": [
|
"css/cssom-view/matchMedia.xht": [
|
||||||
"7ac875c6aa967187d8171f0876a5de15adfe5249",
|
"7ac875c6aa967187d8171f0876a5de15adfe5249",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -599141,7 +599371,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/cssom-view/scroll-behavior-main-frame-window.html": [
|
"css/cssom-view/scroll-behavior-main-frame-window.html": [
|
||||||
"57b0d913461a3d374afeb204ed164b97e7d82b38",
|
"8024d5319b452ea8277192a0f64e72da2aa66c44",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/cssom-view/scroll-behavior-scrollintoview-nested.html": [
|
"css/cssom-view/scroll-behavior-scrollintoview-nested.html": [
|
||||||
|
@ -600076,14 +600306,6 @@
|
||||||
"711064e4de375df9f2fa819b4fff209b87721f8d",
|
"711064e4de375df9f2fa819b4fff209b87721f8d",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/filter-effects/backdrop-filter-border-radius-ref.html": [
|
|
||||||
"e5712a23774b6f27c6c2a1dfcfe45931aa0301a4",
|
|
||||||
"support"
|
|
||||||
],
|
|
||||||
"css/filter-effects/backdrop-filter-border-radius.html": [
|
|
||||||
"ec93de698aaab5d41709f0999d9f2bab3381945d",
|
|
||||||
"reftest"
|
|
||||||
],
|
|
||||||
"css/filter-effects/backdrop-filter-clip-rect-ref.html": [
|
"css/filter-effects/backdrop-filter-clip-rect-ref.html": [
|
||||||
"d3c1f800e69bdfb72ca1d6d4d1ae73b8c8febcad",
|
"d3c1f800e69bdfb72ca1d6d4d1ae73b8c8febcad",
|
||||||
"support"
|
"support"
|
||||||
|
@ -606460,6 +606682,18 @@
|
||||||
"8c12fad8c791623a86ddca8936248189d698a0a4",
|
"8c12fad8c791623a86ddca8936248189d698a0a4",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007-ref.html": [
|
||||||
|
"ccde6012b5f74ede005dad74814be62cdffa9ac6",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html": [
|
||||||
|
"ea9179c32ca7916792132f4a73c159fca89a19b6",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html": [
|
||||||
|
"2efb8b1c18fa65c2ea4b08c2c797476bdc79273e",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001-ref.xhtml": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-001-ref.xhtml": [
|
||||||
"7e02b799f0f75b5d238ecc3c7bbaf87a53572e88",
|
"7e02b799f0f75b5d238ecc3c7bbaf87a53572e88",
|
||||||
"support"
|
"support"
|
||||||
|
@ -607137,7 +607371,7 @@
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [
|
||||||
"5bb3b650139c3293cb7d782d47af7dbff9bc3ad6",
|
"850651a9f6ec839261e95261b5bd2fdffae6f4a8",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/support/Ahem.ttf": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/support/Ahem.ttf": [
|
||||||
|
@ -614889,7 +615123,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"domparsing/XMLSerializer-serializeToString.html": [
|
"domparsing/XMLSerializer-serializeToString.html": [
|
||||||
"8ee4aa486f63674831842c5c4e5aceaec7e2d491",
|
"d71da494fe7dbce56af5e45926739c7b6a232676",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"domparsing/createContextualFragment.html": [
|
"domparsing/createContextualFragment.html": [
|
||||||
|
@ -614977,7 +615211,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"domxpath/document.tentative.html": [
|
"domxpath/document.tentative.html": [
|
||||||
"c44ebd9937574ff071c7f0f2484ba5ea0ee15125",
|
"b75c0f0d66dacb47a825ae2aa00bb63a19616433",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"domxpath/evaluator-constructor.html": [
|
"domxpath/evaluator-constructor.html": [
|
||||||
|
@ -615532,12 +615766,16 @@
|
||||||
"4d59d4afc9f8e501a0a764cbce980d0d276250fe",
|
"4d59d4afc9f8e501a0a764cbce980d0d276250fe",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"element-timing/cross-origin-element.html": [
|
"element-timing/cross-origin-element.sub.html": [
|
||||||
"1b899b00e3abc5425bb8e97528c8635d6aabff75",
|
"ed820d0e66558d1db01109a6c4227c960f15644b",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"element-timing/cross-origin-iframe-element.html": [
|
"element-timing/cross-origin-iframe-element.sub.html": [
|
||||||
"7f73881cc9726fa72c896fd1fbd1a496ade46695",
|
"a369d25bd43c6565ab4367b0a381ab39ec8664b7",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
|
"element-timing/image-TAO-wildcard.sub.html": [
|
||||||
|
"6d5abe21c3c353e55b058655684197ba986d8e64",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"element-timing/image-not-fully-visible.html": [
|
"element-timing/image-not-fully-visible.html": [
|
||||||
|
@ -615545,7 +615783,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"element-timing/observe-child-element.html": [
|
"element-timing/observe-child-element.html": [
|
||||||
"5bb8290893a7d80749e2dd03239c9c3f2f158b88",
|
"83cc2ef94b3fe929ffd87b6c4a49f7424e6be29b",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"element-timing/observe-elementtiming.html": [
|
"element-timing/observe-elementtiming.html": [
|
||||||
|
@ -615564,6 +615802,10 @@
|
||||||
"6fdff39d53848546e113b72ca17e38fd9b0dabc7",
|
"6fdff39d53848546e113b72ca17e38fd9b0dabc7",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"element-timing/resources/TAOImage.py": [
|
||||||
|
"5d042c48941d09ca2d494f054d3625503beaeef0",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"element-timing/resources/circle.svg": [
|
"element-timing/resources/circle.svg": [
|
||||||
"209b9f4e5b5d55b45b5ec80dac25873d06dfb593",
|
"209b9f4e5b5d55b45b5ec80dac25873d06dfb593",
|
||||||
"support"
|
"support"
|
||||||
|
@ -629665,7 +629907,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js": [
|
"html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js": [
|
||||||
"cf175eb4d3ae688ece3fffa2e9d3d90a6ec69657",
|
"77f8fff5b5701ae2b3138116429974c4e9f2608f",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py": [
|
"html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py": [
|
||||||
|
@ -631028,14 +631270,6 @@
|
||||||
"a809cc44b19796e50b7564b852a3234cca7e51f0",
|
"a809cc44b19796e50b7564b852a3234cca7e51f0",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"html/semantics/document-metadata/the-link-element/link-multiple-error-events.html": [
|
|
||||||
"ea7e496ae8ea36f4241f565714952f4ac2c1968a",
|
|
||||||
"testharness"
|
|
||||||
],
|
|
||||||
"html/semantics/document-metadata/the-link-element/link-multiple-load-events.html": [
|
|
||||||
"24cd5ba701184308d7fe28195119552d6431b87d",
|
|
||||||
"testharness"
|
|
||||||
],
|
|
||||||
"html/semantics/document-metadata/the-link-element/link-rel-attribute.html": [
|
"html/semantics/document-metadata/the-link-element/link-rel-attribute.html": [
|
||||||
"14d06227ac862be169c2c1745fd6ec8913836394",
|
"14d06227ac862be169c2c1745fd6ec8913836394",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -641996,6 +642230,10 @@
|
||||||
"c1fcbca4c1f8366da1dd9eb91bc9427edeef1153",
|
"c1fcbca4c1f8366da1dd9eb91bc9427edeef1153",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"lifecycle/child-display-none.tentative.html": [
|
||||||
|
"f76b4e7b608d3e4e97dfac100bee6fa63602e0bb",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"lifecycle/freeze.html": [
|
"lifecycle/freeze.html": [
|
||||||
"88e32c9d3b01eb2622ce90699548d95fba5eb960",
|
"88e32c9d3b01eb2622ce90699548d95fba5eb960",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -642004,6 +642242,10 @@
|
||||||
"403d01060821820b9d3a772b28a826698c8796e6",
|
"403d01060821820b9d3a772b28a826698c8796e6",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"lifecycle/resources/subframe.html": [
|
||||||
|
"2f1d70a80a792401891d93f6ddebaea0876400b3",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"lifecycle/resources/window.html": [
|
"lifecycle/resources/window.html": [
|
||||||
"69fdbc0986633793d501a4bddfee9e88f76e1348",
|
"69fdbc0986633793d501a4bddfee9e88f76e1348",
|
||||||
"support"
|
"support"
|
||||||
|
@ -642104,7 +642346,7 @@
|
||||||
"9d0273e19263f026ff588ac59c12c765a341df8b",
|
"9d0273e19263f026ff588ac59c12c765a341df8b",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"longtask-timing/supported-longtask-types.any.js": [
|
"longtask-timing/supported-longtask-types.window.js": [
|
||||||
"3c68c01d32d614dab435d91a0dce39244f8d7e09",
|
"3c68c01d32d614dab435d91a0dce39244f8d7e09",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
@ -646460,7 +646702,7 @@
|
||||||
"3efb52783f1e5dcb0d42aad11aec2a9e47257d33",
|
"3efb52783f1e5dcb0d42aad11aec2a9e47257d33",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"navigation-timing/supported_navigation_type.any.js": [
|
"navigation-timing/supported_navigation_type.window.js": [
|
||||||
"3239c7d29ffb11cbfebda12b4e5420bca0131094",
|
"3239c7d29ffb11cbfebda12b4e5420bca0131094",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
@ -653473,7 +653715,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"paint-timing/idlharness.window.js": [
|
"paint-timing/idlharness.window.js": [
|
||||||
"115af73dfc801acc442a1be8942d0b3b519dbb3c",
|
"049f0f18f1be64ad5d250f045b0dda3edbc931a4",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"paint-timing/paint-visited.html": [
|
"paint-timing/paint-visited.html": [
|
||||||
|
@ -653500,7 +653742,7 @@
|
||||||
"d4197e8a35c444401b0a7dc84f0fc5a279193ca0",
|
"d4197e8a35c444401b0a7dc84f0fc5a279193ca0",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"paint-timing/supported-paint-type.any.js": [
|
"paint-timing/supported-paint-type.window.js": [
|
||||||
"36acf82ca3b646b32977c3d0212a397c6fa8ea09",
|
"36acf82ca3b646b32977c3d0212a397c6fa8ea09",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
@ -653788,8 +654030,12 @@
|
||||||
"650b76d61f72d82fce1644be95e1ee2b99a90d95",
|
"650b76d61f72d82fce1644be95e1ee2b99a90d95",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"payment-request/payment-request-abort-method-manual.https.html": [
|
||||||
|
"a24bac864aad00afdfe830e04b40ef81a583b341",
|
||||||
|
"manual"
|
||||||
|
],
|
||||||
"payment-request/payment-request-abort-method.https.html": [
|
"payment-request/payment-request-abort-method.https.html": [
|
||||||
"75e39a011c390fb8c3bbbeba2dbe8826ea6291e1",
|
"cf16401d0b0d3e97f3ab14c337880a4ec0d9ea7f",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"payment-request/payment-request-canmakepayment-method-protection.https.html": [
|
"payment-request/payment-request-canmakepayment-method-protection.https.html": [
|
||||||
|
@ -653824,6 +654070,10 @@
|
||||||
"02122203d51eaff6c6639c9762b1495173bbf66e",
|
"02122203d51eaff6c6639c9762b1495173bbf66e",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"payment-request/payment-request-multiple-show-manual.https.html": [
|
||||||
|
"cc412171a6d74cd242c32a2bb50b83eaaf156478",
|
||||||
|
"manual"
|
||||||
|
],
|
||||||
"payment-request/payment-request-not-exposed.https.worker.js": [
|
"payment-request/payment-request-not-exposed.https.worker.js": [
|
||||||
"e5576e673520ea33504d8ddea0e862d54b28e8fb",
|
"e5576e673520ea33504d8ddea0e862d54b28e8fb",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -653848,8 +654098,12 @@
|
||||||
"11f75b1c862224b5655cb724d8c8f5b25ab1af00",
|
"11f75b1c862224b5655cb724d8c8f5b25ab1af00",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"payment-request/payment-request-show-method-manual.https.html": [
|
||||||
|
"6ef98e85a6092a648897bfbca966d78a5a2195f8",
|
||||||
|
"manual"
|
||||||
|
],
|
||||||
"payment-request/payment-request-show-method.https.html": [
|
"payment-request/payment-request-show-method.https.html": [
|
||||||
"3d362596c41c6f6ac7058e752c6c6f0e4f6b3781",
|
"dd04987092b49bbfb5d525da7ce0af63fa60a495",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"payment-request/payment-response/complete-method-manual.https.html": [
|
"payment-request/payment-response/complete-method-manual.https.html": [
|
||||||
|
@ -654085,7 +654339,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"picture-in-picture/request-picture-in-picture-twice.html": [
|
"picture-in-picture/request-picture-in-picture-twice.html": [
|
||||||
"17e494bbe88b52b68a6e34e5be37a346479087e1",
|
"fd8541bc1deeaedb765b7fc8e88ec7214fc1ab67",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"picture-in-picture/request-picture-in-picture.html": [
|
"picture-in-picture/request-picture-in-picture.html": [
|
||||||
|
@ -670736,6 +670990,10 @@
|
||||||
"2d52fd678ab1f602b81295904afdd428a3c736db",
|
"2d52fd678ab1f602b81295904afdd428a3c736db",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"streams/readable-streams/async-iterator.any.js": [
|
||||||
|
"c59cbeb682018991692b3d2f443b7ca2da38a94e",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"streams/readable-streams/bad-strategies.any.js": [
|
"streams/readable-streams/bad-strategies.any.js": [
|
||||||
"5dab51ef771ee48e537a5f9a9f8cb7514d411797",
|
"5dab51ef771ee48e537a5f9a9f8cb7514d411797",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -670745,7 +671003,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"streams/readable-streams/brand-checks.any.js": [
|
"streams/readable-streams/brand-checks.any.js": [
|
||||||
"2906494bdf6b378d07f6fbb916a8f6cb63681b63",
|
"521e4360667b96dae29ce225e374d5c665004bc9",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"streams/readable-streams/cancel.any.js": [
|
"streams/readable-streams/cancel.any.js": [
|
||||||
|
@ -670773,11 +671031,11 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"streams/readable-streams/general.any.js": [
|
"streams/readable-streams/general.any.js": [
|
||||||
"f885ed6dbcdc6983ce1a52f60af492e875503d03",
|
"e9a107db1a36964044eb53a18ea53105140d0f42",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"streams/readable-streams/patched-global.any.js": [
|
"streams/readable-streams/patched-global.any.js": [
|
||||||
"fa49249a9b5e78548892d6405460b88eb6e68361",
|
"500979f5b37ad1af106fcbb76ca531d4dc539129",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"streams/readable-streams/reentrant-strategies.any.js": [
|
"streams/readable-streams/reentrant-strategies.any.js": [
|
||||||
|
@ -679777,7 +680035,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/tox.ini": [
|
"tools/tox.ini": [
|
||||||
"975056ea2c272bd70e117231f0d57928727f6bd1",
|
"bb9873d5bc67cb15de4bd29cab6c1729ea5b94ce",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/webdriver/.gitignore": [
|
"tools/webdriver/.gitignore": [
|
||||||
|
@ -679869,7 +680127,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wpt/tox.ini": [
|
"tools/wpt/tox.ini": [
|
||||||
"0b354e755300c325bdae3b0bc7fe75f9bb99f5d5",
|
"d0dead55d9aa863dd4bd50c941f45ab462f4ede9",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wpt/update.py": [
|
"tools/wpt/update.py": [
|
||||||
|
@ -680097,7 +680355,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptrunner/tox.ini": [
|
"tools/wptrunner/tox.ini": [
|
||||||
"4f5dcfb47bec9a0dee6e81bb38234ad43791e3c6",
|
"d784c5b299e353f8c85aad5881caeab535522a52",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptrunner/wptrunner.default.ini": [
|
"tools/wptrunner/wptrunner.default.ini": [
|
||||||
|
@ -684340,14 +684598,18 @@
|
||||||
"ab9d5fe5a9dbd736a079f0cfd7966d5e064ed7ef",
|
"ab9d5fe5a9dbd736a079f0cfd7966d5e064ed7ef",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/resources/sub-sample-scheduling.html": [
|
|
||||||
"27ac0984a79ef276f6f6e32dc9814131487de31a",
|
|
||||||
"support"
|
|
||||||
],
|
|
||||||
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/sample-accurate-scheduling.html": [
|
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/sample-accurate-scheduling.html": [
|
||||||
"5fafd024eef9b476f4d97b2ebaa2190a4ca520d5",
|
"5fafd024eef9b476f4d97b2ebaa2190a4ca520d5",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html": [
|
||||||
|
"b69cb0e81259a4e47cff1ae11befbe63341d4849",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
|
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-scheduling.html": [
|
||||||
|
"27ac0984a79ef276f6f6e32dc9814131487de31a",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"webaudio/the-audio-api/the-audiocontext-interface/.gitkeep": [
|
"webaudio/the-audio-api/the-audiocontext-interface/.gitkeep": [
|
||||||
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
|
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
|
||||||
"support"
|
"support"
|
||||||
|
@ -691505,7 +691767,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"webxr/resources/webxr_util.js": [
|
"webxr/resources/webxr_util.js": [
|
||||||
"7344fa05f655cded22a3ba9b099a8726a0c4beb3",
|
"26e30c48f36f22d1cb7ef6ffe0e6b9e11979f7b9",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [
|
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[elementsFromPoint-invalid-cases.html]
|
|
||||||
[The root element is the last element returned for valid queries]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[long_scroll_composited.html]
|
||||||
|
expected: FAIL
|
|
@ -15,3 +15,9 @@
|
||||||
[check XMLSerializer.serializeToString escapes attribute values for roundtripping]
|
[check XMLSerializer.serializeToString escapes attribute values for roundtripping]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Check if generated prefixes match to "ns${index}".]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Check if "ns1" is generated even if the element already has xmlns:ns1.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
|
|
||||||
[single-byte-decoder.html?XMLHttpRequest]
|
[single-byte-decoder.html?XMLHttpRequest]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
|
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -312,18 +312,3 @@
|
||||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: */* text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: */* text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[javascript-url-abort-return-value-undefined.tentative.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Not aborting fetch for javascript:undefined navigation]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[traverse_the_history_2.html]
|
[traverse_the_history_4.html]
|
||||||
[Multiple history traversals, last would be aborted]
|
[Multiple history traversals, last would be aborted]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[traverse_the_history_5.html]
|
||||||
|
[Multiple history traversals, last would be aborted]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[script-onerror-insertion-point-2.html]
|
|
||||||
expected: TIMEOUT
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[DOMContentLoaded-defer.html]
|
||||||
|
[The end: DOMContentLoaded and defer scripts]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[iframe_005.html]
|
|
||||||
[document.write external script into iframe write back into parent]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[supported_navigation_type.window.html]
|
||||||
|
[supportedEntryTypes contains 'navigation'.]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -12,3 +12,6 @@
|
||||||
[Verifies the resolution of entry.startTime is at least 5 microseconds.]
|
[Verifies the resolution of entry.startTime is at least 5 microseconds.]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
[Verifies the resolution of performance.now() is at least 5 microseconds.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[realtimeanalyser-fft-scaling.html]
|
[realtimeanalyser-fft-scaling.html]
|
||||||
expected: TIMEOUT
|
|
||||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
[sub-sample-buffer-stitching.html]
|
||||||
|
[X SNR (21.50436285502504 dB) is not greater than or equal to 65.737. Got 21.50436285502504.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[# AUDIT TASK RUNNER FINISHED: 1 out of 2 tasks were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[< [buffer-stitching-2\] 2 out of 3 assertions were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t9.4836157560348511e-1\t9.5236867666244507e-1\t4.0071010589599609e-3\t4.2075103446311962e-3\t3.8985999999999999e-3\n\t[31\]\t9.2646563053131104e-1\t9.3139332532882690e-1\t4.9276947975158691e-3\t5.2906700783754857e-3\t3.8985999999999999e-3\n\t[32\]\t9.0087991952896118e-1\t9.0675884485244751e-1\t5.8789253234863281e-3\t6.4834496590358351e-3\t3.8985999999999999e-3\n\t[33\]\t8.7170630693435669e-1\t8.7856203317642212e-1\t6.8557262420654297e-3\t7.8033490899654511e-3\t3.8985999999999999e-3\n\t[34\]\t8.3906102180480957e-1\t8.4691369533538818e-1\t7.8526735305786133e-3\t9.2721059699818163e-3\t3.8985999999999999e-3\n\t...and 31035 more errors.\n\tMax AbsError of 8.5881388187408447e-1 at index of 1570.\n\t[1570\]\t0.0000000000000000e+0\t-8.5881388187408447e-1\t8.5881388187408447e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\tMax RelError of 3.3137802965303198e+0 at index of 1253.\n\t[1253\]\t-4.3022233992815018e-2\t-9.9732093513011932e-3\t3.3049024641513824e-2\t3.3137802965303198e+0\t3.8985999999999999e-3\n]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
[sub-sample-scheduling.html]
|
||||||
|
[X output0[3\] is not equal to 0. Got 1.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output1 expected to be equal to the array [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1...\] but differs in 84 places:\n\tIndex\tActual\t\t\tExpected\n\t[44\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[45\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[46\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[47\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t...and 80 more errors.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[< [sub-sample-grain\] 5 out of 16 assertions were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X With playbackRate 0.25: output0[18\] is not close to 1.0499999999999998 within a relative error of 4.542e-8 (RelErr=0.04761904761904746). Got 1.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[< [sub-sample accurate start with playbackRate\] 2 out of 5 assertions were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output0[0:33\]: Expected 0 for all values but found 1 unexpected values: \n\tIndex\tActual\n\t[33\]\t1]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output0[38\] is not equal to 0. Got 1.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X With playbackRate 4: output1[18\] is not close to 1.7999999999999972 within a relative error of 4.542e-8 (RelErr=0.4444444444444436). Got 1.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output1[33\] should not be equal to 0. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output1[34:8190\] does not equal [1.100000023841858,2.0999999046325684,3.0999999046325684,4.099999904632568,5.099999904632568,6.099999904632568,7.099999904632568,8.100000381469727,9.100000381469727,10.100000381469727,11.100000381469727,12.100000381469727,13.100000381469727,14.100000381469727,15.100000381469727,16.100000381469727...\] with an element-wise tolerance of {"absoluteThreshold":0,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[0\]\t1.0000000000000000e+0\t1.1000000238418579e+0\t1.0000002384185791e-1\t9.0909110613105290e-2\t0.0000000000000000e+0\n\t[1\]\t2.0000000000000000e+0\t2.0999999046325684e+0\t9.9999904632568359e-2\t4.7619004368509764e-2\t0.0000000000000000e+0\n\t[2\]\t3.0000000000000000e+0\t3.0999999046325684e+0\t9.9999904632568359e-2\t3.2258034744817511e-2\t0.0000000000000000e+0\n\t[3\]\t4.0000000000000000e+0\t4.0999999046325684e+0\t9.9999904632568359e-2\t2.4390221209414906e-2\t0.0000000000000000e+0\n\t[4\]\t5.0000000000000000e+0\t5.0999999046325684e+0\t9.9999904632568359e-2\t1.9607824804414951e-2\t0.0000000000000000e+0\n\t...and 8152 more errors.\n\tMax AbsError of 1.0009765625000000e-1 at index of 2047.\n\t[2047\]\t2.0480000000000000e+3\t2.0481000976562500e+3\t1.0009765625000000e-1\t4.8873419987893697e-5\t0.0000000000000000e+0\n\tMax RelError of 9.0909110613105290e-2 at index of 0.\n]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[# AUDIT TASK RUNNER FINISHED: 4 out of 4 tasks were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output0[34:8190\] does not equal [1.899999976158142,2.9000000953674316,3.9000000953674316,4.900000095367432,5.900000095367432,6.900000095367432,7.900000095367432,8.899999618530273,9.899999618530273,10.899999618530273,11.899999618530273,12.899999618530273,13.899999618530273,14.899999618530273,15.899999618530273,16.899999618530273...\] with an element-wise tolerance of {"absoluteThreshold":0,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[0\]\t2.0000000000000000e+0\t1.8999999761581421e+0\t1.0000002384185791e-1\t5.2631592156154129e-2\t0.0000000000000000e+0\n\t[1\]\t3.0000000000000000e+0\t2.9000000953674316e+0\t9.9999904632568359e-2\t3.4482724601392921e-2\t0.0000000000000000e+0\n\t[2\]\t4.0000000000000000e+0\t3.9000000953674316e+0\t9.9999904632568359e-2\t2.5641000560833845e-2\t0.0000000000000000e+0\n\t[3\]\t5.0000000000000000e+0\t4.9000000953674316e+0\t9.9999904632568359e-2\t2.0408143405366560e-2\t0.0000000000000000e+0\n\t[4\]\t6.0000000000000000e+0\t5.9000000953674316e+0\t9.9999904632568359e-2\t1.6949136104436064e-2\t0.0000000000000000e+0\n\t...and 8152 more errors.\n\tMax AbsError of 1.0009765625000000e-1 at index of 2047.\n\t[2047\]\t2.0490000000000000e+3\t2.0488999023437500e+3\t1.0009765625000000e-1\t4.8854341852180105e-5\t0.0000000000000000e+0\n\tMax RelError of 5.2631592156154129e-2 at index of 0.\n]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[< [sub-sample accurate start\] 3 out of 6 assertions were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output1[44\] is not equal to 0. Got 1.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[< [sub-sample accurate stop\] 1 out of 9 assertions were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X output0 expected to be equal to the array [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1...\] but differs in 91 places:\n\tIndex\tActual\t\t\tExpected\n\t[3\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[38\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[39\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t[40\]\t1.0000000000000000e+0\t0.0000000000000000e+0\n\t...and 87 more errors.]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[005.html]
|
[005.html]
|
||||||
expected: ERROR
|
|
||||||
[dedicated worker in shared worker in dedicated worker]
|
[dedicated worker in shared worker in dedicated worker]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[transition_calc_implicit.html]
|
||||||
|
expected: TIMEOUT
|
|
@ -0,0 +1,12 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<title>Reference for Animation Worklet local time set after duration</title>
|
||||||
|
<style>
|
||||||
|
#box {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
background-color: green;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="box"></div>
|
|
@ -0,0 +1,41 @@
|
||||||
|
<html class="reftest-wait">
|
||||||
|
<title>Animation Worklet local time set after duration</title>
|
||||||
|
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
|
||||||
|
<meta name="assert" content="If an effect doesn't have fill-mode specified, setting its local time beyond its duration makes the animation inactive.">
|
||||||
|
<link rel="match" href="worklet-animation-local-time-after-duration-ref.html">
|
||||||
|
|
||||||
|
<script src="/web-animations/testcommon.js"></script>
|
||||||
|
<script src="/common/reftest-wait.js"></script>
|
||||||
|
<script src="common.js"></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#box {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="box"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
registerConstantLocalTimeAnimator(2000).then(() => {
|
||||||
|
const box = document.getElementById('box');
|
||||||
|
const effect = new KeyframeEffect(box,
|
||||||
|
[
|
||||||
|
{ transform: 'translateY(100px)' },
|
||||||
|
{ transform: 'translateY(200px)' }
|
||||||
|
], {
|
||||||
|
duration: 1000,
|
||||||
|
delay: 1000
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const animation = new WorkletAnimation('constant_time', effect);
|
||||||
|
animation.play();
|
||||||
|
|
||||||
|
waitForAsyncAnimationFrames(1).then(_ => {
|
||||||
|
takeScreenshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<title>Reference for Animation Worklet local time set before start</title>
|
||||||
|
<style>
|
||||||
|
#box {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
background-color: green;
|
||||||
|
will-change: transform;
|
||||||
|
transform: translateY(200px);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="box"></div>
|
|
@ -0,0 +1,41 @@
|
||||||
|
<html class="reftest-wait">
|
||||||
|
<title>Animation Worklet local time set before start</title>
|
||||||
|
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
|
||||||
|
<meta name="assert" content="The local time should be trimmed by the duration, e.g. this is equivalent to effect.localTime = 0">
|
||||||
|
<link rel="match" href="worklet-animation-local-time-before-start-ref.html">
|
||||||
|
|
||||||
|
<script src="/web-animations/testcommon.js"></script>
|
||||||
|
<script src="/common/reftest-wait.js"></script>
|
||||||
|
<script src="common.js"></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#box {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="box"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
registerConstantLocalTimeAnimator(-500).then(() => {
|
||||||
|
const box = document.getElementById('box');
|
||||||
|
const effect = new KeyframeEffect(box,
|
||||||
|
[
|
||||||
|
{ transform: 'translateY(200px)' },
|
||||||
|
{ transform: 'translateY(0px)' }
|
||||||
|
], {
|
||||||
|
duration: 1000,
|
||||||
|
fill: 'backwards'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const animation = new WorkletAnimation('constant_time', effect);
|
||||||
|
animation.play();
|
||||||
|
|
||||||
|
waitForAsyncAnimationFrames(1).then(_ => {
|
||||||
|
takeScreenshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -0,0 +1,58 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>
|
||||||
|
CSS Test: baseline of scrollable element should be taken from its
|
||||||
|
contents. (Except if the scrollable element is an inline-block, which gets
|
||||||
|
baseline from its margin-box.)
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-align/#baseline-export">
|
||||||
|
<link rel="match" href="reference/baseline-of-scrollable-1-ref.html">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
overflow: hidden;
|
||||||
|
height: 50px;
|
||||||
|
width: 100px;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 2px 3px 4px 5px;
|
||||||
|
padding: 4px 5px 7px 8px;
|
||||||
|
margin: 1px 2px 3px 4px;
|
||||||
|
}
|
||||||
|
.inline-block {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.inline-flex {
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
|
.inline-grid {
|
||||||
|
display: inline-grid;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Test passes if the a/b text aligns with the bottom margin-edge of the "block"
|
||||||
|
rect and baseline-aligns with the "flex" and "grid" text.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<!-- Note: for this first "inline-block" case, the element's baseline is
|
||||||
|
synthesized from its margin box. For the other cases, the element's
|
||||||
|
baseline is taken from its contents, i.e. the text inside of it. -->
|
||||||
|
a
|
||||||
|
<div class="container inline-block">block</div>
|
||||||
|
b
|
||||||
|
<br>
|
||||||
|
|
||||||
|
a
|
||||||
|
<div class="container inline-flex">flex</div>
|
||||||
|
b
|
||||||
|
<br>
|
||||||
|
|
||||||
|
a
|
||||||
|
<div class="container inline-grid">grid</div>
|
||||||
|
b
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,67 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>
|
||||||
|
CSS Test: baseline of scrollable element (for use by a parent inline-block)
|
||||||
|
should be taken from its contents. (Except if the scrollable element is a
|
||||||
|
block, which gets baseline from its margin-box.)
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-align/#baseline-export">
|
||||||
|
<link rel="match" href="reference/baseline-of-scrollable-1-ref.html">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
overflow: hidden;
|
||||||
|
height: 50px;
|
||||||
|
width: 100px;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 2px 3px 4px 5px;
|
||||||
|
padding: 4px 5px 7px 8px;
|
||||||
|
margin: 1px 2px 3px 4px;
|
||||||
|
}
|
||||||
|
.inline-block {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.block {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.flex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Test passes if the a/b text aligns with the bottom margin-edge of the "block"
|
||||||
|
rect and baseline-aligns with the "flex" and "grid" text.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<!-- Note: for this first "inline-block" case, the element's baseline is
|
||||||
|
synthesized from its margin box. For the other cases, the element's
|
||||||
|
baseline is taken from its contents, i.e. the text inside of it. -->
|
||||||
|
a
|
||||||
|
<div class="inline-block">
|
||||||
|
<div class="container block">block</div>
|
||||||
|
</div>
|
||||||
|
b
|
||||||
|
<br>
|
||||||
|
|
||||||
|
a
|
||||||
|
<div class="inline-block">
|
||||||
|
<div class="container flex">flex</div>
|
||||||
|
</div>
|
||||||
|
b
|
||||||
|
<br>
|
||||||
|
|
||||||
|
a
|
||||||
|
<div class="inline-block">
|
||||||
|
<div class="container grid">grid</div>
|
||||||
|
</div>
|
||||||
|
b
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,58 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>
|
||||||
|
CSS Reference Case
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-align/#baseline-export">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
/* In this reference case, we leave 'overflow' at its initial value. */
|
||||||
|
height: 50px;
|
||||||
|
width: 100px;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 2px 3px 4px 5px;
|
||||||
|
padding: 4px 5px 7px 8px;
|
||||||
|
margin: 1px 2px 3px 4px;
|
||||||
|
}
|
||||||
|
.inline-block {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.inline-flex {
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
|
.inline-grid {
|
||||||
|
display: inline-grid;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Test passes if the a/b text aligns with the bottom margin-edge of the "block"
|
||||||
|
rect and baseline-aligns with the "flex" and "grid" text.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<!-- Note: for this first "inline-block" case, we take the inner text out of
|
||||||
|
flow, to force the inline-block to synthesize its baseline from its
|
||||||
|
margin box. (This is how the corresponding piece of the testcase is
|
||||||
|
supposed to render). -->
|
||||||
|
a
|
||||||
|
<div class="container inline-block">
|
||||||
|
<div style="position: absolute">block</div>
|
||||||
|
</div>
|
||||||
|
b
|
||||||
|
<br>
|
||||||
|
|
||||||
|
a
|
||||||
|
<div class="container inline-flex">flex</div>
|
||||||
|
b
|
||||||
|
<br>
|
||||||
|
|
||||||
|
a
|
||||||
|
<div class="container inline-grid">grid</div>
|
||||||
|
b
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -17,7 +17,7 @@
|
||||||
<script>
|
<script>
|
||||||
assert_not_inherited('counter-increment', 'none', 'foo 123');
|
assert_not_inherited('counter-increment', 'none', 'foo 123');
|
||||||
assert_not_inherited('counter-reset', 'none', 'foo 123');
|
assert_not_inherited('counter-reset', 'none', 'foo 123');
|
||||||
assert_inherited('list-style-image', 'none', 'url("https://example.com/")');
|
assert_inherited('list-style-image', 'none', 'url("data:,a")');
|
||||||
assert_inherited('list-style-position', 'outside', 'inside');
|
assert_inherited('list-style-position', 'outside', 'inside');
|
||||||
assert_inherited('list-style-type', 'disc', 'square');
|
assert_inherited('list-style-type', 'disc', 'square');
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -3,19 +3,22 @@
|
||||||
<title>Clip should be applied after filtering</title>
|
<title>Clip should be applied after filtering</title>
|
||||||
<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org">
|
<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body { margin: 0 }
|
||||||
|
#testcase {
|
||||||
|
position: absolute;
|
||||||
|
left: 10px;
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
background: green;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p>Expected: A green box.<br>
|
<p>Expected: A green box.<br>
|
||||||
There should be no red visible.<br>
|
There should be no red visible.<br>
|
||||||
There should be a crisp, clipped edge around the green box (no blurring).</p>
|
There should be a crisp, clipped edge around the green box (no blurring).</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
|
||||||
#testcase {
|
|
||||||
position: absolute;
|
|
||||||
width: 200px;
|
|
||||||
height: 200px;
|
|
||||||
background: green;
|
|
||||||
will-change: transform;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<div id="testcase"></div>
|
<div id="testcase"></div>
|
||||||
|
|
|
@ -5,15 +5,11 @@
|
||||||
<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#placement">
|
<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#placement">
|
||||||
<link rel="match" href="clip-filter-order-ref.html">
|
<link rel="match" href="clip-filter-order-ref.html">
|
||||||
|
|
||||||
<div>
|
|
||||||
<p>Expected: A green box.<br>
|
|
||||||
There should be no red visible.<br>
|
|
||||||
There should be a crisp, clipped edge around the green box (no blurring).</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
body { margin: 0 }
|
||||||
#testcase {
|
#testcase {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
left: 10px;
|
||||||
width: 400px;
|
width: 400px;
|
||||||
height: 400px;
|
height: 400px;
|
||||||
background: green;
|
background: green;
|
||||||
|
@ -22,4 +18,11 @@
|
||||||
clip: rect(0px, 200px, 200px, 0px);
|
clip: rect(0px, 200px, 200px, 0px);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p>Expected: A green box.<br>
|
||||||
|
There should be no red visible.<br>
|
||||||
|
There should be a crisp, clipped edge around the green box (no blurring).</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="testcase"></div>
|
<div id="testcase"></div>
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
<!doctype html>
|
||||||
|
<title>Clips should be applied before transforms (when fixed positioned too)</title>
|
||||||
|
<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#placement">
|
||||||
|
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1524966">
|
||||||
|
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
|
||||||
|
<link rel="author" title="Mozilla" href="https://mozilla.org">
|
||||||
|
<link rel="match" href="clip-filter-order-ref.html">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body { margin: 0; overflow: hidden; }
|
||||||
|
#testcase {
|
||||||
|
position: fixed;
|
||||||
|
left: -100px;
|
||||||
|
width: 400px;
|
||||||
|
height: 400px;
|
||||||
|
background: green;
|
||||||
|
transform: translateX(110px);
|
||||||
|
clip: rect(0px, 200px, 200px, 0px);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p>Expected: A green box.<br>
|
||||||
|
There should be no red visible.<br>
|
||||||
|
There should be a crisp, clipped edge around the green box (no blurring).</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="testcase"><div></div></div>
|
||||||
|
|
||||||
|
<div id="padding" style="height: 100vh"></div>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<!doctype html>
|
||||||
|
<title>Clips should be applied before transforms</title>
|
||||||
|
<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#placement">
|
||||||
|
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1524966">
|
||||||
|
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
|
||||||
|
<link rel="author" title="Mozilla" href="https://mozilla.org">
|
||||||
|
<link rel="match" href="clip-filter-order-ref.html">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body { margin: 0 }
|
||||||
|
#testcase {
|
||||||
|
position: absolute;
|
||||||
|
left: -100px;
|
||||||
|
width: 400px;
|
||||||
|
height: 400px;
|
||||||
|
background: green;
|
||||||
|
transform: translateX(110px);
|
||||||
|
clip: rect(0px, 200px, 200px, 0px);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p>Expected: A green box.<br>
|
||||||
|
There should be no red visible.<br>
|
||||||
|
There should be a crisp, clipped edge around the green box (no blurring).</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="testcase"><div></div></div>
|
|
@ -21,17 +21,17 @@
|
||||||
function testUrange(input, expected) {
|
function testUrange(input, expected) {
|
||||||
test(()=>{
|
test(()=>{
|
||||||
const rule = document.styleSheets[0].cssRules[0];
|
const rule = document.styleSheets[0].cssRules[0];
|
||||||
rule.style.unicodeRange = "U+1357";
|
rule.style.setProperty("unicode-range", "U+1357");
|
||||||
rule.style.unicodeRange = input;
|
rule.style.setProperty("unicode-range", input);
|
||||||
assert_equals(rule.style.unicodeRange.toUpperCase(), expected.toUpperCase());
|
assert_equals(rule.style.getPropertyValue("unicode-range").toUpperCase(), expected.toUpperCase());
|
||||||
}, `"${input}" => "${expected}"`)
|
}, `"${input}" => "${expected}"`)
|
||||||
}
|
}
|
||||||
function testInvalidUrange(input) {
|
function testInvalidUrange(input) {
|
||||||
test(()=>{
|
test(()=>{
|
||||||
const rule = document.styleSheets[0].cssRules[0];
|
const rule = document.styleSheets[0].cssRules[0];
|
||||||
rule.style.unicodeRange = "U+1357";
|
rule.style.setProperty("unicode-range", "U+1357");
|
||||||
rule.style.unicodeRange = input;
|
rule.style.setProperty("unicode-range", input);
|
||||||
assert_equals(rule.style.unicodeRange.toUpperCase(), "U+1357");
|
assert_equals(rule.style.getPropertyValue("unicode-range").toUpperCase(), "U+1357");
|
||||||
}, `"${input}" is invalid`);
|
}, `"${input}" is invalid`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>
|
||||||
|
CSS Test: orthogonal-flow child should be skipped over when determining parent's last-baseline
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-align/#baseline-export">
|
||||||
|
<link rel="match" href="reference/baseline-with-orthogonal-flow-001-ref.html">
|
||||||
|
<!-- The inline-blocks in this example are using last-baseline alignment, and
|
||||||
|
css-align-3 sec 9.1 says they should take their last-baseline position:
|
||||||
|
"from the ...(last) in-flow block-level child in the block container
|
||||||
|
that contributes a set of ... (last) baselines".
|
||||||
|
|
||||||
|
The orthogonal-flow doesn't contribute a first/last baseline set (not
|
||||||
|
for its parent's writing-mode at least), so it should not affect the
|
||||||
|
baseline determination.
|
||||||
|
-->
|
||||||
|
<style>
|
||||||
|
.ib {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.vert {
|
||||||
|
writing-mode: vertical-rl;
|
||||||
|
color: transparent;
|
||||||
|
}
|
||||||
|
.overflow {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Test passes if the visible characters below are baseline-aligned.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
aaa
|
||||||
|
|
||||||
|
<div class="ib">
|
||||||
|
bbb
|
||||||
|
<!-- This shouldn't influence the baseline of our inline block: -->
|
||||||
|
<div class="vert">vvv</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ib">
|
||||||
|
ccc
|
||||||
|
<!-- This shouldn't influence the baseline of our inline block: -->
|
||||||
|
<div class="vert overflow">ooo</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>
|
||||||
|
CSS Reference Case
|
||||||
|
</title>
|
||||||
|
<style>
|
||||||
|
.ib {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Test passes if the visible characters below are baseline-aligned.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
aaa
|
||||||
|
|
||||||
|
<div class="ib">
|
||||||
|
bbb
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ib">
|
||||||
|
ccc
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,41 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Long scrolling should work properly</title>
|
||||||
|
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.post {
|
||||||
|
height: 1000px;
|
||||||
|
width: 300px;
|
||||||
|
border: 1px solid black;
|
||||||
|
|
||||||
|
}
|
||||||
|
.before {
|
||||||
|
height: 213px;
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
.scroller {
|
||||||
|
overflow-y: scroll;
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>The number 7 should be visible in the scrolled window below.</p>
|
||||||
|
|
||||||
|
<div id="scroller" class="scroller">
|
||||||
|
<div style="position: relative;">
|
||||||
|
<div style="position: relative;">
|
||||||
|
<div class="post before"></div>
|
||||||
|
<div class="post">7</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Long scrolling should work properly</title>
|
||||||
|
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/cssom-view/#scrolling">
|
||||||
|
<link rel="match" href="long_scroll_composited-ref.html">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.post {
|
||||||
|
height: 1000px;
|
||||||
|
width: 300px;
|
||||||
|
border: 1px solid black;
|
||||||
|
|
||||||
|
}
|
||||||
|
.scroller {
|
||||||
|
overflow-y: scroll;
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>The number 7 should be visible in the scrolled window below.</p>
|
||||||
|
|
||||||
|
<div id="scroller" class="scroller">
|
||||||
|
<div style="position: relative;">
|
||||||
|
<div style="position: relative;">
|
||||||
|
<div class="post">0</div>
|
||||||
|
<div class="post">1</div>
|
||||||
|
<div class="post">2</div>
|
||||||
|
<div class="post">3</div>
|
||||||
|
<div class="post">4</div>
|
||||||
|
<div class="post">5</div>
|
||||||
|
<div class="post">6</div>
|
||||||
|
<div class="post">7</div>
|
||||||
|
<div class="post">8</div>
|
||||||
|
<div class="post">9</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
onload = function() {
|
||||||
|
scroller=document.getElementById("scroller");
|
||||||
|
scroller.scrollTop = 6800;
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -1,6 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<title>Testing scrollOptions' behavior for Element.scroll* on the window of the main frame</title>
|
<title>Testing scrollOptions' behavior for Element.scroll* on the window of the main frame</title>
|
||||||
<meta name="timeout" content="long"/>
|
<meta name="timeout" content="long"/>
|
||||||
|
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
|
||||||
<link rel="author" title="Frédéric Wang" href="mailto:fwang@igalia.com">
|
<link rel="author" title="Frédéric Wang" href="mailto:fwang@igalia.com">
|
||||||
<link rel="help" href="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior">
|
<link rel="help" href="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior">
|
||||||
<link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box">
|
<link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box">
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>backdrop-filter: Should clip using border radius.</title>
|
|
||||||
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="circle outside"></div>
|
|
||||||
<div class="circle inside"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
|
||||||
div {
|
|
||||||
position: absolute;
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
top: 10px;
|
|
||||||
left: 10px;
|
|
||||||
background: green;
|
|
||||||
}
|
|
||||||
.circle {
|
|
||||||
top: 30px;
|
|
||||||
left: 30px;
|
|
||||||
border-radius: 50px;
|
|
||||||
background: #ffff0060;
|
|
||||||
}
|
|
||||||
.inside {
|
|
||||||
background: #ffaf9f;
|
|
||||||
clip-path: inset(0px 30px 30px 0px);
|
|
||||||
}
|
|
||||||
.outside {
|
|
||||||
background: #ffff9f;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,32 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>backdrop-filter: Should clip using border radius.</title>
|
|
||||||
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
|
|
||||||
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
|
|
||||||
<link rel="match" href="backdrop-filter-border-radius-ref.html">
|
|
||||||
|
|
||||||
<div style="opacity: 0.9999;">
|
|
||||||
<div class="circle filter"></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
|
||||||
div {
|
|
||||||
position: absolute;
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
top: 10px;
|
|
||||||
left: 10px;
|
|
||||||
background: green;
|
|
||||||
}
|
|
||||||
.circle {
|
|
||||||
top: 30px;
|
|
||||||
left: 30px;
|
|
||||||
border-radius: 50px;
|
|
||||||
background: #ffff0060;
|
|
||||||
}
|
|
||||||
.filter {
|
|
||||||
backdrop-filter: invert(1);
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Reftest Reference</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<style>
|
||||||
|
.flexbox {
|
||||||
|
border: 1px solid black;
|
||||||
|
margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
|
||||||
|
float: left; /* For testing in "rows" */
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
padding: 1px 2px 3px 4px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: pink;
|
||||||
|
}
|
||||||
|
|
||||||
|
br { clear: both; }
|
||||||
|
|
||||||
|
.flexbox > * {
|
||||||
|
/* Disable "min-width:auto"/"min-height:auto" to focus purely on
|
||||||
|
later channels of influence. */
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
|
||||||
|
|
||||||
|
<!-- Row 1: no special sizing: -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
height: 28px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 32px;
|
||||||
|
height: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
height: 28px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 3: min main-size OR min cross-size, or both -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 34px;
|
||||||
|
height: 32px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 36px;
|
||||||
|
height: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 36px;
|
||||||
|
height: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 34px;
|
||||||
|
height: 32px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 4: max main-size OR max cross-size, or both -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 16px;
|
||||||
|
height: 14px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 18px;
|
||||||
|
height: 16px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 16px;
|
||||||
|
height: 14px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 14px;
|
||||||
|
height: 12px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 5: min main-size vs. max cross-size, & vice versa -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 10px;
|
||||||
|
height: 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 10px;
|
||||||
|
height: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 10px;
|
||||||
|
height: 30px">
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,132 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>
|
||||||
|
CSS Test: Testing how explicit main-size & cross-size constraints
|
||||||
|
influence sizing on non-stretched flex item w/ intrinsic ratio,
|
||||||
|
some padding, and box-sizing:border-box.
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
|
||||||
|
<link rel="match" href="flexbox-intrinsic-ratio-007-ref.html">
|
||||||
|
<style>
|
||||||
|
.flexbox {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
border: 1px solid black;
|
||||||
|
margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
float: left; /* For testing in "rows" */
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
padding: 1px 2px 3px 4px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: pink;
|
||||||
|
}
|
||||||
|
|
||||||
|
br { clear: both; }
|
||||||
|
|
||||||
|
.flexbox > * {
|
||||||
|
/* Disable "min-width:auto"/"min-height:auto" to focus purely on
|
||||||
|
later channels of influence. */
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
|
||||||
|
|
||||||
|
<!-- Row 1: no special sizing: -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="height: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="flex: 0 0 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 3: min main-size OR min cross-size, or both -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-height: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 30px;
|
||||||
|
min-height: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 34px;
|
||||||
|
min-height: 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 4: max main-size OR max cross-size, or both -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 16px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-height: 16px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 20px;
|
||||||
|
max-height: 14px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 14px;
|
||||||
|
max-height: 20px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 5: min main-size vs. max cross-size, & vice versa -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 30px;
|
||||||
|
max-height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 10px;
|
||||||
|
min-height: 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 30px;
|
||||||
|
height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
max-height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 10px;
|
||||||
|
height: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 10px;
|
||||||
|
min-height: 30px">
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,134 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>
|
||||||
|
CSS Test: Testing how explicit main-size & cross-size constraints
|
||||||
|
influence sizing on non-stretched flex item w/ intrinsic ratio,
|
||||||
|
some padding, box-sizing:border-box, and a vertical writing-mode.
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
|
||||||
|
<link rel="match" href="flexbox-intrinsic-ratio-007-ref.html">
|
||||||
|
<style>
|
||||||
|
.flexbox {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
border: 1px solid black;
|
||||||
|
margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
float: left; /* For testing in "rows" */
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
padding: 1px 2px 3px 4px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: pink;
|
||||||
|
}
|
||||||
|
|
||||||
|
br { clear: both; }
|
||||||
|
|
||||||
|
.flexbox > * {
|
||||||
|
writing-mode: vertical-lr;
|
||||||
|
|
||||||
|
/* Disable "min-width:auto"/"min-height:auto" to focus purely on
|
||||||
|
later channels of influence. */
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
|
||||||
|
|
||||||
|
<!-- Row 1: no special sizing: -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="height: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="flex: 0 0 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 3: min main-size OR min cross-size, or both -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-height: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 30px;
|
||||||
|
min-height: 34px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 34px;
|
||||||
|
min-height: 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 4: max main-size OR max cross-size, or both -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 16px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-height: 16px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 20px;
|
||||||
|
max-height: 14px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 14px;
|
||||||
|
max-height: 20px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 5: min main-size vs. max cross-size, & vice versa -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 30px;
|
||||||
|
max-height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 10px;
|
||||||
|
min-height: 30px">
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="min-width: 30px;
|
||||||
|
height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 30px;
|
||||||
|
max-height: 10px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="max-width: 10px;
|
||||||
|
height: 30px">
|
||||||
|
</div>
|
||||||
|
<div class="flexbox">
|
||||||
|
<img src="support/solidblue.png" style="width: 10px;
|
||||||
|
min-height: 30px">
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -146,6 +146,8 @@
|
||||||
== flexbox-intrinsic-ratio-005v.html flexbox-intrinsic-ratio-005-ref.html
|
== flexbox-intrinsic-ratio-005v.html flexbox-intrinsic-ratio-005-ref.html
|
||||||
== flexbox-intrinsic-ratio-006.html flexbox-intrinsic-ratio-006-ref.html
|
== flexbox-intrinsic-ratio-006.html flexbox-intrinsic-ratio-006-ref.html
|
||||||
== flexbox-intrinsic-ratio-006v.html flexbox-intrinsic-ratio-006-ref.html
|
== flexbox-intrinsic-ratio-006v.html flexbox-intrinsic-ratio-006-ref.html
|
||||||
|
== flexbox-intrinsic-ratio-007.html flexbox-intrinsic-ratio-007-ref.html
|
||||||
|
== flexbox-intrinsic-ratio-007v.html flexbox-intrinsic-ratio-007-ref.html
|
||||||
|
|
||||||
# Test for definite and indefinite sizes.
|
# Test for definite and indefinite sizes.
|
||||||
== flexbox-definite-sizes-001.html flexbox-definite-sizes-001-ref.html
|
== flexbox-definite-sizes-001.html flexbox-definite-sizes-001-ref.html
|
||||||
|
|
|
@ -55,6 +55,26 @@ test(function() {
|
||||||
'<root attr="
"/>', '<root attr=" "/>']);
|
'<root attr="
"/>', '<root attr=" "/>']);
|
||||||
}, 'check XMLSerializer.serializeToString escapes attribute values for roundtripping');
|
}, 'check XMLSerializer.serializeToString escapes attribute values for roundtripping');
|
||||||
|
|
||||||
|
test(function() {
|
||||||
|
const input = '<root><child1/><child2/></root>';
|
||||||
|
const root = (new DOMParser()).parseFromString(input, 'text/xml').documentElement;
|
||||||
|
root.firstChild.setAttributeNS('uri1', 'attr1', 'value1');
|
||||||
|
root.firstChild.setAttributeNS('uri2', 'attr2', 'value2');
|
||||||
|
root.lastChild.setAttributeNS('uri3', 'attr3', 'value3');
|
||||||
|
const xmlString = (new XMLSerializer()).serializeToString(root);
|
||||||
|
assert_equals(xmlString, '<root><child1 xmlns:ns1="uri1" ns1:attr1="value1" xmlns:ns2="uri2" ns2:attr2="value2"/><child2 xmlns:ns3="uri3" ns3:attr3="value3"/></root>');
|
||||||
|
}, 'Check if generated prefixes match to "ns${index}".');
|
||||||
|
|
||||||
|
test(function() {
|
||||||
|
const input = '<root xmlns:ns2="uri2"><child xmlns:ns1="uri1"/></root>';
|
||||||
|
const root = (new DOMParser()).parseFromString(input, 'text/xml').documentElement;
|
||||||
|
root.firstChild.setAttributeNS('uri3', 'attr1', 'value1');
|
||||||
|
const xmlString = (new XMLSerializer()).serializeToString(root);
|
||||||
|
// According to 'DOM Parsing and Serialization' draft as of 2018-12-11,
|
||||||
|
// 'generate a prefix' result can conflict with an existing xmlns:ns* declaration.
|
||||||
|
assert_equals(xmlString, '<root xmlns:ns2="uri2"><child xmlns:ns1="uri1" xmlns:ns1="uri3" ns1:attr1="value1"/></root>');
|
||||||
|
}, 'Check if "ns1" is generated even if the element already has xmlns:ns1.');
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -16,5 +16,16 @@ test(function() {
|
||||||
matched.push(cur);
|
matched.push(cur);
|
||||||
}
|
}
|
||||||
assert_array_equals(matched, [document]);
|
assert_array_equals(matched, [document]);
|
||||||
|
// Evaluate again, but reuse result from previous evaluation.
|
||||||
|
result = document.evaluate("..", // expression
|
||||||
|
document.documentElement, // context node
|
||||||
|
null, // resolver
|
||||||
|
XPathResult.ANY_TYPE, // type
|
||||||
|
result); // result
|
||||||
|
matched = [];
|
||||||
|
while ((cur = result.iterateNext()) !== null) {
|
||||||
|
matched.push(cur);
|
||||||
|
}
|
||||||
|
assert_array_equals(matched, [document]);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -16,17 +16,20 @@
|
||||||
// We add the image during onload to be sure that the observer is registered
|
// We add the image during onload to be sure that the observer is registered
|
||||||
// in time for it to observe the element timing.
|
// in time for it to observe the element timing.
|
||||||
// TODO(npm): change observer to use buffered flag.
|
// TODO(npm): change observer to use buffered flag.
|
||||||
window.onload = () => {
|
window.onload = t.step_func(() => {
|
||||||
// Add a cross origin image resource.
|
// Add a cross origin image resource.
|
||||||
const img = document.createElement('img');
|
const img = document.createElement('img');
|
||||||
img.src =
|
img.src = 'http://{{domains[www]}}:{{ports[http][1]}}'
|
||||||
'http://localhost:8000/resources/square100.png';
|
+ '/element-timing/resources/square100.png';
|
||||||
|
img.setAttribute('elementtiming', 'my_image');
|
||||||
|
img.onload = t.step_func(() => {
|
||||||
|
t.step_timeout( () => {
|
||||||
|
// After some wait, assume observer did not receive the entry, so the test passes.
|
||||||
|
t.done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
document.body.appendChild(img);
|
document.body.appendChild(img);
|
||||||
};
|
});
|
||||||
t.step_timeout( () => {
|
|
||||||
// After some wait, assume observer did not receive the entry, so the test passes.
|
|
||||||
t.done();
|
|
||||||
}, 100);
|
|
||||||
}, 'Cross-origin image element is NOT observable.');
|
}, 'Cross-origin image element is NOT observable.');
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -16,17 +16,19 @@
|
||||||
// We add the iframe during onload to be sure that the observer is registered
|
// We add the iframe during onload to be sure that the observer is registered
|
||||||
// in time for it to observe the element timing.
|
// in time for it to observe the element timing.
|
||||||
// TODO(npm): change observer to use buffered flag.
|
// TODO(npm): change observer to use buffered flag.
|
||||||
window.onload = () => {
|
window.onload = t.step_func(() => {
|
||||||
// Add a cross origin iframe with an image.
|
// Add a cross origin iframe with an image.
|
||||||
const iframe = document.createElement('iframe');
|
const iframe = document.createElement('iframe');
|
||||||
iframe.src =
|
iframe.src = 'http://{{domains[www]}}:{{ports[http][1]}}'
|
||||||
'http://localhost:8000/performance-timing/element-resources/iframe-with-square.html';
|
+ '/element-timing/resources/iframe-with-square.html';
|
||||||
document.body.appendChild(iframe);
|
document.body.appendChild(iframe);
|
||||||
};
|
iframe.onload = t.step_func(() => {
|
||||||
t.step_timeout( () => {
|
t.step_timeout( () => {
|
||||||
// After some wait, assume observer did not receive the entry, so the test passes.
|
// After some wait, assume observer did not receive the entry, so the test passes.
|
||||||
t.done();
|
t.done();
|
||||||
}, 300);
|
}, 100);
|
||||||
|
});
|
||||||
|
});
|
||||||
}, 'Element from cross origin iframe is NOT observable.');
|
}, 'Element from cross origin iframe is NOT observable.');
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<meta charset=utf-8>
|
||||||
|
<title>Element Timing: observe elements from same-origin iframes</title>
|
||||||
|
<body>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="resources/element-timing-helpers.js"></script>
|
||||||
|
<script>
|
||||||
|
async_test((t) => {
|
||||||
|
let beforeRender;
|
||||||
|
const observer = new PerformanceObserver(
|
||||||
|
t.step_func_done((entryList) => {
|
||||||
|
assert_equals(entryList.getEntries().length, 1);
|
||||||
|
const entry = entryList.getEntries()[0];
|
||||||
|
checkElement(entry, 'my_image', beforeRender);
|
||||||
|
// Assume viewport has size at least 20, so the element is fully visible.
|
||||||
|
checkRect(entry, [0, 20, 0, 20]);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
observer.observe({entryTypes: ['element']});
|
||||||
|
// We add the image during onload to be sure that the observer is registered
|
||||||
|
// in time for it to observe the element timing.
|
||||||
|
// TODO(npm): change observer to use buffered flag.
|
||||||
|
window.onload = t.step_func(() => {
|
||||||
|
const img = document.createElement('img');
|
||||||
|
img.src = 'http://{{domains[www]}}:{{ports[http][1]}}/'
|
||||||
|
+ 'element-timing/resources/TAOImage.py?tao=wildcard';
|
||||||
|
img.setAttribute('elementtiming', 'my_image');
|
||||||
|
img.onload = t.step_func(() => {
|
||||||
|
// After a short delay, assume that the entry was not dispatched.
|
||||||
|
t.step_timeout(() => {
|
||||||
|
assert_unreached("Should have received an entry!");
|
||||||
|
t.done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
document.body.appendChild(img);
|
||||||
|
beforeRender = performance.now();
|
||||||
|
});
|
||||||
|
}, 'Cross-origin element with wildcard TAO is observed.');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
|
@ -11,15 +11,10 @@ body {
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
<script src="resources/element-timing-helpers.js"></script>
|
<script src="resources/element-timing-helpers.js"></script>
|
||||||
<script>
|
<script>
|
||||||
let beforeRender;
|
|
||||||
async_test((t) => {
|
async_test((t) => {
|
||||||
const observer = new PerformanceObserver(
|
const observer = new PerformanceObserver(
|
||||||
t.step_func_done((entryList) => {
|
t.step_func_done((entryList) => {
|
||||||
assert_equals(entryList.getEntries().length, 1);
|
assert_unreached("Should not have received an entry!");
|
||||||
const entry = entryList.getEntries()[0];
|
|
||||||
checkElement(entry, 'my_image', beforeRender);
|
|
||||||
// Assume viewport has size at least 100, so the element is fully visible.
|
|
||||||
checkRect(entry, [0, 100, 0, 100]);
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
observer.observe({entryTypes: ['element']});
|
observer.observe({entryTypes: ['element']});
|
||||||
|
@ -30,10 +25,16 @@ body {
|
||||||
// Add iframe with an image of width and height equal to 100.
|
// Add iframe with an image of width and height equal to 100.
|
||||||
const iframe = document.createElement('iframe');
|
const iframe = document.createElement('iframe');
|
||||||
iframe.src = 'resources/iframe-with-square.html';
|
iframe.src = 'resources/iframe-with-square.html';
|
||||||
|
iframe.onload = () => {
|
||||||
|
// After a short delay, assume that the entry was not dispatched to the
|
||||||
|
// parent frame.
|
||||||
|
t.step_timeout(() => {
|
||||||
|
t.done();
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
document.body.appendChild(iframe);
|
document.body.appendChild(iframe);
|
||||||
beforeRender = performance.now();
|
|
||||||
};
|
};
|
||||||
}, 'Element from same-origin iframe is observable.');
|
}, 'Element in child iframe is not observed, even if same-origin.');
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
def main(request, response):
|
||||||
|
origin = request.GET.first('origin', '');
|
||||||
|
if origin:
|
||||||
|
response.headers.set('Access-Control-Allow-Origin', origin)
|
||||||
|
|
||||||
|
tao = request.GET.first('tao')
|
||||||
|
|
||||||
|
if tao == 'wildcard':
|
||||||
|
# wildcard, pass
|
||||||
|
response.headers.set('Timing-Allow-Origin', '*')
|
||||||
|
elif tao == 'null':
|
||||||
|
# null, fail
|
||||||
|
response.headers.set('Timing-Allow-Origin', 'null')
|
||||||
|
elif tao == 'origin':
|
||||||
|
# case-sensitive match for origin, pass
|
||||||
|
response.headers.set('Timing-Allow-Origin', origin)
|
||||||
|
elif tao == 'space':
|
||||||
|
# space separated list of origin and wildcard, fail
|
||||||
|
response.headers.set('Timing-Allow-Origin', (origin + ' *'))
|
||||||
|
elif tao == 'multi':
|
||||||
|
# more than one TAO values, separated by comma, pass
|
||||||
|
response.headers.set('Timing-Allow-Origin', origin)
|
||||||
|
response.headers.append('Timing-Allow-Origin', '*')
|
||||||
|
elif tao == 'multi_wildcard':
|
||||||
|
# multiple wildcards, separated by comma, pass
|
||||||
|
response.headers.set('Timing-Allow-Origin', '*')
|
||||||
|
response.headers.append('Timing-Allow-Origin', '*')
|
||||||
|
elif tao == 'match_origin':
|
||||||
|
# contains a match of origin, separated by comma, pass
|
||||||
|
response.headers.set('Timing-Allow-Origin', origin)
|
||||||
|
response.headers.append('Timing-Allow-Origin', "fake")
|
||||||
|
elif tao == 'match_wildcard':
|
||||||
|
# contains a wildcard, separated by comma, pass
|
||||||
|
response.headers.set('Timing-Allow-Origin', "fake")
|
||||||
|
response.headers.append('Timing-Allow-Origin', '*')
|
||||||
|
elif tao == 'uppercase':
|
||||||
|
# non-case-sensitive match for origin, fail
|
||||||
|
response.headers.set('Timing-Allow-Origin', origin.upper())
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
response.headers.set("Cache-Control", "no-cache, must-revalidate");
|
||||||
|
image_path = os.path.join(os.path.dirname(__file__), "square20.png");
|
||||||
|
response.content = open(image_path, mode='rb').read();
|
|
@ -26,6 +26,29 @@ onload = function() {
|
||||||
return 'expected substring '+expected+' got '+got;
|
return 'expected substring '+expected+' got '+got;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function poll_for_stash(test_obj, uuid, expected) {
|
||||||
|
var start = new Date();
|
||||||
|
var poll = test_obj.step_func(function () {
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('GET', stash_take + uuid);
|
||||||
|
xhr.onload = test_obj.step_func(function(e) {
|
||||||
|
if (xhr.response == "") {
|
||||||
|
if (new Date() - start > 10000) {
|
||||||
|
// If we set the status to TIMEOUT here we avoid a race between the
|
||||||
|
// page and the test timing out
|
||||||
|
test_obj.force_timeout();
|
||||||
|
}
|
||||||
|
test_obj.step_timeout(poll, 200);
|
||||||
|
} else {
|
||||||
|
assert_equals(xhr.response, expected);
|
||||||
|
test_obj.done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
xhr.send();
|
||||||
|
})
|
||||||
|
test_obj.step_timeout(poll, 200);
|
||||||
|
}
|
||||||
|
|
||||||
// loading html (or actually svg to support <embed>)
|
// loading html (or actually svg to support <embed>)
|
||||||
function test_load_nested_browsing_context(tag, attr, spec_url) {
|
function test_load_nested_browsing_context(tag, attr, spec_url) {
|
||||||
async_test(function() {
|
async_test(function() {
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<link rel="author" title="Dom Farolino" href="mailto:dom@chromium.org">
|
|
||||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-link-element">
|
|
||||||
<script src="/resources/testharness.js"></script>
|
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
|
||||||
<link id=link rel=stylesheet id=style_test
|
|
||||||
onload="t.unreached_func('Sheet should fail to load')">
|
|
||||||
<script>
|
|
||||||
var t = async_test("Check if the <link>'s error event fires for each style " +
|
|
||||||
"sheet it fails to load");
|
|
||||||
|
|
||||||
link.onerror = t.step_func(() => {
|
|
||||||
link.onerror = t.step_func_done(() => {});
|
|
||||||
link.href = 'nonexistent.css?second';
|
|
||||||
});
|
|
||||||
|
|
||||||
link.href = 'nonexistent.css?first';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
</html>
|
|
|
@ -1,21 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<link rel="author" title="Dom Farolino" href="mailto:dom@chromium.org">
|
|
||||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-link-element">
|
|
||||||
<script src="/resources/testharness.js"></script>
|
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
|
||||||
<link id=link rel=stylesheet id=style_test
|
|
||||||
onerror="t.unreached_func('Sheet should load successfully')">
|
|
||||||
<script>
|
|
||||||
var t = async_test("Check if the <link>'s load event fires for each style " +
|
|
||||||
"sheet it loads");
|
|
||||||
|
|
||||||
link.onload = t.step_func(() => {
|
|
||||||
link.onload = t.step_func_done(() => {});
|
|
||||||
link.href = 'style.css?second';
|
|
||||||
});
|
|
||||||
|
|
||||||
link.href = 'style.css?first';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
</html>
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
<!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>
|
||||||
|
<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.style = "display: block";
|
||||||
|
} else if (e.data == "resume") {
|
||||||
|
assert_true(loaded);
|
||||||
|
assert_true(frozen);
|
||||||
|
t.done();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
child.src = "resources/subframe.html";
|
||||||
|
document.body.appendChild(child);
|
||||||
|
child.style = "display: none";
|
||||||
|
}, "Child frame frozen");
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<script>
|
||||||
|
window.addEventListener('load', () => {
|
||||||
|
window.parent.postMessage('load');
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('freeze', () => {
|
||||||
|
window.parent.postMessage('freeze');
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('resume', () => {
|
||||||
|
window.parent.postMessage('resume');
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
|
@ -19,6 +19,9 @@ idl_test(
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
observer.observe({ entryTypes: ['paint'] });
|
observer.observe({ entryTypes: ['paint'] });
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.innerHTML = 'Hello World';
|
||||||
|
document.body.appendChild(div);
|
||||||
});
|
});
|
||||||
const timeout = new Promise((_, reject) => {
|
const timeout = new Promise((_, reject) => {
|
||||||
t.step_timeout(() => reject('Timed out waiting for paint event'), 3000);
|
t.step_timeout(() => reject('Timed out waiting for paint event'), 3000);
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Manual tests for PaymentRequest.abort() method</title>
|
||||||
|
<link rel="help" href="https://w3c.github.io/payment-request/#abort-method">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
setup({
|
||||||
|
explicit_done: true,
|
||||||
|
explicit_timeout: true,
|
||||||
|
});
|
||||||
|
const basicCard = Object.freeze({ supportedMethods: "basic-card" });
|
||||||
|
const applePay = Object.freeze({
|
||||||
|
supportedMethods: "https://apple.com/apple-pay",
|
||||||
|
data: {
|
||||||
|
version: 3,
|
||||||
|
merchantIdentifier: "merchant.com.example",
|
||||||
|
countryCode: "US",
|
||||||
|
merchantCapabilities: ["supports3DS"],
|
||||||
|
supportedNetworks: ["visa"],
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const defaultMethods = Object.freeze([basicCard, applePay]);
|
||||||
|
const defaultDetails = Object.freeze({
|
||||||
|
total: {
|
||||||
|
label: "Total",
|
||||||
|
amount: {
|
||||||
|
currency: "USD",
|
||||||
|
value: "1.00",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function testShowSameRequestMultipleTimes() {
|
||||||
|
promise_test(async t => {
|
||||||
|
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
|
const acceptPromise = request.show()
|
||||||
|
try {
|
||||||
|
await request.abort();
|
||||||
|
} catch (err) {
|
||||||
|
assert_unreached("Unexpected promise rejection: " + err.message);
|
||||||
|
}
|
||||||
|
await promise_rejects(t, "AbortError", acceptPromise);
|
||||||
|
// As request is now "closed", trying to show it will fail
|
||||||
|
await promise_rejects(t, "InvalidStateError", request.show());
|
||||||
|
}, "The same request cannot be shown multiple times.");
|
||||||
|
}
|
||||||
|
|
||||||
|
function testAbortBeforeShow() {
|
||||||
|
promise_test(async t => {
|
||||||
|
// request is in "created" state.
|
||||||
|
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
|
await promise_rejects(t, "InvalidStateError", request.abort());
|
||||||
|
// Call it again, for good measure.
|
||||||
|
await promise_rejects(t, "InvalidStateError", request.abort());
|
||||||
|
// The request's state is "created", so let's show it
|
||||||
|
// which changes the state to "interactive.".
|
||||||
|
const acceptPromise = request.show()
|
||||||
|
// Let's set request the state to "closed" by calling .abort()
|
||||||
|
try {
|
||||||
|
await request.abort();
|
||||||
|
} catch (err) {
|
||||||
|
assert_unreached("Unexpected promise rejection: " + err.message);
|
||||||
|
}
|
||||||
|
// The request is now "closed", so...
|
||||||
|
await promise_rejects(t, "InvalidStateError", request.abort());
|
||||||
|
await promise_rejects(t, "AbortError", acceptPromise);
|
||||||
|
}, "Aborting a request before it is shown doesn't prevent it from being shown later.");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<h2>Manual tests for PaymentRequest.abort() method</h2>
|
||||||
|
<p>
|
||||||
|
Click on each button in sequence from top to bottom without refreshing the
|
||||||
|
page. Each button will bring up the Payment Request UI window and then will
|
||||||
|
close it automatically. (If a payment sheet stays open, the test has failed.)
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<button onclick="testShowSameRequestMultipleTimes()">
|
||||||
|
The same request cannot be shown multiple times.
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button onclick="testAbortBeforeShow()">
|
||||||
|
Aborting a request before it is shown doesn't prevent it from being shown
|
||||||
|
later.
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li><button onclick="done()">Done!</button></li>
|
||||||
|
</ol>
|
||||||
|
<small>
|
||||||
|
If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
|
||||||
|
and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
|
||||||
|
</small>
|
|
@ -1,11 +1,11 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Test for PaymentRequest.abort() method</title>
|
<title>Test for PaymentRequest.abort() method</title>
|
||||||
<link rel="help" href="https://w3c.github.io/browser-payment-api/#abort-method">
|
<link rel="help" href="https://w3c.github.io/payment-request/#abort-method">
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
<script src='/resources/testdriver-vendor.js'></script>
|
|
||||||
<script src="/resources/testdriver.js"></script>
|
<script src="/resources/testdriver.js"></script>
|
||||||
|
<script src='/resources/testdriver-vendor.js'></script>
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
setup({
|
setup({
|
||||||
|
@ -42,47 +42,13 @@ promise_test(async t => {
|
||||||
await promise_rejects(t, "InvalidStateError", request.abort());
|
await promise_rejects(t, "InvalidStateError", request.abort());
|
||||||
}, `Throws if the promise [[state]] is not "interactive"`);
|
}, `Throws if the promise [[state]] is not "interactive"`);
|
||||||
|
|
||||||
promise_test(async t => {
|
|
||||||
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
|
||||||
const acceptPromise = test_driver.bless("show payment request", () =>
|
|
||||||
request.show()
|
|
||||||
);
|
|
||||||
try {
|
|
||||||
await request.abort();
|
|
||||||
} catch (err) {
|
|
||||||
assert_unreached("Unexpected promise rejection: " + err.message);
|
|
||||||
}
|
|
||||||
await promise_rejects(t, "AbortError", acceptPromise);
|
|
||||||
// As request is now "closed", trying to show it will fail
|
|
||||||
await promise_rejects(t, "InvalidStateError", request.show());
|
|
||||||
}, "The same request cannot be shown multiple times.");
|
|
||||||
|
|
||||||
promise_test(async t => {
|
|
||||||
// request is in "created" state.
|
|
||||||
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
|
||||||
await promise_rejects(t, "InvalidStateError", request.abort());
|
|
||||||
// Call it again, for good measure.
|
|
||||||
await promise_rejects(t, "InvalidStateError", request.abort());
|
|
||||||
// The request's state is "created", so let's show it
|
|
||||||
// which changes the state to "interactive.".
|
|
||||||
const acceptPromise = test_driver.bless("show payment request", () =>
|
|
||||||
request.show()
|
|
||||||
);
|
|
||||||
// Let's set request the state to "closed" by calling .abort()
|
|
||||||
try {
|
|
||||||
await request.abort();
|
|
||||||
} catch (err) {
|
|
||||||
assert_unreached("Unexpected promise rejection: " + err.message);
|
|
||||||
}
|
|
||||||
// The request is now "closed", so...
|
|
||||||
await promise_rejects(t, "InvalidStateError", request.abort());
|
|
||||||
await promise_rejects(t, "AbortError", acceptPromise);
|
|
||||||
}, "Aborting a request before it is shown doesn't prevent it from being shown later.");
|
|
||||||
|
|
||||||
promise_test(async t => {
|
promise_test(async t => {
|
||||||
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
const promises = new Set([request.abort(), request.abort(), request.abort()]);
|
const promises = new Set([request.abort(), request.abort(), request.abort()]);
|
||||||
assert_equals(promises.size, 3, "Must have three unique objects");
|
assert_equals(promises.size, 3, "Must have three unique objects");
|
||||||
}, "Calling abort() multiple times is always a new object.");
|
}, "Calling abort() multiple times is always a new object.");
|
||||||
</script>
|
</script>
|
||||||
|
<small>
|
||||||
|
If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
|
||||||
|
and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
|
||||||
|
</small>
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Manual test for multiple PaymentRequest.show()</title>
|
||||||
|
<link rel="help" href="https://w3c.github.io/payment-request/#show-method">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
setup({
|
||||||
|
allow_uncaught_exception: true,
|
||||||
|
});
|
||||||
|
const defaultMethods = Object.freeze([
|
||||||
|
{ supportedMethods: "basic-card" },
|
||||||
|
{
|
||||||
|
supportedMethods: "https://apple.com/apple-pay",
|
||||||
|
data: {
|
||||||
|
version: 3,
|
||||||
|
merchantIdentifier: "merchant.com.example",
|
||||||
|
countryCode: "US",
|
||||||
|
merchantCapabilities: ["supports3DS"],
|
||||||
|
supportedNetworks: ["visa"],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
const defaultDetails = Object.freeze({
|
||||||
|
total: {
|
||||||
|
label: "Total",
|
||||||
|
amount: {
|
||||||
|
currency: "USD",
|
||||||
|
value: "1.00",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function testCallingShowMultipleTimes() {
|
||||||
|
promise_test(async t => {
|
||||||
|
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
|
const p1 = request.show();
|
||||||
|
const p2 = request.show();
|
||||||
|
const p3 = request.show();
|
||||||
|
const promises = new Set([p1, p2, p3]);
|
||||||
|
await request.abort();
|
||||||
|
assert_equals(promises.size, 3, "Must have three unique objects");
|
||||||
|
await promise_rejects(t, "AbortError", p1);
|
||||||
|
await promise_rejects(t, "InvalidStateError", p2);
|
||||||
|
await promise_rejects(t, "InvalidStateError", p3);
|
||||||
|
}, "Calling show() multiple times is always a new object.");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<h2>Manual test for multiple PaymentRequest.show()</h2>
|
||||||
|
<p>
|
||||||
|
Click on the button to bring up the Payment Request UI window and then will
|
||||||
|
close it automatically. (If a payment sheet stays open, the test has failed.)
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<button onclick="testCallingShowMultipleTimes()">
|
||||||
|
Calling show() multiple times is always a new object.
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<small>
|
||||||
|
If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
|
||||||
|
and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
|
||||||
|
</small>
|
|
@ -0,0 +1,97 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Manual tests for PaymentRequest.show() method</title>
|
||||||
|
<link rel="help" href="https://w3c.github.io/payment-request/#show-method">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
setup({
|
||||||
|
explicit_done: true,
|
||||||
|
explicit_timeout: true,
|
||||||
|
});
|
||||||
|
const defaultMethods = Object.freeze([
|
||||||
|
{ supportedMethods: "basic-card" },
|
||||||
|
{
|
||||||
|
supportedMethods: "https://apple.com/apple-pay",
|
||||||
|
data: {
|
||||||
|
version: 3,
|
||||||
|
merchantIdentifier: "merchant.com.example",
|
||||||
|
countryCode: "US",
|
||||||
|
merchantCapabilities: ["supports3DS"],
|
||||||
|
supportedNetworks: ["visa"],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
const defaultDetails = Object.freeze({
|
||||||
|
total: {
|
||||||
|
label: "Total",
|
||||||
|
amount: {
|
||||||
|
currency: "USD",
|
||||||
|
value: "1.00",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function testThrowsIfStateIsNotCreated() {
|
||||||
|
promise_test(async t => {
|
||||||
|
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
|
const acceptPromise = request.show(); // Sets state to "interactive"
|
||||||
|
await promise_rejects(t, "InvalidStateError", request.show());
|
||||||
|
await request.abort();
|
||||||
|
await promise_rejects(t, "AbortError", acceptPromise);
|
||||||
|
}, "Throws if the promise [[state]] is not 'created'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
function testPaymentRequestIsShowingBoolean() {
|
||||||
|
promise_test(async t => {
|
||||||
|
const request1 = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
|
const request2 = new PaymentRequest(defaultMethods, defaultDetails);
|
||||||
|
const acceptPromise1 = request1.show();
|
||||||
|
const acceptPromise2 = request2.show();
|
||||||
|
await promise_rejects(t, "AbortError", acceptPromise2);
|
||||||
|
await request1.abort();
|
||||||
|
await promise_rejects(t, "AbortError", acceptPromise1);
|
||||||
|
}, `If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testNotSupportedError() {
|
||||||
|
promise_test(async t => {
|
||||||
|
const request = new PaymentRequest(
|
||||||
|
[{ supportedMethods: "this-is-not-supported" }],
|
||||||
|
defaultDetails
|
||||||
|
);
|
||||||
|
const acceptPromise = request.show();
|
||||||
|
await promise_rejects(t, "NotSupportedError", acceptPromise);
|
||||||
|
}, `If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.`);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<h2>Manual tests for PaymentRequest.show() method</h2>
|
||||||
|
<p>
|
||||||
|
Click on each button in sequence from top to bottom without refreshing the
|
||||||
|
page. Each button will bring up the Payment Request UI window and then will
|
||||||
|
close it automatically. (If a payment sheet stays open, the test has failed.)
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<button onclick="testThrowsIfStateIsNotCreated()">
|
||||||
|
Throws if the promise [[state]] is not 'created'.
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button onclick="testPaymentRequestIsShowingBoolean()">
|
||||||
|
If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button onclick="testNotSupportedError()">
|
||||||
|
If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li><button onclick="done()">Done!</button></li>
|
||||||
|
</ol>
|
||||||
|
<small>
|
||||||
|
If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
|
||||||
|
and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
|
||||||
|
</small>
|
|
@ -1,11 +1,9 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Test for PaymentRequest.show() method</title>
|
<title>Test for PaymentRequest.show() method</title>
|
||||||
<link rel="help" href="https://w3c.github.io/browser-payment-api/#show-method">
|
<link rel="help" href="https://w3c.github.io/payment-request/#show-method">
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
<script src="/resources/testdriver.js"></script>
|
|
||||||
<script src="/resources/testdriver-vendor.js"></script>
|
|
||||||
<script>
|
<script>
|
||||||
"use strict";
|
"use strict";
|
||||||
const defaultMethods = Object.freeze([
|
const defaultMethods = Object.freeze([
|
||||||
|
@ -37,51 +35,6 @@ promise_test(async t => {
|
||||||
const acceptPromise = request.show();
|
const acceptPromise = request.show();
|
||||||
await promise_rejects(t, "SecurityError", acceptPromise);
|
await promise_rejects(t, "SecurityError", acceptPromise);
|
||||||
}, `Calling show() without being triggered by user interaction throws`);
|
}, `Calling show() without being triggered by user interaction throws`);
|
||||||
|
|
||||||
promise_test(t => {
|
|
||||||
return test_driver.bless("show payment request", async () => {
|
|
||||||
const request = new PaymentRequest(defaultMethods, defaultDetails);
|
|
||||||
const acceptPromise = request.show(); // Sets state to "interactive"
|
|
||||||
await promise_rejects(t, "InvalidStateError", request.show());
|
|
||||||
await request.abort();
|
|
||||||
await promise_rejects(t, "AbortError", acceptPromise);
|
|
||||||
});
|
|
||||||
}, "Throws if the promise [[state]] is not 'created'.");
|
|
||||||
|
|
||||||
promise_test(t => {
|
|
||||||
return test_driver.bless("show payment request", async () => {
|
|
||||||
const request1 = new PaymentRequest(defaultMethods, defaultDetails);
|
|
||||||
const request2 = new PaymentRequest(defaultMethods, defaultDetails);
|
|
||||||
const acceptPromise1 = request1.show();
|
|
||||||
const acceptPromise2 = request2.show();
|
|
||||||
await promise_rejects(t, "AbortError", acceptPromise2);
|
|
||||||
await request1.abort();
|
|
||||||
await promise_rejects(t, "AbortError", acceptPromise1);
|
|
||||||
});
|
|
||||||
}, `If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.`);
|
|
||||||
|
|
||||||
promise_test(t => {
|
|
||||||
return test_driver.bless("show payment request", async () => {
|
|
||||||
const request = new PaymentRequest(
|
|
||||||
[{ supportedMethods: "this-is-not-supported" }],
|
|
||||||
defaultDetails
|
|
||||||
);
|
|
||||||
const acceptPromise = request.show();
|
|
||||||
await promise_rejects(t, "NotSupportedError", acceptPromise);
|
|
||||||
});
|
|
||||||
}, `If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.`);
|
|
||||||
|
|
||||||
promise_test(t => {
|
|
||||||
return test_driver.bless("show payment request", async () => {
|
|
||||||
const request = new PaymentRequest(
|
|
||||||
[{ supportedMethods: "basic-card" }],
|
|
||||||
defaultDetails
|
|
||||||
);
|
|
||||||
const promises = new Set([request.show(), request.show(), request.show()]);
|
|
||||||
await request.abort();
|
|
||||||
assert_equals(promises.size, 3, "Must have three unique objects");
|
|
||||||
});
|
|
||||||
}, "Calling show() multiple times is always a new object.");
|
|
||||||
</script>
|
</script>
|
||||||
<small>
|
<small>
|
||||||
If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
|
If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
|
||||||
|
|
|
@ -16,4 +16,13 @@ promise_test(async t => {
|
||||||
await promise_rejects(t, 'NotAllowedError', video2.requestPictureInPicture());
|
await promise_rejects(t, 'NotAllowedError', video2.requestPictureInPicture());
|
||||||
return promise;
|
return promise;
|
||||||
}, 'request Picture-in-Picture consumes user gesture');
|
}, 'request Picture-in-Picture consumes user gesture');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const video1 = await loadVideo();
|
||||||
|
const video2 = await loadVideo();
|
||||||
|
await test_driver.bless('request Picture-in-Picture');
|
||||||
|
await video1.requestPictureInPicture();
|
||||||
|
assert_equals(document.pictureInPictureElement, video1);
|
||||||
|
return video2.requestPictureInPicture();
|
||||||
|
}, 'request Picture-in-Picture does not require user gesture if document.pictureInPictureElement is set');
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,340 @@
|
||||||
|
// META: global=worker,jsshell
|
||||||
|
// META: script=../resources/rs-utils.js
|
||||||
|
// META: script=../resources/test-utils.js
|
||||||
|
// META: script=../resources/recording-streams.js
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_equals(ReadableStream.prototype[Symbol.asyncIterator], ReadableStream.prototype.getIterator);
|
||||||
|
}, '@@asyncIterator() method is === to getIterator() method');
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const s = new ReadableStream();
|
||||||
|
const it = s.getIterator();
|
||||||
|
const proto = Object.getPrototypeOf(it);
|
||||||
|
|
||||||
|
const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(async function* () {}).prototype);
|
||||||
|
assert_equals(Object.getPrototypeOf(proto), AsyncIteratorPrototype, 'prototype should extend AsyncIteratorPrototype');
|
||||||
|
|
||||||
|
const methods = ['next', 'return'].sort();
|
||||||
|
assert_array_equals(Object.getOwnPropertyNames(proto).sort(), methods, 'should have all the correct methods');
|
||||||
|
|
||||||
|
for (const m of methods) {
|
||||||
|
const propDesc = Object.getOwnPropertyDescriptor(proto, m);
|
||||||
|
assert_false(propDesc.enumerable, 'method should be non-enumerable');
|
||||||
|
assert_true(propDesc.configurable, 'method should be configurable');
|
||||||
|
assert_true(propDesc.writable, 'method should be writable');
|
||||||
|
assert_equals(typeof it[m], 'function', 'method should be a function');
|
||||||
|
assert_equals(it[m].name, m, 'method should have the correct name');
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_equals(it.next.length, 0, 'next should have no parameters');
|
||||||
|
assert_equals(it.return.length, 1, 'return should have 1 parameter');
|
||||||
|
assert_equals(typeof it.throw, 'undefined', 'throw should not exist');
|
||||||
|
}, 'Async iterator instances should have the correct list of properties');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(1);
|
||||||
|
c.enqueue(2);
|
||||||
|
c.enqueue(3);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of s) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}
|
||||||
|
assert_array_equals(chunks, [1, 2, 3]);
|
||||||
|
}, 'Async-iterating a push source');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
let i = 1;
|
||||||
|
const s = new ReadableStream({
|
||||||
|
pull(c) {
|
||||||
|
c.enqueue(i);
|
||||||
|
if (i >= 3) {
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of s) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}
|
||||||
|
assert_array_equals(chunks, [1, 2, 3]);
|
||||||
|
}, 'Async-iterating a pull source');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
let i = 1;
|
||||||
|
const s = recordingReadableStream({
|
||||||
|
pull(c) {
|
||||||
|
c.enqueue(i);
|
||||||
|
if (i >= 3) {
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
},
|
||||||
|
}, new CountQueuingStrategy({ highWaterMark: 0 }));
|
||||||
|
|
||||||
|
const it = s.getIterator();
|
||||||
|
assert_array_equals(s.events, []);
|
||||||
|
|
||||||
|
const read1 = await it.next();
|
||||||
|
assert_equals(read1.done, false);
|
||||||
|
assert_equals(read1.value, 1);
|
||||||
|
assert_array_equals(s.events, ['pull']);
|
||||||
|
|
||||||
|
const read2 = await it.next();
|
||||||
|
assert_equals(read2.done, false);
|
||||||
|
assert_equals(read2.value, 2);
|
||||||
|
assert_array_equals(s.events, ['pull', 'pull']);
|
||||||
|
|
||||||
|
const read3 = await it.next();
|
||||||
|
assert_equals(read3.done, false);
|
||||||
|
assert_equals(read3.value, 3);
|
||||||
|
assert_array_equals(s.events, ['pull', 'pull', 'pull']);
|
||||||
|
|
||||||
|
const read4 = await it.next();
|
||||||
|
assert_equals(read4.done, true);
|
||||||
|
assert_equals(read4.value, undefined);
|
||||||
|
assert_array_equals(s.events, ['pull', 'pull', 'pull']);
|
||||||
|
}, 'Async-iterating a pull source manually');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.error('e');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
for await (const chunk of s) {}
|
||||||
|
assert_unreached();
|
||||||
|
} catch (e) {
|
||||||
|
assert_equals(e, 'e');
|
||||||
|
}
|
||||||
|
}, 'Async-iterating an errored stream throws');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for await (const chunk of s) {
|
||||||
|
assert_unreached();
|
||||||
|
}
|
||||||
|
}, 'Async-iterating a closed stream never executes the loop body, but works fine');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream();
|
||||||
|
|
||||||
|
const loop = async () => {
|
||||||
|
for await (const chunk of s) {
|
||||||
|
assert_unreached();
|
||||||
|
}
|
||||||
|
assert_unreached();
|
||||||
|
};
|
||||||
|
|
||||||
|
await Promise.race([
|
||||||
|
loop(),
|
||||||
|
flushAsyncEvents()
|
||||||
|
]);
|
||||||
|
}, 'Async-iterating an empty but not closed/errored stream never executes the loop body and stalls the async function');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(1);
|
||||||
|
c.enqueue(2);
|
||||||
|
c.enqueue(3);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const reader = s.getReader();
|
||||||
|
const readResult = await reader.read();
|
||||||
|
assert_equals(readResult.done, false);
|
||||||
|
assert_equals(readResult.value, 1);
|
||||||
|
reader.releaseLock();
|
||||||
|
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of s) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}
|
||||||
|
assert_array_equals(chunks, [2, 3]);
|
||||||
|
}, 'Async-iterating a partially consumed stream');
|
||||||
|
|
||||||
|
for (const type of ['throw', 'break', 'return']) {
|
||||||
|
for (const preventCancel of [false, true]) {
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = recordingReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// use a separate function for the loop body so return does not stop the test
|
||||||
|
const loop = async () => {
|
||||||
|
for await (const c of s.getIterator({ preventCancel })) {
|
||||||
|
if (type === 'throw') {
|
||||||
|
throw new Error();
|
||||||
|
} else if (type === 'break') {
|
||||||
|
break;
|
||||||
|
} else if (type === 'return') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await loop();
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
if (preventCancel) {
|
||||||
|
assert_array_equals(s.events, ['pull'], `cancel() should not be called`);
|
||||||
|
} else {
|
||||||
|
assert_array_equals(s.events, ['pull', 'cancel', undefined], `cancel() should be called`);
|
||||||
|
}
|
||||||
|
}, `Cancellation behavior when ${type}ing inside loop body; preventCancel = ${preventCancel}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const preventCancel of [false, true]) {
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = recordingReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const it = s.getIterator({ preventCancel });
|
||||||
|
await it.return();
|
||||||
|
|
||||||
|
if (preventCancel) {
|
||||||
|
assert_array_equals(s.events, [], `cancel() should not be called`);
|
||||||
|
} else {
|
||||||
|
assert_array_equals(s.events, ['cancel', undefined], `cancel() should be called`);
|
||||||
|
}
|
||||||
|
}, `Cancellation behavior when manually calling return(); preventCancel = ${preventCancel}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream();
|
||||||
|
const it = s[Symbol.asyncIterator]();
|
||||||
|
await it.return();
|
||||||
|
try {
|
||||||
|
await it.return();
|
||||||
|
assert_unreached();
|
||||||
|
} catch (e) {}
|
||||||
|
}, 'Calling return() twice rejects');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(0);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const it = s[Symbol.asyncIterator]();
|
||||||
|
const next = await it.next();
|
||||||
|
assert_equals(Object.getPrototypeOf(next), Object.prototype);
|
||||||
|
assert_array_equals(Object.getOwnPropertyNames(next).sort(), ['done', 'value']);
|
||||||
|
}, 'next()\'s fulfillment value has the right shape');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const s = recordingReadableStream();
|
||||||
|
const it = s[Symbol.asyncIterator]();
|
||||||
|
it.next();
|
||||||
|
|
||||||
|
await promise_rejects(t, new TypeError(), it.return(), 'return() should reject');
|
||||||
|
assert_array_equals(s.events, ['pull']);
|
||||||
|
}, 'calling return() while there are pending reads rejects');
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(0);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const it = s.getIterator();
|
||||||
|
assert_throws(new TypeError(), () => s.getIterator(), 'getIterator() should throw');
|
||||||
|
}, 'getIterator() throws if there\'s already a lock');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(1);
|
||||||
|
c.enqueue(2);
|
||||||
|
c.enqueue(3);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of s) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}
|
||||||
|
assert_array_equals(chunks, [1, 2, 3]);
|
||||||
|
|
||||||
|
const reader = s.getReader();
|
||||||
|
await reader.closed;
|
||||||
|
}, 'Acquiring a reader after exhaustively async-iterating a stream');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(1);
|
||||||
|
c.enqueue(2);
|
||||||
|
c.enqueue(3);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// read the first two chunks, then cancel
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of s) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
if (chunk >= 2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert_array_equals(chunks, [1, 2]);
|
||||||
|
|
||||||
|
const reader = s.getReader();
|
||||||
|
await reader.closed;
|
||||||
|
}, 'Acquiring a reader after partially async-iterating a stream');
|
||||||
|
|
||||||
|
promise_test(async () => {
|
||||||
|
const s = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(1);
|
||||||
|
c.enqueue(2);
|
||||||
|
c.enqueue(3);
|
||||||
|
c.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// read the first two chunks, then release lock
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of s.getIterator({preventCancel: true})) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
if (chunk >= 2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert_array_equals(chunks, [1, 2]);
|
||||||
|
|
||||||
|
const reader = s.getReader();
|
||||||
|
const readResult = await reader.read();
|
||||||
|
assert_equals(readResult.done, false, 'should not be closed yet');
|
||||||
|
assert_equals(readResult.value, 3, 'should read remaining chunk');
|
||||||
|
await reader.closed;
|
||||||
|
}, 'Acquiring a reader and reading the remaining chunks after partially async-iterating a stream with preventCancel = true');
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
let ReadableStreamDefaultReader;
|
let ReadableStreamDefaultReader;
|
||||||
let ReadableStreamDefaultController;
|
let ReadableStreamDefaultController;
|
||||||
|
let ReadableStreamAsyncIteratorPrototype;
|
||||||
|
|
||||||
test(() => {
|
test(() => {
|
||||||
|
|
||||||
|
@ -23,6 +24,13 @@ test(() => {
|
||||||
|
|
||||||
}, 'Can get the ReadableStreamDefaultController constructor indirectly');
|
}, 'Can get the ReadableStreamDefaultController constructor indirectly');
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
|
||||||
|
const rs = new ReadableStream();
|
||||||
|
ReadableStreamAsyncIteratorPrototype = Object.getPrototypeOf(rs.getIterator());
|
||||||
|
|
||||||
|
}, 'Can get ReadableStreamAsyncIteratorPrototype object indirectly');
|
||||||
|
|
||||||
function fakeRS() {
|
function fakeRS() {
|
||||||
return Object.setPrototypeOf({
|
return Object.setPrototypeOf({
|
||||||
cancel() { return Promise.resolve(); },
|
cancel() { return Promise.resolve(); },
|
||||||
|
@ -68,6 +76,13 @@ function realRSDefaultController() {
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function fakeRSAsyncIterator() {
|
||||||
|
return Object.setPrototypeOf({
|
||||||
|
next() { },
|
||||||
|
return(value = undefined) { }
|
||||||
|
}, ReadableStreamAsyncIteratorPrototype);
|
||||||
|
}
|
||||||
|
|
||||||
promise_test(t => {
|
promise_test(t => {
|
||||||
|
|
||||||
return methodRejectsForAll(t, ReadableStream.prototype, 'cancel',
|
return methodRejectsForAll(t, ReadableStream.prototype, 'cancel',
|
||||||
|
@ -157,3 +172,17 @@ test(() => {
|
||||||
[fakeRSDefaultController(), realRS(), realRSDefaultReader(), undefined, null]);
|
[fakeRSDefaultController(), realRS(), realRSDefaultReader(), undefined, null]);
|
||||||
|
|
||||||
}, 'ReadableStreamDefaultController.prototype.error enforces a brand check');
|
}, 'ReadableStreamDefaultController.prototype.error enforces a brand check');
|
||||||
|
|
||||||
|
promise_test(t => {
|
||||||
|
|
||||||
|
return methodRejectsForAll(t, ReadableStreamAsyncIteratorPrototype, 'next',
|
||||||
|
[fakeRSAsyncIterator(), realRS(), realRSDefaultReader(), undefined, null]);
|
||||||
|
|
||||||
|
}, 'ReadableStreamAsyncIteratorPrototype.next enforces a brand check');
|
||||||
|
|
||||||
|
promise_test(t => {
|
||||||
|
|
||||||
|
return methodRejectsForAll(t, ReadableStreamAsyncIteratorPrototype, 'return',
|
||||||
|
[fakeRSAsyncIterator(), realRS(), realRSDefaultReader(), undefined, null]);
|
||||||
|
|
||||||
|
}, 'ReadableStreamAsyncIteratorPrototype.return enforces a brand check');
|
||||||
|
|
|
@ -39,13 +39,15 @@ test(() => {
|
||||||
|
|
||||||
test(() => {
|
test(() => {
|
||||||
|
|
||||||
const methods = ['cancel', 'constructor', 'getReader', 'pipeThrough', 'pipeTo', 'tee'];
|
const methods = ['cancel', 'constructor', 'getReader', 'pipeThrough', 'pipeTo', 'tee', 'getIterator'];
|
||||||
const properties = methods.concat(['locked']).sort();
|
const properties = methods.concat(['locked']).sort();
|
||||||
|
const symbols = [Symbol.asyncIterator];
|
||||||
|
|
||||||
const rs = new ReadableStream();
|
const rs = new ReadableStream();
|
||||||
const proto = Object.getPrototypeOf(rs);
|
const proto = Object.getPrototypeOf(rs);
|
||||||
|
|
||||||
assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties, 'should have all the correct methods');
|
assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties, 'should have all the correct properties');
|
||||||
|
assert_array_equals(Object.getOwnPropertySymbols(proto).sort(), symbols, 'should have all the correct symbols');
|
||||||
|
|
||||||
for (const m of methods) {
|
for (const m of methods) {
|
||||||
const propDesc = Object.getOwnPropertyDescriptor(proto, m);
|
const propDesc = Object.getOwnPropertyDescriptor(proto, m);
|
||||||
|
@ -70,6 +72,15 @@ test(() => {
|
||||||
assert_equals(rs.pipeThrough.length, 1, 'pipeThrough should have 1 parameters');
|
assert_equals(rs.pipeThrough.length, 1, 'pipeThrough should have 1 parameters');
|
||||||
assert_equals(rs.pipeTo.length, 1, 'pipeTo should have 1 parameter');
|
assert_equals(rs.pipeTo.length, 1, 'pipeTo should have 1 parameter');
|
||||||
assert_equals(rs.tee.length, 0, 'tee should have no parameters');
|
assert_equals(rs.tee.length, 0, 'tee should have no parameters');
|
||||||
|
assert_equals(rs.getIterator.length, 0, 'getIterator should have no required parameters');
|
||||||
|
assert_equals(rs[Symbol.asyncIterator].length, 0, '@@asyncIterator should have no required parameters');
|
||||||
|
|
||||||
|
const asyncIteratorPropDesc = Object.getOwnPropertyDescriptor(proto, Symbol.asyncIterator);
|
||||||
|
assert_false(asyncIteratorPropDesc.enumerable, '@@asyncIterator should be non-enumerable');
|
||||||
|
assert_true(asyncIteratorPropDesc.configurable, '@@asyncIterator should be configurable');
|
||||||
|
assert_true(asyncIteratorPropDesc.writable, '@@asyncIterator should be writable');
|
||||||
|
assert_equals(typeof rs[Symbol.asyncIterator], 'function', '@@asyncIterator should be a function');
|
||||||
|
assert_equals(rs[Symbol.asyncIterator].name, 'getIterator', '@@asyncIterator should have the correct name');
|
||||||
|
|
||||||
}, 'ReadableStream instances should have the correct list of properties');
|
}, 'ReadableStream instances should have the correct list of properties');
|
||||||
|
|
||||||
|
|
|
@ -57,3 +57,53 @@ test(t => {
|
||||||
assert_true(isReadableStream(branch1), 'branch1 should be a ReadableStream');
|
assert_true(isReadableStream(branch1), 'branch1 should be a ReadableStream');
|
||||||
assert_true(isReadableStream(branch2), 'branch2 should be a ReadableStream');
|
assert_true(isReadableStream(branch2), 'branch2 should be a ReadableStream');
|
||||||
}, 'ReadableStream tee() should not call the global ReadableStream');
|
}, 'ReadableStream tee() should not call the global ReadableStream');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const rs = new ReadableStream({
|
||||||
|
start(c) {
|
||||||
|
c.enqueue(1);
|
||||||
|
c.enqueue(2);
|
||||||
|
c.enqueue(3);
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const oldReadableStreamGetReader = ReadableStream.prototype.getReader;
|
||||||
|
|
||||||
|
const ReadableStreamDefaultReader = (new ReadableStream()).getReader().constructor;
|
||||||
|
const oldDefaultReaderRead = ReadableStreamDefaultReader.prototype.read;
|
||||||
|
const oldDefaultReaderCancel = ReadableStreamDefaultReader.prototype.cancel;
|
||||||
|
const oldDefaultReaderReleaseLock = ReadableStreamDefaultReader.prototype.releaseLock;
|
||||||
|
|
||||||
|
self.ReadableStream.prototype.getReader = function() {
|
||||||
|
throw new Error('patched getReader() called');
|
||||||
|
};
|
||||||
|
|
||||||
|
ReadableStreamDefaultReader.prototype.read = function() {
|
||||||
|
throw new Error('patched read() called');
|
||||||
|
};
|
||||||
|
ReadableStreamDefaultReader.prototype.cancel = function() {
|
||||||
|
throw new Error('patched cancel() called');
|
||||||
|
};
|
||||||
|
ReadableStreamDefaultReader.prototype.releaseLock = function() {
|
||||||
|
throw new Error('patched releaseLock() called');
|
||||||
|
};
|
||||||
|
|
||||||
|
t.add_cleanup(() => {
|
||||||
|
self.ReadableStream.prototype.getReader = oldReadableStreamGetReader;
|
||||||
|
|
||||||
|
ReadableStreamDefaultReader.prototype.read = oldDefaultReaderRead;
|
||||||
|
ReadableStreamDefaultReader.prototype.cancel = oldDefaultReaderCancel;
|
||||||
|
ReadableStreamDefaultReader.prototype.releaseLock = oldDefaultReaderReleaseLock;
|
||||||
|
});
|
||||||
|
|
||||||
|
// read the first chunk, then cancel
|
||||||
|
for await (const chunk of rs) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should be able to acquire a new reader
|
||||||
|
const reader = oldReadableStreamGetReader.call(rs);
|
||||||
|
// stream should be cancelled
|
||||||
|
await reader.closed;
|
||||||
|
}, 'ReadableStream getIterator() should use the original values of getReader() and ReadableStreamDefaultReader methods');
|
||||||
|
|
|
@ -9,7 +9,7 @@ deps =
|
||||||
mock
|
mock
|
||||||
hypothesis
|
hypothesis
|
||||||
|
|
||||||
commands = pytest --cov {posargs}
|
commands = pytest {posargs}
|
||||||
|
|
||||||
passenv =
|
passenv =
|
||||||
HYPOTHESIS_PROFILE
|
HYPOTHESIS_PROFILE
|
||||||
|
|
|
@ -13,4 +13,4 @@ deps =
|
||||||
-r{toxinidir}/../wptrunner/requirements_firefox.txt
|
-r{toxinidir}/../wptrunner/requirements_firefox.txt
|
||||||
|
|
||||||
commands =
|
commands =
|
||||||
pytest --cov {posargs}
|
pytest {posargs}
|
||||||
|
|
|
@ -20,6 +20,6 @@ deps =
|
||||||
sauce: -r{toxinidir}/requirements_sauce.txt
|
sauce: -r{toxinidir}/requirements_sauce.txt
|
||||||
servo: -r{toxinidir}/requirements_servo.txt
|
servo: -r{toxinidir}/requirements_servo.txt
|
||||||
|
|
||||||
commands = pytest {posargs:--cov}
|
commands = pytest {posargs}
|
||||||
|
|
||||||
setenv = CURRENT_TOX_ENV = {envname}
|
setenv = CURRENT_TOX_ENV = {envname}
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>
|
||||||
|
Test Sub-Sample Accurate Stitching of ABSNs
|
||||||
|
</title>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="/webaudio/resources/audit-util.js"></script>
|
||||||
|
<script src="/webaudio/resources/audit.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
let audit = Audit.createTaskRunner();
|
||||||
|
|
||||||
|
audit.define(
|
||||||
|
{
|
||||||
|
label: 'buffer-stitching-1',
|
||||||
|
description: 'Subsample buffer stitching, same rates'
|
||||||
|
},
|
||||||
|
(task, should) => {
|
||||||
|
const sampleRate = 44100;
|
||||||
|
const bufferRate = 44100;
|
||||||
|
const bufferLength = 30;
|
||||||
|
|
||||||
|
// Experimentally determined thresholds. DO NOT relax these values
|
||||||
|
// to far from these values to make the tests pass.
|
||||||
|
const errorThreshold = 9.0957e-5;
|
||||||
|
const snrThreshold = 85.586;
|
||||||
|
|
||||||
|
// Informative message
|
||||||
|
should(sampleRate, 'Test 1: context.sampleRate')
|
||||||
|
.beEqualTo(sampleRate);
|
||||||
|
testBufferStitching(sampleRate, bufferRate, bufferLength)
|
||||||
|
.then(resultBuffer => {
|
||||||
|
const actual = resultBuffer.getChannelData(0);
|
||||||
|
const expected = resultBuffer.getChannelData(1);
|
||||||
|
should(
|
||||||
|
actual,
|
||||||
|
`Stitched sine-wave buffers at sample rate ${bufferRate}`)
|
||||||
|
.beCloseToArray(
|
||||||
|
expected, {absoluteThreshold: errorThreshold});
|
||||||
|
const SNR = 10 * Math.log10(computeSNR(actual, expected));
|
||||||
|
should(SNR, `SNR (${SNR} dB)`)
|
||||||
|
.beGreaterThanOrEqualTo(snrThreshold);
|
||||||
|
})
|
||||||
|
.then(() => task.done());
|
||||||
|
});
|
||||||
|
|
||||||
|
audit.define(
|
||||||
|
{
|
||||||
|
label: 'buffer-stitching-2',
|
||||||
|
description: 'Subsample buffer stitching, different rates'
|
||||||
|
},
|
||||||
|
(task, should) => {
|
||||||
|
const sampleRate = 44100;
|
||||||
|
const bufferRate = 43800;
|
||||||
|
const bufferLength = 30;
|
||||||
|
|
||||||
|
// Experimentally determined thresholds. DO NOT relax these values
|
||||||
|
// to far from these values to make the tests pass.
|
||||||
|
const errorThreshold = 3.8986e-3;
|
||||||
|
const snrThreshold = 65.737;
|
||||||
|
|
||||||
|
// Informative message
|
||||||
|
should(sampleRate, 'Test 2: context.sampleRate')
|
||||||
|
.beEqualTo(sampleRate);
|
||||||
|
testBufferStitching(sampleRate, bufferRate, bufferLength)
|
||||||
|
.then(resultBuffer => {
|
||||||
|
const actual = resultBuffer.getChannelData(0);
|
||||||
|
const expected = resultBuffer.getChannelData(1);
|
||||||
|
should(
|
||||||
|
actual,
|
||||||
|
`Stitched sine-wave buffers at sample rate ${bufferRate}`)
|
||||||
|
.beCloseToArray(
|
||||||
|
expected, {absoluteThreshold: errorThreshold});
|
||||||
|
const SNR = 10 * Math.log10(computeSNR(actual, expected));
|
||||||
|
should(SNR, `SNR (${SNR} dB)`)
|
||||||
|
.beGreaterThanOrEqualTo(snrThreshold);
|
||||||
|
})
|
||||||
|
.then(() => task.done());
|
||||||
|
});
|
||||||
|
|
||||||
|
audit.run();
|
||||||
|
|
||||||
|
// Create graph to test stitching of consecutive ABSNs. The context rate
|
||||||
|
// is |sampleRate|, and the buffers have a fixed length of |bufferLength|
|
||||||
|
// and rate of |bufferRate|. The |bufferRate| should not be too different
|
||||||
|
// from |sampleRate| because of interpolation of the buffer to the context
|
||||||
|
// rate.
|
||||||
|
function testBufferStitching(sampleRate, bufferRate, bufferLength) {
|
||||||
|
// The context for testing. Channel 0 contains the output from
|
||||||
|
// stitching all the buffers together, and channel 1 contains the
|
||||||
|
// expected output.
|
||||||
|
const context = new OfflineAudioContext(
|
||||||
|
{numberOfChannels: 2, length: sampleRate, sampleRate: sampleRate});
|
||||||
|
|
||||||
|
const merger = new ChannelMergerNode(
|
||||||
|
context, {numberOfInputs: context.destination.channelCount});
|
||||||
|
|
||||||
|
merger.connect(context.destination);
|
||||||
|
|
||||||
|
// The reference is a sine wave at 440 Hz.
|
||||||
|
const ref = new OscillatorNode(context, {frequency: 440, type: 'sine'});
|
||||||
|
ref.connect(merger, 0, 1);
|
||||||
|
ref.start();
|
||||||
|
|
||||||
|
// The test signal is a bunch of short AudioBufferSources containing
|
||||||
|
// bits of a sine wave.
|
||||||
|
let waveSignal = new Float32Array(context.length);
|
||||||
|
const omega = 2 * Math.PI / bufferRate * ref.frequency.value;
|
||||||
|
for (let k = 0; k < context.length; ++k) {
|
||||||
|
waveSignal[k] = Math.sin(omega * k);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slice the sine wave into many little buffers to be assigned to ABSNs
|
||||||
|
// that are started at the appropriate times to produce a final sine
|
||||||
|
// wave.
|
||||||
|
for (let k = 0; k < context.length; k += bufferLength) {
|
||||||
|
const buffer =
|
||||||
|
new AudioBuffer({length: bufferLength, sampleRate: bufferRate});
|
||||||
|
buffer.copyToChannel(waveSignal.slice(k, k + bufferLength), 0);
|
||||||
|
|
||||||
|
const src = new AudioBufferSourceNode(context, {buffer: buffer});
|
||||||
|
src.connect(merger, 0, 0);
|
||||||
|
src.start(k / bufferRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.startRendering();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -53,7 +53,8 @@ function xr_session_promise_test(
|
||||||
testSession = session;
|
testSession = session;
|
||||||
// Session must have a baseLayer or frame requests
|
// Session must have a baseLayer or frame requests
|
||||||
// will be ignored.
|
// will be ignored.
|
||||||
session.baseLayer = new XRWebGLLayer(session, gl);
|
session.updateRenderState({
|
||||||
|
baseLayer: new XRWebGLLayer(session, gl) });
|
||||||
resolve(func(session, testDeviceController, t));
|
resolve(func(session, testDeviceController, t));
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue