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:
bors-servo 2019-02-07 22:55:25 -05:00 committed by GitHub
commit 71ba247942
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
75 changed files with 2476 additions and 391 deletions

View file

@ -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": [

View file

@ -1,4 +0,0 @@
[elementsFromPoint-invalid-cases.html]
[The root element is the last element returned for valid queries]
expected: FAIL

View file

@ -0,0 +1,2 @@
[long_scroll_composited.html]
expected: FAIL

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,5 +0,0 @@
[javascript-url-abort-return-value-undefined.tentative.html]
expected: TIMEOUT
[Not aborting fetch for javascript:undefined navigation]
expected: TIMEOUT

View file

@ -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

View file

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

View file

@ -1,2 +0,0 @@
[script-onerror-insertion-point-2.html]
expected: TIMEOUT

View file

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

View file

@ -1,4 +0,0 @@
[iframe_005.html]
[document.write external script into iframe write back into parent]
expected: FAIL

View file

@ -0,0 +1,4 @@
[supported_navigation_type.window.html]
[supportedEntryTypes contains 'navigation'.]
expected: FAIL

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,2 @@
[transition_calc_implicit.html]
expected: TIMEOUT

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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`);
} }

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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">

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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

View file

@ -55,6 +55,26 @@ test(function() {
'<root attr="&#xD;"/>', '<root attr="&#13;"/>']); '<root attr="&#xD;"/>', '<root attr="&#13;"/>']);
}, '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>

View file

@ -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>

View file

@ -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';
document.body.appendChild(img); img.setAttribute('elementtiming', 'my_image');
}; img.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();
}, 100); }, 100);
});
document.body.appendChild(img);
});
}, 'Cross-origin image element is NOT observable.'); }, 'Cross-origin image element is NOT observable.');
</script> </script>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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();

View file

@ -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() {

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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);

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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');

View file

@ -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');

View file

@ -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');

View file

@ -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');

View file

@ -9,7 +9,7 @@ deps =
mock mock
hypothesis hypothesis
commands = pytest --cov {posargs} commands = pytest {posargs}
passenv = passenv =
HYPOTHESIS_PROFILE HYPOTHESIS_PROFILE

View file

@ -13,4 +13,4 @@ deps =
-r{toxinidir}/../wptrunner/requirements_firefox.txt -r{toxinidir}/../wptrunner/requirements_firefox.txt
commands = commands =
pytest --cov {posargs} pytest {posargs}

View file

@ -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}

View file

@ -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>

View file

@ -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) => {