Update web-platform-tests to revision b'a1dcc969c7db5ac73d9b9eeb349949e7e639f3fd'

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
This commit is contained in:
Servo WPT Sync 2025-06-01 01:35:16 +00:00 committed by WPT Sync Bot
parent 568d24d4e3
commit 5e6f2b9d6f
225 changed files with 6315 additions and 2054 deletions

File diff suppressed because it is too large Load diff

View file

@ -78,3 +78,6 @@
[corner-shape-render-fuzzy.html?border-radius=50%&corner-top-right-shape=scoop&corner-bottom-left-shape=scoop&corner-top-left-shape=notch&corner-bottom-right-shape=notch&border-width=10px]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(0.8)&border-radius=40px&border-width=10px]
expected: FAIL

View file

@ -90,3 +90,12 @@
[corner-shape-render-precise.html?corner-shape=superellipse(-2)&border-top-left-radius=40%&border-width=20px]
expected: FAIL
[corner-shape-render-precise.html?corner-top-left-shape=bevel&border-width=10px]
expected: FAIL
[corner-shape-render-precise.html?corner-shape=notch&border-radius=30px&border-width=30px]
expected: FAIL
[corner-shape-render-precise.html?corner-top-right-shape=bevel&border-width=10px]
expected: FAIL

View file

@ -0,0 +1,3 @@
[style-query-registered-custom-rem-change.html]
[Changing the :root font-size to 10px makes 1rem * 10 evaluate to 100px]
expected: FAIL

View file

@ -0,0 +1,2 @@
[grid-gap-decorations-040.html]
expected: FAIL

View file

@ -1,3 +0,0 @@
[grid-content-alignment-with-abspos-001.html]
[.grid 1]
expected: FAIL

View file

@ -0,0 +1,2 @@
[clip-path-shape-011.html]
expected: FAIL

View file

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

View file

@ -0,0 +1,2 @@
[responsive-iframe-cross-origin.sub.tentative.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[responsive-iframe.tentative.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[text-autospace-vs-001.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[word-break-keep-all-u002d.html]
expected: FAIL

View file

@ -442,3 +442,126 @@
[CSS Values and Units Test: CSS inline if() function 147]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 148]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 149]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 150]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 151]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 152]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 153]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 154]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 155]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 156]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 157]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 158]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 159]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 160]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 161]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 162]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 163]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 164]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 165]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 166]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 167]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 168]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 169]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 170]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 171]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 172]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 173]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 174]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 175]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 176]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 177]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 178]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 179]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 180]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 181]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 182]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 183]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 184]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 185]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 186]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 187]
expected: FAIL
[CSS Values and Units Test: CSS inline if() function 188]
expected: FAIL

View file

@ -0,0 +1,12 @@
[sibling-function-container-query-invalidation.html]
[sibling-index() in @container width query matching after removal]
expected: FAIL
[sibling-count() in @container width query matching after removal]
expected: FAIL
[sibling-index() in @container style() query matching after removal]
expected: FAIL
[sibling-count() in @container style() query matching after removal]
expected: FAIL

View file

@ -52,3 +52,9 @@
[Removing a preceding sibling of #target reduces the sibling-index() for --color]
expected: FAIL
[Initially, the sibling-index() is 3 for --list]
expected: FAIL
[Removing a preceding sibling of #target reduces the sibling-index() for --list]
expected: FAIL

View file

@ -1,3 +1,42 @@
[idlharness.window.html]
[idl_test setup]
expected: FAIL
[idl_test validation]
expected: FAIL
[Partial interface CustomElementRegistry: member names are unique]
expected: FAIL
[Partial interface HTMLTemplateElement: member names are unique]
expected: FAIL
[Partial interface Element: member names are unique]
expected: FAIL
[Partial dictionary ShadowRootInit: member names are unique]
expected: FAIL
[Partial dictionary ElementCreationOptions: member names are unique]
expected: FAIL
[Document includes DocumentOrShadowRoot: member names are unique]
expected: FAIL
[ShadowRoot includes DocumentOrShadowRoot: member names are unique]
expected: FAIL
[HTMLTemplateElement interface: attribute shadowRootCustomElementRegistry]
expected: FAIL
[CustomElementRegistry interface: operation initialize(Node)]
expected: FAIL
[Document interface: attribute customElementRegistry]
expected: FAIL
[ShadowRoot interface: attribute customElementRegistry]
expected: FAIL
[Element interface: attribute customElementRegistry]
expected: FAIL

View file

@ -1,3 +1,15 @@
[bad-br-body.https.any.html]
[Consuming the body of a resource with bad br content with arrayBuffer() should reject]
expected: FAIL
[Consuming the body of a resource with bad br content with blob() should reject]
expected: FAIL
[Consuming the body of a resource with bad br content with bytes() should reject]
expected: FAIL
[Consuming the body of a resource with bad br content with json() should reject]
expected: FAIL
[Consuming the body of a resource with bad br content with text() should reject]
expected: FAIL

View file

@ -11,6 +11,9 @@
[Consuming the body of a resource with bad gzip content with text() should reject]
expected: FAIL
[Consuming the body of a resource with bad gzip content with bytes() should reject]
expected: FAIL
[bad-gzip-body.any.worker.html]
[Consuming the body of a resource with bad gzip content with arrayBuffer() should reject]
@ -25,6 +28,9 @@
[Consuming the body of a resource with bad gzip content with text() should reject]
expected: FAIL
[Consuming the body of a resource with bad gzip content with bytes() should reject]
expected: FAIL
[bad-gzip-body.any.serviceworker.html]
expected: ERROR

View file

@ -11,6 +11,9 @@
[Consuming the body of a resource with bad zstd content with text() should reject]
expected: FAIL
[Consuming the body of a resource with bad zstd content with bytes() should reject]
expected: FAIL
[bad-zstd-body.https.any.worker.html]
[Consuming the body of a resource with bad zstd content with arrayBuffer() should reject]
@ -25,6 +28,9 @@
[Consuming the body of a resource with bad zstd content with text() should reject]
expected: FAIL
[Consuming the body of a resource with bad zstd content with bytes() should reject]
expected: FAIL
[bad-zstd-body.https.any.sharedworker.html]
expected: ERROR

View file

@ -52,6 +52,3 @@
[sec-fetch-storage-access - Cross-site]
expected: FAIL
[sec-fetch-user]
expected: FAIL

View file

@ -33,9 +33,6 @@
[Https downgrade-upgrade embed]
expected: TIMEOUT
[Https downgrade-upgrade preload]
expected: TIMEOUT
[Https downgrade-upgrade iframe: sec-fetch-mode]
expected: FAIL

View file

@ -1,4 +0,0 @@
[importscripts.html]
expected: ERROR
[Test importScripts()]
expected: TIMEOUT

View file

@ -1,156 +0,0 @@
[mixed-content-fetch.tentative.https.window.html]
[https-local to http-local: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-local to http-local: wrong targetAddressSpace "private".]
expected: FAIL
[https-local to http-local: wrong targetAddressSpace "public".]
expected: FAIL
[https-local to http-local: not a private network request.]
expected: FAIL
[https-local to http-private: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-local to http-private: wrong targetAddressSpace "local".]
expected: FAIL
[https-local to http-private: wrong targetAddressSpace "public".]
expected: FAIL
[https-local to http-private: not a private network request.]
expected: FAIL
[https-local to http-public: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-local to http-public: wrong targetAddressSpace "local".]
expected: FAIL
[https-local to http-public: wrong targetAddressSpace "private".]
expected: FAIL
[https-local to http-public: not a private network request.]
expected: FAIL
[https-private to http-local: missing targetAddressSpace.]
expected: FAIL
[https-private to http-local: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-private to http-local: wrong targetAddressSpace "private".]
expected: FAIL
[https-private to http-local: wrong targetAddressSpace "public".]
expected: FAIL
[https-private to http-local: failed preflight.]
expected: FAIL
[https-private to http-local: success.]
expected: FAIL
[https-private to http-private: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-private to http-private: wrong targetAddressSpace "local".]
expected: FAIL
[https-private to http-private: wrong targetAddressSpace "public".]
expected: FAIL
[https-private to http-private: not a private network request.]
expected: FAIL
[https-private to http-public: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-private to http-public: wrong targetAddressSpace "local".]
expected: FAIL
[https-private to http-public: wrong targetAddressSpace "private".]
expected: FAIL
[https-private to http-public: not a private network request.]
expected: FAIL
[https-public to http-local: missing targetAddressSpace.]
expected: FAIL
[https-public to http-local: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-public to http-local: wrong targetAddressSpace "private".]
expected: FAIL
[https-public to http-local: wrong targetAddressSpace "public".]
expected: FAIL
[https-public to http-local: failed preflight.]
expected: FAIL
[https-public to http-local: success.]
expected: FAIL
[https-public to http-private: missing targetAddressSpace.]
expected: FAIL
[https-public to http-private: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-public to http-private: wrong targetAddressSpace "local".]
expected: FAIL
[https-public to http-private: wrong targetAddressSpace "public".]
expected: FAIL
[https-public to http-private: failed preflight.]
expected: FAIL
[https-public to http-private: success.]
expected: FAIL
[https-public to http-public: wrong targetAddressSpace "unknown".]
expected: FAIL
[https-public to http-public: wrong targetAddressSpace "local".]
expected: FAIL
[https-public to http-public: wrong targetAddressSpace "private".]
expected: FAIL
[https-public to http-public: not a private network request.]
expected: FAIL
[https-treat-as-public to http-local: wrong targetAddressSpace "private".]
expected: FAIL
[https-treat-as-public to http-private: wrong targetAddressSpace "local".]
expected: FAIL
[https-treat-as-public to http-private: success.]
expected: FAIL
[https-private to http-local: PUT success.]
expected: FAIL
[https-private to http-local: no-cors success.]
expected: FAIL
[https-public to http-local: PUT success.]
expected: FAIL
[https-public to http-local: no-cors success.]
expected: FAIL
[https-public to http-private: PUT success.]
expected: FAIL
[https-public to http-private: no-cors success.]
expected: FAIL
[https-treat-as-public to http-local: success.]
expected: FAIL

View file

@ -1,72 +0,0 @@
[window-open-existing.tentative.https.window.html?include=from-treat-as-public]
[treat-as-public-address to local: failed preflight.]
expected: FAIL
[treat-as-public-address to local: missing CORS headers.]
expected: FAIL
[treat-as-public-address to local: missing PNA header.]
expected: FAIL
[treat-as-public-address to local: success.]
expected: FAIL
[treat-as-public-address to private: failed preflight.]
expected: FAIL
[treat-as-public-address to private: missing CORS headers.]
expected: FAIL
[treat-as-public-address to private: missing PNA header.]
expected: FAIL
[treat-as-public-address to private: success.]
expected: FAIL
[window-open-existing.tentative.https.window.html?include=from-public]
[public to local: failed preflight.]
expected: FAIL
[public to local: missing CORS headers.]
expected: FAIL
[public to local: missing PNA header.]
expected: FAIL
[public to local: success.]
expected: FAIL
[public to private: failed preflight.]
expected: FAIL
[public to private: missing CORS headers.]
expected: FAIL
[public to private: missing PNA header.]
expected: FAIL
[public to private: success.]
expected: FAIL
[public to public redirected to private: missing CORS headers.]
expected: FAIL
[public to public to private: success.]
expected: FAIL
[window-open-existing.tentative.https.window.html?include=from-local]
[window-open-existing.tentative.https.window.html?include=from-private]
[private to local: failed preflight.]
expected: FAIL
[private to local: missing CORS headers.]
expected: FAIL
[private to local: missing PNA header.]
expected: FAIL
[private to local: success.]
expected: FAIL

View file

@ -0,0 +1,3 @@
[focus-contenteditable-element-in-iframe-scroll-into-view.html]
[Check contenteditable element in an iframe scroll into view on second focusing]
expected: FAIL

View file

@ -1,3 +0,0 @@
[008.html]
[Link with onclick form submit to javascript url and href navigation ]
expected: FAIL

View file

@ -4,3 +4,6 @@
[link click]
expected: FAIL
[form submission]
expected: FAIL

View file

@ -0,0 +1,3 @@
[a-click.html]
[aElement.click() before the load event must NOT replace]
expected: FAIL

View file

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

View file

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

View file

@ -1,2 +0,0 @@
[media_fragment_seek.html]
expected: CRASH

View file

@ -1,4 +1,5 @@
[security.pattern.fillStyle.sub.html]
expected: TIMEOUT
[cross-origin SVGImageElement: Setting fillStyle to an origin-unclean pattern makes the canvas origin-unclean]
expected: FAIL
@ -24,7 +25,10 @@
expected: FAIL
[redirected to same-origin HTMLVideoElement: Setting fillStyle to an origin-unclean offscreen canvas pattern makes the canvas origin-unclean]
expected: FAIL
expected: TIMEOUT
[unclean ImageBitmap: Setting fillStyle to an origin-unclean offscreen canvas pattern makes the canvas origin-unclean]
expected: FAIL
expected: NOTRUN
[unclean HTMLCanvasElement: Setting fillStyle to an origin-unclean offscreen canvas pattern makes the canvas origin-unclean]
expected: NOTRUN

View file

@ -1,3 +1,4 @@
[iframe_sandbox_popups_nonescaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: FAIL
expected: NOTRUN

View file

@ -1,12 +0,0 @@
[negative-offset-and-margin.tentative.html]
[Negative margins/offset should be changed to 0px]
expected: FAIL
[Expressions margins/offset should always return at least 0px]
expected: FAIL
[Negative margins/offset should be changed to 4px]
expected: FAIL
[Expressions margins/offset should always return at least 4px]
expected: FAIL

View file

@ -0,0 +1,9 @@
[negative-offset.tentative.html]
[Negative offset should be changed to 0px]
expected: FAIL
[Expressions offset min(-50px, 50px) should return at least 0px]
expected: FAIL
[Expressions offset clamp(-100px, 1vw, -50px) should return at least 0px]
expected: FAIL

View file

@ -0,0 +1,2 @@
[icon-hidden-reftest.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[icon-unique-per-type-reftest.html]
expected: FAIL

View file

@ -1,3 +0,0 @@
[042.html]
[ scheduler: DOM mutation events when adding scripts: DOMNodeInserted ]
expected: FAIL

View file

@ -1,3 +0,0 @@
[043.html]
[ scheduler: DOM mutation events when adding external scripts: DOMNodeInserted ]
expected: FAIL

View file

@ -1,3 +0,0 @@
[044.html]
[ scheduler: DOM mutation events when adding scripts: DOMNodeInsertedIntoDocument ]
expected: FAIL

View file

@ -1,3 +0,0 @@
[045.html]
[ scheduler: DOM mutation events when adding external scripts: DOMNodeInsertedIntoDocument ]
expected: FAIL

View file

@ -1,3 +0,0 @@
[054.html]
[ scheduler: removing newly inserted script from DOMNodeInserted handler - external script ]
expected: FAIL

View file

@ -1,3 +0,0 @@
[055.html]
[ scheduler: removing newly inserted script from DOMNodeInserted handler - inline script ]
expected: FAIL

View file

@ -0,0 +1,9 @@
[source-attribute-retargeting.tentative.html]
[CommandEvent.source and ToggleEvent.source should be retargeted during and after event dispatch.]
expected: FAIL
[CommandEvent.source should be retargeted when manually dispatched with composed set to true.]
expected: FAIL
[CommandEvent.source and ToggleEvent.source should not be set to null after dispatch without ShadowDOM.]
expected: FAIL

View file

@ -71,9 +71,6 @@
[MIME-blocked-nosniff (script): main]
expected: FAIL
[Decode-error (script): main]
expected: FAIL
[success (style): main]
expected: FAIL
@ -86,9 +83,6 @@
[success (script): main]
expected: FAIL
[404 (script): main]
expected: FAIL
[success (xhr): main]
expected: FAIL

View file

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

View file

@ -17,3 +17,9 @@
[Spot tests around script + innerHTML interaction with default policy.]
expected: FAIL
[Regression test: Bypass via appendChild into off-document script element.]
expected: FAIL
[Test that default policy applies to module script.]
expected: FAIL

View file

@ -10,3 +10,6 @@
[Spot tests around script + innerHTML interaction with default policy.]
expected: FAIL
[Test that default policy applies with module script. svg:script]
expected: FAIL

View file

@ -1,3 +0,0 @@
[ProcessingInstruction.DOMCharacterDataModified.html]
[Test Description: DOMCharacterDataModified event fires after ProcessingInstruction.data have been modified, but the node itself has not been inserted or deleted. The proximal event target of this event shall be the ProcessingInstruction node.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[domnodeinserted.html]
expected: TIMEOUT
[Test Description: DOMNodeInserted event fires when a node has been added as a child of another node.]
expected: NOTRUN

View file

@ -0,0 +1,62 @@
[urlpattern-generate.tentative.any.serviceworker.html]
expected: ERROR
[urlpattern-generate.tentative.any.sharedworker.html]
expected: ERROR
[urlpattern-generate.tentative.any.worker.html]
[Pattern: {"pathname":"/foo"} Component: pathname Groups: {}]
expected: FAIL
[Pattern: {"pathname":"/:foo"} Component: pathname Groups: {"foo":"bar"}]
expected: FAIL
[Pattern: {"pathname":"/:foo"} Component: pathname Groups: {"foo":"🍅"}]
expected: FAIL
[Pattern: {"hostname":"{:foo}.example.com"} Component: hostname Groups: {"foo":"🍅"}]
expected: FAIL
[Pattern: {"pathname":"/foo/:bar"} Component: pathname Groups: {"bar":"baz"}]
expected: FAIL
[Pattern: {"pathname":"/foo:bar"} Component: pathname Groups: {"bar":"baz"}]
expected: FAIL
[Pattern: {"pathname":"/:foo/:bar"} Component: pathname Groups: {"foo":"baz","bar":"qux"}]
expected: FAIL
[Pattern: "https://example.com/:foo" Component: pathname Groups: {"foo":" "}]
expected: FAIL
[Pattern: "original-scheme://example.com/:foo" Component: pathname Groups: {"foo":" "}]
expected: FAIL
[urlpattern-generate.tentative.any.html]
[Pattern: {"pathname":"/foo"} Component: pathname Groups: {}]
expected: FAIL
[Pattern: {"pathname":"/:foo"} Component: pathname Groups: {"foo":"bar"}]
expected: FAIL
[Pattern: {"pathname":"/:foo"} Component: pathname Groups: {"foo":"🍅"}]
expected: FAIL
[Pattern: {"hostname":"{:foo}.example.com"} Component: hostname Groups: {"foo":"🍅"}]
expected: FAIL
[Pattern: {"pathname":"/foo/:bar"} Component: pathname Groups: {"bar":"baz"}]
expected: FAIL
[Pattern: {"pathname":"/foo:bar"} Component: pathname Groups: {"bar":"baz"}]
expected: FAIL
[Pattern: {"pathname":"/:foo/:bar"} Component: pathname Groups: {"foo":"baz","bar":"qux"}]
expected: FAIL
[Pattern: "https://example.com/:foo" Component: pathname Groups: {"foo":" "}]
expected: FAIL
[Pattern: "original-scheme://example.com/:foo" Component: pathname Groups: {"foo":" "}]
expected: FAIL

View file

@ -805,3 +805,15 @@
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14650\]\t2.4329547374028208e-17\t8.6956524848937988e-1\t8.6956524848937988e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 8.6956524848937988e-1 at index of 14650.\n\tMax RelError of 1.0000000000000000e+0 at index of 14650.\n]
expected: FAIL
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14650\]\t-7.5267107840000000e+9\t8.6956524848937988e-1\t7.5267107848695650e+9\t8.6557170930474339e+9\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 7.5267107848695650e+9 at index of 14650.\n\tMax RelError of 8.6557170930474339e+9 at index of 14650.\n]
expected: FAIL
[X SNR (-154.09801862628046 dB) is not greater than or equal to 65.737. Got -154.09801862628046.]
expected: FAIL
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14650\]\t-1.2636504172422758e+17\t8.6956524848937988e-1\t1.2636504172422758e+17\t1.4531979278582096e+17\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 1.2636504172422758e+17 at index of 14650.\n\tMax RelError of 1.4531979278582096e+17 at index of 14650.\n]
expected: FAIL
[X SNR (-298.5984529579672 dB) is not greater than or equal to 65.737. Got -298.5984529579672.]
expected: FAIL

View file

@ -0,0 +1,4 @@
[017.html]
expected: TIMEOUT
[origin of the script that invoked the method, about:blank]
expected: TIMEOUT

View file

@ -0,0 +1,119 @@
[write.any.html?wpt_flags=h2]
[a write that was incomplete at close time should reject]
expected: FAIL
[garbage collection after close with a pending write promise should not crash]
expected: FAIL
[writing a value that cannot be stringified should cause a rejection]
expected: FAIL
[writing a resizable ArrayBuffer should be rejected]
expected: FAIL
[writing a view on a shared buffer should be rejected]
expected: FAIL
[write.any.sharedworker.html?default]
expected: ERROR
[write.any.html?default]
[a write that was incomplete at close time should reject]
expected: FAIL
[garbage collection after close with a pending write promise should not crash]
expected: FAIL
[writing a value that cannot be stringified should cause a rejection]
expected: FAIL
[writing a resizable ArrayBuffer should be rejected]
expected: FAIL
[writing a view on a shared buffer should be rejected]
expected: FAIL
[write.any.worker.html?wpt_flags=h2]
[a write that was incomplete at close time should reject]
expected: FAIL
[garbage collection after close with a pending write promise should not crash]
expected: FAIL
[writing a value that cannot be stringified should cause a rejection]
expected: FAIL
[writing a resizable ArrayBuffer should be rejected]
expected: FAIL
[writing a view on a shared buffer should be rejected]
expected: FAIL
[write.any.serviceworker.html?wss]
expected: ERROR
[write.any.serviceworker.html?wpt_flags=h2]
expected: ERROR
[write.any.sharedworker.html?wss]
expected: ERROR
[write.any.html?wss]
[a write that was incomplete at close time should reject]
expected: FAIL
[garbage collection after close with a pending write promise should not crash]
expected: FAIL
[writing a value that cannot be stringified should cause a rejection]
expected: FAIL
[writing a resizable ArrayBuffer should be rejected]
expected: FAIL
[writing a view on a shared buffer should be rejected]
expected: FAIL
[write.any.serviceworker.html?default]
expected: ERROR
[write.any.worker.html?wss]
[a write that was incomplete at close time should reject]
expected: FAIL
[garbage collection after close with a pending write promise should not crash]
expected: FAIL
[writing a value that cannot be stringified should cause a rejection]
expected: FAIL
[writing a resizable ArrayBuffer should be rejected]
expected: FAIL
[writing a view on a shared buffer should be rejected]
expected: FAIL
[write.any.worker.html?default]
[a write that was incomplete at close time should reject]
expected: FAIL
[garbage collection after close with a pending write promise should not crash]
expected: FAIL
[writing a value that cannot be stringified should cause a rejection]
expected: FAIL
[writing a resizable ArrayBuffer should be rejected]
expected: FAIL
[writing a view on a shared buffer should be rejected]
expected: FAIL
[write.any.sharedworker.html?wpt_flags=h2]
expected: ERROR

View file

@ -0,0 +1,3 @@
[SharedWorker-extendedLifetime.html]
[SharedWorker lifetime should be extended with extendedLifetime]
expected: FAIL

View file

@ -0,0 +1,6 @@
features:
- name: ua-client-hints
# Note: if any permissions-policy tests are added that do not
# depend on ua-client-hints, `files` below should be updated
# accordingly.
files: "**"

View file

@ -20,3 +20,19 @@ function checkContainerEntry(entry, identifier, last_element_id, beforeRender) {
function checkContainerSize(entry, size) {
assert_equals(entry.size, size);
}
function finishOnElementTiming(t) {
const finish_observer = new PerformanceObserver(() => {
requestAnimationFrame(() => { t.done(); });
});
finish_observer.observe({ entryTypes: ['element'] });
}
function addPaintingElementTimingAfterDoubleRAF(parent) {
requestAnimationFrame(() => requestAnimationFrame(() => {
const finish_img = document.createElement('img');
finish_img.src = '/container-timing/resources/square100.png';
finish_img.setAttribute('elementtiming', '');
parent.appendChild(finish_img);
}));
}

View file

@ -0,0 +1,46 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Container Timing: an image inside a containertiming-ignore inside a containertiming root</title>
<body>
<style>
body {
margin: 0;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/container-timing/resources/container-timing-helpers.js"></script>
<script src="/element-timing/resources/element-timing-helpers.js"></script>
<script>
async_test(function (t) {
assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
const observer = new PerformanceObserver(
function(entryList) {
assert_unreached("No entry is expected with nothing to paint");
}
);
observer.observe({entryTypes: ['container']});
finishOnElementTiming(t);
// Add a div that is the container timing root
const div1 = document.createElement('div');
div1.setAttribute('containertiming', 'div1_ct');
document.body.appendChild(div1);
// Intermediate ignore should block paint events
const div2 = document.createElement('div');
div2.setAttribute('containertiming-ignore', '');
div1.appendChild(div2)
// Add image of width equal to 100 and height equal to 100.
const img = document.createElement('img');
img.src = '/container-timing/resources/square100.png';
img.setAttribute('id', 'img_id');
div2.appendChild(img);
addPaintingElementTimingAfterDoubleRAF(document.body);
}, 'Paint of the image child of container timing with ignore in the middle is not reported.');
</script>
</body>

View file

@ -0,0 +1,45 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Container Timing: observe with a node with containertiming and containertiming-ignore, and an image child</title>
<body>
<style>
body {
margin: 0;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/container-timing/resources/container-timing-helpers.js"></script>
<script src="/element-timing/resources/element-timing-helpers.js"></script>
<script>
let beforeRender;
async_test(function (t) {
assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
checkContainerEntry(entry, 'div_ct', 'img_id', beforeRender)
checkRect(entry, [0, 100, 0, 100])
checkContainerSize(entry, 10000);
})
);
observer.observe({entryTypes: ['container']});
// Add a div that is the container timing root
// and containertiming-ignore, that should be ignored as
// containertiming takes precedence.
const div = document.createElement('div');
div.setAttribute('containertiming', 'div_ct');
div.setAttribute('containertiming-ignore', '');
document.body.appendChild(div);
// Add image of width equal to 100 and height equal to 100.
const img = document.createElement('img');
img.src = '/container-timing/resources/square100.png';
img.setAttribute('id', 'img_id');
div.appendChild(img);
beforeRender = performance.now();
}, 'Paint of the image child of container timing with ignore is not blocked.');
</script>
</body>

View file

@ -0,0 +1,49 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Container Timing: an image inside a containertiming inside a containertiming-ignore</title>
<body>
<style>
body {
margin: 0;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/container-timing/resources/container-timing-helpers.js"></script>
<script src="/element-timing/resources/element-timing-helpers.js"></script>
<script>
let beforeRender;
async_test(function (t) {
assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
checkContainerEntry(entry, 'div2_ct', 'img_id', beforeRender)
checkRect(entry, [0, 100, 0, 100])
checkContainerSize(entry, 10000);
})
);
observer.observe({entryTypes: ['container']});
// Add a div that is the container timing root
const div1 = document.createElement('div');
div1.setAttribute('containertiming-ignore', '');
document.body.appendChild(div1);
// Intermediate ignore should block paint events
const div2 = document.createElement('div');
div2.setAttribute('containertiming', 'div2_ct');
div1.appendChild(div2)
// Add image of width equal to 100 and height equal to 100.
const img = document.createElement('img');
img.src = '/container-timing/resources/square100.png';
img.setAttribute('id', 'img_id');
div2.appendChild(img);
beforeRender = performance.now();
}, 'An image inside a containertiming, inside a containertiming-ignore is still reported.');
</script>
</body>

View file

@ -1,4 +1,3 @@
spec: https://wicg.github.io/cookie-store/
suggested_reviewers:
- inexorabletash
- ayuishii
- dcthetall

View file

@ -3,7 +3,7 @@
'use strict';
['__Secure-', '__Host-'].forEach(prefix => {
['__Secure-', '__secure-', '__Host-', '__host-'].forEach(prefix => {
promise_test(async testCase => {
await cookieStore.set(`${prefix}cookie-name`, `secure-cookie-value`);
assert_equals(
@ -32,25 +32,27 @@
}, `cookieStore.delete with ${prefix} name on secure origin`);
});
promise_test(async testCase => {
const currentUrl = new URL(self.location.href);
const currentDomain = currentUrl.hostname;
await promise_rejects_js(testCase, TypeError,
cookieStore.set({ name: '__Host-cookie-name', value: 'cookie-value',
domain: currentDomain }));
}, 'cookieStore.set with __Host- prefix and a domain option');
['__Host-', '__host-'].forEach(prefix => {
promise_test(async testCase => {
const currentUrl = new URL(self.location.href);
const currentDomain = currentUrl.hostname;
await promise_rejects_js(testCase, TypeError,
cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value',
domain: currentDomain }));
}, `cookieStore.set with ${prefix} prefix and a domain option`);
promise_test(async testCase => {
await cookieStore.set({ name: '__Host-cookie-name', value: 'cookie-value',
path: "/" });
promise_test(async testCase => {
await cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value',
path: "/" });
assert_equals(
(await cookieStore.get(`__Host-cookie-name`)).value, "cookie-value");
assert_equals(
(await cookieStore.get(`${prefix}cookie-name`)).value, "cookie-value");
await promise_rejects_js(testCase, TypeError,
cookieStore.set( { name: '__Host-cookie-name', value: 'cookie-value',
path: "/path" }));
}, 'cookieStore.set with __Host- prefix a path option');
await promise_rejects_js(testCase, TypeError,
cookieStore.set( { name: `${prefix}cookie-name`, value: 'cookie-value',
path: "/path" }));
}, `cookieStore.set with ${prefix} prefix a path option`);
});
promise_test(async testCase => {
let exceptionThrown = false;

View file

@ -4,15 +4,21 @@
'use strict';
cookie_test(async t => {
promise_test(async t => {
await setCookieStringHttp('\uFEFFcookie=value; path=/');
t.add_cleanup(async () => {
await setCookieStringHttp('\uFEFFcookie=value; path=/; Max-Age=0');
});
const cookie = await cookieStore.get('\uFEFFcookie');
assert_equals(cookie.name, '\uFEFFcookie');
assert_equals(cookie.value, 'value');
}, 'BOM not stripped from name');
cookie_test(async t => {
promise_test(async t => {
await setCookieStringHttp('cookie=\uFEFFvalue; path=/');
t.add_cleanup(async () => {
await setCookieStringHttp('cookie=\uFEFFvalue; path=/; Max-Age=0');
});
const cookie = await cookieStore.get('cookie');
assert_equals(cookie.name, 'cookie');
assert_equals(cookie.value, '\uFEFFvalue');

View file

@ -2,7 +2,7 @@
'use strict';
cookie_test(async t => {
promise_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
await setCookieStringHttp('HTTPONLY-cookie=value; path=/; httponly');
assert_equals(
@ -29,6 +29,9 @@ cookie_test(async t => {
eventPromise = observeNextCookieChangeEvent();
await setCookieStringHttp(
'HTTPONLY-cookie=DELETED; path=/; max-age=0; httponly');
t.add_cleanup(async () => {
await setCookieStringHttp(`HTTPONLY-cookie=DELETED; path=/; httponly; Max-Age=0`);
});
assert_equals(
await getCookieString(),
undefined,
@ -41,6 +44,9 @@ cookie_test(async t => {
// HTTPONLY cookie changes should not have been observed; perform
// a dummy change to verify that nothing else was queued up.
await cookieStore.set('TEST', 'dummy');
t.add_cleanup(async () => {
await cookieStore.delete('TEST');
});
await verifyCookieChangeEvent(
eventPromise, {changed: [{name: 'TEST', value: 'dummy'}]},
'HttpOnly cookie deletion was not observed');
@ -68,8 +74,11 @@ cookie_test(async t => {
'httpOnly is not an option for CookieStore.set()');
}, 'HttpOnly cookies can not be set by CookieStore');
cookie_test(async t => {
promise_test(async t => {
await setCookieStringHttp('HTTPONLY-cookie=value; path=/; httponly');
t.add_cleanup(async () => {
await setCookieStringHttp(`HTTPONLY-cookie=DELETED; path=/; httponly; Max-Age=0`);
});
assert_equals(
await getCookieString(),
undefined,

View file

@ -210,10 +210,12 @@ async function cookie_test(func, description) {
// Wipe cookies used by tests before and after the test.
async function deleteAllCookies() {
await Promise.all((await cookieStore.getAll()).map(async ({name, value}) => {
await cookieStore.delete(name);
await cookieStore.delete({name: name, partitioned: true});
}));
const cookies = await cookieStore.getAll();
await Promise.all(cookies.flatMap(
({name}) =>
[cookieStore.delete(name),
cookieStore.delete({name, partitioned: true}),
]));
}
return promise_test(async t => {

View file

@ -11,7 +11,8 @@
.anchor-a { anchor-name: --a; }
.anchor-b { anchor-name: --b; }
.anchor-a, .anchor-b {
.anchor-ab { anchor-name: --a, --b; }
.anchor-a, .anchor-b, .anchor-ab {
background: skyblue;
height: 10px;
}
@ -159,7 +160,8 @@
<div class=anchor-b></div>
<div class=anchor-a></div><!--A-->
<div class=scope-a>
<div class=anchor-b></div><!--B-->
<div class=anchor-b></div>
<div class=anchor-ab></div><!--B-->
<div class=anchor-a></div>
</div>
<div class=anchored-a></div>
@ -169,7 +171,7 @@
test((t) => {
inflate(t, test_scope_a);
assert_equals(getComputedStyle(main.querySelector('.anchored-a')).top, '20px');
assert_equals(getComputedStyle(main.querySelector('.anchored-b')).top, '30px');
assert_equals(getComputedStyle(main.querySelector('.anchored-b')).top, '40px');
}, 'anchor-scope:--a scopes only --a');
</script>
@ -177,8 +179,8 @@
<div class=anchor-b></div><!--B-->
<div class=anchor-a></div>
<div class=scope-b>
<div class=anchor-b></div>
<div class=anchor-a></div><!--A-->
<div class=anchor-b></div>
</div>
<div class=anchored-a></div>
<div class=anchored-b></div>
@ -186,7 +188,7 @@
<script>
test((t) => {
inflate(t, test_scope_b);
assert_equals(getComputedStyle(main.querySelector('.anchored-a')).top, '40px');
assert_equals(getComputedStyle(main.querySelector('.anchored-a')).top, '30px');
assert_equals(getComputedStyle(main.querySelector('.anchored-b')).top, '10px');
}, 'anchor-scope:--b scopes only --b');
</script>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<link rel="help" href="https://crbug.com/420329041">
<style>
#crash {
position: absolute;
left: anchor(right);
--svg: url("data:image/svg+xml,");
content: var(--svg);
fill: var(--svg);
}
</style>
<p>Pass if no crash</p>
<div id="crash"></div>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<style>
.target {
width: 100px;
height: 100px;
border-radius: 25px;
box-sizing: border-box;
background-image: url("/images/green.png");
corner-shape: notch superellipse(3) bevel scoop;
}
</style>
<div class=target></div>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<link rel="match" href="corner-shape-img-ref.html">
<meta name="fuzzy" content="maxDifference=0-64;totalPixels=0-100">
<style>
img {
width: 100px;
height: 100px;
border-radius: 25px;
box-sizing: border-box;
corner-shape: notch superellipse(3) bevel scoop;
}
</style>
<img src="/images/green.png">

View file

@ -17,7 +17,7 @@
<meta name="variant" content="?corner-top-left-shape=superellipse(-4)&border-radius=40%">
<meta name="variant" content="?corner-top-left-shape=superellipse(2.5)&border-radius=20%&border-width=10px">
<meta name="variant" content="?corner-top-right-shape=scoop&border-radius=20%&border-width=10px">
<meta name="variant" content="?corner-shape=superellipse(0.8)&border-radius=40px&border-width=10px&border-left-color=purple">
<meta name="variant" content="?corner-shape=superellipse(0.8)&border-radius=40px&border-width=10px">
<meta name="variant" content="?corner-shape=superellipse(3)&border-radius=40px&box-shadow=10px 10px 0 10px black">
<meta name="variant" content="?border-radius=30%&corner-shape=superellipse(-1.5)&box-shadow=10px%2010px%200%2010px%20black">
<meta name="variant" content="?border-radius=40%&corner-shape=notch&box-shadow=10px%2010px%200%2010px%20yellow">

View file

@ -19,13 +19,14 @@
<meta name="variant" content="?corner-top-left-shape=superellipse(-0.5)&border-radius=40px">
<meta name="variant" content="?corner-shape=squircle&border-top-left-radius=25%&border-width=10px">
<meta name="variant" content="?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px">
<meta name="variant" content="?corner-top-left-shape=bevel&border-width=10px&border-color=black">
<meta name="variant" content="?corner-top-right-shape=bevel&border-width=10px&border-color=black">
<meta name="variant" content="?corner-top-left-shape=bevel&border-width=10px">
<meta name="variant" content="?corner-top-right-shape=bevel&border-width=10px">
<meta name="variant" content="?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px">
<meta name="variant" content="?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px">
<meta name="variant" content="?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel">
<meta name="variant" content="?border-top-left-radius=50%&corner-shape=superellipse(0.7)&border-left-width=30px&border-top-width=30px">
<meta name="variant" content="?border-radius=50%&corner-shape=bevel&box-shadow=10px%2010px%200%2010px%20black">
<meta name="variant" content="?corner-shape=notch&border-radius=30px&border-width=30px">
<style>
body {
margin: 0;

View file

@ -87,10 +87,6 @@ function add_corner(ctx, ax, ay, bx, by, curvature) {
* 'border-top-right-radius': [number, number],
* 'border-bottom-left-radius': [number, number],
* 'border-bottom-right-radius': [number, number],
* 'border-top-color': string,
* 'border-right-color': string,
* 'border-left-color': string,
* 'border-bottom-color': string,
* 'border-top-width': number,
* 'border-right-width': number,
* 'border-bottom-width': number,
@ -109,42 +105,8 @@ function render_rect_with_corner_shapes(style, ctx, width, height) {
add_corner(ctx, ...params.outer_rect, params.shape);
}
function draw_inner_corner_from_params(params) {
add_corner(ctx, ...params.inner_rect, params.shape);
}
function draw_inner_corner(corner) {
draw_inner_corner_from_params(corner_params[corner]);
}
function draw_shadow() {
if (!style.shadow || !style.shadow.length) {
return;
}
for (const {spread, offset, color} of style.shadow) {
const params = resolve_corner_params(style, width, height, spread);
ctx.save();
ctx.translate(...offset);
ctx.beginPath();
ctx.lineTo(params['top-right'].inner_rect[0], params['top-right'].inner_rect[1]);
draw_inner_corner_from_params(params['top-right']);
ctx.lineTo(params['top-right'].inner_rect[2], params['top-right'].inner_rect[3])
ctx.lineTo(params['bottom-right'].inner_rect[0], params['bottom-right'].inner_rect[1])
draw_inner_corner_from_params(params['bottom-right']);
ctx.lineTo(params['bottom-right'].inner_rect[2], params['bottom-right'].inner_rect[3]);
ctx.lineTo(params['bottom-left'].inner_rect[0], params['bottom-left'].inner_rect[1]);
draw_inner_corner_from_params(params['bottom-left']);
ctx.lineTo(params['bottom-left'].inner_rect[2], params['bottom-left'].inner_rect[3])
ctx.lineTo(params['top-left'].inner_rect[0], params['top-left'].inner_rect[1])
draw_inner_corner_from_params(params['top-left']);
ctx.lineTo(params['top-left'].inner_rect[2], params['top-left'].inner_rect[3]);
ctx.lineTo(params['top-right'].inner_rect[0], params['top-right'].inner_rect[1]);
ctx.fillStyle = color;
ctx.closePath();
ctx.fill("nonzero");
ctx.restore();
}
add_corner(ctx, ...corner_params[corner].inner_rect, corner_params[corner].shape);
}
function draw_outer_path() {
@ -157,6 +119,15 @@ function render_rect_with_corner_shapes(style, ctx, width, height) {
ctx.fill("nonzero");
}
for (const {spread, offset, color} of (style.shadow || [])) {
ctx.save();
ctx.translate(offset[0] - spread, offset[1] - spread);
ctx.scale((width + spread * 2) / width, (height + spread * 2) / height);
ctx.fillStyle = color;
draw_outer_path();
ctx.restore();
}
const inner_rect = [
style["border-left-width"],
style["border-top-width"],
@ -164,70 +135,8 @@ function render_rect_with_corner_shapes(style, ctx, width, height) {
height - style["border-bottom-width"],
];
draw_shadow();
{
ctx.save();
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(corner_params['top-left'].inner_rect[2], corner_params['top-left'].inner_rect[1])
ctx.lineTo(corner_params['top-left'].inner_rect[2], inner_rect[1]);
ctx.lineTo(corner_params['top-right'].inner_rect[0], inner_rect[1]);
ctx.lineTo(corner_params['top-right'].inner_rect[0], corner_params['top-right'].inner_rect[3]);
ctx.lineTo(width, 0);
ctx.closePath();
ctx.clip();
ctx.fillStyle = style['border-top-color'];
draw_outer_path();
ctx.restore();
}
{
ctx.save();
ctx.beginPath();
ctx.moveTo(width, 0);
ctx.lineTo(corner_params['top-right'].inner_rect[0], corner_params['top-right'].inner_rect[3]);
ctx.lineTo(inner_rect[2], corner_params['top-right'].inner_rect[3]);
ctx.lineTo(inner_rect[2], corner_params['bottom-right'].inner_rect[1]);
ctx.lineTo(corner_params['bottom-right'].inner_rect[2], corner_params['bottom-right'].inner_rect[1]);
ctx.lineTo(width, height);
ctx.closePath();
ctx.clip();
ctx.fillStyle = style['border-right-color'];
draw_outer_path();
ctx.restore();
}
{
ctx.save();
ctx.beginPath();
ctx.lineTo(width, height);
ctx.lineTo(corner_params['bottom-right'].inner_rect[2], corner_params['bottom-right'].inner_rect[1]);
ctx.lineTo(corner_params['bottom-right'].inner_rect[2], inner_rect[3]);
ctx.lineTo(corner_params['bottom-left'].inner_rect[0], inner_rect[3]);
ctx.lineTo(corner_params['bottom-left'].inner_rect[0], corner_params['bottom-left'].inner_rect[3]);
ctx.lineTo(0, height);
ctx.closePath();
ctx.clip();
ctx.fillStyle = style['border-bottom-color'];
draw_outer_path();
ctx.restore();
}
{
ctx.save();
ctx.beginPath();
ctx.lineTo(0, height);
ctx.lineTo(corner_params['bottom-left'].inner_rect[0], corner_params['bottom-left'].inner_rect[3]);
ctx.lineTo(inner_rect[0], corner_params['bottom-left'].inner_rect[3]);
ctx.lineTo(inner_rect[0], corner_params['top-left'].inner_rect[1]);
ctx.lineTo(corner_params['top-left'].inner_rect[2], corner_params['top-left'].inner_rect[1])
ctx.lineTo(0, 0);
ctx.closePath();
ctx.clip();
ctx.fillStyle = style['border-left-color'];
draw_outer_path();
ctx.restore();
}
ctx.fillStyle = "black";
draw_outer_path();
ctx.save();
ctx.beginPath();

View file

@ -112,29 +112,11 @@ function resolve_corner_params(style, width, height, outset = null) {
outer_rect[3] + inner_offset[3] * offset[0],
];
let inner_shape = shape;
if (outset) {
const new_width = width + outset * 2;
const new_height = height + outset * 2;
inner_rect = [
(outer_rect[0] / width) * new_width - outset,
(outer_rect[1] / height) * new_height - outset,
(outer_rect[2] / width) * new_width - outset,
(outer_rect[3] / height) * new_height - outset
]
} else if (shape > 2 || shape < 0.5) {
const outer_length = Math.hypot(
outer_rect[2] - outer_rect[0], outer_rect[3] - outer_rect[1]);
const inner_length = Math.hypot(
inner_rect[2] - inner_rect[0], inner_rect[3] - inner_rect[1])
}
return [
corner,
{
outer_rect,
shape,
inner_shape,
inset,
inner_rect,
inner_offset,

View file

@ -15,7 +15,6 @@
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 8%, standard 2%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 99%, standard 99%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 99%, standard 99%, constrained 10%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 20%, no-limit 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained 90%, no-limit 10%) 1%, no-limit 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%, dynamic-range-limit-mix(constrained 2%, no-limit 10%) 80%)");
@ -31,6 +30,7 @@
test_invalid_value("dynamic-range-limit", "hdr");
test_invalid_value("dynamic-range-limit", "sdr");
test_invalid_value("dynamic-range-limit", "low");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80% standard 20%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(low, no-limit, 10%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 101%, standard 1%)");

View file

@ -0,0 +1,34 @@
<!DOCTYPE html>
<title>CSS Container Queries Test: style() query with rem unit for registered custom property</title>
<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#style-container">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/cq-testcommon.js"></script>
<style>
@property --length {
syntax: "<length>";
initial-value: 0px;
inherits: false;
}
:root, body { font-size: 16px; }
#container { --length: 100px; }
#target { color: red; }
@container style(--length: calc(1rem * 10)) {
#target { color: green; }
}
</style>
<div id="container">
<div id="target">Should be green</div>
</div>
<script>
test(() => {
assert_equals(getComputedStyle(target).color, "rgb(255, 0, 0)");
}, "Initially, 1rem * 10 evaluates to 160px");
test(() => {
document.documentElement.style.fontSize = "10px";
assert_equals(getComputedStyle(target).color, "rgb(0, 128, 0)");
}, "Changing the :root font-size to 10px makes 1rem * 10 evaluate to 100px");
</script>

View file

@ -1,10 +0,0 @@
<!DOCTYPE html>
<title>flexbox | multicol</title>
<link rel="author" href="http://opera.com" title="Opera Software">
<style>
div {
background: black;
}
</style>
<div>x</div>

View file

@ -1,27 +0,0 @@
<!DOCTYPE html>
<title>flexbox | multicol</title>
<link rel="author" href="http://opera.com" title="Opera Software">
<link rel="help"
href="http://www.w3.org/TR/css-flexbox-1/#flex-containers">
<link rel="match" href="flexbox_columns-ref.html">
<style>
ul {
background: black;
padding: 0;
margin: 0;
display: flex;
justify-content: space-around;
columns: 3;
column-rule: 1em solid red;
}
::marker { font-family:inherit; }
</style>
<ul>
<li>one two three four</li>
<li>filler</li>
<li>filler</li>
<li>filler</li>
<li>filler</li>
</ul>

View file

@ -0,0 +1,12 @@
<!doctype html>
<style>
#cover {
background: white;
position: fixed;
width: 100%;
height: 200px;
top: 0;
border: 1px solid black;
}
</style>
<div id="cover"></div>

View file

@ -0,0 +1,16 @@
<!doctype html>
<title>Datetime input doesn't have stacking contexts inside</title>
<link rel="help" href="https://drafts.csswg.org/css-forms/"> <!-- a bit of a stretch but... -->
<link rel="match" href="datetime-stacking-context-ref.html">
<style>
#cover {
background: white;
position: fixed;
width: 100%;
height: 200px;
top: 0;
border: 1px solid black;
}
</style>
<div id="cover"></div>
<input type=datetime>

View file

@ -0,0 +1,88 @@
<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
body {
margin: 0px;
}
.grid-container {
display: grid;
grid-template-columns: repeat(4, 100px);
grid-template-rows: repeat(4, 100px);
gap: 10px;
width: 430px;
height: 430px;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
.col-gap {
width: 0;
border-left: solid 5px blue;
}
.col-gap1 {
position: absolute;
top: 212.5px;
left: 102.5px;
height: 217.5px;
}
.col-gap2 {
position: absolute;
top: 0px;
left: 212.5px;
height: 430px;
}
.col-gap3 {
position: absolute;
top: 0px;
left: 322.5px;
height: 430px;
}
.row-gap {
height: 0px;
border-bottom: solid 5px red;
}
.row-gap1 {
position: absolute;
top: 102.5px;
left: 325px;
width: 105px;
}
.row-gap2 {
position: absolute;
top: 212.5px;
left: 0px;
width: 430px;
}
.row-gap3 {
position: absolute;
top: 322.5px;
left: 0px;
width: 430px;
}
</style>
<div class="grid-container">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
</div>
<div class="col-gap col-gap1"> </div>
<div class="col-gap col-gap2"> </div>
<div class="col-gap col-gap3"> </div>
<div class="row-gap row-gap1"> </div>
<div class="row-gap row-gap2"> </div>
<div class="row-gap row-gap3"> </div>

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: *rule-break properly adheres to spanning-item when repeater tracks are used.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
<link rel="match" href="grid-gap-decorations-040-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
body {
margin: 0px;
}
.grid-container {
display: grid;
grid-template-columns: repeat(4, 100px);
grid-template-rows: repeat(4, 100px);
gap: 10px;
width: 430px;
height: 430px;
column-rule: 5px solid blue;
row-rule: 5px solid red;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
</style>
<div class="grid-container">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
</div>

View file

@ -0,0 +1,16 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: Renderer doesn't crash when gap decorations is used on grid with no rows/columns.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
column-rule: solid blue;
row-rule: dotted red;
}
</style>
<div class="grid-container"></div>

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
width: 430px;
height: 430px;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
</style>
<div class="grid-container">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-row: 2 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
<div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
</div>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: gap decorations are not painted when there are no gaps.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="match" href="grid-gap-decorations-042-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
width: 430px;
height: 430px;
column-rule: 5px solid blue;
row-rule: 5px dotted red;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
</style>
<div class="grid-container">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-row: 2 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
<div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
</div>

View file

@ -0,0 +1,109 @@
<!doctype html>
<meta name="author" title="Fernando Fiori" href="mailto:ffiori@microsoft.com">
<meta name="assert" content="HighlightRegistry.highlightsFromPoint returns the Highlights and their corresponding Ranges and StaticRanges present at the coordinates provided as argument in the right order in multi-line text.">
<link rel="help" href="https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/highlight/HighlightsFromPointsExplainer.md">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
::highlight(example-highlight) {
background-color: rgba(0, 255, 255, 0.5);
}
body {
font-family: monospace;
}
</style>
<span id="example-span-1">0123456789</span><br>
<span id="example-span-2">0123456789</span>
<script>
const textNode1 = document.querySelector("#example-span-1");
const textNode2 = document.querySelector("#example-span-2");
function test_ranges(ranges) {
assert_equals(ranges.length, 2, 'test_ranges() should be called with exactly two ranges.');
let big_range = ranges[0].startOffset < ranges[1].startOffset ? ranges[0] : ranges[1];
let highlight = new Highlight(...ranges);
CSS.highlights.set("example-highlight", highlight);
const rect = textNode1.getBoundingClientRect();
const characterWidth = rect.width / textNode1.textContent.length;
const characterHeight = rect.height;
// No Highlights outside of text contents.
let x = rect.left - 1;
let y = rect.top - 1;
let highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are outside of the text contents');
// Get x and y coordinates between characters '0' and '1' on the first line (not highlighted).
x = rect.left + characterWidth;
y = rect.top + characterHeight / 2;
highlights = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are outside of the highlighted ranges');
// Get x and y coordinates between characters '2' and '3' on the first line.
x = rect.left + 3 * characterWidth;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 1, 'CSS.highlights.highlightsFromPoint() returns exactly one HighlightHitResult when the coordinates provided point at one Highlight');
assert_equals(highlight_hit_results[0].highlight, highlight, 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the Highlight present at the coordinates provided');
assert_array_equals(highlight_hit_results[0].ranges, [big_range], 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the ranges of the Highlight present at the coordinates provided');
// Get x and y coordinates between characters '6' and '7' on the first line.
x = rect.left + 7 * characterWidth;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 1, 'CSS.highlights.highlightsFromPoint() returns exactly one HighlightHitResult when the coordinates provided point at one Highlight');
assert_equals(highlight_hit_results[0].highlight, highlight, 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the Highlight present at the coordinates provided');
assert_array_equals(highlight_hit_results[0].ranges, ranges, 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the ranges of the Highlight present at the coordinates provided in the right order');
// Get x and y coordinates to the right of the last character of the first line.
x = rect.left + 12 * characterWidth;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are to the right of the text contents');
// Get x and y coordinates between characters '0' and '1' on the second line.
x = rect.left + characterWidth;
y = rect.top + 1.5 * characterHeight;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 1, 'CSS.highlights.highlightsFromPoint() returns exactly one HighlightHitResult when the coordinates provided point at one Highlight');
assert_equals(highlight_hit_results[0].highlight, highlight, 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the Highlight present at the coordinates provided');
assert_array_equals(highlight_hit_results[0].ranges, [big_range], 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the ranges of the Highlight present at the coordinates provided');
// Get x and y coordinates between characters '8' and '9' on the second line (not highlighted).
x = rect.left + 9 * characterWidth;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are outside of the highlighted ranges');
// Get x and y coordinates to the right of the last character of the second line.
x = rect.left + 12 * characterWidth;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are to the right of the text contents');
// Get x and y coordinates below the second line.
x = rect.left + 5 * characterWidth;
y = rect.top + 3 * characterHeight;
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are below the text contents');
}
test(() => {
// Set a Highlight with two nested ranges in this way:
// 01[234(56789)
// 01234567]89
let range1 = new Range();
range1.setStart(textNode1.childNodes[0], 5);
range1.setEnd(textNode1.childNodes[0], 10);
let range2 = new Range();
range2.setStart(textNode1.childNodes[0], 2);
range2.setEnd(textNode2.childNodes[0], 8);
let static_range1 = new StaticRange({startContainer: textNode1.childNodes[0], startOffset: 5, endContainer: textNode1.childNodes[0], endOffset: 10})
let static_range2 = new StaticRange({startContainer: textNode1.childNodes[0], startOffset: 2, endContainer: textNode2.childNodes[0], endOffset: 8})
test_ranges([range1, range2]);
test_ranges([range2, range1]);
test_ranges([static_range1, static_range2]);
test_ranges([static_range2, static_range1]);
test_ranges([static_range1, range2]);
test_ranges([range1, static_range2]);
}, 'CSS.highlights.highlightsFromPoint() returns HighlightHitResults with the Highlights and their corresponding Ranges and StaticRanges present at the given point in the right order on multi-line text.');
</script>

View file

@ -26,7 +26,7 @@ body {
test(() => {
assert_equals(CSS.highlights.highlightsFromPoint(-1,-1).length, 0);
}, 'CSS.highlights.highlightsFromPoint() should return an empty vector when called with a point outside the document.');
}, 'CSS.highlights.highlightsFromPoint() should return an empty array when called with a point outside the document.');
test(() => {
// Set two Highlights in this way: 01[234[56789]]
@ -49,35 +49,38 @@ body {
// No Highlights outside of text contents.
let x = rect.left - 1;
let y = rect.top - 1;
let highlights = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlights.length, 0, 'CSS.highlights.highlightsFromPoint() returns no Highlights when the coordinates provided are outside of the text contents');
let highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided are outside of the text contents');
// Get x and y coordinates between '0' and '1'.
x = rect.left + characterWidth;
y = rect.top + rect.height / 2;
highlights = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlights.length, 0, 'CSS.highlights.highlightsFromPoint() returns no Highlights when the coordinates provided point at no Highlights');
assert_equals(highlight_hit_results.length, 0, 'CSS.highlights.highlightsFromPoint() returns an empty array when the coordinates provided point at no Highlights');
// Get x and y coordinates between '2' and '3'.
x = rect.left + 3 * characterWidth;
highlights = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlights.length, 1, 'CSS.highlights.highlightsFromPoint() returns exactly one Highlight when the coordinates provided point at one Highlight');
assert_equals(highlights[0], highlight1, 'CSS.highlights.highlightsFromPoint() returns the Highlight present at the coordinates provided');
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 1, 'CSS.highlights.highlightsFromPoint() returns exactly one HighlightHitResult when the coordinates provided point at one Highlight');
assert_equals(highlight_hit_results[0].highlight, highlight1, 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the Highlight present at the coordinates provided');
assert_array_equals(highlight_hit_results[0].ranges, [range1], 'CSS.highlights.highlightsFromPoint() returns a HighlightHitResult with the ranges of the Highlight present at the coordinates provided');
// Get x and y coordinates between '6' and '7'.
// Same priority for the Highlights, break tie by order of registration.
x = rect.left + 7 * characterWidth;
highlights = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlights.length, 2, 'CSS.highlights.highlightsFromPoint() returns exactly two Highlights when the coordinates provided point at two overlapping Highlights');
assert_equals(highlights[0], highlight2, 'CSS.highlights.highlightsFromPoint() returns first the Highlight registered last when both Highlights present at the point provided have the same priority');
assert_equals(highlights[1], highlight1, 'CSS.highlights.highlightsFromPoint() returns last the Highlight registered first when both Highlights present at the point provided have the same priority');
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 2, 'CSS.highlights.highlightsFromPoint() returns exactly two HighlightHitResults when the coordinates provided point at two overlapping Highlights');
assert_equals(highlight_hit_results[0].highlight, highlight2, 'CSS.highlights.highlightsFromPoint() returns first a HighlightHitResult with the Highlight registered last when both Highlights present at the point provided have the same priority');
assert_equals(highlight_hit_results[1].highlight, highlight1, 'CSS.highlights.highlightsFromPoint() returns last a HighlightHitResult with the Highlight registered first when both Highlights present at the point provided have the same priority');
assert_array_equals(highlight_hit_results[0].ranges, [range2], 'CSS.highlights.highlightsFromPoint() returns first a HighlightHitResult with the ranges of the Highlight present on top at the coordinates provided');
assert_array_equals(highlight_hit_results[1].ranges, [range1], 'CSS.highlights.highlightsFromPoint() returns last a HighlightHitResult with the ranges of the Highlight present at the bottom at the coordinates provided');
// Now highlight1 should be first because it's got higher priority.
highlight1.priority = 2;
highlight2.priority = 1;
highlights = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlights.length, 2, 'CSS.highlights.highlightsFromPoint() returns exactly two Highlights when the coordinates provided point at two overlapping Highlights');
assert_equals(highlights[0], highlight1, 'CSS.highlights.highlightsFromPoint() returns first the Highlight with higher priority when there are two Highlights present at the point provided');
assert_equals(highlights[1], highlight2, 'CSS.highlights.highlightsFromPoint() returns last the Highlight with lower priority when there are two Highlights present at the point provided');
}, 'CSS.highlights.highlightsFromPoint() returns Highlights present at the given point in the right order.');
highlight_hit_results = CSS.highlights.highlightsFromPoint(x, y);
assert_equals(highlight_hit_results.length, 2, 'CSS.highlights.highlightsFromPoint() returns exactly two HighlightHitResults when the coordinates provided point at two overlapping Highlights');
assert_equals(highlight_hit_results[0].highlight, highlight1, 'CSS.highlights.highlightsFromPoint() returns first a HighlightHitResult with the Highlight with higher priority when there are two Highlights present at the point provided');
assert_equals(highlight_hit_results[1].highlight, highlight2, 'CSS.highlights.highlightsFromPoint() returns last a HighlightHitResult with the Highlight with lower priority when there are two Highlights present at the point provided');
}, 'CSS.highlights.highlightsFromPoint() returns the Highlights with their corresponding ranges present at the given point in the right order.');
</script>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Masking: Test clip-path property and shape function with single-value arc radius</title>
</head>
<style>
@keyframes animate-shape {
from {
clip-path: shape(from 40px 100px, arc to 200px 100px of 50% 50% small cw, arc to 0 100px of 30% 30% small cw);
}
to {
clip-path: shape(from 40px 100px, arc to 200px 100px of 30% 30% small cw, arc to 0 100px of calc(10px + 45%) calc(10px + 45%) small cw);
}
}
#shape {
width: calc(500px / sqrt(2));
height: calc(500px / sqrt(2));
background: green;
animation: animate-shape 100s;
animation-play-state: paused;
animation-timing-function: steps(2, start);
}
</style>
<div id="shape"></div>
</html>

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Masking: Test animating single-value arc radius of the shape() function</title>
<link rel="help" href="https://drafts.csswg.org/css-shapes-2/#funcdef-shape">
<link rel="match" href="clip-path-interpolation-shape-arc-direction-agnostic-radius-ref.html">
<meta name="fuzzy" content="maxDifference=0-10;totalPixels=0-360">
</head>
<style>
@keyframes animate-shape {
from {
clip-path: shape(from 40px 100px, arc to 200px 100px of 50% small cw, arc to 0 100px of 30% small cw);
}
to {
clip-path: shape(from 40px 100px, arc to 200px 100px of 30% small cw, arc to 0 100px of calc(10px + 45%) small cw);
}
}
#shape {
width: 400px;
height: 300px;
background: green;
animation: animate-shape 100s;
animation-play-state: paused;
animation-timing-function: steps(2, start);
}
</style>
<div id="shape"></div>
</html>

View file

@ -145,15 +145,28 @@ test_interpolation({
test_interpolation({
property: 'clip-path',
from: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)',
to: 'shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)'
from: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)',
to: 'shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px cw rotate 270deg small, arc to 25% 20px of 10px 5px small cw)'
}, [
{at: -0.3, expect: 'shape(from 2% 2px, arc to 18% -12px of 7px 17px, arc by 12% -2px of 33px 33px rotate -42deg cw large , arc to 25% 20px of 10px 5px)'},
{at: 0, expect: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px)'},
{at: 0, expect: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px)'},
{at: 0.3, expect: 'shape(from 8% 8px, arc to 12% -18px of 13px 23px, arc by 18% -8px of 27px 27px rotate 102deg cw large, arc to 25% 20px of 10px 5px cw)'},
{at: 0.5, expect: 'shape(from 10% 10px, arc to 10% -20px of 15px 25px, arc by 20% -10px of 25px rotate 150deg cw large, arc to 25% 20px of 10px 5px cw)'},
{at: 1, expect: 'shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px rotate 270deg cw, arc to 25% 20px of 10px 5px cw)'},
{at: 1.5, expect: 'shape(from 20% 20px, arc to 0% -30px of 25px 35px, arc by 30% -20px of 15px rotate 390deg cw, arc to 25% 20px of 10px 5px cw)'},
{at: 0.5, expect: 'shape(from 10% 10px, arc to 10% -20px of 15px 25px, arc by 20% -10px of 25px 25px rotate 150deg cw large, arc to 25% 20px of 10px 5px cw)'},
{at: 1, expect: 'shape(from 15% 15px, arc to 5% -25px of 20px 30px, arc by 25% -15px of 20px 20px rotate 270deg cw, arc to 25% 20px of 10px 5px cw)'},
{at: 1.5, expect: 'shape(from 20% 20px, arc to 0% -30px of 25px 35px, arc by 30% -20px of 15px 15px rotate 390deg cw, arc to 25% 20px of 10px 5px cw)'},
]);
test_interpolation({
property: 'clip-path',
from: 'shape(from 5% 5px, arc to 15% -15px of 10px, arc by 15% -5px of 30% cw rotate 30deg large, arc to 25% 20px of 10% small)',
to: 'shape(from 15% 15px, arc to 5% -25px of 15%, arc by 25% -15px of 12rem cw rotate 270deg small, arc to 15% 20px of 20% small cw)'
}, [
{at: -0.3, expect: 'shape(from 2% 2px, arc to 18% -12px of calc(-4.5% + 13px), arc by 12% -2px of calc(39% - 57.6px) cw large rotate -42deg, arc to 28% 20px of 7%)'},
{at: 0, expect: 'shape(from 5% 5px, arc to 15% -15px of calc(0% + 10px), arc by 15% -5px of 30% cw large rotate 30deg, arc to 25% 20px of 10%)'},
{at: 0.3, expect: 'shape(from 8% 8px, arc to 12% -18px of calc(4.5% + 7px), arc by 18% -8px of calc(21% + 57.6px) rotate 102deg cw large, arc to 22% 20px of 13% cw)'},
{at: 0.5, expect: 'shape(from 10% 10px, arc to 10% -20px of calc(7.5% + 5px), arc by 20% -10px of calc(15% + 96px) cw large rotate 150deg, arc to 20% 20px of 15% cw)'},
{at: 1, expect: 'shape(from 15% 15px, arc to 5% -25px of 15%, arc by 25% -15px of calc(0% + 192px) cw rotate 270deg, arc to 15% 20px of 20% cw)'},
{at: 1.5, expect: 'shape(from 20% 20px, arc to 0% -30px of calc(22.5% - 5px), arc by 30% -20px of calc(-15% + 288px) cw rotate 390deg, arc to 10% 20px of 25% cw)'},
]);
test_interpolation({
@ -254,28 +267,28 @@ test_interpolation({
test_interpolation({
property: 'clip-path',
from: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)',
from: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)',
to: 'path("M 15 15 A 20,30 0 0,0 5,-25 a 20,20 270 0,1 25,-15 A 10,5 0 0,0 25 20")',
}, [
{at: -0.3, expect: 'shape(from calc(6.5% - 4.5px) 2px, arc to calc(19.5% - 1.5px) -12px of 7px 17px, arc by calc(19.5% - 7.5px) -2px of 33px cw large rotate -42deg, arc to calc(32.5% - 7.5px) 20px of 10px 5px)'},
{at: 0, expect: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)'},
{at: 0.3, expect: 'shape(from calc(3.5% + 4.5px) 8px, arc to calc(10.5% + 1.5px) -18px of 13px 23px, arc by calc(10.5% + 7.5px) -8px of 27px cw large rotate 102deg, arc to calc(17.5% + 7.5px) 20px of 10px 5px)'},
{at: 0.5, expect: 'shape(from calc(2.5% + 7.5px) 10px, arc to calc(7.5% + 2.5px) -20px of 15px 25px, arc by calc(7.5% + 12.5px) -10px of 25px cw large rotate 150deg, arc to calc(12.5% + 12.5px) 20px of 10px 5px)'},
{at: 1, expect: 'shape(from calc(0% + 15px) 15px, arc to calc(0% + 5px) -25px of 20px 30px, arc by calc(0% + 25px) -15px of 20px cw rotate 270deg, arc to calc(0% + 25px) 20px of 10px 5px)'},
{at: 1.5, expect: 'shape(from calc(-2.5% + 22.5px) 20px, arc to calc(-7.5% + 7.5px) -30px of 25px 35px, arc by calc(-7.5% + 37.5px) -20px of 15px cw rotate 390deg, arc to calc(-12.5% + 37.5px) 20px of 10px 5px)'},
{at: -0.3, expect: 'shape(from calc(6.5% - 4.5px) 2px, arc to calc(19.5% - 1.5px) -12px of 7px 17px, arc by calc(19.5% - 7.5px) -2px of 33px 33px cw large rotate -42deg, arc to calc(32.5% - 7.5px) 20px of 10px 5px)'},
{at: 0, expect: 'shape(from 5% 5px, arc to 15% -15px of 10px 20px, arc by 15% -5px of 30px 30px cw rotate 30deg large, arc to 25% 20px of 10px 5px small)'},
{at: 0.3, expect: 'shape(from calc(3.5% + 4.5px) 8px, arc to calc(10.5% + 1.5px) -18px of 13px 23px, arc by calc(10.5% + 7.5px) -8px of 27px 27px cw large rotate 102deg, arc to calc(17.5% + 7.5px) 20px of 10px 5px)'},
{at: 0.5, expect: 'shape(from calc(2.5% + 7.5px) 10px, arc to calc(7.5% + 2.5px) -20px of 15px 25px, arc by calc(7.5% + 12.5px) -10px of 25px 25px cw large rotate 150deg, arc to calc(12.5% + 12.5px) 20px of 10px 5px)'},
{at: 1, expect: 'shape(from calc(0% + 15px) 15px, arc to calc(0% + 5px) -25px of 20px 30px, arc by calc(0% + 25px) -15px of 20px 20px cw rotate 270deg, arc to calc(0% + 25px) 20px of 10px 5px)'},
{at: 1.5, expect: 'shape(from calc(-2.5% + 22.5px) 20px, arc to calc(-7.5% + 7.5px) -30px of 25px 35px, arc by calc(-7.5% + 37.5px) -20px of 15px 15px cw rotate 390deg, arc to calc(-12.5% + 37.5px) 20px of 10px 5px)'},
]);
test_interpolation({
property: 'clip-path',
from: 'path("M 5 5 A 10,20 0 0,0 15,-15 a 30,30 30 1,1 15,-5 A 10,5 0 0,0 25 20")',
to: 'shape(from 15px 15px, arc to 5px -25px of 20px 30px, arc by 25px -15px of 20px cw rotate 270deg small, arc to 25px 20px of 10px 5px small cw)' // ccw, cw, cw
to: 'shape(from 15px 15px, arc to 5px -25px of 20px 30px, arc by 25px -15px of 20px 20px cw rotate 270deg small, arc to 25px 20px of 10px 5px small cw)' // ccw, cw, cw
}, [
{at: -0.3, expect: 'shape(from 2px 2px, arc to 18px -12px of 7px 17px, arc by 12px -2px of 33px 33px rotate -42deg cw large, arc to 25px 20px of 10px 5px)'},
{at: 0, expect: 'shape(from 5px 5px, arc to 15px -15px of 10px 20px, arc by 15px -5px of 30px cw rotate 30deg large, arc to 25px 20px of 10px 5px)'},
{at: 0, expect: 'shape(from 5px 5px, arc to 15px -15px of 10px 20px, arc by 15px -5px of 30px 30px cw rotate 30deg large, arc to 25px 20px of 10px 5px)'},
{at: 0.3, expect: 'shape(from 8px 8px, arc to 12px -18px of 13px 23px, arc by 18px -8px of 27px 27px rotate 102deg cw large, arc to 25px 20px of 10px 5px cw)'},
{at: 0.5, expect: 'shape(from 10px 10px, arc to 10px -20px of 15px 25px, arc by 20px -10px of 25px rotate 150deg cw large, arc to 25px 20px of 10px 5px cw)'},
{at: 1, expect: 'shape(from 15px 15px, arc to 5px -25px of 20px 30px, arc by 25px -15px of 20px rotate 270deg cw, arc to 25px 20px of 10px 5px cw)'},
{at: 1.5, expect: 'shape(from 20px 20px, arc to 0px -30px of 25px 35px, arc by 30px -20px of 15px rotate 390deg cw, arc to 25px 20px of 10px 5px cw)'},
{at: 0.5, expect: 'shape(from 10px 10px, arc to 10px -20px of 15px 25px, arc by 20px -10px of 25px 25px rotate 150deg cw large, arc to 25px 20px of 10px 5px cw)'},
{at: 1, expect: 'shape(from 15px 15px, arc to 5px -25px of 20px 30px, arc by 25px -15px of 20px 20px rotate 270deg cw, arc to 25px 20px of 10px 5px cw)'},
{at: 1.5, expect: 'shape(from 20px 20px, arc to 0px -30px of 25px 35px, arc by 30px -20px of 15px 15px rotate 390deg cw, arc to 25px 20px of 10px 5px cw)'},
]);
</script>

View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Masking: Test clip-path property and shape function with single-value arc radius</title>
<link rel="help" href="https://drafts.csswg.org/css-shapes-2/#funcdef-shape">
<link rel="match" href="reference/clip-path-shape-arc-ref.html">
<meta name="assert" content="When providing one radius value with percentage, the percentage should be relative to the diagonal.">
<meta name="fuzzy" content="maxDifference=0-64;totalPixels=0-128">
</head>
<style>
#shape {
width: 400px;
height: 300px;
background: green;
clip-path: shape(
from 0px 100px,
arc to 20px 100px of 10% large cw,
arc to 100px 20px of 5% small,
arc to 0 100px of calc(10px + 15%)
rotate 30deg);
}
</style>
<body>
<div id="shape"></div>
</body>
</html>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Masking: Test clip-path property and shape function with single-value arc radius</title>
<link rel="help" href="https://drafts.csswg.org/css-shapes-2/#funcdef-shape">
</head>
<style>
#shape {
/* 500/sqrt(2) ~= 353 */
width: 353px;
height: 353px;
background: green;
clip-path: shape(
from 0px 100px,
arc to 20px 100px of 10% large cw,
arc to 100px 20px of 5% small,
arc to 0 100px of calc(10px + 15%)
rotate 30deg);
}
</style>
<body>
<div id="shape"></div>
</body>
</html>

View file

@ -29,8 +29,10 @@ test_valid_value("clip-path", "shape(from 10px 10px, curve to 50px 20px with 10r
test_valid_value("clip-path", "shape(from 10px 10px, curve by 50px 20px with 10rem 1px / 20vh 1ch)");
test_valid_value("clip-path", "shape(from 10px 10px, smooth to 50px 20px with 10rem 1%)");
test_valid_value("clip-path", "shape(from 10px 10px, smooth to 50px 1pt)");
test_valid_value("clip-path", "shape(from 10px 10px, arc to 50px 1pt of 10px 10px)", "shape(from 10px 10px, arc to 50px 1pt of 10px)");
test_valid_value("clip-path", "shape(from 10px 10px, arc to 50px 1pt of 10px 10px small rotate 0deg)", "shape(from 10px 10px, arc to 50px 1pt of 10px)");
test_valid_value("clip-path", "shape(from 10px 10px, arc to 50px 1pt of 10px 10px)");
test_valid_value("clip-path", "shape(from 10px 10px, arc to 50px 1pt of 10%)");
test_valid_value("clip-path", "shape(from 10px 10px, arc to 50px 1pt of 10px 10px small rotate 0deg)", "shape(from 10px 10px, arc to 50px 1pt of 10px 10px)");
test_valid_value("clip-path", "shape(from 10px 10px, arc to 50px 1pt of 10px small rotate 0deg)", "shape(from 10px 10px, arc to 50px 1pt of 10px)");
test_valid_value("clip-path", "shape(from 10% 1rem, arc to 50px 1pt of 20% cw large rotate 25deg)", "shape(from 10% 1rem, arc to 50px 1pt of 20% cw large rotate 25deg)");
test_valid_value("clip-path", "shape(evenodd from 0px 0px, close)");

View file

@ -32,7 +32,7 @@
<div class="item">i<br>j</div>
<div class="item">o<br>p</div>
</div>
<div class="rule" style="height:100px;"></div>
<div class="rule" style="height:160px;"></div>
<div class="column">
<div class="item">e<br>f</div>
<div class="item">k<br>l</div>

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/420267099">
<div style="columns:2; column-fill:auto; height:100px;">
<div style="display:table;">
<div style="display:table-header-group; break-inside:avoid;">
<div style="display:table;">
<div id="col" style="display:table-column;"></div>
<div style="width:10px; height:10px;"></div>
</div>
</div>
<div style="height:150px;"></div>
</div>
</div>
<script>
col.offsetLeft;
</script>

View file

@ -13,7 +13,6 @@
<script>
test_invalid_value("column-rule-color", "auto");
test_invalid_value("column-rule-color", "green blue");
test_invalid_value("column-rule-color", "green, blue");
</script>
</body>

View file

@ -12,7 +12,6 @@
<body>
<script>
test_invalid_value("column-rule-style", "auto");
test_invalid_value("column-rule-style", "double dashed");
</script>
</body>
</html>

View file

@ -18,7 +18,6 @@ test_invalid_value("column-rule-width", "10");
test_invalid_value("column-rule-width", "-20px");
test_invalid_value("column-rule-width", "30%");
test_invalid_value("column-rule-width", "medium 40px");
</script>
</body>
</html>

View file

@ -0,0 +1,3 @@
features:
- name: overlay
files: "**"

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Intrinsic Size Test: intrinsic-size with from-element</title>
<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#intrinsic-size-override">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_valid_value("contain-intrinsic-size", "from-element");
</script>
</body>
</html>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#min-max-widths">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio-size-transfers">
<meta name="assert" content="When computed logical width is auto, computed logical height behaves as auto,
the used logical height should be determined with respect to any max logical width constraint.">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<style>
.container {
width: 100px;
}
img {
max-width: 100%;
height: 100%;
}
</style>
</head>
<body>
<p>Test passes if there is a filled green square.</p>
<div class="container">
<img src="aspect-ratio/support/200x200-green.png"/>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show more