diff options
author | Servo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com> | 2024-06-23 02:21:30 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-23 06:21:30 +0000 |
commit | 62b230e85d18cb3193dd5283aa3073cb161e5e6b (patch) | |
tree | b037305e43ea3758cc32eb6f943806f20bd78417 /tests/wpt | |
parent | 130eef300bb71febf715683211323c1b551f5313 (diff) | |
download | servo-62b230e85d18cb3193dd5283aa3073cb161e5e6b.tar.gz servo-62b230e85d18cb3193dd5283aa3073cb161e5e6b.zip |
Update web-platform-tests to revision b'f46bf6aa167e2838a8b93501a1a998ffde90d879' (#32581)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
Diffstat (limited to 'tests/wpt')
496 files changed, 11266 insertions, 2327 deletions
diff --git a/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini b/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini index 787c5c993ed..ba980c5df77 100644 --- a/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini +++ b/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini @@ -2,7 +2,7 @@ [options properties should be accessed in lexicographic order.] expected: FAIL - [Passing typed arrays as elements of the blobParts array should work.] + [Passing a Float16Array as element of the blobParts array should work.] expected: FAIL @@ -10,5 +10,5 @@ [options properties should be accessed in lexicographic order.] expected: FAIL - [Passing typed arrays as elements of the blobParts array should work.] + [Passing a Float16Array as element of the blobParts array should work.] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini b/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini index 4671cc872fe..b45205c6462 100644 --- a/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini +++ b/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini @@ -17,7 +17,7 @@ [Null arrays: BigUint64Array] expected: FAIL - [Float arrays] + [Float16 arrays] expected: FAIL @@ -40,5 +40,5 @@ [Null arrays: BigUint64Array] expected: FAIL - [Float arrays] + [Float16 arrays] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini b/tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini deleted file mode 100644 index 0ee92f312ba..00000000000 --- a/tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-transform-bicameral-018.xht] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini deleted file mode 100644 index eb3cf41a070..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[opacity-animation-ending-correctly-002.html] - expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini new file mode 100644 index 00000000000..98d15fdb816 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini @@ -0,0 +1,18 @@ +[reading-flow-computed.html] + [Property reading-flow value 'normal'] + expected: FAIL + + [Property reading-flow value 'flex-visual'] + expected: FAIL + + [Property reading-flow value 'flex-flow'] + expected: FAIL + + [Property reading-flow value 'grid-rows'] + expected: FAIL + + [Property reading-flow value 'grid-columns'] + expected: FAIL + + [Property reading-flow value 'grid-order'] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini new file mode 100644 index 00000000000..9b3ebfaee3a --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini @@ -0,0 +1,18 @@ +[reading-flow-valid.html] + [e.style['reading-flow'\] = "normal" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "flex-visual" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "flex-flow" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "grid-rows" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "grid-columns" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "grid-order" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini deleted file mode 100644 index bfbb8d57dbd..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[reading-order-items-computed.html] - [Property reading-order-items value 'normal'] - expected: FAIL - - [Property reading-order-items value 'flex-visual'] - expected: FAIL - - [Property reading-order-items value 'flex-flow'] - expected: FAIL - - [Property reading-order-items value 'grid-rows'] - expected: FAIL - - [Property reading-order-items value 'grid-columns'] - expected: FAIL - - [Property reading-order-items value 'grid-order'] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini deleted file mode 100644 index 8fa1c144a47..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[reading-order-items-valid.html] - [e.style['reading-order-items'\] = "normal" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "flex-visual" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "flex-flow" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "grid-rows" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "grid-columns" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "grid-order" should set the property value] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini b/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini new file mode 100644 index 00000000000..58588e322c0 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini @@ -0,0 +1,2 @@ +[font-size-adjust-ic-height.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini deleted file mode 100644 index 69a38ce77ee..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-size-adjust-ic-height.tentative.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini new file mode 100644 index 00000000000..4d1405fd38b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini @@ -0,0 +1,2 @@ +[image-orientation-exif-png-2.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini new file mode 100644 index 00000000000..a5e9153e1b2 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini @@ -0,0 +1,2 @@ +[image-orientation-exif-png-3.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini b/tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini new file mode 100644 index 00000000000..c8587942f36 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini @@ -0,0 +1,2 @@ +[details-open.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini b/tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini new file mode 100644 index 00000000000..7a0dea87709 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini @@ -0,0 +1,2 @@ +[implicit-and-explicit-list-item-counters.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini new file mode 100644 index 00000000000..784929fa209 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini @@ -0,0 +1,2 @@ +[hyphens-vs-float-clearance-001.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini new file mode 100644 index 00000000000..6214b59d4c3 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini @@ -0,0 +1,2 @@ +[hyphens-vs-float-clearance-002.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini new file mode 100644 index 00000000000..83e7d9ca15d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini @@ -0,0 +1,12 @@ +[scrollIntoView-multiple-nested.html] + [Simultaneous smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous smooth,instant scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant,smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant scrollIntoViews run to completion] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini new file mode 100644 index 00000000000..2e26c21bf51 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini @@ -0,0 +1,12 @@ +[scrollIntoView-multiple.html] + [Simultaneous smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous smooth,instant scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant,smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant scrollIntoViews run to completion] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini new file mode 100644 index 00000000000..321dc54f98d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini @@ -0,0 +1,7 @@ +[smooth-scrollIntoView-with-smooth-fragment-scroll.html] + expected: TIMEOUT + [Smooth scroll to hash fragment (on pageload) alongside smooth scrollIntoView runs to completion.] + expected: TIMEOUT + + [Smooth scroll to hash fragment (on click) alongside smooth scrollIntoView runs to completion.] + expected: NOTRUN diff --git a/tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini b/tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini new file mode 100644 index 00000000000..51318cbb1d2 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-edge-mirror.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini b/tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini new file mode 100644 index 00000000000..2ca05f57bb0 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini @@ -0,0 +1,2 @@ +[HTMLMediaElement.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini new file mode 100644 index 00000000000..518e7cde25d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini @@ -0,0 +1,4 @@ +[addEmbed.window.html] + expected: TIMEOUT + [RemoteContextWrapper addEmbed] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini new file mode 100644 index 00000000000..426a2fdf64e --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini @@ -0,0 +1,4 @@ +[addObject.window.html] + expected: TIMEOUT + [RemoteContextWrapper addObject] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini deleted file mode 100644 index 7a5fcb79165..00000000000 --- a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[traverse_the_history_5.html] - [Multiple history traversals, last would be aborted] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini index c3a13fbf59e..e12e364d828 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini +++ b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini @@ -1,3 +1,3 @@ -[initial.reset.path.html] +[2d.canvas.host.initial.reset.path.html] [Resetting the canvas state resets the current path] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini new file mode 100644 index 00000000000..f6455f9bd76 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini @@ -0,0 +1,2 @@ +[2d.canvas.host.size.large.html] + expected: CRASH diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini new file mode 100644 index 00000000000..b942e4f7dc2 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.invalid.args.html] + [Calling getContext with invalid arguments.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini new file mode 100644 index 00000000000..cb833a67760 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.invalid.args.worker.html] + [Calling getContext with invalid arguments.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini deleted file mode 100644 index 61f40bc0e2a..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badname.html] - [getContext with unrecognised context name returns null] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini deleted file mode 100644 index ba433ddb153..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badname.worker.html] - [getContext with unrecognised context name returns null] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini deleted file mode 100644 index 42e7640cc34..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badsuffix.html] - [Context name "2d" plus a suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini deleted file mode 100644 index 89c114b0e1d..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badsuffix.worker.html] - [Context name "2d" plus a suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini deleted file mode 100644 index 8cd6b8b614c..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.nullsuffix.html] - [Context name "2d" plus a "\\0" suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini deleted file mode 100644 index e850767487e..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.nullsuffix.worker.html] - [Context name "2d" plus a "\\0" suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini deleted file mode 100644 index 88eff7740fd..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.unicode.html] - [Context name which kind of looks like "2d" is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini deleted file mode 100644 index 7cf8fcb7e38..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.unicode.worker.html] - [Context name which kind of looks like "2d" is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini index 0946b523e8a..672798f3f81 100644 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js.ini +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini @@ -1,3 +1,3 @@ -[2d.canvas.host.size.attributes.idl.worker.html] +[2d.canvas.host.size.invalid.attributes.idl.html] [Getting/setting width/height IDL attributes] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini new file mode 100644 index 00000000000..acf2210f82b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.host.size.invalid.attributes.idl.worker.html] + [Getting/setting width/height IDL attributes] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini index 09c25efb089..d169bd2e9fa 100644 --- a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini +++ b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini @@ -1,5 +1,4 @@ [supported-elements.html] - expected: TIMEOUT [Contenteditable element should support autofocus] expected: FAIL @@ -7,10 +6,10 @@ expected: FAIL [Host element with delegatesFocus including no focusable descendants should be skipped] - expected: NOTRUN + expected: FAIL [Area element should support autofocus] - expected: NOTRUN + expected: FAIL [Host element with delegatesFocus should support autofocus] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini new file mode 100644 index 00000000000..126758f242b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini @@ -0,0 +1,6 @@ +[details-display.tentative.html] + [default display of first summary child of details is list-item] + expected: FAIL + + [display of details element can be changed] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini b/tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini new file mode 100644 index 00000000000..a4978181305 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini @@ -0,0 +1,2 @@ +[input-checkbox-zero-size.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini new file mode 100644 index 00000000000..2790024adc1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-history-pushState.html] + [History state change for iframe loading='lazy' before it is loaded: history.pushState] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini new file mode 100644 index 00000000000..72fd909874f --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-history-replaceState.html] + [History state change for iframe loading='lazy' before it is loaded: history.replaceState] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini new file mode 100644 index 00000000000..ce58a9da176 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-link-click-fragment.html] + [Navigating iframe loading='lazy' before it is loaded: link click (fragment)] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini new file mode 100644 index 00000000000..50155ba1c77 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-location-replace-set-src.html] + [Navigating iframe loading='lazy' and then setting src: location.replace] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini new file mode 100644 index 00000000000..7cdcf205066 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-meta-refresh.optional.html] + [Navigating iframe loading='lazy' before it is loaded: meta refresh] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini new file mode 100644 index 00000000000..396370a990c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-navigation-navigate.html] + [Navigating iframe loading='lazy' before it is loaded: navigation.navigate] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini new file mode 100644 index 00000000000..0c94be22223 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-reload-navigation-reload.html] + [Reloading iframe loading='lazy' before it is loaded: location.reload] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index 53b0601e68c..f9138fb999a 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,5 +1,5 @@ [iframe_sandbox_popups_nonescaping-1.html] type: testharness - expected: CRASH + expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index f2378357bcc..76e34322dca 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini @@ -1,5 +1,5 @@ [iframe_sandbox_popups_nonescaping-2.html] type: testharness - expected: CRASH + expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN diff --git a/tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini new file mode 100644 index 00000000000..5a4a021662b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini @@ -0,0 +1,3 @@ +[calculate-depth-for-node.html] + ["Calculate depth for node" algorithm with Shadow DOM] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini new file mode 100644 index 00000000000..046a61718d3 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini @@ -0,0 +1,3 @@ +[callback-cross-realm-report-exception.html] + [ResizeObserver reports the exception from its callback in the callback's global object] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini new file mode 100644 index 00000000000..5d07f60e0b6 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini @@ -0,0 +1,3 @@ +[change-layout-in-error.html] + [Changing layout in window error handler should not result in lifecyle loop when resize observer loop limit is reached.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini new file mode 100644 index 00000000000..c1cb9e98ff1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini @@ -0,0 +1,2 @@ +[devicepixel.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini new file mode 100644 index 00000000000..a464a714b03 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini @@ -0,0 +1,3 @@ +[eventloop.html] + [ResizeObserver implemented] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini new file mode 100644 index 00000000000..34d13fc8473 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini @@ -0,0 +1,2 @@ +[fragments.html] + expected: ERROR diff --git a/tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini b/tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini new file mode 100644 index 00000000000..15dfbd6f021 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini @@ -0,0 +1,129 @@ +[idlharness.window.html] + [idl_test setup] + expected: FAIL + + [ResizeObserver interface: existence and properties of interface object] + expected: FAIL + + [ResizeObserver interface object length] + expected: FAIL + + [ResizeObserver interface object name] + expected: FAIL + + [ResizeObserver interface: existence and properties of interface prototype object] + expected: FAIL + + [ResizeObserver interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ResizeObserver interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ResizeObserver interface: operation observe(Element, optional ResizeObserverOptions)] + expected: FAIL + + [ResizeObserver interface: operation unobserve(Element)] + expected: FAIL + + [ResizeObserver interface: operation disconnect()] + expected: FAIL + + [ResizeObserver must be primary interface of observer] + expected: FAIL + + [Stringification of observer] + expected: FAIL + + [ResizeObserver interface: observer must inherit property "observe(Element, optional ResizeObserverOptions)" with the proper type] + expected: FAIL + + [ResizeObserver interface: calling observe(Element, optional ResizeObserverOptions) on observer with too few arguments must throw TypeError] + expected: FAIL + + [ResizeObserver interface: observer must inherit property "unobserve(Element)" with the proper type] + expected: FAIL + + [ResizeObserver interface: calling unobserve(Element) on observer with too few arguments must throw TypeError] + expected: FAIL + + [ResizeObserver interface: observer must inherit property "disconnect()" with the proper type] + expected: FAIL + + [ResizeObserverEntry interface: existence and properties of interface object] + expected: FAIL + + [ResizeObserverEntry interface object length] + expected: FAIL + + [ResizeObserverEntry interface object name] + expected: FAIL + + [ResizeObserverEntry interface: existence and properties of interface prototype object] + expected: FAIL + + [ResizeObserverEntry interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ResizeObserverEntry interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ResizeObserverEntry interface: attribute target] + expected: FAIL + + [ResizeObserverEntry interface: attribute contentRect] + expected: FAIL + + [ResizeObserverEntry interface: attribute borderBoxSize] + expected: FAIL + + [ResizeObserverEntry interface: attribute contentBoxSize] + expected: FAIL + + [ResizeObserverEntry interface: attribute devicePixelContentBoxSize] + expected: FAIL + + [ResizeObserverEntry must be primary interface of entry] + expected: FAIL + + [Stringification of entry] + expected: FAIL + + [ResizeObserverEntry interface: entry must inherit property "target" with the proper type] + expected: FAIL + + [ResizeObserverEntry interface: entry must inherit property "contentRect" with the proper type] + expected: FAIL + + [ResizeObserverEntry interface: entry must inherit property "borderBoxSize" with the proper type] + expected: FAIL + + [ResizeObserverEntry interface: entry must inherit property "contentBoxSize" with the proper type] + expected: FAIL + + [ResizeObserverEntry interface: entry must inherit property "devicePixelContentBoxSize" with the proper type] + expected: FAIL + + [ResizeObserverSize interface: existence and properties of interface object] + expected: FAIL + + [ResizeObserverSize interface object length] + expected: FAIL + + [ResizeObserverSize interface object name] + expected: FAIL + + [ResizeObserverSize interface: existence and properties of interface prototype object] + expected: FAIL + + [ResizeObserverSize interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ResizeObserverSize interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ResizeObserverSize interface: attribute inlineSize] + expected: FAIL + + [ResizeObserverSize interface: attribute blockSize] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini new file mode 100644 index 00000000000..bec8e80bb54 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini @@ -0,0 +1,2 @@ +[iframe-same-origin.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini new file mode 100644 index 00000000000..37ecd60f5cb --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini @@ -0,0 +1,4 @@ +[notify.html] + expected: ERROR + [ResizeObserver implemented] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini new file mode 100644 index 00000000000..ac4858d5ec9 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini @@ -0,0 +1,4 @@ +[observe.html] + expected: ERROR + [ResizeObserver implemented] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini new file mode 100644 index 00000000000..4dbdb1425e4 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini @@ -0,0 +1,3 @@ +[ordering.html] + [ResizeObserver and IntersectionObserver ordering] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini new file mode 100644 index 00000000000..659e8c5cdbb --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini @@ -0,0 +1,3 @@ +[scrollbars-2.html] + [ResizeObserver content-box size and scrollbars] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini new file mode 100644 index 00000000000..d50311f8767 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini @@ -0,0 +1,3 @@ +[scrollbars.html] + [ResizeObserver content-box size and scrollbars] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini new file mode 100644 index 00000000000..b3f430f8726 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini @@ -0,0 +1,4 @@ +[svg-with-css-box-001.html] + expected: ERROR + [ResizeObserver implemented] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini new file mode 100644 index 00000000000..2800c85ddad --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini @@ -0,0 +1,2 @@ +[svg-with-css-box-002.svg] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini new file mode 100644 index 00000000000..e335a90f4cf --- /dev/null +++ b/tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini @@ -0,0 +1,3 @@ +[svg.html] + [ResizeObserver implemented] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini b/tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini new file mode 100644 index 00000000000..54f418b142b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini @@ -0,0 +1,6 @@ +[move-paragraph-cross-editing-boundary.tentative.html] + [cross editing boundary] + expected: FAIL + + [not cross editing boundary] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini b/tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini new file mode 100644 index 00000000000..d2480558e0a --- /dev/null +++ b/tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini @@ -0,0 +1,2 @@ +[selectionchange-on-shadow-dom.html] + expected: ERROR diff --git a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini index 24daae4c2e7..24daae4c2e7 100644 --- a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini +++ b/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini diff --git a/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini b/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini index 93496d77322..7cfec1db884 100644 --- a/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini +++ b/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini @@ -2,7 +2,7 @@ [options properties should be accessed in lexicographic order.] expected: FAIL - [Passing typed arrays as elements of the blobParts array should work.] + [Passing a Float16Array as element of the blobParts array should work.] expected: FAIL @@ -10,5 +10,5 @@ [options properties should be accessed in lexicographic order.] expected: FAIL - [Passing typed arrays as elements of the blobParts array should work.] + [Passing a Float16Array as element of the blobParts array should work.] expected: FAIL diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 0625de8d1de..b320ff75811 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -1538,6 +1538,13 @@ {} ] ], + "chrome-bug-346264227-crash.html": [ + "ae7809016e699fe8b3524b38109bc301a1e59477", + [ + null, + {} + ] + ], "chrome-custom-highlight-crash.html": [ "61e5075ed4e1b485019d96b402bbf17926bd1098", [ @@ -2561,6 +2568,13 @@ {} ] ], + "firefox-bug-1901624-crash.html": [ + "306bc15aa49ea3208353b954cb1367c01d36ce98", + [ + null, + {} + ] + ], "float-becomes-inflow-crash.html": [ "c820b093ce332abc2bce9c58456cb67fe268f637", [ @@ -21738,7 +21752,7 @@ "element": { "canvas-host": { "2d.canvas.host.scaled-manual.html": [ - "acf3f9c7b344711b38326671a6a8edd332692606", + "930432a39fea0b16e4620aa8b4b8e1226c81c334", [ null, {} @@ -32380,6 +32394,294 @@ {} ] ], + "margin-boxes": { + "alignment-001-print.html": [ + "ad9c78baa6c0e9a392452d0f543c5511719f5d34", + [ + null, + [ + [ + "/css/css-page/margin-boxes/alignment-001-print-ref.html", + "==" + ] + ], + {} + ] + ], + "auto-margins-001-print.html": [ + "cf2501385f10483999811024195a79f9f19225f7", + [ + null, + [ + [ + "/css/css-page/margin-boxes/auto-margins-001-print-ref.html", + "==" + ] + ], + {} + ] + ], + "auto-margins-002-print.html": [ + "5b424941cadd75afad2083a619871a9d5aa80749", + [ + null, + [ + [ + "/css/css-page/margin-boxes/auto-margins-002-print-ref.html", + "==" + ] + ], + {} + ] + ], + "auto-margins-003-print.html": [ + "4fe7192a56f2400c71342c3e6b3d6dd7dc62289c", + [ + null, + [ + [ + "/css/css-page/margin-boxes/auto-margins-003-print-ref.html", + "==" + ] + ], + {} + ] + ], + "content-001-print.html": [ + "efaa71b8c848bc13733f191a3c1f004edca80f29", + [ + null, + [ + [ + "/css/css-page/margin-boxes/content-001-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-001-print.html": [ + "20d4e3059e0df47c0e4f782bfce782c0184789f1", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-001-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-002-print.html": [ + "4637a39ed516dc7b26d3bb11a634dc5e3f1262b5", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-002-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-003-print.html": [ + "fe9f26da5d7c4dc008cd58539ba4ffc23adc309b", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-003-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-004-print.html": [ + "80bcc43fb39b84fb291fb822de9a58bf26181a1c", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-004-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-005-print.html": [ + "2823424f39a1ce99f39af781e830378bb62f738a", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-005-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-006-print.html": [ + "6ea477f2c84d63b599d673ccbd943ae5ba62be26", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-006-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-007-print.html": [ + "cf7e5f507543f0ea8b523e83493d91cdb5b0e94b", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-007-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-008-print.html": [ + "8bdf0cdac0bb5796f3e6c99c0f3ded01f13527ee", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-008-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-009-print.html": [ + "602cc5680ec315dc8335a8ed294a14f0286b580b", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-009-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-010-print.html": [ + "1ebaa6d9288b89bb90c62fa5f99406e2e8fb91bb", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-010-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-011-print.html": [ + "e51d1fbd75eea07e2b8bc3106b3a344b944181e6", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-011-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-012-print.html": [ + "6b4ac2c28c723f6db09d16c50df301b0884b9af2", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-012-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-013-print.html": [ + "4540b07190673da2fe0bbb616fb66a46512acae1", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-013-print-ref.html", + "==" + ] + ], + {} + ] + ], + "dimensions-014-print.html": [ + "d126f2d0c91c5daba93e78c5075adb7499059c9f", + [ + null, + [ + [ + "/css/css-page/margin-boxes/dimensions-013-print-ref.html", + "==" + ] + ], + {} + ] + ], + "inapplicable-properties-print.html": [ + "f5f7f8ea247a76726f74fcab0d3de187a91f8557", + [ + null, + [ + [ + "/css/css-page/margin-boxes/inapplicable-properties-print-ref.html", + "==" + ] + ], + {} + ] + ], + "overconstrained-001-print.html": [ + "549443ebc3226a2a954c82719a3cf7b25f62230a", + [ + null, + [ + [ + "/css/css-page/margin-boxes/overconstrained-001-print-ref.html", + "==" + ] + ], + {} + ] + ], + "paint-order-001-print.html": [ + "839762f0b9a7de87cba63e13be87d6af66bddd53", + [ + null, + [ + [ + "/css/css-page/margin-boxes/paint-order-001-print-ref.html", + "==" + ] + ], + {} + ] + ] + }, "media-queries-001-print.html": [ "01b2a00e470263b6371313b5107c7add544d858c", [ @@ -142230,6 +142532,19 @@ {} ] ], + "overflowing-block-004.html": [ + "edf9e53439bdf46352e0c41480b1692a152927c6", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "parallel-flow-trailing-margin-001.html": [ "a6391cd9d4738676417f69223038f9f603ea83d1", [ @@ -177062,8 +177377,8 @@ {} ] ], - "font-size-adjust-ic-height.tentative.html": [ - "85aeb2683cbcae01e0c65923360b8719d8d7e738", + "font-size-adjust-ic-height.html": [ + "5157d76847a8fdc63e51e2c34a4d945d3250e6e1", [ null, [ @@ -189070,7 +189385,7 @@ ] ], "css-target-text-decoration-001.html": [ - "fa76c0bc4e7636c416ac876530f11d9a4e40050a", + "14ba7111dce9a2cb6aebf8a7dec041e6d11ef864", [ null, [ @@ -189090,7 +189405,7 @@ ], [ 0, - 32 + 38 ] ] ] @@ -191521,6 +191836,32 @@ } ] ], + "image-orientation-exif-png-2.html": [ + "9c70b08ab814747ae0cc1f8aad3499f5087a8892", + [ + null, + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-exif-png-ref.html", + "==" + ] + ], + {} + ] + ], + "image-orientation-exif-png-3.html": [ + "536b7d2560c2fb1e595033b5397a654ff68533c2", + [ + null, + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-exif-png-ref.html", + "==" + ] + ], + {} + ] + ], "image-orientation-exif-png.html": [ "85d807e39869cfc5f847bb7454b2465de9eb8c40", [ @@ -199714,6 +200055,19 @@ {} ] ], + "details-open.html": [ + "8354d0122328b9dbeed2657c624354580152c551", + [ + null, + [ + [ + "/css/css-lists/details-open-ref.html", + "==" + ] + ], + {} + ] + ], "foo-counter-reversed-006a.html": [ "028f1fe19998c8eb70cc1d98d6d6f9ee852b7b03", [ @@ -199857,6 +200211,19 @@ {} ] ], + "implicit-and-explicit-list-item-counters.html": [ + "5b7a99481657032228e693b0804d79bd299eed44", + [ + null, + [ + [ + "/css/css-lists/implicit-and-explicit-list-item-counters-ref.html", + "==" + ] + ], + {} + ] + ], "inline-block-list-marker.html": [ "73a163fa9dbe472fb6223c42fd0075843faf4b51", [ @@ -215838,6 +216205,32 @@ {} ] ], + "scrollbar-gutter-fixedpos-003.html": [ + "cdffebb5c7b8db6557e901eee7acd651c273fe01", + [ + null, + [ + [ + "/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html", + "==" + ] + ], + {} + ] + ], + "scrollbar-gutter-fixedpos-004.html": [ + "debb28d397f5f0377565f6fd157a8ac89f7cc1b2", + [ + null, + [ + [ + "/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html", + "==" + ] + ], + {} + ] + ], "scrollbar-gutter-rtl-002.html": [ "8d0376defdfc69ecb44fc2134c81573e553db2bb", [ @@ -224799,6 +225192,19 @@ {} ] ], + "ruby-text-dynamic-style.html": [ + "3adade2dd3cd4723774efe22352e3e9389f81e82", + [ + null, + [ + [ + "/css/css-ruby/reference/ruby-text-dynamic-style-ref.html", + "==" + ] + ], + {} + ] + ], "ruby-whitespace-001.html": [ "9072a8e6841925a5023730ad48b5a2f074b1d0dd", [ @@ -237774,6 +238180,32 @@ {} ] ], + "hyphens-vs-float-clearance-001.html": [ + "29b7c3c9fa595dd23d6cc7ee4aded6687feea8f3", + [ + null, + [ + [ + "/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html", + "==" + ] + ], + {} + ] + ], + "hyphens-vs-float-clearance-002.html": [ + "6b5b213cb71cb55930da8ef0058522667301f49e", + [ + null, + [ + [ + "/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html", + "==" + ] + ], + {} + ] + ], "i18n": { "hyphens-i18n-auto-001.html": [ "bfcd2f1362f40dd932e5444eb38ff676a27e895f", @@ -283144,6 +283576,32 @@ {} ] ], + "transparent-accent-color-001.html": [ + "219e24c1689b11dca0f22670118439d10e6b8813", + [ + null, + [ + [ + "/css/css-ui/reference/transparent-accent-color-001-ref.html", + "==" + ] + ], + {} + ] + ], + "transparent-accent-color-002.html": [ + "46b9835d0c18313885e08e2d469111cb82fa841f", + [ + null, + [ + [ + "/css/css-ui/reference/transparent-accent-color-002-ref.html", + "==" + ] + ], + {} + ] + ], "webkit-appearance-auto-001.html": [ "fb0261b020f6fc2b1e3bfccb3da7d899f0337f79", [ @@ -288075,6 +288533,19 @@ {} ] ], + "element-escapes-clip-with-abspos-child.html": [ + "b16b02bd63214db23fa60e00aac8b3f1773909dd", + [ + null, + [ + [ + "/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html", + "==" + ] + ], + {} + ] + ], "element-is-grouping-during-animation.html": [ "b1ef745e0dba3e60022921cdf60deea4116791be", [ @@ -291497,6 +291968,19 @@ {} ] ], + "transformed-element-scroll-transform.html": [ + "8ff0780bbd3a2dd2b827599d1c486371da91638d", + [ + null, + [ + [ + "/css/css-view-transitions/transformed-element-scroll-transform-ref.html", + "==" + ] + ], + {} + ] + ], "transition-in-empty-iframe.html": [ "101f7c2a632f6b02ed285a0a73c46a3934b54667", [ @@ -308022,6 +308506,35 @@ {} ] ], + "backdrop-filter-edge-mirror.html": [ + "c11d2f2733e3cf452299dc0f088f4459c9f53910", + [ + null, + [ + [ + "/css/filter-effects/backdrop-filter-edge-mirror-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 10 + ], + [ + 0, + 10000 + ] + ] + ] + ] + } + ] + ], "backdrop-filter-edge-pixels.html": [ "5a70020890b619fd08f6546a4f3549568ce3856b", [ @@ -327823,6 +328336,19 @@ {} ] ], + "input-checkbox-zero-size.html": [ + "406f7da9547b4f7f1142fe5a8b129d150fd95ea4", + [ + null, + [ + [ + "/css/reference/blank.html", + "==" + ] + ], + {} + ] + ], "input-date-baseline-min-height.html": [ "86b552ab809bb77e0edee713daacab8869351941", [ @@ -337741,6 +338267,19 @@ }, "svg": { "animations": { + "conditional-processing-01.html": [ + "fe3958f71f3ba6fdc37b65afd02aeabe5dc88bb7", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], "scripted": { "animateMotion-animated-line.svg": [ "5e853dab03a547f2e963e0ecc51048a9ea3ea307", @@ -337782,6 +338321,32 @@ {} ] ], + "switch-animation-01.html": [ + "f33becbb6556a04ae4b3cde31e86d835dd416140", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], + "switch-animation-02.html": [ + "c0b97a2cd2af0392ccfb284ccdef877f5941e2a0", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], "use-animate-display-none-symbol-2.html": [ "db06b641d9a60b094aee40a3930fd7229fcdb0d5", [ @@ -345552,7 +346117,7 @@ ] }, "web-identity": [ - "6f1260dbc373c19505e5d6c9a7328d63ef4eef2f", + "c36f63e813868d095f578bb511a3e409e3051abd", [] ] }, @@ -368362,7 +368927,7 @@ ], "support": { "echo-allow-csp-from.py": [ - "3a914379671ce91b6991750f5b7b9b6bf4afa02c", + "b025012ec8e982958ed9104cd83f618a8f4a98b3", [] ], "echo-policy-multiple.py": [ @@ -368386,7 +368951,7 @@ [] ], "testharness-helper.sub.js": [ - "7d2307ebbc974446d59fd7b023fe9f7ce088c193", + "551ad0348a754c906778dbfb58459298530f48e5", [] ] } @@ -370631,221 +371196,37 @@ [] ], "fedcm": { - "accounts.py": [ - "126f911a58c80a62de06b6062cdb4488549471b9", - [] - ], - "accounts_check_same_site_strict.py": [ - "796ac003cbc0bb34773b50c1c5de4351aae8dddd", - [] - ], - "accounts_no_approved_clients.py": [ - "faea06edc363067b83ce23391e75d254cf9eea76", - [] - ], - "client_metadata.py": [ - "72ddcc5cd62569fa280adcab9490e84b851e6780", - [] - ], - "client_metadata.py.headers": [ - "7164e5f81827da39996b033972a508e5b371de11", - [] - ], - "client_metadata_clear_count.py": [ - "3c31bf5077d73ac258f4a96bb6b4f5e95802f184", - [] - ], - "continue_on.py": [ - "2a580e0f3f4fd525c3826795f5bfd05eb0a55675", - [] - ], "disconnect-iframe.html": [ "f65763932b8c742debdbabbefc310613fe83f0e5", [] ], - "disconnect.py": [ - "cf62ceda22515dd036cdea9fec4de7305b4a51b4", - [] - ], - "disconnect_failure.py": [ - "f880218b2f6156817aeb7ac16c0e1e42f3ed5103", - [] - ], - "error_with_code_and_url.py": [ - "71bfea00f463051e7bd496cf1c28f25208e2b41e", - [] - ], "intercept_service_worker.js": [ - "773e38fd21b023b8314f732b6d1893ab6c65a3cd", + "fd0bb71a0c7ac405a7b1d148d6a08341c44117d7", [] ], "keys.py": [ "6b7d67e21e7eea7927a40ab094847b7224d49985", [] ], - "login.html": [ - "78d241cda952bccdeff05653f0cc7311afa73710", - [] - ], - "manifest-not-in-list.json": [ - "00700666675413d378bba7c3f8bed12f2b9b4849", - [] - ], - "manifest-token-nocors.json": [ - "77ba1b4702bc03c324d1af007eacb9d24df62c3b", - [] - ], - "manifest.py": [ - "a40fc100eee697ed7dcd451626409af18606442e", - [] - ], - "manifest_check_disclosure_shown_false.json": [ - "47ca63edc4fc96f4d563beba7e872ae5d47461c1", - [] - ], - "manifest_check_disclosure_shown_true.json": [ - "7d7004c3cffee4fdbdf824b28456fd20b617de8b", - [] - ], - "manifest_check_same_site_strict.json": [ - "d7304159834804c417f498acebc45f59e588dcbb", - [] - ], - "manifest_id_assertion_endpoint_returns_error.json": [ - "e098cc4511a1980392097d0a26c020db3243ae35", - [] - ], - "manifest_no_login_url.json": [ - "15a657c679df7b0dfb0be1058e7086b439781762", - [] - ], - "manifest_redirect_accounts.json": [ - "6a8972feebd6d139cb279d2f0446d4c3957bc5fc", - [] - ], - "manifest_redirect_token.json": [ - "867b4dffb76902ed20d2ec96e1f744851bbb5163", - [] - ], - "manifest_token_with_http_error.json": [ - "691a1e8d3a63a3695ec1fd29267506363871af71", - [] - ], - "manifest_with_auto_selected_flag.json": [ - "591c927153b9a78695ded0663fed600cbae5bcb6", - [] - ], - "manifest_with_continue_on.json": [ - "d7673c7e1b13e692ef59c091c32bf520663d058f", - [] - ], - "manifest_with_cross_origin_disconnect.sub.json": [ - "a1ad5c71ac3d2395c97d4aa387a6ec1de2b84b3e", - [] - ], - "manifest_with_disconnect_failure.json": [ - "96035e7e8b34d982c86e6555b384126e043e03fa", - [] - ], - "manifest_with_no_accounts.json": [ - "0d38f26d350c5064c3cd174d4af2c822c9d2ff97", - [] - ], - "manifest_with_rp_mode.json": [ - "5692fd91905cf37b4e2c301f55c129c21c691e56", - [] - ], - "manifest_with_single_account.json": [ - "5f9b7a81b9a4f9cdb1506dffc922bd15627a1222", - [] - ], - "manifest_with_two_accounts.json": [ - "6310fb0a0becfbe03b7fec666aea406a587b0858", - [] - ], - "manifest_with_variable_accounts.json": [ - "9e4af250045757a3ce7b58bc7d0347ecd2794a40", - [] - ], - "no_accounts.py": [ - "8767c50afb470d994b67b0486791b6835a8f558f", - [] - ], "pending-userinfo-iframe.html": [ - "0afe279bcc57a73210fb41739be69fa1fdb99fc1", + "da2cd26066abd87eaa04d5ade3845424d49de103", [] ], "request-params-check.py": [ "08c28e32b7942d6db83f7b9c2e4664c9cf47987f", [] ], - "resolve.html": [ - "dbdc28c3247a386976e0711d08369dedc69ba4a9", - [] - ], - "select_manifest_in_root_manifest.py": [ - "d4f1efff6a74c7636f60cba35b4eff010fccfd29", - [] - ], - "set_accounts_cookie.py": [ - "15adf11324ee6b7a0b03d402622e6dad82f677c5", - [] - ], "simple.html": [ "d62419ce8a0ac12a85f5b8e595a874714b038b44", [] ], - "single_account.py": [ - "7c8906ae7b97d281b22049266076c0ff72f62385", - [] - ], - "token.py": [ - "7ec81c390a9ea116e0a1809e08159a1d1c40e5a1", - [] - ], - "token_check_disclosure_shown_false.py": [ - "a25a14af694848e65ed7c2943b3482910d20c355", - [] - ], - "token_check_disclosure_shown_true.py": [ - "00b755b920cd999b4bc91af63ed70071a71c634a", - [] - ], - "token_check_same_site_strict.py": [ - "4e55bf27f610032b30eb3278ddd0f7db4716efef", - [] - ], - "token_with_account_id.py": [ - "04e7b5b56b9e560b8ebdaef150ef5037aeb18be0", - [] - ], - "token_with_auto_selected_flag.py": [ - "3e011ce788c88aae5363d367a6c653b655867354", - [] - ], - "token_with_http_error.py": [ - "05b9945ba80dad9fd3bf87a467d50a7f4e9d3071", - [] - ], - "token_with_rp_mode.py": [ - "add634c99bb959eefe821ffad9bb12d9e2a904a2", - [] - ], - "two_accounts.py": [ - "4022561ff78321d91605b07f76d03a1f8deb5297", - [] - ], "userinfo-iframe.html": [ - "45a1a34ce9e360e8eae13cb1e79c011c9b74db4a", - [] - ], - "variable_accounts.py": [ - "fc4446acc49e4e1538a10478e3aa744ccc495db2", + "64d5cb83a088db7dc8f3a9e7e2a65301eb0b64b1", [] ] }, "fedcm-helper.sub.js": [ - "308950e1e29c7cb0a10d366fb40f673e6befc28f", + "17ed5ce4468492368c3bf33e8d9462f9c87641e4", [] ], "fedcm-helper.sub.js.headers": [ @@ -397861,7 +398242,7 @@ [] ], "font-size-adjust-ic-height-ref.html": [ - "2756e91774ccc28bfaf42a79a230a2b6faf1851e", + "1b364bd6d9de648f185d1cb7341964a14fcb7029", [] ], "font-size-adjust-metrics-override-ref.html": [ @@ -407066,6 +407447,10 @@ ] }, "support": { + "F-exif-chunk-early.png": [ + "24bd924e9e71eaaee22961c26e87de314d90f719", + [] + ], "F-exif-early.png": [ "6714cec8253723237cfbe95b319e0ae2162120e6", [] @@ -408548,6 +408933,14 @@ "468739cfcb389638e9cc9880fcc31bd7022e12e6", [] ], + "details-open-ref.html": [ + "88903cb8bbe8287c7307d777414361c7e0e1b7fe", + [] + ], + "implicit-and-explicit-list-item-counters-ref.html": [ + "97cc7de15a377f2927524796831f19d94a48876a", + [] + ], "inline-block-list-marker-ref.html": [ "6deadbfc9b65c7f89d8c428e1da6c75f1adc3d82", [] @@ -411378,6 +411771,14 @@ "4019f3f2d3e12f6d7274372c0d691752b326e382", [] ], + "scrollbar-gutter-fixedpos-003-ref.html": [ + "72a6c087b31d90172a89cc45d99f88436d7dd6c8", + [] + ], + "scrollbar-gutter-fixedpos-004-ref.html": [ + "fe1b96fce8ac4faf2f67e40ca6fbbfd9dad4852e", + [] + ], "scrollbar-gutter-rtl-002-ref.html": [ "e6510a081353db996c4ead14ad6a167b90d48297", [] @@ -411490,6 +411891,92 @@ "a779b263c7d2d9a4be7109431798d86844694a51", [] ], + "margin-boxes": { + "alignment-001-print-ref.html": [ + "e91b2377db1ca232230e6c035a744db77b2e2e52", + [] + ], + "auto-margins-001-print-ref.html": [ + "70f4a41ab59830856ee7d6c5c8b0946a6b06d40a", + [] + ], + "auto-margins-002-print-ref.html": [ + "56adf2a5401944e58bab8382a14879bd1b655bc3", + [] + ], + "auto-margins-003-print-ref.html": [ + "252633b0581a6b2cd09244b0b000b7e7f7effdb8", + [] + ], + "content-001-print-ref.html": [ + "bd3ba7e0ccf47a6b18b548cccf0b01ae62e5212b", + [] + ], + "dimensions-001-print-ref.html": [ + "dca52cb8bc727c99bc941b24797255e89fbf1811", + [] + ], + "dimensions-002-print-ref.html": [ + "83e144fb3363262de938737671522faef5ca6043", + [] + ], + "dimensions-003-print-ref.html": [ + "c491cdde98ee56e98cfba9f15f91f1fbfe2f9952", + [] + ], + "dimensions-004-print-ref.html": [ + "3f45190e330d2df06ad3b6b4928d0239bdb2ca5e", + [] + ], + "dimensions-005-print-ref.html": [ + "1749b1c71471fcceb9599b8e09105b08921ff090", + [] + ], + "dimensions-006-print-ref.html": [ + "f6aa9e60f48b9949a4dabb5833b0590bef56fe81", + [] + ], + "dimensions-007-print-ref.html": [ + "b91c086879a1967dfcd83c2f433c10cdd8824ad2", + [] + ], + "dimensions-008-print-ref.html": [ + "5bd141a28e1cb394beffd81e656d8eaaa7802908", + [] + ], + "dimensions-009-print-ref.html": [ + "922d165efa1b4af7d2c86a4c074894f07eb0a16c", + [] + ], + "dimensions-010-print-ref.html": [ + "a4c0b4702d54007fbc036fd8f4a8e7ecd8196866", + [] + ], + "dimensions-011-print-ref.html": [ + "54983175e3db5052e46af701975393952853ff06", + [] + ], + "dimensions-012-print-ref.html": [ + "e62880031a164230240d334ffa6e370f0ffeb562", + [] + ], + "dimensions-013-print-ref.html": [ + "a131b564fd62fd9f7935bbd371e0298c74e2f68c", + [] + ], + "inapplicable-properties-print-ref.html": [ + "157cb8effa4d501dd3dab2c8535e8cc45f26b390", + [] + ], + "overconstrained-001-print-ref.html": [ + "de6b55257ca2ef63cb612dff61a3a1165e2874c1", + [] + ], + "paint-order-001-print-ref.html": [ + "2677aee123cba64e023d9be967f71a8d4caa5c20", + [] + ] + }, "media-queries-001-print-ref.html": [ "35af04dc3c45b06a092d11569227a9a7014c2068", [] @@ -412859,7 +413346,7 @@ [] ], "first-letter-hi-001-ref.html": [ - "d0decf8bf41d4516895f77ecf3462231d063f09e", + "0eaae755eb91fbb3983ff2caf9bbe4ac4f7bc9e1", [] ], "first-letter-hi-002-ref.html": [ @@ -413688,6 +414175,10 @@ "ruby-annotation-pairing-001-ref.html": [ "2a8f9a836fff9106e1430649cae3ad9a57aea241", [] + ], + "ruby-text-dynamic-style-ref.html": [ + "dd3ab2d445785b85fcec96236b26e4f32c15be41", + [] ] }, "root-ruby-ref.xhtml": [ @@ -416660,6 +417151,10 @@ "63c751165f873060027c809cb3fc165b8974fa99", [] ], + "hyphens-vs-float-clearance-001-ref.html": [ + "1fc7b3d521089f26501a74f8130b0a93ceb91b78", + [] + ], "shy-styling-001-alt-ref.html": [ "c86cb5002867c899f54a59d25c0a0572e7658cd7", [] @@ -423120,6 +423615,14 @@ "text-overflow-ellipsis-indent-001-ref.html": [ "660a7c4d52e7e2a763bfffc7582469896a5835b8", [] + ], + "transparent-accent-color-001-ref.html": [ + "c9d6eb720f1f8f17285014b0b7fa99f86ec6e4e7", + [] + ], + "transparent-accent-color-002-ref.html": [ + "819a5852460eeb295a65ac9acf8ce8683c93170f", + [] ] }, "resize-change-margin-ref.html": [ @@ -424894,6 +425397,10 @@ "029b0e9f86f7043ff92d17071ceca7544649b985", [] ], + "element-escapes-clip-with-abspos-child-ref.html": [ + "1e22d6f66d742b7a8c99b3ecb075356d2811b18b", + [] + ], "element-is-grouping-during-animation-ref.html": [ "38fca3c5288a444b959f1d5279056f8608798fa3", [] @@ -425524,6 +426031,10 @@ "e38cbb0ffeb8c0518bbfbede3b196e326014f78f", [] ], + "transformed-element-scroll-transform-ref.html": [ + "b6e89e28d5acabf6490adc5d5b6dc1e8d8985d6a", + [] + ], "transition-in-empty-iframe-ref.html": [ "29e4c32e5b22b26d6d7036a45468f6424e36bdaf", [] @@ -428462,6 +428973,10 @@ "matchMedia.js": [ "f8947e0472f489ca1a98a9e231b17e7d8ce6585e", [] + ], + "simultaneousScrollIntoViews.js": [ + "f3d02d2598d2624fc602e1a49b6afcbbb24017ed", + [] ] }, "scrollTop-display-change-ref.html": [ @@ -428476,6 +428991,10 @@ "c8a783980f8a36216f282f5873b9e161286ab3ac", [] ], + "smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html": [ + "26dbdd2053ae62efcb7710eecc8dc270119ffe00", + [] + ], "support": { "1x1-green.png": [ "b98ca0ba0a03c580ac339e4a3653539cfa8edc71", @@ -428744,6 +429263,10 @@ "b605e3251c5b91f50a8b001655884b28937e9bef", [] ], + "backdrop-filter-edge-mirror-ref.html": [ + "c80dcb04e5cd81b03535de87b0f305efe865fb0e", + [] + ], "backdrop-filter-edge-pixels-ref.html": [ "36c509ff95d9b667018d070f4c1c7d334437ce37", [] @@ -431962,7 +432485,7 @@ "parts": { "resources": { "domparts-utils.js": [ - "f8982de50f334fa7899385b27085434e4f97a6a7", + "d1da9fb0785f8b9551eacaa83606c84febf80ccd", [] ] } @@ -434170,6 +434693,194 @@ ] } }, + "fedcm": { + "support": { + "accounts.py": [ + "126f911a58c80a62de06b6062cdb4488549471b9", + [] + ], + "accounts_check_same_site_strict.py": [ + "796ac003cbc0bb34773b50c1c5de4351aae8dddd", + [] + ], + "accounts_no_approved_clients.py": [ + "faea06edc363067b83ce23391e75d254cf9eea76", + [] + ], + "client_metadata.py": [ + "72ddcc5cd62569fa280adcab9490e84b851e6780", + [] + ], + "client_metadata.py.headers": [ + "7164e5f81827da39996b033972a508e5b371de11", + [] + ], + "client_metadata_clear_count.py": [ + "0e52d99c1dd23a238daa64869ac0787d6010faba", + [] + ], + "continue_on.py": [ + "2a580e0f3f4fd525c3826795f5bfd05eb0a55675", + [] + ], + "disconnect.py": [ + "cf62ceda22515dd036cdea9fec4de7305b4a51b4", + [] + ], + "disconnect_failure.py": [ + "f880218b2f6156817aeb7ac16c0e1e42f3ed5103", + [] + ], + "error_with_code_and_url.py": [ + "71bfea00f463051e7bd496cf1c28f25208e2b41e", + [] + ], + "login.html": [ + "78d241cda952bccdeff05653f0cc7311afa73710", + [] + ], + "manifest-not-in-list.json": [ + "00700666675413d378bba7c3f8bed12f2b9b4849", + [] + ], + "manifest-token-nocors.json": [ + "77ba1b4702bc03c324d1af007eacb9d24df62c3b", + [] + ], + "manifest.py": [ + "a40fc100eee697ed7dcd451626409af18606442e", + [] + ], + "manifest_check_disclosure_shown_false.json": [ + "47ca63edc4fc96f4d563beba7e872ae5d47461c1", + [] + ], + "manifest_check_disclosure_shown_true.json": [ + "7d7004c3cffee4fdbdf824b28456fd20b617de8b", + [] + ], + "manifest_check_same_site_strict.json": [ + "d7304159834804c417f498acebc45f59e588dcbb", + [] + ], + "manifest_id_assertion_endpoint_returns_error.json": [ + "e098cc4511a1980392097d0a26c020db3243ae35", + [] + ], + "manifest_no_login_url.json": [ + "15a657c679df7b0dfb0be1058e7086b439781762", + [] + ], + "manifest_redirect_accounts.json": [ + "ed9b3c296928c9f177d06477fbd2793c341acf76", + [] + ], + "manifest_redirect_token.json": [ + "ba04e890770e925157826bd2f7fb8d7887ef71e5", + [] + ], + "manifest_token_with_http_error.json": [ + "691a1e8d3a63a3695ec1fd29267506363871af71", + [] + ], + "manifest_with_auto_selected_flag.json": [ + "591c927153b9a78695ded0663fed600cbae5bcb6", + [] + ], + "manifest_with_continue_on.json": [ + "d7673c7e1b13e692ef59c091c32bf520663d058f", + [] + ], + "manifest_with_cross_origin_disconnect.sub.json": [ + "77d27e33f26bbe466e678f17391850ab1bab4548", + [] + ], + "manifest_with_disconnect_failure.json": [ + "96035e7e8b34d982c86e6555b384126e043e03fa", + [] + ], + "manifest_with_no_accounts.json": [ + "0d38f26d350c5064c3cd174d4af2c822c9d2ff97", + [] + ], + "manifest_with_rp_mode.json": [ + "5692fd91905cf37b4e2c301f55c129c21c691e56", + [] + ], + "manifest_with_single_account.json": [ + "5f9b7a81b9a4f9cdb1506dffc922bd15627a1222", + [] + ], + "manifest_with_two_accounts.json": [ + "6310fb0a0becfbe03b7fec666aea406a587b0858", + [] + ], + "manifest_with_variable_accounts.json": [ + "9e4af250045757a3ce7b58bc7d0347ecd2794a40", + [] + ], + "no_accounts.py": [ + "8767c50afb470d994b67b0486791b6835a8f558f", + [] + ], + "resolve.html": [ + "dbdc28c3247a386976e0711d08369dedc69ba4a9", + [] + ], + "select_manifest_in_root_manifest.py": [ + "d4f1efff6a74c7636f60cba35b4eff010fccfd29", + [] + ], + "set_accounts_cookie.py": [ + "15adf11324ee6b7a0b03d402622e6dad82f677c5", + [] + ], + "single_account.py": [ + "7c8906ae7b97d281b22049266076c0ff72f62385", + [] + ], + "token.py": [ + "7ec81c390a9ea116e0a1809e08159a1d1c40e5a1", + [] + ], + "token_check_disclosure_shown_false.py": [ + "a25a14af694848e65ed7c2943b3482910d20c355", + [] + ], + "token_check_disclosure_shown_true.py": [ + "00b755b920cd999b4bc91af63ed70071a71c634a", + [] + ], + "token_check_same_site_strict.py": [ + "4e55bf27f610032b30eb3278ddd0f7db4716efef", + [] + ], + "token_with_account_id.py": [ + "04e7b5b56b9e560b8ebdaef150ef5037aeb18be0", + [] + ], + "token_with_auto_selected_flag.py": [ + "3e011ce788c88aae5363d367a6c653b655867354", + [] + ], + "token_with_http_error.py": [ + "05b9945ba80dad9fd3bf87a467d50a7f4e9d3071", + [] + ], + "token_with_rp_mode.py": [ + "add634c99bb959eefe821ffad9bb12d9e2a904a2", + [] + ], + "two_accounts.py": [ + "4022561ff78321d91605b07f76d03a1f8deb5297", + [] + ], + "variable_accounts.py": [ + "fc4446acc49e4e1538a10478e3aa744ccc495db2", + [] + ] + } + }, "fenced-frame": { "README.md": [ "3dc65fbc050b0596a1b23f4341c5192c41115fe0", @@ -434961,7 +435672,7 @@ [] ], "utils.js": [ - "218ac281f65242565bde58fee0ee8e2998e7e444", + "c4807c58aee02230e2d26950ed56c604a83e84ab", [] ], "web-bluetooth-inner.html": [ @@ -438924,7 +439635,7 @@ [] ], "remote-context-helper.js": [ - "a7202656c860a2a3fbbfc3ce9d688db2cbe37127", + "fc04f950d286c26173aa670ccafc66b72d32c352", [] ] } @@ -442772,20 +443483,12 @@ "meta.yaml": [ "358333d96e0c5a9b26ad65b5fedcb2a3ce604858", [] - ], - "the-canvas-element.yaml": [ - "1ecf8ccdbf17b9d54798d64680fbc04c7c0135ed", - [] ] }, "offscreen": { "meta.yaml": [ "9c1cfbfd0fc80c0eeed751f7dff3bdff64d0df43", [] - ], - "the-offscreen-canvas.yaml": [ - "ccabe094b8a7f8a187feac5d93faf9ad8569ea82", - [] ] } }, @@ -442854,6 +443557,10 @@ "230e45f80a5901cae395ed1c4c848556e333073d", [] ], + "the-canvas.yaml": [ + "4153b8e2dfb748dcf57f64356d0e147979dac9c8", + [] + ], "transformations.yaml": [ "0d2265be7aa0c94ccbddc41f4051dbf082bfc186", [] @@ -443624,6 +444331,10 @@ "bcc6f0734d580474a8bd25f25d4662f175cdc39b", [] ], + "no-secure-context.tentative.html.headers": [ + "bcc6f0734d580474a8bd25f25d4662f175cdc39b", + [] + ], "resources": { "fetch-and-create-url.html": [ "6b0f96221dc47c367a53ffac3b07276070f71892", @@ -449804,46 +450515,6 @@ ] }, "the-canvas-element": { - "initial.colour.png": [ - "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c", - [] - ], - "initial.reset.different.png": [ - "d83fdd55b154fddb0be785f1f163e30bbd9b6a3a", - [] - ], - "initial.reset.path.png": [ - "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c", - [] - ], - "initial.reset.same.png": [ - "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c", - [] - ], - "size.attributes.default.png": [ - "a72d047556a72dc83654077f88bd5ba271dc1a36", - [] - ], - "size.attributes.get.png": [ - "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7", - [] - ], - "size.attributes.reflect.setcontent.png": [ - "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7", - [] - ], - "size.attributes.reflect.setidl.png": [ - "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7", - [] - ], - "size.attributes.removed.png": [ - "1ebf30d8aaaad5e9da7e1db964a548ea6fc75138", - [] - ], - "size.attributes.set.png": [ - "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7", - [] - ], "size.attributes.style.png": [ "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c", [] @@ -465585,6 +466256,10 @@ [] ] }, + "scroll-to-text-fragment-after-DOMContentLoaded-target.html": [ + "b7d517a7f6b2781f882d0f4804225354d8dd0ac8", + [] + ], "scroll-to-text-fragment-target.html": [ "b2be85132cb8f2f2c14c82bf1854c3130f375c96", [] @@ -468945,7 +469620,7 @@ [] ], "util.sub.js": [ - "37b440da52a93ec2bea416de9ad61dc64f0c5e83", + "dc1ec780a24007d275fbfc751410a95f99073353", [] ], "verify-get-undefined-module.js": [ @@ -471096,7 +471771,17 @@ "blank.svg": [ "9e560bdc5feddc1ae76e3950e89efc1c31dc9269", [] - ] + ], + "support": { + "use-external-reload-in-iframe-child.html": [ + "f027f5151fe9ebe2342ca6c152737f722eba2099", + [] + ], + "use-external-reload-in-iframe-resource.svg": [ + "8bc72975282e0034ccb46fac5baeac0d9cbf0fa5", + [] + ] + } } }, "styling": { @@ -471547,11 +472232,11 @@ [] ], "requirements_macos_color_profile.txt": [ - "8e178d1d2c464d1ed69b3e4d21cffa482b5bc618", + "cd3e785aa47963c00137c5c94d55c8f3cb692d8e", [] ], "requirements_tc.txt": [ - "b3c1c51f129b07fc0383de30ab659142052404eb", + "a9128c02eb93c807bcb331e4ee09df9cbc4fd278", [] ], "run_tc.py": [ @@ -471683,7 +472368,7 @@ [] ], "requirements.txt": [ - "6451b3a800432a5272bcbc635d34864455101618", + "b275ccfd8f1505c29cd1f29fc161e3b50f9af358", [] ], "retry.py": [ @@ -472154,7 +472839,7 @@ [] ], "requirements_mypy.txt": [ - "3b1d3b03d6445c4324c298c7a034b42bb847be01", + "2addbba3b226b77cfdde985bf484582cc87000d2", [] ], "requirements_pytest.txt": [ @@ -479783,7 +480468,7 @@ [] ], "request_handler.py": [ - "9d89b47c69b7eddfda6d7a13592204f531e701be", + "e02e2ccf28f6e435f51ac83b7b68825938ebd420", [] ], "server_util.py": [ @@ -482524,7 +483209,7 @@ [] ], "transport.py": [ - "ca1ff74ef96767afa76c200b159671d99762cb84", + "e5ed3473ed4b0d1c3592040ee227002d1ddddc05", [] ] } @@ -482579,7 +483264,7 @@ [] ], "browser.py": [ - "4c42ffa4e82d22e316a235b93dcc29dee55c217f", + "ba716cd14f6d700325b956d1cadab2110402db43", [] ], "commands.json": [ @@ -482603,7 +483288,7 @@ [] ], "requirements.txt": [ - "2c24336eb3167f69afa069e02a2e44f55162039d", + "d80d9fc2a3a2b61bfeaee0004be49f7a69cf8f63", [] ], "requirements_android.txt": [ @@ -482619,7 +483304,7 @@ [] ], "run.py": [ - "2fb7f97f498c4a47235c286da8fee3035a459da9", + "9c6acbc2a465235d0cf708076736defd6fd9017b", [] ], "testfiles.py": [ @@ -482775,7 +483460,7 @@ ] }, "requirements.txt": [ - "fba8e42ebe2fb68869916fa4a3b1844c39f2cfec", + "ae71bbbad6d9ca1d82e65046c18d2e06559460b4", [] ], "requirements_chromium.txt": [ @@ -482795,7 +483480,7 @@ [] ], "requirements_sauce.txt": [ - "806352e87e2471e760e2c2e5916353e2ec34dfa1", + "f6f1581d858b3de002c3972b854d0323acd95a7e", [] ], "setup.py": [ @@ -482813,7 +483498,7 @@ ], "browsers": { "__init__.py": [ - "d54a9be943008fb2b02a8918649f3dae573fcf8e", + "aaf91a1dc86efc84eb77b8f83f194596ad9f0217", [] ], "android_webview.py": [ @@ -482821,11 +483506,11 @@ [] ], "base.py": [ - "dd4fc314fc0449a35bfe6a58e9fa4921dcd62d64", + "fee8895ef3a060421d83ba0ccfffb0d3b53eac94", [] ], "chrome.py": [ - "c0a176743defc1f9ef8d506e13e3776afb4d2096", + "3b1bd6411e235af721c6ce6901f1f60e10be97b7", [] ], "chrome_android.py": [ @@ -482833,7 +483518,7 @@ [] ], "chrome_ios.py": [ - "db81b91957b0639097ce33dd666716c13efced90", + "e559a5d7573e0000a09776d12475879249ea25e3", [] ], "chrome_spki_certs.py": [ @@ -482844,10 +483529,6 @@ "13cb49aed21087dc9371c3c559c9143a49fc6936", [] ], - "content_shell.py": [ - "6df8671e0ac32ae7e4b51e31b96fde3a4b8c3b35", - [] - ], "edge.py": [ "82597c9312a4ad655aa9cb9a223179e55d74975d", [] @@ -482857,13 +483538,17 @@ [] ], "firefox.py": [ - "d22da8568adbe91e2c3379683e249507a908a35a", + "d977930a289b614caf4e0c598876500b20630497", [] ], "firefox_android.py": [ "526f83d595f23d6fb5c30381bf885670498b807f", [] ], + "headless_shell.py": [ + "e7da3e64548669f373aca6c1a350ebf1d4330581", + [] + ], "ladybird.py": [ "4738a71f1946d46bcf2b70e7502016153865ce96", [] @@ -482925,19 +483610,19 @@ [] ], "base.py": [ - "20bddaa4bc9e40e1253a0d06ac293aca1e91a862", + "f0264173b18580a33d0b403fb32f3b2acf1c47e1", [] ], "executorchrome.py": [ - "46d38f14c55ee4ddc4452eec972df30ee07ed354", + "d972a0eea5f3ff021c16d262764730b5400cf9ee", [] ], "executoredge.py": [ - "ad546b7e84062b1cecd6fb42e96f4d4e3af4a0b8", + "75a3313c55c3dff4f63104953204b6095949703d", [] ], "executormarionette.py": [ - "05a9fc1ae4b87462121cb24a28e251559e5df812", + "fe1fed136309ba137b705dc68917864f9bf878a2", [] ], "executorselenium.py": [ @@ -482953,7 +483638,7 @@ [] ], "executorwebdriver.py": [ - "f985d4867591cf13a02a17b5f58e3033628fce3f", + "20ae4a42118d19d0b34395a920025d7a6dd2a281", [] ], "executorwktr.py": [ @@ -482961,7 +483646,7 @@ [] ], "process.py": [ - "4a2c01372e0bdfb06cdd9fefca50ed275e2974d0", + "b90e45d36780f0a89b0f8bc9ff2b29a221bdf839", [] ], "protocol.py": [ @@ -483112,11 +483797,11 @@ [] ], "testloader.py": [ - "098e443b5ce412e26f01438d64cae2f9253a5d13", + "c7cdee6887ec51e25fdbaa95210afe3568d45bf4", [] ], "testrunner.py": [ - "93e19fa47ba0360923dc5ac6c1d5a2d221ad8051", + "0a5dfb1fd1864f9456769e4a99c95c61747a89c3", [] ], "tests": { @@ -483134,7 +483819,7 @@ [] ], "test_base.py": [ - "b5e40e3f8df1a1c69b0bc946c2b26901bd4d4b45", + "a3d804336e12ebc214c452c3c449fb75836c6d45", [] ], "test_sauce.py": [ @@ -486405,7 +487090,7 @@ }, "browsing_context": { "__init__.py": [ - "91899eb50df49b1ab47e55ab52c2b49bd2a4fe0e", + "a60940d370fdd7f5e1b25fbdd6bbbc504c8669c1", [] ], "activate": { @@ -486635,7 +487320,7 @@ }, "network": { "__init__.py": [ - "c1b4c1dd54bf0879259a7c1983f6ee9d697016cc", + "319d90d3defe97af3a358a3444e651fca3bc2df0", [] ], "add_intercept": { @@ -487364,7 +488049,7 @@ [] ], "fixtures_bidi.py": [ - "a9cefd004b14f622fcec8cca8cb2315d138698b9", + "3e97cfe3ce4c9c321dfe45b1244aa5ea02bdfb20", [] ], "fixtures_http.py": [ @@ -492857,7 +493542,7 @@ ] ], "Blob-constructor.any.js": [ - "6dc44e8e156cce3c3b6bcdb9afe9d32a727da793", + "57a85624340e56c933676615fa8994bbb8b6b0c9", [ "FileAPI/blob/Blob-constructor.any.html", { @@ -506064,7 +506749,7 @@ ] }, "getRandomValues.any.js": [ - "2b82b9bedb9082876a7f47b8e3e0b33766c04144", + "0437857f2faabc39c037d51b9f0d3ff39b9b7ddf", [ "WebCryptoAPI/getRandomValues.any.html", {} @@ -517898,7 +518583,7 @@ ] ], "decompression-buffersource.tentative.any.js": [ - "abb51751c8b4a3f7b3800731def8a8e902678a57", + "f4316ba1fc876ec4c332690a66cf224681ce37be", [ "compression/decompression-buffersource.tentative.any.html", { @@ -528435,7 +529120,7 @@ ] ], "fedcm-use-other-account-button-flow.tentative.https.html": [ - "3b90782713f5829e87f753fbf349c2a700862443", + "7a3f266b24b937fae03c9886184ada6e8b27c960", [ null, { @@ -528444,7 +529129,7 @@ ] ], "fedcm-use-other-account.tentative.https.html": [ - "96006cce68c802c7df7addfc7040d00e71f63b99", + "66311740124a2dd6aff0c8f90aff68f289724cd6", [ null, { @@ -528454,7 +529139,7 @@ ] }, "fedcm-client-metadata-not-cached.https.html": [ - "b802369256ab44c793f8c6c340660954de54d078", + "79171bf6343287fa42c0aaa1c53a2d4e69899425", [ null, { @@ -528490,7 +529175,7 @@ ] ], "fedcm-disconnect-errors.https.html": [ - "dbf42c4083bbb2601de44eca4877eea7ed0b9df1", + "4d5fb0a457c7acd0d5c23818f4623826324f7336", [ null, { @@ -528535,7 +529220,7 @@ ] ], "fedcm-error-basic.https.html": [ - "fd902bcf9042ba4234bcd25b7c62d1a09e7f7c0e", + "8a2d39cabaaa37a95f050cc84af2fe2c786ec825", [ null, { @@ -528786,7 +529471,7 @@ ] ], "fedcm-too-many-disconnect-calls.https.html": [ - "cb5dfa615f34bc7de4ecdd9ab4c4a11b3ce0eb2d", + "eb87c2377a916b68e1ebf189a0de7d8af1c191df", [ null, { @@ -537495,28 +538180,30 @@ ] ] }, - "reading-order": { - "reading-order-items-computed.html": [ - "a8280337665d7779f59dac55d342d8224d262b94", - [ - null, - {} - ] - ], - "reading-order-items-invalid.html": [ - "eff5846e316cafce44f3c876c6a1ad9056a2d939", - [ - null, - {} - ] - ], - "reading-order-items-valid.html": [ - "d1ac7de64eb869dc585680f5bdde06839453c448", - [ - null, - {} + "reading-flow": { + "tentative": { + "reading-flow-computed.html": [ + "65ef90f5a50b792b1da4eef61352109b17fd4968", + [ + null, + {} + ] + ], + "reading-flow-invalid.html": [ + "1d489b795640d4a9ebbb5bf113ef014e96dd565a", + [ + null, + {} + ] + ], + "reading-flow-valid.html": [ + "3d650c53063db6baa455d6a42d7604fdd63c6830", + [ + null, + {} + ] ] - ] + } }, "textarea-display.html": [ "44634e3c3bdb7187f14c24b922d098ee273f995d", @@ -544675,6 +545362,13 @@ {} ] ], + "grid-template-important.html": [ + "c9b9bd83f5e2a24a7f49912c4b85c37e1fdd7188", + [ + null, + {} + ] + ], "grid-template-node-not-connected.html": [ "89bee03a11bcae62448a088889398ba32e6f25bb", [ @@ -563040,7 +563734,7 @@ ] ], "revert-in-fallback.html": [ - "ae99e5192fd2587332c23b6a0ff604956a845e17", + "956965ab7abb1dc67713ad90ce6b5bff1284e14d", [ null, {} @@ -563391,8 +564085,15 @@ {} ] ], + "hit-test-pseudo-element-element-from-point.html": [ + "9bc1f5751fc61dd69e7fc7805d113fdac64c848f", + [ + null, + {} + ] + ], "hit-test-unpainted-element-from-point.html": [ - "b34d2b11df558327fbdd87dc3b4ded2b362bff14", + "c950cc126e016f1c80321b0ffd2790ce5b149ee3", [ null, {} @@ -566636,6 +567337,20 @@ {} ] ], + "scrollIntoView-multiple-nested.html": [ + "630cd21b6137c2150bb6a3363c4654b885f5e20a", + [ + null, + {} + ] + ], + "scrollIntoView-multiple.html": [ + "e6ddd1818f2ab861017c25b112725b448c2b1c09", + [ + null, + {} + ] + ], "scrollIntoView-scrollMargin.html": [ "930702aa8792506df50120feaca86d3f76bc1a02", [ @@ -566686,7 +567401,7 @@ ] ], "scrollIntoView-smooth.html": [ - "ddfa31076c2bff7711ed493dbaec0943fd03ff87", + "324e51d7388a04fdc3b53e26542284e4aa6a6792", [ null, {} @@ -566797,6 +567512,22 @@ {} ] ], + "smooth-scrollIntoView-with-smooth-fragment-scroll.html": [ + "72ecdf15e5511532944aa24d05c84f37ce04a6ce", + [ + null, + {} + ] + ], + "smooth-scrollIntoView-with-unrelated-gesture-scroll.html": [ + "f42fcb298570ccc6d56d63657982cabeb874b559", + [ + null, + { + "testdriver": true + } + ] + ], "subpixel-sizes-and-offsets.tentative.html": [ "d198b9dde60c8cac16241c412d3e55f772166010", [ @@ -570886,7 +571617,7 @@ }, "digital-credentials": { "identity-get.tentative.https.html": [ - "ba5212e433b42eb6a19e5a137aaedcc7869e75eb", + "850533cd262fe9eb9ffa4a129f60a9986662cec1", [ null, { @@ -572504,7 +573235,7 @@ ] ], "scrollend-event-fired-for-scrollIntoView.html": [ - "8782b1dfee623741dd2830d538684ecffe767f18", + "40aa77f4764b6c4301b8aba7221e1e42e768505d", [ null, { @@ -575050,14 +575781,14 @@ }, "parts": { "basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html": [ - "b2782dbfa9bcd95007cc1855521e2e4d1c464c7a", + "932c0a392a36a5c61ae9da72a99855549e7bc882", [ null, {} ] ], "basic-dom-part-declarative-brace-syntax.tentative.html": [ - "3a4370387373a364a8ac818aee6cbb0e97fe0c6d", + "70fc471bc61204f8dadf1370654f35f121f2348f", [ null, {} @@ -576023,7 +576754,7 @@ ] ], "edit-context-input.tentative.html": [ - "762ec59547599f68aec3dc0ba8f2955d753f12d9", + "45fd1613faccb8b34f55f1a2783e9db35596d2d1", [ null, { @@ -614925,6 +615656,41 @@ } ] ], + "get-interest-group-auction-data.https.window.js": [ + "29f58ebe9b1fd61e64ece49387114f9916f60ff6", + [ + "fledge/tentative/get-interest-group-auction-data.https.window.html?1-4", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-4" + ] + ], + "timeout": "long" + } + ] + ], "insecure-context.window.js": [ "9016277b73139d050e3d688c3f21cb40048464e2", [ @@ -623430,6 +624196,15 @@ {} ] ], + "permission.tentative.https.html": [ + "34758660b77a97783e07bfa73258e46edace020c", + [ + null, + { + "testdriver": true + } + ] + ], "promises-reject.html": [ "4385b1646d65128d053c8dcded532997c8ed0557", [ @@ -623863,6 +624638,24 @@ {} ] ], + "tojson.https.window.js": [ + "f8cef07a7f0d4325914fbf07bc34c681804b9d51", + [ + "geolocation/tojson.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ] + ] + } + ] + ], "watchPosition_TypeError.https.html": [ "4ae7a8903716dd792337de245fd85b313456611a", [ @@ -627945,6 +628738,40 @@ ] }, "remote-context-helper-tests": { + "addEmbed.window.js": [ + "c389410d5d323bcd45e4e9206c4b310d880d5309", + [ + "html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.html", + { + "script_metadata": [ + [ + "title", + "RemoteContextWrapper addEmbed" + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/test-helper.js" + ] + ] + } + ] + ], "addFrame.window.js": [ "4c3c2eebe171685c44796842fe70efb0aa9df8b9", [ @@ -628115,6 +628942,40 @@ } ] ], + "addObject.window.js": [ + "1d83d9a463d581b936d613f1e31bd0e5194dafec", + [ + "html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.html", + { + "script_metadata": [ + [ + "title", + "RemoteContextWrapper addObject" + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/test-helper.js" + ] + ] + } + ] + ], "addScripts.window.js": [ "01cf06c65d52ec6d6208dce339dcf6cf07e89680", [ @@ -628813,6 +629674,13 @@ "timeout": "long" } ] + ], + "target-pseudo-after-reinsertion.html": [ + "3e46c28104ca1864b97422c8c671d033e4f38602", + [ + null, + {} + ] ] }, "unloading-documents": { @@ -632689,14 +633557,14 @@ ] ], "2d.canvas.context.extraargs.cache.html": [ - "f4db40815dcc518a75f1568ab1cfc21ba0cf9db5", + "236f17e6d57b4d6d96a8c6c4dd414e2cb335a4d2", [ null, {} ] ], "2d.canvas.context.extraargs.create.html": [ - "6ae7f787c6adeceabc3dfe37a981cf07eb46de2e", + "b0b00ddd78ea6deb6b53283fe9ec5f4b734fe0a1", [ null, {} @@ -632710,7 +633578,7 @@ ] ], "2d.canvas.context.prototype.html": [ - "5d5edc6864bc994a0b60a1fb80535598857fad40", + "18a37a185dd907ed69907003b343124c0b6031ec", [ null, {} @@ -632760,6 +633628,13 @@ ] }, "canvas-host": { + "2d.canvas.host.initial.color.html": [ + "795804a4d21cc5b9c8e88f6f86625bfa2bbfdf36", + [ + null, + {} + ] + ], "2d.canvas.host.initial.reset.2dstate.html": [ "e1940011989c98b352a690f5218d349b56697747", [ @@ -632767,15 +633642,85 @@ {} ] ], + "2d.canvas.host.initial.reset.clip.html": [ + "86da296dc01510e48d96a0f0ff9d9cab5fa09444", + [ + null, + {} + ] + ], + "2d.canvas.host.initial.reset.different.html": [ + "b95527083b0fbc4dedd728ca3b87a57fed2d7bdb", + [ + null, + {} + ] + ], + "2d.canvas.host.initial.reset.gradient.html": [ + "de0f19c13c119d0c86dec66f06030c27c9456f83", + [ + null, + {} + ] + ], + "2d.canvas.host.initial.reset.path.html": [ + "6eda186dcbc606c70b39d60bfe26282d488334bf", + [ + null, + {} + ] + ], + "2d.canvas.host.initial.reset.pattern.html": [ + "3cb45257a0fef51030ef6427751ed9ee308f4c9b", + [ + null, + {} + ] + ], + "2d.canvas.host.initial.reset.same.html": [ + "6e2d912af58c5764ec952376804b16a8f59036b0", + [ + null, + {} + ] + ], + "2d.canvas.host.initial.reset.transform.html": [ + "d285785ed2fb6525b2ff751af5db5f5c0e561b28", + [ + null, + {} + ] + ], "2d.canvas.host.readonly.html": [ - "cbbf32f2e2bd77ab112d6f80b6d2d578a9da0fc0", + "44d922933448701fe715e36c35a82b0e4c4395f4", [ null, {} ] ], "2d.canvas.host.reference.html": [ - "6a4bdb65b082180b4af66d1cbe38f85446f0a894", + "f7166f99d6c2a429e8a4f8cc6ef54f376bb0053e", + [ + null, + {} + ] + ], + "2d.canvas.host.size.attributes.default.html": [ + "c34b085a9b9d78366e02d3de42205ad5d6ec92b6", + [ + null, + {} + ] + ], + "2d.canvas.host.size.attributes.idl.html": [ + "38332cc575c34512c447feeaafaeaf76667c64c1", + [ + null, + {} + ] + ], + "2d.canvas.host.size.attributes.idl.set.zero.html": [ + "e142ec684a484824bb9ff1cae8b7fabcb3fd2bd8", [ null, {} @@ -632886,6 +633831,34 @@ {} ] ], + "2d.canvas.host.size.attributes.reflect.setcontent.html": [ + "2e2abaef2a763da673386810bb9b361a78c9a847", + [ + null, + {} + ] + ], + "2d.canvas.host.size.attributes.reflect.setidl.html": [ + "d017070a39e4bf97bdf402b13690d6418c4c93c4", + [ + null, + {} + ] + ], + "2d.canvas.host.size.attributes.reflect.setidlzero.html": [ + "d7747e1f188674da95c04e4841520e5ec075b61e", + [ + null, + {} + ] + ], + "2d.canvas.host.size.attributes.removed.html": [ + "15cf17cbeadb0e8e63aec3eabb2e71c5485c0061", + [ + null, + {} + ] + ], "2d.canvas.host.size.attributes.setAttribute.decimal.html": [ "b6c2130bf0afec9b139d6b670c9ea2403d1e89ab", [ @@ -632990,6 +633963,34 @@ null, {} ] + ], + "2d.canvas.host.size.invalid.attributes.idl.html": [ + "8711657f13c2a2ac15649fb645a456f989923c4b", + [ + null, + {} + ] + ], + "2d.canvas.host.size.large.html": [ + "039949cfd01369a0fae66e18dac045d037ffb5a6", + [ + null, + {} + ] + ], + "2d.canvas.host.type.delete.html": [ + "90f5c4ce9036f3bbf24d3234d46dd49d687e8f04", + [ + null, + {} + ] + ], + "2d.canvas.host.type.name.html": [ + "c0f93876c32ad813325d5640cd05036f1f544e3f", + [ + null, + {} + ] ] }, "compositing": { @@ -640360,47 +641361,75 @@ ] ], "2d.canvas.context.exists.html": [ - "41b5cfee311334cdb35e5721b88f4bc93a11e427", + "21f35515a53708c512f8e4983a14b0752d04aa3d", [ null, {} ] ], "2d.canvas.context.exists.worker.js": [ - "77a43530a04636635cca71221f577df7a56e5337", + "f56aff7e12963f772297ceab8f4207dc8e6ba839", [ "html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.html", {} ] ], "2d.canvas.context.extraargs.cache.html": [ - "2bcf34490ea9ca75d49191ccdf7188eb8797d5f5", + "42f29e4fe90263460fc07e45419fd149ca959d7c", [ null, {} ] ], "2d.canvas.context.extraargs.cache.worker.js": [ - "14284a0a7d7c1c5931f0ff82ad6e02ca1274d7b9", + "f508d5262e0608a2cbe64dd894aa47e4d438e83a", [ "html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.html", {} ] ], "2d.canvas.context.extraargs.create.html": [ - "029122355c9c8ccaff5e48fc50da707ff5baf236", + "199f5b82edf3c4fc55c1b5b54fa091d06d1b6f1f", [ null, {} ] ], "2d.canvas.context.extraargs.create.worker.js": [ - "b4208edba8cffa2ffdb249b80189aae88573582c", + "d1bfbcc683cfcaf4223aac69a78c7296c187aaeb", [ "html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.html", {} ] ], + "2d.canvas.context.invalid.args.html": [ + "ce71d4cf30f4d2742d41ccff028b70bcac47f104", + [ + null, + {} + ] + ], + "2d.canvas.context.invalid.args.worker.js": [ + "faea21714d56f0d9843a21eb364eece9c50afd5b", + [ + "html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.html", + {} + ] + ], + "2d.canvas.context.prototype.html": [ + "17e5f08946417a83047dd2415eefdc50f1ca4279", + [ + null, + {} + ] + ], + "2d.canvas.context.prototype.worker.js": [ + "dd41239d00c37c73f4833e7bcd5d28f5340bda34", + [ + "html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.html", + {} + ] + ], "2d.canvas.context.shared.html": [ "cb9501747eec2c5fde1a63eae5546a64154b1179", [ @@ -640415,73 +641444,73 @@ {} ] ], - "2d.canvas.context.unique.html": [ - "66e4a049baad4b090ca18664782f5197d842ebce", + "2d.canvas.context.type.exists.html": [ + "96b35d86fa1f8dfbbe71e717d0e2e6f6f7aa24de", [ null, {} ] ], - "2d.canvas.context.unique.worker.js": [ - "275e45fde64266a3b8d7474f93e8af615eec1ed9", + "2d.canvas.context.type.exists.worker.js": [ + "239c3e902eacb61428c776e95d9f13c287ea0244", [ - "html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.html", + "html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.html", {} ] ], - "2d.canvas.context.unrecognised.badname.html": [ - "4313f408437e360a08c5d5264b87a46036b2a9ca", + "2d.canvas.context.type.extend.html": [ + "a3f720c7462f79948e2286daf8d45eb8c39b703a", [ null, {} ] ], - "2d.canvas.context.unrecognised.badname.worker.js": [ - "dd16f2fbe1108751f07d1d7a0d05064ffc849995", + "2d.canvas.context.type.extend.worker.js": [ + "9832c5ca77f0559a93e67d122d1f3fc779d0a8ec", [ - "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.html", + "html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.html", {} ] ], - "2d.canvas.context.unrecognised.badsuffix.html": [ - "c00afa686edd563972620ec5717f252cc57dd347", + "2d.canvas.context.type.prototype.html": [ + "d08193c0def5f8ce82795dacd24e3cfb77385801", [ null, {} ] ], - "2d.canvas.context.unrecognised.badsuffix.worker.js": [ - "5e684c92c72acd87b4c84d48ec6778dbd3553a62", + "2d.canvas.context.type.prototype.worker.js": [ + "459975d32d2c7be264ee1b70206d9ac452ee37fd", [ - "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.html", + "html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.html", {} ] ], - "2d.canvas.context.unrecognised.nullsuffix.html": [ - "0ce3d4195e0d19cd882e2019ec1455e83d01613f", + "2d.canvas.context.type.replace.html": [ + "69b22412fa5f628e4bd562bbde99a7484e89b190", [ null, {} ] ], - "2d.canvas.context.unrecognised.nullsuffix.worker.js": [ - "2886010fb644a69ea5e3c96050560a450cb500f2", + "2d.canvas.context.type.replace.worker.js": [ + "e6793d1bf56d94fd4cb1aaecfe059d3b5f19e4bb", [ - "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.html", + "html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.html", {} ] ], - "2d.canvas.context.unrecognised.unicode.html": [ - "316123675ad75e31a85c0286760d374c7f316e90", + "2d.canvas.context.unique.html": [ + "828817bfbf444c69d45264d02fdfb2e261e23810", [ null, {} ] ], - "2d.canvas.context.unrecognised.unicode.worker.js": [ - "46e562dd486835e28b41c6215273ebc8f8d4c21e", + "2d.canvas.context.unique.worker.js": [ + "90687bfd07e6fff5936132b2f255f3dbfbc260c4", [ - "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.html", + "html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.html", {} ] ], @@ -640625,14 +641654,14 @@ ] ], "2d.canvas.host.readonly.html": [ - "0e7e10cd242adf6d09ea41e0ca6df4f39d3182a9", + "93262a6cc87c709610e579274506728f0b5d93ce", [ null, {} ] ], "2d.canvas.host.readonly.worker.js": [ - "bbe50dcf61f461ceb3d7e1887d0c4049bf3292ae", + "5baef1b374057326c91b25030a88756cf3119728", [ "html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.html", {} @@ -640667,7 +641696,7 @@ ] ], "2d.canvas.host.size.attributes.idl.html": [ - "7030103524caeb33d53d717624de77515924bfa1", + "b8ce99afdfd7203ad215d1638225d1e7d2fe5eb7", [ null, {} @@ -640688,7 +641717,7 @@ ] ], "2d.canvas.host.size.attributes.idl.worker.js": [ - "a00201f18cc59687e75881b3763e1869b14c8ee8", + "42002e8355fd5f53a64b66ec60b8370d92059552", [ "html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.html", {} @@ -640932,6 +641961,20 @@ {} ] ], + "2d.canvas.host.size.invalid.attributes.idl.html": [ + "2194de929c52b218085976552206e5e7b682ea00", + [ + null, + {} + ] + ], + "2d.canvas.host.size.invalid.attributes.idl.worker.js": [ + "8adb7a514c542bbf3acf19be4c0922bc4d46fb4a", + [ + "html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.html", + {} + ] + ], "2d.canvas.host.size.large.html": [ "b220f8f2edea11803098283367b624f97ec56869", [ @@ -640945,6 +641988,34 @@ "html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.worker.html", {} ] + ], + "2d.canvas.host.type.delete.html": [ + "1d2a733ada7eab058e16b20795e945a11dc9db43", + [ + null, + {} + ] + ], + "2d.canvas.host.type.delete.worker.js": [ + "409e12cd0d0d090dbef46a221e7ba96d06b17029", + [ + "html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.html", + {} + ] + ], + "2d.canvas.host.type.name.html": [ + "5f48c09eaace8064a10e0ef5349824c2f5ebda73", + [ + null, + {} + ] + ], + "2d.canvas.host.type.name.worker.js": [ + "ea50e4f7f0c4266db762be78fbeda58095c71c1e", + [ + "html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.html", + {} + ] ] }, "compositing": { @@ -657717,6 +658788,13 @@ } ] ], + "no-secure-context.tentative.html": [ + "a00183738e3736057bd9b35929c2b644b5a66eeb", + [ + null, + {} + ] + ], "shared-workers.tentative.https.html": [ "d0a186f45e7865c9f585112601f934b1861c5471", [ @@ -662863,6 +663941,13 @@ null, {} ] + ], + "details-display.tentative.html": [ + "27573bcdc695f057b754c5264342b8390801fee2", + [ + null, + {} + ] ] }, "unmapped-attributes.html": [ @@ -666112,62 +667197,6 @@ {} ] ], - "initial.colour.html": [ - "166732a57b32df8997b387b11caf2771c840998b", - [ - null, - {} - ] - ], - "initial.reset.clip.html": [ - "ebf52bfa764a3431f11edea22ca485c6398aafb0", - [ - null, - {} - ] - ], - "initial.reset.different.html": [ - "d55dd250c091a2a550d44ba6fc6dc791c2a13241", - [ - null, - {} - ] - ], - "initial.reset.gradient.html": [ - "31b56ec8e9ba41510c282116e156d9091626aaff", - [ - null, - {} - ] - ], - "initial.reset.path.html": [ - "3525377d2db6b376ce53730fb920d4a811a00db4", - [ - null, - {} - ] - ], - "initial.reset.pattern.html": [ - "28f8306d96d3996488dae532e5e16aa7622c1327", - [ - null, - {} - ] - ], - "initial.reset.same.html": [ - "1a0872ba2c05bdef16e0cb1e4a4ae4469496fcb5", - [ - null, - {} - ] - ], - "initial.reset.transform.html": [ - "36284ba4984108b589014b136aa8e3c88c23357e", - [ - null, - {} - ] - ], "security.dataURI.html": [ "93b560e82c472eaf8f9018c865d6eefd4d03db92", [ @@ -666322,55 +667351,6 @@ {} ] ], - "size.attributes.default.html": [ - "ecf35285a1b8e665919f94d1b98b3c4f50eee41f", - [ - null, - {} - ] - ], - "size.attributes.idl.html": [ - "1594a1c5e59c7b0ab2d607577292ce641f366432", - [ - null, - {} - ] - ], - "size.attributes.idl.set.zero.html": [ - "c09d5cb278a7d917ad6b38c055aa5eee82725267", - [ - null, - {} - ] - ], - "size.attributes.reflect.setcontent.html": [ - "a25c4b784a29b16708d6a8959151b1982dc8c7d3", - [ - null, - {} - ] - ], - "size.attributes.reflect.setidl.html": [ - "e228276da70a587a77aca253e1df17e91218ee1c", - [ - null, - {} - ] - ], - "size.attributes.reflect.setidlzero.html": [ - "65df3f9f94e9ec98b640e8d74d5c24a3ebffda79", - [ - null, - {} - ] - ], - "size.attributes.removed.html": [ - "c96cba7b1758fcc607ba8bcc6e082d61a94db83b", - [ - null, - {} - ] - ], "size.attributes.style.html": [ "aeb5c7ecb2ec1a71f83a8b68c2dd3298992d1ff8", [ @@ -666553,47 +667533,12 @@ {} ] ], - "type.delete.html": [ - "7fd54b30d5319c7c28c6dfa0f533f16f2b240ae9", - [ - null, - {} - ] - ], "type.exists.html": [ "26f59a1614384b69b43964c5ce586d1e347eb342", [ null, {} ] - ], - "type.extend.html": [ - "e17209f455a768c49433b6b18074cda92b435833", - [ - null, - {} - ] - ], - "type.name.html": [ - "fdf1d1d39885c41e6389fc8fbfdd87024301a73c", - [ - null, - {} - ] - ], - "type.prototype.html": [ - "f47f755388fb46bcac920809d5e1faac5db6b8cf", - [ - null, - {} - ] - ], - "type.replace.html": [ - "e67fe7c4a26303197bb2d596778d8db8aae873b8", - [ - null, - {} - ] ] }, "the-embed-element": { @@ -666811,6 +667756,20 @@ {} ] ], + "iframe-loading-lazy-history-pushState.html": [ + "09af8b3693f0d7da84f62ebee1ae43356801d04b", + [ + null, + {} + ] + ], + "iframe-loading-lazy-history-replaceState.html": [ + "ac9117a46cecb52ffa3e08827330eaf6314067e4", + [ + null, + {} + ] + ], "iframe-loading-lazy-in-script-disabled-iframe.html": [ "4f191cd7842675d763079911fe9f8b80bd447506", [ @@ -666902,6 +667861,69 @@ {} ] ], + "iframe-loading-lazy-nav-form-submit.html": [ + "7f94d6021fafcd95d03d35544f3249609360bd2c", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-link-click-fragment.html": [ + "c81a01833a2a8103601829da6660fc1536c77d7b", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-link-click.html": [ + "d8d85b62a4bd624c23f9046128289b2234689321", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-location-assign.html": [ + "88ec129fbc0da941bd5c64d81a65c494cbde8e17", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-location-replace-set-src.html": [ + "e2f0c6dceb9348c80ffb7dc55251cc62edb7309c", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-location-replace.html": [ + "9d3c4fbc1320cabe9fc2ff239a83e2ccad3624be", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-meta-refresh.optional.html": [ + "0cc7e11041505519a14ba978c4e94c6e97f32df5", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-navigation-navigate.html": [ + "1010c540b7fd59521278ece38b34f9e572e4e4a6", + [ + null, + {} + ] + ], + "iframe-loading-lazy-nav-window-open.html": [ + "579c079ce7025a2b20bfe928df69fb47816d6eb4", + [ + null, + {} + ] + ], "iframe-loading-lazy-referrerpolicy-change.sub.html": [ "68734d5708da40b7e5e533cb2ddee41c8a3d719f", [ @@ -666909,6 +667931,20 @@ {} ] ], + "iframe-loading-lazy-reload-location-reload.html": [ + "a670de1f5c5f815ecbe11cc30026a2db8490435a", + [ + null, + {} + ] + ], + "iframe-loading-lazy-reload-navigation-reload.html": [ + "aefd6c472b5ae888e0786de8e26e8d9ad5111adb", + [ + null, + {} + ] + ], "iframe-loading-lazy-to-eager.html": [ "371601a8c3a167e91804945fefe6db3154483cd2", [ @@ -683934,7 +684970,7 @@ ] ], "roles.tentative.html": [ - "a3eb850497eaeb2cf3f52da3ad20ab37d1e53735", + "3920f2cba9e339ac2a15d9ebe92c1615d7e59c92", [ null, { @@ -683943,7 +684979,7 @@ ] ], "table-roles.html": [ - "a81caa3d3f0f77ff76185be7e351c7ef76f2fe58", + "8f5033ea8115cb8382783f04ee928b01b3538fbd", [ null, { @@ -686069,7 +687105,7 @@ ] ], "callback-cross-realm-report-exception.html": [ - "0bec720485dc6d570a252760db4397e78c300b65", + "7fa979167436b934ee04eb852d37706ed742ea13", [ null, {} @@ -702426,8 +703462,218 @@ } ] ], + "unload-allowed-embed.tentative.window.js": [ + "5bd745db1dec5e615b30606cca9767192d2cc251", + [ + "permissions-policy/experimental-features/unload-allowed-embed.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "'unload' Policy : allowed in frames when allowed in main frame." + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/unload-helper.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "unload-allowed-frameset.tentative.window.js": [ + "fe4f55dbc75b5091be66fadce0d5a968c160d880", + [ + "permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "'unload' Policy : allowed in frames when allowed in main frame." + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/unload-helper.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "unload-allowed-object.tentative.window.js": [ + "376bb4cb1d06633a77df7b4c8248162455e3979b", + [ + "permissions-policy/experimental-features/unload-allowed-object.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "'unload' Policy : allowed in frames when allowed in main frame." + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/unload-helper.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "unload-disallowed-embed.tentative.window.js": [ + "cfdb29bc51a15e2a05cc247a5f210ab80118dc90", + [ + "permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "'unload' Policy : disallowed in frames when disallowed in main frame." + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/unload-helper.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "unload-disallowed-frameset.tentative.window.js": [ + "e64c32a21a042fca693cb960c3e3957f61768230", + [ + "permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "'unload' Policy : disallowed in frames when disallowed in main frame." + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/unload-helper.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "unload-disallowed-object.tentative.window.js": [ + "33c23239e6d6fd3f7f578295da93adcdd07d9941", + [ + "permissions-policy/experimental-features/unload-disallowed-object.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "'unload' Policy : disallowed in frames when disallowed in main frame." + ], + [ + "script", + "/common/dispatcher/dispatcher.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js" + ], + [ + "script", + "./resources/unload-helper.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], "unload-disallowed-subframe.tentative.window.js": [ - "b2fb19ae1295d5750c656834f37a2e7ab64b9f50", + "4d8ddbcd16e46aa09463bdcb38c2c40539279398", [ "permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.html", { @@ -703697,7 +704943,7 @@ ] ], "pointerevent_after_target_removed_from_slot.html": [ - "170c1ec2f1c9b98abcfdeee51c2e43463489ce01", + "1d183afa61428f0c15a464220151f5608e297df8", [ "pointerevents/pointerevent_after_target_removed_from_slot.html?mouse", { @@ -721498,7 +722744,7 @@ ] ], "getdisplaymedia.https.html": [ - "4558786faa1183fe4a594455788769b2a74decee", + "4a7c655335161afdeaf398a4e6225598de325ce9", [ null, { @@ -722997,6 +724243,16 @@ {} ] ], + "scroll-to-text-fragment-after-DOMContentLoaded.html": [ + "a08d75588d08797fbe6fdcc15e7f3615927de3ef", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "scroll-to-text-fragment-api.html": [ "d644b6b64fb530fef800c5abaaf91835eda9aa83", [ @@ -723649,6 +724905,13 @@ {} ] ], + "move-paragraph-cross-editing-boundary.tentative.html": [ + "f6a558d7582e73386b9e7f6b1443d31b35efb875", + [ + null, + {} + ] + ], "move-selection-range-into-different-root.tentative.html": [ "d6e4ccda257212e580768fb00d26ce15c2fb9cf3", [ @@ -723800,6 +725063,13 @@ {} ] ], + "selectionchange-on-shadow-dom.html": [ + "fd246c509240c56aa9b0e3b16f8fe9db4dcf45d4", + [ + null, + {} + ] + ], "selectionchange.html": [ "1c4ddf2b9baad5a907bd5c186c3c892a6608644c", [ @@ -727613,7 +728883,7 @@ ] ], "gethtml.html": [ - "ff70653477f6a9d813fb65f9fd3944b8443691f3", + "0477cdaf820ec55890142baad459dfc642a95569", [ null, { @@ -728194,10 +729464,10 @@ } ] ], - "reading-order": { + "reading-flow": { "tentative": { "flex-flow.html": [ - "d69f95e2afcf077a333332c13f99788a8ebd5d7c", + "e6998105608c99e3a3dca3de610018bebda81172", [ null, { @@ -728207,7 +729477,7 @@ ] ], "flex-visual-order.html": [ - "ce91f9b3c4c7e618e493d852ca4a861c86d1d774", + "d8515fd928c777659f599f53a94b6d9ac5728a81", [ null, { @@ -728216,7 +729486,7 @@ ] ], "grid-columns.html": [ - "f07dc63bc58b9c03b3a80ac1a0cfa6073fdfb319", + "ad9bd81c7a7967fbe582843e02a5c4e2749d477f", [ null, { @@ -728226,7 +729496,7 @@ ] ], "grid-order-across-scopes.html": [ - "81d1b7de539596a144ad75c77f95c321090880db", + "9f7772b91185351da72f56ad300fd6c4e3d5d7ff", [ null, { @@ -728235,7 +729505,7 @@ ] ], "grid-order-on-shadow-host.html": [ - "a48eda1b57cd26b642edeed2d890bbf01a6043fe", + "f5a8b3c313e5d20963233cc868b4a8ce27eaab07", [ null, { @@ -728244,7 +729514,7 @@ ] ], "grid-order-with-iframe.html": [ - "87b9e0a83dfec85132859156bc54aead6914cae4", + "fab6a7b8a681da079d707124ee0e43ca15980212", [ null, { @@ -728253,7 +729523,7 @@ ] ], "grid-order-with-nested-grids.html": [ - "15bdcf996fd4a2855ddd36995855d64f8593667e", + "5daabefd7ff6638fa49595406d8aadd8255ac90d", [ null, { @@ -728263,7 +729533,7 @@ ] ], "grid-order-with-popover.html": [ - "c96a0c4fcf7712ae8365fd77f97b1ee9c7335a6e", + "822907378cb5431fdcbcd6c826414ddab2bdad72", [ null, { @@ -728273,7 +729543,7 @@ ] ], "grid-order-with-slots.html": [ - "ed658b3510ae0ad983dbc53391f1ff90efb5d61a", + "4cfdc79fa4057eee49498bf6d57b912c4e714355", [ null, { @@ -728283,7 +729553,7 @@ ] ], "grid-order.html": [ - "3ee91358fd612dc83afb10038e52163dbecd6d8b", + "358f5c2988c2a5fce8f3702eeb6e1de57a20753f", [ null, { @@ -728293,7 +729563,7 @@ ] ], "grid-rows.html": [ - "f24427468435b47c800cfd5a1ba390d270e1d2b8", + "41f986c1f4b305113d3a3bdbb6098ee06be35db6", [ null, { @@ -729252,6 +730522,13 @@ {} ] ], + "cross-origin-create-worklet-data-origin-option.tentative.https.sub.html": [ + "8242f3d10835ca4066b7b7c7529d0b454354dae3", + [ + null, + {} + ] + ], "cross-origin-create-worklet-failure-false-shared-storage-cross-origin-worklet-allowed.tentative.https.sub.html": [ "db361776f638731401883e8605c5e4f9d2a28411", [ @@ -729385,6 +730662,13 @@ {} ] ], + "same-origin-create-worklet-data-origin-option.tentative.https.sub.html": [ + "c84246f65b1c182174fcf515818033a2ec1118ab", + [ + null, + {} + ] + ], "select-url-keep-alive.tentative.https.sub.html": [ "f3755538b9d4b23e026fec85c161cb730531d4dc", [ @@ -743231,6 +744515,13 @@ {} ] ], + "use-external-reload-in-iframe.html": [ + "ab1214d20f1e8f5e29024195c624735ed8c9dfc7", + [ + null, + {} + ] + ], "use-load-error-events.tentative.html": [ "2c52072e16906575679ab654b7e901a08b5541c7", [ @@ -743840,6 +745131,13 @@ {} ] ], + "SVGLength-zoom.html": [ + "5b8cb16b94f322151b1e97c2560650b8a097f50b", + [ + null, + {} + ] + ], "SVGLength.html": [ "7436f5940c5d7432ab318759d3bb83df597c35af", [ @@ -744107,7 +745405,7 @@ ] ], "single-touch-vertical-rl.html": [ - "857007b1f8a5c548da2e2c306cb80bdea96bf2e5", + "3c34a6d9c96a052759d822397124affe3b36319c", [ null, { @@ -744760,7 +746058,7 @@ ] ], "trusted-types-duplicate-names-list.html": [ - "afb2f5f7c4b7f6ddfe8da004750017e6c7f01f9a", + "404619b5f7a17c43a1609e4ecc9f4e48ace945f5", [ null, {} @@ -755224,7 +756522,7 @@ }, "time-transformations": { "transformed-progress.html": [ - "960e333c09268f68d23ba2d0208202f8262ec3ef", + "a8fae03db5a3c14dd2c060879a0e9d20f5861276", [ null, {} @@ -759243,7 +760541,7 @@ ] ], "public-key-credential-creation-options-from-json.https.window.js": [ - "c0f1a08cf903b8b0f504df08e56be00c3a1e3248", + "fe2df1ef7fd434209c7eb2ebe09065784cc2db9e", [ "webauthn/public-key-credential-creation-options-from-json.https.window.html", { @@ -759268,6 +760566,32 @@ } ] ], + "public-key-credential-request-options-from-json.https.window.js": [ + "82e778b027d35733b456598c472c64ced0562e83", + [ + "webauthn/public-key-credential-request-options-from-json.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/resources/utils.js" + ], + [ + "script", + "helpers.js" + ] + ] + } + ] + ], "public-key-credential-to-json.https.window.js": [ "2f805d3ab7a888c98ee27f867732b5c95cfcbb01", [ @@ -763993,7 +765317,7 @@ ] ], "videoFrame-construction.any.js": [ - "9f2929aedec6c136c0738e2f96b4f4c32516f448", + "f49cb62c5c0468df0c9d853d7200b62b1d9ed653", [ "webcodecs/videoFrame-construction.any.html", { @@ -778375,7 +779699,7 @@ ] ], "lstm.https.any.js": [ - "c7d341a9d5aa29ab9ca77f8344439c258e6092dd", + "2a3eaa1c20258b9e2e6177c34c651d41e11e21a5", [ "webnn/validation_tests/lstm.https.any.html", { @@ -779172,7 +780496,7 @@ ] ], "triangular.https.any.js": [ - "ee8958659c7452987352931db289812679f89759", + "59694a426036aba9517af64e8426e6a25f51ec28", [ "webnn/validation_tests/triangular.https.any.html", { @@ -780022,7 +781346,7 @@ ] ], "RTCRtpReceiver-getParameters.html": [ - "7047ce7d1f363b7d2e06ebbebea11736abcccf3e", + "14ec74b66a0329479c83d074e9b97b90347c9a46", [ null, {} @@ -780085,6 +781409,13 @@ {} ] ], + "RTCRtpSender-getParameters.html": [ + "6c47153c8365aff1a0c93740635ef87c6b589b26", + [ + null, + {} + ] + ], "RTCRtpSender-getStats.https.html": [ "6aeed650e58c7be225b773095b8f035cd216d5d0", [ @@ -796562,7 +797893,7 @@ ] ], "usbDevice.https.any.js": [ - "804af2afb9db3a0d5fafbeb26aed64f89badb1b3", + "a716e847c415b90e3904cb5d4f60c570bd856c7c", [ "webusb/usbDevice.https.any.html", { @@ -826252,7 +827583,7 @@ ] ], "user_context.py": [ - "98d6a2e2c8bfc7a9bf0600017ed9f9729d2836f3", + "49a8397474bb5c9f22a3fde580c17e26c6cd54aa", [ null, {} @@ -826339,7 +827670,14 @@ }, "context_created": { "context_created.py": [ - "5172b25d9971bb2538185f9c82475ac76fb2252a", + "63dbd3a23c58bdb8a1d989d8574faf445390fb0b", + [ + null, + {} + ] + ], + "original_opener.py": [ + "115f9679df76880271720a8947afad97896f614b", [ null, {} @@ -826449,7 +827787,7 @@ }, "handle_user_prompt": { "handle_user_prompt.py": [ - "767305405c656cd0fe4bcf4e29c312e002c98bd0", + "6dbe7446b634d69ea84541f8f7797b085800f917", [ null, {} @@ -826738,8 +828076,15 @@ ] }, "user_prompt_closed": { + "beforeunload.py": [ + "c4c51603619d3aa9aa85f2fc4f8d9cb5a9ef2597", + [ + null, + {} + ] + ], "user_prompt_closed.py": [ - "68a0eed1922ea8a5520190f7babb85f315719c70", + "a8ab1490c4664945736afa7660480c4e1074fd6f", [ null, {} @@ -826747,8 +828092,15 @@ ] }, "user_prompt_opened": { + "beforeunload.py": [ + "782cc766507419568ff668648d16b63cd67a3780", + [ + null, + {} + ] + ], "user_prompt_opened.py": [ - "c37bb66e4e9d6a499a5e87e7338d952562649325", + "e4e633e4564b46f0ed07cbf9e34cdbabe02da2e8", [ null, {} @@ -827090,7 +828442,7 @@ }, "before_request_sent": { "before_request_sent.py": [ - "22588b7013a55b285e15d0ee52fa8ffe608bf02f", + "3ef51b2d61c171328c6d7a5435912fe4a327c014", [ null, {} @@ -827263,7 +828615,7 @@ }, "response_completed": { "response_completed.py": [ - "30b35ef7e0d03a1199bab744bf7eb0ca95cf0e85", + "51333a0195f41869662830cba7fbd4d18e31f691", [ null, {} @@ -827279,7 +828631,7 @@ }, "response_started": { "response_started.py": [ - "030d9168a1d8fd6692ba28827689df8e1c6f4cc9", + "17ec9ffe31b33f9799db722fefc12b3c9c2c7e2d", [ null, {} @@ -827927,7 +829279,7 @@ }, "close_window": { "close.py": [ - "680f471839c7125098042c7c0c44e20674a6e838", + "f606e957d418a70b502bf02ddeff0b7db7a74612", [ null, {} @@ -827981,7 +829333,7 @@ }, "delete_session": { "delete.py": [ - "a3032cc13475bf2980b360d9d140e2d2f58a9034", + "3721ea28e28e3725e24e69b22bad42eecf28dc15", [ null, {} @@ -829433,6 +830785,13 @@ } }, "interop": { + "beforeunload_prompt.py": [ + "1e47f6906761bc614575cb061a8d57cc23a2cde1", + [ + null, + {} + ] + ], "frames.py": [ "b2cafb498703ba24dac0bfe2a158e630f6aa50d5", [ diff --git a/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini b/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini index 4671cc872fe..b45205c6462 100644 --- a/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini +++ b/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini @@ -17,7 +17,7 @@ [Null arrays: BigUint64Array] expected: FAIL - [Float arrays] + [Float16 arrays] expected: FAIL @@ -40,5 +40,5 @@ [Null arrays: BigUint64Array] expected: FAIL - [Float arrays] + [Float16 arrays] expected: FAIL diff --git a/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini new file mode 100644 index 00000000000..98d15fdb816 --- /dev/null +++ b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini @@ -0,0 +1,18 @@ +[reading-flow-computed.html] + [Property reading-flow value 'normal'] + expected: FAIL + + [Property reading-flow value 'flex-visual'] + expected: FAIL + + [Property reading-flow value 'flex-flow'] + expected: FAIL + + [Property reading-flow value 'grid-rows'] + expected: FAIL + + [Property reading-flow value 'grid-columns'] + expected: FAIL + + [Property reading-flow value 'grid-order'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini new file mode 100644 index 00000000000..9b3ebfaee3a --- /dev/null +++ b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini @@ -0,0 +1,18 @@ +[reading-flow-valid.html] + [e.style['reading-flow'\] = "normal" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "flex-visual" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "flex-flow" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "grid-rows" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "grid-columns" should set the property value] + expected: FAIL + + [e.style['reading-flow'\] = "grid-order" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini b/tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini deleted file mode 100644 index bfbb8d57dbd..00000000000 --- a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[reading-order-items-computed.html] - [Property reading-order-items value 'normal'] - expected: FAIL - - [Property reading-order-items value 'flex-visual'] - expected: FAIL - - [Property reading-order-items value 'flex-flow'] - expected: FAIL - - [Property reading-order-items value 'grid-rows'] - expected: FAIL - - [Property reading-order-items value 'grid-columns'] - expected: FAIL - - [Property reading-order-items value 'grid-order'] - expected: FAIL diff --git a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini b/tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini deleted file mode 100644 index 8fa1c144a47..00000000000 --- a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[reading-order-items-valid.html] - [e.style['reading-order-items'\] = "normal" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "flex-visual" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "flex-flow" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "grid-rows" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "grid-columns" should set the property value] - expected: FAIL - - [e.style['reading-order-items'\] = "grid-order" should set the property value] - expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini b/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini new file mode 100644 index 00000000000..58588e322c0 --- /dev/null +++ b/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini @@ -0,0 +1,2 @@ +[font-size-adjust-ic-height.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini b/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini deleted file mode 100644 index 69a38ce77ee..00000000000 --- a/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-size-adjust-ic-height.tentative.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini new file mode 100644 index 00000000000..4d1405fd38b --- /dev/null +++ b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini @@ -0,0 +1,2 @@ +[image-orientation-exif-png-2.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini new file mode 100644 index 00000000000..a5e9153e1b2 --- /dev/null +++ b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini @@ -0,0 +1,2 @@ +[image-orientation-exif-png-3.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-lists/details-open.html.ini b/tests/wpt/meta/css/css-lists/details-open.html.ini new file mode 100644 index 00000000000..c8587942f36 --- /dev/null +++ b/tests/wpt/meta/css/css-lists/details-open.html.ini @@ -0,0 +1,2 @@ +[details-open.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini b/tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini new file mode 100644 index 00000000000..7a0dea87709 --- /dev/null +++ b/tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini @@ -0,0 +1,2 @@ +[implicit-and-explicit-list-item-counters.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini new file mode 100644 index 00000000000..784929fa209 --- /dev/null +++ b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini @@ -0,0 +1,2 @@ +[hyphens-vs-float-clearance-001.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini new file mode 100644 index 00000000000..6214b59d4c3 --- /dev/null +++ b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini @@ -0,0 +1,2 @@ +[hyphens-vs-float-clearance-002.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini b/tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini deleted file mode 100644 index 26435e28b09..00000000000 --- a/tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[vh_not_refreshing_on_chrome.html] - expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini new file mode 100644 index 00000000000..83e7d9ca15d --- /dev/null +++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini @@ -0,0 +1,12 @@ +[scrollIntoView-multiple-nested.html] + [Simultaneous smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous smooth,instant scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant,smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant scrollIntoViews run to completion] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini new file mode 100644 index 00000000000..2e26c21bf51 --- /dev/null +++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini @@ -0,0 +1,12 @@ +[scrollIntoView-multiple.html] + [Simultaneous smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous smooth,instant scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant,smooth scrollIntoViews run to completion] + expected: FAIL + + [Simultaneous instant scrollIntoViews run to completion] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini b/tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini new file mode 100644 index 00000000000..321dc54f98d --- /dev/null +++ b/tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini @@ -0,0 +1,7 @@ +[smooth-scrollIntoView-with-smooth-fragment-scroll.html] + expected: TIMEOUT + [Smooth scroll to hash fragment (on pageload) alongside smooth scrollIntoView runs to completion.] + expected: TIMEOUT + + [Smooth scroll to hash fragment (on click) alongside smooth scrollIntoView runs to completion.] + expected: NOTRUN diff --git a/tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini b/tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini new file mode 100644 index 00000000000..51318cbb1d2 --- /dev/null +++ b/tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-edge-mirror.html] + expected: FAIL diff --git a/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini b/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini index 5e6dca448af..4648085f98d 100644 --- a/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini +++ b/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini @@ -1,7 +1,7 @@ [element-img-environment-change.sub.html] expected: TIMEOUT [sec-fetch-site - Not sent to non-trustworthy same-site destination, no attributes] - expected: FAIL + expected: TIMEOUT [sec-fetch-site - Not sent to non-trustworthy cross-site destination, no attributes] expected: NOTRUN diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini new file mode 100644 index 00000000000..518e7cde25d --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini @@ -0,0 +1,4 @@ +[addEmbed.window.html] + expected: TIMEOUT + [RemoteContextWrapper addEmbed] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini new file mode 100644 index 00000000000..426a2fdf64e --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini @@ -0,0 +1,4 @@ +[addObject.window.html] + expected: TIMEOUT + [RemoteContextWrapper addObject] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini deleted file mode 100644 index 7a5fcb79165..00000000000 --- a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[traverse_the_history_5.html] - [Multiple history traversals, last would be aborted] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini index 5c6c73a74f7..e12e364d828 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini +++ b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini @@ -1,5 +1,3 @@ -[initial.reset.path.html] - type: testharness +[2d.canvas.host.initial.reset.path.html] [Resetting the canvas state resets the current path] expected: FAIL - diff --git a/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini new file mode 100644 index 00000000000..f6455f9bd76 --- /dev/null +++ b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini @@ -0,0 +1,2 @@ +[2d.canvas.host.size.large.html] + expected: CRASH diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini new file mode 100644 index 00000000000..b942e4f7dc2 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.invalid.args.html] + [Calling getContext with invalid arguments.] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini new file mode 100644 index 00000000000..cb833a67760 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.invalid.args.worker.html] + [Calling getContext with invalid arguments.] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini new file mode 100644 index 00000000000..93c6d0311c2 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.prototype.html] + [checks OffscreenCanvasRenderingContext2D prototype] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini new file mode 100644 index 00000000000..6fb21f3ff0b --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.prototype.worker.html] + [checks OffscreenCanvasRenderingContext2D prototype] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini new file mode 100644 index 00000000000..26aad00b3ec --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.exists.html] + [The 2D context interface is a property of 'window'] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini new file mode 100644 index 00000000000..d5f7ace91cf --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.exists.worker.html] + [The 2D context interface is a property of 'self'] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini new file mode 100644 index 00000000000..879ed9966cf --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.extend.html] + [Interface methods can be added] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini new file mode 100644 index 00000000000..3c236139ef3 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.extend.worker.html] + [Interface methods can be added] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini new file mode 100644 index 00000000000..0383bffaeb4 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.prototype.html] + [window.CanvasRenderingContext2D.prototype are not [[Writable\]\] and not [[Configurable\]\], and its methods are [[Configurable\]\].] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini new file mode 100644 index 00000000000..f60498b30bf --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.prototype.worker.html] + [window.CanvasRenderingContext2D.prototype are not [[Writable\]\] and not [[Configurable\]\], and its methods are [[Configurable\]\].] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini new file mode 100644 index 00000000000..fe8eaedb0ae --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.replace.html] + [Interface methods can be overridden] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini new file mode 100644 index 00000000000..f055817dca7 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.context.type.replace.worker.html] + [Interface methods can be overridden] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini deleted file mode 100644 index 61f40bc0e2a..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badname.html] - [getContext with unrecognised context name returns null] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini deleted file mode 100644 index ba433ddb153..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badname.worker.html] - [getContext with unrecognised context name returns null] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini deleted file mode 100644 index 42e7640cc34..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badsuffix.html] - [Context name "2d" plus a suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini deleted file mode 100644 index 89c114b0e1d..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.badsuffix.worker.html] - [Context name "2d" plus a suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini deleted file mode 100644 index 8cd6b8b614c..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.nullsuffix.html] - [Context name "2d" plus a "\\0" suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini deleted file mode 100644 index e850767487e..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.nullsuffix.worker.html] - [Context name "2d" plus a "\\0" suffix is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini deleted file mode 100644 index 88eff7740fd..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.unicode.html] - [Context name which kind of looks like "2d" is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini deleted file mode 100644 index 7cf8fcb7e38..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.canvas.context.unrecognised.unicode.worker.html] - [Context name which kind of looks like "2d" is unrecognised] - expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini index dd83740eda3..48717ac03e5 100644 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini @@ -1,3 +1,6 @@ [2d.canvas.host.readonly.html] [canvas is readonly] expected: FAIL + + [Canvas objects are readonly] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini index b2478bd393c..f267de666ad 100644 --- a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini @@ -1,3 +1,6 @@ [2d.canvas.host.readonly.worker.html] [canvas is readonly] expected: FAIL + + [Canvas objects are readonly] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini index 7a67c55bf1d..672798f3f81 100644 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html.ini +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini @@ -1,3 +1,3 @@ -[2d.canvas.host.size.attributes.idl.html] +[2d.canvas.host.size.invalid.attributes.idl.html] [Getting/setting width/height IDL attributes] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini new file mode 100644 index 00000000000..acf2210f82b --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.host.size.invalid.attributes.idl.worker.html] + [Getting/setting width/height IDL attributes] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini new file mode 100644 index 00000000000..49e1b9a2259 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.host.type.delete.html] + [OffscreenCanvas interface object is [[Configurable\]\]] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini new file mode 100644 index 00000000000..209c5fbbfd3 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.host.type.delete.worker.html] + [OffscreenCanvas interface object is [[Configurable\]\]] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini new file mode 100644 index 00000000000..cbbdddc58e0 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini @@ -0,0 +1,3 @@ +[2d.canvas.host.type.name.html] + [OffscreenCanvas type and toString] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini new file mode 100644 index 00000000000..48dd17b1b82 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini @@ -0,0 +1,3 @@ +[2d.canvas.host.type.name.worker.html] + [OffscreenCanvas type and toString] + expected: FAIL diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini index 830aeb8ae48..fdc27d37788 100644 --- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini +++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini @@ -1,7 +1,6 @@ [autofocus-dialog.html] - expected: TIMEOUT [<dialog> can contain autofocus, without stopping page autofocus content from working] expected: FAIL [<dialog>-contained autofocus element gets focused when the dialog is shown] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini index b680c14d61c..ddd65fdcec8 100644 --- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini +++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini @@ -1,19 +1,15 @@ [supported-elements.html] - expected: TIMEOUT [Contenteditable element should support autofocus] expected: FAIL [Host element with delegatesFocus including no focusable descendants should be skipped] - expected: NOTRUN + expected: FAIL [Element with tabindex should support autofocus] - expected: TIMEOUT + expected: FAIL [Area element should support autofocus] - expected: NOTRUN + expected: FAIL [Host element with delegatesFocus should support autofocus] - expected: NOTRUN - - [Non-HTMLElement should not support autofocus] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini b/tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini new file mode 100644 index 00000000000..06f2790b6bb --- /dev/null +++ b/tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini @@ -0,0 +1,15 @@ +[details-display.tentative.html] + [default display of first summary child of details is list-item] + expected: FAIL + + [display of details element can be changed] + expected: FAIL + + [display of first summary child of details can be changed] + expected: FAIL + + [display of other summary element in details can be changed] + expected: FAIL + + [display of summary element outside details can be changed] + expected: FAIL diff --git a/tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini b/tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini new file mode 100644 index 00000000000..a4978181305 --- /dev/null +++ b/tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini @@ -0,0 +1,2 @@ +[input-checkbox-zero-size.html] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini new file mode 100644 index 00000000000..2790024adc1 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-history-pushState.html] + [History state change for iframe loading='lazy' before it is loaded: history.pushState] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini new file mode 100644 index 00000000000..72fd909874f --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-history-replaceState.html] + [History state change for iframe loading='lazy' before it is loaded: history.replaceState] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini new file mode 100644 index 00000000000..ce58a9da176 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-link-click-fragment.html] + [Navigating iframe loading='lazy' before it is loaded: link click (fragment)] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini new file mode 100644 index 00000000000..50155ba1c77 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-location-replace-set-src.html] + [Navigating iframe loading='lazy' and then setting src: location.replace] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini new file mode 100644 index 00000000000..7cdcf205066 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-meta-refresh.optional.html] + [Navigating iframe loading='lazy' before it is loaded: meta refresh] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini new file mode 100644 index 00000000000..396370a990c --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-nav-navigation-navigate.html] + [Navigating iframe loading='lazy' before it is loaded: navigation.navigate] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini new file mode 100644 index 00000000000..247b8ee99a6 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-reload-location-reload.html] + [Reloading iframe loading='lazy' before it is loaded: location.reload] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini new file mode 100644 index 00000000000..0c94be22223 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini @@ -0,0 +1,3 @@ +[iframe-loading-lazy-reload-navigation-reload.html] + [Reloading iframe loading='lazy' before it is loaded: location.reload] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini index 24903b5f66f..d7e7d1b9815 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini @@ -1,4 +1,4 @@ [iframe_sandbox_popups_escaping-1.html] - expected: TIMEOUT + expected: CRASH [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index d4b2e4435a0..7da2bc5ac80 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_escaping-3.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index 5799e6c26cd..e8872b3585b 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_nonescaping-1.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index ccdaf8d61b2..ff6467094b8 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,3 +1,3 @@ [iframe_sandbox_popups_nonescaping-3.html] [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini deleted file mode 100644 index 3cdeb8ebcbc..00000000000 --- a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[non-active-document.html] - [DOMParser] - expected: FAIL diff --git a/tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini b/tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini new file mode 100644 index 00000000000..54f418b142b --- /dev/null +++ b/tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini @@ -0,0 +1,6 @@ +[move-paragraph-cross-editing-boundary.tentative.html] + [cross editing boundary] + expected: FAIL + + [not cross editing boundary] + expected: FAIL diff --git a/tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini b/tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini new file mode 100644 index 00000000000..d2480558e0a --- /dev/null +++ b/tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini @@ -0,0 +1,2 @@ +[selectionchange-on-shadow-dom.html] + expected: ERROR diff --git a/tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini b/tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini deleted file mode 100644 index aa6c9e5b826..00000000000 --- a/tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html] - expected: TIMEOUT - [StorageKey: test 3P about:blank window opened from a 3P iframe] - expected: TIMEOUT diff --git a/tests/wpt/tests/.well-known/web-identity b/tests/wpt/tests/.well-known/web-identity index 6f1260dbc37..c36f63e8138 100644 --- a/tests/wpt/tests/.well-known/web-identity +++ b/tests/wpt/tests/.well-known/web-identity @@ -7,7 +7,7 @@ def main(request, response): if manifest_url is None or not len(manifest_url): port = request.server.config.ports["https"][0] hostname = request.url_parts.hostname - manifest_url = "https://{0}:{1}/credential-management/support/fedcm/manifest.py".format( + manifest_url = "https://{0}:{1}/fedcm/support/manifest.py".format( hostname, str(port)) else: try: diff --git a/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js b/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js index 6dc44e8e156..57a85624340 100644 --- a/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js +++ b/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js @@ -290,16 +290,24 @@ test_blob(function() { new Int16Array([0x4150, 0x5353]), new Uint32Array([0x53534150]), new Int32Array([0x53534150]), - new Float16Array([2.65625, 58.59375]), new Float32Array([0xD341500000]) ]); }, { - expected: "PASSPASSPASSPASSPASSPASSPASSPASS", + expected: "PASSPASSPASSPASSPASSPASSPASS", type: "", desc: "Passing typed arrays as elements of the blobParts array should work." }); test_blob(function() { return new Blob([ + new Float16Array([2.65625, 58.59375]) + ]); +}, { + expected: "PASS", + type: "", + desc: "Passing a Float16Array as element of the blobParts array should work." +}); +test_blob(function() { + return new Blob([ // 0x535 3415053534150 // 0x535 = 0b010100110101 -> Sign = +, Exponent = 1333 - 1023 = 310 // 0x13415053534150 * 2**(-52) diff --git a/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js b/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js index 2b82b9bedb9..0437857f2fa 100644 --- a/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js +++ b/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js @@ -3,6 +3,14 @@ test(function() { assert_throws_dom("TypeMismatchError", function() { self.crypto.getRandomValues(new Float16Array(6)) }, "Float16Array") + + assert_throws_dom("TypeMismatchError", function() { + const len = 65536 / Float16Array.BYTES_PER_ELEMENT + 1; + self.crypto.getRandomValues(new Float16Array(len)); + }, "Float16Array (too long)") +}, "Float16 arrays"); + +test(function() { assert_throws_dom("TypeMismatchError", function() { self.crypto.getRandomValues(new Float32Array(6)) }, "Float32Array") @@ -11,10 +19,6 @@ test(function() { }, "Float64Array") assert_throws_dom("TypeMismatchError", function() { - const len = 65536 / Float16Array.BYTES_PER_ELEMENT + 1; - self.crypto.getRandomValues(new Float16Array(len)); - }, "Float16Array (too long)") - assert_throws_dom("TypeMismatchError", function() { const len = 65536 / Float32Array.BYTES_PER_ELEMENT + 1; self.crypto.getRandomValues(new Float32Array(len)); }, "Float32Array (too long)") diff --git a/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js b/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js index abb51751c8b..f4316ba1fc8 100644 --- a/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js +++ b/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js @@ -49,7 +49,7 @@ const bufferSourceChunksForDeflate = [ }, { name: 'Float16Array', - value: new Float16Array(new Uint8Array(compressedBytesWithDeflate).buffer) + value: () => new Float16Array(new Uint8Array(compressedBytesWithDeflate).buffer) }, { name: 'Float32Array', @@ -100,7 +100,7 @@ const bufferSourceChunksForGzip = [ }, { name: 'Float16Array', - value: new Float16Array(new Uint8Array(compressedBytesWithGzip).buffer) + value: () => new Float16Array(new Uint8Array(compressedBytesWithGzip).buffer) }, { name: 'Float32Array', @@ -151,7 +151,7 @@ const bufferSourceChunksForDeflateRaw = [ }, { name: 'Float16Array', - value: new Float16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + value: () => new Float16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) }, { name: 'Float32Array', @@ -172,7 +172,7 @@ for (const chunk of bufferSourceChunksForDeflate) { const ds = new DecompressionStream('deflate'); const reader = ds.readable.getReader(); const writer = ds.writable.getWriter(); - const writePromise = writer.write(chunk.value); + const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); writer.close(); const { value } = await reader.read(); assert_array_equals(Array.from(value), deflateExpectedChunkValue, 'value should match'); @@ -184,7 +184,7 @@ for (const chunk of bufferSourceChunksForGzip) { const ds = new DecompressionStream('gzip'); const reader = ds.readable.getReader(); const writer = ds.writable.getWriter(); - const writePromise = writer.write(chunk.value); + const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); writer.close(); const { value } = await reader.read(); assert_array_equals(Array.from(value), gzipExpectedChunkValue, 'value should match'); @@ -196,7 +196,7 @@ for (const chunk of bufferSourceChunksForDeflateRaw) { const ds = new DecompressionStream('deflate-raw'); const reader = ds.readable.getReader(); const writer = ds.writable.getWriter(); - const writePromise = writer.write(chunk.value); + const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); writer.close(); const { value } = await reader.read(); assert_array_equals(Array.from(value), deflateRawExpectedChunkValue, 'value should match'); diff --git a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py index 3a914379671..b025012ec8e 100644 --- a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py +++ b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py @@ -32,12 +32,16 @@ def main(request, response): background-color: maroon; } </style> - <script nonce="abc"> + <script nonce="123"> var response = {}; response["id"] = "%s"; response["loaded"] = true; window.top.postMessage(response, '*'); </script> + <script> + // Inline script which might be blocked by CSP. + navigator.userAgent; + </script> </body> </html> ''' % (message, message) diff --git a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js index 7d2307ebbc9..551ad0348a7 100644 --- a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js +++ b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js @@ -110,61 +110,65 @@ function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI, if (csp != null) i.csp = csp; - var loaded = {}; - var onLoadReceived = {}; - window.addEventListener("message", function (e) { - if (e.source != i.contentWindow) - return; - if (e.data["loaded"]) - loaded[e.data["id"]] = true; - }); - if (shouldBlock) { // Assert iframe does not load and is inaccessible. - window.onmessage = t.step_func(function(e) { - if (e.source != i.contentWindow) - return; + window.addEventListener("message", t.step_func(function(e) { + if (e.source != i.contentWindow) return; assert_unreached('No message should be sent from the frame.'); - }); - i.onload = t.step_func(function () { - // Delay the check until after the postMessage has a chance to execute. - setTimeout(t.step_func_done(function () { - assert_equals(loaded[urlId], undefined); - }), 500); + })); + i.onload = t.step_wait_func_done(function() { + if (!i.contentWindow) return false; + try { + let x = i.contentWindow.location.href; + return false; + } catch (e) { + return true; + } + }, t.step_func(() => { assert_throws_dom("SecurityError", () => { - var x = i.contentWindow.location.href; + let x = i.contentWindow.location.href; }); - }); - } else if (blockedURI) { - // Assert iframe loads with an expected violation. - window.addEventListener('message', t.step_func(e => { - if (e.source != i.contentWindow) - return; - if (!e.data.securitypolicyviolation) - return; - assert_equals(e.data["blockedURI"], blockedURI); - t.done(); - })); + }), "The error frame should be cross-origin.", 5000, 500); } else { - // Assert iframe loads. Wait for the load event, the postMessage from the - // script and the img load event. - let img_loaded = !checkImageLoaded; - window.addEventListener('message', t.step_func(e => { - if (e.source != i.contentWindow) - return; - if (e.data === "img loaded") - img_loaded = true; - - if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) { - t.done(); - } - })); - i.onload = t.step_func(function () { - onLoadReceived[urlId] = true; - if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) { - t.done(); - } + let successPromises = []; + + let loadPromise = new Promise(resolve => { + i.onload = resolve; + }); + successPromises.push(loadPromise); + + let loadMsgPromise = new Promise(resolve => { + window.addEventListener("message", function (e) { + if (e.source != i.contentWindow) return; + if (e.data["loaded"] && e.data["id"] === urlId) resolve(); + }); }); + successPromises.push(loadMsgPromise); + + if (blockedURI) { + let securityViolationPromise = new Promise(resolve => { + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) return; + if (!e.data.securitypolicyviolation) return; + assert_equals(e.data["blockedURI"], blockedURI); + resolve(); + })); + }); + successPromises.push(securityViolationPromise); + } + + if (checkImageLoaded) { + let imageLoadedPromise = new Promise(resolve => { + window.addEventListener('message', e => { + if (e.source != i.contentWindow) return; + if (e.data === "img loaded") resolve(); + }); + }); + successPromises.push(imageLoadedPromise); + } + + // Wait for all promises to resolve. + Promise.all(successPromises).then(t.step_func_done()); } document.body.appendChild(i); } diff --git a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html index 3b90782713f..7a3f266b24b 100644 --- a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html +++ b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html @@ -14,7 +14,7 @@ import {request_options_with_mediation_required, open_and_wait_for_popup, select_manifest} from '../support/fedcm-helper.sub.js'; -const url_path = '/credential-management/support/fedcm/' +const url_path = '/fedcm/support/' const url_prefix = manifest_origin + url_path; async function set_accounts_cookie(value) { diff --git a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html index 96006cce68c..66311740124 100644 --- a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html +++ b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html @@ -14,7 +14,7 @@ import {request_options_with_mediation_required, open_and_wait_for_popup, select_manifest} from '../support/fedcm-helper.sub.js'; -const url_path = '/credential-management/support/fedcm/' +const url_path = '/fedcm/support/' const url_prefix = manifest_origin + url_path; async function set_accounts_cookie(value) { diff --git a/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html b/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html index b802369256a..79171bf6343 100644 --- a/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html +++ b/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html @@ -13,7 +13,7 @@ import {request_options_with_mediation_required, fedcm_test(async t => { // Reset the client_metadata fetch count. - const clear_metadata_count_path = `support/fedcm/client_metadata_clear_count.py`; + const clear_metadata_count_path = `/fedcm/support/client_metadata_clear_count.py`; await fetch(clear_metadata_count_path); // FedCM flow causes the counter of client metadata to increase by 1. @@ -22,7 +22,7 @@ fedcm_test(async t => { await new Promise(resolve => { // Fetch the client metadata from a popup window. - let popup_window = window.open('support/fedcm/client_metadata.py?skip_checks=1'); + let popup_window = window.open('/fedcm/support/client_metadata.py?skip_checks=1'); const popup_window_load_handler = (event) => { popup_window.removeEventListener('load', popup_window_load_handler); popup_window.close(); diff --git a/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html b/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html index dbf42c4083b..4d5fb0a457c 100644 --- a/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html +++ b/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html @@ -25,7 +25,7 @@ fedcm_test(async t => { const cred = await fedcm_get_and_select_first_account(t, request_options_with_mediation_required()); const manifest = `${manifest_origin}/\ -credential-management/support/fedcm/manifest.py`; +fedcm/support/manifest.py`; await promise_rejects_js(t, TypeError, IdentityCredential.disconnect({ configURL: manifest, clientId: '1' diff --git a/tests/wpt/tests/credential-management/fedcm-error-basic.https.html b/tests/wpt/tests/credential-management/fedcm-error-basic.https.html index fd902bcf904..8a2d39cabaa 100644 --- a/tests/wpt/tests/credential-management/fedcm-error-basic.https.html +++ b/tests/wpt/tests/credential-management/fedcm-error-basic.https.html @@ -15,7 +15,7 @@ import {request_options_with_mediation_required, fedcm_error_dialog_dismiss, fedcm_error_dialog_click_button} from './support/fedcm-helper.sub.js'; -const url_prefix = manifest_origin + '/credential-management/support/fedcm/'; +const url_prefix = manifest_origin + '/fedcm/support/'; fedcm_test(async t => { let test_options = diff --git a/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html b/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html index cb5dfa615f3..eb87c2377a9 100644 --- a/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html +++ b/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html @@ -23,7 +23,7 @@ fedcm_test(async t => { // Get at least one connected account that can be disconnected. const cred = await fedcm_get_and_select_first_account(t, request_options_with_mediation_required()); const manifest = `${manifest_origin}/\ -credential-management/support/fedcm/manifest.py`; +fedcm/support/manifest.py`; const options = disconnect_options("1234"); IdentityCredential.disconnect(options); await promise_rejects_dom(t, 'NetworkError', IdentityCredential.disconnect(options)); diff --git a/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js b/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js index 308950e1e29..17ed5ce4468 100644 --- a/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js +++ b/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js @@ -1,7 +1,7 @@ export const manifest_origin = "https://{{host}}:{{ports[https][0]}}"; export const alt_manifest_origin = 'https://{{hosts[alt][]}}:{{ports[https][0]}}'; export const same_site_manifest_origin = 'https://{{hosts[][www1]}}:{{ports[https][0]}}'; -export const default_manifest_path = '/credential-management/support/fedcm/manifest.py'; +export const default_manifest_path = '/fedcm/support/manifest.py'; export function open_and_wait_for_popup(origin, path) { return new Promise(resolve => { @@ -26,6 +26,7 @@ export function open_and_wait_for_popup(origin, path) { export function set_fedcm_cookie(host) { if (host == undefined) { document.cookie = 'cookie=1; SameSite=None; Path=/credential-management/support; Secure'; + document.cookie = 'cookie=1; SameSite=None; Path=/fedcm/support; Secure'; return Promise.resolve(); } else { return open_and_wait_for_popup(host, '/credential-management/support/set_cookie'); @@ -52,7 +53,7 @@ export function request_options_with_mediation_required(manifest_filename, origi manifest_filename = "manifest.py"; } const manifest_path = `${origin}/\ -credential-management/support/fedcm/${manifest_filename}`; +fedcm/support/${manifest_filename}`; return { identity: { providers: [{ @@ -87,7 +88,7 @@ export function request_options_with_context(manifest_filename, context) { manifest_filename = "manifest.py"; } const manifest_path = `${manifest_origin}/\ -credential-management/support/fedcm/${manifest_filename}`; +fedcm/support/${manifest_filename}`; return { identity: { providers: [{ @@ -145,7 +146,7 @@ function select_manifest_impl(manifest_url) { return new Promise(resolve => { const img = document.createElement('img'); - img.src = `/credential-management/support/fedcm/select_manifest_in_root_manifest.py${url_query}`; + img.src = `/fedcm/support/select_manifest_in_root_manifest.py${url_query}`; img.addEventListener('error', resolve); document.body.appendChild(img); }); @@ -272,7 +273,7 @@ export function disconnect_options(accountHint, manifest_filename) { manifest_filename = "manifest.py"; } const manifest_path = `${manifest_origin}/\ -credential-management/support/fedcm/${manifest_filename}`; +fedcm/support/${manifest_filename}`; return { configURL: manifest_path, clientId: '1', @@ -285,7 +286,7 @@ export function alt_disconnect_options(accountHint, manifest_filename) { manifest_filename = "manifest.py"; } const manifest_path = `${alt_manifest_origin}/\ -credential-management/support/fedcm/${manifest_filename}`; +fedcm/support/${manifest_filename}`; return { configURL: manifest_path, clientId: '1', diff --git a/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js b/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js index 773e38fd21b..fd0bb71a0c7 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js +++ b/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js @@ -4,7 +4,8 @@ self.addEventListener('fetch', event => { const url = event.request.url; if (url.indexOf('query_service_worker_intercepts.html') != -1) { event.respondWith(new Response(num_overridden)); - } else if (url.indexOf('credential-management/support') != -1) { + } else if (url.indexOf('credential-management/support' || + url.indexOf('fedcm/support') != -1)) { ++num_overridden; } }); diff --git a/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html b/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html index 0afe279bcc5..da2cd26066a 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html +++ b/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html @@ -6,7 +6,7 @@ import {alt_manifest_origin} from './../fedcm-helper.sub.js'; window.onload = async () => { try { const manifest_path = `${alt_manifest_origin}/\ -credential-management/support/fedcm/manifest.py`; +fedcm/support/manifest.py`; IdentityProvider.getUserInfo({ configURL: manifest_path, // Approved client diff --git a/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html b/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html index 45a1a34ce9e..64d5cb83a08 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html +++ b/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html @@ -13,7 +13,7 @@ import {alt_manifest_origin} from './../fedcm-helper.sub.js'; window.onload = async () => { try { const manifest_path = `${alt_manifest_origin}/\ -credential-management/support/fedcm/manifest.py`; +fedcm/support/manifest.py`; const user_info = await IdentityProvider.getUserInfo({ configURL: manifest_path, // Approved client diff --git a/tests/wpt/tests/css/css-break/overflowing-block-004.html b/tests/wpt/tests/css/css-break/overflowing-block-004.html new file mode 100644 index 00000000000..edf9e53439b --- /dev/null +++ b/tests/wpt/tests/css/css-break/overflowing-block-004.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://issues.chromium.org/issues/348445899"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div id="mc" style="columns:2; width:100px; column-fill:auto; gap:0; height:300px; background:red;"> + <div style="width:50px;"> + <div style="height:15px;"> + <div style="height:200px; background:green;"></div> + </div> + </div> +</div> +<script> + document.body.offsetTop; + mc.style.height = "100px"; +</script> diff --git a/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html b/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html new file mode 100644 index 00000000000..ae7809016e6 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>Chrome crash bug 346264227</title> +<link rel="help" href="https://crbug.com/346264227"> +<style> + @container (width = 0px) { + #inner { + display: none; + } + } +</style> +<div style="container-type: inline-size"> + <div id="inner" style="container-type: inline-size; display: none"><span></span></div> +</div> +<script> + document.body.offsetTop; + document.body.style.width = 0; + inner.style.display = ""; + document.body.offsetTop; +</script> diff --git a/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html new file mode 100644 index 00000000000..65ef90f5a50 --- /dev/null +++ b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>CSS Display: getComputedStyle().readingFlow</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> +<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<body> +<div id="target"></div> +<script> +test_computed_value('reading-flow', 'normal'); +test_computed_value('reading-flow', 'flex-visual'); +test_computed_value('reading-flow', 'flex-flow'); +test_computed_value('reading-flow', 'grid-rows'); +test_computed_value('reading-flow', 'grid-columns'); +test_computed_value('reading-flow', 'grid-order'); +</script> +</body> diff --git a/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html new file mode 100644 index 00000000000..1d489b79564 --- /dev/null +++ b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>CSS Display: parsing reading-flow with invalid values</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> +<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<body> +<script> +test_invalid_value('reading-flow', 'auto'); +test_invalid_value('reading-flow', 'none'); +test_invalid_value('reading-flow', 'legacy'); +test_invalid_value('reading-flow', 'normal auto'); +test_invalid_value('reading-flow', 'flex-visual flex-flow'); +test_invalid_value('reading-flow', '100%'); +test_invalid_value('reading-flow', '10px'); +</script> +</body> diff --git a/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html new file mode 100644 index 00000000000..3d650c53063 --- /dev/null +++ b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<title>CSS Display: parsing reading-flow with valid values</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> +<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<body> +<script> +test_valid_value('reading-flow', 'normal'); +test_valid_value('reading-flow', 'flex-visual'); +test_valid_value('reading-flow', 'flex-flow'); +test_valid_value('reading-flow', 'grid-rows'); +test_valid_value('reading-flow', 'grid-columns'); +test_valid_value('reading-flow', 'grid-order'); +</script> +</body> diff --git a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html b/tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html deleted file mode 100644 index a8280337665..00000000000 --- a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html +++ /dev/null @@ -1,18 +0,0 @@ -<!DOCTYPE html> -<title>CSS Display: getComputedStyle().readingOrderItems</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> -<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/css/support/computed-testcommon.js"></script> -<body> -<div id="target"></div> -<script> -test_computed_value('reading-order-items', 'normal'); -test_computed_value('reading-order-items', 'flex-visual'); -test_computed_value('reading-order-items', 'flex-flow'); -test_computed_value('reading-order-items', 'grid-rows'); -test_computed_value('reading-order-items', 'grid-columns'); -test_computed_value('reading-order-items', 'grid-order'); -</script> -</body> diff --git a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html b/tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html deleted file mode 100644 index eff5846e316..00000000000 --- a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html +++ /dev/null @@ -1,18 +0,0 @@ -<!DOCTYPE html> -<title>CSS Display: parsing reading-order-items with invalid values</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> -<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/css/support/parsing-testcommon.js"></script> -<body> -<script> -test_invalid_value('reading-order-items', 'auto'); -test_invalid_value('reading-order-items', 'none'); -test_invalid_value('reading-order-items', 'legacy'); -test_invalid_value('reading-order-items', 'normal auto'); -test_invalid_value('reading-order-items', 'flex-visual flex-flow'); -test_invalid_value('reading-order-items', '100%'); -test_invalid_value('reading-order-items', '10px'); -</script> -</body> diff --git a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html b/tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html deleted file mode 100644 index d1ac7de64eb..00000000000 --- a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html> -<title>CSS Display: parsing reading-order-items with valid values</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> -<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/css/support/parsing-testcommon.js"></script> -<body> -<script> -test_valid_value('reading-order-items', 'normal'); -test_valid_value('reading-order-items', 'flex-visual'); -test_valid_value('reading-order-items', 'flex-flow'); -test_valid_value('reading-order-items', 'grid-rows'); -test_valid_value('reading-order-items', 'grid-columns'); -test_valid_value('reading-order-items', 'grid-order'); -</script> -</body> diff --git a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html index 2756e91774c..1b364bd6d9d 100644 --- a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html +++ b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html @@ -18,10 +18,10 @@ div { font-family: NotoSansCJK; font-size: 200px; } -.notAdjustedRef { +.fallbackRef { font-family: Ahem; - font-size: 100px; + font-size: 50px; } </style> <div class="adjustedRef">水</div> -<div class="notAdjustedRef">水</div> +<div class="fallbackRef">水</div> diff --git a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.tentative.html b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.html index 85aeb2683cb..5157d76847a 100644 --- a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.tentative.html +++ b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.html @@ -26,11 +26,11 @@ div { Therefore, an ic-height 2.0 means a 200% scaling up. */ font-size-adjust: ic-height 2.0; } -.notAdjusted { +.fallback { font-family: Ahem; - /* The Ahem font lacks vertical metrics, so no adjustment is applied. */ + /* The Ahem font lacks vertical metrics, so a fallback is applied. */ font-size-adjust: ic-height 0.5; } </style> <div class="adjusted">水</div> -<div class="notAdjusted">水</div>
\ No newline at end of file +<div class="fallback">水</div> diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-template-important.html b/tests/wpt/tests/css/css-grid/parsing/grid-template-important.html new file mode 100644 index 00000000000..c9b9bd83f5e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/parsing/grid-template-important.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title>CSS Grid Layout Test: grid-template followed by !important</title> +<link rel="help" href="https://drafts.csswg.org/css-grid-1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #div { + grid-template: "test" max-content / max-content !important; + } +</style> +<div id=div></div> +<script> + test(() => { + assert_equals(getComputedStyle(div).gridTemplate, '"test" max-content / max-content'); + }, 'grid-template followed by !important'); +</script> diff --git a/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html b/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html index fa76c0bc4e7..14ba7111dce 100644 --- a/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html +++ b/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html @@ -5,7 +5,7 @@ <link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/"> <link rel="match" href="css-target-text-decoration-001-ref.html"> <meta name="assert" content="This test checks that text-decorations of target text are fully rendered."> -<meta name="fuzzy" content="0-60;0-32"> +<meta name="fuzzy" content="0-60;0-38"> <script src="/common/reftest-wait.js"></script> <style> ::target-text { diff --git a/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html new file mode 100644 index 00000000000..9c70b08ab81 --- /dev/null +++ b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: late EXIF data is ignored</title> +<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> +<link rel="author" title="Chris Lilley" href="https://svgees.us/"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#url-metadata"> +<link rel="help" href="https://w3c.github.io/PNG-spec/#eXIf"> +<link rel="match" href="reference/image-orientation-exif-png-ref.html"> +<img src="support/F-exif-chunk-early.png"> +<img src="support/F-exif-late.png"> diff --git a/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html new file mode 100644 index 00000000000..536b7d2560c --- /dev/null +++ b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: late EXIF data is ignored</title> +<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> +<link rel="author" title="Chris Lilley" href="https://svgees.us/"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#url-metadata"> +<link rel="help" href="https://w3c.github.io/PNG-spec/#eXIf"> +<link rel="match" href="reference/image-orientation-exif-png-ref.html"> +<style> + div { width: 400px; height: 400px } + div.early { background-image: url(support/F-exif-chunk-early.png)} + div.late {background-image: url(support/F-exif-late.png)} +</style> +<div class="early"></div> +<div class="late"></div> diff --git a/tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.png b/tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.png Binary files differnew file mode 100644 index 00000000000..24bd924e9e7 --- /dev/null +++ b/tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.png diff --git a/tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html b/tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html new file mode 100644 index 00000000000..306bc15aa49 --- /dev/null +++ b/tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en-us"> + <head> + <style> + :root { + --sidebar-width: 370px; + } + + *, + ::after, + ::before { + box-sizing: inherit; + } + #sidebar { + max-width: var(--sidebar-width); + } + #codebox pre { + white-space: pre-wrap; + } + #codebox pre .copy-btn-displacement { + float: right; + height: 40px; + width: 40px; + } + #codebox #codebox-answer li { + hyphens: auto; + } + html { + font-size: 20px; + box-sizing: border-box; + } + </style> + </head> + <body> + <aside id="sidebar"> + <div id="codebox"> + <div id="codebox-answer"> + <ol> + <li> + <pre><code><div class="copy-btn-displacement"></div><span class="token function">add_definitions</span><span class="token punctuation">d</span><span class="token punctuation">.</span><span class="token constant">GCC_COVERAGE_COMPILE_FLAGS</span></code></pre> + </li> + </ol> + </div> + </div> + </aside> + </body> +</html> diff --git a/tests/wpt/tests/css/css-lists/details-open-ref.html b/tests/wpt/tests/css/css-lists/details-open-ref.html new file mode 100644 index 00000000000..88903cb8bbe --- /dev/null +++ b/tests/wpt/tests/css/css-lists/details-open-ref.html @@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference File: list-item counter with details open </title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element"> +<details open> + <summary>Expand me</summary> + <div>5. Should be numbered 5</div> +</details> diff --git a/tests/wpt/tests/css/css-lists/details-open.html b/tests/wpt/tests/css/css-lists/details-open.html new file mode 100644 index 00000000000..8354d012232 --- /dev/null +++ b/tests/wpt/tests/css/css-lists/details-open.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: list-item counter with details open </title> +<link rel="author" href="mailto:sakhapov@chromium.org"> +<link rel="match" href="details-open-ref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element"> +<details> + <summary>Expand me</summary> + <ol style="margin: 0; padding: 0; list-style-position: inside;"> + <li value="5">Should be numbered 5</li> + </ol> +</details> +<script> + document.documentElement.offsetTop; + document.querySelector("details").setAttribute("open", ""); +</script> diff --git a/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html new file mode 100644 index 00000000000..97cc7de15a3 --- /dev/null +++ b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference File: implicit and explicit list-item counters</title> +<div>1. List item 1</div> +<div>2. List item 2</div> +<div> + <div>With sub items</div> + <div>With sub items</div> +</div> +<div>3. List item 3</div> diff --git a/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html new file mode 100644 index 00000000000..5b7a9948165 --- /dev/null +++ b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: implicit and explicit list-item counters</title> +<link rel="author" href="mailto:sakhapov@chromium.org"> +<link rel="match" href="implicit-and-explicit-list-item-counters-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css-lists/#auto-numbering"> +<style> +ol.with-custom-markers { + list-style: none; + margin: 0; + padding: 0; +} +ol.with-custom-markers li { + list-style: none; +} +ol.with-custom-markers > li::before { + content: counter(list-item) ". "; +} +</style> + +<ol class="with-custom-markers"> + <li>List item 1</li> + <li> + List item 2 + <ul style="margin: 0; padding: 0;"> + <li>With sub items</li> + <li>With sub items</li> + </ul> + </li> + <li>List item 3</li> +</ol> diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html new file mode 100644 index 00000000000..72a6c087b31 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<title>CSS Overflow Reference: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</title> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<style> +:root { + scrollbar-gutter: stable both-edges; +} +body { + margin: 0; +} +.box { + width: 100px; + height: 100px; + background: green; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="box"></div> diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html new file mode 100644 index 00000000000..cdffebb5c7b --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<title>CSS Overflow Test: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</title> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1901652"> +<link rel="match" href="scrollbar-gutter-fixedpos-003-ref.html"> +<style> +:root { + scrollbar-gutter: stable both-edges; +} +body { + margin: 0; +} +.box { + width: 100px; + height: 100px; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="box" style="position: fixed; background: green"></div> +<div class="box" style="background: red"></div> diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html new file mode 100644 index 00000000000..fe1b96fce8a --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<title>CSS Overflow Reference: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</title> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<style> +:root { + scrollbar-gutter: stable both-edges; + writing-mode: vertical-lr; +} +body { + margin: 0; +} +.box { + width: 100px; + height: 100px; + background: green; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="box"></div> diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html new file mode 100644 index 00000000000..debb28d397f --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<title>CSS Overflow Test: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</title> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1901652"> +<link rel="match" href="scrollbar-gutter-fixedpos-004-ref.html"> +<style> +:root { + scrollbar-gutter: stable both-edges; + writing-mode: vertical-lr; +} +body { + margin: 0; +} +.box { + width: 100px; + height: 100px; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="box" style="position: fixed; background: green"></div> +<div class="box" style="background: red"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html new file mode 100644 index 00000000000..e91b2377db1 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + .container { + display: grid; + grid-template-rows: 50px auto auto auto 50px; + height: 100%; + } + .outerRow { + display: flex; + align-items: center; + } + .outerRow > div:nth-child(1) { text-align: right; } + .outerRow > div:nth-child(2) { text-align: left; } + .outerRow > div:nth-child(3) { text-align: center; } + .outerRow > div:nth-child(4) { text-align: right; } + .outerRow > div:nth-child(5) { text-align: left; } + .outerRow > div:first-child, + .outerRow > div:last-child { width: 50px; } + .outerRow > div:nth-child(3) { margin:auto; } + + .innerRow { + display: flex; + flex: 1; + } + .innerRow > div { + width: 50px; + text-align: center; + } + .innerRow > div:first-child { + margin-right: auto; + } + @page { + size: 550px 400px; + margin: 0; + } + body { + margin: 0; + } +</style> +<div style="margin:58px;"> + Small blue letters from A to P should be seen in a clockwise manner, starting + with A in the top left corner. +</div> + +<div style="position:absolute; inset:0; font-family:monospace; font-size:0.7em; color:blue;"> + <div class="container"> + <div class="outerRow"> + <div>A</div> + <div>B</div> + <div>C</div> + <div>D</div> + <div>E</div> + </div> + <div class="innerRow" style="align-items:flex-start;"> + <div>P</div> + <div>F</div> + </div> + <div class="innerRow" style="align-items:center;"> + <div>O</div> + <div>G</div> + </div> + <div class="innerRow" style="align-items:flex-end;"> + <div>N</div> + <div>H</div> + </div> + <div class="outerRow"> + <div>M</div> + <div>L</div> + <div>K</div> + <div>J</div> + <div>I</div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html new file mode 100644 index 00000000000..ad9c78baa6c --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-text-alignment"> +<meta name="assert" content="Test default vertical and horizontal alignment for all 16 margin boxes"> +<link rel="match" href="alignment-001-print-ref.html"> +<style> + @page { + font-family:monospace; + font-size: 0.7em; + + /* This results in a page border box size that's divisible by 3, so that the + three boxes at a page edge get the exact same size. */ + size: 550px 400px; + + margin: 50px; + color: blue; + + @top-left-corner { content: "A"; } + @top-left { content: "B"; } + @top-center { content: "C"; } + @top-right { content: "D"; } + @top-right-corner { content: "E"; } + @right-top { content: "F"; } + @right-middle { content: "G"; } + @right-bottom { content: "H"; } + @bottom-right-corner { content: "I"; } + @bottom-right { content: "J"; } + @bottom-center { content: "K"; } + @bottom-left { content: "L"; } + @bottom-left-corner { content: "M"; } + @left-bottom { content: "N"; } + @left-middle { content: "O"; } + @left-top { content: "P"; } + } +</style> +<div> + Small blue letters from A to P should be seen in a clockwise manner, starting + with A in the top left corner. +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html new file mode 100644 index 00000000000..70f4a41ab59 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 400px; + } + body { + display: grid; + grid-template-columns: 100px auto 100px; + grid-template-rows: 100px auto 100px; + height: 100vh; + margin: 0; + } + .square { + border: solid; + width: 25px; + height: 25px; + } + body > .square { + margin: auto; + } + .vertical-edge { + display: flex; + justify-content: space-between; + } + .vertical-edge > .square { + margin: auto 0; + } + .horizontal-edge { + display: flex; + flex-flow: column; + justify-content: space-between; + } + .horizontal-edge > .square { + margin: 0 auto; + } + .pagearea { + border: solid; + padding: 8px; + } +</style> + +<div class="square"></div> +<div class="vertical-edge"> + <div class="square"></div> + <div class="square" style="flex:1;"></div> + <div class="square"></div> +</div> +<div class="square"></div> +<div class="horizontal-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="pagearea"> + There should be 16 margin boxes around this page area. They should all be + squares, except for the center box at the top and the middle box on the right + hand side, which should take up all available main-axis space. All 16 boxes + should all be centered within their available cross-axis space. +</div> +<div class="horizontal-edge"> + <div class="square"></div> + <div class="square" style="flex:1;"></div> + <div class="square"></div> +</div> +<div class="square"></div> +<div class="vertical-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html new file mode 100644 index 00000000000..cf2501385f1 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html @@ -0,0 +1,127 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto margins. Auto margins not adjacent to a page edge are treated as 0."> +<link rel="match" href="auto-margins-001-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 400px; + border: solid; + @top-left-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @top-left { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @top-center { + border: solid; + height: 25px; + margin: auto; + content: ""; + } + @top-right { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @top-right-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @right-top { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @right-middle { + border: solid; + width: 25px; + margin: auto; + content: ""; + } + @right-bottom { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @bottom-right-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @bottom-right { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @bottom-center { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @bottom-left { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @bottom-left-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @left-bottom { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @left-middle { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + @left-top { + border: solid; + width: 25px; + height: 25px; + margin: auto; + content: ""; + } + } +</style> + +There should be 16 margin boxes around this page area. They should all be +squares, except for the center box at the top and the middle box on the right +hand side, which should take up all available main-axis space. All 16 boxes +should all be centered within their available cross-axis space. diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html new file mode 100644 index 00000000000..56adf2a5401 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 440px; + } + body { + display: grid; + grid-template-columns: 100px auto 100px; + grid-template-rows: 100px auto 100px; + height: 100vh; + margin: 0; + } + .square { + box-sizing: border-box; + width: 100px; + border: solid; + flex: 1; + background: green; + } + .vertical-edge { + display: flex; + justify-content: space-between; + } + .horizontal-edge { + display: flex; + flex-flow: column; + justify-content: space-between; + } + .pagearea { + border: solid; + padding: 8px; + } +</style> + +<div class="square"></div> +<div class="vertical-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square"></div> +<div class="horizontal-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="pagearea"> + There should be 16 margin boxes around this page area. They should take up all + available space, and there should be no red, only green rectangles with a + black border. +</div> +<div class="horizontal-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square"></div> +<div class="vertical-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html new file mode 100644 index 00000000000..5b424941cad --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Auto margins should never resolve to something negative, but be clamped to 0."> +<link rel="match" href="auto-margins-002-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 440px; + border: solid; + background: red; + @top-left-corner { + border: solid; + margin: auto; + content: ""; + background: green; + } + @top-left { + border: solid; + margin: auto; + content: ""; + background: green; + } + @top-center { + border: solid; + margin: auto; + content: ""; + background: green; + } + @top-right { + border: solid; + margin: auto; + content: ""; + background: green; + } + @top-right-corner { + border: solid; + margin: auto; + content: ""; + background: green; + } + @right-top { + border: solid; + margin: auto; + content: ""; + background: green; + } + @right-middle { + border: solid; + margin: auto; + content: ""; + background: green; + } + @right-bottom { + border: solid; + margin: auto; + content: ""; + background: green; + } + @bottom-right-corner { + border: solid; + margin: auto; + content: ""; + background: green; + } + @bottom-right { + border: solid; + margin: auto; + content: ""; + background: green; + } + @bottom-center { + border: solid; + margin: auto; + content: ""; + background: green; + } + @bottom-left { + border: solid; + margin: auto; + content: ""; + background: green; + } + @bottom-left-corner { + border: solid; + margin: auto; + content: ""; + background: green; + } + @left-bottom { + border: solid; + margin: auto; + content: ""; + background: green; + } + @left-middle { + border: solid; + margin: auto; + content: ""; + background: green; + } + @left-top { + border: solid; + margin: auto; + content: ""; + background: green; + } + } + body { + background: white; + } +</style> +There should be 16 margin boxes around this page area. They should take up all +available space, and there should be no red, only green rectangles with a black +border. diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html new file mode 100644 index 00000000000..252633b0581 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 400px; + } + body { + display: grid; + grid-template-columns: 100px auto 100px; + grid-template-rows: 100px auto 100px; + height: 100vh; + margin: 0; + } + .square { + border: solid; + width: 25px; + height: 25px; + } + .square.left { + margin-left: auto; + } + .square.top { + margin-top: auto; + } + .vertical-edge { + display: flex; + justify-content: space-between; + } + .horizontal-edge { + display: flex; + flex-flow: column; + justify-content: space-between; + } + .pagearea { + border: solid blue; + padding: 8px; + } +</style> + +<div class="square left top"></div> +<div class="vertical-edge"> + <div class="square top"></div> + <div class="square top"></div> + <div class="square top"></div> +</div> +<div class="square top"></div> +<div class="horizontal-edge"> + <div class="square left"></div> + <div class="square left"></div> + <div class="square left"></div> +</div> +<div class="pagearea"> + There should be 16 margin boxes around this page area. They should all be + squares, and their borders should be flush with the blue border. They should + not overlap with the page area. +</div> +<div class="horizontal-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square left"></div> +<div class="vertical-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html new file mode 100644 index 00000000000..4fe7192a56f --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html @@ -0,0 +1,147 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Auto margins adjacent to the page area should never become negative."> +<link rel="match" href="auto-margins-003-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 400px; + border: solid blue; + @top-left-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-top: 90px; + margin-left: 90px; + content: ""; + } + @top-left { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-top: 90px; + content: ""; + } + @top-center { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-top: 90px; + content: ""; + } + @top-right { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-top: 90px; + content: ""; + } + @top-right-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-top: 90px; + margin-right: 90px; + content: ""; + } + @right-top { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-right: 90px; + content: ""; + } + @right-middle { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-right: 90px; + content: ""; + } + @right-bottom { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-right: 90px; + content: ""; + } + @bottom-right-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-right: 90px; + margin-bottom: 90px; + content: ""; + } + @bottom-right { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-bottom: 90px; + content: ""; + } + @bottom-center { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-bottom: 90px; + content: ""; + } + @bottom-left { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-bottom: 90px; + content: ""; + } + @bottom-left-corner { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-left: 90px; + margin-bottom: 90px; + content: ""; + } + @left-bottom { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-left: 90px; + content: ""; + } + @left-middle { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-left: 90px; + content: ""; + } + @left-top { + border: solid; + width: 25px; + height: 25px; + margin: auto; + margin-left: 90px; + content: ""; + } + } +</style> +There should be 16 margin boxes around this page area. They should all be +squares, and their borders should be flush with the blue border. They should not +overlap with the page area. diff --git a/tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html new file mode 100644 index 00000000000..bd3ba7e0ccf --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + size: 400px; + margin: 0; + } + body { + margin: 0; + } +</style> +<div style="margin-left:100px; float:left; width:100px; height:100px; background:hotpink;"> + PASS +</div> +<div style="float:left; width:100px; height:100px; background:yellow;"> + PASS +</div> +<div style="display:flow-root; clear:both;"> + <div style="margin-top:200px; margin-left:100px; width:200px; height:100px; background:yellow;"></div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html new file mode 100644 index 00000000000..efaa71b8c84 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#populating-margin-boxes"> +<meta name="assert" content="Basic content property test, with just text, and various ways of expressing nothingness."> +<link rel="match" href="content-001-print-ref.html"> +<style> + @page { + size: 400px; + margin: 100px; + + @top-left-corner { + /* No content property here. */ + width: 50px; + height: 50px; + background: red; + } + @top-left { + text-align: left; + vertical-align: top; + content: "PASS"; + background: hotpink; + } + @top-right { + text-align: left; + vertical-align: top; + content: "PA" "SS"; + background: yellow; + } + @bottom-left { + /* An empty string is also content. */ + content: ""; + background: yellow; + } + @bottom-left-corner { + width: 50px; + height: 50px; + content: none; /* This is nothing. */ + background: red; + } + @bottom-right-corner { + width: 50px; + height: 50px; + content: normal; /* This also nothing. */ + background: red; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html new file mode 100644 index 00000000000..dca52cb8bc7 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 400px; + } + body { + margin: 0; + } +</style> +<div style="display:flex; margin:0 100px; height:100px; align-items:flex-end;"> + <div style="border:solid; width:20%; height:20%;">20%</div> +</div> +<div style="display:flex; height:200px;"> + <div style="display:flex; width:100px;"> + <div style="flex:1; border:solid;"> + auto + </div> + </div> + <div style="flex:1;"></div> + <div style="display:flex; width:100px;"> + <div style="width:70%; height:70%; margin:auto 0; border:solid;"> + 70% + </div> + </div> +</div> +<div style="margin:0 100px; height:94px; border:solid;">auto</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html new file mode 100644 index 00000000000..20d4e3059e0 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Only one box per edge."> +<link rel="match" href="dimensions-001-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 400px; + + @top-left { + border: solid; + text-align: left; + vertical-align: top; + width: 20%; + height: 20%; + content: "20%"; + } + @right-middle { + text-align: left; + vertical-align: top; + border: solid; + width: 70%; + height: 70%; + content: "70%"; + } + @bottom-right { + text-align: left; + vertical-align: top; + border: solid; + content: "auto"; + } + @left-bottom { + text-align: left; + vertical-align: top; + border: solid; + content: "auto"; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html new file mode 100644 index 00000000000..83e144fb336 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 400px; + } + body { + margin: 0; + } +</style> +<div style="display:flex; margin:0 100px; height:100px;"> + <div style="border:solid; width:20%; height:20%; align-self:flex-end;">20%</div> + <div style="border:solid; flex:1;">auto</div> +</div> +<div style="display:flex; height:200px;"> + <div style="display:flex; flex-flow:column; width:100px;"> + <div style="width:70px; height:70px; border:solid; margin-left:auto;">70px</div> + <div style="flex:1; border:solid;">auto</div> + </div> + <div style="flex:1;"></div> + <div style="display:flex; flex-flow:column; width:100px;"> + <div style="flex:1; border:solid;">auto</div> + <div style="width:70%; height:70%; border:solid;">70%</div> + </div> +</div> +<div style="display:flex; margin:0 100px; height:100px;"> + <div style="border:solid; flex:1;">auto</div> + <div style="border:solid; width:70px; height:70px;">70px</div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html new file mode 100644 index 00000000000..4637a39ed51 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test combinations of auto lengths, fixed lengths and percentage lengths. No corners or middle/center boxes."> +<link rel="match" href="dimensions-002-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 400px; + + @top-left { + text-align: left; + vertical-align: top; + border: solid; + width: 20%; + height: 20%; + content: "20%"; + } + @top-right { + text-align: left; + vertical-align: top; + border: solid; + content: "auto"; + } + @right-top { + text-align: left; + vertical-align: top; + border: solid; + content: "auto"; + } + @right-bottom { + text-align: left; + vertical-align: top; + border: solid; + width: 70%; + height: 70%; + content: "70%"; + } + @bottom-right { + text-align: left; + vertical-align: top; + border: solid; + width: 70px; + height: 70px; + content: "70px"; + } + @bottom-left { + text-align: left; + vertical-align: top; + border: solid; + content: "auto"; + } + @left-bottom { + text-align: left; + vertical-align: top; + border: solid; + content: "auto"; + } + @left-top { + text-align: left; + vertical-align: top; + border: solid; + width: 70px; + height: 70px; + content: "70px"; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html new file mode 100644 index 00000000000..c491cdde98e --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 28em; + } + body { + margin: 0; + } + .grid { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + overflow: clip; + } + .vertical-edge { + display: flex; + } +</style> +<div class="grid"> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="width:10em; border:solid 0.25em; padding:0.25em; margin-right:1em;">x</div> + <div style="width:7em; margin-left:1em; background:yellow;">x</div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html new file mode 100644 index 00000000000..fe9f26da5d7 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test with auto lengths and margins/border/padding."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-003-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + /* Available size for top edge margins is 20em. + + Min/max content width of top-left is + (left border/padding + content + right padding/border/margin) + is 0.25em+0.25em+1em+0.25em+0.25em+1em = 3em + + Min content width of top-right is 1em + 1em = 2em + + Unused space becomes 15em. + + Left flex: 3 + Right flex: 2 + Total flex: 5 + + Left width: 3em + 15em * 3/5 = 12em + Right width: 2em + 15em * 2/5 = 8em */ + @top-left { + text-align: left; + vertical-align: top; + margin-right: 1em; + border: solid 0.25em; + padding: 0.25em; + content: "x"; + } + @top-right { + text-align: left; + vertical-align: top; + margin-left: 1em; + background: yellow; + content: "x"; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html new file mode 100644 index 00000000000..3f45190e330 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 27em; + } + body { + display: grid; + grid-template-columns: 7em auto 5em; + grid-template-rows: 4em auto 8em; + height: 100vh; + margin: 0; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } + .corner { + border: solid thin; + } +</style> +<div class="corner">xx</div> +<div class="vertical-edge"> + <div style="width:5em; margin-bottom:2em; background:hotpink;">x</div> + <div style="width:15em; margin-top:2em; background:yellow;">xxx</div> +</div> +<div class="corner">xx</div> +<div class="horizontal-edge"> + <div style="height:9em; margin-left:4em; background:yellow;">x<br>x<br>x</div> + <div style="height:6em; margin-right:4em; background:hotpink;">x<br>x</div> +</div> +<div></div> +<div class="horizontal-edge"> + <div style="height:10em; margin-left:3em; background:hotpink;">x<br>x</div> + <div style="height:5em; margin-right:3em; background:yellow;">xxx</div> +</div> +<div class="corner">xxxx</div> +<div class="vertical-edge"> + <div style="width:17.5em; margin-top:4em; background:yellow;">x x x x</div> + <div style="width:2.5em; margin-bottom:4em; background:hotpink;">x</div> +</div> +<div class="corner">xxx</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html new file mode 100644 index 00000000000..80bcc43fb39 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto lengths. Max content sizes are smaller than available size. With corners. No center/middle boxes."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-004-print-ref.html"> +<style> + @page { + margin: 4em 5em 8em 7em; + width: 20em; + height: 15em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + /* Corners just use all available size, if auto. */ + @top-left-corner { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + content: "x\ax"; + border: solid thin; + } + @top-right-corner { + text-align: left; + vertical-align: top; + content: "xx"; + border: solid thin; + } + @bottom-right-corner { + text-align: left; + vertical-align: top; + content: "xxx"; + border: solid thin; + } + @bottom-left-corner { + text-align: left; + vertical-align: top; + content: "xxxx"; + border: solid thin; + } + + /* Min/max width for top-left is 1em. For top-right it is 3em. + Available space is 20em. Unused space becomes 16em. This will be + distributed proportionally based on max widths. Left gets 1/4, right + gets 3/4. Final widths become 1em+16em*1/4 = 5em for left, and + 3em+16em*3/4 = 15em for right. */ + @top-left { + text-align: left; + vertical-align: top; + margin-bottom: 2em; + content: "x"; + background: hotpink; + } + @top-right { + text-align: left; + vertical-align: top; + margin-top: 2em; + content: "xxx"; + background: yellow; + } + + /* Min/max height for left-top is 3em (three lines). For left-bottom it is + 2em (two lines). Available space is 15em. Unused space is 10em. This + will be distributed proportionally based on max heights. Top gets 3/5, + bottom gets 2/5. Final heights become 3em+10em*3/5 = 9em for top, and + 2em+10em*2/5 = 6em for bottom. */ + @left-top { + text-align: left; + vertical-align: top; + margin-left: 4em; + content: "x\ax\ax\a"; + background: yellow; + } + @left-bottom { + text-align: left; + vertical-align: top; + margin-right: 4em; + content: "x\ax\a"; + background: hotpink; + } + + /* Min/max height for right-top is 2em (two lines). For right-bottom it is + 1em (one line). Available space is 15em. Unused space is 12em. This will + be distributed proportionally based on max heights. Top gets 2/3, bottom + gets 1/3. Final heights become 2em+12em*2/3 = 10em for top, and + 1em+12em*1/3 = 5em for bottom. */ + @right-top { + text-align: left; + vertical-align: top; + margin-left: 3em; + content: "x\ax\a"; + background: hotpink; + } + @right-bottom { + text-align: left; + vertical-align: top; + margin-right: 3em; + content: "xxx"; + background: yellow; + } + + /* Min/max width for bottom-left is 7em. For bottom-right it is 1em. + Available space is 20em. Unused space becomes 12em. This will be + distributed proportionally based on max widths. Left gets 7/8, right + gets 1/8. Final widths become 7em+12em*7/8 = 17.5em for left, and + 1em+12em*1/8 = 2.5em for right. */ + @bottom-left { + text-align: left; + vertical-align: top; + margin-top: 4em; + content: "x x x x"; + background: yellow; + } + @bottom-right { + text-align: left; + vertical-align: top; + margin-bottom: 4em; + content: "x"; + background: hotpink; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html new file mode 100644 index 00000000000..1749b1c7147 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 27em; + } + body { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + margin: 0; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="corner"></div> +<div class="vertical-edge"> + <div style="width:7.5em; margin-bottom:4em; background:hotpink;">xxx</div> + <div style="width:5em; margin-top:2em; margin-bottom:2em; background:cyan;">xx</div> + <div style="width:7.5em; margin-top:4em; background:yellow;">xx</div> +</div> +<div class="corner"></div> +<div class="horizontal-edge"></div> +<div></div> +<div class="horizontal-edge"> + <div style="height:5.625em; margin-right:4em; background:hotpink;">x<br>x<br>x</div> + <div style="height:3.75em; margin-left:2em; margin-right:2em; background:cyan;">x<br>x</div> + <div style="height:5.625em; margin-left:4em; background:yellow;">x<br>x</div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html new file mode 100644 index 00000000000..2823424f39a --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html @@ -0,0 +1,82 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto lengths. Max content sizes are smaller than available size. With center/middle boxes. No corners."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-005-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 15em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + /* In order to preserve centering of a center/middle box, pretend that the + space distributed to left/top and right/bottom combined will be twice the + size of the one that needs the most size (this is called the AC box). + Then resolve center/middle by giving it the rest. Then the boxes on the + sides receive equal shares of AC. */ + + /* Min/max width for top-left is 3em. For top-center it is 2em. For + top-right it is 2em. Available space is 20em. Left is larger than right. + Double it to 6em and call this the AC box. Unused space becomes 12em + (20em minus center max width and double left box max width). Unused space + will be distributed proportionally between AC and the center box, based + on max widths. AC gets 6/8, center gets 2/8. AC becomes + 6em+12em*6/8 = 15em. Center becomes 2em+12em*2/8 = 5em. Left and right + each receive half of what's left after having resolved for center, + i.e. (20em-5em)/2 = 7.5em. */ + @top-left { + text-align: left; + vertical-align: top; + margin-bottom: 4em; + content: "xxx"; + background: hotpink; + } + @top-center { + text-align: left; + vertical-align: top; + margin-top: 2em; + margin-bottom: 2em; + content: "xx"; + background: cyan; + } + @top-right { + text-align: left; + vertical-align: top; + margin-top: 4em; + content: "xx"; + background: yellow; + } + + /* This is the same as for the top edge, except that available space is less. + It is 15em here. Unused space then becomes 7em (15em minus center max + height and double top box max height). AC becomes 6em+7em*6/8 = 11.25em. + Center becomes 2em+7em*2/8 = 3.75em. Top and bottom each become + 11.25em / 2 = 5.625em. */ + @right-top { + text-align: left; + vertical-align: top; + margin-right: 4em; + content: "x\ax\ax"; + background: hotpink; + } + @right-middle { + text-align: left; + vertical-align: top; + margin-left: 2em; + margin-right: 2em; + content: "x\ax"; + background: cyan; + } + @right-bottom { + text-align: left; + vertical-align: top; + margin-left: 4em; + content: "x\ax"; + background: yellow; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html new file mode 100644 index 00000000000..f6aa9e60f48 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 27em; + } + body { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + margin: 0; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="corner"></div> +<div class="vertical-edge"> + <div style="width:15.375em; margin-bottom:3em; background:hotpink;">xxx xx xx xx xxxx</div> + <div style="width:4.625em; margin-top:3em; background:yellow;">xx xx</div> +</div> +<div class="corner"></div> +<div class="horizontal-edge"> + <div style="writing-mode:vertical-rl; height:10.75em; background:yellow;">xxx x xx xxxx</div> + <div style="writing-mode:vertical-rl; height:4.25em; background:hotpink;">xx xx</div> +</div> +<div></div> +<div class="horizontal-edge"> + <div style="writing-mode:vertical-rl; height:9em; background:hotpink;">x x xxxxxx x x x x x x x x x x</div> + <div style="writing-mode:vertical-rl; height:6em; background:yellow;">x x x x x x x x x x x x x x x x xx</div> +</div> +<div class="corner"></div> +<div class="vertical-edge"> + <div style="width:11.25em; margin-top:1em; background:yellow;">x x xxxxxx x x x x x x x x x x x x</div> + <div style="width:8.75em; background:hotpink;">x x x x x x x x x x x x x x x x x x xx</div> +</div> +<div class="corner"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html new file mode 100644 index 00000000000..6ea477f2c84 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto lengths. Max content sizes are larger than available size, but their min sizes are not. No center boxes."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-006-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 15em; + font: 16px/1 Ahem; + + /* Left min: 4em + Left max: 17em + Right min: 2em + Right max: 5em + Min total: 4em + 2em = 6em + Max total: 17em + 5em = 22em + + Max content sizes are larger than available size. Min content sizes are + smaller. Start at min size, and distribute extra space proportionally to + the difference between max and min. + + Left flex (max - min): 13 + Right flex (max - min): 3 + Flex total: 16 + Available space: 20em + Unused space: 20em - 6em = 14em + + Width of left box: 4em + 14em * 13/16 = 15.375em + Width of right box: 2em + 14em * 3/16 = 4.625em */ + @top-left { + text-align: left; + vertical-align: top; + margin-bottom: 3em; + content: "xxx xx xx xx xxxx"; + background: hotpink; + } + @top-right { + text-align: left; + vertical-align: top; + margin-top: 3em; + content: "xx xx"; + background: yellow; + } + + /* Top min: 4em + Top max: 13em + Bottom min: 2em + Bottom max: 5em + Min total: 4em + 2em = 6em + Max total: 13em + 5em = 18em + + Max content sizes are larger than available size. Min content sizes are + smaller. Start at min size, and distribute extra space proportionally to + the difference between max and min. + + Top flex (max - min): 9 + Bottom flex (max - min): 3 + Flex total: 12 + Available space: 15em + Unused space: 15em - 6em = 9em + + Height of top box: 4em + 9em * 9/12 = 10.75em + Height of bottom box: 2em + 9em * 3/12 = 4.25em */ + @left-top { + text-align: left; + vertical-align: top; + writing-mode: vertical-rl; + content: "xxx x xx xxxx"; + background: yellow; + } + @left-bottom { + text-align: left; + vertical-align: top; + writing-mode: vertical-rl; + content: "xx xx"; + background: hotpink; + } + + /* Top min: 6em + Top max: 30em + Bottom min: 2em + Bottom max: 34em + Min total: 6em + 2em = 8em + Max total: 30em + 34em = 64em + + Max content sizes are larger than available size. Min content sizes are + smaller. Start at min size, and distribute extra space proportionally to + the difference between max and min. + + Top flex (max - min): 24 + Bottom flex (max - min): 32 + Flex total: 56 + Available space: 15em + Unused space: 15em - 8em = 7em + + Height of top box: 6em + 7em * 24/56 = 9em + Height of bottom box: 2em + 7em * 32/56 = 6em */ + @right-top { + text-align: left; + vertical-align: top; + writing-mode: vertical-rl; + content: "x x xxxxxx x x x x x x x x x x"; + background: hotpink; + } + @right-bottom { + text-align: left; + vertical-align: top; + writing-mode: vertical-rl; + content: "x x x x x x x x x x x x x x x x xx"; + background: yellow; + } + + /* Left min: 6em + Left max: 34em + Right min: 2em + Right max: 38em + Min total: 6em + 2em = 8em + Max total: 34em + 38em = 72em + + Max content sizes are larger than available size. Min content sizes are + smaller. Start at min size, and distribute extra space proportionally to + the difference between max and min. + + Left flex (max - min): 28 + Right flex (max - min): 36 + Flex total: 64 + Available space: 20em + Unused space: 20em - 8em = 12em + + Width of left box: 6em + 12em * 28/64 = 11.25em + Width of right box: 2em + 12em * 36/64 = 8.75em */ + @bottom-left { + text-align: left; + vertical-align: top; + margin-top: 1em; + content: "x x xxxxxx x x x x x x x x x x x x"; + background: yellow; + } + @bottom-right { + text-align: left; + vertical-align: top; + content: "x x x x x x x x x x x x x x x x x x xx"; + background: hotpink; + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html new file mode 100644 index 00000000000..b91c086879a --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 27em; + } + body { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 12em auto 12em; + height: 100vh; + margin: 0; + } + .vertical-edge { + display: flex; + } +</style> +<div class="corner"></div> +<div class="vertical-edge"> + <div style="width:5.25em; height:10em; background:hotpink;"> + x x x x x + </div> + <div style="width:9.5em; margin-top:1em; height:10em; background:cyan;"> + x x x x x x x x x + </div> + <div style="width:5.25em; margin-top:2em; height:10em; background:yellow;"> + x x + </div> +</div> +<div class="corner"></div> +<div class="horizontal-edge"></div> +<div></div> +<div></div> +<div class="corner"></div> +<div class="vertical-edge"> + <div style="width:7.5em; margin-top:2em; height:10em; background:yellow;"> + x xx x xxx xx xx xx xx xx xx xx x xx xx xx xx xxx x + </div> + <div style="width:5em; margin-top:1em; height:10em; background:cyan;"> + x x xxxx xxxx xxxx xx x x xxx xx xxx + </div> + <div style="width:7.5em; height:10em; background:hotpink;"> + x x x x x xxxxxxx x x x + </div> +</div> +<div class="corner"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html new file mode 100644 index 00000000000..cf7e5f50754 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html @@ -0,0 +1,138 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto lengths. Max content sizes are larger than available size, but their min sizes are not. With center boxes."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-007-print-ref.html"> +<style> + @page { + margin: 12em 6em; + width: 20em; + height: 3em; + font: 16px/1 Ahem; + + /* Left min: 1em + Left max: 9em + Center min: 1em + Center max: 17em + Right min: 1em + Right max: 3em + Min total: 1em + 1em + 1em = 3em + Max total: 9em + 17em + 3em = 29em + + Max content sizes are larger than available size. Min content sizes are + smaller. Start at min size, and distribute extra space proportionally to + the difference between max and min. + + First resolve the width of center, by evaluating how much space the + double of each side box would take up. Pick the larger (to preserve + centering), and subtract that from available space. + + Available space: 20em + Center flex: 17em - 1em = 16 + + Left double min: 1em * 2 = 2em + Left double flex (max - min): (9em-1em)*2 = 16 + Total flex left double + center: 16 + 16 = 32 + Unused space with double left: 20em - (2em + 1em) = 17em + Width of double left: 2em + 17em * 16 / 32 = 10.5em + + Right double min: 1em * 2 = 2em + Right double flex (max - min): (3em-1em)*2 = 4 + Total flex right double + center: 4 + 16 = 20 + Unused space with double right: 20em - (2em + 1em) = 17em + Width of double right: 2em + 17em * 4 / 20 = 5.4em + + Width of double left (10.5em) is larger than width of double right + (5.4em). Pick this one and resolve center, by using those flex values. + Width of center: 1em + 17em * 16/32 = 9.5em. + + Now give the rest in equal parts to left and right: + (20em - 9.5em) / 2 = 5.25em */ + @top-left { + text-align: left; + vertical-align: top; + margin-bottom: 2em; + height: 10em; + content: "x x x x x"; + background: hotpink; + } + @top-center { + text-align: left; + vertical-align: top; + margin-bottom: 1em; + height: 10em; + content: "x x x x x x x x x"; + background: cyan; + } + @top-right { + text-align: left; + vertical-align: top; + height: 10em; + content: "x x"; + background: yellow; + } + + /* Left min: 3em + Left max: 51em + Center min: 4em + Center max: 36em + Right min: 7em + Right max: 23em + Min total: 3em + 4em + 7em = 14em + Max total: 51em + 36em + 23em = 110em + + Max content sizes are larger than available size. Min content sizes are + smaller. Start at min size, and distribute extra space proportionally to + the difference between max and min. + + First resolve the width of center, by evaluating how much space the + double of each side box would take up. Pick the larger (to preserve + centering), and subtract that from available space. + + Available space: 20em + Center flex: 36em - 4em = 32 + + Left double min: 3em * 2 = 6em + Left double flex (max - min): (51em-3em)*2 = 96 + Total flex left double + center: 96 + 32 = 128 + Unused space with double left: 20em - (6em + 4em) = 10em + Width of double left: 6em + 10em * 96 / 128 = 13.5em + + Right double min: 7em * 2 = 14em + Right double flex (max - min): (23em-7em)*2 = 32 + Total flex right double + center: 32 + 32 = 64 + Unused space with double right: 20em - (14em + 4em) = 2em + Width of double right: 14em + 2em * 32 / 64 = 15em + + Width of double right (15em) is larger than width of double left (13.5em). + Pick this one and resolve center, by using those flex values. + Width of center: 4em + 2em * 32/64 = 5em. + + Now give the rest in equal parts to left and right: + (20em - 5em) / 2 = 7.5em */ + @bottom-left { + text-align: left; + vertical-align: top; + margin-top: 2em; + height: 10em; + content: "x xx x xxx xx xx xx xx xx xx xx x xx xx xx xx xxx x"; + background: yellow; + } + @bottom-center { + text-align: left; + vertical-align: top; + margin-top: 1em; + height: 10em; + content: "x x xxxx xxxx xxxx xx x x xxx xx xxx"; + background: cyan; + } + @bottom-right { + text-align: left; + vertical-align: top; + height: 10em; + content: "x x x x x xxxxxxx x x x"; + background: hotpink; + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html new file mode 100644 index 00000000000..5bd141a28e1 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 28em; + } + body { + margin: 0; + } + .grid { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + overflow: clip; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="grid"> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="width:15em; margin-bottom:3em; background:hotpink;"> + xxxxxxxxxxxxxxxxxx x + </div> + <div style="width:5em; margin-top:3em; background:yellow;"> + xxxxxx xxx + </div> + </div> + <div class="corner"></div> + + <div class="horizontal-edge"> + <div style="height:6em; margin-right:3em; background:hotpink;"> + x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br> + </div> + <div style="height:10em; margin-left:3em; background:yellow;"> + x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br> + </div> + </div> + <div></div> + <div class="horizontal-edge"></div> + + <div class="corner"></div> + <div class="vertical-edge"></div> + <div class="corner"></div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html new file mode 100644 index 00000000000..8bdf0cdac0b --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto lengths. Min content sizes are larger than available size. No center/middle boxes."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-008-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + /* Total min size is larger than available size. Shrink proportionally to + min sizes. */ + + /* Left margin box min: 18em + Right margin box min: 6em + Flex will be the same as min. Total flex: 18+6=24 + + Available space: 20em + Unused space: 20em - 24em = -4em + + Left width: 18em + (-4em) * 18/24 = 15em + Right width: 6em + (-4em) * 6/24 = 5em */ + @top-left { + text-align: left; + vertical-align: top; + content: "xxxxxxxxxxxxxxxxxx x"; + margin-bottom: 3em; + background: hotpink; + } + @top-right { + text-align: left; + vertical-align: top; + margin-top: 3em; + content: "xxxxxx xxx"; + background: yellow; + } + + /* Top margin box min: 18em (18 lines) + Bottom margin box min: 30em (30 lines) + Flex will be the same as min. Total flex: 18+30=48 + + Available space: 16em + Unused space: 16em - 48em = -32em + + Top height: 18em + (-32em) * 18/48 = 6em + Bottom height: 30em + (-32em) * 30/48 = 10em */ + @left-top { + text-align: left; + vertical-align: top; + margin-right: 3em; + content: "x\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\a"; + background: hotpink; + } + @left-bottom { + text-align: left; + vertical-align: top; + margin-left: 3em; + content: "x\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\a"; + background: yellow; + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html new file mode 100644 index 00000000000..922d165efa1 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 28em; + } + body { + margin: 0; + } + .grid { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + overflow: clip; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="grid"> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="width:7.5em; margin-bottom:4em; background:hotpink;"> + xxxxxxxxxxxxxxxxxx xxxxxxx + </div> + <div style="width:5em; margin-top:2em; margin-bottom:2em; background:cyan;"> + xxxxxxxxxxxx + </div> + <div style="width:7.5em; margin-top:4em; background:yellow;"> + xxxxxx + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html new file mode 100644 index 00000000000..602cc5680ec --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test auto lengths. Min content sizes are larger than available size. With center/middle boxes."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-009-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + + /* Total min content size is larger than available size. Shrink + proportionally to min sizes. Note that max content sizes don't affect + sizing in this mode. + + Left margin box min: 18em + Center margin box min: 12em + Right margin box min: 6em + Flex will be the same as min. + + First resolve the width of center, by evaluating how much space the + double of each side box would take up. Pick the larger (to preserve + centering), and subtract that from available space. + + Available space: 20em + Center flex: 12 (like min) + + Left double min (and flex factor): 18em * 2 = 36em + Total flex left double + center: 36 + 12 = 48 + Unused space with double left: 20em - 36em - 12em = -28em + Width of double left: 36em + (-28em) * 36 / 48 = 15em + + Right double min (and flex factor): 6em * 2 = 12em + Total flex right double + center: 12 + 12 = 24 + Unused space with double right: 20em - 12em - 12em = -4em + Width of double right: 12em + (-4em) * 12 / 24 = 10em + + Width of double left (15em) is larger than width of double right + (10em). Pick this one and resolve center, by using those flex values. + Width of center: 12em + (-28em) * 12 / 48 = 5em. + Left and right will share the rest, i.e. 7.5em on each.*/ + + @top-left { + text-align: left; + vertical-align: top; + content: "xxxxxxxxxxxxxxxxxx xxxxxxx"; + margin-bottom: 4em; + background: hotpink; + } + @top-center { + text-align: left; + vertical-align: top; + margin-top: 2em; + margin-bottom: 2em; + content: "xxxxxxxxxxxx"; + background: cyan; + } + @top-right { + text-align: left; + vertical-align: top; + margin-top: 4em; + content: "xxxxxx"; + background: yellow; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html new file mode 100644 index 00000000000..a4c0b4702d5 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + size: 650px 500px; + margin: 0; + } + body { + margin: 0; + } + .grid { + display: grid; + grid-template-columns: 100px auto 100px; + grid-template-rows: 100px auto 100px; + height: 100vh; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="grid"> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="width:150px; background:hotpink;"></div> + <div style="width:150px; background:cyan;"></div> + <div style="width:150px; background:yellow;"></div> + </div> + <div class="corner"></div> + <div class="horizontal-edge"> + <div style="height:100px; background:yellow;"></div> + <div style="height:100px; background:cyan;"></div> + <div style="height:100px; background:hotpink;"></div> + </div> + <div></div> + <div class="horizontal-edge"> + <div style="height:300px; background:cyan;"></div> + </div> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="width:225px; background:hotpink;"></div> + <div style="width:225px; background:yellow;"></div> + </div> + <div class="corner"></div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html new file mode 100644 index 00000000000..1ebaa6d9288 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Zero min/max content min/max size."> +<link rel="match" href="dimensions-010-print-ref.html"> +<style> + @page { + margin: 100px; + size: 650px 500px; + + @top-left { + background: hotpink; + content: ""; + } + @top-center { + background: cyan; + content: ""; + } + @top-right { + background: yellow; + content: ""; + } + + @left-top { + background: yellow; + content: ""; + } + @left-middle { + background: cyan; + content: ""; + } + @left-bottom { + background: hotpink; + content: ""; + } + + @right-top { + background: red; + content: ""; + } + @right-middle { + background: cyan; + content: "\a0"; + } + @right-bottom { + background: red; + content: ""; + } + + @bottom-left { + background: hotpink; + content: "\a0"; + } + @bottom-center { + background: red; + content: ""; + } + /* Since there's a center box here, although it doesn't require any space, + it will be there right in the center, meaning that the hotpink box, which + *does* require space, can only receive everything to the left of the + center box. */ + @bottom-right { + background: yellow; + content: ""; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html new file mode 100644 index 00000000000..54983175e3d --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + size: 32em 28em; + margin: 0; + } + body { + margin: 0; + } + .grid { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="grid"> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="margin-top:20px; margin-bottom:auto; width:4em; background:hotpink;">x</div> + <div style="margin-top:40px; margin-bottom:auto; width:12em; background:cyan;">xxxxx</div> + <div style="margin-top:60px; margin-bottom:auto; width:4em; background:yellow;">x</div> + </div> + <div class="corner"></div> + <div class="horizontal-edge"></div> + <div></div> + <div class="horizontal-edge"></div> + <div class="corner"></div> + <div class="vertical-edge"> + <div style="margin-top:20px; margin-bottom:auto; width:7.5em; background:yellow;">xxxxxx</div> + <div style="margin-top:40px; margin-bottom:auto; width:5em; background:cyan;">xxxx</div> + <div style="margin-top:60px; margin-bottom:auto; margin-left: auto; width:2em; background:hotpink;">x</div> + </div> + <div class="corner"></div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html new file mode 100644 index 00000000000..e51d1fbd75e --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html @@ -0,0 +1,91 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Auto center/middle, one auto side, one non-auto side."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-011-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + /* The fixed-size right box is larger (4em) than left (even if stretched by + additional space). The left box will get this much space reserved too, + leaving 12em (20em - 2*4em) for center. */ + @top-left { + vertical-align: top; + text-align: left; + content: "x"; + margin-top: 20px; + margin-bottom: auto; + height: max-content; + background: hotpink; + } + @top-center { + vertical-align: top; + text-align: left; + margin-top: 40px; + margin-bottom: auto; + height: max-content; + content: "xxxxx"; + background: cyan; + } + @top-right { + vertical-align: top; + text-align: left; + margin-top: 60px; + margin-bottom: auto; + height: max-content; + content: "x"; + width: 4em; + background: yellow; + } + + /* The auto-sized left box is larger than fixed-size right. Since available + space is 20em, and the double of left plus center is less than that, + unused space (4em) needs to be distributed. + + Double min content width for left is 2*6em = 12em. + Min content width for center is 4em. + Unused space becomes 20em - (12em + 4em) = 4em. + Total flex is 12+4=16. Double left flex is 12, center flex is 4. + + Double left width: 12em + 4em * 12/16 = 15em + Center width: 4em + 4em * 4 / 16 = 5em. + + Left width: 15em / 2 = 7.5em + Right width will be kept as-is, since it's fixed. */ + @bottom-left { + vertical-align: top; + text-align: left; + content: "xxxxxx"; + margin-top: 20px; + margin-bottom: auto; + height: max-content; + background: yellow; + } + @bottom-center { + vertical-align: top; + text-align: left; + margin-top: 40px; + margin-bottom: auto; + height: max-content; + content: "xxxx"; + background: cyan; + } + @bottom-right { + vertical-align: top; + text-align: left; + margin-top: 60px; + margin-bottom: auto; + height: max-content; + content: "x"; + width: 2em; + background: hotpink; + } + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html new file mode 100644 index 00000000000..e62880031a1 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + size: 32em 28em; + margin: 0; + } + body { + margin: 0; + } + .grid { + display: grid; + grid-template-columns: 7em auto 5em; + grid-template-rows: 4em auto 8em; + height: 100vh; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="grid"> + <div class="corner" style="margin-top:0.5em; margin-left:2em; width:3em; height:3em; background:pink;"> + x x<br> + x<br> + x x<br> + </div> + <div class="vertical-edge"> + <div style="width:4em; background:hotpink;">xxx</div> + <div style="margin-left:5em; margin-top:1em; margin-bottom:1em; width:6em; background:yellow;">xx</div> + </div> + <div class="corner"></div> + <div class="horizontal-edge"></div> + <div style="background:blue;"></div> + <div class="horizontal-edge"> + <div style="margin-top:1em; height:3em; background:hotpink;">x<br>x</div> + <div style="margin-left:1.25em; margin-top:4em; width:2.5em; height:4em; background:yellow;">x</div> + </div> + <div class="corner"></div> + <div class="vertical-edge"> + </div> + <div class="corner"></div> +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html new file mode 100644 index 00000000000..6b4ac2c28c7 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Margins around margin boxes."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-012-print-ref.html"> +<style> + @page { + margin: 4em 5em 8em 7em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + @top-left-corner { + vertical-align: top; + text-align: left; + margin: auto; + width: fit-content; + height: fit-content; + content: "x x\a\a0x\ax x"; + background: pink; + } + + /* Top-left has a min content width of 3em. Top-right has an inner min + content width of 2em. Additionally, it has 25% margins on each side. In + the horizontal direction that means 20em*0.25 = 5em on each side. Outer + min content width for top-right becomes 12em. + + Available space is 20em. Unused space is 5em. Total flex is 15. Left flex + is 3. Right flex is 12. + + Left outer width: 3em + 5em*3/15 = 4em + Right outer width: 12em + 5em*12/15 = 16em */ + @top-left { + vertical-align: top; + text-align: left; + content: "xxx"; + background: hotpink; + } + @top-right { + vertical-align: top; + text-align: left; + margin: 25%; + content: "xx"; + background: yellow; + } + + /* Right-top has an inner min content height of 2em. It's margin-top is 1em, + so the outer min content height becomes 3em. Right-bottom has an inner + min content height of 1em. Additionally, it has 25% margins on each side. + In the vertical direction that means 16em*0.25 = 4em on each side. Outer + min content height for right-bottom becomes 9em. + + Available space is 16em. Unused space is 4em. Total flex is 12. Top flex + is 3. Bottom flex is 9. + + Top outer height: 3em + 4em*3/12 = 4em + Bottom outer height: 9em + 4em*9/12 = 12em */ + @right-top { + vertical-align: top; + text-align: left; + margin-top: 1em; + content: "x\ax"; + background: hotpink; + } + @right-bottom { + vertical-align: top; + text-align: left; + margin: 25%; + content: "x"; + background: yellow; + } + } + + body { + background: blue; + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html new file mode 100644 index 00000000000..a131b564fd6 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + html { + font: 16px/1 Ahem; + } + @page { + margin: 0; + width: 32em; + height: 28em; + } + body { + display: grid; + grid-template-columns: 6em auto 6em; + grid-template-rows: 6em auto 6em; + height: 100vh; + margin: 0; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } +</style> +<div class="corner">xx</div> +<div class="vertical-edge"> + <div style="width:17.5em; margin-top:4em; background:hotpink;">xxxxxxx</div> + <div style="width:2.5em; margin-bottom:3em; background:yellow;">x</div> +</div> +<div class="corner" style="height:6em;"> + xx<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> +</div> +<div class="horizontal-edge"> + <div style="width:2em; height:12em; margin-left:4em; background:yellow;"> + xxxxxxx<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + </div> + <div style="width:3em; height:4em; text-align:center; background:hotpink;"> + x<br> + x<br> + x<br> + x<br> + x<br> + x<br> + </div> +</div> +<div style="position:relative; z-index:-1; background:blue;"></div> +<div class="horizontal-edge"> + <div style="width:2em; height:4em; margin-left:2em; background:hotpink;"> + xx<br> + x<br> + x<br> + </div> + <div style="margin:4em 0; margin-left:1.5em; width:3em; height:4em; background:yellow;">x</div> +</div> +<div class="corner" style="margin-top:2.5em;"> + xxxxxxxxx<br> + x +</div> +<div class="vertical-edge"> + <div style="width:5em; margin-top:4em; background:yellow;">x<br>x</div> + <div style="width:15em; margin-top:1em; background:hotpink;">xxx<br>x<br>x<br>x<br>x</div> +</div> +<div class="corner">x<br>x</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html new file mode 100644 index 00000000000..4540b071906 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html @@ -0,0 +1,157 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test orthogonal writing mode roots."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="dimensions-013-print-ref.html"> +<style> + @page { + margin: 6em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + @top-left-corner { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + content: "x\ax"; + } + @top-right-corner { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + content: "x xxxxxxxxx"; + } + @bottom-left-corner { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + margin-top: 2.5em; + content: "x\ax\ax\ax\ax\ax\ax\ax\axx"; + } + @bottom-right-corner { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + content: "xx"; + } + + /* Min/max width for top-left is 7em (seven lines in an orthogonal + writing mode). For top-right it is 1em. Available space is 20em. + Unused space becomes 12em. This will be distributed proportionally based + on max widths. Left gets 7/8, right gets 1/8. Final widths become + 7em+12em*7/8 = 17.5em for left, and 1em+12em*1/8 = 2.5em for right. */ + @top-left { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + margin-top: 4em; + content: "x\ax\ax\ax\ax\ax\ax\a"; + background: hotpink; + } + @top-right { + text-align: left; + vertical-align: top; + margin-bottom: 50%; + content: "x"; + background: yellow; + } + + /* Min content height for left-top is 18em. Min content height for + left-bottom is 6em. + + Available space is 16em. Unused space is 20em - (18em + 6em) = -8em. + Total min height is larger than what's available. + + Shrink proportionally to min content heights. Top flex is 18. Bottom flex + is 6. Total flex is 24. + + Top height: 18em + (-8em) * 18/24 = 12em + Bottom height: 6em + (-8em) * 6/24 = 8em */ + @left-top { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + margin-left: 4em; + content: "x\ax\ax\ax\ax\ax\axxxxxxxxxxxxxxxxxx"; + background: yellow; + } + @left-bottom { + writing-mode: vertical-rl; + text-align: left; + vertical-align: middle; + margin-block-end: auto; + margin-block-start: 3em; + content: "xxxxxx"; + background: hotpink; + } + + /* Max inner content height of right-top is 3em. It has auto margins, but + since the vertical axis is the main axis, they are treated as 0. + Therefore max outer content height is also 3em. + + Max inner content height of right-bottom is 1em. Its margins are all 25%. + Available vertical space is 16em, meaning that top + bottom margin + becomes 50% = 8em. Max outer content height becomes 9em. + + Flex for top becomes 3. Flex for bottom becomes 9. Total flex becomes 12. + Unused space is 4em. + + Top outer height: 3em + 4em*3/12 = 4em + Bottom outer height: 9em + 4em*9/12 = 12em */ + @right-top { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + margin: auto; + block-size: fit-content; + content: "xxx\ax"; + background: hotpink; + } + @right-bottom { + writing-mode: vertical-rl; + text-align: left; + vertical-align: bottom; + margin: 25%; + content: "x"; + background: yellow; + } + + /* bottom-left gets a min-width of 1em (one line in an orthogonal writing + mode), bottom-right gets a min-width of 3em (three lines in an orthogonal + writing mode). So left gets 1/4 of the surplus, and right gets 3/4. + Available space is 20em. Unused space is 20em-4em = 16em. + Left width: 1em+16em*1/4 = 5em + Right width: 3em+16em*3/4 = 15em + + Bottom-right has an intrinsic height (inline-size) larger than + available. Overconstrainedness is resolved by forcing margin-bottom to + auto, giving it a negative value so that the outer top of the box is + flush with the top of the page bottom margin area. */ + @bottom-left { + writing-mode: vertical-rl; + vertical-align: bottom; + text-align: left; + margin-top: auto; + height: min-content; + content: "xx"; + background: yellow; + } + @bottom-right { + writing-mode: vertical-rl; + vertical-align: bottom; + text-align: left; + margin-inline-start: 1em; + border-bottom: 20px solid red; + height: min-content; + content: "x\ax\axxxxxxxxx"; + background: hotpink; + } + } + body { + background: blue; + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html new file mode 100644 index 00000000000..d126f2d0c91 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html @@ -0,0 +1,150 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="Test vertical-rl writing mode document."> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<!-- Note: Using the ref from the preceding test here. --> +<link rel="match" href="dimensions-013-print-ref.html"> +<style> + html { + writing-mode: vertical-rl; + } + @page { + margin: 6em; + width: 20em; + height: 16em; + font: 16px/1 Ahem; + white-space: pre-wrap; + + @top-left-corner { + text-align: left; + vertical-align: bottom; + content: "x\ax"; + } + @top-right-corner { + text-align: left; + vertical-align: bottom; + content: "x xxxxxxxxx"; + } + @bottom-left-corner { + text-align: left; + vertical-align: bottom; + margin-top: 2.5em; + content: "x\ax\ax\ax\ax\ax\ax\ax\axx"; + } + @bottom-right-corner { + writing-mode: horizontal-tb; + text-align: left; + vertical-align: top; + content: "x\ax"; + } + + /* Min/max width for top-left is 7em (seven lines in a vertical writing + mode). For top-right it is 1em. Available space is 20em. Unused space + becomes 12em. This will be distributed proportionally based on max + widths. Left gets 7/8, right gets 1/8. Final widths become 7em+12em*7/8 = + 17.5em for left, and 1em+12em*1/8 = 2.5em for right. */ + @top-left { + text-align: left; + vertical-align: bottom; + margin-top: 4em; + content: "x\ax\ax\ax\ax\ax\ax\a"; + background: hotpink; + } + @top-right { + text-align: left; + vertical-align: bottom; + margin-bottom: 50%; + content: "x"; + background: yellow; + } + + /* Min content height for left-top is 18em. Min content height for + left-bottom is 6em. + + Available space is 16em. Unused space is 20em - (18em + 6em) = -8em. + Total min height is larger than what's available. + + Shrink proportionally to min content heights. Top flex is 18. Bottom flex + is 6. Total flex is 24. + + Top height: 18em + (-8em) * 18/24 = 12em + Bottom height: 6em + (-8em) * 6/24 = 8em */ + @left-top { + text-align: left; + vertical-align: bottom; + margin-left: 4em; + content: "x\ax\ax\ax\ax\ax\axxxxxxxxxxxxxxxxxx"; + background: yellow; + } + @left-bottom { + text-align: left; + vertical-align: middle; + margin-block-end: auto; + margin-block-start: 3em; + content: "xxxxxx"; + background: hotpink; + } + + /* Max inner content height of right-top is 3em. It has auto margins, but + since the vertical axis is the main axis, they are treated as 0. + Therefore max outer content height is also 3em. + + Max inner content height of right-bottom is 1em. Its margins are all 25%. + Available vertical space is 16em, meaning that top + bottom margin + becomes 50% = 8em. Max outer content height becomes 9em. + + Flex for top becomes 3. Flex for bottom becomes 9. Total flex becomes 12. + Unused space is 4em. + + Top outer height: 3em + 4em*3/12 = 4em + Bottom outer height: 9em + 4em*9/12 = 12em */ + @right-top { + text-align: left; + vertical-align: bottom; + margin: auto; + block-size: fit-content; + content: "xxx\ax"; + background: hotpink; + } + @right-bottom { + text-align: left; + vertical-align: bottom; + margin: 25%; + content: "x"; + background: yellow; + } + + /* bottom-left gets a min-width of 1em (one line in a vertical writing + mode), bottom-right gets a min-width of 3em (three lines in a vertical + writing mode). So left gets 1/4 of the surplus, and right gets 3/4. + Available space is 20em. Unused space is 20em-4em = 16em. Left width: + 1em+16em*1/4 = 5em Right width: 3em+16em*3/4 = 15em + + Bottom-right has an intrinsic height (inline-size) larger than + available. Overconstrainedness is resolved by forcing margin-bottom to + auto, giving it a negative value so that the outer top of the box is + flush with the top of the page bottom margin area. */ + @bottom-left { + vertical-align: bottom; + text-align: left; + margin-top: auto; + height: min-content; + content: "xx"; + background: yellow; + } + @bottom-right { + vertical-align: bottom; + text-align: left; + margin-inline-start: 1em; + border-bottom: 20px solid red; + height: min-content; + content: "x\ax\axxxxxxxxx"; + background: hotpink; + } + } + body { + background: blue; + } +</style> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html new file mode 100644 index 00000000000..157cb8effa4 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + size: 400px; + margin: 0; + } + body { + margin: 0; + } +</style> +<div style="width:100px; height:100px; background:green;"> + Line 1<br> + Line 2 +</div> +<div style="margin-left:100px; margin-right:100px;"> + In the top left corner there should be a green square with two lines inside. +</div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html new file mode 100644 index 00000000000..f5f7f8ea247 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-property-list"> +<meta name="assert" content="Test that inapplicable properties are ignored."> +<link rel="match" href="inapplicable-properties-print-ref.html"> +<style> + @page { + size: 400px; + margin: 100px; + + @top-left-corner { + text-align: left; + vertical-align: top; + white-space: pre-wrap; + content: "Line 1\aLine 2"; + position: relative; + columns: 2; + column-rule: solid red; + orphans: 1; + widows: 1; + rotate: 45deg; + top: 50px; + left: 90px; + width: 100px; + height:100px; + background: green; + } + } + body { + margin: 0; + } +</style> +In the top left corner there should be a green square with two lines inside. diff --git a/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html new file mode 100644 index 00000000000..de6b55257ca --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 400px; + } + body { + display: grid; + grid-template-columns: 100px auto 100px; + grid-template-rows: 100px auto 100px; + height: 100vh; + margin: 0; + } + .square { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + } + .square.left { + margin-left: auto; + } + .square.top { + margin-top: auto; + } + .vertical-edge { + display: flex; + justify-content: space-between; + } + .horizontal-edge { + display: flex; + flex-flow: column; + justify-content: space-between; + } + .pagearea { + border: solid blue; + padding: 8px; + } +</style> + +<div class="square left top"></div> +<div class="vertical-edge"> + <div class="square top"></div> + <div class="square top"></div> + <div class="square top"></div> +</div> +<div class="square top"></div> +<div class="horizontal-edge"> + <div class="square left"></div> + <div class="square left"></div> + <div class="square left"></div> +</div> +<div class="pagearea"> + There should be 16 margin boxes around this page area. Within their available + space, they should all be squares, and be aligned towards the center of the + page, with a tiny margin separating their border from the blue border. +</div> +<div class="horizontal-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square left"></div> +<div class="vertical-edge"> + <div class="square"></div> + <div class="square"></div> + <div class="square"></div> +</div> +<div class="square"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html new file mode 100644 index 00000000000..549443ebc32 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html @@ -0,0 +1,127 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension"> +<meta name="assert" content="In an overconstrained situation, margins facing away from the page center are treated as auto, pushing the margin boxes towards to page area"> +<link rel="match" href="overconstrained-001-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 400px; + border: solid blue; + @top-left-corner { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @top-left { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @top-center { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @top-right { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @top-right-corner { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @right-top { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @right-middle { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @right-bottom { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @bottom-right-corner { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @bottom-right { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @bottom-center { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @bottom-left { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @bottom-left-corner { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @left-bottom { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @left-middle { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + @left-top { + border: solid; + width: 25px; + height: 25px; + margin: 3px; + content: ""; + } + } +</style> +There should be 16 margin boxes around this page area. Within their available +space, they should all be squares, and be aligned towards the center of the +page, with a tiny margin separating their border from the blue border. diff --git a/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html new file mode 100644 index 00000000000..2677aee123c --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + margin: 0; + size: 500px 400px; + } + body { + display: grid; + grid-template-columns: 100px auto 100px; + grid-template-rows: 100px auto 100px; + height: 100vh; + margin: 0; + } + .box { + border: solid thin; + flex: 1; + } + body > .box { + background: pink; + } + .vertical-edge { + display: flex; + } + .horizontal-edge { + display: flex; + flex-flow: column; + } + .vertical-edge > .box.first { + width: 5em; + margin: 5px -4em; + background: hotpink; + } + .vertical-edge > .box.second { + width: 5em; + flex: none; + margin: 10px 0; + background: cyan; + } + .vertical-edge > .box.third { + margin: 15px -4em; + background: yellow; + } + .horizontal-edge > .box.first { + height: 5em; + margin: -4em 5px; + background: hotpink; + } + .horizontal-edge > .box.second { + height: 5em; + flex: none; + margin: 0 10px; + background: cyan; + } + .horizontal-edge > .box.third { + margin: -4em 15px; + background: yellow; + } + .pagearea { + padding: 8px; + } +</style> + +<div class="box" style="margin-left:20px; z-index:0;"></div> +<div class="vertical-edge"> + <div class="box first" style="z-index:1;"></div> + <div class="box second" style="z-index:2;"></div> + <div class="box third" style="z-index:3;"></div> +</div> +<div class="box" style="margin-top:20px; z-index:4;"></div> +<div class="horizontal-edge"> + <div class="box third" style="z-index:15;"></div> + <div class="box second" style="z-index:14;"></div> + <div class="box first" style="z-index:13;"></div> +</div> +<div class="pagearea"> + Default margin box paint order should start with top-left-corner, then go + clockwise. Hotpink boxes should be on top of pink ones. Cyan on top of + hotpink. Yellow on top of cyan. No text ("FAIL") should be seen in the margin + boxes. +</div> +<div class="horizontal-edge"> + <div class="box first" style="z-index:5;"></div> + <div class="box second" style="z-index:6;"></div> + <div class="box third" style="z-index:7;"></div> +</div> +<div class="box" style="margin-bottom:20px; z-index:12;"></div> +<div class="vertical-edge"> + <div class="box third" style="z-index:11;"></div> + <div class="box second" style="z-index:10;"></div> + <div class="box first" style="z-index:9;"></div> +</div> +<div class="box" style="margin-right:20px; z-index:8;"></div> diff --git a/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html new file mode 100644 index 00000000000..839762f0b9a --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html @@ -0,0 +1,145 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#painting"> +<meta name="assert" content="Test default vertical and horizontal alignment for all 16 margin boxes"> +<link rel="match" href="paint-order-001-print-ref.html"> +<style> + @page { + margin: 100px; + size: 500px 400px; + @top-left-corner { + border: solid thin; + margin-left: 20px; + text-align: center; + vertical-align: middle; + content: "FAIL"; + background: pink; + } + @top-left { + border: solid thin; + margin: 5px -4em; + text-align: right; + vertical-align: middle; + content: "FAIL"; + background: hotpink; + } + @top-center { + border: solid thin; + margin: 10px 0; + width: 5em; + text-align: right; + vertical-align: middle; + content: "FAIL"; + background: cyan; + } + @top-right { + border: solid thin; + margin: 15px -4em; + text-align: right; + vertical-align: middle; + content: "FAIL"; + background: yellow; + } + @top-right-corner { + border: solid thin; + margin-top: 20px; + text-align: center; + vertical-align: bottom; + content: "FAIL"; + background: pink; + } + @right-top { + border: solid thin; + margin: -4em 5px; + text-align: center; + vertical-align: bottom; + content: "FAIL"; + background: hotpink; + } + @right-middle { + border: solid thin; + margin: 0 10px; + height: 5em; + text-align: center; + vertical-align: bottom; + content: "FAIL"; + background: cyan; + } + @right-bottom { + border: solid thin; + margin: -4em 15px; + text-align: left; + vertical-align: bottom; + content: "FAIL"; + background: yellow; + } + @bottom-right-corner { + border: solid thin; + margin-right: 20px; + text-align: left; + vertical-align: center; + content: "FAIL"; + background: pink; + } + @bottom-right { + border: solid thin; + margin: 5px -4em; + text-align: left; + vertical-align: middle; + content: "FAIL"; + background: hotpink; + } + @bottom-center { + border: solid thin; + width: 5em; + margin: 10px 0; + text-align: left; + vertical-align: middle; + content: "FAIL"; + background: cyan; + } + @bottom-left { + border: solid thin; + margin: 15px -4em; + text-align: left; + vertical-align: top; + content: "FAIL"; + background: yellow; + } + @bottom-left-corner { + border: solid thin; + margin-bottom: 20px; + vertical-align: top; + text-align: center; + content: "FAIL"; + background: pink; + } + @left-bottom { + border: solid thin; + margin: -4em 5px; + text-align: center; + vertical-align: top; + content: "FAIL"; + background: hotpink; + } + @left-middle { + border: solid thin; + margin: 0 10px; + height: 5em; + text-align: center; + vertical-align: top; + content: "FAIL"; + background: cyan; + } + @left-top { + border: solid thin; + margin: -4em 15px; + content: ""; + background: yellow; + } + } +</style> +Default margin box paint order should start with top-left-corner, then go +clockwise. Hotpink boxes should be on top of pink ones. Cyan on top of +hotpink. Yellow on top of cyan. No text ("FAIL") should be seen in the margin +boxes. diff --git a/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html b/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html index d0decf8bf41..0eaae755eb9 100644 --- a/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html +++ b/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html @@ -17,5 +17,5 @@ p { font: 16px test, sans-serif; } <p><span class=fl>क्र</span>म <p><span class=fl>क्ष</span>ण <p><span class=fl>ष्क्र</span>स -<p><span class=fl>ङ्</span>ङम -<p><span class=fl>ङ्</span>क्रस +<p><span class=fl>ङ्ङ</span>म +<p><span class=fl>ङ्क्र</span>स diff --git a/tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html b/tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html new file mode 100644 index 00000000000..dd3ab2d4457 --- /dev/null +++ b/tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html @@ -0,0 +1,2 @@ +<!DOCTYPE html> +<p><ruby>base<rt>annotation</ruby></p> diff --git a/tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html b/tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html new file mode 100644 index 00000000000..3adade2dd3c --- /dev/null +++ b/tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://crbug.com/347597917"/> +<link rel="match" href="reference/ruby-text-dynamic-style-ref.html"> +<style> +.reftest-wait rt { + background-color: red; +} +ruby { + position: relative; +} +p { + position: relative; +} +</style> +<p><ruby>base<rt>annotation</ruby></p> +<script> +requestAnimationFrame(() => { + requestAnimationFrame(() => { + document.documentElement.classList.remove('reftest-wait'); + }); +}); +</script> +</html> diff --git a/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html new file mode 100644 index 00000000000..29b7c3c9fa5 --- /dev/null +++ b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>CSS Text Test: soft-hyphen and float clearance</title> +<link rel="match" href="reference/hyphens-vs-float-clearance-001-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#hyphens-property"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1902974"> +<link rel="author" href="mailto:jkew@mozilla.com"> +<style> +.outer { + font: 16px/1.4 monospace; + width: 6ch; + border: 1px solid gray; + float: left; + margin: 10px; + hyphens: auto; +} +.float { + float: right; + width: 2ch; + background: lightblue; +} +.h1 { + height: 1em; +} +.h2 { + height: 2em; +} +.h3 { + height: 3em; +} +.h4 { + height: 4em; +} +</style> +<body lang="en"> +<div class="outer"><div class="float h1"></div>hyphenate!</div> +<div class="outer"><div class="float h2"></div>hyphenate!</div> +<div class="outer"><div class="float h3"></div>hyphenate!</div> +<div class="outer"><div class="float h4"></div>hyphenate!</div> diff --git a/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html new file mode 100644 index 00000000000..6b5b213cb71 --- /dev/null +++ b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>CSS Text Test: soft-hyphen and float clearance</title> +<link rel="match" href="reference/hyphens-vs-float-clearance-001-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#hyphens-property"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1902974"> +<link rel="author" href="mailto:jkew@mozilla.com"> +<style> +.outer { + font: 16px/1.4 monospace; + width: 6ch; + border: 1px solid gray; + float: left; + margin: 10px; + hyphens: manual; +} +.float { + float: right; + width: 2ch; + background: lightblue; +} +.h1 { + height: 1em; +} +.h2 { + height: 2em; +} +.h3 { + height: 3em; +} +.h4 { + height: 4em; +} +</style> +<body lang="en"> +<div class="outer"><div class="float h1"></div>hy­phen­ate!</div> +<div class="outer"><div class="float h2"></div>hy­phen­ate!</div> +<div class="outer"><div class="float h3"></div>hy­phen­ate!</div> +<div class="outer"><div class="float h4"></div>hy­phen­ate!</div> diff --git a/tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html b/tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html new file mode 100644 index 00000000000..1fc7b3d5210 --- /dev/null +++ b/tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<title>CSS Text Reference: soft-hyphen and float clearance</title> +<link rel="author" href="mailto:jkew@mozilla.com"> +<style> +.outer { + font: 16px/1.4 monospace; + width: 6ch; + border: 1px solid gray; + float: left; + margin: 10px; + hyphens: none; +} +.float { + float: right; + width: 2ch; + background: lightblue; +} +.h1 { + height: 1em; +} +.h2 { + height: 2em; +} +.h3 { + height: 3em; +} +.h4 { + height: 4em; +} +</style> +<body lang="en"> +<div class="outer"><div class="float h1"></div>hy‐<br>phen‐<br>ate!</div> +<div class="outer"><div class="float h2"></div>hy‐<br>phen‐<br>ate!</div> +<div class="outer"><div class="float h3"></div>hy‐<br>phen‐<br>ate!</div> +<div class="outer"><div class="float h4"></div>hy‐<br>phen‐<br>ate!</div> diff --git a/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html new file mode 100644 index 00000000000..c9d6eb720f1 --- /dev/null +++ b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<title>CSS Basic User Interface Test: transparent accent color</title> +<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> +<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent"> +<style> + +div { + border: solid orange; + padding: 1ch; + margin: 1ch; + float: left; +} + +#t1 input { color-scheme: light;} +#t1 input { accent-color: white; } + +#t2 input { color-scheme: light;} +#t2 input { accent-color: #7f7fff; } + +#t3 { background: orange;} +#t3 input { color-scheme: light;} +#t3 input { accent-color: #7f7fff; } + +</style> + +<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes. + +<div id=t1> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t2> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t3> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> diff --git a/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html new file mode 100644 index 00000000000..819a5852460 --- /dev/null +++ b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<title>CSS Basic User Interface Test: transparent accent color</title> +<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> +<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent"> +<style> + +div { + border: solid orange; + padding: 1ch; + margin: 1ch; + float: left; +} + +#t1 input { color-scheme: dark;} +#t1 input { accent-color: black; } + +#t2 input { color-scheme: dark;} +#t2 input { accent-color: #00007f; } + +#t3 { background: orange;} +#t3 input { color-scheme: dark;} +#t3 input { accent-color: #00007f; } + +</style> + +<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes. + +<div id=t1> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t2> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t3> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> diff --git a/tests/wpt/tests/css/css-ui/transparent-accent-color-001.html b/tests/wpt/tests/css/css-ui/transparent-accent-color-001.html new file mode 100644 index 00000000000..219e24c1689 --- /dev/null +++ b/tests/wpt/tests/css/css-ui/transparent-accent-color-001.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title>CSS Basic User Interface Test: transparent accent color</title> +<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> +<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent"> +<link rel="match" href="reference/transparent-accent-color-001-ref.html"> +<meta name="assert" content="If the color supplied is partially or fully transparent, it is precomposed over white when in light mode."> +<style> + +div { + border: solid orange; + padding: 1ch; + margin: 1ch; + float: left; +} + +#t1 input { color-scheme: light;} +#t1 .test { accent-color: #ff000000;} +#t1 .ref { accent-color: white; } + +#t2 input { color-scheme: light;} +#t2 .test { accent-color: #0000ff80;} +#t2 .ref { accent-color: #7f7fff; } + +#t3 { background: orange;} +#t3 input { color-scheme: light;} +#t3 .test { accent-color: #0000ff80;} +#t3 .ref { accent-color: #7f7fff; } + +</style> + +<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes. + +<div id=t1> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t2> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t3> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> diff --git a/tests/wpt/tests/css/css-ui/transparent-accent-color-002.html b/tests/wpt/tests/css/css-ui/transparent-accent-color-002.html new file mode 100644 index 00000000000..46b9835d0c1 --- /dev/null +++ b/tests/wpt/tests/css/css-ui/transparent-accent-color-002.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title>CSS Basic User Interface Test: transparent accent color</title> +<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> +<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent"> +<link rel="match" href="reference/transparent-accent-color-002-ref.html"> +<meta name="assert" content="If the color supplied is partially or fully transparent, it is precomposed over black when in dark mode."> +<style> + +div { + border: solid orange; + padding: 1ch; + margin: 1ch; + float: left; +} + +#t1 input { color-scheme: dark;} +#t1 .test { accent-color: #ff000000;} +#t1 .ref { accent-color: black; } + +#t2 input { color-scheme: dark;} +#t2 .test { accent-color: #0000ff80;} +#t2 .ref { accent-color: #00007f; } + +#t3 { background: orange;} +#t3 input { color-scheme: dark;} +#t3 .test { accent-color: #0000ff80;} +#t3 .ref { accent-color: #00007f; } + +</style> + +<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes. + +<div id=t1> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t2> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> + +<div id=t3> + <input class=test type=checkbox checked> + <input class=ref type=checkbox checked> +</div> diff --git a/tests/wpt/tests/css/css-variables/revert-in-fallback.html b/tests/wpt/tests/css/css-variables/revert-in-fallback.html index ae99e5192fd..956965ab7ab 100644 --- a/tests/wpt/tests/css/css-variables/revert-in-fallback.html +++ b/tests/wpt/tests/css/css-variables/revert-in-fallback.html @@ -28,15 +28,15 @@ test((t) => { assert_equals(getComputedStyle(document.body).getPropertyValue('margin'), body_ua_margin); - }, 'var(--unknown, revert-layer) in shorthand'); + }, 'var(--unknown, revert) in shorthand'); test((x) => { assert_equals(getComputedStyle(document.body).getPropertyValue('margin-left'), body_ua_margin); - }, 'var(--unknown, revert-layer) in shorthand observed via longhand'); + }, 'var(--unknown, revert) in shorthand observed via longhand'); test((t) => { assert_equals(getComputedStyle(document.body).getPropertyValue('display'), body_ua_display); - }, 'var(--unknown, revert-layer) in longhand'); + }, 'var(--unknown, revert) in longhand'); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html new file mode 100644 index 00000000000..1e22d6f66d7 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>View transitions: view-transition-name element, when captured escapes its clips even if it has an abspos child (ref)</title> +<link rel="help" href="https://www.w3.org/TR/css-transitions-1/"> +<link rel="author" href="mailto:vmpstr@chromium.org"> + +<style> +#target { + width: 100px; + height: 100px; + background: lightblue; +} +#abspos { + position: absolute; + left: 0; + width: 50px; + height: 50px; + background: pink; +} + +body { background: rebeccapurple } +</style> + + +<div id=target> + <div id=abspos></div> +</div> + diff --git a/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html new file mode 100644 index 00000000000..b16b02bd632 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>View transitions: view-transition-name element, when captured escapes its clips even if it has an abspos child</title> +<link rel="help" href="https://www.w3.org/TR/css-transitions-1/"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<link rel="match" href="element-escapes-clip-with-abspos-child-ref.html"> +<script src="/common/reftest-wait.js"></script> + +<style> +#clipper { + border-radius: 20px; + overflow: hidden; + width: max-content; +} +#target { + width: 100px; + height: 100px; + background: lightblue; + view-transition-name: target; +} +#abspos { + position: absolute; + left: 0; + width: 50px; + height: 50px; + background: pink; +} + +:root { view-transition-name: none } + +::view-transition { + background: rebeccapurple; +} + +::view-transition-old(*) { + animation: unset; + opacity: 1; +} +::view-transition-new(*) { + animation: unset; + opacity: 0; +} +::view-transition-group(*) { + animation-play-state: paused; +} +</style> + + +<div id=clipper> + <div id=target> + <div id=abspos></div> + </div> +</div> + +<script> +function runTest() { + document.startViewTransition().ready.then(takeScreenshot); +} + +requestAnimationFrame(() => requestAnimationFrame(() => { + requestAnimationFrame(runTest); +})); +</script> diff --git a/tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html b/tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html new file mode 100644 index 00000000000..9bc1f5751fc --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html @@ -0,0 +1,79 @@ +<!DOCTYPE html> +<title>View transitions: hit testing the pseudo-elements should always return the document element</title> +<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/"> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +html { view-transition-name: none; } + +body { margin: 0; } + +#target { + width: 100px; + height: 100vh; + view-transition-name: target; +} + +::view-transition { + background-color: green; +} + +::view-transition, +::view-transition-group(target), +::view-transition-image-pair(target) { + height: 100%; + padding-left: 100px; +} + +::view-transition-group(target) { + animation-duration: 30s; + background-color: lightgreen; +} + +::view-transition-image-pair(target) { + height: 100%; + background-color: skyblue; + animation: none; + margin-left: 100px; +} + +::view-transition-old(target) { + height: 100%; + width: 100px; + animation: none; + background-color: navy; +} +::view-transition-new(target) { + height: 100%; + width: 100px; + margin-left: 100px; + animation: none; + background-color: purple; +} +</style> + +<div id=target></div> + +<script> +async_test(t => { + assert_implements(document.startViewTransition, "Missing document.startViewTransition"); + document.startViewTransition(() => { + requestAnimationFrame(async () => { + // ::view-transition-group + t.step(() => assert_equals(document.elementFromPoint(20, 20), document.documentElement)); + // ::view-transition-image-pair + t.step(() => assert_equals(document.elementFromPoint(120, 20), document.documentElement)); + // ::view-transition-old + t.step(() => assert_equals(document.elementFromPoint(220, 20), document.documentElement)); + // ::view-transition-new + t.step(() => assert_equals(document.elementFromPoint(320, 20), document.documentElement)); + // ::view-transition + t.step(() => assert_equals(document.elementFromPoint(420, 20), document.documentElement)); + t.done(); + }); + }); +}, "Hit-testing view transition pseudo-elements should always return the document element"); +</script> diff --git a/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html b/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html index b34d2b11df5..c950cc126e0 100644 --- a/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html +++ b/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html @@ -63,9 +63,9 @@ async_test(t => { target.classList.toggle("before"); target.classList.toggle("after"); requestAnimationFrame(async () => { - // Check the old location of the element, we should get body. + // Check the location of the element, we should get body. t.step(() => assert_equals(document.elementFromPoint(20, 20), document.body)); - // Check the new location of the pseudo element, we should get documentElement, + // Check the location of the pseudo element for the old snapshot, we should get documentElement, // which is the originating element for the pseudo element. t.step(() => assert_equals(document.elementFromPoint(220, 20), document.documentElement)); // Check the spot that used to be covered by the element but now has diff --git a/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html new file mode 100644 index 00000000000..b6e89e28d5a --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html style="reftest-wait"> +<head> + <style> + #target { + width: 100px; + height: 100px; + background: green; + margin: 300px; + } + </style> +</head> +<body> + <div id="target"></div> + <div style="height: 1000px"></div> + <script> + function scrollBy(y) { + return new Promise(resolve => { + addEventListener("scroll", () => { + requestAnimationFrame(() => { + requestAnimationFrame(resolve); + }); + }, { once: true, capture: true }); + document.documentElement.scrollBy({ + top: y, + behavior: "instant" + }); + }); + } + addEventListener("load", async () => { + await scrollBy(200); + document.documentElement.classList.remove("reftest-wait"); + }); + </script> +</body> +</html> diff --git a/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html new file mode 100644 index 00000000000..8ff0780bbd3 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html style="reftest-wait"> +<head> + <title>Scroll position transform should be the last one to be applied</title> + <link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> + <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/"> + <link rel="match" href="transformed-element-scroll-transform-ref.html"> + <style> + :root { + view-transition-name: none; + } + + ::view-transition-group(*) { + animation-duration: 10s; + } + + #target { + width: 100px; + height: 100px; + background: green; + margin: 300px; + view-transition-name: target; + rotate: 90deg; + } + </style> +</head> +<body> + <div id="target"></div> + <div style="height: 1000px"></div> + <script> + function scrollBy(y) { + return new Promise(resolve => { + addEventListener("scroll", () => { + requestAnimationFrame(() => { + requestAnimationFrame(resolve); + }); + }, { once: true, capture: true }); + document.documentElement.scrollBy({ + top: y, + behavior: "instant" + }); + }); + } + addEventListener("load", async () => { + await scrollBy(200); + const transition = document.startViewTransition(); + await transition.ready; + requestAnimationFrame(() => { + requestAnimationFrame(() => { + document.documentElement.classList.remove("reftest-wait"); + }); + }); + }); + </script> +</body> +</html> diff --git a/tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js b/tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js new file mode 100644 index 00000000000..f3d02d2598d --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js @@ -0,0 +1,51 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +async function reset(t, scrollers) { + for (const scroller of scrollers) { + await waitForScrollReset(t, scroller); + } +} + +/** + * This tests executing scrollIntoView on multiple scroll containers at the same + * time. It assumes and verifies vertical scrolling. + */ +async function simultaneousScrollIntoViewsTest(test, + behaviors, + targets, + scrollers, + target_offsets) { + assert_equals(targets.length, behaviors.length, + "equal numbers of targets and behaviors provided"); + assert_equals(scrollers.length, target_offsets.length, + "equal numbers of scrollers and target_offsets provided"); + await reset(test, scrollers); + await waitForCompositorCommit(); + + // All scrollers should be at an offset of 0. + for (const scroller of scrollers) { + assert_equals(scroller.scrollTop, 0, `${scroller.id}'s scrollTop is reset`); + } + + const scrollend_promises = Array.from(scrollers, (scroller) => { + return waitForScrollEnd(scroller); + }); + + // Scroll all targets into view. + for (let idx = 0; idx < targets.length; idx++) { + targets[idx].scrollIntoView({ + block: "start", + behavior: behaviors[idx] + }); + } + await Promise.all(scrollend_promises); + + // Verify the expected positions os all scrollers. + for (let idx = 0; idx < scrollers.length; idx++) { + assert_approx_equals(scrollers[idx].scrollTop, target_offsets[idx], 1, + `scrollIntoView finished executing on ${scrollers[idx].id}` + ); + } +} diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html new file mode 100644 index 00000000000..630cd21b613 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html @@ -0,0 +1,99 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSSOM View - Simultaneous scrollIntoViews</title> + <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="/css/css-scroll-snap/support/common.js"></script> + <script src="resources/simultaneousScrollIntoViews.js"></script> + </head> + <body> + <style> + .scroller { + overflow-y: scroll; + background-color: teal; + border: solid 1px black; + position: relative; + resize: both; + display: inline-block; + } + .scroller.outer { + height: 400px; + width: 400px; + } + .scroller.inner { + height: 200px; + width: 200px; + position: absolute; + top: 150%; + } + .space { + height: 200vh; + width: 200vw; + } + .box { + height: 50px; + width: 50px; + background-color: purple; + } + .target { + position: absolute; + top: 150%; + } + </style> + <div id="outerscroller1" class="outer scroller"> + <div class="space"></div> + <div id="innerscroller1" class="inner scroller"> + <div class="space"></div> + <div class="box target" id="target1"></div> + </div> + </div> + <div id="outerscroller2" class="outer scroller"> + <div class="space"></div> + <div id="innerscroller2" class="inner scroller"> + <div class="space"></div> + <div class="box target" id="target2"></div> + </div> + </div> + <script> + const outerscroller1 = document.getElementById("outerscroller1"); + const outerscroller2 = document.getElementById("outerscroller2"); + const innerscroller1 = document.getElementById("innerscroller1"); + const innerscroller2 = document.getElementById("innerscroller2"); + const target1 = document.getElementById("target1"); + const target2 = document.getElementById("target2"); + + const scrollers = [ outerscroller1, + outerscroller2, + innerscroller1, + innerscroller2 ]; + // Expect the outer scrollers to scroll to the inner scrollers + // and the inner scrollers to scroll to their respective targets. + const target_offsets = [ innerscroller1.offsetTop, + innerscroller2.offsetTop, + target1.offsetTop, + target2.offsetTop ]; + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["smooth", "smooth"], [target1, target2], scrollers, target_offsets); + }, "Simultaneous smooth scrollIntoViews run to completion"); + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["smooth", "instant"], [target1, target2], scrollers, target_offsets); + }, "Simultaneous smooth,instant scrollIntoViews run to completion"); + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["instant", "smooth"], [target1, target2], scrollers, target_offsets); + }, "Simultaneous instant,smooth scrollIntoViews run to completion"); + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["instant", "instant"], [target1, target2], scrollers, target_offsets); + }, "Simultaneous instant scrollIntoViews run to completion"); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html new file mode 100644 index 00000000000..e6ddd1818f2 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSSOM View - Simultaneous scrollIntoViews</title> + <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="/css/css-scroll-snap/support/common.js"></script> + <script src="resources/simultaneousScrollIntoViews.js"></script> + </head> + <body> + <style> + .scroller { + overflow-y: scroll; + height: 200px; + width: 200px; + background-color: teal; + border: solid 1px black; + position: relative; + display: inline-block; + } + .space { + height: 200vh; + width: 200vw; + } + .box { + height: 50px; + width: 50px; + background-color: purple; + } + .target { + position: absolute; + top: 150%; + } + </style> + <div id="scroller1" class="scroller"> + <div class="space"></div> + <div class="box target" id="target1"></div> + </div> + <div id="scroller2" class="scroller"> + <div class="space"></div> + <div class="box target" id="target2"></div> + </div> + <script> + const scroller1 = document.getElementById("scroller1"); + const scroller2 = document.getElementById("scroller2"); + const target1 = document.getElementById("target1"); + const target2 = document.getElementById("target2"); + + const targets = [target1, target2]; + const scrollers = [scroller1, scroller2]; + const target_offsets = [target1.offsetTop, target2.offsetTop]; + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["smooth", "smooth"], + targets, + scrollers, + target_offsets); + }, "Simultaneous smooth scrollIntoViews run to completion"); + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["smooth", "instant"], + targets, + scrollers, + target_offsets); + }, "Simultaneous smooth,instant scrollIntoViews run to completion"); + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["instant", "smooth"], + targets, + scrollers, + target_offsets); + }, "Simultaneous instant,smooth scrollIntoViews run to completion"); + + promise_test(async (t) => { + await simultaneousScrollIntoViewsTest(t, + ["instant", "instant"], + targets, + scrollers, + target_offsets); + }, "Simultaneous instant scrollIntoViews run to completion"); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html index ddfa31076c2..324e51d7388 100644 --- a/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html +++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html @@ -1,6 +1,8 @@ <!DOCTYPE HTML> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/css/css-scroll-snap/support/common.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <title>Check End Position of smooth scrollIntoView</title> <div id="container" style="height: 2500px; width: 2500px;"> <div id="content" style="height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px;background-color: red"> @@ -15,93 +17,63 @@ var window_width = document.documentElement.clientWidth; var content = document.getElementById("content"); add_completion_callback(() => document.getElementById("container").remove()); -function waitForScrollEnd() { - var wait_for_scroll_start = performance.now(); - var last_changed_timestamp = wait_for_scroll_start; - var last_changed_frame = 0; - var last_x = window.scrollX; - var last_y = window.scrollY; - return new Promise((resolve, reject) => { - function tick(frames, timestamp) { - // We requestAnimationFrame until at least 200ms have elapsed and at least - // 5 animation frames have run since the last change to the scroll - // offset, timing out after 8 seconds. - if (window.scrollX != last_x || window.scrollY != last_y) { - last_changed_timestamp = timestamp; - last_changed_frame = frames; - last_x = window.scrollX; - last_y = window.scrollY; - } - if (timestamp - last_changed_timestamp > 200 && - frames - last_changed_frame > 4) { - resolve(); - } else if (timestamp - wait_for_scroll_start > 8000) { - reject(); - } else { - requestAnimationFrame(tick.bind(null, frames + 1)); - } - } - tick(last_changed_frame, wait_for_scroll_start); - }); -} - // When testing manually, we need an additional frame at beginning // to trigger the effect. requestAnimationFrame(() => { -promise_test(t => { - window.scrollTo(0, 0); +promise_test(async (t) => { + await waitForScrollReset(t, document.scrollingElement); var expected_x = content.offsetLeft + content_width - window_width; var expected_y = content.offsetTop + content_height - window_height; assert_not_equals(window.scrollX, expected_x, "scrollX"); assert_not_equals(window.scrollY, expected_y, "scrollY"); + const scrollend_promise = waitForScrollEnd(document); content.scrollIntoView({behavior: "smooth", block: "nearest", inline: "nearest"}); - return waitForScrollEnd().then(() => { - assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); - assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); - }); + await scrollend_promise; + assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); + assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); }, "Smooth scrollIntoView should scroll the element to the 'nearest' position"); -promise_test(t => { - window.scrollTo(0, 0); +promise_test(async (t) => { + await waitForScrollReset(t, document.scrollingElement); var expected_x = content.offsetLeft; var expected_y = content.offsetTop; assert_not_equals(window.scrollX, expected_x, "scrollX"); assert_not_equals(window.scrollY, expected_y, "scrollY"); + const scrollend_promise = waitForScrollEnd(document); content.scrollIntoView({behavior: "smooth", block: "start", inline: "start"}); - return waitForScrollEnd().then(() => { - assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); - assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); - }); + await scrollend_promise; + assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); + assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); }, "Smooth scrollIntoView should scroll the element to the 'start' position"); -promise_test(t => { - window.scrollTo(0, 0); +promise_test(async (t) => { + await waitForScrollReset(t, document.scrollingElement); var expected_x = content.offsetLeft + (content_width - window_width) / 2; var expected_y = content.offsetTop + (content_height - window_height) / 2; assert_not_equals(window.scrollX, expected_x, "scrollX"); assert_not_equals(window.scrollY, expected_y, "scrollY"); + const scrollend_promise = waitForScrollEnd(document); content.scrollIntoView({behavior: "smooth", block: "center", inline: "center"}); - return waitForScrollEnd().then(() => { - assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); - assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); - }); + await scrollend_promise; + assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); + assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); }, "Smooth scrollIntoView should scroll the element to the 'center' position"); -promise_test(t => { - window.scrollTo(0, 0); +promise_test(async (t) => { + await waitForScrollReset(t, document.scrollingElement); var expected_x = content.offsetLeft + content_width - window_width; var expected_y = content.offsetTop + content_height - window_height; assert_not_equals(window.scrollX, expected_x, "scrollX"); assert_not_equals(window.scrollY, expected_y, "scrollY"); + const scrollend_promise = waitForScrollEnd(document); content.scrollIntoView({behavior: "smooth", block: "end", inline: "end"}); - return waitForScrollEnd().then(() => { - assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); - assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); - }); + await scrollend_promise; + assert_approx_equals(window.scrollX, expected_x, 1, "scrollX"); + assert_approx_equals(window.scrollY, expected_y, 1, "scrollY"); }, "Smooth scrollIntoView should scroll the element to the 'end' position"); }); diff --git a/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html new file mode 100644 index 00000000000..26dbdd2053a --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html> + <body> + <style> + * { + scroll-behavior: smooth; + } + .scroller { + overflow-y: scroll; + height: 200px; + width: 200px; + background-color: teal; + border: solid 1px black; + position: relative; + display: inline-block; + } + .space { + height: 200vh; + width: 200vw; + } + .box { + height: 50px; + width: 50px; + background-color: purple; + } + .target { + position: absolute; + top: 150%; + } + </style> + <div id="fragment_scroll_container" class="scroller"> + <div class="space"></div> + <div class="box target" id="fragment_scroll_target">target</div> + </div> + <div id="scrollintoview_container" class="scroller"> + <div class="space"></div> + <div class="box target" id="scrollintoview_target"></div> + </div> + <a id="fragment_link" href="#fragment_scroll_target">Scroll To Fragment</a> + </style> + <script> + const fragment_scroll_container = + document.getElementById("fragment_scroll_container"); + const scrollintoview_container = + document.getElementById("scrollintoview_container"); + const scrollintoview_target = + document.getElementById("scrollintoview_target"); + const parent = window.parent; + + // Post a message to the parent frame when the scroll ends to the test can + // proceed. + scrollintoview_container.addEventListener("scrollend", () => { + parent.postMessage("ready"); + }, { once: true }); + + // Start a scroll on the scrollintoview container as soon as we start + // scrolling the fragment's container. + fragment_scroll_container.addEventListener("scroll", () => { + scrollintoview_target.scrollIntoView({ behavior: "smooth" }); + }, { once: true }); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html new file mode 100644 index 00000000000..72ecdf15e55 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSSOM View - Smooth scrollIntoView + smooth scroll to fragment</title> + <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + </head> + <body> + <style> + iframe { + width: 100vw; + height: 100vh; + } + </style> + <script> + let frame = null; + async function test_smooth_scrollintoview_with_smooth_fragment() { + return new Promise((resolve) => { + window.addEventListener("message", (evt) => { + assert_equals(evt.data, "ready"); + + // Check that the fragment scroll completed. + const fragment_scroll_container = + frame.contentDocument.getElementById("fragment_scroll_container"); + const fragment_scroll_target = + frame.contentDocument.getElementById("fragment_scroll_target"); + assert_approx_equals(fragment_scroll_container.scrollTop, + fragment_scroll_target.offsetTop, 1, + "scroll to fragment was completed"); + + // Check that the scrollIntoView completed. + const scrollintoview_container = + frame.contentDocument.getElementById("scrollintoview_container"); + const scrollintoview_target = + frame.contentDocument.getElementById("scrollintoview_target"); + assert_approx_equals(scrollintoview_container.scrollTop, + scrollintoview_target.offsetTop, 1, + "scrollIntoView was completed"); + + resolve(); + }); + }); + } + + promise_test(async (t) => { + frame = document.createElement("iframe"); + let test_complete_promise = + test_smooth_scrollintoview_with_smooth_fragment(); + frame.src = + "smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html" + + "#fragment_scroll_target"; + document.documentElement.appendChild(frame); + await test_complete_promise; + frame.src = ""; + frame.remove(); + }, "Smooth scroll to hash fragment (on pageload) alongside smooth " + + "scrollIntoView runs to completion."); + + promise_test(async (t) => { + frame = document.createElement("iframe"); + const iframe_load_promise = new Promise((resolve) => { + frame.addEventListener("load", resolve); + }); + const test_complete_promise = + test_smooth_scrollintoview_with_smooth_fragment(); + frame.src = + "smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html"; + document.documentElement.appendChild(frame); + await iframe_load_promise; + const link = frame.contentDocument.getElementById("fragment_link"); + link.click(); + await test_complete_promise; + frame.src = ""; + frame.remove(); + }, "Smooth scroll to hash fragment (on click) alongside smooth " + + "scrollIntoView runs to completion."); + </script> + </body>
\ No newline at end of file diff --git a/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html new file mode 100644 index 00000000000..f42fcb29857 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSSOM View - Unrelated scroll gesture while scrollIntoView is ongoing</title> + <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/css/css-scroll-snap/support/common.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + </head> + <body> + <style> + .scroller { + overflow-y: scroll; + height: 200px; + width: 200px; + background-color: teal; + border: solid 1px black; + position: relative; + display: inline-block; + } + .space { + height: 200vh; + width: 200vw; + } + .box { + height: 50px; + width: 50px; + background-color: purple; + } + .target { + position: absolute; + top: 150%; + } + </style> + <div id="programmatic_scroller" class="scroller"> + <div class="space"></div> + <div class="box target" id="target"></div> + </div> + <div id="gesture_scroller" class="scroller"> + <div class="space"></div> + </div> + <script> + const programmatic_scroller = + document.getElementById("programmatic_scroller"); + const gesture_scroller = document.getElementById("gesture_scroller"); + const target = document.getElementById("target"); + + promise_test(async (t) => { + await waitForCompositorCommit(); + + const scrollend_promises = [ + waitForScrollEnd(programmatic_scroller), + waitForScrollEnd(gesture_scroller) + ] + // As soon as we observe a scroll event, begin a gesture scroll on the + // second scroll container. + programmatic_scroller.addEventListener("scroll", async () => { + await new test_driver.Actions().scroll(0, 0, 0, 100, + { origin: gesture_scroller }) + .send(); + }, { once: true }); + + target.scrollIntoView({ behavior: "smooth" }); + + await Promise.all(scrollend_promises); + + assert_equals(gesture_scroller.scrollTop, 100, + "gesture scroll completed"); + assert_approx_equals(programmatic_scroller.scrollTop, target.offsetTop, + 1, "scrollIntoView completed"); + }, "scrollIntoView is not interrupted by unrelated gesture scroll"); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html new file mode 100644 index 00000000000..c80dcb04e5c --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Sampled pixels beyond edge should mirror back into the content.</title> +<link rel="author" href="mailto:flackr@chromium.org"> + +<div class="clip"> + <div class="filter"> + <div class="border"></div> + </div> +</div> +<div style="position:absolute;top:100px;will-change:transform;"> + <p>Expected above: A pure white box with a very small hint of the 1px blue border blurred inside.</p> +</div> + +<style> +.clip { + position: absolute; + width: 100px; + height: 100px; + top: 8px; + left: 8px; + overflow: clip; +} +.filter { + position: absolute; + width: 100px; + height: 100px; + top: 0px; + left: 0px; + filter: blur(10px); +} +.border { + position: absolute; + width: 302px; + height: 302px; + top: -101px; + left: -101px; + background: + repeating-linear-gradient(0deg, blue 0px, blue 2px, transparent 2px, transparent 100px), + repeating-linear-gradient(90deg, blue 0px, blue 2px, transparent 2px, transparent 100px); +} +</style> diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html new file mode 100644 index 00000000000..c11d2f2733e --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta name=fuzzy content="maxDifference=0-10;totalPixels=0-10000"> +<title>backdrop-filter: Sampled pixels beyond edge should mirror back into the content.</title> +<link rel="author" href="mailto:flackr@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#backdrop-filter-operation"> +<link rel="match" href="backdrop-filter-edge-mirror-ref.html"> + +<div class="box border"></div> +<div class="box filter"></div> +<div style="position:absolute;top:100px;will-change:transform;"> + <p>Expected above: A pure white box with a very small hint of the 1px blue border blurred inside.</p> +</div> + +<style> +.box { + position: absolute; + width: 100px; + height: 100px; + top: 8px; + left: 8px; + box-sizing: border-box; +} +.filter { + backdrop-filter: blur(10px); +} +.border { + border: 1px solid blue; +} +</style> diff --git a/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html b/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html index ba5212e433b..850533cd262 100644 --- a/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html +++ b/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html @@ -26,26 +26,6 @@ async function createIframeAndWaitForMessage(test, iframeUrl) { return message.data; } -// Builds a valid navigator.identity.get() request where IdentityRequestProvider#request is an object. -function buildValidNavigatorIdentityRequestWithRequestObject() { - return { - digital: { - providers: [{ - protocol: "urn:openid.net:oid4vp", - request: { - // Based on https://github.com/openid/OpenID4VP/issues/125 - client_id: "client.example.org", - client_id_scheme: "web-origin", - nonce: "n-0S6_WzA2Mj", - presentation_definition: { - // Presentation Exchange request, omitted for brevity - } - }, - }], - }, - }; -} - // Requires browser to have mode where OS-presented digital-identity-prompt is // bypassed in favour of returning "fake_test_token" directly. promise_test(async t=>{ @@ -56,13 +36,6 @@ promise_test(async t=>{ promise_test(async t => { let request = buildValidNavigatorIdentityRequest(); - let credential = await requestIdentityWithActivation(test_driver, request); - assert_equals("urn:openid.net:oid4vp", credential.protocol); - assert_equals("fake_test_token", credential.data); -}, "navigator.identity.get() API works in toplevel frame."); - -promise_test(async t => { - let request = buildValidNavigatorIdentityRequest(); request.digital.providers = undefined; await promise_rejects_js(t, TypeError, requestIdentityWithActivation(test_driver, request)); }, "navigator.identity.get() API fails if DigitalCredentialRequestOptions::providers is not specified."); @@ -73,46 +46,6 @@ promise_test(async t => { await promise_rejects_js(t, TypeError, requestIdentityWithActivation(test_driver, request)); }, "navigator.identity.get() API fails if there are no providers."); -promise_test(async t => { - let request = buildValidNavigatorIdentityRequest(); - let providerCopy = structuredClone(request.digital.providers[0]); - request.digital.providers.push(providerCopy); - await promise_rejects_js(t, TypeError, requestIdentityWithActivation(test_driver, request)); -}, "navigator.identity.get() API fails if there is more than one provider."); - -promise_test(async t => { - const request = buildValidNavigatorIdentityRequestWithRequestObject(); - let credential = await requestIdentityWithActivation(test_driver, request); - assert_equals("urn:openid.net:oid4vp", credential.protocol); - assert_equals("fake_test_token", credential.data); -}, "navigator.identity.get() API succeeds when IdentityRequestProvider#request is an object instead of stringified JSON object"); - -promise_test(async t => { - const request = buildValidNavigatorIdentityRequestWithRequestObject(); - const largeList = []; - for (let i = 0; i < 1000000; ++i) { - largeList.push("Value " + i); - } - request.digital.providers[0].request.random = largeList; - await promise_rejects_js(t, TypeError, requestIdentityWithActivation(test_driver, request)); -}, "navigator.identity.get() API fails when IdentityRequestProvider#request object is too big"); - -promise_test(async t=> { - let abortController = new AbortController(); - let request = buildValidNavigatorIdentityRequest(); - request.signal = abortController.signal; - let requestPromise = requestIdentityWithActivation(test_driver, request); - abortController.abort(); - await promise_rejects_dom(t, "AbortError", requestPromise); -}, "navigator.identity.get() promise is rejected when the page aborts the request."); - -promise_test(async t=> { - const message = await createIframeAndWaitForMessage( - t, basePath + "support/iframe.html"); - assert_equals(message.result, "Pass"); - assert_equals(message.data, "fake_test_token"); -}, "navigator.identity.get() succeeds in same-origin iframe"); - promise_test(async t=> { const message = await createIframeAndWaitForMessage( t, remoteBaseURL + "support/iframe.html"); diff --git a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html index 8782b1dfee6..40aa77f4764 100644 --- a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html +++ b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html @@ -108,10 +108,12 @@ function runTest() { document.body.appendChild(out_div); await waitForCompositorCommit(); - element_scrollend_arrived = false; - document_scrollend_arrived = false; inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" }); - await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, "Nested scrollIntoView did not receive scrollend event."); + const scrollend_events = [ + waitForScrollendEventNoTimeout(out_div), + waitForScrollendEventNoTimeout(target_div) + ]; + await Promise.all(scrollend_events); assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft"); assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop"); assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft"); diff --git a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html index b2782dbfa9b..932c0a392a3 100644 --- a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html +++ b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html @@ -13,9 +13,11 @@ </div> <script> +const kChildNodePartStartCommentData = "#"; +const kChildNodePartEndCommentData = "/"; function assertIsComment(node, commentText) { assert_true(node instanceof Comment); - // TODO(crbug.com/40271855): While developing alternative syntax, the comment might be empty or it might be "S"/"E". + // TODO(crbug.com/40271855): While developing alternative syntax, the comment might be empty or it might be "#" or "/". assert_true(node.textContent === '' || node.textContent === commentText); } @@ -41,13 +43,13 @@ Array.from(document.querySelectorAll('#context_elements>*')).forEach(contextEl = let expectedRootParts = [{type:'ChildNodePart',metadata:[]}]; assertEqualParts(root.getParts(),expectedRootParts,0,'declarative root missing parts'); const childPart1 = root.getParts()[0]; - assertIsComment(childPart1.previousSibling,'S'); - assertIsComment(childPart1.nextSibling,'E'); + assertIsComment(childPart1.previousSibling,kChildNodePartStartCommentData); + assertIsComment(childPart1.nextSibling,kChildNodePartEndCommentData); const expectedChild1Parts = [{type:'ChildNodePart',metadata:[]}]; assertEqualParts(childPart1.getParts(),expectedChild1Parts,0,'First level childpart should just have one child part'); const childPart2 = childPart1.getParts()[0]; - assertIsComment(childPart2.previousSibling,'S'); - assertIsComment(childPart2.nextSibling,'E'); + assertIsComment(childPart2.previousSibling,kChildNodePartStartCommentData); + assertIsComment(childPart2.nextSibling,kChildNodePartEndCommentData); const expectedChild2Parts = [{type:'NodePart',metadata:[]}]; assertEqualParts(childPart2.getParts(),expectedChild2Parts,0,'Second level childpart should have just the node part'); assert_true(childPart2.getParts()[0].node instanceof HTMLSpanElement); diff --git a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html index 3a437038737..70fc471bc61 100644 --- a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html +++ b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html @@ -55,14 +55,16 @@ function addPartsCleanup(t,partRoot) { t.add_cleanup(() => partRoot.getParts().forEach(part => part.disconnect())); } +const kChildNodePartStartCommentData = "#"; +const kChildNodePartEndCommentData = "/"; +function assertIsComment(node, commentText) { + assert_true(node instanceof Comment); + // TODO(crbug.com/40271855): While developing alternative syntax, the comment might be empty or it might be "#" or "/". + assert_true(node.textContent === '' || node.textContent === commentText); +} const template = document.getElementById('declarative'); ['Main Document','Template','Clone','PartClone'].forEach(testCase => { - function assertIsComment(node,commentText) { - assert_true(node instanceof Comment); - assert_equals(node.textContent,commentText); - } - test((t) => { let doc,target,wrapper,cleanup; let expectDOMParts = true; @@ -116,13 +118,13 @@ const template = document.getElementById('declarative'); assert_equals(root.getParts()[i].node,target.querySelector(`#nodepart${i}`)); } const childPart1 = root.getParts()[0]; - assertIsComment(childPart1.previousSibling,''); - assertIsComment(childPart1.nextSibling,''); + assertIsComment(childPart1.previousSibling,kChildNodePartStartCommentData); + assertIsComment(childPart1.nextSibling,kChildNodePartEndCommentData); const expectedChild1Parts = [{type:'ChildNodePart',metadata:[]}]; assertEqualParts(childPart1.getParts(),expectedChild1Parts,0,'First level childpart should just have one child part'); const childPart2 = childPart1.getParts()[0]; - assertIsComment(childPart2.previousSibling,''); - assertIsComment(childPart2.nextSibling,''); + assertIsComment(childPart2.previousSibling,kChildNodePartStartCommentData); + assertIsComment(childPart2.nextSibling,kChildNodePartEndCommentData); const expectedChild2Parts = [{type:'NodePart',metadata:[]},{type:'AttributePart',metadata:[]}]; assertEqualParts(childPart2.getParts(),expectedChild2Parts,0,'Second level childpart should have NodePart and AttributePart'); assert_true(childPart2.getParts()[0].node instanceof HTMLSpanElement); diff --git a/tests/wpt/tests/dom/parts/resources/domparts-utils.js b/tests/wpt/tests/dom/parts/resources/domparts-utils.js index f8982de50f3..d1da9fb0785 100644 --- a/tests/wpt/tests/dom/parts/resources/domparts-utils.js +++ b/tests/wpt/tests/dom/parts/resources/domparts-utils.js @@ -1,5 +1,6 @@ function assertEqualParts(parts,partDescriptions,expectedParts,description) { assert_equals(parts.length,partDescriptions.length,`${description}: lengths differ`); + let nodePartIndx = 0, childNodePartIndx = 0; for(let i=0;i<parts.length;++i) { assert_true(parts[i] instanceof Part,`${description}: not a Part`); assert_true(parts[i] instanceof window[partDescriptions[i].type],`${description}: index ${i} expected ${partDescriptions[i].type}`); @@ -8,7 +9,20 @@ function assertEqualParts(parts,partDescriptions,expectedParts,description) { if (expectedParts) { // TODO(crbug.com/40271855): While developing alternative syntax, we aren't comparing equality of the Part objects: // assert_equals(parts[i],expectedParts[i],`${description}: index ${i} object equality`); - assert_equals(parts[i].root.getPartNode(i),parts[i].node || parts[i].previousSibling,'getPartNode() should return the same node as getParts().node/previousSibling'); + if ('getNodePartNodes' in parts[i].root) { + switch (partDescriptions[i].type) { + case 'NodePart': + assert_equals(parts[i].root.getNodePartNodes()[nodePartIndx],parts[i].node,`getNodePartNodes() indx ${nodePartIndx} should match node from NodePart`); + nodePartIndx++; + break; + case 'ChildNodePart': + assert_equals(parts[i].root.getChildNodePartNodes()[childNodePartIndx],parts[i].previousSibling,`getChildNodePartNodes() indx ${childNodePartIndx} should match previousSibling from ChildNodePart`); + childNodePartIndx++; + assert_equals(parts[i].root.getChildNodePartNodes()[childNodePartIndx],parts[i].nextSibling,`getChildNodePartNodes() indx ${childNodePartIndx} should match nextSibling from ChildNodePart`); + childNodePartIndx++; + break; + } + } } } } diff --git a/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html b/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html index 762ec595475..45fd1613fac 100644 --- a/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html +++ b/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html @@ -244,6 +244,22 @@ assert_true(got_textupdate_event, "Input in iframe EditContext should trigger textupdate event"); iframe.remove(); }, 'EditContext constructed outside iframe can be used in iframe'); + + promise_test(async function() { + const div = document.createElement("div"); + const input = document.createElement("input"); + document.body.appendChild(div); + document.body.appendChild(input); + const editContext = new EditContext(); + div.editContext = editContext; + div.focus(); + div.remove(); + input.focus(); + await test_driver.send_keys(input, "a"); + assert_equals(input.value, "a", "input should have received text input"); + + input.remove(); + }, 'Removing EditContext-associated element with focus doesn\'t prevent further text input on the page'); </script> </body> </html> diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts.py b/tests/wpt/tests/fedcm/support/accounts.py index 126f911a58c..126f911a58c 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/accounts.py +++ b/tests/wpt/tests/fedcm/support/accounts.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py b/tests/wpt/tests/fedcm/support/accounts_check_same_site_strict.py index 796ac003cbc..796ac003cbc 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py +++ b/tests/wpt/tests/fedcm/support/accounts_check_same_site_strict.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts_no_approved_clients.py b/tests/wpt/tests/fedcm/support/accounts_no_approved_clients.py index faea06edc36..faea06edc36 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/accounts_no_approved_clients.py +++ b/tests/wpt/tests/fedcm/support/accounts_no_approved_clients.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py b/tests/wpt/tests/fedcm/support/client_metadata.py index 72ddcc5cd62..72ddcc5cd62 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py +++ b/tests/wpt/tests/fedcm/support/client_metadata.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py.headers b/tests/wpt/tests/fedcm/support/client_metadata.py.headers index 7164e5f8182..7164e5f8182 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py.headers +++ b/tests/wpt/tests/fedcm/support/client_metadata.py.headers diff --git a/tests/wpt/tests/credential-management/support/fedcm/client_metadata_clear_count.py b/tests/wpt/tests/fedcm/support/client_metadata_clear_count.py index 3c31bf5077d..0e52d99c1dd 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/client_metadata_clear_count.py +++ b/tests/wpt/tests/fedcm/support/client_metadata_clear_count.py @@ -3,7 +3,7 @@ import importlib keys = importlib.import_module("credential-management.support.fedcm.keys") def main(request, response): - client_metadata_url = "/credential-management/support/fedcm/client_metadata.py" + client_metadata_url = "/fedcm/support/client_metadata.py" counter = request.server.stash.take(keys.CLIENT_METADATA_COUNTER_KEY, client_metadata_url) diff --git a/tests/wpt/tests/credential-management/support/fedcm/continue_on.py b/tests/wpt/tests/fedcm/support/continue_on.py index 2a580e0f3f4..2a580e0f3f4 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/continue_on.py +++ b/tests/wpt/tests/fedcm/support/continue_on.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/disconnect.py b/tests/wpt/tests/fedcm/support/disconnect.py index cf62ceda225..cf62ceda225 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/disconnect.py +++ b/tests/wpt/tests/fedcm/support/disconnect.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/disconnect_failure.py b/tests/wpt/tests/fedcm/support/disconnect_failure.py index f880218b2f6..f880218b2f6 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/disconnect_failure.py +++ b/tests/wpt/tests/fedcm/support/disconnect_failure.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/error_with_code_and_url.py b/tests/wpt/tests/fedcm/support/error_with_code_and_url.py index 71bfea00f46..71bfea00f46 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/error_with_code_and_url.py +++ b/tests/wpt/tests/fedcm/support/error_with_code_and_url.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/login.html b/tests/wpt/tests/fedcm/support/login.html index 78d241cda95..78d241cda95 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/login.html +++ b/tests/wpt/tests/fedcm/support/login.html diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest-not-in-list.json b/tests/wpt/tests/fedcm/support/manifest-not-in-list.json index 00700666675..00700666675 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest-not-in-list.json +++ b/tests/wpt/tests/fedcm/support/manifest-not-in-list.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest-token-nocors.json b/tests/wpt/tests/fedcm/support/manifest-token-nocors.json index 77ba1b4702b..77ba1b4702b 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest-token-nocors.json +++ b/tests/wpt/tests/fedcm/support/manifest-token-nocors.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest.py b/tests/wpt/tests/fedcm/support/manifest.py index a40fc100eee..a40fc100eee 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest.py +++ b/tests/wpt/tests/fedcm/support/manifest.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_false.json b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_false.json index 47ca63edc4f..47ca63edc4f 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_false.json +++ b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_false.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_true.json b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_true.json index 7d7004c3cff..7d7004c3cff 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_true.json +++ b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_true.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json b/tests/wpt/tests/fedcm/support/manifest_check_same_site_strict.json index d7304159834..d7304159834 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json +++ b/tests/wpt/tests/fedcm/support/manifest_check_same_site_strict.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_id_assertion_endpoint_returns_error.json b/tests/wpt/tests/fedcm/support/manifest_id_assertion_endpoint_returns_error.json index e098cc4511a..e098cc4511a 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_id_assertion_endpoint_returns_error.json +++ b/tests/wpt/tests/fedcm/support/manifest_id_assertion_endpoint_returns_error.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_no_login_url.json b/tests/wpt/tests/fedcm/support/manifest_no_login_url.json index 15a657c679d..15a657c679d 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_no_login_url.json +++ b/tests/wpt/tests/fedcm/support/manifest_no_login_url.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_accounts.json b/tests/wpt/tests/fedcm/support/manifest_redirect_accounts.json index 6a8972feebd..ed9b3c29692 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_accounts.json +++ b/tests/wpt/tests/fedcm/support/manifest_redirect_accounts.json @@ -1,5 +1,5 @@ { - "accounts_endpoint": "/common/redirect.py?location=/credential-management/support/fedcm/accounts.py", + "accounts_endpoint": "/common/redirect.py?location=/fedcm/support/accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token.py", "login_url": "login.html" diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_token.json b/tests/wpt/tests/fedcm/support/manifest_redirect_token.json index 867b4dffb76..ba04e890770 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_token.json +++ b/tests/wpt/tests/fedcm/support/manifest_redirect_token.json @@ -1,7 +1,7 @@ { "accounts_endpoint": "accounts.py", "client_metadata_endpoint": "client_metadata.py", - "id_assertion_endpoint": "/common/redirect.py?location=/credential-management/support/fedcm/token.py&status=308", + "id_assertion_endpoint": "/common/redirect.py?location=/fedcm/support/token.py&status=308", "disconnect_endpoint": "disconnect.py", "login_url": "login.html" } diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_token_with_http_error.json b/tests/wpt/tests/fedcm/support/manifest_token_with_http_error.json index 691a1e8d3a6..691a1e8d3a6 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_token_with_http_error.json +++ b/tests/wpt/tests/fedcm/support/manifest_token_with_http_error.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_auto_selected_flag.json b/tests/wpt/tests/fedcm/support/manifest_with_auto_selected_flag.json index 591c927153b..591c927153b 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_auto_selected_flag.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_auto_selected_flag.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_continue_on.json b/tests/wpt/tests/fedcm/support/manifest_with_continue_on.json index d7673c7e1b1..d7673c7e1b1 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_continue_on.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_continue_on.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_cross_origin_disconnect.sub.json b/tests/wpt/tests/fedcm/support/manifest_with_cross_origin_disconnect.sub.json index a1ad5c71ac3..77d27e33f26 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_cross_origin_disconnect.sub.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_cross_origin_disconnect.sub.json @@ -2,6 +2,6 @@ "accounts_endpoint": "accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token.py", - "disconnect_endpoint": "https://{{hosts[alt][]}}:{{ports[https][0]}}/credential-management/support/fedcm/disconnect.py", + "disconnect_endpoint": "https://{{hosts[alt][]}}:{{ports[https][0]}}/fedcm/support/disconnect.py", "login_url": "login.html" } diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_disconnect_failure.json b/tests/wpt/tests/fedcm/support/manifest_with_disconnect_failure.json index 96035e7e8b3..96035e7e8b3 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_disconnect_failure.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_disconnect_failure.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_no_accounts.json b/tests/wpt/tests/fedcm/support/manifest_with_no_accounts.json index 0d38f26d350..0d38f26d350 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_no_accounts.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_no_accounts.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_rp_mode.json b/tests/wpt/tests/fedcm/support/manifest_with_rp_mode.json index 5692fd91905..5692fd91905 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_rp_mode.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_rp_mode.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_single_account.json b/tests/wpt/tests/fedcm/support/manifest_with_single_account.json index 5f9b7a81b9a..5f9b7a81b9a 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_single_account.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_single_account.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_two_accounts.json b/tests/wpt/tests/fedcm/support/manifest_with_two_accounts.json index 6310fb0a0be..6310fb0a0be 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_two_accounts.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_two_accounts.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json b/tests/wpt/tests/fedcm/support/manifest_with_variable_accounts.json index 9e4af250045..9e4af250045 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json +++ b/tests/wpt/tests/fedcm/support/manifest_with_variable_accounts.json diff --git a/tests/wpt/tests/credential-management/support/fedcm/no_accounts.py b/tests/wpt/tests/fedcm/support/no_accounts.py index 8767c50afb4..8767c50afb4 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/no_accounts.py +++ b/tests/wpt/tests/fedcm/support/no_accounts.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/resolve.html b/tests/wpt/tests/fedcm/support/resolve.html index dbdc28c3247..dbdc28c3247 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/resolve.html +++ b/tests/wpt/tests/fedcm/support/resolve.html diff --git a/tests/wpt/tests/credential-management/support/fedcm/select_manifest_in_root_manifest.py b/tests/wpt/tests/fedcm/support/select_manifest_in_root_manifest.py index d4f1efff6a7..d4f1efff6a7 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/select_manifest_in_root_manifest.py +++ b/tests/wpt/tests/fedcm/support/select_manifest_in_root_manifest.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py b/tests/wpt/tests/fedcm/support/set_accounts_cookie.py index 15adf11324e..15adf11324e 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py +++ b/tests/wpt/tests/fedcm/support/set_accounts_cookie.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/single_account.py b/tests/wpt/tests/fedcm/support/single_account.py index 7c8906ae7b9..7c8906ae7b9 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/single_account.py +++ b/tests/wpt/tests/fedcm/support/single_account.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token.py b/tests/wpt/tests/fedcm/support/token.py index 7ec81c390a9..7ec81c390a9 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token.py +++ b/tests/wpt/tests/fedcm/support/token.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_false.py b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_false.py index a25a14af694..a25a14af694 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_false.py +++ b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_false.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_true.py b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_true.py index 00b755b920c..00b755b920c 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_true.py +++ b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_true.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py b/tests/wpt/tests/fedcm/support/token_check_same_site_strict.py index 4e55bf27f61..4e55bf27f61 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py +++ b/tests/wpt/tests/fedcm/support/token_check_same_site_strict.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_account_id.py b/tests/wpt/tests/fedcm/support/token_with_account_id.py index 04e7b5b56b9..04e7b5b56b9 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_with_account_id.py +++ b/tests/wpt/tests/fedcm/support/token_with_account_id.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_auto_selected_flag.py b/tests/wpt/tests/fedcm/support/token_with_auto_selected_flag.py index 3e011ce788c..3e011ce788c 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_with_auto_selected_flag.py +++ b/tests/wpt/tests/fedcm/support/token_with_auto_selected_flag.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_http_error.py b/tests/wpt/tests/fedcm/support/token_with_http_error.py index 05b9945ba80..05b9945ba80 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_with_http_error.py +++ b/tests/wpt/tests/fedcm/support/token_with_http_error.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_rp_mode.py b/tests/wpt/tests/fedcm/support/token_with_rp_mode.py index add634c99bb..add634c99bb 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/token_with_rp_mode.py +++ b/tests/wpt/tests/fedcm/support/token_with_rp_mode.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/two_accounts.py b/tests/wpt/tests/fedcm/support/two_accounts.py index 4022561ff78..4022561ff78 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/two_accounts.py +++ b/tests/wpt/tests/fedcm/support/two_accounts.py diff --git a/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py b/tests/wpt/tests/fedcm/support/variable_accounts.py index fc4446acc49..fc4446acc49 100644 --- a/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py +++ b/tests/wpt/tests/fedcm/support/variable_accounts.py diff --git a/tests/wpt/tests/fenced-frame/resources/utils.js b/tests/wpt/tests/fenced-frame/resources/utils.js index 218ac281f65..c4807c58aee 100644 --- a/tests/wpt/tests/fenced-frame/resources/utils.js +++ b/tests/wpt/tests/fenced-frame/resources/utils.js @@ -211,7 +211,7 @@ function generateRemoteContextURL(headers, origin) { // Transform the headers into the expected format. // https://web-platform-tests.org/writing-tests/server-pipes.html#headers function escape(s) { - return s.replace('(', '\\(').replace(')', '\\)'); + return s.replace('(', '\\(').replace(')', '\\)').replace(',', '\\,'); } const formatted_headers = headers.map((header) => { return `header(${escape(header[0])}, ${escape(header[1])})`; diff --git a/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js new file mode 100644 index 00000000000..29f58ebe9b1 --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testdriver.js +// META: script=/common/utils.js +// META: script=resources/fledge-util.sub.js +// META: script=/common/subset-tests.js +// META: timeout=long +// META: variant=?1-4 + +// These tests focus on the navigator.getInterestGroupAdAuctionData() method. + +subsetTest(promise_test, async test => { + const result = await navigator.getInterestGroupAdAuctionData({ seller: window.location.origin }); + assert_true(result.requestId !== null); + assert_true(result.request.length === 0); +}, 'getInterestGroupAdAuctionData() with no interest groups returns a zero length result.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await joinInterestGroup(test, uuid); + + const result = await navigator.getInterestGroupAdAuctionData({ seller: window.location.origin }); + assert_true(result.requestId !== null); + assert_true(result.request.length > 0); +}, 'getInterestGroupAdAuctionData() with one interest group returns a non-zero length result.'); diff --git a/tests/wpt/tests/fullscreen/api/permission.tentative.https.html b/tests/wpt/tests/fullscreen/api/permission.tentative.https.html new file mode 100644 index 00000000000..34758660b77 --- /dev/null +++ b/tests/wpt/tests/fullscreen/api/permission.tentative.https.html @@ -0,0 +1,39 @@ +<!doctype html> +<meta charset=utf-8> +<title>Permissions API query support for "fullscreen"</title> +<link rel="help" href="https://github.com/explainers-by-googlers/html-fullscreen-without-a-gesture"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<script> + promise_test(async (test) => { + let allowWithoutGestureCalled = false; + const status = await navigator.permissions.query({ + name: "fullscreen", + get allowWithoutGesture() { + allowWithoutGestureCalled = true; + return true; + }, + }); + assert_true(status instanceof PermissionStatus); + assert_equals(status.name, "fullscreen", `name should be "fullscreen"`); + assert_true(allowWithoutGestureCalled, `allowWithoutGesture should be checked`); + }, `Querying "fullscreen" permission checks "allowWithoutGesture" option`); + + promise_test(async (test) => { + const descriptor = { name: "fullscreen", allowWithoutGesture: true }; + await test_driver.set_permission(descriptor, "granted"); + const status = await navigator.permissions.query(descriptor); + assert_true(status instanceof PermissionStatus); + assert_equals(status.name, "fullscreen", `name should be "fullscreen"`); + assert_equals(status.state, "granted", `state should be "granted", as set`); + }, `Set and query "fullscreen" permission with "allowWithoutGesture" true`); + + promise_test((test) => { + const descriptor = { name: "fullscreen", allowWithoutGesture: false }; + return promise_rejects_js(test, TypeError, navigator.permissions.query(descriptor)); + }, `Querying "fullscreen" permission with "allowWithoutGesture" false is unsupported`); + +</script> diff --git a/tests/wpt/tests/geolocation/tojson.https.window.js b/tests/wpt/tests/geolocation/tojson.https.window.js new file mode 100644 index 00000000000..f8cef07a7f0 --- /dev/null +++ b/tests/wpt/tests/geolocation/tojson.https.window.js @@ -0,0 +1,51 @@ +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +'use strict'; + +function check_coords(original, json, prefix) { + for (const key of [ + 'accuracy', + 'latitude', + 'longitude', + 'altitude', + 'altitudeAccuracy', + 'heading', + 'speed', + 'coords', + 'timestamp', + ]) { + assert_equals(original[key], json[key], `${prefix} ${key} entry does not match its toJSON value`); + } +} + +promise_setup(async () => { + await test_driver.set_permission({ name: "geolocation" }, "granted"); + + if (document.readyState != 'complete') { + await new Promise(resolve => { + window.addEventListener('load', resolve, {once: true}); + }); + } +}, 'Grant permission and wait for the document to be fully active.'); + +promise_test(async (t) => { + const position = await new Promise((resolve, reject) => { + navigator.geolocation.getCurrentPosition( + t.step_func((position) => { + resolve(position); + }), + t.step_func((error) => { + reject(error.message); + }), + ); + }); + + assert_equals(typeof(position.toJSON), 'function'); + + const json = position.toJSON(); + assert_equals(position.timestamp, json.timestamp, 'GeolocationPosition timestamp entry does not match its toJSON value'); + check_coords(position.coords, json.coords, 'GeolocationPosition coords'); + + assert_equals(typeof(position.coords.toJSON), 'function'); + check_coords(position.coords, position.coords.toJSON(), 'GeolocationCoordinates'); +}, 'Test toJSON() in GeolocationPosition and GeolocationCoordinates.'); diff --git a/tests/wpt/tests/html-aam/roles.tentative.html b/tests/wpt/tests/html-aam/roles.tentative.html index a3eb850497e..3920f2cba9e 100644 --- a/tests/wpt/tests/html-aam/roles.tentative.html +++ b/tests/wpt/tests/html-aam/roles.tentative.html @@ -18,6 +18,39 @@ <input type="checkbox" switch data-testname="el-input-checkbox-switch" data-expectedrole="switch" class="ex"> +<!-- + These thead, tbody, and tfoot role tests are pending spec discussion. + See https://github.com/w3c/html-aam/issues/474 +--> +<table> + <thead data-testname="el-thead" data-expectedrole="rowgroup" class="ex"> + <tr> + <th>a</th> + <th>b</th> + <th>c</th> + </tr> + </thead> + <tbody data-testname="el-tbody" data-expectedrole="rowgroup" class="ex"> + <tr> + <th>1</th> + <td>2</td> + <td>3</td> + </tr> + <tr> + <th>4</th> + <td>5</td> + <td>6</td> + </tr> + </tbody> + <tfoot data-testname="el-tfoot" data-expectedrole="rowgroup" class="ex"> + <tr> + <th>x</th> + <th>y</th> + <th>z</th> + </tr> + </tfoot> +</table> + <script> AriaUtils.verifyRolesBySelector(".ex"); </script> diff --git a/tests/wpt/tests/html-aam/table-roles.html b/tests/wpt/tests/html-aam/table-roles.html index a81caa3d3f0..8f5033ea811 100644 --- a/tests/wpt/tests/html-aam/table-roles.html +++ b/tests/wpt/tests/html-aam/table-roles.html @@ -17,14 +17,14 @@ <table data-testname="el-table" data-expectedrole="table" class="ex"> <caption data-testname="el-caption" data-expectedrole="caption" class="ex">caption</caption> - <thead data-testname="el-thead" data-expectedrole="rowgroup" class="ex"> + <thead> <tr data-testname="el-tr-thead" data-expectedrole="row" class="ex"> <th data-testname="el-th" data-expectedrole="columnheader" class="ex">a</th> <th>b</th> <th>c</th> </tr> </thead> - <tbody data-testname="el-tbody" data-expectedrole="rowgroup" class="ex"> + <tbody> <tr data-testname="el-tr-tbody" data-expectedrole="row" class="ex"> <th data-testname="el-th-in-row" data-expectedrole="rowheader" class="ex">1</th> <td data-testname="el-td" data-expectedrole="cell" class="ex">2</td> @@ -36,7 +36,7 @@ <td>6</td> </tr> </tbody> - <tfoot data-testname="el-tfoot" data-expectedrole="rowgroup" class="ex"> + <tfoot> <tr> <th>x</th> <th>y</th> diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js new file mode 100644 index 00000000000..c389410d5d3 --- /dev/null +++ b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js @@ -0,0 +1,40 @@ +// META: title=RemoteContextWrapper addEmbed +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/test-helper.js + +'use strict'; + +// This tests that arguments passed to the constructor are respected. +promise_test(async t => { + // Precondition: Test was loaded from the HTTP_ORIGIN. + assert_equals( + location.origin, get_host_info()['HTTP_ORIGIN'], + 'test window was loaded on HTTP_ORIGIN'); + + const rcHelper = new RemoteContextHelper(); + + const main = await rcHelper.addWindow(); + + const headerName = 'x-wpt-test-header'; + const headerValue = 'test-escaping()'; + const iframe = await main.addEmbed( + /*extraConfig=*/ { + origin: 'HTTP_REMOTE_ORIGIN', + scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'], + headers: [[headerName, headerValue]], + }, + /*attributes=*/ {id: 'test-id'}, + ); + + await assertSimplestScriptRuns(iframe); + await assertFunctionRuns(iframe, () => testFunction(), 'testFunction exists'); + await assertOriginIsAsExpected(iframe, get_host_info()['HTTP_REMOTE_ORIGIN']); + await assertHeaderIsAsExpected(iframe, headerName, headerValue); + + assert_equals( + await main.executeScript(() => document.getElementById('test-id').id), + 'test-id', 'verify id'); +}); diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js new file mode 100644 index 00000000000..1d83d9a463d --- /dev/null +++ b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js @@ -0,0 +1,40 @@ +// META: title=RemoteContextWrapper addObject +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/test-helper.js + +'use strict'; + +// This tests that arguments passed to the constructor are respected. +promise_test(async t => { + // Precondition: Test was loaded from the HTTP_ORIGIN. + assert_equals( + location.origin, get_host_info()['HTTP_ORIGIN'], + 'test window was loaded on HTTP_ORIGIN'); + + const rcHelper = new RemoteContextHelper(); + + const main = await rcHelper.addWindow(); + + const headerName = 'x-wpt-test-header'; + const headerValue = 'test-escaping()'; + const iframe = await main.addObject( + /*extraConfig=*/ { + origin: 'HTTP_REMOTE_ORIGIN', + scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'], + headers: [[headerName, headerValue]], + }, + /*attributes=*/ {id: 'test-id'}, + ); + + await assertSimplestScriptRuns(iframe); + await assertFunctionRuns(iframe, () => testFunction(), 'testFunction exists'); + await assertOriginIsAsExpected(iframe, get_host_info()['HTTP_REMOTE_ORIGIN']); + await assertHeaderIsAsExpected(iframe, headerName, headerValue); + + assert_equals( + await main.executeScript(() => document.getElementById('test-id').id), + 'test-id', 'verify id'); +}); diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js index a7202656c86..fc04f950d28 100644 --- a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +++ b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js @@ -271,7 +271,7 @@ */ function addHeaders(url, headers) { function escape(s) { - return s.replace('(', '\\(').replace(')', '\\)'); + return s.replace('(', '\\(').replace(')', '\\)').replace(',', '\\,'); } const formattedHeaders = headers.map((header) => { return `header(${escape(header[0])}, ${escape(header[1])})`; @@ -288,15 +288,22 @@ function elementExecutorCreator( remoteContextWrapper, elementName, attributes) { return url => { - return remoteContextWrapper.executeScript((url, elementName, attributes) => { - const el = document.createElement(elementName); - for (const attribute in attributes) { - el.setAttribute(attribute, attributes[attribute]); - } - el.src = url; - const parent = elementName == "frame" ? findOrCreateFrameset() : document.body; - parent.appendChild(el); - }, [url, elementName, attributes]); + return remoteContextWrapper.executeScript( + (url, elementName, attributes) => { + const el = document.createElement(elementName); + for (const attribute in attributes) { + el.setAttribute(attribute, attributes[attribute]); + } + if (elementName == 'object') { + el.data = url; + } else { + el.src = url; + } + const parent = + elementName == 'frame' ? findOrCreateFrameset() : document.body; + parent.appendChild(el); + }, + [url, elementName, attributes]); }; } @@ -406,7 +413,7 @@ * `frameset` element. * @param {RemoteContextConfig} [extraConfig] * @param {[string, string][]} [attributes] A list of pairs of strings - * of attribute name and value these will be set on the iframe element + * of attribute name and value these will be set on the frame element * when added to the document. * @returns {Promise<RemoteContextWrapper>} The remote context. */ @@ -416,6 +423,37 @@ extraConfig, }); } + + /** + * Adds an `embed` with `src` attribute to the current document. + * @param {RemoteContextConfig} [extraConfig] + * @param {[string, string][]} [attributes] A list of pairs of strings + * of attribute name and value these will be set on the embed element + * when added to the document. + * @returns {Promise<RemoteContextWrapper>} The remote context. + */ + addEmbed(extraConfig, attributes = {}) { + return this.helper.createContext({ + executorCreator: elementExecutorCreator(this, 'embed', attributes), + extraConfig, + }); + } + + /** + * Adds an `object` with `data` attribute to the current document. + * @param {RemoteContextConfig} [extraConfig] + * @param {[string, string][]} [attributes] A list of pairs of strings + * of attribute name and value these will be set on the object element + * when added to the document. + * @returns {Promise<RemoteContextWrapper>} The remote context. + */ + addObject(extraConfig, attributes = {}) { + return this.helper.createContext({ + executorCreator: elementExecutorCreator(this, 'object', attributes), + extraConfig, + }); + } + /** * Adds an iframe with `srcdoc` attribute to the current document * @param {RemoteContextConfig} [extraConfig] diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html b/tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html new file mode 100644 index 00000000000..3e46c28104c --- /dev/null +++ b/tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=1252507"> +<link rel=help href="https://html.spec.whatwg.org/multipage/browsing-the-web.html#target-element"> +<link rel=help href="https://github.com/whatwg/html/issues/10029"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id=target>target</div> + +<script> +test(() => { + const target = document.getElementById('target'); + window.location.href = '#target'; + assert_equals(document.querySelector(':target'), target, + ':target should match before reinsertion.'); + + target.remove(); + document.body.appendChild(target); + assert_equals(document.querySelector(':target'), target, + ':target should match after reinsertion.'); +}, ':target should match the target element even after it is removed and reinserted.'); +</script> diff --git a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html index f4db40815dc..236f17e6d57 100644 --- a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html +++ b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html @@ -19,9 +19,9 @@ var t = async_test("The 2D context doesn't throw with extra getContext arguments (cached)"); _addTest(function(canvas, ctx) { - _assertDifferent(canvas.getContext('2d', false, {}, [], 1, "2"), null, "canvas.getContext('2d', false, {}, [], 1, \"2\")", "null"); + _assertDifferent(canvas.getContext('2d', false, {}, [], 1, '2'), null, "canvas.getContext('2d', false, {}, [], 1, '2')", "null"); _assertDifferent(canvas.getContext('2d', 123), null, "canvas.getContext('2d', 123)", "null"); - _assertDifferent(canvas.getContext('2d', "test"), null, "canvas.getContext('2d', \"test\")", "null"); + _assertDifferent(canvas.getContext('2d', 'test'), null, "canvas.getContext('2d', 'test')", "null"); _assertDifferent(canvas.getContext('2d', undefined), null, "canvas.getContext('2d', undefined)", "null"); _assertDifferent(canvas.getContext('2d', null), null, "canvas.getContext('2d', null)", "null"); _assertDifferent(canvas.getContext('2d', Symbol.hasInstance), null, "canvas.getContext('2d', Symbol.hasInstance)", "null"); diff --git a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html index 6ae7f787c6a..b0b00ddd78e 100644 --- a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html +++ b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html @@ -19,12 +19,12 @@ var t = async_test("The 2D context doesn't throw with extra getContext arguments (new context)"); _addTest(function(canvas, ctx) { - _assertDifferent(document.createElement("canvas").getContext('2d', false, {}, [], 1, "2"), null, "document.createElement(\"canvas\").getContext('2d', false, {}, [], 1, \"2\")", "null"); - _assertDifferent(document.createElement("canvas").getContext('2d', 123), null, "document.createElement(\"canvas\").getContext('2d', 123)", "null"); - _assertDifferent(document.createElement("canvas").getContext('2d', "test"), null, "document.createElement(\"canvas\").getContext('2d', \"test\")", "null"); - _assertDifferent(document.createElement("canvas").getContext('2d', undefined), null, "document.createElement(\"canvas\").getContext('2d', undefined)", "null"); - _assertDifferent(document.createElement("canvas").getContext('2d', null), null, "document.createElement(\"canvas\").getContext('2d', null)", "null"); - _assertDifferent(document.createElement("canvas").getContext('2d', Symbol.hasInstance), null, "document.createElement(\"canvas\").getContext('2d', Symbol.hasInstance)", "null"); + _assertDifferent(document.createElement('canvas').getContext('2d', false, {}, [], 1, "2"), null, "document.createElement('canvas').getContext('2d', false, {}, [], 1, \"2\")", "null"); + _assertDifferent(document.createElement('canvas').getContext('2d', 123), null, "document.createElement('canvas').getContext('2d', 123)", "null"); + _assertDifferent(document.createElement('canvas').getContext('2d', "test"), null, "document.createElement('canvas').getContext('2d', \"test\")", "null"); + _assertDifferent(document.createElement('canvas').getContext('2d', undefined), null, "document.createElement('canvas').getContext('2d', undefined)", "null"); + _assertDifferent(document.createElement('canvas').getContext('2d', null), null, "document.createElement('canvas').getContext('2d', null)", "null"); + _assertDifferent(document.createElement('canvas').getContext('2d', Symbol.hasInstance), null, "document.createElement('canvas').getContext('2d', Symbol.hasInstance)", "null"); }); </script> diff --git a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html index 5d5edc6864b..18a37a185dd 100644 --- a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html +++ b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html @@ -21,7 +21,6 @@ _addTest(function(canvas, ctx) { _assertSame(Object.getPrototypeOf(CanvasRenderingContext2D.prototype), Object.prototype, "Object.getPrototypeOf(CanvasRenderingContext2D.prototype)", "Object.prototype"); _assertSame(Object.getPrototypeOf(ctx), CanvasRenderingContext2D.prototype, "Object.getPrototypeOf(ctx)", "CanvasRenderingContext2D.prototype"); - t.done(); }); </script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.color.html index 166732a57b3..795804a4d21 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.color.html @@ -1,29 +1,26 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.colour</title> +<title>Canvas test: 2d.canvas.host.initial.color</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.colour</h1> +<h1>2d.canvas.host.initial.color</h1> <p class="desc">Initial state is transparent black</p> -<p class="notes">Output should be transparent black (not transparent anything-else), but manual -verification can only confirm that it's transparent - it's not possible to make -the actual blackness visible. <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="initial.colour.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Initial state is transparent black"); _addTest(function(canvas, ctx) { -_assertPixel(canvas, 20,20, 0,0,0,0); - + _assertPixel(canvas, 20,20, 0,0,0,0); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.clip.html index ebf52bfa764..86da296dc01 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.clip.html @@ -1,32 +1,32 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.clip</title> +<title>Canvas test: 2d.canvas.host.initial.reset.clip</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.clip</h1> +<h1>2d.canvas.host.initial.reset.clip</h1> <p class="desc">Resetting the canvas state resets the current clip region</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Resetting the canvas state resets the current clip region"); _addTest(function(canvas, ctx) { -canvas.width = 100; -ctx.rect(0, 0, 1, 1); -ctx.clip(); -canvas.width = 100; -ctx.fillStyle = '#0f0'; -ctx.fillRect(0, 0, 100, 50); -_assertPixel(canvas, 20,20, 0,255,0,255); - + canvas.width = 100; + ctx.rect(0, 0, 1, 1); + ctx.clip(); + canvas.width = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(canvas, 20,20, 0,255,0,255); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.different.html index d55dd250c09..b95527083b0 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.different.html @@ -1,30 +1,30 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.different</title> +<title>Canvas test: 2d.canvas.host.initial.reset.different</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.different</h1> +<h1>2d.canvas.host.initial.reset.different</h1> <p class="desc">Changing size resets canvas to transparent black</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="initial.reset.different.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Changing size resets canvas to transparent black"); _addTest(function(canvas, ctx) { -ctx.fillStyle = '#f00'; -ctx.fillRect(0, 0, 50, 50); -_assertPixel(canvas, 20,20, 255,0,0,255); -canvas.width = 50; -_assertPixel(canvas, 20,20, 0,0,0,0); - + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + _assertPixel(canvas, 20,20, 255,0,0,255); + canvas.width = 50; + _assertPixel(canvas, 20,20, 0,0,0,0); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.gradient.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.gradient.html index 31b56ec8e9b..de0f19c13c1 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.gradient.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.gradient.html @@ -1,35 +1,35 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.gradient</title> +<title>Canvas test: 2d.canvas.host.initial.reset.gradient</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.gradient</h1> +<h1>2d.canvas.host.initial.reset.gradient</h1> <p class="desc">Resetting the canvas state does not invalidate any existing gradients</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Resetting the canvas state does not invalidate any existing gradients"); _addTest(function(canvas, ctx) { -canvas.width = 50; -var g = ctx.createLinearGradient(0, 0, 100, 0); -g.addColorStop(0, '#0f0'); -g.addColorStop(1, '#0f0'); -canvas.width = 100; -ctx.fillStyle = '#f00'; -ctx.fillRect(0, 0, 100, 50); -ctx.fillStyle = g; -ctx.fillRect(0, 0, 100, 50); -_assertPixel(canvas, 50,25, 0,255,0,255); - + canvas.width = 50; + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#0f0'); + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(canvas, 50,25, 0,255,0,255); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html index 3525377d2db..6eda186dcbc 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html @@ -1,31 +1,31 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.path</title> +<title>Canvas test: 2d.canvas.host.initial.reset.path</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.path</h1> +<h1>2d.canvas.host.initial.reset.path</h1> <p class="desc">Resetting the canvas state resets the current path</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="initial.reset.path.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Resetting the canvas state resets the current path"); _addTest(function(canvas, ctx) { -canvas.width = 100; -ctx.rect(0, 0, 100, 50); -canvas.width = 100; -ctx.fillStyle = '#f00'; -ctx.fill(); -_assertPixel(canvas, 20,20, 0,0,0,0); - + canvas.width = 100; + ctx.rect(0, 0, 100, 50); + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fill(); + _assertPixel(canvas, 20,20, 0,0,0,0); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.pattern.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.pattern.html index 28f8306d96d..3cb45257a0f 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.pattern.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.pattern.html @@ -1,35 +1,35 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.pattern</title> +<title>Canvas test: 2d.canvas.host.initial.reset.pattern</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.pattern</h1> +<h1>2d.canvas.host.initial.reset.pattern</h1> <p class="desc">Resetting the canvas state does not invalidate any existing patterns</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Resetting the canvas state does not invalidate any existing patterns"); _addTest(function(canvas, ctx) { -canvas.width = 30; -ctx.fillStyle = '#0f0'; -ctx.fillRect(0, 0, 30, 50); -var p = ctx.createPattern(canvas, 'repeat-x'); -canvas.width = 100; -ctx.fillStyle = '#f00'; -ctx.fillRect(0, 0, 100, 50); -ctx.fillStyle = p; -ctx.fillRect(0, 0, 100, 50); -_assertPixel(canvas, 50,25, 0,255,0,255); - + canvas.width = 30; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 30, 50); + var p = ctx.createPattern(canvas, 'repeat-x'); + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = p; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(canvas, 50,25, 0,255,0,255); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.same.html index 1a0872ba2c0..6e2d912af58 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.same.html @@ -1,31 +1,31 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.same</title> +<title>Canvas test: 2d.canvas.host.initial.reset.same</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.same</h1> +<h1>2d.canvas.host.initial.reset.same</h1> <p class="desc">Setting size (not changing the value) resets canvas to transparent black</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="initial.reset.same.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Setting size (not changing the value) resets canvas to transparent black"); _addTest(function(canvas, ctx) { -canvas.width = 100; -ctx.fillStyle = '#f00'; -ctx.fillRect(0, 0, 50, 50); -_assertPixel(canvas, 20,20, 255,0,0,255); -canvas.width = 100; -_assertPixel(canvas, 20,20, 0,0,0,0); - + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + _assertPixel(canvas, 20,20, 255,0,0,255); + canvas.width = 100; + _assertPixel(canvas, 20,20, 0,0,0,0); }); </script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.transform.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.transform.html index 36284ba4984..d285785ed2f 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.transform.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.transform.html @@ -1,31 +1,31 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: initial.reset.transform</title> +<title>Canvas test: 2d.canvas.host.initial.reset.transform</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>initial.reset.transform</h1> +<h1>2d.canvas.host.initial.reset.transform</h1> <p class="desc">Resetting the canvas state resets the current transformation matrix</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Resetting the canvas state resets the current transformation matrix"); _addTest(function(canvas, ctx) { -canvas.width = 100; -ctx.scale(0.1, 0.1); -canvas.width = 100; -ctx.fillStyle = '#0f0'; -ctx.fillRect(0, 0, 100, 50); -_assertPixel(canvas, 20,20, 0,255,0,255); - + canvas.width = 100; + ctx.scale(0.1, 0.1); + canvas.width = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(canvas, 20,20, 0,255,0,255); }); </script> + diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html index cbbf32f2e2b..44d92293344 100644 --- a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html @@ -8,7 +8,7 @@ <body class="show_output"> <h1>2d.canvas.host.readonly</h1> -<p class="desc">CanvasRenderingContext2D.canvas is readonly</p> +<p class="desc">Canvas objects are readonly</p> <p class="output">Actual output:</p> @@ -16,13 +16,13 @@ <ul id="d"></ul> <script> -var t = async_test("CanvasRenderingContext2D.canvas is readonly"); +var t = async_test("Canvas objects are readonly"); _addTest(function(canvas, ctx) { - var c = document.createElement('canvas'); + var canvas2 = document.createElement('canvas'); var d = ctx.canvas; - _assertDifferent(c, d, "c", "d"); - ctx.canvas = c; + _assertDifferent(canvas2, d, "canvas2", "d"); + ctx.canvas = canvas2; _assertSame(ctx.canvas, d, "ctx.canvas", "d"); }); diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html index 6a4bdb65b08..f7166f99d6c 100644 --- a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html @@ -8,7 +8,7 @@ <body class="show_output"> <h1>2d.canvas.host.reference</h1> -<p class="desc">CanvasRenderingContext2D.canvas refers back to its canvas</p> +<p class="desc">canvas refers back to its canvas</p> <p class="output">Actual output:</p> @@ -16,7 +16,7 @@ <ul id="d"></ul> <script> -var t = async_test("CanvasRenderingContext2D.canvas refers back to its canvas"); +var t = async_test("canvas refers back to its canvas"); _addTest(function(canvas, ctx) { _assertSame(ctx.canvas, canvas, "ctx.canvas", "canvas"); diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html index acf3f9c7b34..930432a39fe 100644 --- a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html @@ -12,7 +12,7 @@ <p class="output">Actual output:</p> -<canvas id="c" class="output" width="50" height="25" style="width: 100px; height: 50px"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="50" height="25"style="width: 100px; height: 50px"><p class="fallback">FAIL (fallback content)</p></canvas> <p class="output expectedtext">Expected output:<p><img src="2d.canvas.host.scaled.png" class="output expected" id="expected" alt=""> <ul id="d"></ul> <script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.extend.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.default.html index e17209f455a..c34b085a9b9 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.extend.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.default.html @@ -1,27 +1,26 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: type.extend</title> +<title>Canvas test: 2d.canvas.host.size.attributes.default</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>type.extend</h1> -<p class="desc">HTMLCanvasElement methods can be added, and the new methods used by canvases</p> +<h1>2d.canvas.host.size.attributes.default</h1> +<p class="desc">Default width/height when attributes are missing</p> + -<p class="notes">Defined in "Web IDL" (draft) <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> <ul id="d"></ul> <script> -var t = async_test("HTMLCanvasElement methods can be added, and the new methods used by canvases"); +var t = async_test("Default width/height when attributes are missing"); _addTest(function(canvas, ctx) { -window.HTMLCanvasElement.prototype.getZero = function () { return 0; }; -_assertSame(canvas.getZero(), 0, "canvas.getZero()", "0"); - + _assertSame(canvas.width, 100, "canvas.width", "100"); + _assertSame(canvas.height, 50, "canvas.height", "50"); }); </script> diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.html new file mode 100644 index 00000000000..38332cc575c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.canvas.host.size.attributes.idl</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<body class="show_output"> + +<h1>2d.canvas.host.size.attributes.idl</h1> +<p class="desc">Getting/setting width/height IDL attributes</p> + + +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> + +<ul id="d"></ul> +<script> +var t = async_test("Getting/setting width/height IDL attributes"); +_addTest(function(canvas, ctx) { + + canvas.width = '100'; + canvas.height = '100'; + _assertSame(canvas.width, 100, "canvas.width", "100"); + _assertSame(canvas.height, 100, "canvas.height", "100"); + canvas.width = 301.999; + canvas.height = 301.001; + _assertSame(canvas.width, 301, "canvas.width", "301"); + _assertSame(canvas.height, 301, "canvas.height", "301"); + canvas.width = "+1.5e2"; + canvas.height = "0x96"; + _assertSame(canvas.width, 150, "canvas.width", "150"); + _assertSame(canvas.height, 150, "canvas.height", "150"); + +}); +</script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.set.zero.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.set.zero.html index c09d5cb278a..e142ec684a4 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.set.zero.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.set.zero.html @@ -1,13 +1,13 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.idl.set.zero</title> +<title>Canvas test: 2d.canvas.host.size.attributes.idl.set.zero</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>size.attributes.idl.set.zero</h1> +<h1>2d.canvas.host.size.attributes.idl.set.zero</h1> <p class="desc">Setting width/height IDL attributes to 0</p> @@ -19,11 +19,10 @@ var t = async_test("Setting width/height IDL attributes to 0"); _addTest(function(canvas, ctx) { -canvas.width = 0; -canvas.height = 0; -_assertSame(canvas.width, 0, "canvas.width", "0"); -_assertSame(canvas.height, 0, "canvas.height", "0"); - + canvas.width = 0; + canvas.height = 0; + _assertSame(canvas.width, 0, "canvas.width", "0"); + _assertSame(canvas.height, 0, "canvas.height", "0"); }); </script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setcontent.html index a25c4b784a2..2e2abaef2a7 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setcontent.html @@ -1,31 +1,30 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.reflect.setcontent</title> +<title>Canvas test: 2d.canvas.host.size.attributes.reflect.setcontent</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>size.attributes.reflect.setcontent</h1> +<h1>2d.canvas.host.size.attributes.reflect.setcontent</h1> <p class="desc">Setting content attributes updates IDL and content attributes</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="size.attributes.reflect.setcontent.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Setting content attributes updates IDL and content attributes"); _addTest(function(canvas, ctx) { -canvas.setAttribute('width', '120'); -canvas.setAttribute('height', '60'); -_assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'"); -_assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'"); -_assertSame(canvas.width, 120, "canvas.width", "120"); -_assertSame(canvas.height, 60, "canvas.height", "60"); - + canvas.setAttribute('width', '120'); + canvas.setAttribute('height', '60'); + _assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'"); + _assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'"); + _assertSame(canvas.width, 120, "canvas.width", "120"); + _assertSame(canvas.height, 60, "canvas.height", "60"); }); </script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidl.html index e228276da70..d017070a39e 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidl.html @@ -1,31 +1,30 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.reflect.setidl</title> +<title>Canvas test: 2d.canvas.host.size.attributes.reflect.setidl</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>size.attributes.reflect.setidl</h1> +<h1>2d.canvas.host.size.attributes.reflect.setidl</h1> <p class="desc">Setting IDL attributes updates IDL and content attributes</p> <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="size.attributes.reflect.setidl.png" class="output expected" id="expected" alt=""> + <ul id="d"></ul> <script> var t = async_test("Setting IDL attributes updates IDL and content attributes"); _addTest(function(canvas, ctx) { -canvas.width = 120; -canvas.height = 60; -_assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'"); -_assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'"); -_assertSame(canvas.width, 120, "canvas.width", "120"); -_assertSame(canvas.height, 60, "canvas.height", "60"); - + canvas.width = 120; + canvas.height = 60; + _assertSame(canvas.width, 120, "canvas.width", "120"); + _assertSame(canvas.height, 60, "canvas.height", "60"); + _assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'"); + _assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'"); }); </script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidlzero.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidlzero.html index 65df3f9f94e..d7747e1f188 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidlzero.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidlzero.html @@ -1,13 +1,13 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.reflect.setidlzero</title> +<title>Canvas test: 2d.canvas.host.size.attributes.reflect.setidlzero</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>size.attributes.reflect.setidlzero</h1> +<h1>2d.canvas.host.size.attributes.reflect.setidlzero</h1> <p class="desc">Setting IDL attributes to 0 updates IDL and content attributes</p> @@ -19,13 +19,12 @@ var t = async_test("Setting IDL attributes to 0 updates IDL and content attributes"); _addTest(function(canvas, ctx) { -canvas.width = 0; -canvas.height = 0; -_assertSame(canvas.getAttribute('width'), '0', "canvas.getAttribute('width')", "'0'"); -_assertSame(canvas.getAttribute('height'), '0', "canvas.getAttribute('height')", "'0'"); -_assertSame(canvas.width, 0, "canvas.width", "0"); -_assertSame(canvas.height, 0, "canvas.height", "0"); - + canvas.width = 0; + canvas.height = 0; + _assertSame(canvas.getAttribute('width'), '0', "canvas.getAttribute('width')", "'0'"); + _assertSame(canvas.getAttribute('height'), '0', "canvas.getAttribute('height')", "'0'"); + _assertSame(canvas.width, 0, "canvas.width", "0"); + _assertSame(canvas.height, 0, "canvas.height", "0"); }); </script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.removed.html index c96cba7b175..15cf17cbead 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.removed.html @@ -1,28 +1,27 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.removed</title> +<title>Canvas test: 2d.canvas.host.size.attributes.removed</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>size.attributes.removed</h1> +<h1>2d.canvas.host.size.attributes.removed</h1> <p class="desc">Removing content attributes reverts to default size</p> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="120" height="60"><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="size.attributes.removed.png" class="output expected" id="expected" alt=""> +<canvas id="c" class="output" width="120" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> + <ul id="d"></ul> <script> var t = async_test("Removing content attributes reverts to default size"); _addTest(function(canvas, ctx) { -_assertSame(canvas.width, 120, "canvas.width", "120"); -canvas.removeAttribute('width'); -_assertSame(canvas.width, 300, "canvas.width", "300"); - + _assertSame(canvas.width, 120, "canvas.width", "120"); + canvas.removeAttribute('width'); + _assertSame(canvas.width, 300, "canvas.width", "300"); }); </script> diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html new file mode 100644 index 00000000000..8711657f13c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.canvas.host.size.invalid.attributes.idl</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<body class="show_output"> + +<h1>2d.canvas.host.size.invalid.attributes.idl</h1> +<p class="desc">Getting/setting width/height IDL attributes</p> + + +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> + +<ul id="d"></ul> +<script> +var t = async_test("Getting/setting width/height IDL attributes"); +_addTest(function(canvas, ctx) { + + canvas.width = 200 - Math.pow(2, 32); + canvas.height = 200 - Math.pow(2, 32); + _assertSame(canvas.width, 200, "canvas.width", "200"); + _assertSame(canvas.height, 200, "canvas.height", "200"); + canvas.width = '400x'; + canvas.height = 'foo'; + _assertSame(canvas.width, 0, "canvas.width", "0"); + _assertSame(canvas.height, 0, "canvas.height", "0"); + +}); +</script> + diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html new file mode 100644 index 00000000000..039949cfd01 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.canvas.host.size.large</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<body class="show_output"> + +<h1>2d.canvas.host.size.large</h1> +<p class="desc"></p> + +<p class="notes">Not sure how reasonable this is, but the spec doesn't say there's an upper limit on the size. +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> + +<ul id="d"></ul> +<script> +var t = async_test(""); +_addTest(function(canvas, ctx) { + + var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long" + canvas.width = n; + canvas.height = n; + _assertSame(canvas.width, n, "canvas.width", "n"); + _assertSame(canvas.height, n, "canvas.height", "n"); + +}); +</script> + diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.delete.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.delete.html index 7fd54b30d53..90f5c4ce903 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.delete.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.delete.html @@ -1,16 +1,16 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: type.delete</title> +<title>Canvas test: 2d.canvas.host.type.delete</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>type.delete</h1> +<h1>2d.canvas.host.type.delete</h1> <p class="desc">window.HTMLCanvasElement interface object is [[Configurable]]</p> -<p class="notes">Defined in "Web IDL" (draft) + <p class="output">Actual output:</p> <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> @@ -19,9 +19,8 @@ var t = async_test("window.HTMLCanvasElement interface object is [[Configurable]]"); _addTest(function(canvas, ctx) { -_assertSame(delete window.HTMLCanvasElement, true, "delete window.HTMLCanvasElement", "true"); -_assertSame(window.HTMLCanvasElement, undefined, "window.HTMLCanvasElement", "undefined"); - + _assertSame(delete window.HTMLCanvasElement, true, "delete window.HTMLCanvasElement", "true"); + _assertSame(window.HTMLCanvasElement, undefined, "window.HTMLCanvasElement", "undefined"); }); </script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.name.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.name.html index fdf1d1d3988..c0f93876c32 100644 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.name.html +++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.name.html @@ -1,13 +1,13 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: type.name</title> +<title>Canvas test: 2d.canvas.host.type.name</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> <body class="show_output"> -<h1>type.name</h1> +<h1>2d.canvas.host.type.name</h1> <p class="desc">HTMLCanvasElement type and toString</p> @@ -19,8 +19,7 @@ var t = async_test("HTMLCanvasElement type and toString"); _addTest(function(canvas, ctx) { -_assertSame(Object.prototype.toString.call(canvas), '[object HTMLCanvasElement]', "Object.prototype.toString.call(canvas)", "'[object HTMLCanvasElement]'"); - + _assertSame(Object.prototype.toString.call(canvas), '[object HTMLCanvasElement]', "Object.prototype.toString.call(canvas)", "'[object HTMLCanvasElement]'"); }); </script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html index 41b5cfee311..21f35515a53 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html @@ -20,8 +20,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - _assertDifferent(offscreenCanvas2.getContext('2d'), null, "offscreenCanvas2.getContext('2d')", "null"); + _assertDifferent(canvas.getContext('2d'), null, "canvas.getContext('2d')", "null"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js index 77a43530a04..f56aff7e129 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js @@ -16,8 +16,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - _assertDifferent(offscreenCanvas2.getContext('2d'), null, "offscreenCanvas2.getContext('2d')", "null"); + _assertDifferent(canvas.getContext('2d'), null, "canvas.getContext('2d')", "null"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html index 2bcf34490ea..42f29e4fe90 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html @@ -20,9 +20,9 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - _assertDifferent(canvas.getContext('2d', false, {}, [], 1, "2"), null, "canvas.getContext('2d', false, {}, [], 1, \"2\")", "null"); + _assertDifferent(canvas.getContext('2d', false, {}, [], 1, '2'), null, "canvas.getContext('2d', false, {}, [], 1, '2')", "null"); _assertDifferent(canvas.getContext('2d', 123), null, "canvas.getContext('2d', 123)", "null"); - _assertDifferent(canvas.getContext('2d', "test"), null, "canvas.getContext('2d', \"test\")", "null"); + _assertDifferent(canvas.getContext('2d', 'test'), null, "canvas.getContext('2d', 'test')", "null"); _assertDifferent(canvas.getContext('2d', undefined), null, "canvas.getContext('2d', undefined)", "null"); _assertDifferent(canvas.getContext('2d', null), null, "canvas.getContext('2d', null)", "null"); _assertDifferent(canvas.getContext('2d', Symbol.hasInstance), null, "canvas.getContext('2d', Symbol.hasInstance)", "null"); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js index 14284a0a7d7..f508d5262e0 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js @@ -16,9 +16,9 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - _assertDifferent(canvas.getContext('2d', false, {}, [], 1, "2"), null, "canvas.getContext('2d', false, {}, [], 1, \"2\")", "null"); + _assertDifferent(canvas.getContext('2d', false, {}, [], 1, '2'), null, "canvas.getContext('2d', false, {}, [], 1, '2')", "null"); _assertDifferent(canvas.getContext('2d', 123), null, "canvas.getContext('2d', 123)", "null"); - _assertDifferent(canvas.getContext('2d', "test"), null, "canvas.getContext('2d', \"test\")", "null"); + _assertDifferent(canvas.getContext('2d', 'test'), null, "canvas.getContext('2d', 'test')", "null"); _assertDifferent(canvas.getContext('2d', undefined), null, "canvas.getContext('2d', undefined)", "null"); _assertDifferent(canvas.getContext('2d', null), null, "canvas.getContext('2d', null)", "null"); _assertDifferent(canvas.getContext('2d', Symbol.hasInstance), null, "canvas.getContext('2d', Symbol.hasInstance)", "null"); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html index 029122355c9..199f5b82edf 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html @@ -20,12 +20,12 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, \"2\")", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', 123), null, "(new OffscreenCanvas(100, 50)).getContext('2d', 123)", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', "test"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', \"test\")", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', undefined), null, "(new OffscreenCanvas(100, 50)).getContext('2d', undefined)", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', null), null, "(new OffscreenCanvas(100, 50)).getContext('2d', null)", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance), null, "(new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, "2"), null, "new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, \"2\")", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', 123), null, "new OffscreenCanvas(100, 50).getContext('2d', 123)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', "test"), null, "new OffscreenCanvas(100, 50).getContext('2d', \"test\")", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', undefined), null, "new OffscreenCanvas(100, 50).getContext('2d', undefined)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', null), null, "new OffscreenCanvas(100, 50).getContext('2d', null)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance), null, "new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance)", "null"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js index b4208edba8c..d1bfbcc683c 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js @@ -16,12 +16,12 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, \"2\")", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', 123), null, "(new OffscreenCanvas(100, 50)).getContext('2d', 123)", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', "test"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', \"test\")", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', undefined), null, "(new OffscreenCanvas(100, 50)).getContext('2d', undefined)", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', null), null, "(new OffscreenCanvas(100, 50)).getContext('2d', null)", "null"); - _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance), null, "(new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, "2"), null, "new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, \"2\")", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', 123), null, "new OffscreenCanvas(100, 50).getContext('2d', 123)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', "test"), null, "new OffscreenCanvas(100, 50).getContext('2d', \"test\")", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', undefined), null, "new OffscreenCanvas(100, 50).getContext('2d', undefined)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', null), null, "new OffscreenCanvas(100, 50).getContext('2d', null)", "null"); + _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance), null, "new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance)", "null"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html new file mode 100644 index 00000000000..ce71d4cf30f --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.context.invalid.args</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.canvas.context.invalid.args</h1> +<p class="desc">Calling getContext with invalid arguments.</p> + + +<script> +var t = async_test("Calling getContext with invalid arguments."); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + assert_throws_js(TypeError, function() { canvas.getContext(''); }); + assert_throws_js(TypeError, function() { canvas.getContext('This is not an implemented context in any real browser'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2d#'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2d\0'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2\uFF44'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2D'); }); + assert_throws_js(TypeError, function() { canvas.getContext(); }); + assert_throws_js(TypeError, function() { canvas.getContext('null'); }); + assert_throws_js(TypeError, function() { canvas.getContext('undefined'); }); + t.done(); + +}); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js new file mode 100644 index 00000000000..faea21714d5 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.context.invalid.args +// Description:Calling getContext with invalid arguments. +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test("Calling getContext with invalid arguments."); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + assert_throws_js(TypeError, function() { canvas.getContext(''); }); + assert_throws_js(TypeError, function() { canvas.getContext('This is not an implemented context in any real browser'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2d#'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2d\0'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2\uFF44'); }); + assert_throws_js(TypeError, function() { canvas.getContext('2D'); }); + assert_throws_js(TypeError, function() { canvas.getContext(); }); + assert_throws_js(TypeError, function() { canvas.getContext('null'); }); + assert_throws_js(TypeError, function() { canvas.getContext('undefined'); }); + t.done(); +}); +done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html new file mode 100644 index 00000000000..17e5f089464 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.context.prototype</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.canvas.context.prototype</h1> +<p class="desc">checks OffscreenCanvasRenderingContext2D prototype</p> + + +<script> +var t = async_test("checks OffscreenCanvasRenderingContext2D prototype"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + _assertSame(Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype), Object.prototype, "Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype)", "Object.prototype"); + _assertSame(Object.getPrototypeOf(ctx), OffscreenCanvasRenderingContext2D.prototype, "Object.getPrototypeOf(ctx)", "OffscreenCanvasRenderingContext2D.prototype"); + t.done(); + +}); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js new file mode 100644 index 00000000000..dd41239d00c --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js @@ -0,0 +1,23 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.context.prototype +// Description:checks OffscreenCanvasRenderingContext2D prototype +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test("checks OffscreenCanvasRenderingContext2D prototype"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + _assertSame(Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype), Object.prototype, "Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype)", "Object.prototype"); + _assertSame(Object.getPrototypeOf(ctx), OffscreenCanvasRenderingContext2D.prototype, "Object.getPrototypeOf(ctx)", "OffscreenCanvasRenderingContext2D.prototype"); + t.done(); +}); +done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html index 0ce3d4195e0..96b35d86fa1 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html @@ -1,16 +1,16 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.nullsuffix</title> +<title>OffscreenCanvas test: 2d.canvas.context.type.exists</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> -<h1>2d.canvas.context.unrecognised.nullsuffix</h1> -<p class="desc">Context name "2d" plus a "\0" suffix is unrecognised</p> - +<h1>2d.canvas.context.type.exists</h1> +<p class="desc">The 2D context interface is a property of 'window'</p> +<p class="notes">Defined in "Web IDL" (draft) <script> -var t = async_test("Context name \"2d\" plus a \"\\0\" suffix is unrecognised"); +var t = async_test("The 2D context interface is a property of 'window'"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -20,8 +20,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d\0"); }); + _assert(window.OffscreenCanvasRenderingContext2D, "window.OffscreenCanvasRenderingContext2D"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js index 46e562dd486..239c3e902ea 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js @@ -1,12 +1,12 @@ // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -// OffscreenCanvas test in a worker:2d.canvas.context.unrecognised.unicode -// Description:Context name which kind of looks like "2d" is unrecognised -// Note: +// OffscreenCanvas test in a worker:2d.canvas.context.type.exists +// Description:The 2D context interface is a property of 'self' +// Note:<p class="notes">Defined in "Web IDL" (draft) importScripts("/resources/testharness.js"); importScripts("/html/canvas/resources/canvas-tests.js"); -var t = async_test("Context name which kind of looks like \"2d\" is unrecognised"); +var t = async_test("The 2D context interface is a property of 'self'"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -16,8 +16,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2\uFF44"); }); + _assert(self.OffscreenCanvasRenderingContext2D, "self.OffscreenCanvasRenderingContext2D"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html new file mode 100644 index 00000000000..a3f720c7462 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.context.type.extend</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.canvas.context.type.extend</h1> +<p class="desc">Interface methods can be added</p> + +<p class="notes">Defined in "Web IDL" (draft) +<script> +var t = async_test("Interface methods can be added"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + window.OffscreenCanvasRenderingContext2D.prototype.fillRectGreen = function (x, y, w, h) + { + this.fillStyle = '#0f0'; + this.fillRect(x, y, w, h); + }; + ctx.fillStyle = '#f00'; + ctx.fillRectGreen(0, 0, 100, 50); + _assertPixel(canvas, 50,25, 0,255,0,255); + t.done(); + +}); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js new file mode 100644 index 00000000000..9832c5ca77f --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js @@ -0,0 +1,29 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.context.type.extend +// Description:Interface methods can be added +// Note:<p class="notes">Defined in "Web IDL" (draft) + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test("Interface methods can be added"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + self.OffscreenCanvasRenderingContext2D.prototype.fillRectGreen = function (x, y, w, h) + { + this.fillStyle = '#0f0'; + this.fillRect(x, y, w, h); + }; + ctx.fillStyle = '#f00'; + ctx.fillRectGreen(0, 0, 100, 50); + _assertPixel(canvas, 50,25, 0,255,0,255); + t.done(); +}); +done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html new file mode 100644 index 00000000000..d08193c0def --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.context.type.prototype</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.canvas.context.type.prototype</h1> +<p class="desc">window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]].</p> + +<p class="notes">Defined in "Web IDL" (draft) +<script> +var t = async_test("window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]]."); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + _assert(window.OffscreenCanvasRenderingContext2D.prototype, "window.OffscreenCanvasRenderingContext2D.prototype"); + _assert(window.OffscreenCanvasRenderingContext2D.prototype.fill, "window.OffscreenCanvasRenderingContext2D.prototype.fill"); + window.OffscreenCanvasRenderingContext2D.prototype = null; + _assert(window.OffscreenCanvasRenderingContext2D.prototype, "window.OffscreenCanvasRenderingContext2D.prototype"); + delete window.OffscreenCanvasRenderingContext2D.prototype; + _assert(window.OffscreenCanvasRenderingContext2D.prototype, "window.OffscreenCanvasRenderingContext2D.prototype"); + window.OffscreenCanvasRenderingContext2D.prototype.fill = 1; + _assertSame(window.OffscreenCanvasRenderingContext2D.prototype.fill, 1, "window.OffscreenCanvasRenderingContext2D.prototype.fill", "1"); + delete window.OffscreenCanvasRenderingContext2D.prototype.fill; + _assertSame(window.OffscreenCanvasRenderingContext2D.prototype.fill, undefined, "window.OffscreenCanvasRenderingContext2D.prototype.fill", "undefined"); + t.done(); + +}); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js new file mode 100644 index 00000000000..459975d32d2 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js @@ -0,0 +1,31 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.context.type.prototype +// Description:window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]]. +// Note:<p class="notes">Defined in "Web IDL" (draft) + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test("window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]]."); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + _assert(self.OffscreenCanvasRenderingContext2D.prototype, "self.OffscreenCanvasRenderingContext2D.prototype"); + _assert(self.OffscreenCanvasRenderingContext2D.prototype.fill, "self.OffscreenCanvasRenderingContext2D.prototype.fill"); + self.OffscreenCanvasRenderingContext2D.prototype = null; + _assert(self.OffscreenCanvasRenderingContext2D.prototype, "self.OffscreenCanvasRenderingContext2D.prototype"); + delete self.OffscreenCanvasRenderingContext2D.prototype; + _assert(self.OffscreenCanvasRenderingContext2D.prototype, "self.OffscreenCanvasRenderingContext2D.prototype"); + self.OffscreenCanvasRenderingContext2D.prototype.fill = 1; + _assertSame(self.OffscreenCanvasRenderingContext2D.prototype.fill, 1, "self.OffscreenCanvasRenderingContext2D.prototype.fill", "1"); + delete self.OffscreenCanvasRenderingContext2D.prototype.fill; + _assertSame(self.OffscreenCanvasRenderingContext2D.prototype.fill, undefined, "self.OffscreenCanvasRenderingContext2D.prototype.fill", "undefined"); + t.done(); +}); +done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html new file mode 100644 index 00000000000..69b22412fa5 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.context.type.replace</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.canvas.context.type.replace</h1> +<p class="desc">Interface methods can be overridden</p> + +<p class="notes">Defined in "Web IDL" (draft) +<script> +var t = async_test("Interface methods can be overridden"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + var fillRect = window.OffscreenCanvasRenderingContext2D.prototype.fillRect; + window.OffscreenCanvasRenderingContext2D.prototype.fillRect = function (x, y, w, h) + { + this.fillStyle = '#0f0'; + fillRect.call(this, x, y, w, h); + }; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(canvas, 50,25, 0,255,0,255); + t.done(); + +}); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js new file mode 100644 index 00000000000..e6793d1bf56 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.context.type.replace +// Description:Interface methods can be overridden +// Note:<p class="notes">Defined in "Web IDL" (draft) + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test("Interface methods can be overridden"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + var fillRect = self.OffscreenCanvasRenderingContext2D.prototype.fillRect; + self.OffscreenCanvasRenderingContext2D.prototype.fillRect = function (x, y, w, h) + { + this.fillStyle = '#0f0'; + fillRect.call(this, x, y, w, h); + }; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + _assertPixel(canvas, 50,25, 0,255,0,255); + t.done(); +}); +done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html index 66e4a049baa..828817bfbf4 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html @@ -20,8 +20,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - _assertSame(offscreenCanvas2.getContext('2d'), offscreenCanvas2.getContext('2d'), "offscreenCanvas2.getContext('2d')", "offscreenCanvas2.getContext('2d')"); + _assertSame(canvas.getContext('2d'), canvas.getContext('2d'), "canvas.getContext('2d')", "canvas.getContext('2d')"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js index 275e45fde64..90687bfd07e 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js @@ -16,8 +16,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - _assertSame(offscreenCanvas2.getContext('2d'), offscreenCanvas2.getContext('2d'), "offscreenCanvas2.getContext('2d')", "offscreenCanvas2.getContext('2d')"); + _assertSame(canvas.getContext('2d'), canvas.getContext('2d'), "canvas.getContext('2d')", "canvas.getContext('2d')"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html deleted file mode 100644 index 4313f408437..00000000000 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.badname</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/html/canvas/resources/canvas-tests.js"></script> - -<h1>2d.canvas.context.unrecognised.badname</h1> -<p class="desc">getContext with unrecognised context name returns null</p> - - -<script> -var t = async_test("getContext with unrecognised context name returns null"); -var t_pass = t.done.bind(t); -var t_fail = t.step_func(function(reason) { - throw reason; -}); -t.step(function() { - - var canvas = new OffscreenCanvas(100, 50); - var ctx = canvas.getContext('2d'); - - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext('This is not an implemented context in any real browser'); }); - t.done(); - -}); -</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js deleted file mode 100644 index dd16f2fbe11..00000000000 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js +++ /dev/null @@ -1,23 +0,0 @@ -// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -// OffscreenCanvas test in a worker:2d.canvas.context.unrecognised.badname -// Description:getContext with unrecognised context name returns null -// Note: - -importScripts("/resources/testharness.js"); -importScripts("/html/canvas/resources/canvas-tests.js"); - -var t = async_test("getContext with unrecognised context name returns null"); -var t_pass = t.done.bind(t); -var t_fail = t.step_func(function(reason) { - throw reason; -}); -t.step(function() { - - var canvas = new OffscreenCanvas(100, 50); - var ctx = canvas.getContext('2d'); - - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext('This is not an implemented context in any real browser'); }); - t.done(); -}); -done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html index 0e7e10cd242..93262a6cc87 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html @@ -6,11 +6,11 @@ <script src="/html/canvas/resources/canvas-tests.js"></script> <h1>2d.canvas.host.readonly</h1> -<p class="desc">canvas is readonly</p> +<p class="desc">Canvas objects are readonly</p> <script> -var t = async_test("canvas is readonly"); +var t = async_test("Canvas objects are readonly"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -20,10 +20,10 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var canvas2 = new OffscreenCanvas(100, 50); var d = ctx.canvas; - _assertDifferent(offscreenCanvas2, d, "offscreenCanvas2", "d"); - ctx.canvas = offscreenCanvas2; + _assertDifferent(canvas2, d, "canvas2", "d"); + ctx.canvas = canvas2; _assertSame(ctx.canvas, d, "ctx.canvas", "d"); t.done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js index bbe50dcf61f..5baef1b3740 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js @@ -1,12 +1,12 @@ // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. // OffscreenCanvas test in a worker:2d.canvas.host.readonly -// Description:canvas is readonly +// Description:Canvas objects are readonly // Note: importScripts("/resources/testharness.js"); importScripts("/html/canvas/resources/canvas-tests.js"); -var t = async_test("canvas is readonly"); +var t = async_test("Canvas objects are readonly"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -16,10 +16,10 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); + var canvas2 = new OffscreenCanvas(100, 50); var d = ctx.canvas; - _assertDifferent(offscreenCanvas2, d, "offscreenCanvas2", "d"); - ctx.canvas = offscreenCanvas2; + _assertDifferent(canvas2, d, "canvas2", "d"); + ctx.canvas = canvas2; _assertSame(ctx.canvas, d, "ctx.canvas", "d"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html index 7030103524c..b8ce99afdfd 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html @@ -20,22 +20,18 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - canvas.width = "100"; - canvas.height = "100"; + canvas.width = '100'; + canvas.height = '100'; _assertSame(canvas.width, 100, "canvas.width", "100"); _assertSame(canvas.height, 100, "canvas.height", "100"); - canvas.width = "+1.5e2"; - canvas.height = "0x96"; - _assertSame(canvas.width, 150, "canvas.width", "150"); - _assertSame(canvas.height, 150, "canvas.height", "150"); canvas.width = 301.999; canvas.height = 301.001; _assertSame(canvas.width, 301, "canvas.width", "301"); _assertSame(canvas.height, 301, "canvas.height", "301"); - assert_throws_js(TypeError, function() { canvas.width = "400x"; }); - assert_throws_js(TypeError, function() { canvas.height = "foo"; }); - _assertSame(canvas.width, 301, "canvas.width", "301"); - _assertSame(canvas.height, 301, "canvas.height", "301"); + canvas.width = "+1.5e2"; + canvas.height = "0x96"; + _assertSame(canvas.width, 150, "canvas.width", "150"); + _assertSame(canvas.height, 150, "canvas.height", "150"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js index a00201f18cc..42002e8355f 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js @@ -16,22 +16,18 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - canvas.width = "100"; - canvas.height = "100"; + canvas.width = '100'; + canvas.height = '100'; _assertSame(canvas.width, 100, "canvas.width", "100"); _assertSame(canvas.height, 100, "canvas.height", "100"); - canvas.width = "+1.5e2"; - canvas.height = "0x96"; - _assertSame(canvas.width, 150, "canvas.width", "150"); - _assertSame(canvas.height, 150, "canvas.height", "150"); canvas.width = 301.999; canvas.height = 301.001; _assertSame(canvas.width, 301, "canvas.width", "301"); _assertSame(canvas.height, 301, "canvas.height", "301"); - assert_throws_js(TypeError, function() { canvas.width = "400x"; }); - assert_throws_js(TypeError, function() { canvas.height = "foo"; }); - _assertSame(canvas.width, 301, "canvas.width", "301"); - _assertSame(canvas.height, 301, "canvas.height", "301"); + canvas.width = "+1.5e2"; + canvas.height = "0x96"; + _assertSame(canvas.width, 150, "canvas.width", "150"); + _assertSame(canvas.height, 150, "canvas.height", "150"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html new file mode 100644 index 00000000000..2194de929c5 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.canvas.host.size.invalid.attributes.idl</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.canvas.host.size.invalid.attributes.idl</h1> +<p class="desc">Getting/setting width/height IDL attributes</p> + + +<script> +var t = async_test("Getting/setting width/height IDL attributes"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + assert_throws_js(TypeError, function() { canvas.width = 200 - Math.pow(2, 32); }); + assert_throws_js(TypeError, function() { canvas.height = 200 - Math.pow(2, 32); }); + assert_throws_js(TypeError, function() { canvas.width = '400x'; }); + assert_throws_js(TypeError, function() { canvas.height = 'foo'; }); + t.done(); + +}); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js new file mode 100644 index 00000000000..8adb7a514c5 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js @@ -0,0 +1,25 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.canvas.host.size.invalid.attributes.idl +// Description:Getting/setting width/height IDL attributes +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test("Getting/setting width/height IDL attributes"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + assert_throws_js(TypeError, function() { canvas.width = 200 - Math.pow(2, 32); }); + assert_throws_js(TypeError, function() { canvas.height = 200 - Math.pow(2, 32); }); + assert_throws_js(TypeError, function() { canvas.width = '400x'; }); + assert_throws_js(TypeError, function() { canvas.height = 'foo'; }); + t.done(); +}); +done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html index 316123675ad..1d2a733ada7 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html @@ -1,16 +1,16 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.unicode</title> +<title>OffscreenCanvas test: 2d.canvas.host.type.delete</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> -<h1>2d.canvas.context.unrecognised.unicode</h1> -<p class="desc">Context name which kind of looks like "2d" is unrecognised</p> +<h1>2d.canvas.host.type.delete</h1> +<p class="desc">OffscreenCanvas interface object is [[Configurable]]</p> <script> -var t = async_test("Context name which kind of looks like \"2d\" is unrecognised"); +var t = async_test("OffscreenCanvas interface object is [[Configurable]]"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -20,8 +20,8 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2\uFF44"); }); + _assertSame(delete window.OffscreenCanvas, true, "delete window.OffscreenCanvas", "true"); + _assertSame(window.OffscreenCanvas, undefined, "window.OffscreenCanvas", "undefined"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js index 2886010fb64..409e12cd0d0 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js @@ -1,12 +1,12 @@ // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -// OffscreenCanvas test in a worker:2d.canvas.context.unrecognised.nullsuffix -// Description:Context name "2d" plus a "\0" suffix is unrecognised +// OffscreenCanvas test in a worker:2d.canvas.host.type.delete +// Description:OffscreenCanvas interface object is [[Configurable]] // Note: importScripts("/resources/testharness.js"); importScripts("/html/canvas/resources/canvas-tests.js"); -var t = async_test("Context name \"2d\" plus a \"\\0\" suffix is unrecognised"); +var t = async_test("OffscreenCanvas interface object is [[Configurable]]"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -16,8 +16,8 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d\0"); }); + _assertSame(delete self.OffscreenCanvas, true, "delete self.OffscreenCanvas", "true"); + _assertSame(self.OffscreenCanvas, undefined, "self.OffscreenCanvas", "undefined"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html index c00afa686ed..5f48c09eaac 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html @@ -1,16 +1,16 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.badsuffix</title> +<title>OffscreenCanvas test: 2d.canvas.host.type.name</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> -<h1>2d.canvas.context.unrecognised.badsuffix</h1> -<p class="desc">Context name "2d" plus a suffix is unrecognised</p> +<h1>2d.canvas.host.type.name</h1> +<p class="desc">OffscreenCanvas type and toString</p> <script> -var t = async_test("Context name \"2d\" plus a suffix is unrecognised"); +var t = async_test("OffscreenCanvas type and toString"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -20,8 +20,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d#"); }); + _assertSame(Object.prototype.toString.call(canvas), '[object OffscreenCanvas]', "Object.prototype.toString.call(canvas)", "'[object OffscreenCanvas]'"); t.done(); }); diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js index 5e684c92c72..ea50e4f7f0c 100644 --- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js @@ -1,12 +1,12 @@ // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -// OffscreenCanvas test in a worker:2d.canvas.context.unrecognised.badsuffix -// Description:Context name "2d" plus a suffix is unrecognised +// OffscreenCanvas test in a worker:2d.canvas.host.type.name +// Description:OffscreenCanvas type and toString // Note: importScripts("/resources/testharness.js"); importScripts("/html/canvas/resources/canvas-tests.js"); -var t = async_test("Context name \"2d\" plus a suffix is unrecognised"); +var t = async_test("OffscreenCanvas type and toString"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; @@ -16,8 +16,7 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d#"); }); + _assertSame(Object.prototype.toString.call(canvas), '[object OffscreenCanvas]', "Object.prototype.toString.call(canvas)", "'[object OffscreenCanvas]'"); t.done(); }); done(); diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml new file mode 100644 index 00000000000..4153b8e2dfb --- /dev/null +++ b/tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml @@ -0,0 +1,416 @@ +- name: 2d.canvas.host.reference + desc: canvas refers back to its canvas + code: | + @assert ctx.canvas === canvas; + +- name: 2d.canvas.host.readonly + desc: Canvas objects are readonly + code: | + var canvas2 = {{ new_canvas }}; + var d = ctx.canvas; + @assert canvas2 !== d; + ctx.canvas = canvas2; + @assert ctx.canvas === d; + variants: &new-canvas-definition + - HtmlCanvas: + append_variants_to_name: false + canvas_types: ['HtmlCanvas'] + new_canvas: |- + document.createElement('canvas') + OffscreenCanvas: + append_variants_to_name: false + canvas_types: ['OffscreenCanvas', 'Worker'] + new_canvas: |- + new OffscreenCanvas(100, 50) + +- name: 2d.canvas.host.type.delete + canvas_types: ['HtmlCanvas'] + desc: window.HTMLCanvasElement interface object is [[Configurable]] + code: | + @assert delete window.HTMLCanvasElement === true; + @assert window.HTMLCanvasElement === undefined; + +- name: 2d.canvas.host.type.delete + canvas_types: ['OffscreenCanvas', 'Worker'] + desc: OffscreenCanvas interface object is [[Configurable]] + code: | + {% set root = 'self' if canvas_type == 'Worker' else 'window' %} + @assert delete {{ root }}.OffscreenCanvas === true; + @assert {{ root }}.OffscreenCanvas === undefined; + +- name: 2d.canvas.host.type.name + canvas_types: ['HtmlCanvas'] + desc: HTMLCanvasElement type and toString + code: | + @assert Object.prototype.toString.call(canvas) === '[object HTMLCanvasElement]'; + +- name: 2d.canvas.host.type.name + canvas_types: ['OffscreenCanvas', 'Worker'] + desc: OffscreenCanvas type and toString + code: | + @assert Object.prototype.toString.call(canvas) === '[object OffscreenCanvas]'; + +- name: 2d.canvas.context.exists + desc: The 2D context is implemented + code: | + @assert canvas.getContext('2d') !== null; + +- name: 2d.canvas.context.extraargs.create + desc: The 2D context doesn't throw with extra getContext arguments (new context) + code: | + @assert {{ new_canvas }}.getContext('2d', false, {}, [], 1, "2") !== null; + @assert {{ new_canvas }}.getContext('2d', 123) !== null; + @assert {{ new_canvas }}.getContext('2d', "test") !== null; + @assert {{ new_canvas }}.getContext('2d', undefined) !== null; + @assert {{ new_canvas }}.getContext('2d', null) !== null; + @assert {{ new_canvas }}.getContext('2d', Symbol.hasInstance) !== null; + variants: *new-canvas-definition + +- name: 2d.canvas.context.invalid.args + desc: Calling getContext with invalid arguments. + canvas_types: ['HtmlCanvas'] + code: | + @assert canvas.getContext('') === null; + @assert canvas.getContext('2d#') === null; + @assert canvas.getContext('This is clearly not a valid context name.') === null; + @assert canvas.getContext('2d\0') === null; + @assert canvas.getContext('2\uFF44') === null; + @assert canvas.getContext('2D') === null; + @assert throws TypeError canvas.getContext(); + @assert canvas.getContext('null') === null; + @assert canvas.getContext('undefined') === null; + +- name: 2d.canvas.context.invalid.args + desc: Calling getContext with invalid arguments. + canvas_types: ['OffscreenCanvas', 'Worker'] + code: | + @assert throws TypeError canvas.getContext(''); + @assert throws TypeError canvas.getContext('This is not an implemented context in any real browser'); + @assert throws TypeError canvas.getContext('2d#'); + @assert throws TypeError canvas.getContext('2d\0'); + @assert throws TypeError canvas.getContext('2\uFF44'); + @assert throws TypeError canvas.getContext('2D'); + @assert throws TypeError canvas.getContext(); + @assert throws TypeError canvas.getContext('null'); + @assert throws TypeError canvas.getContext('undefined'); + + +- name: 2d.canvas.context.extraargs.cache + desc: The 2D context doesn't throw with extra getContext arguments (cached) + code: | + @assert canvas.getContext('2d', false, {}, [], 1, '2') !== null; + @assert canvas.getContext('2d', 123) !== null; + @assert canvas.getContext('2d', 'test') !== null; + @assert canvas.getContext('2d', undefined) !== null; + @assert canvas.getContext('2d', null) !== null; + @assert canvas.getContext('2d', Symbol.hasInstance) !== null; + +- name: 2d.canvas.context.unique + desc: getContext('2d') returns the same object + code: | + @assert canvas.getContext('2d') === canvas.getContext('2d'); + +- name: 2d.canvas.context.shared + desc: getContext('2d') returns objects which share canvas state + code: | + var ctx2 = canvas.getContext('2d'); + ctx.fillStyle = '#f00'; + ctx2.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + expected: green + +- name: 2d.canvas.host.initial.color + desc: Initial state is transparent black + code: | + @assert pixel 20,20 == 0,0,0,0; + +- name: 2d.canvas.host.initial.reset.different + desc: Changing size resets canvas to transparent black + code: | + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 20,20 == 255,0,0,255; + canvas.width = 50; + @assert pixel 20,20 == 0,0,0,0; + +- name: 2d.canvas.host.initial.reset.same + desc: Setting size (not changing the value) resets canvas to transparent black + code: | + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 50, 50); + @assert pixel 20,20 == 255,0,0,255; + canvas.width = 100; + @assert pixel 20,20 == 0,0,0,0; + + +- name: 2d.canvas.host.initial.reset.path + desc: Resetting the canvas state resets the current path + code: | + canvas.width = 100; + ctx.rect(0, 0, 100, 50); + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fill(); + @assert pixel 20,20 == 0,0,0,0; + +- name: 2d.canvas.host.initial.reset.clip + desc: Resetting the canvas state resets the current clip region + code: | + canvas.width = 100; + ctx.rect(0, 0, 1, 1); + ctx.clip(); + canvas.width = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 20,20 == 0,255,0,255; + +- name: 2d.canvas.host.initial.reset.transform + desc: Resetting the canvas state resets the current transformation matrix + code: | + canvas.width = 100; + ctx.scale(0.1, 0.1); + canvas.width = 100; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 20,20 == 0,255,0,255; + +- name: 2d.canvas.host.initial.reset.gradient + desc: Resetting the canvas state does not invalidate any existing gradients + code: | + canvas.width = 50; + var g = ctx.createLinearGradient(0, 0, 100, 0); + g.addColorStop(0, '#0f0'); + g.addColorStop(1, '#0f0'); + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = g; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.canvas.host.initial.reset.pattern + desc: Resetting the canvas state does not invalidate any existing patterns + code: | + canvas.width = 30; + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 30, 50); + var p = ctx.createPattern(canvas, 'repeat-x'); + canvas.width = 100; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + ctx.fillStyle = p; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + +- name: 2d.canvas.host.size.attributes.idl.set.zero + desc: Setting width/height IDL attributes to 0 + code: | + canvas.width = 0; + canvas.height = 0; + @assert canvas.width === 0; + @assert canvas.height === 0; + +- name: 2d.canvas.host.size.attributes.idl + desc: Getting/setting width/height IDL attributes + code: | + canvas.width = '100'; + canvas.height = '100'; + @assert canvas.width === 100; + @assert canvas.height === 100; + canvas.width = 301.999; + canvas.height = 301.001; + @assert canvas.width === 301; + @assert canvas.height === 301; + canvas.width = "+1.5e2"; + canvas.height = "0x96"; + @assert canvas.width === 150; + @assert canvas.height === 150; + +- name: 2d.canvas.host.size.invalid.attributes.idl + canvas_types: ['OffscreenCanvas', 'Worker'] + desc: Getting/setting width/height IDL attributes + code: | + @assert throws TypeError canvas.width = 200 - Math.pow(2, 32); + @assert throws TypeError canvas.height = 200 - Math.pow(2, 32); + @assert throws TypeError canvas.width = '400x'; + @assert throws TypeError canvas.height = 'foo'; + +- name: 2d.canvas.host.size.invalid.attributes.idl + canvas_types: ['HtmlCanvas'] + desc: Getting/setting width/height IDL attributes + code: | + canvas.width = 200 - Math.pow(2, 32); + canvas.height = 200 - Math.pow(2, 32); + @assert canvas.width === 200; + @assert canvas.height === 200; + canvas.width = '400x'; + canvas.height = 'foo'; + @assert canvas.width === 0; + @assert canvas.height === 0; + +- name: 2d.canvas.host.size.attributes.default + desc: Default width/height when attributes are missing + code: | + @assert canvas.width === 100; + @assert canvas.height === 50; + +- name: 2d.canvas.host.size.attributes.removed + size: [120, 50] + canvas_types: ['HtmlCanvas'] + desc: Removing content attributes reverts to default size + code: | + @assert canvas.width === 120; + canvas.removeAttribute('width'); + @assert canvas.width === 300; + + +- name: 2d.canvas.host.size.attributes.reflect.setidl + desc: Setting IDL attributes updates IDL and content attributes + code: | + canvas.width = 120; + canvas.height = 60; + @assert canvas.width === 120; + @assert canvas.height === 60; + {% if canvas_type == 'HtmlCanvas' %} + @assert canvas.getAttribute('width') === '120'; + @assert canvas.getAttribute('height') === '60'; + {% endif %} + +- name: 2d.canvas.host.size.attributes.reflect.setidlzero + desc: Setting IDL attributes to 0 updates IDL and content attributes + code: | + canvas.width = 0; + canvas.height = 0; + {% if canvas_type == 'HtmlCanvas' %} + _assertSame(canvas.getAttribute('width'), '0', "canvas.getAttribute('width')", "'0'"); + _assertSame(canvas.getAttribute('height'), '0', "canvas.getAttribute('height')", "'0'"); + {% endif %} + @assert canvas.width === 0; + @assert canvas.height === 0; + +- name: 2d.canvas.host.size.attributes.reflect.setcontent + canvas_types: ['HtmlCanvas'] + desc: Setting content attributes updates IDL and content attributes + code: | + canvas.setAttribute('width', '120'); + canvas.setAttribute('height', '60'); + @assert canvas.getAttribute('width') === '120'; + @assert canvas.getAttribute('height') === '60'; + @assert canvas.width === 120; + @assert canvas.height === 60; + +- name: 2d.canvas.host.size.large + notes: Not sure how reasonable this is, but the spec doesn't say there's an upper + limit on the size. + code: | + var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long" + canvas.width = n; + canvas.height = n; + @assert canvas.width === n; + @assert canvas.height === n; + +- name: 2d.canvas.context.prototype + desc: checks CanvasRenderingContext2D prototype + canvas_types: ['HtmlCanvas'] + code: | + @assert Object.getPrototypeOf(CanvasRenderingContext2D.prototype) === Object.prototype; + @assert Object.getPrototypeOf(ctx) === CanvasRenderingContext2D.prototype; + +- name: 2d.canvas.context.prototype + desc: checks OffscreenCanvasRenderingContext2D prototype + canvas_types: ['OffscreenCanvas', 'Worker'] + code: | + @assert Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype) === Object.prototype; + @assert Object.getPrototypeOf(ctx) === OffscreenCanvasRenderingContext2D.prototype; + +- name: 2d.canvas.host.scaled + desc: CSS-scaled canvases get drawn correctly + canvas_types: ['HtmlCanvas'] + size: [50, 25] + canvas: 'style="width: 100px; height: 50px"' + manual: + code: | + ctx.fillStyle = '#00f'; + ctx.fillRect(0, 0, 50, 25); + ctx.fillStyle = '#0ff'; + ctx.fillRect(0, 0, 25, 10); + expected: | + size 100 50 + cr.set_source_rgb(0, 0, 1) + cr.rectangle(0, 0, 100, 50) + cr.fill() + cr.set_source_rgb(0, 1, 1) + cr.rectangle(0, 0, 50, 20) + cr.fill() + +- name: 2d.canvas.context.type.exists + desc: The 2D context interface is a property of '{{ root }}' + notes: &bindings Defined in "Web IDL" (draft) + code: | + @assert {{ root }}.{{ context_object }}; + variants: &get-context-definition + - HtmlCanvas: + append_variants_to_name: false + canvas_types: ['HtmlCanvas'] + root: window + context_object: CanvasRenderingContext2D + OffscreenCanvas: + append_variants_to_name: false + canvas_types: ['OffscreenCanvas'] + root: window + context_object: OffscreenCanvasRenderingContext2D + Worker: + append_variants_to_name: false + canvas_types: ['Worker'] + root: self + context_object: OffscreenCanvasRenderingContext2D + +- name: 2d.canvas.context.type.extend + desc: Interface methods can be added + notes: *bindings + code: | + {{ root }}.{{ context_object }}.prototype.fillRectGreen = function (x, y, w, h) + { + this.fillStyle = '#0f0'; + this.fillRect(x, y, w, h); + }; + ctx.fillStyle = '#f00'; + ctx.fillRectGreen(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + expected: green + variants: *get-context-definition + +- name: 2d.canvas.context.type.replace + desc: Interface methods can be overridden + notes: *bindings + code: | + var fillRect = {{ root }}.{{ context_object }}.prototype.fillRect; + {{ root }}.{{ context_object }}.prototype.fillRect = function (x, y, w, h) + { + this.fillStyle = '#0f0'; + fillRect.call(this, x, y, w, h); + }; + ctx.fillStyle = '#f00'; + ctx.fillRect(0, 0, 100, 50); + @assert pixel 50,25 == 0,255,0,255; + expected: green + variants: *get-context-definition + +- name: 2d.canvas.context.type.prototype + desc: window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], + and its methods are [[Configurable]]. + notes: *bindings + code: | + @assert {{ root }}.{{ context_object }}.prototype; + @assert {{ root }}.{{ context_object }}.prototype.fill; + {{ root }}.{{ context_object }}.prototype = null; + @assert {{ root }}.{{ context_object }}.prototype; + delete {{ root }}.{{ context_object }}.prototype; + @assert {{ root }}.{{ context_object }}.prototype; + {{ root }}.{{ context_object }}.prototype.fill = 1; + @assert {{ root }}.{{ context_object }}.prototype.fill === 1; + delete {{ root }}.{{ context_object }}.prototype.fill; + @assert {{ root }}.{{ context_object }}.prototype.fill === undefined; + variants: *get-context-definition diff --git a/tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml b/tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml deleted file mode 100644 index 1ecf8ccdbf1..00000000000 --- a/tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml +++ /dev/null @@ -1,143 +0,0 @@ -- name: 2d.canvas.context.exists - desc: The 2D context is implemented - code: | - @assert canvas.getContext('2d') !== null; - -- name: 2d.canvas.context.invalid.args - desc: Calling getContext with invalid arguments. - code: | - @assert canvas.getContext('') === null; - @assert canvas.getContext('2d#') === null; - @assert canvas.getContext('This is clearly not a valid context name.') === null; - @assert canvas.getContext('2d\0') === null; - @assert canvas.getContext('2\uFF44') === null; - @assert canvas.getContext('2D') === null; - @assert throws TypeError canvas.getContext(); - @assert canvas.getContext('null') === null; - @assert canvas.getContext('undefined') === null; - -- name: 2d.canvas.context.extraargs.create - desc: The 2D context doesn't throw with extra getContext arguments (new context) - code: | - @assert document.createElement("canvas").getContext('2d', false, {}, [], 1, "2") !== null; - @assert document.createElement("canvas").getContext('2d', 123) !== null; - @assert document.createElement("canvas").getContext('2d', "test") !== null; - @assert document.createElement("canvas").getContext('2d', undefined) !== null; - @assert document.createElement("canvas").getContext('2d', null) !== null; - @assert document.createElement("canvas").getContext('2d', Symbol.hasInstance) !== null; - -- name: 2d.canvas.context.extraargs.cache - desc: The 2D context doesn't throw with extra getContext arguments (cached) - code: | - @assert canvas.getContext('2d', false, {}, [], 1, "2") !== null; - @assert canvas.getContext('2d', 123) !== null; - @assert canvas.getContext('2d', "test") !== null; - @assert canvas.getContext('2d', undefined) !== null; - @assert canvas.getContext('2d', null) !== null; - @assert canvas.getContext('2d', Symbol.hasInstance) !== null; - -- name: 2d.canvas.context.type.exists - desc: The 2D context interface is a property of 'window' - notes: &bindings Defined in "Web IDL" (draft) - code: | - @assert window.CanvasRenderingContext2D; - -- name: 2d.canvas.context.type.prototype - desc: window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], - and its methods are [[Configurable]]. - notes: *bindings - code: | - @assert window.CanvasRenderingContext2D.prototype; - @assert window.CanvasRenderingContext2D.prototype.fill; - window.CanvasRenderingContext2D.prototype = null; - @assert window.CanvasRenderingContext2D.prototype; - delete window.CanvasRenderingContext2D.prototype; - @assert window.CanvasRenderingContext2D.prototype; - window.CanvasRenderingContext2D.prototype.fill = 1; - @assert window.CanvasRenderingContext2D.prototype.fill === 1; - delete window.CanvasRenderingContext2D.prototype.fill; - @assert window.CanvasRenderingContext2D.prototype.fill === undefined; - -- name: 2d.canvas.context.type.replace - desc: Interface methods can be overridden - notes: *bindings - code: | - var fillRect = window.CanvasRenderingContext2D.prototype.fillRect; - window.CanvasRenderingContext2D.prototype.fillRect = function (x, y, w, h) - { - this.fillStyle = '#0f0'; - fillRect.call(this, x, y, w, h); - }; - ctx.fillStyle = '#f00'; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 50,25 == 0,255,0,255; - expected: green - -- name: 2d.canvas.context.type.extend - desc: Interface methods can be added - notes: *bindings - code: | - window.CanvasRenderingContext2D.prototype.fillRectGreen = function (x, y, w, h) - { - this.fillStyle = '#0f0'; - this.fillRect(x, y, w, h); - }; - ctx.fillStyle = '#f00'; - ctx.fillRectGreen(0, 0, 100, 50); - @assert pixel 50,25 == 0,255,0,255; - expected: green - -- name: 2d.canvas.context.unique - desc: getContext('2d') returns the same object - code: | - @assert canvas.getContext('2d') === canvas.getContext('2d'); - -- name: 2d.canvas.context.shared - desc: getContext('2d') returns objects which share canvas state - code: | - var ctx2 = canvas.getContext('2d'); - ctx.fillStyle = '#f00'; - ctx2.fillStyle = '#0f0'; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 50,25 == 0,255,0,255; - expected: green - -- name: 2d.canvas.host.scaled - desc: CSS-scaled canvases get drawn correctly - size: 50, 25 - canvas: 'style="width: 100px; height: 50px"' - manual: - code: | - ctx.fillStyle = '#00f'; - ctx.fillRect(0, 0, 50, 25); - ctx.fillStyle = '#0ff'; - ctx.fillRect(0, 0, 25, 10); - expected: | - size 100 50 - cr.set_source_rgb(0, 0, 1) - cr.rectangle(0, 0, 100, 50) - cr.fill() - cr.set_source_rgb(0, 1, 1) - cr.rectangle(0, 0, 50, 20) - cr.fill() - -- name: 2d.canvas.host.reference - desc: CanvasRenderingContext2D.canvas refers back to its canvas - code: | - @assert ctx.canvas === canvas; - -- name: 2d.canvas.host.readonly - desc: CanvasRenderingContext2D.canvas is readonly - code: | - var c = document.createElement('canvas'); - var d = ctx.canvas; - @assert c !== d; - ctx.canvas = c; - @assert ctx.canvas === d; - -- name: 2d.canvas.context.prototype - desc: checks CanvasRenderingContext2D prototype - code: | - @assert Object.getPrototypeOf(CanvasRenderingContext2D.prototype) === Object.prototype; - @assert Object.getPrototypeOf(ctx) === CanvasRenderingContext2D.prototype; - t.done(); diff --git a/tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml b/tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml deleted file mode 100644 index ccabe094b8a..00000000000 --- a/tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml +++ /dev/null @@ -1,269 +0,0 @@ -- name: 2d.canvas.host.reference - desc: canvas refers back to its canvas - code: | - @assert ctx.canvas === canvas; - t.done(); - -- name: 2d.canvas.host.readonly - desc: canvas is readonly - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - var d = ctx.canvas; - @assert offscreenCanvas2 !== d; - ctx.canvas = offscreenCanvas2; - @assert ctx.canvas === d; - t.done(); - -- name: 2d.canvas.context.exists - desc: The 2D context is implemented - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert offscreenCanvas2.getContext('2d') !== null; - t.done(); - -- name: 2d.canvas.context.extraargs.create - desc: The 2D context doesn't throw with extra getContext arguments (new context) - code: | - @assert (new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2") !== null; - @assert (new OffscreenCanvas(100, 50)).getContext('2d', 123) !== null; - @assert (new OffscreenCanvas(100, 50)).getContext('2d', "test") !== null; - @assert (new OffscreenCanvas(100, 50)).getContext('2d', undefined) !== null; - @assert (new OffscreenCanvas(100, 50)).getContext('2d', null) !== null; - @assert (new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance) !== null; - t.done(); - -- name: 2d.canvas.context.extraargs.cache - desc: The 2D context doesn't throw with extra getContext arguments (cached) - code: | - @assert canvas.getContext('2d', false, {}, [], 1, "2") !== null; - @assert canvas.getContext('2d', 123) !== null; - @assert canvas.getContext('2d', "test") !== null; - @assert canvas.getContext('2d', undefined) !== null; - @assert canvas.getContext('2d', null) !== null; - @assert canvas.getContext('2d', Symbol.hasInstance) !== null; - t.done(); - -- name: 2d.canvas.context.unique - desc: getContext('2d') returns the same object - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert offscreenCanvas2.getContext('2d') === offscreenCanvas2.getContext('2d'); - t.done(); - -- name: 2d.canvas.context.shared - desc: getContext('2d') returns objects which share canvas state - code: | - var ctx2 = canvas.getContext('2d'); - ctx.fillStyle = '#f00'; - ctx2.fillStyle = '#0f0'; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 50,25 == 0,255,0,255; - t.done(); - -- name: 2d.canvas.context.emptystring - desc: getContext with empty string returns null - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext(""); - t.done(); - -- name: 2d.canvas.context.unrecognised.badname - desc: getContext with unrecognised context name returns null - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext('This is not an implemented context in any real browser'); - t.done(); - -- name: 2d.canvas.context.unrecognised.badsuffix - desc: Context name "2d" plus a suffix is unrecognised - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext("2d#"); - t.done(); - -- name: 2d.canvas.context.unrecognised.nullsuffix - desc: Context name "2d" plus a "\0" suffix is unrecognised - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext("2d\0"); - t.done(); - -- name: 2d.canvas.context.unrecognised.unicode - desc: Context name which kind of looks like "2d" is unrecognised - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext("2\uFF44"); - t.done(); - -- name: 2d.canvas.context.casesensitive - desc: Context name "2D" is unrecognised; matching is case sensitive - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext('2D'); - t.done(); - -- name: 2d.canvas.context.arguments.missing - code: | - var offscreenCanvas2 = new OffscreenCanvas(100, 50); - @assert throws TypeError offscreenCanvas2.getContext(); @moz-todo - t.done(); - - -- name: 2d.canvas.host.initial.color - desc: Initial state is transparent black - code: | - @assert pixel 20,20 == 0,0,0,0; - t.done(); - -- name: 2d.canvas.host.initial.reset.different - desc: Changing size resets canvas to transparent black - code: | - ctx.fillStyle = '#f00'; - ctx.fillRect(0, 0, 50, 50); - @assert pixel 20,20 == 255,0,0,255; - canvas.width = 50; - @assert pixel 20,20 == 0,0,0,0; - t.done(); - -- name: 2d.canvas.host.initial.reset.same - desc: Setting size (not changing the value) resets canvas to transparent black - code: | - canvas.width = 100; - ctx.fillStyle = '#f00'; - ctx.fillRect(0, 0, 50, 50); - @assert pixel 20,20 == 255,0,0,255; - canvas.width = 100; - @assert pixel 20,20 == 0,0,0,0; - t.done(); - -- name: 2d.canvas.host.initial.reset.path - desc: Resetting the canvas state resets the current path - code: | - canvas.width = 100; - ctx.rect(0, 0, 100, 50); - canvas.width = 100; - ctx.fillStyle = '#f00'; - ctx.fill(); - @assert pixel 20,20 == 0,0,0,0; - t.done(); - -- name: 2d.canvas.host.initial.reset.clip - desc: Resetting the canvas state resets the current clip region - code: | - canvas.width = 100; - ctx.rect(0, 0, 1, 1); - ctx.clip(); - canvas.width = 100; - ctx.fillStyle = '#0f0'; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 20,20 == 0,255,0,255; - t.done(); - -- name: 2d.canvas.host.initial.reset.transform - desc: Resetting the canvas state resets the current transformation matrix - code: | - canvas.width = 100; - ctx.scale(0.1, 0.1); - canvas.width = 100; - ctx.fillStyle = '#0f0'; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 20,20 == 0,255,0,255; - t.done(); - -- name: 2d.canvas.host.initial.reset.gradient - desc: Resetting the canvas state does not invalidate any existing gradients - code: | - canvas.width = 50; - var g = ctx.createLinearGradient(0, 0, 100, 0); - g.addColorStop(0, '#0f0'); - g.addColorStop(1, '#0f0'); - canvas.width = 100; - ctx.fillStyle = '#f00'; - ctx.fillRect(0, 0, 100, 50); - ctx.fillStyle = g; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 50,25 == 0,255,0,255; - t.done(); - -- name: 2d.canvas.host.initial.reset.pattern - desc: Resetting the canvas state does not invalidate any existing patterns - code: | - canvas.width = 30; - ctx.fillStyle = '#0f0'; - ctx.fillRect(0, 0, 30, 50); - var p = ctx.createPattern(canvas, 'repeat-x'); - canvas.width = 100; - ctx.fillStyle = '#f00'; - ctx.fillRect(0, 0, 100, 50); - ctx.fillStyle = p; - ctx.fillRect(0, 0, 100, 50); - @assert pixel 50,25 == 0,255,0,255; - t.done(); - -- name: 2d.canvas.host.size.attributes.idl.set.zero - desc: Setting width/height IDL attributes to 0 - code: | - canvas.width = 0; - canvas.height = 0; - @assert canvas.width === 0; - @assert canvas.height === 0; - t.done(); - -- name: 2d.canvas.host.size.attributes.idl - desc: Getting/setting width/height IDL attributes - webidl: - - es-unsigned-long - code: | - canvas.width = "100"; - canvas.height = "100"; - @assert canvas.width === 100; - @assert canvas.height === 100; - canvas.width = "+1.5e2"; - canvas.height = "0x96"; - @assert canvas.width === 150; - @assert canvas.height === 150; - canvas.width = 301.999; - canvas.height = 301.001; - @assert canvas.width === 301; - @assert canvas.height === 301; - @assert throws TypeError canvas.width = "400x"; - @assert throws TypeError canvas.height = "foo"; - @assert canvas.width === 301; - @assert canvas.height === 301; - t.done(); - -- name: 2d.canvas.host.size.attributes.default - desc: Default width/height when attributes are missing - code: | - @assert canvas.width === 100; - @assert canvas.height === 50; - t.done(); - -- name: 2d.canvas.host.size.attributes.reflect.setidl - desc: Setting IDL attributes updates IDL and content attributes - code: | - canvas.width = 120; - canvas.height = 60; - @assert canvas.width === 120; - @assert canvas.height === 60; - t.done(); - -- name: 2d.canvas.host.size.attributes.reflect.setidlzero - desc: Setting IDL attributes to 0 updates IDL and content attributes - code: | - canvas.width = 0; - canvas.height = 0; - @assert canvas.width === 0; - @assert canvas.height === 0; - t.done(); - -- name: 2d.canvas.host.size.large - notes: Not sure how reasonable this is, but the spec doesn't say there's an upper - limit on the size. - code: | - var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long" - canvas.width = n; - canvas.height = n; - @assert canvas.width === n; - @assert canvas.height === n; - t.done(); diff --git a/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html new file mode 100644 index 00000000000..a00183738e3 --- /dev/null +++ b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html @@ -0,0 +1,12 @@ +<!doctype html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<div id=log></div> +<script> +promise_test(async t => { + const response = await fetch(get_host_info().HTTPS_REMOTE_ORIGIN+"/html/document-isolation-policy/resources/nothing-no-corp.js", {mode: "no-cors"}); + assert_equals(response.type, "opaque"); +}, "DIP requires a secure context"); +</script> diff --git a/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers new file mode 100644 index 00000000000..bcc6f0734d5 --- /dev/null +++ b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers @@ -0,0 +1 @@ +Document-Isolation-Policy: isolate-and-require-corp diff --git a/tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html b/tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html new file mode 100644 index 00000000000..27573bcdc69 --- /dev/null +++ b/tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<meta charset=UTF-8> +<title>CSS Test: default display of details and summary elements</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements"> +<link rel="help" href="https://github.com/whatwg/html/pull/10265"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> + +<details id="a"> + <summary id="b">This is the real summary.</summary> + + <p>This is the rest of the details.</p> + <summary id="c">This summary is not special.</summary> +</details> + +<summary id="d">This summary is not special.</summary> + +<script> + + test(() => { + assert_equals(getComputedStyle(document.getElementById("a")).display, "block"); + }, "default display of details element is block"); + test(() => { + assert_equals(getComputedStyle(document.getElementById("b")).display, "list-item"); + }, "default display of first summary child of details is list-item"); + test(() => { + assert_equals(getComputedStyle(document.getElementById("c")).display, "block"); + }, "default display of other summary element in details is block"); + test(() => { + assert_equals(getComputedStyle(document.getElementById("d")).display, "block"); + }, "default display of summary element outside details is block"); + + let new_styles = ` + details { display: grid } + summary { display: flex } + `; + let new_style_element = document.createElement("style"); + new_style_element.append(document.createTextNode(new_styles)); + document.head.append(new_style_element); + + test(() => { + assert_equals(getComputedStyle(document.getElementById("a")).display, "grid"); + }, "display of details element can be changed"); + test(() => { + assert_equals(getComputedStyle(document.getElementById("b")).display, "flex"); + }, "display of first summary child of details can be changed"); + test(() => { + assert_equals(getComputedStyle(document.getElementById("c")).display, "flex"); + }, "display of other summary element in details can be changed"); + test(() => { + assert_equals(getComputedStyle(document.getElementById("d")).display, "flex"); + }, "display of summary element outside details can be changed"); + + +</script> diff --git a/tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html b/tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html new file mode 100644 index 00000000000..406f7da9547 --- /dev/null +++ b/tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html @@ -0,0 +1,11 @@ +<!doctype html> +<meta charset="utf-8"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1903191"> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvare"> +<link rel="author" href="https://mozilla.org" title="Mozilla"> +<link rel="match" href="/css/reference/blank.html"> +<style> + input { width: 0; height: 0 } +</style> +<input type=checkbox> +<input type=radio> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.png Binary files differdeleted file mode 100644 index eeedd0ff058..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.png Binary files differdeleted file mode 100644 index d83fdd55b15..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.png Binary files differdeleted file mode 100644 index eeedd0ff058..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.png Binary files differdeleted file mode 100644 index eeedd0ff058..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html deleted file mode 100644 index ecf35285a1b..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html +++ /dev/null @@ -1,30 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.default</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/html/canvas/resources/canvas-tests.js"></script> -<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> -<body class="show_output"> - -<h1>size.attributes.default</h1> -<p class="desc">Default width/height when attributes are missing</p> - - -<p class="output">Actual output:</p> -<canvas id="c" class="output" ><p class="fallback">FAIL (fallback content)</p></canvas> -<p class="output expectedtext">Expected output:<p><img src="size.attributes.default.png" class="output expected" id="expected" alt=""> -<ul id="d"></ul> -<script> -var t = async_test("Default width/height when attributes are missing"); -_addTest(function(canvas, ctx) { - -_assertSame(canvas.width, 300, "canvas.width", "300"); -_assertSame(canvas.height, 150, "canvas.height", "150"); -_assert(!canvas.hasAttribute('width'), "!canvas.hasAttribute('width')"); -_assert(!canvas.hasAttribute('height'), "!canvas.hasAttribute('height')"); - - -}); -</script> - diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.png Binary files differdeleted file mode 100644 index a72d047556a..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.png Binary files differdeleted file mode 100644 index 47830c83ea9..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html deleted file mode 100644 index 1594a1c5e59..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html +++ /dev/null @@ -1,50 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: size.attributes.idl</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/html/canvas/resources/canvas-tests.js"></script> -<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> -<body class="show_output"> - -<h1>size.attributes.idl</h1> -<p class="desc">Getting/setting width/height IDL attributes</p> - - -<p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> - -<ul id="d"></ul> -<script> -var t = async_test("Getting/setting width/height IDL attributes"); -_addTest(function(canvas, ctx) { - -canvas.width = "100"; -canvas.height = "100"; -_assertSame(canvas.width, 100, "canvas.width", "100"); -_assertSame(canvas.height, 100, "canvas.height", "100"); - -canvas.width = "+1.5e2"; -canvas.height = "0x96"; -_assertSame(canvas.width, 150, "canvas.width", "150"); -_assertSame(canvas.height, 150, "canvas.height", "150"); - -canvas.width = 200 - Math.pow(2, 32); -canvas.height = 200 - Math.pow(2, 32); -_assertSame(canvas.width, 200, "canvas.width", "200"); -_assertSame(canvas.height, 200, "canvas.height", "200"); - -canvas.width = 301.999; -canvas.height = 301.001; -_assertSame(canvas.width, 301, "canvas.width", "301"); -_assertSame(canvas.height, 301, "canvas.height", "301"); - -canvas.width = "400x"; -canvas.height = "foo"; -_assertSame(canvas.width, 0, "canvas.width", "0"); -_assertSame(canvas.height, 0, "canvas.height", "0"); - - -}); -</script> - diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.png Binary files differdeleted file mode 100644 index 47830c83ea9..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.png Binary files differdeleted file mode 100644 index 47830c83ea9..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.png Binary files differdeleted file mode 100644 index 1ebf30d8aaa..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.png Binary files differdeleted file mode 100644 index 47830c83ea9..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.png +++ /dev/null diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html deleted file mode 100644 index f47f755388f..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html +++ /dev/null @@ -1,36 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: type.prototype</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/html/canvas/resources/canvas-tests.js"></script> -<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> -<body class="show_output"> - -<h1>type.prototype</h1> -<p class="desc">window.HTMLCanvasElement has prototype, which is { ReadOnly, DontDelete }. prototype has getContext, which is not</p> - -<p class="notes">Defined in "Web IDL" (draft) -<p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> - -<ul id="d"></ul> -<script> -var t = async_test("window.HTMLCanvasElement has prototype, which is { ReadOnly, DontDelete }. prototype has getContext, which is not"); -_addTest(function(canvas, ctx) { - -_assert(window.HTMLCanvasElement.prototype, "window.HTMLCanvasElement.prototype"); -_assert(window.HTMLCanvasElement.prototype.getContext, "window.HTMLCanvasElement.prototype.getContext"); -window.HTMLCanvasElement.prototype = null; -_assert(window.HTMLCanvasElement.prototype, "window.HTMLCanvasElement.prototype"); -delete window.HTMLCanvasElement.prototype; -_assert(window.HTMLCanvasElement.prototype, "window.HTMLCanvasElement.prototype"); -window.HTMLCanvasElement.prototype.getContext = 1; -_assertSame(window.HTMLCanvasElement.prototype.getContext, 1, "window.HTMLCanvasElement.prototype.getContext", "1"); -delete window.HTMLCanvasElement.prototype.getContext; -_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined"); - - -}); -</script> - diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html deleted file mode 100644 index e67fe7c4a26..00000000000 --- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: type.replace</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/html/canvas/resources/canvas-tests.js"></script> -<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> -<body class="show_output"> - -<h1>type.replace</h1> -<p class="desc">HTMLCanvasElement methods can be replaced, and the replacement methods used by canvases</p> - -<p class="notes">Defined in "Web IDL" (draft) -<p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> - -<ul id="d"></ul> -<script> -var t = async_test("HTMLCanvasElement methods can be replaced, and the replacement methods used by canvases"); -_addTest(function(canvas, ctx) { - -window.HTMLCanvasElement.prototype.getContext = function (name) { return 0; }; -_assertSame(canvas.getContext('2d'), 0, "canvas.getContext('2d')", "0"); - - -}); -</script> - diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html new file mode 100644 index 00000000000..09af8b3693f --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>History state change for iframe loading='lazy' before it is loaded: history.pushState</title> +<iframe data-src="about:blank#push" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +let pushStateSuccess = true; +try { + // Should have no effect on lazy-loading. + // Per https://html.spec.whatwg.org/C#can-have-its-url-rewritten + // only the fragment can be changed for about: URLs. + iframe.contentWindow.history.pushState(null, "", iframe.dataset.src); +} catch(ex) { + pushStateSuccess = false; +} +const locationAfterPushState = iframe.contentWindow.location.href; +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +assert_true(pushStateSuccess); +assert_equals(locationAfterPushState, new URL("about:blank#push", location.href).href); +iframeLoaded.then(() => { + // No timeout needed in this test because history.pushState() doesn't navigate. + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href); + done(); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html new file mode 100644 index 00000000000..ac9117a46ce --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>History state change for iframe loading='lazy' before it is loaded: history.replaceState</title> +<iframe data-src="about:blank#replace" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +let replaceStateSuccess = true; +try { + // Should have no effect on lazy-loading. + // Per https://html.spec.whatwg.org/C#can-have-its-url-rewritten + // only the fragment can be changed for about: URLs. + iframe.contentWindow.history.replaceState(null, "", iframe.dataset.src); +} catch(ex) { + replaceStateSuccess = false; +} +const locationAfterReplaceState = iframe.contentWindow.location.href; +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +assert_true(replaceStateSuccess); +assert_equals(locationAfterReplaceState, new URL("about:blank#replace", location.href).href); +iframeLoaded.then(() => { + // No timeout needed in this test because history.replaceState() doesn't navigate. + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href); + done(); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html new file mode 100644 index 00000000000..7f94d6021fa --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: form submit</title> +<iframe name="iframe" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<form action="support/blank.htm" target="iframe"></form> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +const form = document.querySelector('form'); +form.submit(); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + // The "?" in the URL is there because the default method is "GET" + // and the form data (empty here) is populated into the query. + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html new file mode 100644 index 00000000000..c81a01833a2 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: link click (fragment)</title> +<iframe name="iframe" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<a href="about:blank#fragment" target="iframe"></a> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +const a = document.querySelector('a'); +a.click(); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, "about:blank#fragment"); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html new file mode 100644 index 00000000000..d8d85b62a4b --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: link click</title> +<iframe name="iframe" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<a href="support/blank.htm?nav" target="iframe"></a> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +const a = document.querySelector('a'); +a.click(); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html new file mode 100644 index 00000000000..88ec129fbc0 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: location.assign</title> +<iframe data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +iframe.contentWindow.location.assign(iframe.dataset.src); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html new file mode 100644 index 00000000000..e2f0c6dceb9 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' and then setting src: location.replace</title> +<iframe data-src="support/blank.htm?nav" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +iframe.contentWindow.location.replace(iframe.dataset.src); +// Setting src invokes https://html.spec.whatwg.org/C#process-the-iframe-attributes +iframe.src = 'support/blank.htm?src'; +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html new file mode 100644 index 00000000000..9d3c4fbc132 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: location.replace</title> +<iframe data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +iframe.contentWindow.location.replace(iframe.dataset.src); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html new file mode 100644 index 00000000000..0cc7e110415 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: meta refresh</title> +<!-- This test is optional because the spec allows delaying or doing nothing for meta refresh. --> +<iframe src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +const meta = iframe.contentDocument.createElement('meta'); +meta.httpEquiv = 'Refresh'; +meta.content = '0; url=support/blank.htm?nav'; +iframe.contentDocument.head.append(meta); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html new file mode 100644 index 00000000000..1010c540b7f --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: navigation.navigate</title> +<iframe data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +iframe.contentWindow.navigation.navigate(iframe.dataset.src); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + assert_true("navigation" in window, "Navigation API is supported"); + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html new file mode 100644 index 00000000000..579c079ce70 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<title>Navigating iframe loading='lazy' before it is loaded: location.replace</title> +<iframe name="iframe" data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +window.open(iframe.dataset.src, 'iframe'); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html new file mode 100644 index 00000000000..a670de1f5c5 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>Reloading iframe loading='lazy' before it is loaded: location.reload</title> +<iframe src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +// Should have no effect on lazy-loading +iframe.contentWindow.location.reload(); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html new file mode 100644 index 00000000000..aefd6c472b5 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>Reloading iframe loading='lazy' before it is loaded: location.reload</title> +<iframe src="support/blank.htm?src" loading="lazy" hidden></iframe> +<script> +const iframe = document.querySelector('iframe'); +const iframeLoaded = new Promise(resolve => { + iframe.onload = resolve; +}); +// Should have no effect on lazy-loading +iframe.contentWindow.navigation.reload(); +iframe.hidden = false; +</script> +<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. --> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +setup({single_test: true}); +iframeLoaded.then(() => { + // Need a timeout to detect failure when there are two navigations. + step_timeout(() => { + assert_true("navigation" in window, "Navigation API is supported"); + assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href); + done(); + }, 1000); +}); +</script> diff --git a/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html b/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html index 0bec720485d..7fa97916743 100644 --- a/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html +++ b/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html @@ -24,7 +24,7 @@ async_test(t => { t.step_timeout(() => { assert_array_equals(onerrorCalls, ["frame1"]); t.done(); - }, 25); + }, 100); }); }); </script> diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js new file mode 100644 index 00000000000..5bd745db1de --- /dev/null +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js @@ -0,0 +1,25 @@ +// META: title='unload' Policy : allowed in frames when allowed in main frame. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/unload-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper({ + scripts: ['./resources/unload-helper.js'], + }); + // In the same browsing context group to ensure BFCache is not used. + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=self']]}, + ); + + const subframe = await main.addEmbed( + /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]}, + /*attributes=*/ {}); + await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: true}); + + await assertWindowRunsUnload(main, 'main', {shouldRunUnload: true}); +}); diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js new file mode 100644 index 00000000000..fe4f55dbc75 --- /dev/null +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js @@ -0,0 +1,25 @@ +// META: title='unload' Policy : allowed in frames when allowed in main frame. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/unload-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper({ + scripts: ['./resources/unload-helper.js'], + }); + // In the same browsing context group to ensure BFCache is not used. + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=self']]}, + ); + + const subframe = await main.addFrame( + /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]}, + /*attributes=*/ {}); + await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: true}); + + await assertWindowRunsUnload(main, 'main', {shouldRunUnload: true}); +}); diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js new file mode 100644 index 00000000000..376bb4cb1d0 --- /dev/null +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js @@ -0,0 +1,25 @@ +// META: title='unload' Policy : allowed in frames when allowed in main frame. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/unload-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper({ + scripts: ['./resources/unload-helper.js'], + }); + // In the same browsing context group to ensure BFCache is not used. + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=self']]}, + ); + + const subframe = await main.addObject( + /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]}, + /*attributes=*/ {}); + await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: true}); + + await assertWindowRunsUnload(main, 'main', {shouldRunUnload: true}); +}); diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js new file mode 100644 index 00000000000..cfdb29bc51a --- /dev/null +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js @@ -0,0 +1,25 @@ +// META: title='unload' Policy : disallowed in frames when disallowed in main frame. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/unload-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper({ + scripts: ['./resources/unload-helper.js'], + }); + // In the same browsing context group to ensure BFCache is not used. + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=()']]}, + ); + + const subframe = await main.addEmbed( + /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]}, + /*attributes=*/ {}); + await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false}); + + await assertWindowRunsUnload(main, 'main', {shouldRunUnload: false}); +}); diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js new file mode 100644 index 00000000000..e64c32a21a0 --- /dev/null +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js @@ -0,0 +1,25 @@ +// META: title='unload' Policy : disallowed in frames when disallowed in main frame. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/unload-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper({ + scripts: ['./resources/unload-helper.js'], + }); + // In the same browsing context group to ensure BFCache is not used. + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=()']]}, + ); + + const subframe = await main.addFrame( + /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]}, + /*attributes=*/ {}); + await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false}); + + await assertWindowRunsUnload(main, 'main', {shouldRunUnload: false}); +}); diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js new file mode 100644 index 00000000000..33c23239e6d --- /dev/null +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js @@ -0,0 +1,25 @@ +// META: title='unload' Policy : disallowed in frames when disallowed in main frame. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js +// META: script=./resources/unload-helper.js +// META: timeout=long + +'use strict'; + +promise_test(async t => { + const rcHelper = new RemoteContextHelper({ + scripts: ['./resources/unload-helper.js'], + }); + // In the same browsing context group to ensure BFCache is not used. + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=()']]}, + ); + + const subframe = await main.addObject( + /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]}, + /*attributes=*/ {}); + await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false}); + + await assertWindowRunsUnload(main, 'main', {shouldRunUnload: false}); +}); diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js index b2fb19ae129..4d8ddbcd16e 100644 --- a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js +++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js @@ -13,7 +13,9 @@ promise_test(async t => { const rcHelper = new RemoteContextHelper({scripts: ['./resources/unload-helper.js']}); // In the same browsing context group to ensure BFCache is not used. - const main = await rcHelper.addWindow(); + const main = await rcHelper.addWindow( + {headers: [['Permissions-Policy', 'unload=*']]}, + ); const subframe = await main.addIframe({headers: [['Permissions-Policy', 'unload=()']]}); await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false}); diff --git a/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html b/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html index 170c1ec2f1c..1d183afa614 100644 --- a/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html +++ b/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html @@ -142,10 +142,10 @@ "pointerover@child", "pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child", "pointerdown@child", "(child-removed)", - "pointerout@child", "pointerleave@child", - "pointerover@parent", "pointerup@parent", - "pointerdown@parent", "pointerup@parent", - "pointerout@parent", "pointerleave@parent" + "pointerover@parent", "pointerup@parent", "pointerup@host", + "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host", + "pointerout@parent", + "pointerleave@parent", "pointerleave@host" ] ); addPromiseTest( @@ -155,9 +155,10 @@ "pointerover@child", "pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child", "pointerdown@child", "(child-removed)", - "pointerleave@slot", "pointerover@parent", "pointerup@parent", - "pointerdown@parent", "pointerup@parent", - "pointerout@parent", "pointerleave@parent" + "pointerleave@slot", "pointerover@parent", "pointerup@parent", "pointerup@host", + "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host", + "pointerout@parent", + "pointerleave@parent", "pointerleave@host" ] ); addPromiseTest( @@ -167,9 +168,10 @@ "pointerover@child", "pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child", "pointerdown@child", "pointerup@child", "(child-removed)", - "pointerout@child", "pointerleave@child", - "pointerover@parent", "pointerdown@parent", "pointerup@parent", - "pointerout@parent", "pointerleave@parent" + "pointerover@parent", + "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host", + "pointerout@parent", + "pointerleave@parent", "pointerleave@host" ] ); addPromiseTest( @@ -179,8 +181,10 @@ "pointerover@child", "pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child", "pointerdown@child", "pointerup@child", "(child-removed)", - "pointerleave@slot", "pointerover@parent", "pointerdown@parent", "pointerup@parent", - "pointerout@parent", "pointerleave@parent" + "pointerleave@slot", "pointerover@parent", + "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host", + "pointerout@parent", + "pointerleave@parent", "pointerleave@host" ] ); </script> diff --git a/tests/wpt/tests/screen-capture/getdisplaymedia.https.html b/tests/wpt/tests/screen-capture/getdisplaymedia.https.html index 4558786faa1..4a7c6553351 100644 --- a/tests/wpt/tests/screen-capture/getdisplaymedia.https.html +++ b/tests/wpt/tests/screen-capture/getdisplaymedia.https.html @@ -59,7 +59,6 @@ promise_test(t => { {video: {height: {exact: 240}}}, {video: {frameRate: {min: 4}}}, {video: {frameRate: {exact: 4}}}, - {video: false, audio: true}, ].forEach(constraints => promise_test(async t => { await test_driver.bless('getDisplayMedia()'); const p = navigator.mediaDevices.getDisplayMedia(constraints); diff --git a/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html new file mode 100644 index 00000000000..b7d517a7f6b --- /dev/null +++ b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title> + Navigating to a text fragment which is only available after `DOMContentLoaded` +</title> +<script src="stash.js"></script> +<script> +function checkScroll() { + const results = {hasScrolled: window.scrollY != 0}; + let key = (new URL(document.location)).searchParams.get("key"); + stashResultsThenClose(key, results); +}; +window.onload = () => { + window.requestAnimationFrame(function() { + window.requestAnimationFrame(checkScroll); + }) +} +</script> +<body> +<script> +document.addEventListener("DOMContentLoaded", () => { + document.body.innerHTML = `<div style="margin-top: 200vh">After DOMContentLoaded</div>`; +}); + +</script> +</body> diff --git a/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html new file mode 100644 index 00000000000..a08d75588d0 --- /dev/null +++ b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html @@ -0,0 +1,25 @@ +<!doctype html> +<title>Navigating to a text fragment directive</title> +<meta charset=utf-8> +<link rel="help" href="https://wicg.github.io/ScrollToTextFragment/"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/common/utils.js"></script> +<script src="stash.js"></script> + +<script> + promise_test(t => new Promise((resolve, reject) => { + let key = token(); + test_driver.bless('Open a URL with a text fragment directive', () => { + window.open(`scroll-to-text-fragment-after-DOMContentLoaded-target.html?key=${key}#:~:text=DOMContentLoaded`, "_blank", "noopener"); + + fetchResults(key, resolve, reject); + }) + }).then(data => { + assert_true(data.hasScrolled, "Expected text directive to be scrolled to."); + }) + ); +</script> diff --git a/tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html b/tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html new file mode 100644 index 00000000000..f6a558d7582 --- /dev/null +++ b/tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html @@ -0,0 +1,35 @@ +<!doctype html> +<meta charset="utf-8"> +<link rel="author" title="Peng Zhou" href="mailto:zhoupeng.1996@bytedance.com"> +<link rel="help" href="https://github.com/w3c/selection-api/issues/173"> +<link rel="help" href="https://issues.chromium.org/issues/326554272"> +<title>Selection.modify(): move by paragraph cross editing boundary</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div contenteditable style="width: 140px; font-size: 14px;"> + <p>P1</p> + <p> + Line 1: Hello World + Line 2: <span contenteditable="false">Hello</span> <span id="end">World</span> + </p> +</div> +<script> +const selection = getSelection(); +const end = document.querySelector('#end'); +function runTest() { + selection.collapse(end.childNodes[0], 5); + selection.modify('move', 'backward', 'paragraph'); + assert_equals(selection.anchorNode.nodeValue, 'P1'); + assert_equals(selection.anchorOffset, 2); +} + +test(() => { + runTest(); +}, 'cross editing boundary'); + +test(() => { + const editable = document.querySelector('span[contenteditable=false]'); + editable.setAttribute('contenteditable', true); + runTest(); +}, 'not cross editing boundary'); +</script>
\ No newline at end of file diff --git a/tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html b/tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html new file mode 100644 index 00000000000..fd246c50924 --- /dev/null +++ b/tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Test selectionchange events fired on shadow dom</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="root"></div> + +<script> + let root = document.getElementById('root'); + let shadow = root.attachShadow({ mode: 'open' }); + let input = document.createElement('input'); + input.value = 'something to do 0'; + shadow.append(input); + + let events_on_document = []; + document.addEventListener("selectionchange", ev => { + events_on_document.push(ev); +}); + +promise_test(async () => { + input.focus(); + events_on_document.length = 0; + input.setSelectionRange(0, 1); + await new Promise(resolve => step_timeout(resolve, 0)); + assert_equals(events_on_document.length, 1); +}, "selectionchange event fired on a shadow dom bubble to the document"); +</script>
\ No newline at end of file diff --git a/tests/wpt/tests/shadow-dom/declarative/gethtml.html b/tests/wpt/tests/shadow-dom/declarative/gethtml.html index ff70653477f..0477cdaf820 100644 --- a/tests/wpt/tests/shadow-dom/declarative/gethtml.html +++ b/tests/wpt/tests/shadow-dom/declarative/gethtml.html @@ -12,7 +12,7 @@ <script> function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot, lightDOMContent, declarativeShadowDom, mode, delegatesFocus, - serializable, clonable) { + serializable, clonable, emptyShadowTree) { const t = test(t => { // Create and attach element let wrapper; @@ -63,15 +63,17 @@ function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot, if (allowsShadowDom) { const correctShadowHtml = `<template shadowrootmode="${mode}"` + - `${delegatesAttr}${serializableAttr}${clonableAttr}><slot></slot>` + - `</template>`; + `${delegatesAttr}${serializableAttr}${clonableAttr}>` + + (emptyShadowTree ? `` : `<slot></slot>`) + `</template>`; const correctHtml = `<${elementType}>${correctShadowHtml}` + `${lightDOMContent}</${elementType}>`; assert_equals(shadowRoot.mode,mode); assert_equals(shadowRoot.delegatesFocus,delegatesFocus); assert_equals(shadowRoot.serializable,expectedSerializable); assert_equals(shadowRoot.clonable,clonable); - shadowRoot.appendChild(document.createElement('slot')); + if (!emptyShadowTree) { + shadowRoot.appendChild(document.createElement('slot')); + } const emptyElement = `<${elementType}>${lightDOMContent}</${elementType}>`; if (expectedSerializable) { assert_equals(wrapper.getHTML({serializableShadowRoots: true}), @@ -104,7 +106,8 @@ function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot, `<${elementType}>${lightDOMContent}${allowsShadowDom ? `, with ${declarativeShadowDom ? 'declarative' : 'imperative'} shadow, ` + `mode=${mode}, delegatesFocus=${delegatesFocus}, ` + - `serializable=${serializable}, clonable=${clonable}.` : ''}`); + `serializable=${serializable}, clonable=${clonable},` : ''}` + + ` with${emptyShadowTree ? `out` : ``} shadow tree contents.`); } function runAllTests() { @@ -120,9 +123,12 @@ function runAllTests() { for (const clonable of [false, true]) { for (const mode of ['open', 'closed']) { for (const serializable of [undefined, 'false', 'true']) { - testElementType(true, elementName, runGetHTMLOnShadowRoot, - lightDOMContent, declarativeShadowDom, mode, - delegatesFocus, serializable, clonable); + for (const emptyShadowTree of [false, true]) { + testElementType(true, elementName, runGetHTMLOnShadowRoot, + lightDOMContent, declarativeShadowDom, mode, + delegatesFocus, serializable, clonable, + emptyShadowTree); + } } } } diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-flow.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-flow.html index d69f95e2afc..e6998105608 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-flow.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-flow.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value flex-flow</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value flex-flow</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -20,12 +20,12 @@ .wrapper { display: flex; flex-wrap: wrap; - reading-order-items: flex-flow; + reading-flow: flex-flow; } </style> <div class="test-case" data-expect="C1,A1,B1,D1,E1" - data-description="Flex items in flexbox should follow flex-flow reading order"> + data-description="Flex items in flexbox should follow flex-flow reading flow"> <div class="wrapper" style="width: 200px"> <button id="A1">Item A</button> <button id="B1">Item B</button> @@ -36,7 +36,7 @@ </div> <div class="test-case" data-expect="C2,A2,B2,D2,E2" - data-description="Flex items in rtl flexbox should follow flex-flow reading order"> + data-description="Flex items in rtl flexbox should follow flex-flow reading flow"> <div class="wrapper" style="width: 200px; direction: rtl"> <button id="A2">Item A</button> <button id="B2">Item B</button> @@ -47,7 +47,7 @@ </div> <div class="test-case" data-expect="C3,A3,B3,D3,E3" - data-description="Flex items in vertical-lr flexbox should follow flex-flow reading order"> + data-description="Flex items in vertical-lr flexbox should follow flex-flow reading flow"> <div class="wrapper" style="height: 200px; writing-mode: vertical-lr"> <button id="A3">Item A</button> <button id="B3">Item B</button> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-visual-order.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-visual-order.html index ce91f9b3c4c..d8515fd928c 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-visual-order.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-visual-order.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Display: reading-order-items with value flex-visual</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value flex-visual</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -14,12 +14,12 @@ <style> .wrapper { display: flex; - reading-order-items: flex-visual; + reading-flow: flex-visual; } </style> <div class="test-case" data-expect="A,B,C" - data-description="Flex items in flexbox should follow flex-visual reading order"> + data-description="Flex items in flexbox should follow flex-visual reading flow"> <div class="wrapper"> <button id="A">A</button> <button id="B">B</button> @@ -28,7 +28,7 @@ </div> <div class="test-case" data-expect="C1,B1,A1" - data-description="Flex items in row-reverse flexbox should follow flex-visual reading order"> + data-description="Flex items in row-reverse flexbox should follow flex-visual reading flow"> <div class="wrapper" style="flex-direction: row-reverse"> <button id="A1">A</button> <button id="B1">B</button> @@ -37,7 +37,7 @@ </div> <div class="test-case" data-expect="C2,B2,A2" - data-description="Flex items in row-reverse rtl flexbox should follow flex-visual reading order"> + data-description="Flex items in row-reverse rtl flexbox should follow flex-visual reading flow"> <div class="wrapper" style="flex-direction: row-reverse; direction: rtl"> <button id="A2">A</button> <button id="B2">B</button> @@ -46,7 +46,7 @@ </div> <div class="test-case" data-expect="C3,B3,A3" - data-description="Flex items in row-reverse and vertical-lr flexbox should follow flex-visual reading order"> + data-description="Flex items in row-reverse and vertical-lr flexbox should follow flex-visual reading flow"> <div class="wrapper" style="flex-direction: row-reverse; writing-mode: vertical-lr;"> <button id="A3">A</button> <button id="B3">B</button> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-columns.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-columns.html index f07dc63bc58..ad9bd81c7a7 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-columns.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-columns.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value grid-columns</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-columns</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -18,7 +18,7 @@ grid-template-columns: repeat(3, 150px); grid-template-areas: "d b b" "c c a"; - reading-order-items: grid-columns; + reading-flow: grid-columns; } .a { grid-area: a; } @@ -29,7 +29,7 @@ </style> <div class="test-case" data-expect="d1,c1,b1,a1" - data-description="Grid items in grid template columns should follow grid-columns reading order"> + data-description="Grid items in grid template columns should follow grid-columns reading flow"> <div class="wrapper"> <button class="a" id="a1">Item A</button> <button class="b" id="b1">Item B</button> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-across-scopes.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-across-scopes.html index 81d1b7de539..9f7772b9118 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-across-scopes.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-across-scopes.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Display: reading-order-items with value grid-order on shadow host</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order on shadow host</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -14,7 +14,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-on-shadow-host.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-on-shadow-host.html index a48eda1b57c..f5a8b3c313e 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-on-shadow-host.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-on-shadow-host.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Display: reading-order-items with value grid-order on shadow host</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order on shadow host</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -14,7 +14,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-iframe.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-iframe.html index 87b9e0a83df..fab6a7b8a68 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-iframe.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-iframe.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Display: reading-order-items with value grid-order on iframe</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order on iframe</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -14,7 +14,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-nested-grids.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-nested-grids.html index 15bdcf996fd..5daabefd7ff 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-nested-grids.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-nested-grids.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value grid-order in nested grids</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order in nested grids</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -15,7 +15,7 @@ <style> .box { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; border-radius: 5px; padding: 20px; border-style: dashed; diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-popover.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-popover.html index c96a0c4fcf7..822907378cb 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-popover.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-popover.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value grid-order</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -15,7 +15,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } .popover { inset:auto; @@ -48,7 +48,7 @@ promise_test(async () => { 'a', ]; await assert_focus_navigation_forward(elements); -}, `Popover in reading-order-items: grid-order container.`); +}, `Popover in reading-flow: grid-order container.`); promise_test(async () => { P.classList.add("wrapper"); @@ -61,5 +61,5 @@ promise_test(async () => { 'a', ]; await assert_focus_navigation_forward(elements); -}, `Popover in container and itself with reading-order-items: grid-order.`); +}, `Popover in container and itself with reading-flow: grid-order.`); </script>
\ No newline at end of file diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-slots.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-slots.html index ed658b3510a..4cfdc79fa40 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-slots.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-slots.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value grid-order in Shadow DOM</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order in Shadow DOM</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -15,17 +15,17 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <span id="root1" class="test-case" data-expect="b1,a1,c1" - data-description="Slot assigned element is a grid with reading-order-items."> + data-description="Slot assigned element is a grid with reading-flow."> <template shadowrootmode="open"> <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <slot></slot> @@ -39,12 +39,12 @@ <br> <span id="root2" class="test-case" data-expect="b2,a2,c2" - data-description="Slot is a grid with reading-order-items."> + data-description="Slot is a grid with reading-flow."> <template shadowrootmode="open"> <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <slot class="wrapper"></slot> @@ -56,12 +56,12 @@ <br> <span id="root3" class="test-case" data-expect="root3/o2,root3/o4,o1,o3,o5" - data-description="Slot is inside a grid container with reading-order-items."> + data-description="Slot is inside a grid container with reading-flow."> <template shadowrootmode="open"> <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <div class="wrapper"> @@ -78,12 +78,12 @@ <span id="root4" class="test-case" data-expect="root4/after,root4/before,b4,a4,d42,d41,d43,c4" - data-description="Slot is a grid with reading-order-items inside a grid container with reading-order-items."> + data-description="Slot is a grid with reading-flow inside a grid container with reading-flow."> <template shadowrootmode="open"> <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <div class="wrapper"> @@ -126,7 +126,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <div class="wrapper"> @@ -146,7 +146,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> <div class="wrapper"> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order.html index 3ee91358fd6..358f5c2988c 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value grid-order</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-order</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -15,7 +15,7 @@ <style> .wrapper { display: grid; - reading-order-items: grid-order; + reading-flow: grid-order; } </style> diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-rows.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-rows.html index f2442746843..41f986c1f4b 100644 --- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-rows.html +++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-rows.html @@ -1,8 +1,8 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>CSS Display: reading-order-items with value grid-rows</title> -<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items"> +<title>CSS Display: reading-flow with value grid-rows</title> +<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow"> <link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -18,7 +18,7 @@ grid-template-columns: repeat(3, 150px); grid-template-areas: "d b b" "c c a"; - reading-order-items: grid-rows; + reading-flow: grid-rows; writing-mode: vertical-lr; } @@ -30,7 +30,7 @@ </style> <div class="test-case" data-expect="d1,b1,c1,a1" - data-description="Grid items in grid template columns should follow grid-rows reading order"> + data-description="Grid items in grid template columns should follow grid-rows reading flow"> <div class="wrapper"> <button class="a" id="a1">Item A</button> <button class="b" id="b1">Item B</button> diff --git a/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html b/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html new file mode 100644 index 00000000000..8242f3d1083 --- /dev/null +++ b/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html @@ -0,0 +1,35 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/shared-storage/resources/util.js"></script> +<script src="/shared-storage/resources/util.sub.js"></script> +<script src="/fenced-frame/resources/utils.js"></script> + +<body> +<script> +'use strict'; + +async_test(t => { + testCreateWorkletWithDataOption( + t, "context-origin", "key0", "value0", /*is_same_origin_script=*/false, + /*expect_success=*/true); +}, 'For cross-origin createWorklet with dataOrigin option "context-origin", ' + + 'there is no error.'); + +async_test(t => { + testCreateWorkletWithDataOption( + t, "script-origin", "key0", "value0", /*is_same_origin_script=*/false, + /*expect_success=*/true); +}, 'For cross-origin createWorklet with dataOrigin option "script-origin", ' + + 'there is no error.'); + +async_test(t => { + testCreateWorkletWithDataOption( + t, "invalid", "key0", "value0", /*is_same_origin_script=*/false, + /*expect_success=*/false); +}, 'For cross-origin createWorklet with dataOrigin option "invalid", ' + + 'there is a TypeError thrown.'); + +</script> +</body> diff --git a/tests/wpt/tests/shared-storage/resources/util.sub.js b/tests/wpt/tests/shared-storage/resources/util.sub.js index 37b440da52a..dc1ec780a24 100644 --- a/tests/wpt/tests/shared-storage/resources/util.sub.js +++ b/tests/wpt/tests/shared-storage/resources/util.sub.js @@ -117,3 +117,45 @@ async function loadNestedSharedStorageFrameInNewFrame(data) { await windowPromise; return {frame: frame, nestedFrame: nestedFrame, nestedFrameUrl: nestedSrc}; } + +async function testCreateWorkletWithDataOption( + test, data_origin, key, value, is_same_origin_script, expect_success) { + const sameOrigin = location.origin; + const crossOrigin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + const sameOriginScriptUrl = `/shared-storage/resources/simple-module.js`; + const scriptOrigin = is_same_origin_script ? sameOrigin : crossOrigin; + const scriptUrl = is_same_origin_script ? sameOriginScriptUrl : + crossOrigin + sameOriginScriptUrl; + + try { + // Currently the `dataOrigin` option is not hooked up. + const worklet = await sharedStorage.createWorklet( + scriptUrl, {credentials: 'omit', dataOrigin: data_origin}); + + const ancestor_key = token(); + let url0 = + generateURL('/shared-storage/resources/frame0.html', [ancestor_key]); + + let select_url_result = + await worklet.selectURL('test-url-selection-operation', [{url: url0}], { + data: {'mockResult': 0, 'setKey': key, 'setValue': value}, + resolveToConfig: true, + keepAlive: true + }); + + assert_true(validateSelectURLResult(select_url_result, true)); + attachFencedFrame(select_url_result, 'opaque-ads'); + const result0 = await nextValueFromServer(ancestor_key); + assert_equals(result0, 'frame0_loaded'); + + await verifyKeyValueForOrigin(key, value, scriptOrigin); + await deleteKeyForOrigin(key, scriptOrigin); + assert_true(expect_success, 'no error caught even though one was expected'); + } catch (e) { + assert_false( + expect_success, 'expected success but error thrown: ' + e.toString()); + assert_equals(e.name, 'TypeError'); + } finally { + test.done(); + } +} diff --git a/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html b/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html new file mode 100644 index 00000000000..c84246f65b1 --- /dev/null +++ b/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html @@ -0,0 +1,35 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/shared-storage/resources/util.js"></script> +<script src="/shared-storage/resources/util.sub.js"></script> +<script src="/fenced-frame/resources/utils.js"></script> + +<body> +<script> +'use strict'; + +async_test(t => { + testCreateWorkletWithDataOption( + t, "context-origin", "key0", "value0", /*is_same_origin_script=*/true, + /*expect_success=*/true); +}, 'For same-origin createWorklet with dataOrigin option "context-origin", ' + + 'there is no error.'); + +async_test(t => { + testCreateWorkletWithDataOption( + t, "script-origin", "key0", "value0", /*is_same_origin_script=*/true, + /*expect_success=*/true); +}, 'For same-origin createWorklet with dataOrigin option "script-origin", ' + + 'there is no error.'); + +async_test(t => { + testCreateWorkletWithDataOption( + t, "invalid", "key0", "value0", /*is_same_origin_script=*/true, + /*expect_success=*/false); +}, 'For same-origin createWorklet with dataOrigin option "invalid", ' + + 'there is a TypeError thrown.'); + +</script> +</body> diff --git a/tests/wpt/tests/svg/animations/conditional-processing-01.html b/tests/wpt/tests/svg/animations/conditional-processing-01.html new file mode 100644 index 00000000000..fe3958f71f3 --- /dev/null +++ b/tests/wpt/tests/svg/animations/conditional-processing-01.html @@ -0,0 +1,18 @@ +<!doctype html> +<html class="reftest-wait"> +<title>Test animation as children of failed conditional processing test elements</title> +<link rel="match" href="../struct/reftests/reference/green-100x100.html"> +<script src="/common/reftest-wait.js"></script> +<script src="/common/rendering-utils.js"></script> +<script> +function test() { + document.getElementsByTagName('svg')[0].setCurrentTime(2); + waitForAtLeastOneFrame().then(takeScreenshot); +} +</script> +<svg onload="test()"> + <g systemLanguage="x-xl"> + <set xlink:href="#test" attributeName="width" begin="2s" to="0" /> + </g> + <rect id="test" width="100" height="100" fill="green"/> +</svg> diff --git a/tests/wpt/tests/svg/animations/switch-animation-01.html b/tests/wpt/tests/svg/animations/switch-animation-01.html new file mode 100644 index 00000000000..f33becbb655 --- /dev/null +++ b/tests/wpt/tests/svg/animations/switch-animation-01.html @@ -0,0 +1,19 @@ +<!doctype html> +<html class="reftest-wait"> +<title>Test animation as children of switch elements</title> +<link rel="match" href="../struct/reftests/reference/green-100x100.html"> +<script src="/common/reftest-wait.js"></script> +<script src="/common/rendering-utils.js"></script> +<script> +function test() { + document.getElementsByTagName('svg')[0].setCurrentTime(2); + waitForAtLeastOneFrame().then(takeScreenshot); +} +</script> +<svg onload="test()"> + <switch> + <set systemLanguage="x-xl" xlink:href="#test" attributeName="width" begin="2s" to="0" /> + <set xlink:href="#test" attributeName="height" begin="2s" to="100" /> + </switch> + <rect id="test" width="100" height="0" fill="green"/> +</svg> diff --git a/tests/wpt/tests/svg/animations/switch-animation-02.html b/tests/wpt/tests/svg/animations/switch-animation-02.html new file mode 100644 index 00000000000..c0b97a2cd2a --- /dev/null +++ b/tests/wpt/tests/svg/animations/switch-animation-02.html @@ -0,0 +1,23 @@ +<!doctype html> +<html class="reftest-wait"> +<title>Test animation as children of switch elements</title> +<link rel="match" href="../struct/reftests/reference/green-100x100.html"> +<script src="/common/reftest-wait.js"></script> +<script src="/common/rendering-utils.js"></script> +<script> +function test() { + document.getElementsByTagName('svg')[0].setCurrentTime(2); + waitForAtLeastOneFrame().then(takeScreenshot); +} +</script> +<svg onload="test()"> + <switch> + <g systemLanguage="x-xl"> + <set xlink:href="#test" attributeName="width" begin="2s" to="0" /> + </g> + <g> + <set xlink:href="#test" attributeName="height" begin="2s" to="100" /> + </g> + </switch> + <rect id="test" width="100" height="0" fill="green"/> +</svg> diff --git a/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html new file mode 100644 index 00000000000..f027f5151fe --- /dev/null +++ b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html @@ -0,0 +1,4 @@ +<!DOCTYPE html> +<svg width="100" height="100"> + <use href="use-external-reload-in-iframe-resource.svg#blue"/> +</svg> diff --git a/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg new file mode 100644 index 00000000000..8bc72975282 --- /dev/null +++ b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg @@ -0,0 +1,5 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <symbol viewBox="0 0 16 16" id="blue"> + <rect width="16" height="16" fill="blue"/> + </symbol> +</svg> diff --git a/tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html b/tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html new file mode 100644 index 00000000000..ab1214d20f1 --- /dev/null +++ b/tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<title><use> with external resource in reloaded iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<iframe src="support/use-external-reload-in-iframe-child.html"></iframe> +<script> + async_test(t => { + window.onload = t.step_func(() => { + const iframe = document.querySelector('iframe'); + iframe.onload = t.step_func_done(); + iframe.contentWindow.location.reload(); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html b/tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html new file mode 100644 index 00000000000..5b8cb16b94f --- /dev/null +++ b/tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<title>SVGLength in zoomed div</title> +<link rel="help" href="https://www.w3.org/TR/SVG/types.html#InterfaceSVGLength"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div style="zoom: 2;"> +<svg> + <rect id="rect" width="100" height="100"/> +</svg> +</div> +<script> + const rect = document.getElementById("rect"); + + test(() => { + assert_approx_equals(rect.width.baseVal.value, 100, 0.1); + }, "SVGLength in zoomed div should be unchanged"); +</script> diff --git a/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt b/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt index 8e178d1d2c4..cd3e785aa47 100644 --- a/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt +++ b/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt @@ -1,4 +1,4 @@ -pyobjc-core==10.2 +pyobjc-core==10.3.1 pyobjc-framework-Cocoa==9.2 pyobjc-framework-ColorSync==9.2 pyobjc-framework-Quartz==9.2 diff --git a/tests/wpt/tests/tools/ci/requirements_tc.txt b/tests/wpt/tests/tools/ci/requirements_tc.txt index b3c1c51f129..a9128c02eb9 100644 --- a/tests/wpt/tests/tools/ci/requirements_tc.txt +++ b/tests/wpt/tests/tools/ci/requirements_tc.txt @@ -1,4 +1,4 @@ pygithub==2.3.0 pyyaml==6.0.1 -requests==2.31.0 +requests==2.32.3 taskcluster==64.2.8 diff --git a/tests/wpt/tests/tools/docker/requirements.txt b/tests/wpt/tests/tools/docker/requirements.txt index 6451b3a8004..b275ccfd8f1 100644 --- a/tests/wpt/tests/tools/docker/requirements.txt +++ b/tests/wpt/tests/tools/docker/requirements.txt @@ -1,2 +1,2 @@ pyyaml==6.0.1 -requests==2.32.2 +requests==2.32.3 diff --git a/tests/wpt/tests/tools/requirements_mypy.txt b/tests/wpt/tests/tools/requirements_mypy.txt index 3b1d3b03d64..2addbba3b22 100644 --- a/tests/wpt/tests/tools/requirements_mypy.txt +++ b/tests/wpt/tests/tools/requirements_mypy.txt @@ -6,9 +6,9 @@ typed-ast==1.5.5 types-atomicwrites==1.4.5.1 types-python-dateutil==2.9.0.20240316 types-PyYAML==6.0.12.12 -types-requests==2.31.0.20231231 +types-requests==2.32.0.20240602 types-setuptools==69.5.0.20240423 types-six==1.16.21.20240425 types-ujson==5.9.0.0 types-urllib3==1.26.25.14 -typing_extensions==4.7.1 +typing_extensions==4.12.2 diff --git a/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py b/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py index 9d89b47c69b..e02e2ccf28f 100644 --- a/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py +++ b/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py @@ -219,6 +219,7 @@ class WebSocketRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): self._logger.info('Request basic authentication') return False + whole_path = self.path host, port, resource = http_header_util.parse_uri(self.path) if resource is None: self._logger.info('Invalid URI: %r', self.path) @@ -247,7 +248,7 @@ class WebSocketRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): # Fallback to default http handler for request paths for which # we don't have request handlers. if not self._options.dispatcher.get_handler_suite(self.path): - self._logger.info('No handler for resource: %r', self.path) + self._logger.info('No handler for resource: %r', whole_path) self._logger.info('Fallback to CGIHTTPRequestHandler') return True except dispatch.DispatchException as e: diff --git a/tests/wpt/tests/tools/webdriver/webdriver/transport.py b/tests/wpt/tests/tools/webdriver/webdriver/transport.py index ca1ff74ef96..e5ed3473ed4 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/transport.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/transport.py @@ -204,6 +204,8 @@ class HTTPWireProtocol: ``json.JSONEncoder`` unless specified. :param decoder: JSON decoder class, which defaults to ``json.JSONDecoder`` unless specified. + :param timeout: Optional timeout for the underlying socket. `None` will + retain the existing timeout. :param codec_kwargs: Surplus arguments passed on to `encoder` and `decoder` on construction. @@ -231,7 +233,7 @@ class HTTPWireProtocol: # runner thread. We use the boolean below to check for that and restart # the connection in that case. self._last_request_is_blocked = True - response = self._request(method, uri, payload, headers, timeout=None) + response = self._request(method, uri, payload, headers, timeout=timeout) self._last_request_is_blocked = False return Response.from_http(response, decoder=decoder, **codec_kwargs) diff --git a/tests/wpt/tests/tools/wpt/browser.py b/tests/wpt/tests/tools/wpt/browser.py index 4c42ffa4e82..ba716cd14f6 100644 --- a/tests/wpt/tests/tools/wpt/browser.py +++ b/tests/wpt/tests/tools/wpt/browser.py @@ -9,6 +9,7 @@ import tempfile from abc import ABCMeta, abstractmethod from datetime import datetime, timedelta, timezone from shutil import which +from typing import Optional from urllib.parse import urlsplit import html5lib @@ -583,7 +584,7 @@ class ChromeChromiumBase(Browser): see https://web-platform-tests.org/running-tests/chrome-chromium-installation-detection.html """ - requirements = "requirements_chromium.txt" + requirements: Optional[str] = "requirements_chromium.txt" platform = { "Linux": "Linux", "Windows": "Win", @@ -703,12 +704,12 @@ class ChromeChromiumBase(Browser): try: # MojoJS version url must match the browser binary version exactly. - url = ("https://storage.googleapis.com/chrome-wpt-mojom/" - f"{chrome_version}/linux64/mojojs.zip") + url = ("https://storage.googleapis.com/chrome-for-testing-public/" + f"{chrome_version}/mojojs.zip") # Check the status without downloading the content (this is a streaming request). get(url) except requests.RequestException: - # If a valid matching version cannot be found in the wpt archive, + # If a valid matching version cannot be found in the CfT archive, # download from Chromium snapshots bucket. However, # MojoJS is only bundled with Linux from Chromium snapshots. if self.platform == "Linux": @@ -1392,14 +1393,17 @@ class Chrome(ChromeChromiumBase): return m.group(1) -class ContentShell(Browser): - """Interface for the Chromium content shell. +class HeadlessShell(ChromeChromiumBase): + """Interface for the Chromium headless shell [0]. + + [0]: https://chromium.googlesource.com/chromium/src/+/HEAD/headless/README.md """ - product = "content_shell" + product = "headless_shell" requirements = None def download(self, dest=None, channel=None, rename=None): + # TODO(crbug.com/344669542): Download binaries via CfT. raise NotImplementedError def install(self, dest=None, channel=None): @@ -1409,17 +1413,16 @@ class ContentShell(Browser): raise NotImplementedError def find_binary(self, venv_path=None, channel=None): - if uname[0] == "Darwin": - return which("Content Shell.app/Contents/MacOS/Content Shell") - return which("content_shell") # .exe is added automatically for Windows - - def find_webdriver(self, venv_path=None, channel=None): - return None + # `which()` adds `.exe` extension automatically for Windows. + # Chromium builds an executable named `headless_shell`, whereas CfT + # ships under the name `chrome-headless-shell`. + return which("headless_shell") or which("chrome-headless-shell") def version(self, binary=None, webdriver_binary=None): - # content_shell does not return version information. + # TODO(crbug.com/327767951): Support `headless_shell --version`. return "N/A" + class ChromeAndroidBase(Browser): """A base class for ChromeAndroid and AndroidWebView. diff --git a/tests/wpt/tests/tools/wpt/requirements.txt b/tests/wpt/tests/tools/wpt/requirements.txt index 2c24336eb31..d80d9fc2a3a 100644 --- a/tests/wpt/tests/tools/wpt/requirements.txt +++ b/tests/wpt/tests/tools/wpt/requirements.txt @@ -1 +1 @@ -requests==2.31.0 +requests==2.32.3 diff --git a/tests/wpt/tests/tools/wpt/run.py b/tests/wpt/tests/tools/wpt/run.py index 2fb7f97f498..9c6acbc2a46 100644 --- a/tests/wpt/tests/tools/wpt/run.py +++ b/tests/wpt/tests/tools/wpt/run.py @@ -112,7 +112,7 @@ otherwise install OpenSSL and ensure that it's on your $PATH.""") def check_environ(product): if product not in ("android_webview", "chrome", "chrome_android", "chrome_ios", - "content_shell", "edge", "firefox", "firefox_android", + "edge", "firefox", "firefox_android", "headless_shell", "ladybird", "servo", "wktr"): config_builder = serve.build_config(os.path.join(wpt_root, "config.json")) # Override the ports to avoid looking for free ports @@ -521,9 +521,9 @@ class Chrome(BrowserSetup): kwargs["binary_args"].append("--no-sandbox") -class ContentShell(BrowserSetup): - name = "content_shell" - browser_cls = browser.ContentShell +class HeadlessShell(BrowserSetup): + name = "headless_shell" + browser_cls = browser.HeadlessShell experimental_channels = ("dev", "canary", "nightly") def setup_kwargs(self, kwargs): @@ -533,7 +533,7 @@ class ContentShell(BrowserSetup): if binary: kwargs["binary"] = binary else: - raise WptrunError(f"Unable to locate {self.name.capitalize()} binary") + raise WptrunError(f"Unable to locate {self.name!r} binary") if kwargs["mojojs_path"]: kwargs["enable_mojojs"] = True @@ -544,7 +544,13 @@ class ContentShell(BrowserSetup): "Provide '--mojojs-path' explicitly instead.") logger.warning("MojoJS is disabled for this run.") - kwargs["enable_webtransport_h3"] = True + # Never pause after test, since headless shell is not interactive. + kwargs["pause_after_test"] = False + # Don't add a `--headless` switch. + kwargs["headless"] = False + + if kwargs["enable_webtransport_h3"] is None: + kwargs["enable_webtransport_h3"] = True class Chromium(Chrome): @@ -867,8 +873,8 @@ product_setup = { "chrome_android": ChromeAndroid, "chrome_ios": ChromeiOS, "chromium": Chromium, - "content_shell": ContentShell, "edge": Edge, + "headless_shell": HeadlessShell, "safari": Safari, "servo": Servo, "servodriver": ServoWebDriver, diff --git a/tests/wpt/tests/tools/wptrunner/requirements.txt b/tests/wpt/tests/tools/wptrunner/requirements.txt index fba8e42ebe2..ae71bbbad6d 100644 --- a/tests/wpt/tests/tools/wptrunner/requirements.txt +++ b/tests/wpt/tests/tools/wptrunner/requirements.txt @@ -5,6 +5,6 @@ mozlog==8.0.0 mozprocess==1.3.1 packaging==24.0 pillow==10.3.0 -requests==2.31.0 +requests==2.32.3 six==1.16.0 urllib3==2.2.1 diff --git a/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt b/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt index 806352e87e2..f6f1581d858 100644 --- a/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt +++ b/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt @@ -1,2 +1,2 @@ selenium==4.20.0 -requests==2.31.0 +requests==2.32.3 diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py index d54a9be9430..aaf91a1dc86 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py @@ -27,10 +27,10 @@ product_list = ["android_webview", "chrome_android", "chrome_ios", "chromium", - "content_shell", "edge", "firefox", "firefox_android", + "headless_shell", "safari", "sauce", "servo", diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py index dd4fc314fc0..fee8895ef3a 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py @@ -3,6 +3,8 @@ import errno import os import platform import socket +import time +import traceback from abc import ABCMeta, abstractmethod from typing import cast, Any, List, Mapping, Optional, Tuple, Type @@ -10,6 +12,7 @@ import mozprocess from mozdebug import DebuggerInfo from mozlog.structuredlog import StructuredLogger +from ..environment import wait_for_service from ..testloader import GroupMetadata from ..wptcommandline import require_arg # noqa: F401 from ..wpttest import Test @@ -107,6 +110,10 @@ class Browser: """Used for browser-specific setup that happens at the start of a test run""" pass + def restart_on_test_type_change(self, new_test_type: str, old_test_type: str) -> bool: + """Determines if a restart is needed when there is a test type switch.""" + return True + def settings(self, test: Test) -> BrowserSettings: """Dictionary of metadata that is constant for a specific launch of a browser. @@ -316,6 +323,7 @@ class WebDriverBrowser(Browser): self.env = os.environ.copy() if env is None else env self.webdriver_args = webdriver_args if webdriver_args is not None else [] + self.init_deadline: Optional[float] = None self._output_handler: Optional[OutputHandler] = None self._cmd = None self._proc: Optional[mozprocess.ProcessHandler] = None @@ -326,6 +334,7 @@ class WebDriverBrowser(Browser): return [self.webdriver_binary] + self.webdriver_args def start(self, group_metadata: GroupMetadata, **kwargs: Any) -> None: + self.init_deadline = time.time() + self.init_timeout try: self._run_server(group_metadata, **kwargs) except KeyboardInterrupt: @@ -340,6 +349,7 @@ class WebDriverBrowser(Browser): return OutputHandler(self.logger, cmd) def _run_server(self, group_metadata: GroupMetadata, **kwargs: Any) -> None: + assert self.init_deadline is not None cmd = self.make_command() self._output_handler = self.create_output_handler(cmd) @@ -349,7 +359,7 @@ class WebDriverBrowser(Browser): env=self.env, storeOutput=False) - self.logger.debug("Starting WebDriver: %s" % ' '.join(cmd)) + self.logger.info("Starting WebDriver: %s" % ' '.join(cmd)) try: self._proc.run() except OSError as e: @@ -359,8 +369,21 @@ class WebDriverBrowser(Browser): raise self._output_handler.after_process_start(self._proc.pid) - self._output_handler.start(group_metadata=group_metadata, **kwargs) - self.logger.debug("_run complete") + try: + wait_for_service( + self.logger, + self.host, + self.port, + timeout=self.init_deadline - time.time(), + server_process=self._proc, + ) + except Exception: + self.logger.error(f"WebDriver was not accessible within {self.init_timeout} seconds.") + self.logger.error(traceback.format_exc()) + raise + finally: + self._output_handler.start(group_metadata=group_metadata, **kwargs) + self.logger.info("Webdriver started successfully.") def stop(self, force: bool = False) -> bool: self.logger.debug("Stopping WebDriver") diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py index c0a176743de..3b1bd6411e2 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -6,12 +6,12 @@ from .base import NullBrowser # noqa: F401 from .base import get_timeout_multiplier # noqa: F401 from .base import cmd_arg from ..executors import executor_kwargs as base_executor_kwargs -from ..executors.executorwebdriver import WebDriverCrashtestExecutor # noqa: F401 from ..executors.base import WdspecExecutor # noqa: F401 from ..executors.executorchrome import ( # noqa: F401 ChromeDriverPrintRefTestExecutor, ChromeDriverRefTestExecutor, ChromeDriverTestharnessExecutor, + ChromeDriverCrashTestExecutor ) @@ -22,7 +22,7 @@ __wptrunner__ = {"product": "chrome", "reftest": "ChromeDriverRefTestExecutor", "print-reftest": "ChromeDriverPrintRefTestExecutor", "wdspec": "WdspecExecutor", - "crashtest": "WebDriverCrashtestExecutor"}, + "crashtest": "ChromeDriverCrashTestExecutor"}, "browser_kwargs": "browser_kwargs", "executor_kwargs": "executor_kwargs", "env_extras": "env_extras", @@ -194,6 +194,13 @@ def update_properties(): class ChromeBrowser(WebDriverBrowser): + def restart_on_test_type_change(self, new_test_type: str, old_test_type: str) -> bool: + # Restart the test runner when switch from/to wdspec tests. Wdspec test + # is using a different protocol class so a restart is always needed. + if "wdspec" in [old_test_type, new_test_type]: + return True + return False + def make_command(self): return [self.webdriver_binary, cmd_arg("port", str(self.port)), diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py index db81b91957b..e559a5d7573 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py @@ -1,9 +1,7 @@ # mypy: allow-untyped-defs -import traceback from .base import WebDriverBrowser, require_arg from .base import get_timeout_multiplier # noqa: F401 -from ..environment import wait_for_service from ..executors import executor_kwargs as base_executor_kwargs from ..executors.base import WdspecExecutor # noqa: F401 from ..executors.executorwebdriver import (WebDriverCrashtestExecutor, # noqa: F401 @@ -60,19 +58,3 @@ class ChromeiOSBrowser(WebDriverBrowser): def make_command(self): return ([self.webdriver_binary, f"--port={self.port}"] + self.webdriver_args) - - def start(self, group_metadata, **kwargs): - super().start(group_metadata, **kwargs) - try: - wait_for_service( - self.logger, - self.host, - self.port, - timeout=self.init_timeout, - server_process=self._proc, - ) - except Exception: - self.logger.error( - "WebDriver was not accessible " - f"within the timeout:\n{traceback.format_exc()}") - raise diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py deleted file mode 100644 index 6df8671e0ac..00000000000 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py +++ /dev/null @@ -1,134 +0,0 @@ -# mypy: allow-untyped-defs - -from . import chrome_spki_certs -from .base import cmd_arg, require_arg -from .base import get_timeout_multiplier # noqa: F401 -from .chrome import ChromeBrowser, debug_args -from ..executors import executor_kwargs as base_executor_kwargs -from ..executors.base import WdspecExecutor # noqa: F401 -from ..executors.executorchrome import ( # noqa: F401 - ChromeDriverPrintRefTestExecutor, - ChromeDriverRefTestExecutor, - ChromeDriverTestharnessExecutor, -) -from ..executors.executorwebdriver import WebDriverCrashtestExecutor # noqa: F401 - -ENABLE_THREADED_COMPOSITING_FLAG = '--enable-threaded-compositing' -DISABLE_THREADED_COMPOSITING_FLAG = '--disable-threaded-compositing' -DISABLE_THREADED_ANIMATION_FLAG = '--disable-threaded-animation' - - -__wptrunner__ = {"product": "content_shell", - "check_args": "check_args", - "browser": "ContentShellBrowser", - "executor": { - "crashtest": "WebDriverCrashtestExecutor", - "print-reftest": "ChromeDriverPrintRefTestExecutor", - "reftest": "ChromeDriverRefTestExecutor", - "testharness": "ChromeDriverTestharnessExecutor", - "wdspec": "WdspecExecutor", - }, - "browser_kwargs": "browser_kwargs", - "executor_kwargs": "executor_kwargs", - "env_extras": "env_extras", - "env_options": "env_options", - "update_properties": "update_properties", - "timeout_multiplier": "get_timeout_multiplier",} - - -def check_args(**kwargs): - require_arg(kwargs, "webdriver_binary") - - -def browser_kwargs(logger, test_type, run_info_data, config, **kwargs): - return {"binary": kwargs["binary"], - "webdriver_binary": kwargs["webdriver_binary"], - "webdriver_args": kwargs.get("webdriver_args"), - "debug_info": kwargs["debug_info"]} - - -def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite, - **kwargs): - sanitizer_enabled = kwargs.get("sanitizer_enabled") - if sanitizer_enabled: - test_type = "crashtest" - executor_kwargs = base_executor_kwargs(test_type, test_environment, run_info_data, - subsuite, **kwargs) - executor_kwargs["sanitizer_enabled"] = sanitizer_enabled - executor_kwargs["close_after_done"] = True - executor_kwargs["reuse_window"] = kwargs.get("reuse_window", False) - - capabilities = { - "goog:chromeOptions": { - "prefs": { - "profile": { - "default_content_setting_values": { - "popups": 1 - } - } - }, - "excludeSwitches": ["enable-automation"], - "w3c": True, - } - } - - chrome_options = capabilities["goog:chromeOptions"] - if kwargs["binary"] is not None: - chrome_options["binary"] = kwargs["binary"] - - chrome_options["args"] = [] - chrome_options["args"].append("--ignore-certificate-errors-spki-list=%s" % - ','.join(chrome_spki_certs.IGNORE_CERTIFICATE_ERRORS_SPKI_LIST)) - # For WebTransport tests. - chrome_options["args"].append("--webtransport-developer-mode") - chrome_options["args"].append("--enable-blink-test-features") - - # always run in headful mode for content_shell - - if kwargs["debug_info"]: - chrome_options["args"].extend(debug_args(kwargs["debug_info"])) - - for arg in kwargs.get("binary_args", []): - # skip empty --user-data-dir args, and allow chromedriver to pick one. - # Do not pass in --run-web-tests, otherwise content_shell will hang. - if arg in ['--user-data-dir', '--run-web-tests']: - continue - if arg not in chrome_options["args"]: - chrome_options["args"].append(arg) - - # Temporary workaround to align with RWT behavior. Unless a vts explicitly - # enables threaded compositing, we should use single threaded compositing - # Do not pass in DISABLE_THREADED_COMPOSITING_FLAG or - # DISABLE_THREADED_ANIMATION_FLAG. Content shell will hang due to that. - #if ENABLE_THREADED_COMPOSITING_FLAG not in subsuite.config.get("binary_args", []): - # chrome_options["args"].extend([DISABLE_THREADED_COMPOSITING_FLAG, - # DISABLE_THREADED_ANIMATION_FLAG]) - - for arg in subsuite.config.get("binary_args", []): - if arg not in chrome_options["args"]: - chrome_options["args"].append(arg) - - executor_kwargs["capabilities"] = capabilities - - return executor_kwargs - - -def env_extras(**kwargs): - return [] - - -def env_options(): - return {"server_host": "127.0.0.1", - "supports_debugger": True} - - -def update_properties(): - return (["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]}) - - -class ContentShellBrowser(ChromeBrowser): - def make_command(self): - return [self.webdriver_binary, - cmd_arg("port", str(self.port)), - cmd_arg("url-base", self.base_path), - cmd_arg("enable-chrome-logs")] + self.webdriver_args diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py index d22da8568ad..d977930a289 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py @@ -910,7 +910,6 @@ class FirefoxWdSpecBrowser(WebDriverBrowser): self.binary = binary self.package_name = package_name self.webdriver_binary = webdriver_binary - self.init_deadline = None self.stackfix_dir = stackfix_dir self.symbols_path = symbols_path @@ -959,7 +958,6 @@ class FirefoxWdSpecBrowser(WebDriverBrowser): def start(self, group_metadata, **kwargs): self.leak_report_file = setup_leak_report(self.leak_check, self.profile, self.env) - self.init_deadline = time.time() + self.init_timeout super().start(group_metadata, **kwargs) def stop(self, force=False): diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py new file mode 100644 index 00000000000..e7da3e64548 --- /dev/null +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py @@ -0,0 +1,62 @@ +# mypy: allow-untyped-defs + +from .base import cmd_arg, require_arg +from .base import get_timeout_multiplier # noqa: F401 +from .chrome import ChromeBrowser, debug_args, executor_kwargs # noqa: F401 +from ..executors.base import WdspecExecutor # noqa: F401 +from ..executors.executorchrome import ( # noqa: F401 + ChromeDriverCrashTestExecutor, + ChromeDriverPrintRefTestExecutor, + ChromeDriverRefTestExecutor, + ChromeDriverTestharnessExecutor, +) + + +__wptrunner__ = {"product": "headless_shell", + "check_args": "check_args", + "browser": "HeadlessShellBrowser", + "executor": { + "crashtest": "ChromeDriverCrashTestExecutor", + "print-reftest": "ChromeDriverPrintRefTestExecutor", + "reftest": "ChromeDriverRefTestExecutor", + "testharness": "ChromeDriverTestharnessExecutor", + "wdspec": "WdspecExecutor", + }, + "browser_kwargs": "browser_kwargs", + "executor_kwargs": "executor_kwargs", + "env_extras": "env_extras", + "env_options": "env_options", + "update_properties": "update_properties", + "timeout_multiplier": "get_timeout_multiplier",} + + +def check_args(**kwargs): + require_arg(kwargs, "webdriver_binary") + + +def browser_kwargs(logger, test_type, run_info_data, config, **kwargs): + return {"binary": kwargs["binary"], + "webdriver_binary": kwargs["webdriver_binary"], + "webdriver_args": kwargs.get("webdriver_args"), + "debug_info": kwargs["debug_info"]} + + +def env_extras(**kwargs): + return [] + + +def env_options(): + return {"server_host": "127.0.0.1", + "supports_debugger": True} + + +def update_properties(): + return (["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]}) + + +class HeadlessShellBrowser(ChromeBrowser): + def make_command(self): + return [self.webdriver_binary, + cmd_arg("port", str(self.port)), + cmd_arg("url-base", self.base_path), + cmd_arg("enable-chrome-logs")] + self.webdriver_args diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py index 20bddaa4bc9..f0264173b18 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py @@ -286,13 +286,17 @@ class TestExecutor: "prefs": {}} self.protocol = None # This must be set in subclasses - def setup(self, runner): + def setup(self, runner, protocol=None): """Run steps needed before tests can be started e.g. connecting to browser instance - :param runner: TestRunner instance that is going to run the tests""" + :param runner: TestRunner instance that is going to run the tests. + :param protocol: protocol connection to reuse if not None""" self.runner = runner - if self.protocol is not None: + if protocol is not None: + assert isinstance(protocol, self.protocol_cls) + self.protocol = protocol + elif self.protocol is not None: self.protocol.setup(runner) def teardown(self): @@ -630,7 +634,8 @@ class WdspecExecutor(TestExecutor): self.binary = binary self.binary_args = binary_args - def setup(self, runner): + def setup(self, runner, protocol=None): + assert protocol is None, "Switch executor not allowed for wdspec tests." self.protocol = self.protocol_cls(self, self.browser) super().setup(runner) diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py index 46d38f14c55..d972a0eea5f 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py @@ -215,6 +215,10 @@ class ChromeDriverProtocol(WebDriverProtocol): vendor_prefix = "goog" +class ChromeDriverCrashTestExecutor(WebDriverCrashtestExecutor): + protocol_cls = ChromeDriverProtocol + + class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # type: ignore protocol_cls = ChromeDriverProtocol @@ -226,8 +230,8 @@ class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMi super().__init__(*args, **kwargs) self.protocol.reuse_window = reuse_window - def setup(self, runner): - super().setup(runner) + def setup(self, runner, protocol=None): + super().setup(runner, protocol) # Chromium requires the `background-sync` permission for reporting APIs # to work. Not all embedders (notably, `chrome --headless=old`) grant # `background-sync` by default, so this CDP call ensures the permission @@ -248,8 +252,8 @@ class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMi class ChromeDriverPrintRefTestExecutor(ChromeDriverRefTestExecutor): protocol_cls = ChromeDriverProtocol - def setup(self, runner): - super().setup(runner) + def setup(self, runner, protocol=None): + super().setup(runner, protocol) self.protocol.pdf_print.load_runner() self.has_window = False with open(os.path.join(here, "reftest.js")) as f: diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py index ad546b7e840..75a3313c55c 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py @@ -38,8 +38,8 @@ class EdgeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixi class EdgeDriverPrintRefTestExecutor(EdgeDriverRefTestExecutor): protocol_cls = EdgeDriverProtocol - def setup(self, runner): - super().setup(runner) + def setup(self, runner, protocol=None): + super().setup(runner, protocol) self.protocol.pdf_print.load_runner() self.has_window = False with open(os.path.join(here, "reftest.js")) as f: diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py index 05a9fc1ae4b..fe1fed13630 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -952,8 +952,8 @@ class MarionetteTestharnessExecutor(TestharnessExecutor): if marionette is None: do_delayed_imports() - def setup(self, runner): - super().setup(runner) + def setup(self, runner, protocol=None): + super().setup(runner, protocol) for extension_path in self.install_extensions: self.logger.info("Installing extension from %s" % extension_path) addons = Addons(self.protocol.marionette) @@ -1081,8 +1081,8 @@ class MarionetteRefTestExecutor(RefTestExecutor): return (InternalRefTestImplementation if reftest_internal else RefTestImplementation)(self) - def setup(self, runner): - super().setup(runner) + def setup(self, runner, protocol=None): + super().setup(runner, protocol) for extension_path in self.install_extensions: self.logger.info("Installing extension from %s" % extension_path) addons = Addons(self.protocol.marionette) @@ -1335,8 +1335,8 @@ class MarionettePrintRefTestExecutor(MarionetteRefTestExecutor): debug=debug, **kwargs) - def setup(self, runner): - super().setup(runner) + def setup(self, runner, protocol=None): + super().setup(runner, protocol) if not isinstance(self.implementation, InternalRefTestImplementation): self.protocol.pdf_print.load_runner() diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index f985d486759..20ae4a42118 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -509,7 +509,9 @@ class WebDriverProtocol(Protocol): self.logger.debug(message) self.webdriver = None - def is_alive(self): + def is_alive(self) -> bool: + if not self.webdriver: + return False try: # Get a simple property over the connection, with 2 seconds of timeout # that should be more than enough to check if the WebDriver its diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py index 4a2c01372e0..b90e45d3678 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py @@ -10,7 +10,7 @@ class ProcessTestExecutor(TestExecutor): self.interactive = (False if self.debug_info is None else self.debug_info.interactive) - def setup(self, runner): + def setup(self, runner, protocol=None): self.runner = runner self.runner.send_message("init_succeeded") return True diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py index 098e443b5ce..c7cdee6887e 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py @@ -553,13 +553,14 @@ class TestQueueBuilder: processes = self.process_count(self.kwargs["processes"], len(groups)) if processes > 1: groups.sort(key=lambda group: ( - # Place groups of the same test type together to minimize - # browser restarts. + # Place groups of the same subsuite, test type together to + # minimize browser restarts. + group.subsuite, group.test_type, # Next, run larger groups first to avoid straggler runners. Use # timeout to give slow tests greater relative weight. - -sum(test.timeout for test in group.group), - )) + sum(test.timeout for test in group.group), + ), reverse=True) for item in groups: test_queue.put(item) diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py index 93e19fa47ba..0a5dfb1fd18 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py @@ -30,6 +30,11 @@ TestImplementation = namedtuple('TestImplementation', 'browser_cls', 'browser_kwargs']) +ExecutorImplementation = namedtuple('ExecutorImplementation', + ['executor_cls', 'executor_kwargs', + 'executor_browser_cls', 'executor_browser_kwargs']) + + class StopFlag: """Synchronization for coordinating a graceful exit.""" @@ -75,11 +80,13 @@ class TestRunner: parent TestRunnerManager process :param executor: TestExecutor object that will actually run a test. """ - def __init__(self, logger, command_queue, result_queue, executor, recording): + def __init__(self, logger, command_queue, result_queue, executor_implementation, recording): self.command_queue = command_queue self.result_queue = result_queue - - self.executor = executor + browser = executor_implementation.executor_browser_cls( + **executor_implementation.executor_browser_kwargs) + self.executor = executor_implementation.executor_cls( + logger, browser, **executor_implementation.executor_kwargs) self.name = mpcontext.get_context().current_process().name self.logger = logger self.recording = recording @@ -108,6 +115,28 @@ class TestRunner: self.command_queue = None self.browser = None + def switch_executor(self, executor_implementation): + assert self.executor is not None + # reuse the current protocol connection + protocol = self.executor.protocol + self.executor.protocol = None + self.executor.teardown() + browser = executor_implementation.executor_browser_cls( + **executor_implementation.executor_browser_kwargs) + self.executor = executor_implementation.executor_cls( + self.logger, browser, **executor_implementation.executor_kwargs) + if type(self.executor.protocol) is not type(protocol): + self.send_message("switch_executor_failed") + self.logger.error("Protocol type does not match, switch executor failed.") + return + try: + self.executor.setup(self, protocol) + except Exception: + self.send_message("switch_executor_failed") + else: + self.send_message("switch_executor_succeeded") + self.logger.debug("Switch Executor done") + def run(self): """Main loop accepting commands over the pipe and triggering the associated methods""" @@ -118,6 +147,7 @@ class TestRunner: traceback.format_exc()) raise commands = {"run_test": self.run_test, + "switch_executor": self.switch_executor, "reset": self.reset, "stop": self.stop, "wait": self.wait} @@ -157,9 +187,8 @@ class TestRunner: def start_runner(runner_command_queue, runner_result_queue, - executor_cls, executor_kwargs, - executor_browser_cls, executor_browser_kwargs, - capture_stdio, stop_flag, recording): + executor_implementation, capture_stdio, + stop_flag, recording): """Launch a TestRunner in a new process""" def send_message(command, *args): @@ -179,9 +208,11 @@ def start_runner(runner_command_queue, runner_result_queue, with capture.CaptureIO(logger, capture_stdio): try: - browser = executor_browser_cls(**executor_browser_kwargs) - executor = executor_cls(logger, browser, **executor_kwargs) - with TestRunner(logger, runner_command_queue, runner_result_queue, executor, recording) as runner: + with TestRunner(logger, + runner_command_queue, + runner_result_queue, + executor_implementation, + recording) as runner: try: runner.run() except KeyboardInterrupt: @@ -301,6 +332,8 @@ class _RunnerManagerState: running = namedtuple("running", ["subsuite", "test_type", "test", "test_group", "group_metadata"]) restarting = namedtuple("restarting", ["subsuite", "test_type", "test", "test_group", "group_metadata", "force_stop"]) + switching_executor = namedtuple("switching_executor", + ["subsuite", "test_type", "test", "test_group", "group_metadata"]) error = namedtuple("error", []) stop = namedtuple("stop", ["force_stop"]) @@ -482,6 +515,11 @@ class TestRunnerManager(threading.Thread): "test_ended": self.test_ended, "wait_finished": self.wait_finished, }, + RunnerManagerState.switching_executor: + { + "switch_executor_succeeded": self.switch_executor_succeeded, + "switch_executor_failed": self.switch_executor_failed, + }, RunnerManagerState.restarting: {}, RunnerManagerState.error: {}, RunnerManagerState.stop: {}, @@ -589,18 +627,11 @@ class TestRunnerManager(threading.Thread): assert self.remote_queue is not None self.logger.info("Starting runner") impl = self.test_implementations[(self.state.subsuite, self.state.test_type)] - self.executor_cls = impl.executor_cls - self.executor_kwargs = impl.executor_kwargs - self.executor_kwargs["group_metadata"] = self.state.group_metadata - self.executor_kwargs["browser_settings"] = self.browser.browser_settings - executor_browser_cls, executor_browser_kwargs = self.browser.browser.executor_browser() + self.executor_implementation = self.get_executor_implementation(impl) args = (self.remote_queue, self.command_queue, - self.executor_cls, - self.executor_kwargs, - executor_browser_cls, - executor_browser_kwargs, + self.executor_implementation, self.capture_stdio, self.child_stop_flag, self.recording) @@ -613,6 +644,16 @@ class TestRunnerManager(threading.Thread): self.logger.debug("Test runner started") # Now we wait for either an init_succeeded event or an init_failed event + def get_executor_implementation(self, impl): + executor_kwargs = impl.executor_kwargs + executor_kwargs["group_metadata"] = self.state.group_metadata + executor_kwargs["browser_settings"] = self.browser.browser_settings + executor_browser_cls, executor_browser_kwargs = self.browser.browser.executor_browser() + return ExecutorImplementation(impl.executor_cls, + executor_kwargs, + executor_browser_cls, + executor_browser_kwargs) + def init_succeeded(self): assert isinstance(self.state, RunnerManagerState.initializing) self.browser.after_init() @@ -671,8 +712,9 @@ class TestRunnerManager(threading.Thread): # Factor of 3 on the extra timeout here is based on allowing the executor # at least test.timeout + 2 * extra_timeout to complete, # which in turn is based on having several layers of timeout inside the executor - wait_timeout = (self.state.test.timeout * self.executor_kwargs['timeout_multiplier'] + - 3 * self.executor_cls.extra_timeout) + timeout_multiplier = self.executor_implementation.executor_kwargs['timeout_multiplier'] + wait_timeout = (self.state.test.timeout * timeout_multiplier + + 3 * self.executor_implementation.executor_cls.extra_timeout) self.timer = threading.Timer(wait_timeout, self._timeout) self.timer.name = f"{self.name}-timeout" @@ -796,7 +838,8 @@ class TestRunnerManager(threading.Thread): test.min_assertion_count, test.max_assertion_count) - file_result.extra["test_timeout"] = test.timeout * self.executor_kwargs['timeout_multiplier'] + timeout_multiplier = self.executor_implementation.executor_kwargs['timeout_multiplier'] + file_result.extra["test_timeout"] = test.timeout * timeout_multiplier if self.browser.browser_pid: file_result.extra["browser_pid"] = self.browser.browser_pid @@ -832,6 +875,23 @@ class TestRunnerManager(threading.Thread): # post-stop processing return self.after_test_end(self.state.test, not rerun, force_rerun=rerun) + def switch_executor_succeeded(self): + assert isinstance(self.state, RunnerManagerState.switching_executor) + return RunnerManagerState.running(self.state.subsuite, + self.state.test_type, + self.state.test, + self.state.test_group, + self.state.group_metadata) + + def switch_executor_failed(self): + assert isinstance(self.state, RunnerManagerState.switching_executor) + return RunnerManagerState.restarting(self.state.subsuite, + self.state.test_type, + self.state.test, + self.state.test_group, + self.state.group_metadata, + False) + def after_test_end(self, test, restart, force_rerun=False, force_stop=False): assert isinstance(self.state, RunnerManagerState.running) # Mixing manual reruns and automatic reruns is confusing; we currently assume @@ -844,12 +904,20 @@ class TestRunnerManager(threading.Thread): if subsuite != self.state.subsuite: self.logger.info(f"Restarting browser for new subsuite:{subsuite}") restart = True - elif test_type != self.state.test_type: - self.logger.info(f"Restarting browser for new test type:{test_type}") - restart = True elif self.restart_on_new_group and test_group is not self.state.test_group: self.logger.info("Restarting browser for new test group") restart = True + elif test_type != self.state.test_type: + if self.browser.browser.restart_on_test_type_change(test_type, self.state.test_type): + self.logger.info(f"Restarting browser for new test type:{test_type}") + restart = True + else: + self.logger.info(f"Switching executor for new test type: {self.state.test_type} => {test_type}") + impl = self.test_implementations[subsuite, test_type] + self.executor_implementation = self.get_executor_implementation(impl) + self.send_message("switch_executor", self.executor_implementation) + return RunnerManagerState.switching_executor( + subsuite, test_type, test, test_group, group_metadata) else: subsuite = self.state.subsuite test_type = self.state.test_type diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py index b5e40e3f8df..a3d804336e1 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py @@ -2,6 +2,7 @@ import sys from os.path import dirname, join +from unittest import mock import pytest @@ -29,14 +30,19 @@ def test_logging_immediate_exit(): handler = MozLogTestHandler() logger.add_handler(handler) - browser = base.WebDriverBrowser( - logger, webdriver_binary="echo", webdriver_args=["sample output"] - ) - try: - browser.start(group_metadata={}) - finally: - # Ensure the `echo` process actually exits - browser._proc.wait() + class CustomException(Exception): + pass + + with mock.patch.object(base, "wait_for_service", side_effect=CustomException): + browser = base.WebDriverBrowser( + logger, webdriver_binary="echo", webdriver_args=["sample output"] + ) + try: + with pytest.raises(CustomException): + browser.start(group_metadata={}) + finally: + # Ensure the `echo` process actually exits + browser._proc.wait() process_output_actions = [ data for data in handler.items if data["action"] == "process_output" diff --git a/tests/wpt/tests/touch-events/single-touch-vertical-rl.html b/tests/wpt/tests/touch-events/single-touch-vertical-rl.html index 857007b1f8a..3c34a6d9c96 100644 --- a/tests/wpt/tests/touch-events/single-touch-vertical-rl.html +++ b/tests/wpt/tests/touch-events/single-touch-vertical-rl.html @@ -33,7 +33,7 @@ .pointerMove(10, 20) .pointerDown() .pointerUp(); - actions.send(); + await actions.send(); } </script> <style> diff --git a/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html b/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html index afb2f5f7c4b..404619b5f7a 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html +++ b/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html @@ -2,7 +2,7 @@ <head> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <meta http-equiv="Content-Security-Policy" content="trusted-types a b c*"> + <meta http-equiv="Content-Security-Policy" content="trusted-types a b c"> </head> <body> <script> diff --git a/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html b/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html index 960e333c092..a8fae03db5a 100644 --- a/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html +++ b/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html @@ -53,6 +53,19 @@ const gStepTimingFunctionTests = [ ] }, { + description: 'Test start bounds of step-start easing with no delay', + effect: { + delay: 0, + duration: 1000, + fill: 'backwards', + easing: 'steps(1, start)' + }, + conditions: [ + { currentTime: -1, progress: 0 }, + { currentTime: 0, progress: 1 } + ] + }, + { description: 'Test bounds point of step-start easing with reverse direction', effect: { delay: 1000, @@ -387,5 +400,30 @@ for (const options of gStepTimingFunctionTests) { }, options.description); } +test(t => { + const target = createDiv(t); + const anim = target.animate( + [ + { easing: 'steps(1, start)', opacity: 0 }, + { opacity: 1 } + ], + { easing: 'linear(-2, 2)', duration: 1000, fill: 'both' }); + + anim.currentTime = 0; + assert_equals(anim.effect.getComputedTiming().progress, -2); + // Input < 0 ==> output = 0. + assert_equals(getComputedStyle(target).opacity, "0"); + anim.currentTime = 500; + assert_equals(anim.effect.getComputedTiming().progress, 0); + // Input = 0 & before flag = false ==> output = 1. + assert_equals(getComputedStyle(target).opacity, "1"); + anim.currentTime = 1000; + // Input > 0 & before flag = false ==> output = 1. + assert_equals(anim.effect.getComputedTiming().progress, 2); + assert_equals(getComputedStyle(target).opacity, "1"); + +}, 'Test global timing function with values outside [0,1] with a step ' + + 'timing function on the keyframe'); + </script> </body> diff --git a/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js b/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js index c0f1a08cf90..fe2df1ef7fd 100644 --- a/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js +++ b/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js @@ -98,21 +98,17 @@ test(() => { }, ], extensions: { - appid: "app id", - appidExclude: "app id exclude", - hamcCreateSecret: true, - uvm: true, - credentialProtectionPolicy: "cred protect", + appidExclude: "https://example.com/appid", + hmacCreateSecret: true, + credentialProtectionPolicy: "userVerificationRequired", enforceCredentialProtectionPolicy: true, minPinLength: true, credProps: true, largeBlob: { - support: "large blob support", - read: true, + support: "required", write: test_b64, }, credBlob: test_b64, - getCredBlob: true, supplementalPubKeys: { scopes: ["spk scope"], attestation: "directest", @@ -150,21 +146,17 @@ test(() => { }, ], extensions: { - appid: "app id", - appidExclude: "app id exclude", - hamcCreateSecret: true, - uvm: true, - credentialProtectionPolicy: "cred protect", + appidExclude: "https://example.com/appid", + hmacCreateSecret: true, + credentialProtectionPolicy: "userVerificationRequired", enforceCredentialProtectionPolicy: true, minPinLength: true, credProps: true, largeBlob: { - support: "large blob support", - read: true, + support: "required", write: test_bytes, }, credBlob: test_bytes, - getCredBlob: true, supplementalPubKeys: { scopes: ["spk scope"], attestation: "directest", @@ -188,22 +180,15 @@ test(() => { }, }; - assert_equals(actual.extensions.appid, expected.extensions.appid); assert_equals(actual.extensions.appidExclude, expected.extensions.appidExclude); assert_equals(actual.extensions.hmacCreateSecret, expected.extensions.hmacCreateSecret); - assert_equals(actual.extensions.uvm, expected.extensions.uvm); assert_equals(actual.extensions.credentialProtectionPolicy, expected.extensions.credentialProtectionPolicy); assert_equals(actual.extensions.enforceCredentialProtectionPolicy, expected.extensions.enforceCredentialProtectionPolicy); assert_equals(actual.extensions.minPinLength, expected.extensions.minPinLength); assert_equals(actual.extensions.credProps, expected.extensions.credProps); - assert_equals(actual.extensions.largeBlob.support, expected.extensions.largeBlob.support, "X"); - assert_equals(actual.extensions.largeBlob.read, expected.extensions.largeBlob.read); - - assert_true(bytesEqual(actual.extensions.largeBlob.write, expected.extensions.largeBlob.write), "XX"); - - assert_true(bytesEqual(actual.extensions.credBlob, expected.extensions.credBlob), "XXX"); - - assert_equals(actual.extensions.getCredBlob, expected.extensions.getCredBlob); + assert_equals(actual.extensions.largeBlob.support, expected.extensions.largeBlob.support); + assert_true(bytesEqual(actual.extensions.largeBlob.write, expected.extensions.largeBlob.write)); + assert_true(bytesEqual(actual.extensions.credBlob, expected.extensions.credBlob)); assertJsonEquals(actual.extensions.supplementalPubKeys, expected.extensions.supplementalPubKeys); let prfValuesEquals = (a, b) => { return bytesEqual(a.first, b.first) && bytesEqual(a.second, b.second); diff --git a/tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js b/tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js new file mode 100644 index 00000000000..82e778b027d --- /dev/null +++ b/tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js @@ -0,0 +1,107 @@ +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/resources/utils.js +// META: script=helpers.js + +// The string "test" as ASCII bytes and base64url-encoded. +const test_bytes = new Uint8Array([0x74, 0x65, 0x73, 0x74]); +const test_b64 = "dGVzdA"; + +test(() => { + let actual = PublicKeyCredential.parseRequestOptionsFromJSON({ + challenge: test_b64, + timeout: 60000, + rpId: "example.com", + allowCredentials: [ + { type: "public-key", id: test_b64 }, + ], + userVerification: "required", + hints: ["hybrid", "security-key"], + }); + let expected = { + challenge: test_bytes, + timeout: 60000, + rpId: "example.com", + allowCredentials: [ + { type: "public-key", id: test_bytes }, + ], + userVerification: "required", + hints: ["hybrid", "security-key"], + }; + + assert_equals(actual.rpId, expected.rpId); + assert_true(bytesEqual(actual.challenge, expected.challenge)); + assert_equals(actual.timeout, expected.timeout); + assert_equals(actual.allowCredentials.length, expected.allowCredentials.length); + assert_equals(actual.allowCredentials[0].type, expected.allowCredentials[0].type); + assert_true(bytesEqual(actual.allowCredentials[0].id, expected.allowCredentials[0].id)); + assert_equals(actual.userVerification, expected.userVerification); + assertJsonEquals(actual.hints, expected.hints); +}, "parseRequestOptionsFromJSON()"); + +test(() => { + let actual = PublicKeyCredential.parseRequestOptionsFromJSON({ + challenge: test_b64, + extensions: { + appid: "app id", + largeBlob: { + read: true, + }, + getCredBlob: true, + supplementalPubKeys: { + scopes: ["spk scope"], + attestation: "directest", + attestationFormats: ["asn2"], + }, + prf: { + eval: { + first: test_b64, + second: test_b64, + }, + evalByCredential: { + "test cred": { + first: test_b64, + second: test_b64, + }, + }, + }, + }, + }); + let expected = { + challenge: test_b64, + extensions: { + appid: "app id", + largeBlob: { + read: true, + }, + getCredBlob: true, + supplementalPubKeys: { + scopes: ["spk scope"], + attestation: "directest", + attestationFormats: ["asn2"], + }, + prf: { + eval: { + first: test_bytes, + second: test_bytes, + }, + evalByCredential: { + "test cred": { + first: test_bytes, + second: test_bytes, + }, + }, + }, + }, + }; + + assert_equals(actual.extensions.appid, expected.extensions.appid); + assert_equals(actual.extensions.largeBlob.read, expected.extensions.largeBlob.read); + assert_equals(actual.extensions.getCredBlob, expected.extensions.getCredBlob); + assertJsonEquals(actual.extensions.supplementalPubKeys, expected.extensions.supplementalPubKeys); + let prfValuesEquals = (a, b) => { + return bytesEqual(a.first, b.first) && bytesEqual(a.second, b.second); + }; + assert_true(prfValuesEquals(actual.extensions.prf.eval, expected.extensions.prf.eval), "prf eval"); + assert_true(prfValuesEquals(actual.extensions.prf.evalByCredential["test cred"], expected.extensions.prf.evalByCredential["test cred"]), "prf ebc"); +}, "parseRequestOptionsFromJSON() with extensions"); diff --git a/tests/wpt/tests/webcodecs/videoFrame-construction.any.js b/tests/wpt/tests/webcodecs/videoFrame-construction.any.js index 9f2929aedec..f49cb62c5c0 100644 --- a/tests/wpt/tests/webcodecs/videoFrame-construction.any.js +++ b/tests/wpt/tests/webcodecs/videoFrame-construction.any.js @@ -751,3 +751,260 @@ test(t => { frame.close(); }, 'Test a VideoFrame constructed from canvas can drop the alpha channel.'); +function testAllYUVPixelFormats() { + const YUVs = [ + { + init: { + format: 'I420', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 1 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, // u + 1, 2, // v + ]) + }, + { + init: { + format: 'I420P10', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, // u + 1, 2, 3, 4, // v + ]) + }, + { + init: { + format: 'I420P12', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, // u + 1, 2, 3, 4, // v + ]) + }, + { + init: { + format: 'I420A', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 1 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, // u + 1, 2, // v + 1, 2, 3, 4, 5, 6, 7, 8, // a + ]) + }, + { + init: { + format: 'I420AP10', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, // u + 1, 2, 3, 4, // v + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a + ]) + }, + { + init: { + format: 'I420AP12', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, // u + 1, 2, 3, 4, // v + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a + ]) + }, + { + init: { + format: 'I422', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 1 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, 3, 4, // u + 1, 2, 3, 4, // v + ]) + }, + { + init: { + format: 'I422P10', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, // u + 1, 2, 3, 4, 5, 6, 7, 8, // v + ]) + }, + { + init: { + format: 'I422P12', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, // u + 1, 2, 3, 4, 5, 6, 7, 8, // v + ]) + }, + { + init: { + format: 'I422A', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 1 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, 3, 4, // u + 1, 2, 3, 4, // v + 1, 2, 3, 4, 5, 6, 7, 8, // a + ]) + }, + { + init: { + format: 'I422AP10', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, // u + 1, 2, 3, 4, 5, 6, 7, 8, // v + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a + + ]) + }, + { + init: { + format: 'I422AP12', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, // u + 1, 2, 3, 4, 5, 6, 7, 8, // v + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a + + ]) + }, + { + init: { + format: 'I444', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 1 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, 3, 4, 5, 6, 7, 8, // u + 1, 2, 3, 4, 5, 6, 7, 8, // v + ]) + }, + { + init: { + format: 'I444P10', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v + ]) + }, + { + init: { + format: 'I444P12', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v + ]) + }, + { + init: { + format: 'I444A', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 1 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, 3, 4, 5, 6, 7, 8, // u + 1, 2, 3, 4, 5, 6, 7, 8, // v + 1, 2, 3, 4, 5, 6, 7, 8, // a + ]) + }, + { + init: { + format: 'I444AP10', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a + ]) + }, + { + init: { + format: 'I444AP12', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }, + data: new Uint8Array([ // 2 byte per sample + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a + ]) + }, + ]; + + for (let yuv of YUVs) { + test(t => { + const frame = new VideoFrame(yuv.data, yuv.init); + frame.close(); + }, `Test we can construct a ${yuv.init.format} VideoFrame`); + } +} +testAllYUVPixelFormats(); diff --git a/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py b/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py index 98d6a2e2c8b..49a8397474b 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py @@ -1,10 +1,13 @@ import pytest -from tests.support.sync import AsyncPoll import webdriver.bidi.error as error +from webdriver.error import TimeoutException +from tests.support.sync import AsyncPoll from .. import get_user_context_ids +USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" + @pytest.mark.asyncio async def test_remove_context(bidi_session, create_user_context): @@ -19,9 +22,8 @@ async def test_remove_context(bidi_session, create_user_context): @pytest.mark.parametrize("type_hint", ["tab", "window"]) @pytest.mark.asyncio async def test_remove_context_closes_contexts( - bidi_session, subscribe_events, wait_for_event, create_user_context, type_hint + bidi_session, subscribe_events, create_user_context, type_hint ): - # Subscribe to all browsing context events await subscribe_events(events=["browsingContext.contextDestroyed"]) user_context_1 = await create_user_context() @@ -73,3 +75,40 @@ async def test_remove_context_closes_contexts( assert context_4["context"] in destroyed_contexts remove_listener() + + +@pytest.mark.parametrize("type_hint", ["tab", "window"]) +@pytest.mark.asyncio +async def test_remove_context_skips_beforeunload_prompt( + bidi_session, + subscribe_events, + create_user_context, + setup_beforeunload_page, + type_hint, +): + await subscribe_events(events=[USER_PROMPT_OPENED_EVENT]) + + events = [] + + async def on_event(method, data): + if data["type"] == "beforeunload": + events.append(method) + + remove_listener = bidi_session.add_event_listener( + USER_PROMPT_OPENED_EVENT, on_event) + + user_context = await create_user_context() + + context = await bidi_session.browsing_context.create( + user_context=user_context, type_hint=type_hint + ) + + await setup_beforeunload_page(context) + + await bidi_session.browser.remove_user_context(user_context=user_context) + + wait = AsyncPoll(bidi_session, timeout=0.5) + with pytest.raises(TimeoutException): + await wait.until(lambda _: len(events) > 0) + + remove_listener() diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py index 91899eb50df..a60940d370f 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py @@ -18,6 +18,7 @@ def assert_browsing_context( parent=None, url=None, user_context="default", + original_opener=None ): assert "children" in info if children is not None: @@ -51,6 +52,7 @@ def assert_browsing_context( assert isinstance(info["url"], str) assert info["url"] == url assert info["userContext"] == user_context + assert info["originalOpener"] == original_opener async def assert_document_status(bidi_session, context, visible, focused): diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py index 5172b25d997..63dbd3a23c5 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py @@ -67,6 +67,7 @@ async def test_evaluate_window_open_without_url(bidi_session, subscribe_events, children=None, url="about:blank", parent=None, + original_opener=top_context["context"] ) @@ -89,6 +90,7 @@ async def test_evaluate_window_open_with_url(bidi_session, subscribe_events, wai children=None, url="about:blank", parent=None, + original_opener=top_context["context"] ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py new file mode 100644 index 00000000000..115f9679df7 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py @@ -0,0 +1,65 @@ +import pytest +from webdriver.bidi.modules.script import ContextTarget + +from .. import assert_browsing_context + +pytestmark = pytest.mark.asyncio + +CONTEXT_CREATED_EVENT = "browsingContext.contextCreated" + + +@pytest.mark.parametrize("type_hint", ["tab", "window"]) +async def test_original_opener_context_create(bidi_session, wait_for_event, wait_for_future_safe, subscribe_events, type_hint): + + await subscribe_events([CONTEXT_CREATED_EVENT]) + on_entry = wait_for_event(CONTEXT_CREATED_EVENT) + + top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint) + + context_info = await wait_for_future_safe(on_entry) + + assert_browsing_context( + context_info, + context=top_level_context["context"], + original_opener=None, + url="about:blank", + ) + + +@pytest.mark.parametrize("type_hint", ["tab", "window"]) +@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"]) +@pytest.mark.parametrize("features, returns_window", [ + ("", True), + ("popup", True), + ("noopener", False), + ("noreferrer", False) +] +) +async def test_original_opener_window_open(bidi_session, wait_for_event, wait_for_future_safe, subscribe_events, inline, + type_hint, domain, features, returns_window): + + top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint) + + await subscribe_events([CONTEXT_CREATED_EVENT]) + on_entry = wait_for_event(CONTEXT_CREATED_EVENT) + + url = inline("", domain=domain) + + result = await bidi_session.script.evaluate( + expression=f"""window.open("{url}", "_blank", "{features}");""", + target=ContextTarget(top_level_context["context"]), + await_promise=False) + + context_info = await wait_for_future_safe(on_entry) + + # We use None here as evaluate not always returns value. + context = None + if returns_window: + context = result["value"]["context"] + + assert_browsing_context( + context_info, + context=context, + original_opener=top_level_context["context"], + url="about:blank", + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py index 767305405c6..6dbe7446b63 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py @@ -3,13 +3,18 @@ import pytest import webdriver.bidi.error as error from webdriver.bidi.modules.script import ContextTarget +from webdriver.error import TimeoutException + pytestmark = pytest.mark.asyncio +USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed" USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" -async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_context, subscribe_events): +async def test_alert( + bidi_session, wait_for_event, wait_for_future_safe, new_tab, subscribe_events +): await subscribe_events([USER_PROMPT_OPENED_EVENT]) on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) @@ -17,7 +22,7 @@ async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_con task = asyncio.create_task( bidi_session.script.evaluate( expression="window.alert('test')", - target=ContextTarget(top_context["context"]), + target=ContextTarget(new_tab["context"]), await_promise=False, ) ) @@ -25,9 +30,7 @@ async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_con # Wait for prompt to appear. await wait_for_future_safe(on_entry) - await bidi_session.browsing_context.handle_user_prompt( - context=top_context["context"] - ) + await bidi_session.browsing_context.handle_user_prompt(context=new_tab["context"]) # Make sure that script returned. result = await task @@ -37,7 +40,12 @@ async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_con @pytest.mark.parametrize("accept", [True, False]) async def test_confirm( - bidi_session, wait_for_event, wait_for_future_safe, top_context, subscribe_events, accept + bidi_session, + wait_for_event, + wait_for_future_safe, + new_tab, + subscribe_events, + accept, ): await subscribe_events([USER_PROMPT_OPENED_EVENT]) on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) @@ -46,7 +54,7 @@ async def test_confirm( task = asyncio.create_task( bidi_session.script.evaluate( expression="window.confirm('test')", - target=ContextTarget(top_context["context"]), + target=ContextTarget(new_tab["context"]), await_promise=False, ) ) @@ -55,7 +63,7 @@ async def test_confirm( await wait_for_future_safe(on_entry) await bidi_session.browsing_context.handle_user_prompt( - context=top_context["context"], accept=accept + context=new_tab["context"], accept=accept ) # Check that return result of confirm is correct. @@ -66,7 +74,12 @@ async def test_confirm( @pytest.mark.parametrize("accept", [True, False]) async def test_prompt( - bidi_session, wait_for_event, wait_for_future_safe, top_context, subscribe_events, accept + bidi_session, + wait_for_event, + wait_for_future_safe, + new_tab, + subscribe_events, + accept, ): await subscribe_events([USER_PROMPT_OPENED_EVENT]) on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) @@ -75,7 +88,7 @@ async def test_prompt( task = asyncio.create_task( bidi_session.script.evaluate( expression="window.prompt('Enter Your Name: ')", - target=ContextTarget(top_context["context"]), + target=ContextTarget(new_tab["context"]), await_promise=False, ) ) @@ -85,7 +98,7 @@ async def test_prompt( test_user_text = "Test" await bidi_session.browsing_context.handle_user_prompt( - context=top_context["context"], accept=accept, user_text=test_user_text + context=new_tab["context"], accept=accept, user_text=test_user_text ) # Check that return result of prompt is correct. @@ -97,10 +110,69 @@ async def test_prompt( assert result == {"type": "null"} +@pytest.mark.parametrize("accept", [True, False]) +async def test_beforeunload( + bidi_session, + subscribe_events, + url, + new_tab, + setup_beforeunload_page, + wait_for_event, + wait_for_future_safe, + accept, +): + await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) + + on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) + + await setup_beforeunload_page(new_tab) + + page_target = url("/webdriver/tests/support/html/default.html") + navigated_future = await bidi_session.send_command( + "browsingContext.navigate", + { + "context": new_tab["context"], + "url": page_target, + "wait": "complete", + }, + ) + + # Wait for the prompt to open. + event = await wait_for_future_safe(on_entry) + + on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT) + + await bidi_session.browsing_context.handle_user_prompt( + context=new_tab["context"], accept=accept + ) + + # Wait for the prompt to be closed. + event = await wait_for_future_safe(on_prompt_closed) + + if accept: + # Check navigation to the target page. + navigated = await wait_for_future_safe(navigated_future) + assert navigated["url"] == page_target + else: + # If the beforeunload prompt was dismissed no navigation takes place. + with pytest.raises(TimeoutException): + await wait_for_future_safe(navigated_future, timeout=0.5) + + contexts = await bidi_session.browsing_context.get_tree( + root=new_tab["context"], max_depth=0 + ) + assert contexts[0]["url"] != page_target + + @pytest.mark.parametrize("type_hint", ["tab", "window"]) async def test_two_top_level_contexts( - bidi_session, top_context, inline, subscribe_events, wait_for_event, - wait_for_future_safe, type_hint + bidi_session, + new_tab, + inline, + subscribe_events, + wait_for_event, + wait_for_future_safe, + type_hint, ): new_context = await bidi_session.browsing_context.create(type_hint=type_hint) @@ -118,7 +190,7 @@ async def test_two_top_level_contexts( # Try to close the prompt in another context. with pytest.raises(error.NoSuchAlertException): await bidi_session.browsing_context.handle_user_prompt( - context=top_context["context"] + context=new_tab["context"] ) # Close the prompt in the correct context @@ -131,7 +203,7 @@ async def test_two_top_level_contexts( async def test_multiple_frames( bidi_session, - top_context, + new_tab, inline, test_page_multiple_frames, subscribe_events, @@ -142,12 +214,12 @@ async def test_multiple_frames( on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) await bidi_session.browsing_context.navigate( - context=top_context["context"], + context=new_tab["context"], url=test_page_multiple_frames, wait="complete", ) - contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"]) + contexts = await bidi_session.browsing_context.get_tree(root=new_tab["context"]) assert len(contexts) == 1 assert len(contexts[0]["children"]) == 2 diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py new file mode 100644 index 00000000000..c4c51603619 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py @@ -0,0 +1,47 @@ +import pytest + +pytestmark = pytest.mark.asyncio + +USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed" +USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" + + +@pytest.mark.parametrize("accept", [False, True]) +async def test_beforeunload( + bidi_session, + url, + new_tab, + subscribe_events, + setup_beforeunload_page, + wait_for_event, + wait_for_future_safe, + accept, +): + await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) + await setup_beforeunload_page(new_tab) + + on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) + + await bidi_session.send_command( + "browsingContext.navigate", + { + "context": new_tab["context"], + "url": url("/webdriver/tests/support/html/default.html"), + }, + ) + + # Wait for prompt to appear. + await wait_for_future_safe(on_entry) + + on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT) + + await bidi_session.browsing_context.handle_user_prompt( + context=new_tab["context"], accept=accept + ) + + # Just make sure the prompt is closed. + event = await wait_for_future_safe(on_prompt_closed) + assert event == { + "context": new_tab["context"], + "accepted": accept, + } diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py index 68a0eed1922..a8ab1490c46 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py @@ -8,7 +8,9 @@ USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed" USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" -async def test_unsubscribe(bidi_session, inline, new_tab, wait_for_event, wait_for_future_safe): +async def test_unsubscribe( + bidi_session, inline, new_tab, wait_for_event, wait_for_future_safe +): await bidi_session.session.subscribe( events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT] ) @@ -43,8 +45,13 @@ async def test_unsubscribe(bidi_session, inline, new_tab, wait_for_event, wait_f remove_listener() -async def test_subscribe_with_alert( - bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe +async def test_prompt_type_alert( + bidi_session, + subscribe_events, + inline, + new_tab, + wait_for_event, + wait_for_future_safe, ): await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) @@ -64,12 +71,21 @@ async def test_subscribe_with_alert( event = await wait_for_future_safe(on_prompt_closed) - assert event == {"context": new_tab["context"], "accepted": True} + assert event == { + "context": new_tab["context"], + "accepted": True, + } @pytest.mark.parametrize("accept", [True, False]) -async def test_subscribe_with_confirm( - bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe, accept +async def test_prompt_type_confirm( + bidi_session, + subscribe_events, + inline, + new_tab, + wait_for_event, + wait_for_future_safe, + accept, ): await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) @@ -91,12 +107,21 @@ async def test_subscribe_with_confirm( event = await wait_for_future_safe(on_prompt_closed) - assert event == {"context": new_tab["context"], "accepted": accept} + assert event == { + "context": new_tab["context"], + "accepted": accept, + } @pytest.mark.parametrize("accept", [True, False]) -async def test_subscribe_with_prompt( - bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe, accept +async def test_prompt_type_prompt( + bidi_session, + subscribe_events, + inline, + new_tab, + wait_for_event, + wait_for_future_safe, + accept, ): await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) @@ -126,11 +151,19 @@ async def test_subscribe_with_prompt( "userText": test_user_text, } else: - assert event == {"context": new_tab["context"], "accepted": accept} + assert event == { + "context": new_tab["context"], + "accepted": accept, + } -async def test_subscribe_with_prompt_with_defaults( - bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe +async def test_prompt_with_defaults( + bidi_session, + subscribe_events, + inline, + new_tab, + wait_for_event, + wait_for_future_safe, ): await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) @@ -146,18 +179,24 @@ async def test_subscribe_with_prompt_with_defaults( on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT) - await bidi_session.browsing_context.handle_user_prompt( - context=new_tab["context"] - ) + await bidi_session.browsing_context.handle_user_prompt(context=new_tab["context"]) event = await wait_for_future_safe(on_prompt_closed) - assert event == {"context": new_tab["context"], "accepted": True} + assert event == { + "context": new_tab["context"], + "accepted": True, + } @pytest.mark.parametrize("type_hint", ["tab", "window"]) async def test_subscribe_to_one_context( - bidi_session, subscribe_events, inline, wait_for_event, wait_for_future_safe, type_hint + bidi_session, + subscribe_events, + inline, + wait_for_event, + wait_for_future_safe, + type_hint, ): new_context = await bidi_session.browsing_context.create(type_hint=type_hint) @@ -261,10 +300,11 @@ async def test_iframe( await wait_for_future_safe(on_prompt_opened) - await bidi_session.browsing_context.handle_user_prompt( - context=frame["context"] - ) + await bidi_session.browsing_context.handle_user_prompt(context=frame["context"]) event = await wait_for_future_safe(on_prompt_closed) - assert event == {"context": new_tab["context"], "accepted": True} + assert event == { + "context": new_tab["context"], + "accepted": True, + } diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py new file mode 100644 index 00000000000..782cc766507 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py @@ -0,0 +1,45 @@ +import pytest + +from .. import ( + any_string, + recursive_compare, +) + + +pytestmark = pytest.mark.asyncio + +USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" + + +async def test_beforeunload( + bidi_session, + subscribe_events, + url, + new_tab, + setup_beforeunload_page, + wait_for_event, + wait_for_future_safe, +): + await subscribe_events(events=[USER_PROMPT_OPENED_EVENT]) + on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) + + await setup_beforeunload_page(new_tab) + + await bidi_session.send_command( + "browsingContext.navigate", + { + "context": new_tab["context"], + "url": url("/webdriver/tests/support/html/default.html"), + }, + ) + + event = await wait_for_future_safe(on_entry) + + recursive_compare( + { + "context": new_tab["context"], + "type": "beforeunload", + "message": any_string, + }, + event, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py index c37bb66e4e9..e4e633e4564 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py @@ -2,6 +2,7 @@ import pytest from tests.support.sync import AsyncPoll from webdriver.error import TimeoutException + pytestmark = pytest.mark.asyncio USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" @@ -35,7 +36,13 @@ async def test_unsubscribe(bidi_session, inline, new_tab): @pytest.mark.parametrize("prompt_type", ["alert", "confirm", "prompt"]) async def test_prompt_type( - bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe, prompt_type + bidi_session, + subscribe_events, + inline, + new_tab, + wait_for_event, + wait_for_future_safe, + prompt_type, ): await subscribe_events(events=[USER_PROMPT_OPENED_EVENT]) on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) @@ -53,17 +60,23 @@ async def test_prompt_type( "context": new_tab["context"], "type": prompt_type, "message": text, - **({ - "defaultValue": "" - } if prompt_type == 'prompt' else {}) + **({"defaultValue": ""} if prompt_type == "prompt" else {}), } @pytest.mark.parametrize( - "default", [None, "", "default"], ids=["undefined", "empty string", "non empty string"] + "default", + [None, "", "default"], + ids=["undefined", "empty string", "non empty string"], ) async def test_prompt_default_value( - bidi_session, inline, new_tab, subscribe_events, wait_for_event, wait_for_future_safe, default + bidi_session, + inline, + new_tab, + subscribe_events, + wait_for_event, + wait_for_future_safe, + default, ): await subscribe_events(events=[USER_PROMPT_OPENED_EVENT]) on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT) @@ -98,7 +111,12 @@ async def test_prompt_default_value( @pytest.mark.parametrize("type_hint", ["tab", "window"]) async def test_subscribe_to_one_context( - bidi_session, subscribe_events, inline, wait_for_event, wait_for_future_safe, type_hint + bidi_session, + subscribe_events, + inline, + wait_for_event, + wait_for_future_safe, + type_hint, ): new_context = await bidi_session.browsing_context.create(type_hint=type_hint) await subscribe_events( diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py index c1b4c1dd54b..319d90d3def 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py @@ -318,6 +318,8 @@ HTTP_STATUS_AND_STATUS_TEXT = [ (505, "HTTP Version Not Supported"), ] +PAGE_DATA_URL_HTML = "data:text/html,<div>foo</div>" +PAGE_DATA_URL_IMAGE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=" PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" PAGE_EMPTY_IMAGE = "/webdriver/tests/bidi/network/support/empty.png" PAGE_EMPTY_SCRIPT = "/webdriver/tests/bidi/network/support/empty.js" diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py index 22588b7013a..3ef51b2d61c 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py @@ -8,6 +8,8 @@ from tests.support.sync import AsyncPoll from .. import ( assert_before_request_sent_event, + PAGE_DATA_URL_HTML, + PAGE_DATA_URL_IMAGE, PAGE_EMPTY_HTML, PAGE_EMPTY_TEXT, PAGE_REDIRECT_HTTP_EQUIV, @@ -459,3 +461,55 @@ async def test_url_with_fragment( expected_request={"method": "GET", "url": fragment_url}, redirect_count=0, ) + + +@pytest.mark.parametrize( + "page_url", + [PAGE_DATA_URL_HTML, PAGE_DATA_URL_IMAGE], + ids=["html", "image"], +) +@pytest.mark.asyncio +async def test_navigate_data_url( + bidi_session, top_context, wait_for_event, wait_for_future_safe, setup_network_test, page_url +): + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] + + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=page_url, wait="complete" + ) + await wait_for_future_safe(on_before_request_sent) + + assert len(events) == 1 + + assert_before_request_sent_event( + events[0], + expected_request={"method": "GET", "url": page_url}, + redirect_count=0, + ) + + +@pytest.mark.parametrize( + "fetch_url", + [PAGE_DATA_URL_HTML, PAGE_DATA_URL_IMAGE], + ids=["html", "image"], +) +@pytest.mark.asyncio +async def test_fetch_data_url( + wait_for_event, wait_for_future_safe, fetch, setup_network_test, fetch_url +): + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] + + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) + await fetch(fetch_url, method="GET") + await wait_for_future_safe(on_before_request_sent) + + assert len(events) == 1 + + assert_before_request_sent_event( + events[0], + expected_request={"method": "GET", "url": fetch_url}, + redirect_count=0, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py index 30b35ef7e0d..51333a0195f 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py @@ -10,6 +10,8 @@ from tests.support.sync import AsyncPoll from .. import ( assert_response_event, HTTP_STATUS_AND_STATUS_TEXT, + PAGE_DATA_URL_HTML, + PAGE_DATA_URL_IMAGE, PAGE_EMPTY_HTML, PAGE_EMPTY_IMAGE, PAGE_EMPTY_SCRIPT, @@ -442,3 +444,77 @@ async def test_url_with_fragment( expected_response={"url": fragment_url}, redirect_count=0, ) + + +@pytest.mark.parametrize( + "page_url, mimeType", + [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")], + ids=["html", "image"], +) +@pytest.mark.asyncio +async def test_navigate_data_url( + bidi_session, top_context, wait_for_event, wait_for_future_safe, setup_network_test, page_url, mimeType +): + network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT]) + events = network_events[RESPONSE_COMPLETED_EVENT] + + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=page_url, wait="complete" + ) + await wait_for_future_safe(on_response_completed) + + assert len(events) == 1 + + assert_response_event( + events[0], + expected_request={"method": "GET", "url": page_url}, + expected_response={ + "headers": [{ + "name": "Content-Type", + "value": {"type": "string", "value": mimeType} + }], + "mimeType": mimeType, + "protocol": "data", + "status": 200, + "statusText": "OK", + "url": page_url, + }, + redirect_count=0, + ) + + +@pytest.mark.parametrize( + "fetch_url, mimeType", + [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")], + ids=["html", "image"], +) +@pytest.mark.asyncio +async def test_fetch_data_url( + wait_for_event, wait_for_future_safe, fetch, setup_network_test, fetch_url, mimeType +): + network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT]) + events = network_events[RESPONSE_COMPLETED_EVENT] + + on_before_request_sent = wait_for_event(RESPONSE_COMPLETED_EVENT) + await fetch(fetch_url, method="GET") + await wait_for_future_safe(on_before_request_sent) + + assert len(events) == 1 + + assert_response_event( + events[0], + expected_request={"method": "GET", "url": fetch_url}, + expected_response={ + "headers": [{ + "name": "Content-Type", + "value": {"type": "string", "value": mimeType} + }], + "mimeType": mimeType, + "protocol": "data", + "status": 200, + "statusText": "OK", + "url": fetch_url, + }, + redirect_count=0, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py index 030d9168a1d..17ec9ffe31b 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py @@ -9,6 +9,8 @@ from tests.support.sync import AsyncPoll from .. import ( assert_response_event, HTTP_STATUS_AND_STATUS_TEXT, + PAGE_DATA_URL_HTML, + PAGE_DATA_URL_IMAGE, PAGE_EMPTY_HTML, PAGE_EMPTY_IMAGE, PAGE_EMPTY_SCRIPT, @@ -411,3 +413,77 @@ async def test_url_with_fragment( expected_response={"url": fragment_url}, redirect_count=0, ) + + +@pytest.mark.parametrize( + "page_url, mimeType", + [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")], + ids=["html", "image"], +) +@pytest.mark.asyncio +async def test_navigate_data_url( + bidi_session, top_context, wait_for_event, wait_for_future_safe, setup_network_test, page_url, mimeType +): + network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT]) + events = network_events[RESPONSE_STARTED_EVENT] + + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=page_url, wait="complete" + ) + await wait_for_future_safe(on_response_started) + + assert len(events) == 1 + + assert_response_event( + events[0], + expected_request={"method": "GET", "url": page_url}, + expected_response={ + "headers": [{ + "name": "Content-Type", + "value": {"type": "string", "value": mimeType} + }], + "mimeType": mimeType, + "protocol": "data", + "status": 200, + "statusText": "OK", + "url": page_url, + }, + redirect_count=0, + ) + + +@pytest.mark.parametrize( + "fetch_url, mimeType", + [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")], + ids=["html", "image"], +) +@pytest.mark.asyncio +async def test_fetch_data_url( + wait_for_event, wait_for_future_safe, fetch, setup_network_test, fetch_url, mimeType +): + network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT]) + events = network_events[RESPONSE_STARTED_EVENT] + + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) + await fetch(fetch_url, method="GET") + await wait_for_future_safe(on_response_started) + + assert len(events) == 1 + + assert_response_event( + events[0], + expected_request={"method": "GET", "url": fetch_url}, + expected_response={ + "headers": [{ + "name": "Content-Type", + "value": {"type": "string", "value": mimeType} + }], + "mimeType": mimeType, + "protocol": "data", + "status": 200, + "statusText": "OK", + "url": fetch_url, + }, + redirect_count=0, + ) diff --git a/tests/wpt/tests/webdriver/tests/classic/close_window/close.py b/tests/wpt/tests/webdriver/tests/classic/close_window/close.py index 680f471839c..f606e957d41 100644 --- a/tests/wpt/tests/webdriver/tests/classic/close_window/close.py +++ b/tests/wpt/tests/webdriver/tests/classic/close_window/close.py @@ -45,29 +45,24 @@ def test_close_browsing_context(session): assert new_handle not in handles -def test_close_browsing_context_with_dismissed_beforeunload_prompt(session, inline): +@pytest.mark.parametrize("type", ["tab", "window"]) +def test_close_browsing_context_with_accepted_beforeunload_prompt(session, url, type): original_handles = session.handles - new_handle = session.new_window() + new_handle = session.new_window(type_hint=type) session.window_handle = new_handle - session.url = inline(""" - <input type="text"> - <script> - window.addEventListener("beforeunload", function (event) { - event.preventDefault(); - }); - </script> - """) + session.url = url("/webdriver/tests/support/html/beforeunload.html") - session.find.css("input", all=False).send_keys("foo") + element = session.find.css("input", all=False) + element.send_keys("bar") response = close(session) handles = assert_success(response, original_handles) assert session.handles == original_handles assert new_handle not in handles - # A beforeunload prompt has to be automatically dismissed + # A beforeunload prompt has to be automatically accepted with pytest.raises(error.NoSuchWindowException): session.alert.text diff --git a/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py b/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py index a3032cc1347..3721ea28e28 100644 --- a/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py +++ b/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py @@ -18,22 +18,15 @@ def test_null_response_value(session): session.end() -def test_dismissed_beforeunload_prompt(session, inline): - session.url = inline(""" - <input type="text"> - <script> - window.addEventListener("beforeunload", function (event) { - event.preventDefault(); - }); - </script> - """) +def test_accepted_beforeunload_prompt(session, url): + session.url = url("/webdriver/tests/support/html/beforeunload.html") session.find.css("input", all=False).send_keys("foo") response = delete_session(session) assert_success(response) - # A beforeunload prompt has to be automatically dismissed, and the session deleted + # A beforeunload prompt has to be automatically accepted, and the session deleted with pytest.raises(error.InvalidSessionIdException): session.alert.text diff --git a/tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py b/tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py new file mode 100644 index 00000000000..1e47f690676 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py @@ -0,0 +1,117 @@ +import asyncio +import pytest +import pytest_asyncio +from webdriver.error import NoSuchAlertException + +from tests.support.sync import AsyncPoll + +from ..bidi import ( + any_string, + recursive_compare, +) + + +pytestmark = pytest.mark.asyncio + +USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed" +USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened" + + +@pytest_asyncio.fixture +async def check_beforeunload_not_implicitly_accepted( + bidi_session, + current_session, + setup_beforeunload_page, + subscribe_events, + wait_for_event, + wait_for_future_safe, + new_tab, + execute_as_async, + url, +): + async def check_beforeunload_not_implicitly_accepted(accept): + current_session.window_handle = new_tab["context"] + + page_beforeunload = await setup_beforeunload_page(new_tab) + page_target = url("/webdriver/tests/support/html/default.html") + + on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT) + on_prompt_opened = wait_for_event(USER_PROMPT_OPENED_EVENT) + + await subscribe_events([USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]) + + # Using WebDriver classic's navigation command to navigate away from + # the page will hang and wait for the beforeunload dialog to close. + # As such start the command immediately as task but await for it later + # when BiDi closed the prompt. + def sync_navigate(): + current_session.url = page_target + + task_navigate = asyncio.create_task(execute_as_async(sync_navigate)) + opened_event = await wait_for_future_safe(on_prompt_opened) + + recursive_compare( + { + "context": new_tab["context"], + "type": "beforeunload", + "message": any_string, + }, + opened_event, + ) + + # Close the beforeunload prompt and wait for the navigation to finish. + await bidi_session.browsing_context.handle_user_prompt( + context=new_tab["context"], accept=accept + ) + closed_event = await wait_for_future_safe(on_prompt_closed) + await task_navigate + + # Check that the beforeunload prompt is closed and the event was sent. + with pytest.raises(NoSuchAlertException): + current_session.alert.text + + recursive_compare( + { + "accepted": accept, + "context": new_tab["context"], + "type": "beforeunload", + }, + closed_event, + ) + + if accept: + assert current_session.url == page_target + else: + assert current_session.url == page_beforeunload + + return check_beforeunload_not_implicitly_accepted + + +@pytest.mark.capabilities({"unhandledPromptBehavior": "accept"}) +@pytest.mark.parametrize("accept", [False, True]) +async def test_accept(check_beforeunload_not_implicitly_accepted, accept): + await check_beforeunload_not_implicitly_accepted(accept) + + +@pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"}) +@pytest.mark.parametrize("accept", [False, True]) +async def test_accept_and_notify(check_beforeunload_not_implicitly_accepted, accept): + await check_beforeunload_not_implicitly_accepted(accept) + + +@pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"}) +@pytest.mark.parametrize("accept", [False, True]) +async def test_dismiss(check_beforeunload_not_implicitly_accepted, accept): + await check_beforeunload_not_implicitly_accepted(accept) + + +@pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"}) +@pytest.mark.parametrize("accept", [False, True]) +async def test_dismiss_and_notify(check_beforeunload_not_implicitly_accepted, accept): + await check_beforeunload_not_implicitly_accepted(accept) + + +@pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"}) +@pytest.mark.parametrize("accept", [False, True]) +async def test_ignore(check_beforeunload_not_implicitly_accepted, accept): + await check_beforeunload_not_implicitly_accepted(accept) diff --git a/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py b/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py index a9cefd004b1..3e97cfe3ce4 100644 --- a/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py +++ b/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py @@ -17,6 +17,7 @@ from webdriver.bidi.error import ( UnableToSetCookieException, UnderspecifiedStoragePartitionException ) +from webdriver.bidi.modules.input import Actions from webdriver.bidi.modules.script import ContextTarget from webdriver.error import TimeoutException @@ -46,6 +47,16 @@ async def add_preload_script(bidi_session): @pytest_asyncio.fixture +async def execute_as_async(bidi_session): + async def execute_as_async(sync_func, **kwargs): + # Ideally we should use asyncio.to_thread() but it's not available in + # Python 3.8 which wpt tests have to support. + return await bidi_session.event_loop.run_in_executor(None, sync_func, **kwargs) + + return execute_as_async + + +@pytest_asyncio.fixture async def subscribe_events(bidi_session): subscriptions = [] @@ -149,7 +160,7 @@ def wait_for_future_safe(configuration): asyncio.shield(future), timeout=timeout * configuration["timeout_multiplier"], ) - except asyncio.exceptions.TimeoutError: + except asyncio.TimeoutError: raise TimeoutException("Future did not resolve within the given timeout") return wait_for_future_safe @@ -573,6 +584,37 @@ def fetch(bidi_session, top_context, configuration): @pytest_asyncio.fixture +async def setup_beforeunload_page(bidi_session, url): + async def setup_beforeunload_page(context): + page_url = url("/webdriver/tests/support/html/beforeunload.html") + await bidi_session.browsing_context.navigate( + context=context["context"], + url=page_url, + wait="complete" + ) + + # Focus the input + await bidi_session.script.evaluate( + expression=""" + const input = document.querySelector("input"); + input.focus(); + """, + target=ContextTarget(context["context"]), + await_promise=False, + ) + + actions = Actions() + actions.add_key().send_keys("foo") + await bidi_session.input.perform_actions( + actions=actions, context=context["context"] + ) + + return page_url + + return setup_beforeunload_page + + +@pytest_asyncio.fixture async def setup_network_test( bidi_session, subscribe_events, diff --git a/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js b/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js index c7d341a9d5a..2a3eaa1c202 100644 --- a/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js +++ b/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js @@ -113,7 +113,7 @@ const tests = [ ] }, { - name: '[lstm] DataError is expected if hiddenSize equals to zero', + name: '[lstm] TypeError is expected if hiddenSize equals to zero', input: kExampleInputDescriptor, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -121,7 +121,7 @@ const tests = [ hiddenSize: 0 }, { - name: '[lstm] DataError is expected if hiddenSize is too large', + name: '[lstm] TypeError is expected if hiddenSize is too large', input: kExampleInputDescriptor, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -129,7 +129,7 @@ const tests = [ hiddenSize: 4294967295, }, { - name: '[lstm] DataError is expected if steps equals to zero', + name: '[lstm] TypeError is expected if steps equals to zero', input: kExampleInputDescriptor, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -138,7 +138,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the data type is not one of the floating point types', + '[lstm] TypeError is expected if the data type is not one of the floating point types', input: {dataType: 'uint32', dimensions: kValidInputDimensions}, weight: {dataType: 'uint32', dimensions: kValidWeightDimensions}, recurrentWeight: @@ -147,7 +147,7 @@ const tests = [ hiddenSize: hiddenSize }, { - name: '[lstm] DataError is expected if the rank of input is not 3', + name: '[lstm] TypeError is expected if the rank of input is not 3', input: {dataType: 'float32', dimensions: [steps, batchSize]}, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -156,7 +156,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if input.dimensions[0] is not equal to steps', + '[lstm] TypeError is expected if input.dimensions[0] is not equal to steps', input: {dataType: 'float32', dimensions: [1000, batchSize, inputSize]}, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -164,7 +164,7 @@ const tests = [ hiddenSize: hiddenSize }, { - name: '[lstm] DataError is expected if the shape of weight is incorrect', + name: '[lstm] TypeError is expected if the shape of weight is incorrect', input: kExampleInputDescriptor, weight: { dataType: 'float32', @@ -176,7 +176,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the rank of recurrentWeight is not 3', + '[lstm] TypeError is expected if the rank of recurrentWeight is not 3', input: kExampleInputDescriptor, weight: kExampleWeightDescriptor, recurrentWeight: @@ -186,7 +186,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the size of options.activations is not 3', + '[lstm] TypeError is expected if the size of options.activations is not 3', input: kExampleInputDescriptor, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -195,7 +195,7 @@ const tests = [ options: {activations: ['sigmoid', 'tanh']} }, { - name: '[lstm] DataError is expected if the rank of options.bias is not 2', + name: '[lstm] TypeError is expected if the rank of options.bias is not 2', input: {dataType: 'float16', dimensions: kValidInputDimensions}, weight: {dataType: 'float16', dimensions: kValidWeightDimensions}, recurrentWeight: @@ -206,7 +206,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the shape of options.recurrentBias.dimensions is incorrect', + '[lstm] TypeError is expected if the shape of options.recurrentBias.dimensions is incorrect', input: {dataType: 'float16', dimensions: kValidInputDimensions}, weight: {dataType: 'float16', dimensions: kValidWeightDimensions}, recurrentWeight: @@ -219,7 +219,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the dataType of options.peepholeWeight is incorrect', + '[lstm] TypeError is expected if the dataType of options.peepholeWeight is incorrect', input: {dataType: 'float16', dimensions: kValidInputDimensions}, weight: {dataType: 'float16', dimensions: kValidWeightDimensions}, recurrentWeight: @@ -233,7 +233,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the dataType of options.initialHiddenState is incorrect', + '[lstm] TypeError is expected if the dataType of options.initialHiddenState is incorrect', input: {dataType: 'float16', dimensions: kValidInputDimensions}, weight: {dataType: 'float16', dimensions: kValidWeightDimensions}, recurrentWeight: @@ -249,7 +249,7 @@ const tests = [ }, { name: - '[lstm] DataError is expected if the shape of options.initialCellState is incorrect', + '[lstm] TypeError is expected if the shape of options.initialCellState is incorrect', input: kExampleInputDescriptor, weight: kExampleWeightDescriptor, recurrentWeight: kExampleRecurrentWeightDescriptor, @@ -333,8 +333,8 @@ tests.forEach( assert_array_equals(outputs[i].shape(), test.outputs[i].dimensions); } } else { - assert_throws_dom( - 'DataError', + assert_throws_js( + TypeError, () => builder.lstm( input, weight, recurrentWeight, test.steps, test.hiddenSize, options)); diff --git a/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js b/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js index ee8958659c7..59694a42603 100644 --- a/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js +++ b/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js @@ -12,6 +12,6 @@ promise_test(async t => { assert_throws_js(TypeError, () => builder.triangular(input)); } } -}, "[triangular] DataError is expected if input's rank is less than 2"); +}, "[triangular] TypeError is expected if input's rank is less than 2"); validateInputFromAnotherBuilder('triangular'); diff --git a/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html b/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html index 7047ce7d1f3..14ec74b66a0 100644 --- a/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html +++ b/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html @@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="dictionary-helper.js"></script> +<script src="RTCPeerConnection-helper.js"></script> <script src="RTCRtpParameters-helper.js"></script> <script> 'use strict'; @@ -70,4 +71,31 @@ assert_greater_than(param.headerExtensions.length, 0); assert_greater_than(param.codecs.length, 0); }, 'getParameters() with simulcast video receiver'); + + promise_test(async t => { + const stream = await getNoiseStream({video: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + const [track] = stream.getTracks(); + const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close()); + caller.addTrack(track); + const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close()); + callee.addTrack(track); + var callerReceiver = caller.getTransceivers()[0].receiver; + assert_equals(callerReceiver.getParameters().codecs.length, 0); + const offer = await caller.createOffer(); + await caller.setLocalDescription(offer); + await callee.setRemoteDescription(offer); + var calleeReceiver = callee.getTransceivers()[0].receiver; + assert_equals(calleeReceiver.getParameters().codecs.length, 0); + const answer = await callee.createAnswer(); + await callee.setLocalDescription(answer); + assert_greater_than(calleeReceiver.getParameters().codecs.length, 0, + "callee codecs after answer"); + await caller.setRemoteDescription(answer); + assert_greater_than(callerReceiver.getParameters().codecs.length, 0, + "caller codecs after answer"); + }, 'getParameters() surfaces codecs on two-way receiver at the right time'); + </script> diff --git a/tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html b/tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html new file mode 100644 index 00000000000..6c47153c836 --- /dev/null +++ b/tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html @@ -0,0 +1,40 @@ +<!doctype html> +<meta charset=utf-8> +<title>RTCRtpSender.prototype.getParameters</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="dictionary-helper.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script src="RTCRtpParameters-helper.js"></script> +<script> + 'use strict'; + +promise_test(async t => { + const stream = await getNoiseStream({video: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + const [track] = stream.getTracks(); + const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close()); + caller.addTrack(track); + const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close()); + callee.addTrack(track); + var callerSender = caller.getTransceivers()[0].sender; + assert_equals(callerSender.getParameters().codecs.length, 0); + const offer = await caller.createOffer(); + await caller.setLocalDescription(offer); + await callee.setRemoteDescription(offer); + // Check that it is a single 2-way transceiver. + assert_equals(callee.getTransceivers().length, 1); + var calleeSender = callee.getTransceivers()[0].sender; + assert_equals(calleeSender.getParameters().codecs.length, 0); + const answer = await callee.createAnswer(); + await callee.setLocalDescription(answer); + assert_greater_than(calleeSender.getParameters().codecs.length, 0, + "callee codecs after answer"); + await caller.setRemoteDescription(answer); + assert_greater_than(callerSender.getParameters().codecs.length, 0, + "caller codecs after answer"); +}, 'getParameters() surfaces codecs on two-way sender with addTrack at the right time'); + +</script> diff --git a/tests/wpt/tests/webusb/usbDevice.https.any.js b/tests/wpt/tests/webusb/usbDevice.https.any.js index 804af2afb9d..a716e847c41 100644 --- a/tests/wpt/tests/webusb/usbDevice.https.any.js +++ b/tests/wpt/tests/webusb/usbDevice.https.any.js @@ -1279,28 +1279,60 @@ usb_test(async (t) => { }, 'isochronousTransferOut rejects when packet lengths exceed buffer size'); usb_test(async (t) => { - const PACKET_COUNT = 2; - const PACKET_LENGTH = 8; - const {device, fakeDevice} = await getFakeDevice(); + const {device} = await getFakeDevice(); await device.open(); await device.selectConfiguration(2); await device.claimInterface(0); await device.selectAlternateInterface(0, 1); - const packetLengths = [0xffffffff, 1]; + const packetLengths = [33554432, 1]; await promise_rejects_dom( t, 'DataError', device.isochronousTransferIn(1, packetLengths)); }, 'isochronousTransferIn rejects when packet lengths exceed maximum size'); usb_test(async (t) => { - const PACKET_COUNT = 2; - const PACKET_LENGTH = 8; - const {device, fakeDevice} = await getFakeDevice(); + const {device} = await getFakeDevice(); await device.open(); await device.selectConfiguration(2); await device.claimInterface(0); await device.selectAlternateInterface(0, 1); - const buffer = new Uint8Array(PACKET_LENGTH * PACKET_COUNT); - const packetLengths = [0xffffffff, 1]; + const buffer = new Uint8Array(33554432 + 1); + const packetLengths = [33554432, 1]; await promise_rejects_dom( t, 'DataError', device.isochronousTransferOut(1, buffer, packetLengths)); }, 'isochronousTransferOut rejects when packet lengths exceed maximum size'); + +usb_test(async (t) => { + const {device} = await getFakeDevice(); + await device.open(); + await device.selectConfiguration(2); + await device.claimInterface(0); + await device.selectAlternateInterface(0, 1); + await promise_rejects_dom( + t, 'DataError', device.transferIn(1, 33554433)); +}, 'transferIn rejects when packet lengths exceed maximum size'); + +usb_test(async (t) => { + const {device} = await getFakeDevice(); + await device.open(); + await device.selectConfiguration(2); + await device.claimInterface(0); + await device.selectAlternateInterface(0, 1); + await promise_rejects_dom( + t, 'DataError', device.transferOut(1, new ArrayBuffer(33554433))); +}, 'transferOut rejects when packet lengths exceed maximum size'); + +usb_test(async (t) => { + const {device} = await getFakeDevice(); + await device.open(); + await device.selectConfiguration(2); + await device.claimInterface(0); + await device.selectAlternateInterface(0, 1); + await promise_rejects_dom( + t, 'DataError', device.controlTransferOut({ + requestType: 'vendor', + recipient: 'device', + request: 0x42, + value: 0x1234, + index: 0x5678 + }, new ArrayBuffer(33554433))); +}, 'controlTransferOut rejects when packet lengths exceed maximum size'); |