diff options
Diffstat (limited to 'tests')
917 files changed, 30681 insertions, 3150 deletions
diff --git a/tests/wpt/meta-legacy-layout/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html.ini b/tests/wpt/meta-legacy-layout/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html.ini new file mode 100644 index 00000000000..ed555fc3b90 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html.ini @@ -0,0 +1,2 @@ +[float-nowrap-hyphen-rewind-1.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-htb.html.ini new file mode 100644 index 00000000000..de75e0bf554 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-htb.html.ini @@ -0,0 +1,42 @@ +[align-self-htb-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-vlr.html.ini new file mode 100644 index 00000000000..bd90de9b2d8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-vlr.html.ini @@ -0,0 +1,42 @@ +[align-self-htb-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-vrl.html.ini new file mode 100644 index 00000000000..e55263690e9 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-ltr-vrl.html.ini @@ -0,0 +1,42 @@ +[align-self-htb-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-htb.html.ini new file mode 100644 index 00000000000..9e6472eba92 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-htb.html.ini @@ -0,0 +1,42 @@ +[align-self-htb-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-vlr.html.ini new file mode 100644 index 00000000000..d46f5235c8f --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-vlr.html.ini @@ -0,0 +1,42 @@ +[align-self-htb-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-vrl.html.ini new file mode 100644 index 00000000000..7e6457a2f4c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-htb-rtl-vrl.html.ini @@ -0,0 +1,42 @@ +[align-self-htb-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-htb.html.ini new file mode 100644 index 00000000000..36d0d010bba --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-htb.html.ini @@ -0,0 +1,45 @@ +[align-self-vlr-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-vlr.html.ini new file mode 100644 index 00000000000..5b5d1f7d83c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-vlr.html.ini @@ -0,0 +1,45 @@ +[align-self-vlr-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-vrl.html.ini new file mode 100644 index 00000000000..489565537ad --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-ltr-vrl.html.ini @@ -0,0 +1,45 @@ +[align-self-vlr-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-htb.html.ini new file mode 100644 index 00000000000..dc1f0c8c023 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-vlr.html.ini new file mode 100644 index 00000000000..f386b38a44a --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-vrl.html.ini new file mode 100644 index 00000000000..ff173cfa08e --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vlr-rtl-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-htb.html.ini new file mode 100644 index 00000000000..6766752b079 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-htb.html.ini @@ -0,0 +1,45 @@ +[align-self-vrl-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-vlr.html.ini new file mode 100644 index 00000000000..d6a82c04de9 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-vlr.html.ini @@ -0,0 +1,45 @@ +[align-self-vrl-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-vrl.html.ini new file mode 100644 index 00000000000..a670188399d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-ltr-vrl.html.ini @@ -0,0 +1,45 @@ +[align-self-vrl-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-htb.html.ini new file mode 100644 index 00000000000..43a38301d1c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-vlr.html.ini new file mode 100644 index 00000000000..db108a2c4bb --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-vlr.html.ini @@ -0,0 +1,45 @@ +[align-self-vrl-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-vrl.html.ini new file mode 100644 index 00000000000..b7b07e611cb --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/align-self-vrl-rtl-vrl.html.ini @@ -0,0 +1,45 @@ +[align-self-vrl-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-htb.html.ini new file mode 100644 index 00000000000..1d08d251141 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-htb.html.ini @@ -0,0 +1,57 @@ +[justify-self-htb-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-vlr.html.ini new file mode 100644 index 00000000000..0322ba8cfa8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-vlr.html.ini @@ -0,0 +1,57 @@ +[justify-self-htb-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-vrl.html.ini new file mode 100644 index 00000000000..65d5518e4d9 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-ltr-vrl.html.ini @@ -0,0 +1,57 @@ +[justify-self-htb-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-htb.html.ini new file mode 100644 index 00000000000..5c58a2242e8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-vlr.html.ini new file mode 100644 index 00000000000..01e6f92328d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-vrl.html.ini new file mode 100644 index 00000000000..1a23f5106e0 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-htb-rtl-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-htb.html.ini new file mode 100644 index 00000000000..dfa60d031e1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-htb.html.ini @@ -0,0 +1,54 @@ +[justify-self-vlr-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-vlr.html.ini new file mode 100644 index 00000000000..363ae3feea2 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-vlr.html.ini @@ -0,0 +1,54 @@ +[justify-self-vlr-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-vrl.html.ini new file mode 100644 index 00000000000..112d0883f23 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-ltr-vrl.html.ini @@ -0,0 +1,54 @@ +[justify-self-vlr-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-htb.html.ini new file mode 100644 index 00000000000..f1be1793404 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-htb.html.ini @@ -0,0 +1,54 @@ +[justify-self-vlr-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-vlr.html.ini new file mode 100644 index 00000000000..51366a5746b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-vlr.html.ini @@ -0,0 +1,54 @@ +[justify-self-vlr-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-vrl.html.ini new file mode 100644 index 00000000000..92fcdd05f2c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vlr-rtl-vrl.html.ini @@ -0,0 +1,54 @@ +[justify-self-vlr-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-htb.html.ini new file mode 100644 index 00000000000..4aa23b00a6f --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-htb.html.ini @@ -0,0 +1,54 @@ +[justify-self-vrl-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-vlr.html.ini new file mode 100644 index 00000000000..a496a010743 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-vlr.html.ini @@ -0,0 +1,54 @@ +[justify-self-vrl-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-vrl.html.ini new file mode 100644 index 00000000000..11cda30a6d7 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-ltr-vrl.html.ini @@ -0,0 +1,54 @@ +[justify-self-vrl-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-htb.html.ini new file mode 100644 index 00000000000..819a1260859 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-htb.html.ini @@ -0,0 +1,54 @@ +[justify-self-vrl-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-vlr.html.ini new file mode 100644 index 00000000000..0f691f563d8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-vlr.html.ini @@ -0,0 +1,54 @@ +[justify-self-vrl-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-vrl.html.ini new file mode 100644 index 00000000000..5bef34779ba --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/justify-self-vrl-rtl-vrl.html.ini @@ -0,0 +1,54 @@ +[justify-self-vrl-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-htb.html.ini new file mode 100644 index 00000000000..548fb403314 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-htb.html.ini @@ -0,0 +1,36 @@ +[safe-align-self-htb.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL + + [.item 21] + expected: FAIL + + [.item 22] + expected: FAIL + + [.item 23] + expected: FAIL + + [.item 24] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-vlr.html.ini new file mode 100644 index 00000000000..dc7f1aaadbe --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-vlr.html.ini @@ -0,0 +1,63 @@ +[safe-align-self-vlr.html] + [.item 2] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL + + [.item 21] + expected: FAIL + + [.item 22] + expected: FAIL + + [.item 23] + expected: FAIL + + [.item 24] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-vrl.html.ini new file mode 100644 index 00000000000..9abf206f419 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-align-self-vrl.html.ini @@ -0,0 +1,63 @@ +[safe-align-self-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL + + [.item 21] + expected: FAIL + + [.item 22] + expected: FAIL + + [.item 23] + expected: FAIL + + [.item 24] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-htb.html.ini new file mode 100644 index 00000000000..0d0930c3ebf --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-htb.html.ini @@ -0,0 +1,63 @@ +[safe-justify-self-htb.html] + [.item 2] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL + + [.item 21] + expected: FAIL + + [.item 22] + expected: FAIL + + [.item 23] + expected: FAIL + + [.item 24] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-vlr.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-vlr.html.ini new file mode 100644 index 00000000000..51d411cb81d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-vlr.html.ini @@ -0,0 +1,36 @@ +[safe-justify-self-vlr.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-vrl.html.ini new file mode 100644 index 00000000000..5169b3af936 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/safe-justify-self-vrl.html.ini @@ -0,0 +1,36 @@ +[safe-justify-self-vrl.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html.ini new file mode 100644 index 00000000000..55341d644df --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html.ini @@ -0,0 +1,27 @@ +[stretch-intrinsic-size-htb-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html.ini new file mode 100644 index 00000000000..92dfe16a87a --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html.ini @@ -0,0 +1,27 @@ +[stretch-intrinsic-size-htb-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html.ini new file mode 100644 index 00000000000..758bf0896cb --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html.ini @@ -0,0 +1,27 @@ +[stretch-intrinsic-size-vrl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html.ini new file mode 100644 index 00000000000..f472fb29d77 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html.ini @@ -0,0 +1,27 @@ +[stretch-intrinsic-size-vrl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/table-align-self-stretch.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/table-align-self-stretch.html.ini new file mode 100644 index 00000000000..c3ad158fbdc --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/table-align-self-stretch.html.ini @@ -0,0 +1,12 @@ +[table-align-self-stretch.html] + [.item 1] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 7] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/abspos/table-justify-self-stretch.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/abspos/table-justify-self-stretch.html.ini new file mode 100644 index 00000000000..5260d871c3c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/abspos/table-justify-self-stretch.html.ini @@ -0,0 +1,12 @@ +[table-justify-self-stretch.html] + [.item 1] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 7] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/blocks/align-content-block-display-coverage.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/blocks/align-content-block-display-coverage.html.ini new file mode 100644 index 00000000000..fc6a5eb0f9e --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/blocks/align-content-block-display-coverage.html.ini @@ -0,0 +1,21 @@ +[align-content-block-display-coverage.html] + [display:block should support align-content] + expected: FAIL + + [display:flow should support align-content] + expected: FAIL + + [display:flow-root should support align-content] + expected: FAIL + + [display:inline-block should support align-content] + expected: FAIL + + [display:list-item should support align-content] + expected: FAIL + + [display:flow-root list-item should support align-content] + expected: FAIL + + [display:table-caption should support align-content] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-align/multicol/align-content-multicol.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/multicol/align-content-multicol.html.ini new file mode 100644 index 00000000000..ef2c8b6c1c7 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-align/multicol/align-content-multicol.html.ini @@ -0,0 +1,96 @@ +[align-content-multicol.html] + [align-content: normal] + expected: FAIL + + [align-content: normal; contain: size] + expected: FAIL + + [align-content: start] + expected: FAIL + + [align-content: start; contain: size] + expected: FAIL + + [align-content: unsafe start] + expected: FAIL + + [align-content: unsafe start; contain: size] + expected: FAIL + + [align-content: safe start] + expected: FAIL + + [align-content: safe start; contain: size] + expected: FAIL + + [align-content: flex-start] + expected: FAIL + + [align-content: flex-start; contain: size] + expected: FAIL + + [align-content: space-between] + expected: FAIL + + [align-content: space-between; contain: size] + expected: FAIL + + [align-content: stretch] + expected: FAIL + + [align-content: stretch; contain: size] + expected: FAIL + + [align-content: center] + expected: FAIL + + [align-content: center; contain: size] + expected: FAIL + + [align-content: unsafe center] + expected: FAIL + + [align-content: unsafe center; contain: size] + expected: FAIL + + [align-content: safe center] + expected: FAIL + + [align-content: safe center; contain: size] + expected: FAIL + + [align-content: space-around] + expected: FAIL + + [align-content: space-around; contain: size] + expected: FAIL + + [align-content: space-evenly] + expected: FAIL + + [align-content: space-evenly; contain: size] + expected: FAIL + + [align-content: end] + expected: FAIL + + [align-content: end; contain: size] + expected: FAIL + + [align-content: unsafe end] + expected: FAIL + + [align-content: unsafe end; contain: size] + expected: FAIL + + [align-content: safe end] + expected: FAIL + + [align-content: safe end; contain: size] + expected: FAIL + + [align-content: flex-end] + expected: FAIL + + [align-content: flex-end; contain: size] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-animations/animate-with-color-mix.html.ini b/tests/wpt/meta-legacy-layout/css/css-animations/animate-with-color-mix.html.ini deleted file mode 100644 index 4172b4ec02b..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-animations/animate-with-color-mix.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[animate-with-color-mix.html] - [Animate from neutral keyframe with color-mix to legacy rgb] - expected: FAIL - - [Animate from legacy rgb to neutral keyframe with color-mix] - expected: FAIL - - [Animate from neutral keyframe with color-mix to srgb] - expected: FAIL - - [Animate from srgb to neutral keyframe with color-mix] - expected: FAIL - - [Animate from color-mix with transparency to legacy rgba] - expected: FAIL - - [Animate from legacy rgba to color-mix with transparency] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-animations/animation-css-variable-dependent-property.html.ini b/tests/wpt/meta-legacy-layout/css/css-animations/animation-css-variable-dependent-property.html.ini new file mode 100644 index 00000000000..f506d3af042 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-animations/animation-css-variable-dependent-property.html.ini @@ -0,0 +1,3 @@ +[animation-css-variable-dependent-property.html] + [Dependent property updates correctly] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html.ini b/tests/wpt/meta-legacy-layout/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html.ini new file mode 100644 index 00000000000..ac507684c8e --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html.ini @@ -0,0 +1,3 @@ +[animation-restarted-after-changing-iteration-count-after-completion.html] + [Setting 'animation-iteration-count: infinite' after a CSS Animation is completed restarts the animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-border-box_with_position.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-border-box_with_position.html.ini deleted file mode 100644 index 69809075f65..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-border-box_with_position.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[origin-border-box_with_position.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-content-box_with_position.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-content-box_with_position.html.ini deleted file mode 100644 index f656f7f785b..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-content-box_with_position.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[origin-content-box_with_position.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-padding-box_with_position.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-padding-box_with_position.html.ini deleted file mode 100644 index a45e4caaf32..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-origin/origin-padding-box_with_position.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[origin-padding-box_with_position.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-position/background-position-right-in-body.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-position/background-position-right-in-body.html.ini new file mode 100644 index 00000000000..bd3ad8b4b20 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-backgrounds/background-position/background-position-right-in-body.html.ini @@ -0,0 +1,2 @@ +[background-position-right-in-body.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/parsing/background-image-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/parsing/background-image-valid.html.ini index e3db293e1b9..f8414c28ca7 100644 --- a/tests/wpt/meta-legacy-layout/css/css-backgrounds/parsing/background-image-valid.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-backgrounds/parsing/background-image-valid.html.ini @@ -8,3 +8,14 @@ [e.style['background-image'\] = "cross-fade(50% url(http://www.example.com), 50% url(http://www.example.com))" should set the property value] expected: FAIL + [e.style['background-image'\] = "cross-fade( 1% red, green)" should set the property value] + expected: FAIL + + [e.style['background-image'\] = "cross-fade(1% red , green)" should set the property value] + expected: FAIL + + [e.style['background-image'\] = "cross-fade(1% red, green )" should set the property value] + expected: FAIL + + [e.style['background-image'\] = "cross-fade(1% red, cross-fade(2% red, green))" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/table-cell-background-local-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/table-cell-background-local-002.html.ini new file mode 100644 index 00000000000..9d3ab932e4b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-backgrounds/table-cell-background-local-002.html.ini @@ -0,0 +1,2 @@ +[table-cell-background-local-002.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/table-cell-background-local-003.html.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/table-cell-background-local-003.html.ini new file mode 100644 index 00000000000..a34e44278f1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-backgrounds/table-cell-background-local-003.html.ini @@ -0,0 +1,2 @@ +[table-cell-background-local-003.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-conditional/at-supports-048.html.ini b/tests/wpt/meta-legacy-layout/css/css-conditional/at-supports-048.html.ini new file mode 100644 index 00000000000..f23f24659a2 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-conditional/at-supports-048.html.ini @@ -0,0 +1,2 @@ +[at-supports-048.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-basic.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-basic.html.ini new file mode 100644 index 00000000000..89c1d1f0860 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-basic.html.ini @@ -0,0 +1,2 @@ +[cross-fade-basic.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-computed-value.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-computed-value.html.ini new file mode 100644 index 00000000000..f3812b46de2 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-computed-value.html.ini @@ -0,0 +1,18 @@ +[cross-fade-computed-value.html] + [Property background-image value 'cross-fade(30% color-mix(in srgb, currentcolor, blue), white)'] + expected: FAIL + + [Property background-image value 'cross-fade(50% red, 50% green)'] + expected: FAIL + + [Property background-image value 'cross-fade(20% red, 20% green)'] + expected: FAIL + + [Property background-image value 'cross-fade(50% red, 50% green, 50% blue)'] + expected: FAIL + + [Property background-image value 'cross-fade(calc(101%) red, green)'] + expected: FAIL + + [Property background-image value 'cross-fade(calc(-200%) red, green)'] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-natural-size.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-natural-size.html.ini new file mode 100644 index 00000000000..29ed0a819db --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-natural-size.html.ini @@ -0,0 +1,2 @@ +[cross-fade-natural-size.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-premultiplied-alpha.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-premultiplied-alpha.html.ini new file mode 100644 index 00000000000..fd0f03b4df0 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-premultiplied-alpha.html.ini @@ -0,0 +1,2 @@ +[cross-fade-premultiplied-alpha.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-target-alpha.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-target-alpha.html.ini new file mode 100644 index 00000000000..a9acc56ae3b --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-images/cross-fade-target-alpha.html.ini @@ -0,0 +1,2 @@ +[cross-fade-target-alpha.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-008.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-008.html.ini deleted file mode 100644 index f6bf6aa789e..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-008.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[trailing-other-space-separators-break-spaces-008.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html.ini b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html.ini new file mode 100644 index 00000000000..d6eca7d32f0 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html.ini @@ -0,0 +1,2 @@ +[transform-percent-with-width-and-height-separate.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/css/css-transforms/animation/transform-percent-with-width-and-height.html.ini b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/transform-percent-with-width-and-height.html.ini new file mode 100644 index 00000000000..571667c84a6 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/transform-percent-with-width-and-height.html.ini @@ -0,0 +1,2 @@ +[transform-percent-with-width-and-height.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html.ini b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html.ini new file mode 100644 index 00000000000..9c378f24ef8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html.ini @@ -0,0 +1,2 @@ +[translate-percent-with-width-and-height-separate.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/css/css-transforms/animation/translate-percent-with-width-and-height.html.ini b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/translate-percent-with-width-and-height.html.ini new file mode 100644 index 00000000000..a3472b82a28 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/translate-percent-with-width-and-height.html.ini @@ -0,0 +1,2 @@ +[translate-percent-with-width-and-height.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/css/css-transitions/animations/animate-with-color-mix.html.ini b/tests/wpt/meta-legacy-layout/css/css-transitions/animations/animate-with-color-mix.html.ini deleted file mode 100644 index b195b0e5f61..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-transitions/animations/animate-with-color-mix.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[animate-with-color-mix.html] - [Transition from color-mix to legacy rgb] - expected: FAIL - - [Transition from legacy rgb to color-mix] - expected: FAIL - - [Transition from color-mix to srgb] - expected: FAIL - - [Transition from srgb to color-mix] - expected: FAIL - - [Transition from color-mix with transparency to legacy rgba] - expected: FAIL - - [Transition from legacy rgba to color-mix with transparency] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-values/minmax-length-percent-serialize.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/minmax-length-percent-serialize.html.ini index 3a95b5bb439..23148f4e36f 100644 --- a/tests/wpt/meta-legacy-layout/css/css-values/minmax-length-percent-serialize.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-values/minmax-length-percent-serialize.html.ini @@ -214,3 +214,9 @@ ['max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)' as a computed value should serialize as 'max(10px + (10px + min(10%, 30px)) * 2, 5% + 80px)'.] expected: FAIL + + ['max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)' as a specified value should serialize as 'max(10px + ((10px + min(10%, 30px)) * 2), 5% + 5em)'.] + expected: FAIL + + ['max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)' as a computed value should serialize as 'max(10px + ((10px + min(10%, 30px)) * 2), 5% + 80px)'.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-values/progress-computed.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/progress-computed.tentative.html.ini index 740691a9d0e..441914bc0c4 100644 --- a/tests/wpt/meta-legacy-layout/css/css-values/progress-computed.tentative.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-values/progress-computed.tentative.html.ini @@ -25,3 +25,30 @@ [calc(progress(1 from 0 to 1) * 1deg) should be used-value-equivalent to 1deg] expected: FAIL + + [progress(1000em from 10em to 110em) should be used-value-equivalent to 10] + expected: FAIL + + [scale(progress(1000em from 10rem to 110em)) should be used-value-equivalent to scale(10)] + expected: FAIL + + [scale(progress(0em from 0rem to 0em)) should be used-value-equivalent to scale(0)] + expected: FAIL + + [scale(progress(sign(1em - 1rem) * 1ex from 0rem to 0em)) should be used-value-equivalent to scale(0)] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 10em from 2rem to 12em) / 2) should be used-value-equivalent to 0.5] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 10) should be used-value-equivalent to 20] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 30) should be used-value-equivalent to 60] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) / 4) should be used-value-equivalent to 0.5] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 4) should be used-value-equivalent to 8] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget-interop.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget-interop.html.ini index 758c26f2a2d..b1067b9d6e8 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget-interop.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget-interop.html.ini @@ -1,3 +1,6 @@ [MediaQueryList-extends-EventTarget-interop.html] [listeners are called in order they were added, ignoring capture parameter] expected: FAIL + + [listener added with addListener and addEventListener is called once] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini new file mode 100644 index 00000000000..00753fab1d1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini @@ -0,0 +1,6 @@ +[offsetTopLeft-border-box.html] + [container: 0] + expected: FAIL + + [container: 1] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-default-css.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-default-css.html.ini index 38761f42590..0fe6109c74c 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-default-css.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-default-css.html.ini @@ -4,3 +4,6 @@ [Smooth scrolling of an element with default scroll-behavior] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-element.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-element.html.ini index 885aae83604..32d247c71cc 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-element.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-element.html.ini @@ -67,3 +67,6 @@ [Set scrollTop to element with smooth scroll-behavior] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-root.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-root.html.ini index 782ade6c1b0..cee83d041ad 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-root.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-root.html.ini @@ -112,3 +112,6 @@ [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-window.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-window.html.ini index d6929eec58d..3a6f134e005 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-window.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-main-frame-window.html.ini @@ -76,3 +76,6 @@ [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini index 0150811ae72..847d6fa45f5 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini @@ -2,3 +2,5 @@ [scrollIntoView with nested elements with different scroll-behavior] expected: FAIL + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-navigation.html.ini index a3e30250229..7df48559b7e 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-navigation.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-navigation.html.ini @@ -4,3 +4,6 @@ [Smooth scrolling while doing history navigation.] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-positions.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-positions.html.ini index ecf3c45a692..6a6bfe03f6e 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-positions.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth-positions.html.ini @@ -10,3 +10,6 @@ [Scroll positions when performing smooth scrolling from (0, 500) to (500, 250) using scrollIntoView() ] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth.html.ini index 5e7ef730970..02c82fe1523 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-smooth.html.ini @@ -1,3 +1,6 @@ [scroll-behavior-smooth.html] [scroll-behavior: smooth on DIV element] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-root.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-root.html.ini index 86d0de5045f..16fec73ff53 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-root.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-root.html.ini @@ -112,3 +112,6 @@ [Aborting an ongoing smooth scrolling on a subframe with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-window.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-window.html.ini index ffadf832a1a..3ad50289fd8 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-window.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scroll-behavior-subframe-window.html.ini @@ -76,3 +76,6 @@ [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html.ini new file mode 100644 index 00000000000..e32aeffe2e1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html.ini @@ -0,0 +1,3 @@ +[scrollIntoView-align-scrollport-covering-child.html] + [scrollIntoView scrolls scrollport-covering child in both axes] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html.ini b/tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html.ini new file mode 100644 index 00000000000..1790944d309 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html.ini @@ -0,0 +1,6 @@ +[CSSStyleSheet-constructable-replace-cssRules.html] + [cssRules tests (sync: true)] + expected: FAIL + + [cssRules tests (sync: false)] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/any-link-dynamic-001.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/any-link-dynamic-001.html.ini deleted file mode 100644 index 586972d310f..00000000000 --- a/tests/wpt/meta-legacy-layout/css/selectors/any-link-dynamic-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[any-link-dynamic-001.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/invalidation/any-link-attribute-removal.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/invalidation/any-link-attribute-removal.html.ini new file mode 100644 index 00000000000..8fc796a9fb8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/selectors/invalidation/any-link-attribute-removal.html.ini @@ -0,0 +1,2 @@ +[any-link-attribute-removal.html] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/invalidation/has-sibling-insertion-removal.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/invalidation/has-sibling-insertion-removal.html.ini index 76513c88a16..78fdcc66a68 100644 --- a/tests/wpt/meta-legacy-layout/css/selectors/invalidation/has-sibling-insertion-removal.html.ini +++ b/tests/wpt/meta-legacy-layout/css/selectors/invalidation/has-sibling-insertion-removal.html.ini @@ -34,3 +34,6 @@ [subject12: color after #sibling12_1 removed should be rgb(255, 255, 0)] expected: FAIL + + [subject13: color after #sibling12_1 removed should be rgb(0, 128, 0)] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-is-where.html.ini index 83f85b33d30..55f8b960e45 100644 --- a/tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini +++ b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-is-where.html.ini @@ -1,46 +1,4 @@ -[is-where-parsing.html] - [Nested :is] - expected: FAIL - - [Pseudo-elements after] - expected: FAIL - - [Nested :where] - expected: FAIL - - [Pseudo-classes after] - expected: FAIL - - [Multiple selectors with combinators] - expected: FAIL - - [Combinators after] - expected: FAIL - - [Nested inside :host, without combinators] - expected: FAIL - - [Pseudo-classes inside] - expected: FAIL - - [After part with simple pseudo-class] - expected: FAIL - - [Nested inside :not, without combinators] - expected: FAIL - - [Nested inside :not, with combinators] - expected: FAIL - - [Trailing whitespace] - expected: FAIL - - [Nested inside :host, with trailing whitespace] - expected: FAIL - - [Pseudo-elements inside] - expected: FAIL - +[parse-is-where.html] [":is(div )" should be a valid selector] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-part.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-part.html.ini new file mode 100644 index 00000000000..43cb05fcda9 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-part.html.ini @@ -0,0 +1,54 @@ +[parse-part.html] + ["::part(--foo)" should be a valid selector] + expected: FAIL + + ["::part(bar)" should be a valid selector] + expected: FAIL + + ["::part(--)" should be a valid selector] + expected: FAIL + + ["::part(--0)" should be a valid selector] + expected: FAIL + + ["::part(foo bar)" should be a valid selector] + expected: FAIL + + ["::part(-foo bar)" should be a valid selector] + expected: FAIL + + ["::part(foo):focus" should be a valid selector] + expected: FAIL + + ["::part(foo):hover" should be a valid selector] + expected: FAIL + + ["::part(foo):focus-within" should be a valid selector] + expected: FAIL + + ["::part(foo)::before" should be a valid selector] + expected: FAIL + + ["::part(foo)::after" should be a valid selector] + expected: FAIL + + ["::part(foo)::placeholder" should be a valid selector] + expected: FAIL + + ["::part(foo)::first-line" should be a valid selector] + expected: FAIL + + ["::part(foo)::first-letter" should be a valid selector] + expected: FAIL + + ["::part(foo)::file-selector-button" should be a valid selector] + expected: FAIL + + ["::part(foo):is(:focus)" should be a valid selector] + expected: FAIL + + [":lang(en)::part(foo)" should be a valid selector] + expected: FAIL + + [":dir(ltr)::part(foo)" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-slotted.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-slotted.html.ini new file mode 100644 index 00000000000..62fae425194 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-slotted.html.ini @@ -0,0 +1,24 @@ +[parse-slotted.html] + ["::slotted(bar)" should be a valid selector] + expected: FAIL + + ["::slotted([attr=\\"foo\\"\])" should be a valid selector] + expected: FAIL + + ["::slotted(*)" should be a valid selector] + expected: FAIL + + ["::slotted(.class)" should be a valid selector] + expected: FAIL + + ["::slotted(:not(foo))" should be a valid selector] + expected: FAIL + + ["::slotted(:not(:nth-last-of-type(2)):not([slot=\\"foo\\"\]))" should be a valid selector] + expected: FAIL + + ["::slotted(:first-child)" should be a valid selector] + expected: FAIL + + ["::slotted(:hover)" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-state.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-state.html.ini index 3460fad94a9..d4069801d24 100644 --- a/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-state.html.ini +++ b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-state.html.ini @@ -19,3 +19,15 @@ ["my-input[type=\\"foo\\"\]:state(--0)::before" should be a valid selector] expected: FAIL + + ["my-input[type=\\"foo\\"\]:state(--0)::part(inner)" should be a valid selector] + expected: FAIL + + ["my-input[type=\\"foo\\"\]:state(--0)::part(inner):state(bar)" should be a valid selector] + expected: FAIL + + ["::part(inner):state(bar)::before" should be a valid selector] + expected: FAIL + + ["::part(inner):state(bar)::after" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/dom/events/webkit-transition-end-event.html.ini b/tests/wpt/meta-legacy-layout/dom/events/webkit-transition-end-event.html.ini index eb8b8d11dff..b7fe8688a23 100644 --- a/tests/wpt/meta-legacy-layout/dom/events/webkit-transition-end-event.html.ini +++ b/tests/wpt/meta-legacy-layout/dom/events/webkit-transition-end-event.html.ini @@ -1,5 +1,4 @@ [webkit-transition-end-event.html] - expected: TIMEOUT [dispatchEvent of an transitionend event does not trigger a prefixed event handler or listener] expected: FAIL @@ -13,25 +12,16 @@ expected: FAIL [event types for prefixed and unprefixed transitionend event listeners should be named appropriately] - expected: NOTRUN + expected: FAIL [ontransitionend and onwebkittransitionend are not aliases] expected: FAIL [webkitTransitionEnd event listener should trigger for an animation] - expected: TIMEOUT + expected: FAIL [dispatchEvent of a webkitTransitionEnd event does trigger a prefixed event handler or listener] expected: FAIL [onwebkittransitionend event handler should not trigger if an unprefixed event handler also exists] expected: FAIL - - [webkitTransitionEnd event listener should not trigger if an unprefixed listener also exists] - expected: NOTRUN - - [webkitTransitionEnd event listener should not trigger if an unprefixed event handler also exists] - expected: NOTRUN - - [webkitTransitionEnd event listener is case sensitive] - expected: NOTRUN diff --git a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini index bfffdfb40db..6f86ee42541 100644 --- a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini +++ b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini @@ -89,6 +89,9 @@ [Teardowns should be called synchronously during addTeardown() if the subscription is inactive] expected: FAIL + [Subscribe with just a function as the next handler] + expected: FAIL + [observable-constructor.any.html] [Observable constructor] @@ -180,3 +183,6 @@ [Teardowns should be called synchronously during addTeardown() if the subscription is inactive] expected: FAIL + + [Subscribe with just a function as the next handler] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.window.js.ini b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.window.js.ini index 394e39cd818..182e784b969 100644 --- a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.window.js.ini +++ b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.window.js.ini @@ -7,3 +7,6 @@ [Cannot subscribe to an Observable in a detached document] expected: FAIL + + [Observable from EventTarget does not get notified for events in detached documents] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-event-target.any.js.ini b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-event-target.any.js.ini new file mode 100644 index 00000000000..94327ea5e4c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-event-target.any.js.ini @@ -0,0 +1,20 @@ +[observable-event-target.any.worker.html] + [EventTarget.on() returns an Observable] + expected: FAIL + + [Aborting the subscription should stop the emission of events] + expected: FAIL + + [EventTarget Observables can multicast subscriptions for event handling] + expected: FAIL + + +[observable-event-target.any.html] + [EventTarget.on() returns an Observable] + expected: FAIL + + [Aborting the subscription should stop the emission of events] + expected: FAIL + + [EventTarget Observables can multicast subscriptions for event handling] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini deleted file mode 100644 index 4ecd6d9f753..00000000000 --- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[navigation-unload-cross-origin.sub.window.html] - [Cross-origin navigation started from unload handler must be ignored] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini index 60a4fa51f8a..60a4fa51f8a 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini +++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini diff --git a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini deleted file mode 100644 index a03a8322165..00000000000 --- a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[traverse_the_history_3.html] - [Multiple history traversals, last would be aborted] - expected: FAIL 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-legacy-layout/html/browsers/windows/embedded-opener-remove-frame.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/windows/embedded-opener-remove-frame.html.ini index 3a5c1fd357c..b01684d4e92 100644 --- a/tests/wpt/meta-legacy-layout/html/browsers/windows/embedded-opener-remove-frame.html.ini +++ b/tests/wpt/meta-legacy-layout/html/browsers/windows/embedded-opener-remove-frame.html.ini @@ -1,5 +1,5 @@ [embedded-opener-remove-frame.html] - expected: TIMEOUT + expected: CRASH [opener and "removed" embedded documents] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini index 5cdcce07c65..17247137cb1 100644 --- a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini +++ b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini @@ -1,2 +1,2 @@ [canvas.2d.disconnected.html] - expected: FAIL + expected: CRASH diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html.ini new file mode 100644 index 00000000000..a16f0fccdf1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html.ini new file mode 100644 index 00000000000..2e2112c793f --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html.ini new file mode 100644 index 00000000000..0fd3c9ee532 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html.ini new file mode 100644 index 00000000000..b45e9850e78 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html.ini new file mode 100644 index 00000000000..e99615d8e03 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html.ini new file mode 100644 index 00000000000..3a6d2b315fe --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.isotropic.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html.ini new file mode 100644 index 00000000000..01c1322f5fd --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.mostly-x.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html.ini new file mode 100644 index 00000000000..3333d8908fd --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.mostly-y.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html.ini new file mode 100644 index 00000000000..b13d321b725 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.x-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html.ini new file mode 100644 index 00000000000..3bbc75904e1 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.y-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.css-filters.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.css-filters.w.html.ini deleted file mode 100644 index 0e942652abd..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.css-filters.w.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[2d.layer.css-filters.w.html] - expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js.ini deleted file mode 100644 index 1aef60f3976..00000000000 --- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.layer.opaque-canvas.worker.html] - [Checks that layer blending works inside opaque canvas] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/document-render-blocking-partial.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/document-render-blocking-partial.tentative.html.ini deleted file mode 100644 index 33079ddf70d..00000000000 --- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/document-render-blocking-partial.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[document-render-blocking-partial.tentative.html] - expected: ERROR diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/document-render-blocking.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/document-render-blocking.tentative.html.ini deleted file mode 100644 index bf425d34f4c..00000000000 --- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/document-render-blocking.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[document-render-blocking.tentative.html] - expected: ERROR diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini new file mode 100644 index 00000000000..511925c1b61 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-002.tentative.html] + [blocking defers until needed element is parsed] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-004.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-004.tentative.html.ini new file mode 100644 index 00000000000..b3fd8fa38aa --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-004.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-004.tentative.html] + [removing link in the head makes it no longer blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-005.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-005.tentative.html.ini new file mode 100644 index 00000000000..42f9c7342db --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-005.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-005.tentative.html] + [removing 'blocking' makes it no longer blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-007.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-007.tentative.html.ini new file mode 100644 index 00000000000..6c63b2db412 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-007.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-007.tentative.html] + [link with non-matching media has no effect] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-009.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-009.tentative.html.ini new file mode 100644 index 00000000000..3c105de1140 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-009.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-009.tentative.html] + [changing media to non-matching makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-010.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-010.tentative.html.ini new file mode 100644 index 00000000000..ef4e023dfa6 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-010.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-010.tentative.html] + [changing rel to non-expect makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-013.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-013.tentative.html.ini new file mode 100644 index 00000000000..9ce1660b44c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-013.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-013.tentative.html] + [removing href makes it no longer blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-014.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-014.tentative.html.ini new file mode 100644 index 00000000000..d338af1ff52 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-014.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-014.tentative.html] + [link in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-015.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-015.tentative.html.ini new file mode 100644 index 00000000000..0dd5e871106 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-015.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-015.tentative.html] + [removing link the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-016.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-016.tentative.html.ini new file mode 100644 index 00000000000..7718cf5bef3 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-016.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-016.tentative.html] + [removing 'blocking' in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-017.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-017.tentative.html.ini new file mode 100644 index 00000000000..3c50d660460 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-017.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-017.tentative.html] + [adding 'blocking=render' in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-018.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-018.tentative.html.ini new file mode 100644 index 00000000000..98fda576808 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-018.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-018.tentative.html] + [changing media to matching in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-019.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-019.tentative.html.ini new file mode 100644 index 00000000000..55b1e8fcbc4 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-019.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-019.tentative.html] + [changing media to non-matching in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-020.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-020.tentative.html.ini new file mode 100644 index 00000000000..d9ca447f339 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-020.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-020.tentative.html] + [changing rel to non-expect in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-021.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-021.tentative.html.ini new file mode 100644 index 00000000000..9944597e235 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-021.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-021.tentative.html] + [changing rel to expect in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-022.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-022.tentative.html.ini new file mode 100644 index 00000000000..17d86d7881a --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-022.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-022.tentative.html] + [adding href in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-023.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-023.tentative.html.ini new file mode 100644 index 00000000000..a0bd7e500ca --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-023.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-023.tentative.html] + [removing href in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-025.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-025.tentative.html.ini new file mode 100644 index 00000000000..6d1a662295c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-025.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-025.tentative.html] + [adding an id in the body satisfies render block] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-026.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-026.tentative.html.ini new file mode 100644 index 00000000000..76fadb90c93 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-026.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-026.tentative.html] + [removing id after it was renderer keeps render block satisfied] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini new file mode 100644 index 00000000000..342b4dbb48d --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-028.tentative.html] + [removing some links but not all keeps at least the matching link blocking] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini new file mode 100644 index 00000000000..b0c997e92a8 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini @@ -0,0 +1,3 @@ +[document-with-fragment-valid.html] + [Autofocus elements in top-level browsing context's documents with URL fragments should be skipped.] + 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 d169bd2e9fa..8acae84e1e4 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,4 +1,5 @@ [supported-elements.html] + expected: TIMEOUT [Contenteditable element should support autofocus] expected: FAIL @@ -9,7 +10,7 @@ expected: FAIL [Area element should support autofocus] - expected: FAIL + expected: TIMEOUT [Host element with delegatesFocus should support autofocus] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini index 25d9964f057..e5994e21efc 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini @@ -1,4 +1,5 @@ [iframe_sandbox_popups_escaping-1.html] type: testharness + expected: CRASH [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 26704422bbe..841bafc6eca 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_escaping-2.html] - expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index 6fcdfb95246..fe55ddae3f1 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini @@ -1,5 +1,4 @@ [iframe_sandbox_popups_escaping-3.html] type: testharness - expected: CRASH [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: FAIL 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 6bec7a732b8..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,4 +1,5 @@ [iframe_sandbox_popups_nonescaping-2.html] type: testharness + 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/forms/form-submission-0/multipart-formdata.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini index ad86a0c8730..b6bb03ac65b 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini @@ -122,9 +122,6 @@ [multipart/form-data: backslash in name (normal form)] expected: FAIL - [multipart/form-data: backslash in name (formdata event)] - expected: FAIL - [multipart/form-data: backslash in value (normal form)] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/text-plain.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/text-plain.window.js.ini index f2be49a9d8b..0640702ece5 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/text-plain.window.js.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/text-plain.window.js.ini @@ -152,9 +152,6 @@ [text/plain: double quote in value (normal form)] expected: FAIL - [text/plain: backslash in name (formdata event)] - expected: FAIL - [text/plain: 0x00 in name (formdata event)] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html.ini new file mode 100644 index 00000000000..47036c2fa3e --- /dev/null +++ b/tests/wpt/meta-legacy-layout/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html.ini @@ -0,0 +1,9 @@ +[popover-stacking-anchor-attribute.tentative.html] + [anchor attribute relationship] + expected: FAIL + + [indirect anchor attribute relationship] + expected: FAIL + + [more complex nesting, all using anchor ancestry] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini deleted file mode 100644 index 6339abba6d9..00000000000 --- a/tests/wpt/meta-legacy-layout/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[async-script.html?reload] - expected: ERROR - -[async-script.html?default] diff --git a/tests/wpt/meta-legacy-layout/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html.ini b/tests/wpt/meta-legacy-layout/html/webappapis/dynamic-markup-insertion/document-write/module-static-import-delayed.html.ini index f9a4f08cd70..53acb938c1b 100644 --- a/tests/wpt/meta-legacy-layout/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html.ini +++ b/tests/wpt/meta-legacy-layout/html/webappapis/dynamic-markup-insertion/document-write/module-static-import-delayed.html.ini @@ -1,3 +1,3 @@ -[module-tla-delayed.html] +[module-static-import-delayed.html] [document.write in an imported module] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini index 31bfd644df0..5929373e000 100644 --- a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini +++ b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini @@ -1,4 +1,5 @@ [promise-job-entry.html] + expected: TIMEOUT [Fulfillment handler on fulfilled promise] expected: FAIL @@ -15,4 +16,4 @@ expected: FAIL [Fulfillment handler on pending-then-fulfilled promise] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/performance-timeline/tentative/performance-entry-source-deleted-frame.html.ini b/tests/wpt/meta-legacy-layout/performance-timeline/tentative/performance-entry-source-deleted-frame.html.ini deleted file mode 100644 index 81f6bbe98f7..00000000000 --- a/tests/wpt/meta-legacy-layout/performance-timeline/tentative/performance-entry-source-deleted-frame.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[performance-entry-source-deleted-frame.html] - expected: ERROR - [PerformanceEntry source is null when the window it points to is removed.] - expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index 163415c0681..eb3c0425ce9 100644 --- a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -913,3 +913,9 @@ [X SNR (-681.6200453096801 dB) is not greater than or equal to 65.737. Got -681.6200453096801.] 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[15073\]\t-1.0866308837024133e+29\t6.4605611562728882e-1\t1.0866308837024133e+29\t1.6819450469056362e+29\t3.8985999999999999e-3\n\t[15074\]\t2.5936898589134216e-1\t5.9696805477142334e-1\t3.3759906888008118e-1\t5.6552283858697683e-1\t3.8985999999999999e-3\n\tMax AbsError of 1.0866308837024133e+29 at index of 15073.\n\tMax RelError of 1.6819450469056362e+29 at index of 15073.\n] + expected: FAIL + + [X SNR (-537.2875549396125 dB) is not greater than or equal to 65.737. Got -537.2875549396125.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/close-event.tentative.any.js.ini b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/close-event.tentative.any.js.ini deleted file mode 100644 index bde8cb726b5..00000000000 --- a/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/close-event.tentative.any.js.ini +++ /dev/null @@ -1,10 +0,0 @@ -[close-event.tentative.any.worker.html] - expected: TIMEOUT - [Close event listener added with onclose must be called.] - expected: TIMEOUT - - -[close-event.tentative.any.html] - expected: TIMEOUT - [Close event listener added with onclose must be called.] - expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js.ini b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js.ini new file mode 100644 index 00000000000..730f1a634dd --- /dev/null +++ b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js.ini @@ -0,0 +1,10 @@ +[document-destroyed.tentative.window.html] + expected: ERROR + [The context is navigated to a new document and a close event is fired.] + expected: TIMEOUT + + [The window is closed and a close event is fired.] + expected: NOTRUN + + [The iframe is deleted and a close event is fired.] + expected: NOTRUN diff --git a/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js.ini b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js.ini new file mode 100644 index 00000000000..99c50df9265 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js.ini @@ -0,0 +1,3 @@ +[entangled-after-back-forward-cache-restore.https.tentative.window.html] + [MessagePort still works after the page is restored from BFCache] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini new file mode 100644 index 00000000000..c625c16f713 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini @@ -0,0 +1,7 @@ +[explicitly-closed.tentative.window.html] + expected: TIMEOUT + [Close event on port2 is fired when port1 is explicitly closed] + expected: TIMEOUT + + [Close event on port2 is fired when port1, which is in a different window, is explicitly closed.] + expected: TIMEOUT diff --git a/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js.ini b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js.ini new file mode 100644 index 00000000000..267ce437f5c --- /dev/null +++ b/tests/wpt/meta-legacy-layout/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js.ini @@ -0,0 +1,8 @@ +[garbage-collected.tentative.any.worker.html] + [Entangled port is garbage collected, and the close event is fired.] + expected: FAIL + + +[garbage-collected.tentative.any.html] + [Entangled port is garbage collected, and the close event is fired.] + expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/webmessaging/without-ports/018.html.ini b/tests/wpt/meta-legacy-layout/webmessaging/with-ports/018.html.ini index b7b36c1d3a4..b7b36c1d3a4 100644 --- a/tests/wpt/meta-legacy-layout/webmessaging/without-ports/018.html.ini +++ b/tests/wpt/meta-legacy-layout/webmessaging/with-ports/018.html.ini diff --git a/tests/wpt/meta-legacy-layout/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini b/tests/wpt/meta-legacy-layout/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini new file mode 100644 index 00000000000..aa6c9e5b826 --- /dev/null +++ b/tests/wpt/meta-legacy-layout/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini @@ -0,0 +1,4 @@ +[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/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 49cea087849..386963ef744 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -35,6 +35,13 @@ {} ] ], + "animated-textarea.html": [ + "a23eed669c2e968ec66c38da700e2081e118f952", + [ + null, + {} + ] + ], "aom-in-destroyed-iframe.html": [ "c8f0aca12ebbf8719228e0d857d8e5c799e3b669", [ @@ -1294,6 +1301,13 @@ {} ] ], + "chrome-bug-1505250-crash.html": [ + "befbfd33af751cc2c488bdb639b84538bf4b8afc", + [ + null, + {} + ] + ], "chrome-custom-highlight-crash.html": [ "61e5075ed4e1b485019d96b402bbf17926bd1098", [ @@ -2215,6 +2229,13 @@ } }, "css-images": { + "cross-fade-legacy-crash.html": [ + "25445765036f44bef3d714dae0fb0e80a738f1b7", + [ + null, + {} + ] + ], "empty-radial-gradient-crash.html": [ "be1fb120cc86527b4f1c65f09499d01dcbed9eca", [ @@ -2369,6 +2390,13 @@ ] ], "crashtests": { + "chrome-bug-1377573.html": [ + "3419a23ee4321d32ebebd153362462371b9d3863", + [ + null, + {} + ] + ], "chrome-counter-in-multicol-details-crash.html": [ "d992f0a1d96ec24d044c6b03894f4621994cbf88", [ @@ -2457,6 +2485,13 @@ ] ], "crashtests": { + "add-list-item-marker.html": [ + "fa14315cabfdba936e5c81c53d9a0b2583a3cfe1", + [ + null, + {} + ] + ], "as-baseline-aligned-grid-item.html": [ "f9a9e1dad0d21f9b29c8643a57d9862582a4a1d0", [ @@ -2604,6 +2639,13 @@ {} ] ], + "interleaved-bfc-crash.html": [ + "30a619de67b0e13e73a866931a45e7796250c93a", + [ + null, + {} + ] + ], "margin-and-break-before-child-spanner.html": [ "8ec36250cf025b5ad98baf9029582a0f2252713b", [ @@ -3398,6 +3440,13 @@ }, "css-page": { "crashtests": { + "match-media-listener-relayout-inside-fixed-size-overflow-hidden-print.html": [ + "77f9dc335fd9bdf21865e70ece214917bbcf904a", + [ + null, + {} + ] + ], "match-media-listener-shrink-content-print.html": [ "dc8e691224b0dc902d9a46187513c47b9bc356d4", [ @@ -4047,6 +4096,15 @@ ] }, "overflow-wrap": { + "crashtests": { + "overflow-wrap-leading-floats-crash.html": [ + "0661cf7286494ca00c91e60b635c25501b3a8d87", + [ + null, + {} + ] + ] + }, "overflow-wrap-break-word-long-crash.html": [ "e318386ded5bd3d1d61cf876fe420c8f5ada799f", [ @@ -4470,8 +4528,8 @@ ] }, "css-view-transitions": { - "document-element-detatched-crash.html": [ - "3c5419a8102c2160ac82e69bf046408b2c542e41", + "document-element-detached-crash.html": [ + "cfdf769695dc11864229d0f4fe5d1dfc3712aec7", [ null, {} @@ -4484,6 +4542,13 @@ {} ] ], + "list-style-position-style-change-crash.html": [ + "5910d5d95a1027646f7228449fd234cff7079a84", + [ + null, + {} + ] + ], "root-element-cv-hidden-crash.html": [ "890194b7c171ea7a42fd083567637aacee4fd877", [ @@ -4996,6 +5061,13 @@ {} ] ], + "change-input-type-of-focused-text-control-and-make-it-editing-host.html": [ + "fec4ff13e8cbb45b6faa2a0872b47558003a58b7", + [ + null, + {} + ] + ], "contenteditable-will-be-blurred-by-focus-event-listener.html": [ "a887b1de90e63e0da24a3872b32727282690b896", [ @@ -5730,6 +5802,13 @@ "fetch": { "api": { "crashtests": { + "aborted-fetch-response.https.html": [ + "fa1ad1717f0060b82ef07d9d41ca650a0b9b186c", + [ + null, + {} + ] + ], "body-window-destroy.html": [ "646d3c5f8ce9e6591e6bd1eb2096e36d611a8899", [ @@ -7643,13 +7722,6 @@ } }, "crashtests": { - "color-mix-crashtest.html": [ - "91d29464f50d12985e791d889abfc482a188f767", - [ - null, - {} - ] - ], "get-computed-timing-crash.html": [ "b666eea91f67d1f26cbc88f1f26d4008ceb76af6", [ @@ -30096,6 +30168,19 @@ {} ] ], + "multi-line-row-flex-fragmentation-080-print.html": [ + "4fd577cc4213aab38e4e4d2cfcc05fee0ae7aada", + [ + null, + [ + [ + "/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print-ref.html", + "==" + ] + ], + {} + ] + ], "single-line-column-flex-fragmentation-060-print.html": [ "15890801979709a152f580ad8f18d6af7e102b61", [ @@ -30109,6 +30194,32 @@ {} ] ], + "single-line-column-flex-fragmentation-065-print.html": [ + "14a5dc6ac0ca62134f9ca87afefe66235ba25514", + [ + null, + [ + [ + "/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print-ref.html", + "==" + ] + ], + {} + ] + ], + "single-line-column-flex-fragmentation-066-print.html": [ + "4ee00f3601d51bfe2eb1ef98b742f7253b5dcd92", + [ + null, + [ + [ + "/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print-ref.html", + "==" + ] + ], + {} + ] + ], "single-line-row-flex-fragmentation-042-print.html": [ "f8a2934ac5a9d9a9f2b67867545dd37486cae38a", [ @@ -30121,6 +30232,32 @@ ], {} ] + ], + "single-line-row-flex-fragmentation-045-print.html": [ + "f51d0d161f8f1f72d2ea5a0c303ce1969cbd26d5", + [ + null, + [ + [ + "/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print-ref.html", + "==" + ] + ], + {} + ] + ], + "single-line-row-flex-fragmentation-046-print.html": [ + "2c934c303db4b0b781b2646f187dec19fb45c3fa", + [ + null, + [ + [ + "/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print-ref.html", + "==" + ] + ], + {} + ] ] }, "float-with-large-margin-bottom-cross-page-001-print.html": [ @@ -31004,6 +31141,132 @@ {} ] ], + "page-orientation-on-landscape-001-print.html": [ + "6832a5537d96aed1b37ec72e18ef6aa102646471", + [ + null, + [ + [ + "/css/css-page/page-orientation-portrait-ref.html", + "==" + ] + ], + { + "page_ranges": { + "/css/css-page/page-orientation-on-landscape-001-print.html": [ + [ + 2 + ] + ] + } + } + ] + ], + "page-orientation-on-portrait-001-print.html": [ + "5ab3e1edfd1a260c8fa9c516d1357ed3a4238147", + [ + null, + [ + [ + "/css/css-page/page-orientation-landscape-ref.html", + "==" + ] + ], + { + "page_ranges": { + "/css/css-page/page-orientation-on-portrait-001-print.html": [ + [ + 2 + ] + ] + } + } + ] + ], + "page-orientation-on-square-001-print.html": [ + "06e4f00d3c43fed651f958d6ccf578e4ca717f99", + [ + null, + [ + [ + "/css/css-page/page-orientation-square-ref.html", + "==" + ] + ], + { + "page_ranges": { + "/css/css-page/page-orientation-on-square-001-print.html": [ + [ + 2 + ] + ] + } + } + ] + ], + "page-rule-specificity-001-print.html": [ + "dc28ad75db381a3297080bd867397a0f51a30220", + [ + null, + [ + [ + "/css/css-page/page-rule-specificity-print-landscape-ref.html", + "==" + ] + ], + { + "page_ranges": { + "/css/css-page/page-rule-specificity-001-print.html": [ + [ + 2 + ] + ] + } + } + ] + ], + "page-rule-specificity-002-print.html": [ + "01d9b2b92d8e0175981520aad9706708dd2edff8", + [ + null, + [ + [ + "/css/css-page/page-rule-specificity-print-landscape-ref.html", + "==" + ] + ], + { + "page_ranges": { + "/css/css-page/page-rule-specificity-002-print.html": [ + [ + 2 + ] + ] + } + } + ] + ], + "page-rule-specificity-003-print.html": [ + "eda6c7ee51bdd5ea60a06bdf98e99b384d80ec22", + [ + null, + [ + [ + "/css/css-page/page-rule-specificity-print-portrait-ref.html", + "==" + ] + ], + { + "page_ranges": { + "/css/css-page/page-rule-specificity-003-print.html": [ + [ + 2 + ] + ] + } + } + ] + ], "pseudo-first-margin-001-print.html": [ "c2c04514f39b0869605ae8bf1b5d3c9ce9435261", [ @@ -62133,13 +62396,17 @@ ] ], "float-nowrap-4.html": [ - "bf11e6e31c416e85580bc4792b2b3503dd87f99b", + "c7b5f8801c9fd26ef204cfd171d7592c9943fd00", [ null, [ [ "/css/CSS2/floats/float-nowrap-4-ref.html", "==" + ], + [ + "/css/CSS2/floats/float-nowrap-4-ref2.html", + "==" ] ], {} @@ -62210,6 +62477,23 @@ {} ] ], + "float-nowrap-hyphen-rewind-1.html": [ + "9c629ef2872838bad74623f8ed8750e180a5a3c2", + [ + null, + [ + [ + "/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref.html", + "==" + ], + [ + "/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref2.html", + "==" + ] + ], + {} + ] + ], "float-paint-relayout.html": [ "0499e3e9a260b069adec05f1abc66feccc178bcc", [ @@ -132708,7 +132992,7 @@ ] ], "background-clip-padding-box-with-border-radius.html": [ - "8595caec7bb2d751dd87aebc777be84de6233af7", + "22d7bd9d297d25206834f93c78b27d9bc3b28039", [ null, [ @@ -132717,7 +133001,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 29 + ], + [ + 0, + 80 + ] + ] + ] + ] + } ] ], "background-clip_padding-box.html": [ @@ -132997,7 +133297,7 @@ ] ], "background-image-007.html": [ - "9bccd2d364a64f20f879d6825fcc60c49f32cd11", + "b532dd6397cd49ec3d4e47fe3cda8b972c7bf4a8", [ null, [ @@ -133638,6 +133938,19 @@ {} ] ], + "background-position-right-in-body.html": [ + "4c4024e2e596bd61c87f6ba8c3083837a03dba10", + [ + null, + [ + [ + "/css/filter-effects/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], "subpixel-position-center.tentative.html": [ "b708e123122f7e299919401cf8fb8554f77889bf", [ @@ -141004,6 +141317,32 @@ {} ] ], + "table-cell-background-local-002.html": [ + "5398ce8eff737f3c808c0286958e426250b76c31", + [ + null, + [ + [ + "/css/css-backgrounds/reference/table-cell-background-local-002-ref.html", + "==" + ] + ], + {} + ] + ], + "table-cell-background-local-003.html": [ + "e2662bec1fa75049c07cbc07c24449e37c4c56a7", + [ + null, + [ + [ + "/css/css-backgrounds/reference/table-cell-background-local-003-ref.html", + "==" + ] + ], + {} + ] + ], "table-cell-background-local.html": [ "e52aa26ef209dccb54f0362ca4a30964904ce7b0", [ @@ -141779,6 +142118,19 @@ {} ] ], + "become-unfragmented-001.html": [ + "df104fc494dfc3bd5070c04abf66becaea468a24", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "block-end-aligned-abspos-nested.html": [ "b74a28e7319bad9f70a404bb613513778f42615f", [ @@ -145719,6 +146071,19 @@ {} ] ], + "single-line-column-flex-fragmentation-067.html": [ + "6ee57d1852d5aace634062c08c7faa4baf68401d", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "single-line-row-flex-fragmentation-001.html": [ "379327a4aff584192f076d3f9d8f3ead232c0f5c", [ @@ -146277,6 +146642,32 @@ ], {} ] + ], + "single-line-row-flex-fragmentation-047.html": [ + "061e62f3c368c29421d92c25b326e62732b690e5", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "single-line-row-flex-fragmentation-048.html": [ + "96a302716ca0865382b34697b6a3dd198579e128", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] ] }, "float-000.html": [ @@ -146487,6 +146878,19 @@ {} ] ], + "float-017.html": [ + "5ca1f80a4e8b6061af99f2708f30398f7206e76d", + [ + null, + [ + [ + "/css/css-break/float-017-ref.html", + "==" + ] + ], + {} + ] + ], "float-in-self-collapsing-block-000.html": [ "e42d941e78ab45e9107ac49ee8c8c2b4c6d43c9d", [ @@ -157623,6 +158027,19 @@ {} ] ], + "at-supports-048.html": [ + "dc0ed9dc425595f7da0066ff8036954d27d65a4c", + [ + null, + [ + [ + "/css/css-conditional/at-supports-048-ref.html", + "==" + ] + ], + {} + ] + ], "at-supports-content-001.html": [ "19c99f504be7766978dc3816d186e7c2dabe126e", [ @@ -159055,6 +159472,19 @@ {} ] ], + "contain-inline-size-grid-stretches-auto-rows.html": [ + "c168950929d58c2c7b0b4c4228f2185f8a7b4e88", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "contain-inline-size-grid.html": [ "5cd8bfc96e34e36ff1a340e9e09963df9b22ec89", [ @@ -161401,6 +161831,19 @@ {} ] ], + "contain-size-grid-stretches-auto-rows.html": [ + "10b84665aa91edc2245fae08c9ee259c8bc1863a", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "contain-size-inline-block-001.html": [ "41458550272f896d47e15210c82f4c22d386d9e0", [ @@ -162225,7 +162668,7 @@ ] ], "container-for-cue.html": [ - "f53d161db0dda46b608c40e5ef1ccf714828a364", + "a460f79af061de93f269ad56455f878408437b85", [ null, [ @@ -163257,7 +163700,7 @@ ] ], "content-visibility-075.html": [ - "f7f834a68bbc72d57f46f53812e99c0b1860281c", + "ade27bdfaa72e776fc268514adcc9899c1341c2d", [ null, [ @@ -163270,7 +163713,7 @@ ] ], "content-visibility-076.html": [ - "15d0906f715473036be50e224a4b1ccbd4190a54", + "2aadcde0c70bef0b40d15c32609774b23eb5f9cb", [ null, [ @@ -163296,7 +163739,7 @@ ] ], "content-visibility-079.html": [ - "2fef671f0e611063fdbcf7180b84590743e022ec", + "c2cbbfb5a3d20f1d4888fcc98326ea9d90510a84", [ null, [ @@ -163543,7 +163986,7 @@ ] ], "content-visibility-vs-scrollIntoView-001.html": [ - "0f874e660753ea36ba7234281757c3495bba798f", + "b7af3462572086263174072990cbe9e4c13e20b8", [ null, [ @@ -163621,7 +164064,7 @@ ] ], "content-visibility-with-popover-top-layer-004.html": [ - "bbf4567e37d4c1df68ce9119ec3952722324f12e", + "24fef4f67e9d673a0b4098f760412bc01d993a95", [ null, [ @@ -163634,7 +164077,7 @@ ] ], "content-visibility-with-popover-top-layer-005.html": [ - "264d7b317e0a3fb2fc655c6cceda29d2fe252f9d", + "76b736a6379e2fc1f59223eb169ee363f4ab28e4", [ null, [ @@ -163725,7 +164168,7 @@ ] ], "content-visibility-with-top-layer-004.html": [ - "e21b11e92db1fe8e7684536d04371ae077c8e66a", + "218251fdcdb5731f808bd16c41e76a3b4cb8c42a", [ null, [ @@ -163738,7 +164181,7 @@ ] ], "content-visibility-with-top-layer-005.html": [ - "5283aea19734d1349622a249715c0a190d1ebad5", + "c1cb1bcde35e73f0fc33b54e6d2b30e71d330307", [ null, [ @@ -174761,7 +175204,7 @@ ] ], "flexbox-align-self-horiz-001-table.xhtml": [ - "1785ca8dfc0a8bf5b52a0e870e4605902b8f2685", + "c168c822e998771c82c87fe82975f2743ba00aa3", [ null, [ @@ -181348,6 +181791,19 @@ {} ] ], + "nested-flex-image-loading-invalidates-intrinsic-sizes.html": [ + "246740960c0b9891b8f22bd76f9edd8b6cbf3c62", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "nested-orthogonal-flexbox-relayout.html": [ "ef158c6a4884b8ee2840bafe27e605e618aa8be5", [ @@ -184382,6 +184838,19 @@ {} ] ], + "font-size-adjust-text-orientation.html": [ + "ab73e86e87f9ada84b62a69d7caa2601c97ec57b", + [ + null, + [ + [ + "/css/css-fonts/font-size-adjust-text-orientation-ref.html", + "==" + ] + ], + {} + ] + ], "font-size-adjust-units-001.html": [ "4e27ef1116ed7ba48fb5fbc38b49c315eeeef71c", [ @@ -190161,7 +190630,7 @@ ] ], "grid-self-baseline-changes-grid-area-size-004.html": [ - "e882ea9a9c13e8f99ea01e1477368167f4dcd947", + "e877b81480dc008c71eae8ce3d8ae49dc17eb02a", [ null, [ @@ -190174,7 +190643,7 @@ ] ], "grid-self-baseline-changes-grid-area-size-005.html": [ - "8c91c67a9e43531ef5b812d6bacf5fe041be0f40", + "21cc0b8ac21c5f401d20d661437221b64118bbf5", [ null, [ @@ -194278,7 +194747,7 @@ ] ], "masonry-item-placement-001.html": [ - "2f8cfbfacc21aade2e06f858f83abb0af468d7bf", + "649e1edb7cb9bd903f795f6e605d12ae566390eb", [ null, [ @@ -194291,7 +194760,7 @@ ] ], "masonry-item-placement-002.html": [ - "5f7083b173331f1e4593d4d97cc0513039606316", + "7d321bf731684173f483d6ba3abde11da307de8e", [ null, [ @@ -194304,7 +194773,7 @@ ] ], "masonry-item-placement-003.html": [ - "4d490c18d5d1d79f960e82ded542e1de5bccadc6", + "8a183cffc6bd3f59fb0c7ca58b9a85588bdab3f8", [ null, [ @@ -194490,7 +194959,7 @@ ] ], "masonry-order-002.html": [ - "ae68f4e631a2f44540a60a7eebb5ef9a3ac9b84a", + "abad3d44b8326535bb1f44832011a1a6145a47b9", [ null, [ @@ -194546,7 +195015,7 @@ ] ], "masonry-track-sizing-explicit-block.html": [ - "05f60893900f44753d4873e60d4b348bd6270a07", + "3cc98708fe9aec94293eb5bcb296f01d3a4a7508", [ null, [ @@ -194585,7 +195054,7 @@ ] ], "masonry-track-sizing-span-row.html": [ - "6058ca5e7441c87db5f29cdb37d09e55134ead82", + "475c27f1ebea5598c6e3fcec0e21d13b08bc9499", [ null, [ @@ -195656,6 +196125,97 @@ {} ] ], + "standalone-axis-size-003.html": [ + "5c06ee62e10be27753f728adaddc4d2b3a74ecec", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "standalone-axis-size-004.html": [ + "d69412d62529018b301cc2baec58fb4e21f01e00", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "standalone-axis-size-005.html": [ + "586d26bf2fe3ecb6a003b97bb8827a230023f56d", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "standalone-axis-size-006.html": [ + "056f0a402803c84b2827aa41aefee021c46a5559", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "standalone-axis-size-007.html": [ + "464200614c717cdf24975ae90f15246eaf0eff86", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "standalone-axis-size-008.html": [ + "6ee4e77405b47c3de23c6fc19a25cec3d576511f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "standalone-axis-size-009.html": [ + "bbf585efd1ad7ca4aba112be57cd4e964ace94b6", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "subgrid-baseline-001.html": [ "95469c0018e0a97786aff086c0cabaf081ced7b4", [ @@ -196894,6 +197454,122 @@ {} ] ], + "cross-fade-basic.html": [ + "be396e52785a91e8b1c678d5596f9cae061e4184", + [ + null, + [ + [ + "/css/css-images/cross-fade-basic-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 10000 + ] + ] + ] + ] + } + ] + ], + "cross-fade-natural-size.html": [ + "9a62c61aa6d5eca37dbedad2cdd4ad3b12d91006", + [ + null, + [ + [ + "/css/css-images/cross-fade-natural-size-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 300000 + ] + ] + ] + ] + } + ] + ], + "cross-fade-premultiplied-alpha.html": [ + "23d78428118b0550ec95a1f3d9573eb2d95032ba", + [ + null, + [ + [ + "/css/css-images/cross-fade-premultiplied-alpha-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 1, + 1 + ], + [ + 40000, + 40000 + ] + ] + ] + ] + } + ] + ], + "cross-fade-target-alpha.html": [ + "a10a2bfe8dff5d4cd0fbd9e834ec27e2cc366870", + [ + null, + [ + [ + "/css/css-images/cross-fade-target-alpha-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 8 + ], + [ + 0, + 300000 + ] + ] + ] + ] + } + ] + ], "css-image-fallbacks-and-annotations.html": [ "3a0e5e02da935fb72bab2e9feda65c2e9627c6fd", [ @@ -207774,7 +208450,7 @@ ] ], "clip-path-contentBox-1e.html": [ - "aa2f961f668691cbbe3a7ef4996a0534da3bea08", + "5fde5ccd9a98659b0cd356a2070df7bda186fad5", [ null, [ @@ -207790,7 +208466,7 @@ [ [ 0, - 64 + 65 ], [ 0, @@ -208155,7 +208831,7 @@ ] ], "clip-path-fillBox-1b.html": [ - "d77fd716fd5ae18188518d08996dfff5f5650ce4", + "529cee6a4298299211524b669ede185856f4a7c4", [ null, [ @@ -208175,7 +208851,7 @@ ], [ 0, - 355 + 376 ] ] ] @@ -208356,7 +209032,7 @@ ] ], "clip-path-inline-007.html": [ - "ffbc83108029e20f35dc4a40851ea1350ef4a2f4", + "9518b587c4f07958c3ec5915204c15495179cb0d", [ null, [ @@ -208376,7 +209052,7 @@ ], [ 0, - 325 + 332 ] ] ] @@ -208524,7 +209200,7 @@ ] ], "clip-path-marginBox-1c.html": [ - "cfeebeedf38d793f424b55bc6d4d6b8830a8f41d", + "7d6780731ed7d60899e5ef18ee4152fa22eac0b0", [ null, [ @@ -208544,7 +209220,7 @@ ], [ 0, - 287 + 424 ] ] ] @@ -209534,7 +210210,7 @@ ] ], "clip-path-viewBox-1d.html": [ - "3d5f355825b7f4601dd52ef17eb867c88b83d90d", + "0d58e4f331b5088acd15bd3313cc511584fc8662", [ null, [ @@ -209554,7 +210230,7 @@ ], [ 0, - 368 + 376 ] ] ] @@ -210486,6 +211162,45 @@ {} ] ], + "clip-path-on-svg-003.svg": [ + "01c4a2610e8cde9e8400fbc2a023ab936babd3ad", + [ + null, + [ + [ + "/css/css-masking/clip-path-svg-content/reference/clip-path-square-002-ref.svg", + "==" + ] + ], + {} + ] + ], + "clip-path-on-svg-004.svg": [ + "62a020e558676f533add52c8de80518eb54e6041", + [ + null, + [ + [ + "/css/css-masking/clip-path-svg-content/reference/clip-path-square-002-ref.svg", + "==" + ] + ], + {} + ] + ], + "clip-path-on-svg-005.svg": [ + "c39d2660280826b6ec2f579d011df3cc2a7f5572", + [ + null, + [ + [ + "/css/css-masking/clip-path-svg-content/reference/clip-path-square-002-ref.svg", + "==" + ] + ], + {} + ] + ], "clip-path-on-use-001.svg": [ "8a2cf81c51de6f62d498c3d2e4cfe7a50113a0f1", [ @@ -211683,7 +212398,7 @@ ] ], "mask-image-3h.html": [ - "7d33be438144e02d2b73ab661c53dab57ac7959f", + "29f2c33bdf16d22e0f1cf5958ee298ab3f15867c", [ null, [ @@ -211699,11 +212414,11 @@ [ [ 0, - 10 + 37 ], [ 0, - 80 + 146 ] ] ] @@ -211902,6 +212617,19 @@ {} ] ], + "mask-image-svg-foreignobject-zoomed.html": [ + "85a8b2dbf2799f1356677f4c2d38dd2ed3042d6e", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "mask-image-url-image-hash.html": [ "b1efc90818bec85d5022a9b908a14c2e0c35ff3b", [ @@ -262645,6 +263373,32 @@ {} ] ], + "transform-percent-with-width-and-height-separate.html": [ + "d03ba24f9366d71424c50a5db0fbda8c67612457", + [ + null, + [ + [ + "/css/css-transforms/animation/transform-percent-with-width-and-height-separate-ref.html", + "==" + ] + ], + {} + ] + ], + "transform-percent-with-width-and-height.html": [ + "a207435db402c70aaab2e22d46179915df7f4d86", + [ + null, + [ + [ + "/css/css-transforms/animation/transform-percent-with-width-and-height-ref.html", + "==" + ] + ], + {} + ] + ], "translate-animation-on-svg.html": [ "e5cc697360ca7548702c6f73dc7615a7a897e76c", [ @@ -262657,6 +263411,32 @@ ], {} ] + ], + "translate-percent-with-width-and-height-separate.html": [ + "bfd5d483feee54e27cecdffcdd5dec03ff044c27", + [ + null, + [ + [ + "/css/css-transforms/animation/translate-percent-with-width-and-height-separate-ref.html", + "==" + ] + ], + {} + ] + ], + "translate-percent-with-width-and-height.html": [ + "fa7ea844630692437cbb626958e0643253177318", + [ + null, + [ + [ + "/css/css-transforms/animation/translate-percent-with-width-and-height-ref.html", + "==" + ] + ], + {} + ] ] }, "backface-visibility-001.html": [ @@ -309527,6 +310307,19 @@ {} ] ], + "backdrop-filter-svg.html": [ + "01771ed56386c08c7c9c719d0417bd7ba897d6b9", + [ + null, + [ + [ + "/css/filter-effects/reference/backdrop-filter-svg-ref.html", + "==" + ] + ], + {} + ] + ], "backdrop-filter-update.html": [ "6a81fc63eb5d9bb08101f2125059dd110173b82e", [ @@ -314459,19 +315252,6 @@ ] }, "selectors": { - "any-link-dynamic-001.html": [ - "e84989fd0c27089a821e36145cebfc1423d1b03d", - [ - null, - [ - [ - "/css/selectors/any-link-dynamic-001-ref.html", - "==" - ] - ], - {} - ] - ], "case-insensitive-parent.html": [ "a684bbb97c870b587b73e616ca1bfa4fa423f4ff", [ @@ -315212,6 +315992,19 @@ ] }, "invalidation": { + "any-link-attribute-removal.html": [ + "9da6b2edeba36fe0a98b661fd1f027e85ea729bf", + [ + null, + [ + [ + "/css/selectors/invalidation/any-link-attribute-removal-ref.html", + "==" + ] + ], + {} + ] + ], "class-id-attr.html": [ "91a6f1a3a544bea376af2916b69a590bb0ac0a9a", [ @@ -319654,9 +320447,139 @@ ], {} ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html": [ + "6376d07b0e640b617ef100b7c04e8fe93e352ee8", + [ + null, + [ + [ + "/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html": [ + "145cb32757adbec61bb541a0cf6737b3ac9146f4", + [ + null, + [ + [ + "/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html": [ + "e921e0eaa65a6410a66aadce57fd8b1fe6096998", + [ + null, + [ + [ + "/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html": [ + "fd6ac687f9cf72a2efbf0975e5d645c88d5d4ed8", + [ + null, + [ + [ + "/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html": [ + "6442433e7c5a37e5447a9871e7528f16cd37b9c9", + [ + null, + [ + [ + "/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html", + "==" + ] + ], + {} + ] ] }, "layers": { + "2d.layer.anisotropic-blur.isotropic.html": [ + "4e496b7e4813c6af0c9676076612df123526a546", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.mostly-x.html": [ + "4217d9fad3fb719092c2d80ced75bb28dceeed3a", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.mostly-y.html": [ + "97a44e9045a040aae8b90cb6b2c5ca16f97cab04", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.x-only.html": [ + "fdf604616b8c904f2de1f37b2a53ccd343ea32ad", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.y-only.html": [ + "c7ceb63a87cb0a5d38208f973eda3f9f70d7d350", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only-expected.html", + "==" + ] + ], + {} + ] + ], "2d.layer.blur-from-outside-canvas.no-clipping.html": [ "b689ad39fe160d85725f67fa2fe7ebf03349d4dc", [ @@ -321587,9 +322510,269 @@ ], {} ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html": [ + "4417a1917c9abe01ad1fd7ed90051c72be1080e7", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html": [ + "d2024ad205e415ef069faef0a47d4008c531dbe9", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html": [ + "2ea26359fe9b5f05a874a79566a4964351aaff70", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html": [ + "fa49ea4682823b3b48b6fa77f3dbb4fae2e61812", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html": [ + "a9783ccb6a006a34d8cba0d533e23099c6ee7024", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html": [ + "ab83f50ea0e36b36caeb3411f698b19cf1fec636", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html": [ + "3028c2a700e1c4d2736de39565abfbbd00f1ac6f", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html": [ + "e8482cf3ed8df4d0c66dc2fd99a9f3011f6edc19", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html": [ + "fca324716b4807d54c74a0045704de3ced4040aa", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html": [ + "50cfb3083a2507040dabb7fc577d5edbbba15534", + [ + null, + [ + [ + "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html", + "==" + ] + ], + {} + ] ] }, "layers": { + "2d.layer.anisotropic-blur.isotropic.html": [ + "d59a4ccf62e3759438abf74e305eb61df3d63745", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.isotropic.w.html": [ + "15961d5c7ea822529fe1c0891463dd29c0569332", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.mostly-x.html": [ + "c5ad2ee6c585cc1448093b81cb1773b4b5a54599", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.mostly-x.w.html": [ + "60f5ac3ebdb1f699e1cced2477da6b0ae6d4bbb0", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.mostly-y.html": [ + "9545257cfa02c0aa7756d51e39aa030f5332975f", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.mostly-y.w.html": [ + "d533ad3187bf2b506f05f3021219a8891271d032", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.x-only.html": [ + "4552ad44339ab96cde937d19c5d6af5ed87afcb5", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.x-only.w.html": [ + "38abb21cd99baec10701077d88ab4a2a1ffc6bfc", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.y-only.html": [ + "87dbcd3708e41e73cf21f10d148c939b71bd08eb", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.anisotropic-blur.y-only.w.html": [ + "062328db751dbace3775d250bf9aefea54969e14", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only-expected.html", + "==" + ] + ], + {} + ] + ], "2d.layer.blur-from-outside-canvas.no-clipping.html": [ "3cd1c674a131f1e81c960ff4059a59cc7b38e1c5", [ @@ -321798,19 +322981,6 @@ {} ] ], - "2d.layer.css-filters.html": [ - "6f170aa1632bc8a87ab931d11a143c088ba1bbc3", - [ - null, - [ - [ - "/html/canvas/offscreen/layers/2d.layer.css-filters-expected.html", - "==" - ] - ], - {} - ] - ], "2d.layer.css-filters.shadow.html": [ "28d6e6e4033e6263e7141ccaf8ccf813e22e690d", [ @@ -321837,19 +323007,6 @@ {} ] ], - "2d.layer.css-filters.w.html": [ - "0c086af825d678eadf2769ecb9e78d7d3af19032", - [ - null, - [ - [ - "/html/canvas/offscreen/layers/2d.layer.css-filters-expected.html", - "==" - ] - ], - {} - ] - ], "2d.layer.global-filter.html": [ "2388a06a964222700dd1f71b57ad0b7004becfbb", [ @@ -337315,6 +338472,19 @@ ] ] }, + "use-animate-display-none-symbol-2.html": [ + "db06b641d9a60b094aee40a3930fd7229fcdb0d5", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], "use-animate-display-none-symbol.html": [ "6ae10ca8739dbedcc148bf7b398437131519d62b", [ @@ -337824,7 +338994,7 @@ "geometry": { "reftests": { "circle-001.svg": [ - "2fbd70d5a63d12a93d843a80477101b3c50beb78", + "4ece9da683b8c6cac33886a451155ab6297413ad", [ null, [ @@ -337833,11 +339003,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 8 + ] + ] + ] + ] + } ] ], "circle-002.svg": [ - "7f98f56ad0f70f73df86d9f8ed2e3325b1cc6df8", + "d9dd067b0484e5056eac72c151337cf44b349356", [ null, [ @@ -337846,11 +339032,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 53 + ], + [ + 0, + 370 + ] + ] + ] + ] + } ] ], "circle-003.svg": [ - "74c32fb33cb94cbb8637fc2504026409eaac605a", + "5cd5cbf3a5c0d35345a14afaa38482dd480f73ff", [ null, [ @@ -337859,11 +339061,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 2 + ] + ] + ] + ] + } ] ], "circle-004.svg": [ - "36c9e0096f0272d0762deb3305b07e2022fa66f7", + "1027078953d43716bb7dd230a8b1e22eb68fd77c", [ null, [ @@ -337872,7 +339090,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 35 + ], + [ + 0, + 434 + ] + ] + ] + ] + } ] ], "circle-005.svg": [ @@ -337902,7 +339136,7 @@ ] ], "ellipse-002.svg": [ - "081617288a1b782f36bb513329f7b988c78fac4c", + "86c40f389735c3fc132a206a3105e613d4e54de6", [ null, [ @@ -337911,11 +339145,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 53 + ], + [ + 0, + 278 + ] + ] + ] + ] + } ] ], "ellipse-003.svg": [ - "6b81eadf1b7cf7b85406336b5bc7bcc576338dea", + "a4f0ed141c583d6f7047d3526d4aad0d68e5fdef", [ null, [ @@ -337924,7 +339174,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 4 + ] + ] + ] + ] + } ] ], "ellipse-004.svg": [ @@ -339827,6 +341093,19 @@ {} ] ], + "rect-rx-set-by-css.svg": [ + "375147a7d2045d0c7fcb1cfd3a7b069a3c645d79", + [ + null, + [ + [ + "/svg/shapes/rect-rx-set-by-css-ref.svg", + "==" + ] + ], + {} + ] + ], "reftests": { "disabled-shapes-01.svg": [ "49572fe71e7f92f6c52a18aec3115a5bc4a63593", @@ -340014,6 +341293,32 @@ {} ] ], + "use-data-url-set-attributeName.tentative.svg": [ + "248f218bd792e1ffd07711095b3612c45ecb7a6c", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.svg", + "==" + ] + ], + {} + ] + ], + "use-data-url-setAttribute.tentative.html": [ + "b28dd0ecf5b9e798ad8af8c5d6e2c01aea07b7e6", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], "use-data-url.tentative.svg": [ "04414030a3e65ee05314386e90e75184e8c80042", [ @@ -340092,6 +341397,19 @@ {} ] ], + "use-ref-inside-data-url.tentative.html": [ + "d6ac2e3654a6f1ae2591c47415b38f8c279b3b37", + [ + null, + [ + [ + "/svg/struct/reftests/reference/green-100x100.html", + "==" + ] + ], + {} + ] + ], "use-same-origin.svg": [ "0aa1ec83afd68b3ea6022d33f6ec6f8103d99661", [ @@ -344284,7 +345602,7 @@ ], "workflows": { "documentation.yml": [ - "1d57acc6256c14b664daf1c4f528ca849b7e22b6", + "0efa736adefb34737f93dff0d55755fd43fb13fa", [] ], "epochs.yml": [ @@ -344296,11 +345614,11 @@ [] ], "manifest.yml": [ - "e86ced78f60b832a74c014cfeee40ddbf331404e", + "597259eb72e85cba9a588d84595c533427f6c500", [] ], "regen_certs.yml": [ - "4b3565c0d6c45f67606324627bb5aa2f77173cb2", + "d3e1240e79aadfeeb47a728b3c38df4d8fa9b50d", [] ] } @@ -344314,7 +345632,7 @@ [] ], ".taskcluster.yml": [ - "2a005df772fecf60bcf65090609fdc4c96fb946a", + "d9e5581861ee278401e9037fe11773c15f207993", [] ], ".well-known": { @@ -344564,7 +345882,7 @@ [] ], "nested-cloning-common.js": [ - "db5f710ceb5652ed8b9746f883948fac41262d6b", + "042741b431c162f4e92d5f82e2561a6bf5f0c30e", [] ], "reading-autoincrement-common.js": [ @@ -344572,7 +345890,7 @@ [] ], "support-promises.js": [ - "1a5b8270842cd80234b3f7028d8683620904ec71", + "f64b73adc903287b58c62bac8b17475d32f753ae", [] ], "support.js": [ @@ -348509,7 +349827,7 @@ [] ], "generate.py": [ - "409b4f195ff72c0427e51c523940302586243636", + "d1cd33147fc4e2352c78aa9c044defc689a21e77", [] ], "spec.src.json": [ @@ -348517,7 +349835,7 @@ [] ], "spec_validator.py": [ - "f8a1390ef0d440d21986c8c34803dd34c5dcb815", + "e4c9e145f834f1590ee789c3ec9f40e9af0a2f10", [] ], "template": { @@ -369474,6 +370792,10 @@ "8767c50afb470d994b67b0486791b6835a8f558f", [] ], + "pending-userinfo-iframe.html": [ + "0afe279bcc57a73210fb41739be69fa1fdb99fc1", + [] + ], "request-params-check.py": [ "daf91aad8f154af610d299c0de249bbc76db53c8", [] @@ -374582,10 +375904,22 @@ "a8c7b060819839dd1e7107a327dfbf32fb1ea794", [] ], + "float-nowrap-4-ref2.html": [ + "f86afdbce800094ec5907273df236780022a2ba7", + [] + ], "float-nowrap-5-ref.html": [ "7f400841037cfb79bafa2c41d3834cdd942445f4", [] ], + "float-nowrap-hyphen-rewind-1-ref.html": [ + "c1924998a122890ffd5110aee8ed176042faf3f7", + [] + ], + "float-nowrap-hyphen-rewind-1-ref2.html": [ + "bdc489737f165a60d325585e6fe30ec0c272b330", + [] + ], "float-root-ref.html": [ "1f593f460a0da7dbde9a2c8b3f96628d88f7c9df", [] @@ -389899,19 +391233,19 @@ [] ], "origin-border-box-ref.html": [ - "733210ab6a2324fc9184691e5b4d7318ac32dc1a", + "1bf307b0d53dcdcfe7822f4579b717b2bfa5cd1a", [] ], "origin-border-box_with_position-ref.html": [ - "32d50ccc819b2b06ccadb20e9d2c8e7c68e93ac8", + "f965bba210fde7470bcbf3fc58dfc37ad187c887", [] ], "origin-border-box_with_radius-ref.html": [ - "bfbe96cdce96f936d2303be91b68220625eb4290", + "d84aa377580aca22d28218a1692e058935576fac", [] ], "origin-border-box_with_size-ref.html": [ - "526ddbbced9dbb4c8f50a44c270e08fcc46b3e6c", + "99697422f2ce10b5ba9a73be0b64f490199dc0f2", [] ], "origin-content-box-ref.html": [ @@ -389919,7 +391253,7 @@ [] ], "origin-content-box_with_position-ref.html": [ - "960bf7e2dc38e8027bf3a369d8969501847ce1db", + "483e180bfa848da6b934417aad2744264abbf831", [] ], "origin-content-box_with_radius-ref.html": [ @@ -389927,7 +391261,7 @@ [] ], "origin-content-box_with_size-ref.html": [ - "87390d63161360bda0648e717134cb9925b3c999", + "cc429f661ec7d3a00f6f6f9d4445d68c4295d67e", [] ], "origin-padding-box-ref.html": [ @@ -389935,7 +391269,7 @@ [] ], "origin-padding-box_with_position-ref.html": [ - "be30c7f0b09435d83c868c1e42bfe6153baea89c", + "6a96a9e3796f690f8ebd9aecf236c36070402195", [] ], "origin-padding-box_with_radius-ref.html": [ @@ -389943,7 +391277,7 @@ [] ], "origin-padding-box_with_size-ref.html": [ - "bb39958b17d7992b9d4627f2d3411515753e4e3d", + "d71bb83045d4c0c20d916da5e93f06228205c752", [] ], "ref-filled-black-96px-square.xht": [ @@ -389966,6 +391300,14 @@ "d2c2722627e38d7a9ca1b3cbf1eda45e0eef62f7", [] ], + "table-cell-background-local-002-ref.html": [ + "3fbb9f848cacdf305e86a85a0533824c4aafc8da", + [] + ], + "table-cell-background-local-003-ref.html": [ + "6708df44ce4ea99cc390ab851e11376df0af18ec", + [] + ], "ttwf-reftest-borderRadius-ref.html": [ "dcb590dfea60d956f7c945519396d2434e21d298", [] @@ -390790,6 +392132,10 @@ "a14e3ed016216cb98822dac51c4a07e037b5f993", [] ], + "multi-line-row-flex-fragmentation-080-print-ref.html": [ + "de6bd49c922454e303216fb45a627954bab33df6", + [] + ], "single-line-column-flex-fragmentation-040-ref.html": [ "3d20cb44e49b065fdb90d400fba69aca442f0fc2", [] @@ -390798,6 +392144,14 @@ "56c38817e420507c08dfab56727cfe870ac93172", [] ], + "single-line-column-flex-fragmentation-065-print-ref.html": [ + "07d0c637667a5556da69518e18500942759ff554", + [] + ], + "single-line-column-flex-fragmentation-066-print-ref.html": [ + "100fcca0840f784914d386d366fce905cb95f184", + [] + ], "single-line-row-flex-fragmentation-027-ref.html": [ "e1079de13fb771854107b4022054945a0b460e18", [] @@ -390809,12 +392163,24 @@ "single-line-row-flex-fragmentation-044-ref.html": [ "af1c8155bd9e7000f3c77b05f7759a7e75a2c0f5", [] + ], + "single-line-row-flex-fragmentation-045-print-ref.html": [ + "07d0c637667a5556da69518e18500942759ff554", + [] + ], + "single-line-row-flex-fragmentation-046-print-ref.html": [ + "100fcca0840f784914d386d366fce905cb95f184", + [] ] }, "float-009-ref.html": [ "9e117c49c2bab5b8b2fbad4fcfc2eef13b5b8ab6", [] ], + "float-017-ref.html": [ + "2be6253c053294bed5309c9353f7dad32e795841", + [] + ], "float-with-large-margin-bottom-cross-page-001-print-ref.html": [ "dd78a266f426ba676446a78188fe4916348bfe31", [] @@ -391811,6 +393177,10 @@ "9d1fbaaf47b97cb82dc3003ffd2d46268100774e", [] ], + "at-supports-048-ref.html": [ + "414d9bf6f4c83876f604d2f47bd4cfc462d314bf", + [] + ], "at-supports-selector-detecting-invalid-in-logical-combinations-ref.html": [ "3e1f9b6a78416bd7c74759c5ad859001f101081e", [] @@ -392067,7 +393437,7 @@ [] ], "container-for-cue-ref.html": [ - "48b262236394da747f188c9422cc9364b1cb4271", + "40b0a07ae0183163576247a4adcf534345b068c1", [] ], "container-units-gradient-ref.html": [ @@ -392243,7 +393613,7 @@ [] ], "content-visibility-075-ref.html": [ - "e0c485c59f3be15b9ad3bffc2658b82a73b0380d", + "6d33015466c0c203f44a7c7a080854e74cf082f8", [] ], "content-visibility-078-ref.html": [ @@ -392251,7 +393621,7 @@ [] ], "content-visibility-079-ref.html": [ - "83a2206be2fdf94e144f9d3363ccceb13d67479b", + "c4c1bb3beb4a9abb85e040e4455f6359a3f08fc5", [] ], "content-visibility-094-ref.html": [ @@ -392307,7 +393677,7 @@ [] ], "content-visibility-vs-scrollIntoView-001-ref.html": [ - "897463844aa4c79a383b2130a1e1f5aea11eea33", + "746d770f85a95e50e9b4c3e989fc4949551376ae", [] ], "content-visibility-vs-scrollIntoView-002-ref.html": [ @@ -392381,11 +393751,11 @@ [] ], "spacer-with-popover-top-layer-ref.html": [ - "6c4c65f58c32679f7396cf6cf9ae094b32546c23", + "5ae45afe9ebe7f47c72edeb259db92f4058fe60d", [] ], "spacer-with-top-layer-ref.html": [ - "e274b0fcaa1602c0528c60c1fc022cb9694b1ad4", + "7cf1f1581b7710b32d8072fc9128ab9169d090da", [] ] }, @@ -397001,6 +398371,10 @@ "efa8c1d76e18a12788680198638505ddc108f018", [] ], + "font-size-adjust-text-orientation-ref.html": [ + "007e9befad36dcec54f43c2d459a1735b8c7c091", + [] + ], "font-size-adjust-units-001-ref.html": [ "008c500d08b239192b742fb4e5e4a507d97a9f4a", [] @@ -405097,7 +406471,7 @@ [] ], "masonry-item-placement-001-ref.html": [ - "7108a11a100e58ac89daec02c1e874f0c6c5ab95", + "2e100c3be619cbbb55ea430edb92d08dd2af4b2a", [] ], "masonry-item-placement-002-ref.html": [ @@ -405157,11 +406531,11 @@ }, "order": { "masonry-order-001-ref.html": [ - "371699981544487f6b7c6b1e8d084e746057a07d", + "6f20bd05838efed10a0915b30941ff7bcbb73b6a", [] ], "masonry-order-002-ref.html": [ - "5dd4e47d80b7777ab3e2473d33178cc00bb4cae8", + "15be3fde83710c6a7876a5befa8d91dc9f26f8e7", [] ] }, @@ -405765,6 +407139,22 @@ "6af682601ef4c3923c738103d94603530d2f230a", [] ], + "cross-fade-basic-ref.html": [ + "2d7db8a867aa853606d79dfd82d0ab53c3a47e80", + [] + ], + "cross-fade-natural-size-ref.html": [ + "ad9752b7eb4d618cf3a5e476269609b49239daa6", + [] + ], + "cross-fade-premultiplied-alpha-ref.html": [ + "d9a708436788c5e3de351c82169d46159bffc7fd", + [] + ], + "cross-fade-target-alpha-ref.html": [ + "e66cfb0ae5be1192aff2eaf013f389bcd0c3057e", + [] + ], "css-image-fallbacks-and-annotations-ref.html": [ "f3193036766e428bf946e81b7df72bfc7f4901db", [] @@ -410221,6 +411611,26 @@ "e78cb65df988abff25061a58d96f2ce2525248f7", [] ], + "page-orientation-landscape-ref.html": [ + "caa7542dac9a8ceeccc0a3eb22377c5a85f56777", + [] + ], + "page-orientation-portrait-ref.html": [ + "c545c3163c7a713020465332888ca972cb47c45f", + [] + ], + "page-orientation-square-ref.html": [ + "9eacc3e092124218d4dc7fe44ee68611816b1876", + [] + ], + "page-rule-specificity-print-landscape-ref.html": [ + "0e39390e8e7367c4959acfaae04823d1ef822bef", + [] + ], + "page-rule-specificity-print-portrait-ref.html": [ + "76ccfed10a884ff7f2f8e75cb6b208381bf8bba8", + [] + ], "pseudo-first-margin-print-ref.html": [ "a9c11c23f84d9d583b7f84e986088b7be58f7d2d", [] @@ -412223,11 +413633,11 @@ "css-scroll-snap-2": { "resources": { "common.js": [ - "457ae857cc6f9e2176a4e6e6064e736576fda862", + "1a2edab90bba958141c6e5a1b28fa3bd53408ddb", [] ], "user-scroll-common.js": [ - "647f4213a6a2db7f0f828032456ad232b42f016f", + "6587aebd920ef5817267ebb906fc08406e5f0c78", [] ] }, @@ -418912,9 +420322,25 @@ "2fee6f7c1fc46593f450fac606a651a12403ff72", [] ], + "transform-percent-with-width-and-height-ref.html": [ + "8025539309f04590fe103ddd6f35346febbd7a1c", + [] + ], + "transform-percent-with-width-and-height-separate-ref.html": [ + "8025539309f04590fe103ddd6f35346febbd7a1c", + [] + ], "translate-animation-on-svg-ref.html": [ "d503f3385115a4c758bea25bd299c81ba8eb7675", [] + ], + "translate-percent-with-width-and-height-ref.html": [ + "ddd7d01b6917368481ac459484535aeeb39cdbeb", + [] + ], + "translate-percent-with-width-and-height-separate-ref.html": [ + "62ec4d9b3d4305684bb16f6707149911d158f63c", + [] ] }, "backface-visibility-hidden-002-ref.html": [ @@ -426458,6 +427884,10 @@ "56c6243809bef53423ff18d4b70a8597795cacec", [] ], + "backdrop-filter-svg-ref.html": [ + "3d5853ac6698ee9dafba37a825f3dc4e2d07b64e", + [] + ], "backdrop-filters-grayscale-001-ref.html": [ "ba01ac6bd07464a829817dbfc8e72438c7c97168", [] @@ -427593,10 +429023,6 @@ "8e506d671d4b1e741d3450bd66603edbb3de9f30", [] ], - "any-link-dynamic-001-ref.html": [ - "b5407429be803d9b774c4ca0108318fbd6e5134f", - [] - ], "attribute-selectors": { "attribute-case": { "resources": { @@ -427750,6 +429176,10 @@ ] }, "invalidation": { + "any-link-attribute-removal-ref.html": [ + "b5407429be803d9b774c4ca0108318fbd6e5134f", + [] + ], "class-id-attr-ref.html": [ "a3cc6d3d8f56fd31c4b19d23af606d7c65487145", [] @@ -428202,7 +429632,7 @@ [] ], "color-testcommon.js": [ - "18ab4420f67946664380f4cabeb830d56ba74210", + "44ca0bbb33c9e9571415c14180372ca0b96780a6", [] ], "computed-testcommon.js": [ @@ -428705,7 +430135,7 @@ [] ], "requirements.txt": [ - "b29747cac1704b8ab158a73495160645144cbd7a", + "d8fb98888fd7139ff30f50cbbcbd0d042d89f91f", [] ], "reviewing-tests": { @@ -428858,7 +430288,7 @@ [] ], "print-reftests.md": [ - "62a037da124406872a3414c4719dbe1ec46a4e95", + "cbcd5e920b25d37fd67dcc218ceb14a89211a497", [] ], "python-handlers": { @@ -429243,7 +430673,7 @@ }, "scrolling": { "scroll_support.js": [ - "f05251ce21a55db622a28fab7e71f29b9de71451", + "e86ead5456442f6c34d8d4b190832e3d2580fe53", [] ], "scrollend-event-fires-to-iframe-inner-frame.html": [ @@ -429862,7 +431292,7 @@ [] ], "delete.js": [ - "5fad8c2678333c2f753d61c5d9c679e1b618d162", + "3c2855e28f535ec95ef3c870169d067cdb6efa23", [] ], "fontname.js": [ @@ -429882,7 +431312,7 @@ [] ], "forwarddelete.js": [ - "5119d6f50def051a6ffccf140283f392acd131e8", + "5e76ee898853bd77ab812566494dbed20b422f9d", [] ], "hilitecolor.js": [ @@ -429922,7 +431352,7 @@ [] ], "inserttext.js": [ - "ab73a2ac49c244f56ca5eea3e6971745af9c2298", + "8fa8127f2df30800abb2097096a60b4e5ad35326", [] ], "insertunorderedlist.js": [ @@ -429954,7 +431384,7 @@ [] ], "multitest.js": [ - "8ec4dfaf68be66ba6a264b4f9c3f6f549a873e0a", + "aeda7b2e7b6bc26eb851ed361f5a1338160b6dfc", [] ], "outdent.js": [ @@ -431882,11 +433312,11 @@ [] ], "automatic-beacon-store.py": [ - "00007b8c63038e73ca6330f97ccf2fe6dfcf0b15", + "ba1b73201bcce6287c0a7d5489ff5968ca12ad99", [] ], "automatic-beacon-unfenced-page.html": [ - "4559d8154eb95e789aa0429b62daac5e17b8e3bd", + "4ce7e0d78a5b2252ba58eeb8d20fd1eb1917b0ae", [] ], "background-fetch-inner.https.html": [ @@ -431985,6 +433415,10 @@ "afe7b4f317dfacad8c25661dbe4dd2bf07b5b86e", [] ], + "close.html": [ + "7fd946d6ff9c23dbb0243b60ef59cd0d6df78467", + [] + ], "config-cross-origin-apis-inner.https.html": [ "211fe216c7b37158198145dfd4ee6a3d32bb175b", [] @@ -432182,7 +433616,7 @@ [] ], "fledge-bidding-logic.py": [ - "2c541bff346ebe4464f166ed0ebd9a8a5d68b8fe", + "c91b31fd02fb36976b6c9c71c0bbb1bf91394a92", [] ], "fledge-decision-logic.py": [ @@ -432338,7 +433772,7 @@ [] ], "navigate-ancestor-helper.js": [ - "6178ea78da49831fcf0c681ecd967839f680948a", + "ade17c69f2cce20c85758b8f392f61c3f4e9d2bb", [] ], "navigate-ancestor-test-runner.https.html": [ @@ -432598,7 +434032,7 @@ [] ], "utils.js": [ - "d5230380157d09ba81f45ca088991c715e5a86b8", + "f6c884ca74d4a4ef858923d3862806557bfb46f6", [] ], "web-bluetooth-inner.html": [ @@ -433949,7 +435383,7 @@ [] ], "support.sub.js": [ - "920ded6cff7feae1aa9337405a7cc3402b787c57", + "69d8f50f18fe71e780eb1e61b92b4c136b717191", [] ], "worker-blob-fetcher.html": [ @@ -434091,15 +435525,15 @@ ], "resources": { "bidding-logic.sub.py": [ - "c0d6114ab2c6102ba545e92a969a1eecce696d85", + "707e37f36bb1423dfb168a88320e3be620249109", [] ], "decision-logic.sub.py": [ - "39a4fede5c5888294118f999a8adeeac7bea9b63", + "78d459e3f9dac36241d8cf92c33fd031c7046af0", [] ], "direct-from-seller-signals.py": [ - "0f9e29dd57254db7dbb81cfce4ef85892834423c", + "e94b9c5b47c271559db9d458f7f5faa14312fd76", [] ], "empty.html": [ @@ -434139,12 +435573,16 @@ [] ], "trusted-bidding-signals.py": [ - "b8e7c9ffb055db3e5b51c1a33dac0aaa4985cc96", + "5ec487fcc904e876ebdf130b511f4c4780863395", [] ], "trusted-scoring-signals.py": [ "fc6ec79096c4708b347e0cfc277fa248bf8ba9c3", [] + ], + "worklet-helpers.js": [ + "dd3b9a7dd518a0dd2d6b1d9b63315f427562f35a", + [] ] } } @@ -435873,7 +437311,7 @@ [] ], "service-worker.js": [ - "df9ce65acdaba652fe9fe18c93d4b821e1484484", + "ab9a3239ea0a18515417f320386cfb88bc826e13", [] ], "slow.py": [ @@ -436453,7 +437891,7 @@ ], "support": { "001-1.html": [ - "72f41ae3e8da1c9375d6fd962bbe52ac8285415a", + "2a9cab4aa4dc0df74ce7baaac64258d2cad688a9", [] ], "001a.html": [ @@ -437431,6 +438869,10 @@ "6f44d8a83ecade23c4b02707c56981d25ed62811", [] ], + "close_pagehide-1.html": [ + "5631b539a6af1ffee4f77b265b03eed3255f364f", + [] + ], "close_script_defer-1.html": [ "c50eddd41faba2ecc8928e459288fe612b999170", [] @@ -438564,9 +440006,49 @@ "2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [ "86c5710132f348bd3e2332983d7211f4b3315cdb", [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html": [ + "f9571f208ea843b11bc18dfe142c08a950571ff7", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html": [ + "e76613271f3971ac267e13a6a36fe87036902a25", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html": [ + "0f214fca9fdf37aba06dc20425c85d84c9bf2b19", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html": [ + "285a6417266212d28aec1515a9d7c5a339d47338", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html": [ + "d59945b5da6da751480b8d4361aa26670d69b3cc", + [] ] }, "layers": { + "2d.layer.anisotropic-blur.isotropic-expected.html": [ + "6a6f0f6892815ab709202cc1796f54bafce83907", + [] + ], + "2d.layer.anisotropic-blur.mostly-x-expected.html": [ + "b0473f2ff0a0d278fd7097df48e71a75faba3227", + [] + ], + "2d.layer.anisotropic-blur.mostly-y-expected.html": [ + "43da016eeaf1784cbac524c17743a9b2f200f48e", + [] + ], + "2d.layer.anisotropic-blur.x-only-expected.html": [ + "0b4d269189fe98be074eab864709608b2b89aa17", + [] + ], + "2d.layer.anisotropic-blur.y-only-expected.html": [ + "25723864122a52dd042c6e6e9458975a7abc99ad", + [] + ], "2d.layer.blur-from-outside-canvas.no-clipping-expected.html": [ "6cad180f1487e576ea4062a24b049759c28ba4b0", [] @@ -439610,9 +441092,49 @@ "2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [ "86c5710132f348bd3e2332983d7211f4b3315cdb", [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html": [ + "f9571f208ea843b11bc18dfe142c08a950571ff7", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html": [ + "e76613271f3971ac267e13a6a36fe87036902a25", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html": [ + "0f214fca9fdf37aba06dc20425c85d84c9bf2b19", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html": [ + "285a6417266212d28aec1515a9d7c5a339d47338", + [] + ], + "2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html": [ + "d59945b5da6da751480b8d4361aa26670d69b3cc", + [] ] }, "layers": { + "2d.layer.anisotropic-blur.isotropic-expected.html": [ + "6a6f0f6892815ab709202cc1796f54bafce83907", + [] + ], + "2d.layer.anisotropic-blur.mostly-x-expected.html": [ + "b0473f2ff0a0d278fd7097df48e71a75faba3227", + [] + ], + "2d.layer.anisotropic-blur.mostly-y-expected.html": [ + "43da016eeaf1784cbac524c17743a9b2f200f48e", + [] + ], + "2d.layer.anisotropic-blur.x-only-expected.html": [ + "0b4d269189fe98be074eab864709608b2b89aa17", + [] + ], + "2d.layer.anisotropic-blur.y-only-expected.html": [ + "25723864122a52dd042c6e6e9458975a7abc99ad", + [] + ], "2d.layer.blur-from-outside-canvas.no-clipping-expected.html": [ "6cad180f1487e576ea4062a24b049759c28ba4b0", [] @@ -439637,10 +441159,6 @@ "c394ecdfe3904f0afb1e4879241cf38d985155e6", [] ], - "2d.layer.css-filters-expected.html": [ - "19aec30ec4d8c809408bdd9c37cbae861208b24d", - [] - ], "2d.layer.css-filters.blur-and-shadow-expected.html": [ "85503ae33a3a53ff7db281a6abc4a8e2d9576b8f", [] @@ -440118,11 +441636,11 @@ [] ], "filters.yaml": [ - "6133628335a2388093e87fcc3c7fdab0dbda8dc5", + "01c83a33e2c0b92fc46b69039f47a4a867f809b3", [] ], "layers.yaml": [ - "3a05e75521319206146eb6da95b4e786d5070fc0", + "d255a834f6c5534c066ce85cd8ca5d087a7de600", [] ], "line-styles.yaml": [ @@ -448393,6 +449911,10 @@ "9f407ef157d8a4f86c2787ed27e73e07dfb3b129", [] ], + "popover-invoking-attribute.js": [ + "d2911647e1520a31a33e1d8ff6bbacab7de5860d", + [] + ], "popover-styles.css": [ "df683c3c64f4de11c49c14b9dc53cc4165dff4a7", [] @@ -452107,6 +453629,10 @@ [] ], "resources": { + "pass-with-referrer.html": [ + "be978c16dc866fd536c188983e1095c9f2396950", + [] + ], "pass.html": [ "5c7ca343e9b2bbe4774ed127d905c8c77b09e47f", [] @@ -452913,7 +454439,7 @@ [] ], "mouseClickCount.html.ini": [ - "cc35c1c876180352e710f454b06e2e75053f9d93", + "063a712424f37582a4fa44b456abdba59fe96da4", [] ], "multiTouchPoints.html.ini": [ @@ -454794,7 +456320,7 @@ ] }, "lint.ignore": [ - "a39705ddf866dbb05ea5321e9da3f706d487631a", + "c82f8027f690cb7184fd41053d3e02f972dcc80e", [] ], "loading": { @@ -458500,7 +460026,7 @@ [] ], "permissions-policy-screen-wakelock.html": [ - "b1866322518c5fba1de01a8e7509a2e0b9d49dd7", + "5c2562946b774f24c5c64279efb69d2106c87083", [] ], "permissions-policy-serial-worker.html": [ @@ -458580,7 +460106,7 @@ ], "apng": { "apng-blue-rect-checkerboard-ref.html": [ - "0c997d350a12c737f2935c31ac20a93da9678adc", + "3058aa633f4bbb46d5fc75f8e7152623c83803d3", [] ], "apng-blue-rectangle-one-ref.html": [ @@ -465121,7 +466647,7 @@ ] }, "router-rules.js": [ - "67871a2d4fd3fe2039e0b7f392caef72cee86eed", + "f8fe403298604c0b4bfc09202fa75053447d6081", [] ], "simple-test-for-condition-main-resource.html": [ @@ -465525,6 +467051,10 @@ "1b63235b7cdffe9ebb43bfac3a01d5220e1519fb", [] ], + "register-service-worker-iframe.https.html": [ + "547ab1d93d9adb9cb82ea797ee5e900b9d0e067c", + [] + ], "report.py": [ "7d0fa36019ef58c8c7764767f267628cd05bc285", [] @@ -465550,7 +467080,7 @@ [] ], "shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html": [ - "8229ce88d82ad05e8f7e1d1e9886f49c282bc805", + "3451d91477ddc7b417a207a1d7afcf2384e83e7a", [] ], "shared-storage-writable-fetch-request-fallback-to-network-worker.js": [ @@ -465594,11 +467124,11 @@ [] ], "util.js": [ - "f82765846c22a452f29cc6cd097080955499d1f8", + "4a7fcc4590ff53e41695e9a6c11304e287eb3384", [] ], "util.sub.js": [ - "970c33b7f2551e76c57d5cc2431b3131084fd025", + "f147209d6096375d9a5ccc5b1dc42a36d3be6bec", [] ], "verify-get-undefined-module.js": [ @@ -465960,7 +467490,7 @@ [] ], "soft-navigation-helper.js": [ - "685bc21f43c03482e9c0f8ac9a83137cc20df620", + "58ca9c22657b68c495f6c4662a1073352db6be32", [] ] } @@ -465975,23 +467505,35 @@ }, "resources": { "authenticate.py": [ - "037a7c144e0ba6d14aec7e7108d161c049f46dd8", + "8820781709d30f11cb842f54d8e25d1ed24a4a8e", + [] + ], + "cacheable-executor.sub.html": [ + "ba1b3acb0c1198284c74c345b3de5c6d98fc2421", + [] + ], + "cacheable-executor.sub.html.headers": [ + "0ee6ec2ab103e45685829452b0b50b3ac8e3f343", [] ], "cookies.py": [ - "3c2299aa3a6787c6c6444fc1b58db1288ef710a4", + "3ba9cd9270b2c30b2d7911878338d624ecacc281", [] ], "executor.sub.html": [ "ba1b3acb0c1198284c74c345b3de5c6d98fc2421", [] ], + "executor.sub.html.headers": [ + "4030ea1d3ddb186a2b5361eb1a3f2404a45531fc", + [] + ], "prefetch.py": [ - "4a0a7a360209059937222e9eaebbd38f05c6240e", + "14ac4d1699ea0c52ac4b40f0a4a0f71c99147073", [] ], "prefetch_nvs_hint.py": [ - "1de33a75d868805645ac5420a0a4a4f1d7538701", + "d912eff90a5b9cc7f726a2a9c9d5da7eb4103fa6", [] ], "ruleset.py": [ @@ -465999,7 +467541,7 @@ [] ], "sw.js": [ - "db774f9d5b80dc00cfc3beff20deaa311faca415", + "dd8a9631b4e8d25e0f3a4258806b909b07e682d7", [] ], "utils.sub.js": [ @@ -466339,7 +467881,7 @@ [] ], "utils.js": [ - "687f6a43982d7ba18fc172079370a3beeb74117f", + "56ab603fdffb962062f75bace5f1cef45bf54f6b", [] ], "wake-lock.https.html": [ @@ -466448,8 +467990,12 @@ "c57eff55ebc0c54973903af5f72bac72762cf4f4", [] ], + "opaque-origin-sandbox.html": [ + "4a1ac39fdf6fd6bbc712dca414e54d2bbd5c1064", + [] + ], "util.js": [ - "425303ce2c9c0a490468c3a002609abcad75ad5f", + "5fff4894442a214f6035956128fe95f4a955791a", [] ] } @@ -467519,6 +469065,14 @@ "1d62e8e2af82f8da03937be22d4c3f695111edb8", [] ], + "rect-rx-set-by-css-expected.svg": [ + "2b53158c0aceb1684737cb2b6002a8a6cd029a2d", + [] + ], + "rect-rx-set-by-css-ref.svg": [ + "2b53158c0aceb1684737cb2b6002a8a6cd029a2d", + [] + ], "reftests": { "pathlength-001-ref.svg": [ "0ec9e0353ae4bcdf12acbdfe0e3aa85c22565054", @@ -467966,7 +469520,7 @@ [] ], "ci_wptrunner_infrastructure.sh": [ - "fc6907f8de6e356dfc65850dfe08947f07bfd120", + "9204f6a318bb4532f4ea50ce5bf4042114676513", [] ], "commands.json": [ @@ -468052,7 +469606,7 @@ ], "tasks": { "test.yml": [ - "cdb6687d065d9a076923b3a292addf5add48b218", + "def498086786df8aa6b9a4fbbf74eca83da0905b", [] ] }, @@ -468122,7 +469676,7 @@ [] ], "Dockerfile": [ - "d54d8e94bd27d6d451dd106691e019945b32806e", + "a9162559ab87641da1c49f9f4b5bbb9af01074c8", [] ], "README.md": [ @@ -468516,6 +470070,70 @@ [] ] }, + "metadata": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "meta": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "schema.py": [ + "b3c567361908cb31c26a6b731e12c1cdf9b64a4c", + [] + ], + "tests": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "test_schema.py": [ + "31e13f356bb60ad97c2f86ed641cb3ee4895a418", + [] + ] + } + }, + "schema.py": [ + "e21f3b4a8f3da8ad4b4cc9871b721c1df0846505", + [] + ], + "tests": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "test_schema.py": [ + "2803c5eea6a4bca8cd60524918c994584a0e07de", + [] + ] + }, + "yaml": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "load.py": [ + "831f7e8fff18bd37201a2ca21f4a1f8caea38258", + [] + ], + "requirements.txt": [ + "cf39afa6b4c0ab83337d7b8518a14e39ece19a1b", + [] + ], + "tests": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "test_file.py": [ + "50a9b4e1a772ff57cc62f8c1771ec14a713a24a6", + [] + ] + } + } + }, "mypy.ini": [ "1e58e9625e6749838331c9f85ed1d8a651fc40a4", [] @@ -468529,7 +470147,7 @@ [] ], "requirements_mypy.txt": [ - "45261d0321fea731841a4e219088bd88e21278ed", + "af20e5a9a7698689b470db18fc4fef843bc532b1", [] ], "requirements_pytest.txt": [ @@ -476617,11 +478235,15 @@ }, "six": { "CHANGES": [ - "ffa702601b6509b25fbd6787d1e7682e5ac39356", + "f3bf6a4a7f933c6dd3979a60144e0df952f1ddb8", + [] + ], + "CONTRIBUTORS": [ + "a76dffd51c2677b427b84b22525c8d1d52ed9a44", [] ], "LICENSE": [ - "4b05a545261c0f9b31abe3edec710587587a659a", + "de6633112c1f9951fd688e1fb43457a1ec11d6d8", [] ], "MANIFEST.in": [ @@ -476629,7 +478251,7 @@ [] ], "README.rst": [ - "a99e6f5585a918b8a68ceabace2fb6e34e92183b", + "6339ba5d932c796edf6bd5c1301a0d7cb2dd0ae7", [] ], "documentation": { @@ -476638,11 +478260,11 @@ [] ], "conf.py": [ - "b3d1328adc2a42afde71915193060433504ce208", + "2f0f3238ae8530dc95cea70d663fd21f891123a7", [] ], "index.rst": [ - "b7ec2754ecf83d5a291c13988738fef62045c986", + "45390b81b137a9392644246182f6189e4375728e", [] ] }, @@ -476651,41 +478273,19 @@ [] ], "setup.py": [ - "97c685b5a50bd9769804861f4ad7a8396215d239", + "d90958b69d399aeda2c298b89843cbb760d4e164", [] ], - "six-1.15.0.dist-info": { - "INSTALLER": [ - "a1b589e38a32041e49332e5e81c2d363dc418d68", - [] - ], - "LICENSE": [ - "de6633112c1f9951fd688e1fb43457a1ec11d6d8", - [] - ], - "METADATA": [ - "869bf25a884325e37cd8f415f5e1f1f37b832039", - [] - ], - "RECORD": [ - "d9754c61c4d7f2dda4114ec9885eba7bcfdb007f", - [] - ], - "WHEEL": [ - "ef99c6cf3283b50a273ac4c6d009a0aa85597070", - [] - ], - "top_level.txt": [ - "ffe2fce498955b628014618b28c6bcf152466a4a", - [] - ] - }, "six.py": [ - "83f69783d1a2dcb81e613268bc77afbd517be887", + "4e15675d8b5caa33255fe37271700f587bd26671", [] ], "test_six.py": [ - "3eefce37c328d7b15b23ee83dd898c4b3e57633d", + "7b8b03b5e61a77532a9395b697e11aa85a095bea", + [] + ], + "tox.ini": [ + "a1e34676267a1377bb5ad4b43a3f36a73d685962", [] ] }, @@ -478026,7 +479626,7 @@ [] ], "error.py": [ - "75505ea88daee5a31ff3fad386a19c8b7e238776", + "01935a6dadca831e2f79d3061e9b87bac06350b6", [] ], "modules": { @@ -478043,7 +479643,7 @@ [] ], "browsing_context.py": [ - "e0371a79ecd37c8b537faecff0a52064e223b9fd", + "d34fb4f9e03167260c8c0f6f799b0b376c188513", [] ], "input.py": [ @@ -478051,7 +479651,7 @@ [] ], "network.py": [ - "b82c8539e86ba5ba70615998f74463e7803f0985", + "073aa637c977fca55e3a4ef92cbb8032a59133a5", [] ], "script.py": [ @@ -478705,7 +480305,7 @@ [] ], "testrunner.py": [ - "2d81cab79832531c6715fc3a679abc7b65cee826", + "69e3cbd0f1d5c3fab985ac17be3341f529c9fdbb", [] ], "tests": { @@ -479767,7 +481367,7 @@ [] ], "utils.js": [ - "669a2e2edd923aa51c44e06215cfd66b2c19f727", + "6f5f6f4b6cd63ccd539361e1de1721ebcb77703b", [] ] } @@ -481969,6 +483569,12 @@ [] ] }, + "locate_nodes": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, "navigate": { "__init__.py": [ "c2bf7558f4fe75413f81057c8ab96f31d3fc537f", @@ -482090,7 +483696,7 @@ }, "network": { "__init__.py": [ - "f4f0cf295a7d2d2247089f79ab3a80c28fde7739", + "c6b8e32885947ccf41b7bfa1b4621b1b529dd532", [] ], "add_intercept": { @@ -482118,15 +483724,39 @@ ] }, "conftest.py": [ - "668ffacc989a9967c2d53781cf7f8e3ad794862f", + "fb6dcc45dd779a1cc790a95607781b01254fa3b3", [] ], + "continue_request": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, + "continue_response": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, + "continue_with_auth": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, "fail_request": { "__init__.py": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", [] ] }, + "provide_response": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, "remove_intercept": { "__init__.py": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -482806,7 +484436,7 @@ [] ], "headers.py": [ - "71c4901c44522847ec93d5fc5b57c4720fadbce9", + "cb8d18d964416a5db9f98bcc273762e47bc10c81", [] ], "must-revalidate.py": [ @@ -482959,6 +484589,14 @@ } }, "message-channels": { + "close-event": { + "resources": { + "helper.js": [ + "cb9ea9fe981e95374b836255c752a42de788fc7b", + [] + ] + } + }, "resources": { "cross-document-1.html": [ "93725a93f8764380c9bcb07557371ff3a04eb5cb", @@ -483059,7 +484697,7 @@ [] ], "average_pool2d.json": [ - "badcfc888d8ae278407c05f668222f10b7d8cb53", + "802e0d764621707c0b00d6a05627d0c1eeba9233", [] ], "batch_normalization.json": [ @@ -483102,6 +484740,10 @@ "8350a25d594de6086c8c71e5142df6c92aaec799", [] ], + "erf.json": [ + "8a9ae6e68c1c4ab61e2d4c4838b014653c9049c9", + [] + ], "exp.json": [ "8a86edec3b8e5ed460ca8d00242d97e5f110a35f", [] @@ -483300,7 +484942,7 @@ ] }, "utils.js": [ - "1e31886c9c53fc81b567504fbd719c563ba656e6", + "c3b10a7020182f1765cdd7890410766334bc6055", [] ] } @@ -490879,7 +492521,7 @@ ] ], "idbindex_reverse_cursor.any.js": [ - "88c367466df7dfd94be4ca022686007839c253af", + "1297b44d6ec023e18d68ea57bd77b8f6ff95b56f", [ "IndexedDB/idbindex_reverse_cursor.any.html", { @@ -492238,6 +493880,15 @@ {} ] ], + "nested-cloning-basic.html": [ + "df4848b69374c89bc7dc372c1adc5365bccc096e", + [ + null, + { + "timeout": "long" + } + ] + ], "nested-cloning-large-multiple.html": [ "97bcaddfb2d64bfe89aaf0e7df574a654e009153", [ @@ -492257,7 +493908,7 @@ ] ], "nested-cloning-small.html": [ - "e92251410afad12e244dfe14824ed611050d9e59", + "e5105a999f57e6bc49828ce886ab138117c9c8f6", [ null, { @@ -492789,7 +494440,7 @@ ] ], "structured-clone.any.js": [ - "15ab0359e230b7cf99c2a8859c01d6efee5a3721", + "687b028e90c3dc1141bc4de7d454ab291b2ac944", [ "IndexedDB/structured-clone.any.html?1-20", { @@ -512524,33 +514175,6 @@ } ] ], - "compute_pressure_cross_origin_focus_control.tentative.https.window.js": [ - "950334d6fc57f324b61cede416920534ccce76aa", - [ - "compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.html", - { - "script_metadata": [ - [ - "timeout", - "long" - ], - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/resources/test-only-api.js" - ], - [ - "script", - "resources/pressure-helpers.js" - ] - ], - "timeout": "long" - } - ] - ], "compute_pressure_detached_iframe.tentative.https.html": [ "5511a147048d610125a0d0d485367b88e4e5a70e", [ @@ -512990,53 +514614,6 @@ } ] ], - "compute_pressure_privacy_test.tentative.https.window.js": [ - "113f4bdf79be9325df22f859c819558ab37429f5", - [ - "compute-pressure/compute_pressure_privacy_test.tentative.https.window.html", - { - "script_metadata": [ - [ - "timeout", - "long" - ], - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/common/media.js" - ], - [ - "script", - "/mediacapture-streams/permission-helper.js" - ], - [ - "script", - "/picture-in-picture/resources/picture-in-picture-helpers.js" - ], - [ - "script", - "/resources/testdriver.js" - ], - [ - "script", - "/resources/testdriver-vendor.js" - ], - [ - "script", - "/resources/test-only-api.js" - ], - [ - "script", - "resources/pressure-helpers.js" - ] - ], - "timeout": "long" - } - ] - ], "compute_pressure_rate_obfuscation_mitigation_not_triggered.tentative.https.window.js": [ "9fd549d2db9ba69a26071cfe33e0857a8d8aef82", [ @@ -513065,7 +514642,7 @@ ] ], "compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.js": [ - "c2c5cc9f7f6e3955c27d4426921981bf2ed124a1", + "0ae20fdee6eb02090f3bc48d4b38af558103330e", [ "compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.html", { @@ -513091,29 +514668,6 @@ } ] ], - "compute_pressure_same_origin_focus_control.tentative.https.window.js": [ - "7df0be5c47d161fe4cadcba937f875a0a0cba320", - [ - "compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.html", - { - "script_metadata": [ - [ - "timeout", - "long" - ], - [ - "script", - "/resources/test-only-api.js" - ], - [ - "script", - "resources/pressure-helpers.js" - ] - ], - "timeout": "long" - } - ] - ], "compute_pressure_supported_sources.tentative.https.any.js": [ "63f2666cca69c9ed69b1449fb5c336854d11967d", [ @@ -518178,7 +519732,7 @@ ] ], "report-preload-and-consume.https.html": [ - "3e04f55f03c58eef1ee07417182b8d03ff91769f", + "2fc180234731eb850e53d947adc5789feb7e2c8a", [ null, {} @@ -519252,7 +520806,7 @@ ] ], "inline-style-blocked.sub.html": [ - "3f34437dffdef631d065dbbfe1c696659a733fb1", + "90ec73341b2bec9c932225839212c2a367b9d09a", [ null, {} @@ -522305,6 +523859,15 @@ } ] ], + "fedcm-auto-reauthn-without-approved-clients.https.html": [ + "fb93cb632db09dfd3332ac6008f1f40253361ea6", + [ + null, + { + "testdriver": true + } + ] + ], "fedcm-auto-selected-flag.https.html": [ "d06aba73bc1de9a9b6e238695587c1ff47480de3", [ @@ -522358,7 +523921,7 @@ ] ], "fedcm-disconnect-errors.https.html": [ - "7168d3b8fc88ae270253b849a3b92831b83d55ba", + "41102cdabe187c7021011bf884fddc1dd17c8f6e", [ null, { @@ -522607,6 +524170,24 @@ } ] ], + "fedcm-pending-disconnect.https.html": [ + "1b60acc10880ddf359aeeb5974f2f93e82df641c", + [ + null, + { + "testdriver": true + } + ] + ], + "fedcm-pending-userinfo.https.html": [ + "0ecae3e80a4bb9f3fbe27ff32284a5f503a099b1", + [ + null, + { + "testdriver": true + } + ] + ], "fedcm-reject-invalid-responses.https.html": [ "f450d568249ec7d7f2ef6f1229d5781344cfb5c5", [ @@ -523274,6 +524855,344 @@ } }, "css-align": { + "abspos": { + "align-self-htb-ltr-htb.html": [ + "786cec7acf76607a92b44a76880c1a2543da25e4", + [ + null, + {} + ] + ], + "align-self-htb-ltr-vlr.html": [ + "917e50d5e694b470a034faeabb4cfb0d557c1ed8", + [ + null, + {} + ] + ], + "align-self-htb-ltr-vrl.html": [ + "b60d4615314440e0a1ba563737babfa5e8db69b5", + [ + null, + {} + ] + ], + "align-self-htb-rtl-htb.html": [ + "9bf919dd46522c46a0f563ba215858748271ef08", + [ + null, + {} + ] + ], + "align-self-htb-rtl-vlr.html": [ + "5c1e8c75c935e76466118ed1695d01c54c3271c0", + [ + null, + {} + ] + ], + "align-self-htb-rtl-vrl.html": [ + "b7f0056976893b0e093dbe63b7a7f669abf19162", + [ + null, + {} + ] + ], + "align-self-vlr-ltr-htb.html": [ + "98e3c0b9366591f26502263b8130861966d656d1", + [ + null, + {} + ] + ], + "align-self-vlr-ltr-vlr.html": [ + "73585d2db5a819b2a9be3fb2555ea45bf8546473", + [ + null, + {} + ] + ], + "align-self-vlr-ltr-vrl.html": [ + "39ecd388999cde7b344c8f8832060611580ad7bd", + [ + null, + {} + ] + ], + "align-self-vlr-rtl-htb.html": [ + "7a4167f62a5ac156d3e99985a5c8d3c6dfc36e93", + [ + null, + {} + ] + ], + "align-self-vlr-rtl-vlr.html": [ + "4ce7d46520a171a57ed4068e52d78a8f115e4862", + [ + null, + {} + ] + ], + "align-self-vlr-rtl-vrl.html": [ + "0fe160442f460499385eefb3255a266e5d5f4f36", + [ + null, + {} + ] + ], + "align-self-vrl-ltr-htb.html": [ + "98e6145a6313409cfb55c8b7e3b5c0a573f2231d", + [ + null, + {} + ] + ], + "align-self-vrl-ltr-vlr.html": [ + "d22b347da3044c5e0da34162faa80f74429ac065", + [ + null, + {} + ] + ], + "align-self-vrl-ltr-vrl.html": [ + "602b7afb7b8b32bb8ccd0a3729629643a258be7b", + [ + null, + {} + ] + ], + "align-self-vrl-rtl-htb.html": [ + "1dcfd8709f0b7c17f9762d9e96d1d06bb5eb3fbc", + [ + null, + {} + ] + ], + "align-self-vrl-rtl-vlr.html": [ + "d22b347da3044c5e0da34162faa80f74429ac065", + [ + null, + {} + ] + ], + "align-self-vrl-rtl-vrl.html": [ + "602b7afb7b8b32bb8ccd0a3729629643a258be7b", + [ + null, + {} + ] + ], + "justify-self-htb-ltr-htb.html": [ + "cfef344e041ed1029f4d44ee9bf91745744527d9", + [ + null, + {} + ] + ], + "justify-self-htb-ltr-vlr.html": [ + "55680f4b2c46dad322677eb6d845187855349bd9", + [ + null, + {} + ] + ], + "justify-self-htb-ltr-vrl.html": [ + "57ee3af6408bde8597df863695c4cd6b2456ceb5", + [ + null, + {} + ] + ], + "justify-self-htb-rtl-htb.html": [ + "95e54c2b990b497ef000d2ab3e8a6e3cd3bd88dd", + [ + null, + {} + ] + ], + "justify-self-htb-rtl-vlr.html": [ + "e7224e76db6de9bd49080af30283a57981be48e1", + [ + null, + {} + ] + ], + "justify-self-htb-rtl-vrl.html": [ + "ba7e98a6767831e38a9e5fa67f9d17a37979f0e2", + [ + null, + {} + ] + ], + "justify-self-vlr-ltr-htb.html": [ + "d47c504679b1b543b13957e90059411b4fbaa71c", + [ + null, + {} + ] + ], + "justify-self-vlr-ltr-vlr.html": [ + "71e3687f6f4ac3d35c3f28464aa2c08be31de869", + [ + null, + {} + ] + ], + "justify-self-vlr-ltr-vrl.html": [ + "ae90d4da0d8f2277025bbefdfc2b7e2174001854", + [ + null, + {} + ] + ], + "justify-self-vlr-rtl-htb.html": [ + "1a192b56924c95aeed27efbe1133f6b5f912f683", + [ + null, + {} + ] + ], + "justify-self-vlr-rtl-vlr.html": [ + "cb9986db10159e2f591e0e577a95b01aa78ee3d0", + [ + null, + {} + ] + ], + "justify-self-vlr-rtl-vrl.html": [ + "fb717a051f2a2b4b16f134dae830d8b403af7b46", + [ + null, + {} + ] + ], + "justify-self-vrl-ltr-htb.html": [ + "e2cbff322b3051a5c5c9b87cdab55c6dfaeb4d9f", + [ + null, + {} + ] + ], + "justify-self-vrl-ltr-vlr.html": [ + "5aa2f482888be3ff299ff6291d65728aa0024403", + [ + null, + {} + ] + ], + "justify-self-vrl-ltr-vrl.html": [ + "cf2db8d369bf195d40fd2c5e933297558aa269ca", + [ + null, + {} + ] + ], + "justify-self-vrl-rtl-htb.html": [ + "317e53e92e0a40f3dad0b40194363ed1e9bba326", + [ + null, + {} + ] + ], + "justify-self-vrl-rtl-vlr.html": [ + "2d144d16aa097880b85701b931ef7010319ca0ca", + [ + null, + {} + ] + ], + "justify-self-vrl-rtl-vrl.html": [ + "026c6e96816ffbb56bbb2e9f1275a0dfb2bdbf4f", + [ + null, + {} + ] + ], + "safe-align-self-htb.html": [ + "9e259c1e630ad2184752e66f6db9142686fc4ea3", + [ + null, + {} + ] + ], + "safe-align-self-vlr.html": [ + "d47b1836d52ed2bd8bf300080e09c6382055b286", + [ + null, + {} + ] + ], + "safe-align-self-vrl.html": [ + "3432762007efe52af47712d15362280cfb5e3a13", + [ + null, + {} + ] + ], + "safe-justify-self-htb.html": [ + "0fa5cc34d57347f69665507be6c4fea1a7f98cdb", + [ + null, + {} + ] + ], + "safe-justify-self-vlr.html": [ + "7554975f1be1e1cbb990decb0ded47f53ad0763c", + [ + null, + {} + ] + ], + "safe-justify-self-vrl.html": [ + "fe2405cf798a601c41867c34f002b1f5a6d579e3", + [ + null, + {} + ] + ], + "stretch-intrinsic-size-htb-htb.html": [ + "dc7df332e403d838dea63a0e27bea948771b411b", + [ + null, + {} + ] + ], + "stretch-intrinsic-size-htb-vrl.html": [ + "cd2c9b9abc49764f8eb93ad49abd5fe32e110821", + [ + null, + {} + ] + ], + "stretch-intrinsic-size-vrl-htb.html": [ + "7b1002191f2fef22b0a95b4830cc24db807ab577", + [ + null, + {} + ] + ], + "stretch-intrinsic-size-vrl-vrl.html": [ + "10f11a9f12d36ee042db9d4fdc8134799615750e", + [ + null, + {} + ] + ], + "table-align-self-stretch.html": [ + "bedd0a56950d21ef9e3bd81ffb30fe9534a621ef", + [ + null, + {} + ] + ], + "table-justify-self-stretch.html": [ + "c409b10714095581523df4a4d8305b9d7ac249f7", + [ + null, + {} + ] + ] + }, "animation": { "align-no-interpolation.html": [ "037743bdd32fc8de5c60e0608a08085cd3cd6fe7", @@ -523412,6 +525331,13 @@ {} ] ], + "align-content-block-display-coverage.html": [ + "3d581be28c95e1a3b17218d2b4e2bcc867949659", + [ + null, + {} + ] + ], "align-content-block-simple-height-change.html": [ "21eecb653988abb8391a53bd30f06a999bb9f19c", [ @@ -523804,6 +525730,15 @@ {} ] ], + "multicol": { + "align-content-multicol.html": [ + "d14815930a9372b3a5acec86d0c703fd1e6216b7", + [ + null, + {} + ] + ] + }, "parsing": { "align-content-computed.html": [ "8b5465c6b275118ec067cb6ef7b3026aca825e65", @@ -525137,13 +527072,6 @@ {} ] ], - "animate-with-color-mix.html": [ - "0b6d9bb4ab3ae911e7291e1da5e2259c0afbd0fc", - [ - null, - {} - ] - ], "animation-base-response-001.html": [ "c6731e179823584577f42a649f6f3665611a522a", [ @@ -525207,6 +527135,13 @@ {} ] ], + "animation-css-variable-dependent-property.html": [ + "26d183f116a05f3a0272aeab1e2cce8c2a1cca23", + [ + null, + {} + ] + ], "animation-css-variable-in-keyframe-adjusted.html": [ "f8e760c8ff26972d4eae903a281eb82cf2679fe4", [ @@ -525249,6 +527184,13 @@ {} ] ], + "animation-restarted-after-changing-iteration-count-after-completion.html": [ + "961104a82099a80f174fe4b75e541bcc8841d967", + [ + null, + {} + ] + ], "animation-style-element-replaced-with-keyframes-rule-of-same-name.html": [ "285442c95b0d5780319b560ef397b10d54f8f762", [ @@ -526140,14 +528082,14 @@ ] ], "background-image-invalid.html": [ - "c971811441edb30fce3f62d9f80f2ec326970cc5", + "8a48d5efe80e9836c6e6e939a03a6fa165831db7", [ null, {} ] ], "background-image-valid.html": [ - "7632a6b7c6def0e123b9bcfb01a705fd741ebdf9", + "da08a638853471a40001219b6daaf913ddc4230d", [ null, {} @@ -528206,7 +530148,7 @@ ] ], "color-valid-rgb.html": [ - "a979dbc484f6ef0e9c629eda582e4aee957fff24", + "a4995ac7ff95e656212e1b26b40fd92e6aed9f52", [ null, {} @@ -528381,7 +530323,7 @@ ] ], "CSS-supports-CSSStyleDeclaration.html": [ - "cff0dc2d2773aacb434b1ae99ee187f8718a8f38", + "daec039e406d51bfe67587ed096a74d20bbeeee7", [ null, {} @@ -529526,7 +531468,21 @@ ] ], "content-visibility-animation-in-auto-subtree.html": [ - "50f04f94f3f74bfd3215260bdd4262a80847d25e", + "690b49255fe772ec1df5390a7b540292e1c0cbe1", + [ + null, + {} + ] + ], + "content-visibility-animation-with-scroll-timeline-in-auto-subtree.html": [ + "0d9bde7d751b6c2dd633601c2ad7e0a8d7415025", + [ + null, + {} + ] + ], + "content-visibility-animation-with-scroll-timeline-in-hidden-subtree.html": [ + "af29a200f159f73759b4ada8b726d43f1ad0973c", [ null, {} @@ -529643,6 +531599,13 @@ {} ] ], + "content-visibility-web-animation-in-auto-subtree.html": [ + "a663e58fe03e36ceda2ab65474e16f63a6e345f2", + [ + null, + {} + ] + ], "content-visibility-with-popover-top-layer-006.html": [ "fbe8b9fbb777b2fdd632ddc0f17e69fbfed06bd7", [ @@ -534240,7 +536203,7 @@ ] ], "grid-align-baseline.html": [ - "25744ce61e57a3b75492f569ff88fe128e61343f", + "175811718f71f0a16dd168bed3fd2f7744b24837", [ null, {} @@ -537464,6 +539427,13 @@ ] ] }, + "cross-fade-computed-value.html": [ + "efb3b58d611bbd60ce4483ea4ef56901e4a98685", + [ + null, + {} + ] + ], "empty-background-image.html": [ "5192ff254c8a020638e1545baef07c20c07200ed", [ @@ -540343,6 +542313,20 @@ ] ], "parsing": { + "margin-rules-001.html": [ + "b73d1bc56fcd7ec66ed5944f4be79eaa63491d19", + [ + null, + {} + ] + ], + "nested-rules-001.html": [ + "23c8eb0894c6a9d28f60e2afd4e4de5c4d0765b2", + [ + null, + {} + ] + ], "page-computed.html": [ "0accba057487570e6a1a1e990c66cd72d0c17155", [ @@ -542513,6 +544497,20 @@ {} ] ], + "focused-element-in-excluded-subtree.html": [ + "85b3107802d134ed4a23f2bbfd05f6f3f84977b3", + [ + null, + {} + ] + ], + "focused-element-outside-scroller.html": [ + "73a5944856b19ff55219e446299513d0d65d589e", + [ + null, + {} + ] + ], "fragment-scrolling-anchors.html": [ "99c679acaa5822df3632c42fa5892c9a96686000", [ @@ -543143,8 +545141,15 @@ {} ] ], + "changing-scroll-snap-align-nested.tentative.html": [ + "ddea57055174ca7087bdc2587ebf884bc73ff2c5", + [ + null, + {} + ] + ], "changing-scroll-snap-align.html": [ - "c4bb2e9ff4262ef2ab9b1ba7a57405cf6896f166", + "a625621c270f62daa0d761732e1fdbd2b21e223b", [ null, {} @@ -543611,14 +545616,14 @@ ] ], "snapchanged-on-programmatic-root-scroll.tentative.html": [ - "d7cc409b5b06cda5896855f99bd613290fb02e9c", + "2e33c3c970f6595a614473aab4606df60e40e89c", [ null, {} ] ], "snapchanged-on-programmatic-scroll.tentative.html": [ - "eebe05704ecbd28fca1af04a02333d9b23ad6d88", + "6082e0901309dd9ea023c49ea90f3f377f0038b7", [ null, {} @@ -543658,6 +545663,15 @@ ] }, "snapchanging": { + "snapchanging-after-layout-change.tentative.html": [ + "5474b7ddce2416ef3075dd103b52a41814eb6b24", + [ + null, + { + "testdriver": true + } + ] + ], "snapchanging-on-programmatic-root-scroll.tentative.html": [ "d031811c17e8e28e04cc20b3ce5c5711ab83d755", [ @@ -543675,6 +545689,24 @@ "testdriver": true } ] + ], + "snapchanging-on-user-root-scroll.tentative.html": [ + "29d0239e2d692d4369f849a820c5c85adce6e47f", + [ + null, + { + "testdriver": true + } + ] + ], + "snapchanging-on-user-scroll.tentative.html": [ + "2c1f9742b622050d07367b5b6f3ddffe60a9381c", + [ + null, + { + "testdriver": true + } + ] ] } }, @@ -550205,13 +552237,6 @@ ] ], "animations": { - "animate-with-color-mix.html": [ - "3e630a7a2b1e190e3529de8b98ce239ecbda3f89", - [ - null, - {} - ] - ], "change-duration-during-transition.html": [ "cf03f2e1207988fbdb8df6e884422b43f9acc012", [ @@ -554333,14 +556358,14 @@ {} ] ], - "integer_interpolation_round_half_towards_positive_infinity_order.html": [ + "integer_interpolation_round_half_001.html": [ "60c439ebcf4cb5e6e7a412326b4333a163a6bd60", [ null, {} ] ], - "integer_interpolation_round_half_towards_positive_infinity_z_index.html": [ + "integer_interpolation_round_half_002.html": [ "c9b042ccb8f2d08e04dca56df9715b4081c4d19d", [ null, @@ -554439,7 +556464,7 @@ ] ], "minmax-length-percent-serialize.html": [ - "20d54d8cb0c4f3d699719c0cf82770c32be0da17", + "0a109d7c18ecfb30855cf6b147ea9b423385ac99", [ null, {} @@ -554516,7 +556541,7 @@ ] ], "progress-computed.tentative.html": [ - "cb1edfffb473dd6443970f4f5ad6f785e3783543", + "2f564fa14e9e1ba1cb083d00fa64ae5029d9be3b", [ null, {} @@ -554981,6 +557006,13 @@ {} ] ], + "variable-recalc-with-initial.html": [ + "0d880f41f1479b1f453e5bc582a3bfd11fdf64c1", + [ + null, + {} + ] + ], "variable-reference-cssom.html": [ "00354beaf83f9121660191d6e72c512530bb8612", [ @@ -555406,6 +557438,13 @@ {} ] ], + "checkbox-switch-input-computed-style.tentative.html": [ + "f8d8d6fca28c8fd1c4c185b6c49ff1370ce562e3", + [ + null, + {} + ] + ], "color-input-appearance-native-computed-style.html": [ "7ab0e0923d3e2af5a62a7c97316032cb718ddcb9", [ @@ -556075,6 +558114,13 @@ {} ] ], + "CSSStyleSheet-constructable-replace-cssRules.html": [ + "adb1b5f70988a33a6535e9c27c9c86dffdb99aaf", + [ + null, + {} + ] + ], "CSSStyleSheet-constructable-replace-on-regular-sheet.html": [ "76bee452a661bb95908c66e176797dd62f918ab2", [ @@ -557754,7 +559800,7 @@ ] ], "scroll-behavior-default-css.html": [ - "8606b1f3ed40b49c693213e02df69d088d93b979", + "575d73186017dd30c718ea48797fa7d2e6b6583a", [ null, { @@ -557763,7 +559809,7 @@ ] ], "scroll-behavior-element.html": [ - "c598d97b331c193989042289285617f832bb7fcc", + "2b3adf0a70d6e3da59bb2344a50249254c81ad4d", [ null, { @@ -557772,7 +559818,7 @@ ] ], "scroll-behavior-main-frame-root.html": [ - "d60275f1ccf892230250199f5af07207bc27ab1d", + "228f549989fb22ac2cde12a78290cdef693a66fa", [ null, { @@ -557781,7 +559827,7 @@ ] ], "scroll-behavior-main-frame-window.html": [ - "7593baf1b86c0e8da22d9b8ae190e47fae70bd4e", + "c3f05da335f668f6228798978d5d9b76f198c51a", [ null, { @@ -557790,7 +559836,7 @@ ] ], "scroll-behavior-scrollintoview-nested.html": [ - "2a97e0656637d12a2451fecd2985cd3370bb75cf", + "d05dd772f3bcd523296fee54bb91201c622d1615", [ null, { @@ -557799,7 +559845,7 @@ ] ], "scroll-behavior-smooth-navigation.html": [ - "299fd76976c1e2811766f606b378dc9cff867759", + "11f0d6a2d9e9d71acab009e11183c3adaf38b10d", [ null, { @@ -557808,7 +559854,7 @@ ] ], "scroll-behavior-smooth-positions.html": [ - "97905bb708134107e95731a1c9e38108f41bfe47", + "ce32825223dfc1fd96151a71babc0e4af71514d1", [ null, { @@ -557817,7 +559863,7 @@ ] ], "scroll-behavior-smooth.html": [ - "cb2dd9e48a4b08ae9ce77d4ca05154263218be3a", + "909afdef092d1bb027d40dd64ce06360b8f65081", [ null, { @@ -557826,7 +559872,7 @@ ] ], "scroll-behavior-subframe-root.html": [ - "050817d416f1095a2933758404d0b0c2ef69cbcf", + "2687d6eb5cadfbe8c3d47073fd5ae89eff7ac318", [ null, { @@ -557835,7 +559881,7 @@ ] ], "scroll-behavior-subframe-window.html": [ - "ef587fea49cb1074b9d47f0b6d3db5ee87f2e702", + "3113cbc88e3a2213de0f85803d16ee6a2c30bdf2", [ null, { @@ -557864,6 +559910,13 @@ {} ] ], + "scrollIntoView-align-scrollport-covering-child.html": [ + "b8ea73cc1fbd2b39fcd4b91a4b4edcf7f0e4730d", + [ + null, + {} + ] + ], "scrollIntoView-fixed.html": [ "bab58dad68b6c8a3019dc6b7b96d0f50194f0dbb", [ @@ -559038,13 +561091,6 @@ } }, "selectors": { - "anplusb-selector-parsing.html": [ - "b7cfd293515b67d5aa66bfe7b62262e1b64c0942", - [ - null, - {} - ] - ], "attribute-selectors": { "attribute-case": { "cssom.html": [ @@ -560090,7 +562136,7 @@ ] ], "has-sibling-insertion-removal.html": [ - "1331a22ad5528b753727535ac3df4ba9e17c1445", + "3c05a0f495a6d30a99165a59c1018563be029581", [ null, {} @@ -560208,6 +562254,15 @@ {} ] ], + "link-pseudo-class-in-has.html": [ + "d0c617a17618b24984a61649b5c88064605a2a0b", + [ + null, + { + "testdriver": true + } + ] + ], "link-pseudo-in-has.html": [ "0ff879768b7da2e052fc916f16f25eba01496a10", [ @@ -560340,6 +562395,15 @@ } ] ], + "user-valid-user-invalid.html": [ + "bca20fc99c3053491fe6e54d28c88cf1b294633a", + [ + null, + { + "testdriver": true + } + ] + ], "where.html": [ "170398300f0b4359139c597937f84e69e774a71e", [ @@ -560390,13 +562454,6 @@ {} ] ], - "is-where-parsing.html": [ - "ee73fe0f8879a3384ed2260af9af8d8d5d1a563f", - [ - null, - {} - ] - ], "is-where-pseudo-classes.html": [ "c3f1cfa81856a7c4083ed6a9bd100e098889fff0", [ @@ -560502,6 +562559,13 @@ ] ], "parsing": { + "parse-anplusb.html": [ + "b7cfd293515b67d5aa66bfe7b62262e1b64c0942", + [ + null, + {} + ] + ], "parse-attribute.html": [ "a8fcfb24f5a9b1350adda6e59af814f1111325c1", [ @@ -560565,6 +562629,13 @@ {} ] ], + "parse-is-where.html": [ + "ee73fe0f8879a3384ed2260af9af8d8d5d1a563f", + [ + null, + {} + ] + ], "parse-is.html": [ "68236445c5f1e871cd4e0c500057b2ad11955b60", [ @@ -560579,6 +562650,13 @@ {} ] ], + "parse-part.html": [ + "d6ee5d54d839070b36955a6b303a7d337ec471bf", + [ + null, + {} + ] + ], "parse-sibling.html": [ "4f7a7a3fbcc14d20282a7eee5ab4f9dd768467bb", [ @@ -560586,8 +562664,15 @@ {} ] ], + "parse-slotted.html": [ + "4b7b4a3b56fd05a628aa92bf5e110ffccb75d9f0", + [ + null, + {} + ] + ], "parse-state.html": [ - "35a8364181e30a1deebb8dd21e459429c1cd2767", + "95e3134b2cfa35c38b81c4378648f2afce1def69", [ null, {} @@ -560668,15 +562753,6 @@ } ] ], - "user-valid-user-invalid-invalidation.html": [ - "bca20fc99c3053491fe6e54d28c88cf1b294633a", - [ - null, - { - "testdriver": true - } - ] - ], "user-valid.html": [ "009286f0eb52aceaeea62d8f8e8acd741ab96555", [ @@ -565626,7 +567702,7 @@ "observable": { "tentative": { "observable-constructor.any.js": [ - "851369e2c98162881e5111308ff48f3559fdbc05", + "2f3f6a0be5a35e74df525fd46cc4e909b01d59a7", [ "dom/observable/tentative/observable-constructor.any.html", {} @@ -565637,11 +567713,22 @@ ] ], "observable-constructor.window.js": [ - "34776f8fc56b5b2ed69b407db6b66ce18b7792e8", + "d2b597c819054f2b4c186d24f1e908bf5d46d2a2", [ "dom/observable/tentative/observable-constructor.window.html", {} ] + ], + "observable-event-target.any.js": [ + "0f7ace2acc0794a96dae575f33a23a47cb287d8b", + [ + "dom/observable/tentative/observable-event-target.any.html", + {} + ], + [ + "dom/observable/tentative/observable-event-target.any.worker.html", + {} + ] ] } }, @@ -567034,6 +569121,30 @@ } ] ], + "input-in-text-control-which-is-also-editing-host.tentative.html": [ + "1ca22b6730c3300fd14e752346b920e4f6ad3469", + [ + "editing/other/input-in-text-control-which-is-also-editing-host.tentative.html?textcontrol=password", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/input-in-text-control-which-is-also-editing-host.tentative.html?textcontrol=text", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/input-in-text-control-which-is-also-editing-host.tentative.html?textcontrol=textarea", + { + "testdriver": true, + "timeout": "long" + } + ] + ], "insert-list-preserving-selection.tentative.html": [ "b7faf4f27ae012f192ad919a20773d59cff2db00", [ @@ -585160,7 +587271,7 @@ ] ], "automatic-beacon-anchor-click-handler.https.html": [ - "d6e52f908659fd9a6f7575f4357f05e7a606bcda", + "c3161fd5c315a652a8f83285c89f6c8c19851a91", [ null, { @@ -585169,7 +587280,43 @@ ] ], "automatic-beacon-click-handler.https.html": [ - "0dac25bfa4c438421c148e963e23ff891b733f48", + "0fe3fbb93356da7e70f5f63f4565829a99c11e1f", + [ + null, + { + "testdriver": true + } + ] + ], + "automatic-beacon-cross-origin-false.https.html": [ + "ccd8634973425aa7fee7e189fcf37335c3a37bb3", + [ + null, + { + "testdriver": true + } + ] + ], + "automatic-beacon-cross-origin-navigation.https.html": [ + "5a191174cfee6868f238864ddb6736c13a6acaf9", + [ + null, + { + "testdriver": true + } + ] + ], + "automatic-beacon-cross-origin-no-data.https.html": [ + "1b5710035d91df6d9ce85c1d8f490eeea2474611", + [ + null, + { + "testdriver": true + } + ] + ], + "automatic-beacon-cross-origin-no-opt-in.https.html": [ + "6d43a73bc7c7e3bbe1f3bafc425160b788724fc7", [ null, { @@ -585178,7 +587325,7 @@ ] ], "automatic-beacon-no-destination.https.html": [ - "65281b122f221184520e97c3e6a31cfbf3af5f29", + "c3fa3d657fa31da0774751ef37f5a690d0abbd35", [ null, { @@ -585187,7 +587334,7 @@ ] ], "automatic-beacon-no-opt-in.https.html": [ - "38ae769a1892a2b9f1b2035c5c32f3385ce2da4e", + "5a815a81389fb93e657bb6f429442303d6e29448", [ null, { @@ -585196,7 +587343,7 @@ ] ], "automatic-beacon-shared-storage.https.html": [ - "e93bde442c43a0b05fba4f187cc39f6bf07e7bac", + "093e55bca908285f8c5651e0798085b43c5e9a84", [ null, { @@ -585205,7 +587352,7 @@ ] ], "automatic-beacon-two-events-clear.https.html": [ - "8ad2f4e26727b8f90c39841e77af0c31116d73e4", + "f59fda5fca9b22eb9ef9e31955a436d1b6e13ae5", [ null, { @@ -585214,7 +587361,7 @@ ] ], "automatic-beacon-two-events-persist.https.html": [ - "769c8f3129d31017c437596dd504217eb3cf55c4", + "4da4f89e6e5c175f78dcc28c9de21db257f59d2d", [ null, { @@ -585223,7 +587370,16 @@ ] ], "automatic-beacon-unfenced-top.https.html": [ - "6b6c4af1cf8c7b1fe418de9393fb77e89de9a59c", + "945e80921d8e1d7f4496a91fde695e7eae7b59fe", + [ + null, + { + "testdriver": true + } + ] + ], + "automatic-beacon-use-ancestor-data.https.html": [ + "39df6f5c73f405d0e927fc9e24450cea806560d2", [ null, { @@ -585570,6 +587726,24 @@ } ] ], + "document-activeelement.https.html": [ + "3ac1fd866fc58c7bc957054976cf70baa92eacf6", + [ + null, + { + "testdriver": true + } + ] + ], + "document-hasfocus.https.html": [ + "24ea9988e916bd10633ff6a0f2ac1b8d1a481624", + [ + null, + { + "testdriver": true + } + ] + ], "document-picture-in-picture-denied.https.html": [ "3838fd683a87a4cf04e15098ff66a213c187e545", [ @@ -585982,7 +588156,7 @@ ] ], "permission-geolocation.https.html": [ - "98b5a72b3c60ba1f988b43a98d3caf654f6a96ec", + "e9ad53511b2cc52145deb24a89bde315448011e7", [ null, { @@ -586045,6 +588219,13 @@ {} ] ], + "report-event-reserved-event.https.html": [ + "0a541bb0c5c8f3e19c609b7e2411c89fea103764", + [ + null, + {} + ] + ], "resize-lock-input.https.html": [ "261c9a737eff4b85723214b7f4735b8fe9423a65", [ @@ -596170,7 +598351,7 @@ ] ], "freshness.any.js": [ - "6b97c8244f647c9dcbb95ccd2a9e06796e70444a", + "86c2620aa663658e1f723c1a01c6b7613fd44d24", [ "fetch/http-cache/freshness.any.html", { @@ -598158,7 +600339,7 @@ }, "private-network-access": { "anchor.tentative.https.window.js": [ - "8ad99b1ee9c9ece0720553ddb1e1409d117de025", + "4e860ad381df9b97fe3486e6b9d8d98eaabf808a", [ "fetch/private-network-access/anchor.tentative.https.window.html?include=from-local", { @@ -598180,6 +600361,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -598195,7 +600380,8 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ], [ @@ -598219,6 +600405,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -598234,7 +600424,8 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ], [ @@ -598258,6 +600449,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -598273,7 +600468,8 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ], [ @@ -598297,6 +600493,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -598312,12 +600512,13 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ] ], "anchor.tentative.window.js": [ - "60ccbde74d6d3c92f375e4562978c0702f50e06a", + "cb538658081437ba5867d2df426c444aacaa6c2c", [ "fetch/private-network-access/anchor.tentative.window.html", { @@ -598333,8 +600534,13 @@ [ "script", "resources/support.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -599024,7 +601230,7 @@ ] ], "mixed-content-fetch.tentative.https.window.js": [ - "54485dc70474023683f2a9f4f4fba1f0df0032af", + "dbae5193b5cb02e3b0eba3531483aac372ba8700", [ "fetch/private-network-access/mixed-content-fetch.tentative.https.window.html", { @@ -599036,8 +601242,13 @@ [ "script", "resources/support.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -599114,7 +601325,7 @@ ] ], "service-worker-background-fetch.tentative.https.window.js": [ - "6369b166e21ef023c17ec5140282990092621990", + "8d1028cc5ee85ad24851801caf526d79a0fa3da4", [ "fetch/private-network-access/service-worker-background-fetch.tentative.https.window.html", { @@ -599126,8 +601337,13 @@ [ "script", "resources/support.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -599361,7 +601577,7 @@ ] ], "window-open.tentative.https.window.js": [ - "c91ec2355119ad4a5cc2de360ffccc9c76796549", + "6793d1f3b4d9218975c7b08e165a729c00960df9", [ "fetch/private-network-access/window-open.tentative.https.window.html?include=from-local", { @@ -599383,6 +601599,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -599398,7 +601618,8 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ], [ @@ -599422,6 +601643,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -599437,7 +601662,8 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ], [ @@ -599461,6 +601687,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -599476,7 +601706,8 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ], [ @@ -599500,6 +601731,10 @@ "resources/support.sub.js" ], [ + "timeout", + "long" + ], + [ "variant", "?include=from-local" ], @@ -599515,12 +601750,13 @@ "variant", "?include=from-treat-as-public" ] - ] + ], + "timeout": "long" } ] ], "window-open.tentative.window.js": [ - "18a0260cb10f1af3c58a04d565bee9a1d4f1d9d0", + "5e2313d60a22bc7c3d2e3acb4dfbdebff711d539", [ "fetch/private-network-access/window-open.tentative.window.html", { @@ -599536,8 +601772,13 @@ [ "script", "resources/support.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -600296,8 +602537,187 @@ } ] ], + "auction-config-passed-to-worklets.https.window.js": [ + "c78a27bb87a67cae52c411beb6990796afd95f42", + [ + "fledge/tentative/auction-config-passed-to-worklets.https.window.html?1-5", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/auction-config-passed-to-worklets.https.window.html?11-15", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/auction-config-passed-to-worklets.https.window.html?16-last", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/auction-config-passed-to-worklets.https.window.html?6-10", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ] + ], "auction-config.https.window.js": [ - "efb05fc14dad026170041bcc87f50c19b39c5170", + "3b5814b5d4aa5139684a52a1e62d3c45293f495f", [ "fledge/tentative/auction-config.https.window.html?1-5", { @@ -600344,7 +602764,15 @@ ], [ "variant", - "?26-last" + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" ] ], "timeout": "long" @@ -600396,7 +602824,15 @@ ], [ "variant", - "?26-last" + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" ] ], "timeout": "long" @@ -600448,7 +602884,15 @@ ], [ "variant", - "?26-last" + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" ] ], "timeout": "long" @@ -600500,14 +602944,142 @@ ], [ "variant", - "?26-last" + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/auction-config.https.window.html?26-30", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/auction-config.https.window.html?31-35", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" ] ], "timeout": "long" } ], [ - "fledge/tentative/auction-config.https.window.html?26-last", + "fledge/tentative/auction-config.https.window.html?36-last", { "script_metadata": [ [ @@ -600552,7 +603124,15 @@ ], [ "variant", - "?26-last" + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" ] ], "timeout": "long" @@ -600604,7 +603184,15 @@ ], [ "variant", - "?26-last" + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-last" ] ], "timeout": "long" @@ -601851,7 +604439,7 @@ ] ], "direct-from-seller-signals.https.window.js": [ - "016c20c2b723a110b55eece55193aa1a954b4ffc", + "0ae1efd8d3780efe9ff1a0886e6f79d4c17c2558", [ "fledge/tentative/direct-from-seller-signals.https.window.html?1-5", { @@ -602141,6 +604729,185 @@ {} ] ], + "interest-group-passed-to-generate-bid.https.window.js": [ + "cf46855a3d1d879a2a1d64c7252ef7aaf8d7786f", + [ + "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?1-5", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?11-15", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?16-last", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?6-10", + { + "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-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-last" + ] + ], + "timeout": "long" + } + ] + ], "join-leave-ad-interest-group-in-fenced-frame.https.window.js": [ "e6836ab2f45a873a3d5bd3de9f74c92424782bec", [ @@ -603945,7 +606712,7 @@ ] ], "trusted-bidding-signals.https.window.js": [ - "8c15e93e66d581f84abe52659b6198f64a5ae527", + "9799af6ac1fbe1a3f7db8ce4230137d272cc8307", [ "fledge/tentative/trusted-bidding-signals.https.window.html?1-5", { @@ -604004,7 +606771,27 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604068,7 +606855,27 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604132,7 +606939,27 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604196,7 +607023,27 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604260,7 +607107,27 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604324,7 +607191,27 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604388,14 +607275,34 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" } ], [ - "fledge/tentative/trusted-bidding-signals.https.window.html?41-last", + "fledge/tentative/trusted-bidding-signals.https.window.html?41-45", { "script_metadata": [ [ @@ -604452,7 +607359,279 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/trusted-bidding-signals.https.window.html?46-50", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-40" + ], + [ + "variant", + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/trusted-bidding-signals.https.window.html?51-55", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-40" + ], + [ + "variant", + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/trusted-bidding-signals.https.window.html?56-60", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-40" + ], + [ + "variant", + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -604516,7 +607695,195 @@ ], [ "variant", - "?41-last" + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/trusted-bidding-signals.https.window.html?61-65", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-40" + ], + [ + "variant", + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/trusted-bidding-signals.https.window.html?66-last", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-5" + ], + [ + "variant", + "?6-10" + ], + [ + "variant", + "?11-15" + ], + [ + "variant", + "?16-20" + ], + [ + "variant", + "?21-25" + ], + [ + "variant", + "?26-30" + ], + [ + "variant", + "?31-35" + ], + [ + "variant", + "?36-40" + ], + [ + "variant", + "?41-45" + ], + [ + "variant", + "?46-50" + ], + [ + "variant", + "?51-55" + ], + [ + "variant", + "?56-60" + ], + [ + "variant", + "?61-65" + ], + [ + "variant", + "?66-last" ] ], "timeout": "long" @@ -611006,7 +614373,7 @@ ] ], "navigate-to-unparseable-url.html": [ - "f4e4e36f3725ceb6843113ed10d7a26605c24f22", + "d20a440d039a4ff9c08de1e796439ae09bfa3a5b", [ null, {} @@ -615230,7 +618597,7 @@ }, "the-window-object": { "BarProp.window.js": [ - "27a357cab591c92bab589924f78841ca89e69a71", + "266779ee0b6131322be62d97b956f63a97770470", [ "html/browsers/the-window-object/BarProp.window.html", {} @@ -615467,6 +618834,13 @@ {} ] ], + "close_pagehide.html": [ + "4d726437c235d16a03dda3ae277026e0b71298ae", + [ + null, + {} + ] + ], "close_script_defer.html": [ "1217882b16f84f0ddd51253c9c9f464cab787b17", [ @@ -615704,7 +619078,7 @@ ] }, "self-et-al.window.js": [ - "1b0fa1211a701253b61d1eced344faa8763ad6ef", + "c42522803ab020961e21e8fc1455322ce377c458", [ "html/browsers/the-window-object/self-et-al.window.html", {} @@ -619617,7 +622991,7 @@ }, "filters": { "2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [ - "f43e10703df1eb9e23bc3046dafad698486992dc", + "42fb1ee8f84ff038c9b67f681d05a6a7323b88b3", [ null, {} @@ -619680,7 +623054,7 @@ ] ], "2d.filter.canvasFilterObject.tentative.html": [ - "c19bc700880875b8ed4c0ecfbf3f3ca754f93a2b", + "c40e718d7229d64f4f0edb6a53267c0e01b7330a", [ null, {} @@ -629986,14 +633360,14 @@ }, "filters": { "2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [ - "e4d4798a8e8113a9ee9c3e1e4f08f059e7c006ba", + "d8f14529c5306cccc5dd4806186e935edb2c4a2a", [ null, {} ] ], "2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js": [ - "75afb17b792251d249e771e143c891e2759d02ba", + "9b3fb3c04cd5a98f0d4f6b5b27035ba72bd98c39", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.html", {} @@ -630112,14 +633486,14 @@ ] ], "2d.filter.canvasFilterObject.tentative.html": [ - "0d057e41050b2b4ef91be59337b5d14f2c696aef", + "fb99ef7d1ff8013e7ebfd4146ed0688f9ed2277c", [ null, {} ] ], "2d.filter.canvasFilterObject.tentative.worker.js": [ - "22a743877ff32893a022e250f38ead67a3178767", + "db95e0b006c414019f3cc687a359e0b833b6ed75", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.html", {} @@ -630281,13 +633655,6 @@ {} ] ], - "2d.layer.opaque-canvas.worker.js": [ - "df8bee548858a039b2a9183f32d9e50d31145081", - [ - "html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.html", - {} - ] - ], "2d.layer.putImageData.html": [ "b46b80c1f46e39b5078b0440a360fbcc7c93822b", [ @@ -642222,15 +645589,197 @@ {} ] ], - "document-render-blocking-partial.tentative.html": [ - "89ab05ed845da69b3d82153a77652349a68a3d81", + "element-render-blocking-001.tentative.html": [ + "9624b41a194946794fc17c71f66fb4cc2ec6abe1", + [ + null, + {} + ] + ], + "element-render-blocking-002.tentative.html": [ + "ab0fd511156bc9edb89fe9350d87a000616f2438", + [ + null, + {} + ] + ], + "element-render-blocking-003.tentative.html": [ + "eb3a347a6ebbb7b05a5e3bb7905c9098bf755c51", + [ + null, + {} + ] + ], + "element-render-blocking-004.tentative.html": [ + "2c50f2d362a54c8252f92222a71025301222aa9f", + [ + null, + {} + ] + ], + "element-render-blocking-005.tentative.html": [ + "04cdab467deff3f8880855592cd5724d064b3371", + [ + null, + {} + ] + ], + "element-render-blocking-006.tentative.html": [ + "1c9da255a622503c2f2bb74fc98876938bce19e1", + [ + null, + {} + ] + ], + "element-render-blocking-007.tentative.html": [ + "df8f9ae3d1258194088f4b8cbadbf2eee9b85500", + [ + null, + {} + ] + ], + "element-render-blocking-008.tentative.html": [ + "c2458a0bab31244de67c707d32b2669a5aaa746a", + [ + null, + {} + ] + ], + "element-render-blocking-009.tentative.html": [ + "d765ac8a5d3c9b742fa9b24d3401d6c1ff098a08", + [ + null, + {} + ] + ], + "element-render-blocking-010.tentative.html": [ + "7ef6a1baf35b460791ac54b8891dc3e019aaee85", + [ + null, + {} + ] + ], + "element-render-blocking-011.tentative.html": [ + "31df9b068c01b5a149941f24d619898f6b926301", + [ + null, + {} + ] + ], + "element-render-blocking-012.tentative.html": [ + "8f2594d25903a60911f89d7eb6a39968ca2e9d82", + [ + null, + {} + ] + ], + "element-render-blocking-013.tentative.html": [ + "9d65bd96b73189f4fafbbcd59261261e0f154fb9", + [ + null, + {} + ] + ], + "element-render-blocking-014.tentative.html": [ + "d042b96b64370c1ad08cd235729a2c0e6abb597e", + [ + null, + {} + ] + ], + "element-render-blocking-015.tentative.html": [ + "f7ac0b1015d79635d83fced00cbcb8c7c5e6400b", + [ + null, + {} + ] + ], + "element-render-blocking-016.tentative.html": [ + "d32a0468e79b4109607d920ec72279ae0af0e0d6", + [ + null, + {} + ] + ], + "element-render-blocking-017.tentative.html": [ + "d3a6046cbb37f90b3bf5721f1799f8df313d06c7", + [ + null, + {} + ] + ], + "element-render-blocking-018.tentative.html": [ + "0d7402201accb05ce81636be43057128cfaf976b", + [ + null, + {} + ] + ], + "element-render-blocking-019.tentative.html": [ + "fea9e3a2b21821722eb956beac19acfb44721034", + [ + null, + {} + ] + ], + "element-render-blocking-020.tentative.html": [ + "7fc0fe19bbae57d15b5a8bbc27cfb6400661114b", + [ + null, + {} + ] + ], + "element-render-blocking-021.tentative.html": [ + "29430349f04689578cc7e5f90ba86ef77626bde5", [ null, {} ] ], - "document-render-blocking.tentative.html": [ - "909029b73db0594adb1a940a47b8047b1fc298a4", + "element-render-blocking-022.tentative.html": [ + "6548c9ec4df21169af9c97dfa30acf49acb1c95a", + [ + null, + {} + ] + ], + "element-render-blocking-023.tentative.html": [ + "c3661bcaa6a9c3b2e6fc64dc937c73688041a43d", + [ + null, + {} + ] + ], + "element-render-blocking-024.tentative.html": [ + "c98022cfeabef10171061432168274eb81324834", + [ + null, + {} + ] + ], + "element-render-blocking-025.tentative.html": [ + "29868b92cbc76a7f9b6da3e645e02c0701f5e31b", + [ + null, + {} + ] + ], + "element-render-blocking-026.tentative.html": [ + "dc23211b8b00d2011592dd529bd554670456acc5", + [ + null, + {} + ] + ], + "element-render-blocking-027.tentative.html": [ + "5b8a5eb24d5e973a25ca8fbf594f85f006ba7a06", + [ + null, + {} + ] + ], + "element-render-blocking-028.tentative.html": [ + "57ba3d602602d59f55bdaa34d18eeb06254e826a", [ null, {} @@ -654854,7 +658403,7 @@ ] ], "invoketarget-on-popover-behavior.tentative.html": [ - "9d9bbaee721edccef6bfca6f0b07f9eec1221227", + "03eba222855307009c4691a27002c6d2d13414cf", [ null, { @@ -655295,8 +658844,18 @@ } ] ], + "popover-invoking-attribute-hint.tentative.html": [ + "b531ddc460e83ac57e6716686b1ffae353625d5f", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "popover-invoking-attribute.html": [ - "22e7dc14a17f1d598cad66b39c0b7ebff856e374", + "8e312e90d7af1050dd055cedac9af243bac7f035", [ null, { @@ -655401,8 +658960,15 @@ {} ] ], + "popover-stacking-anchor-attribute.tentative.html": [ + "6895b8625ac7ece6c3249de89f6ceaac01ef6ba3", + [ + null, + {} + ] + ], "popover-stacking.html": [ - "7452fae7da309831ac845f4f0d9d3c5a2887f5c5", + "1c352d566e747d489e8824cc6dde6abe530b5930", [ null, {} @@ -665896,6 +669462,13 @@ {} ] ], + "referrer.https.sub.html": [ + "3cd83ba561c2b5166cacddf493e52c1ee08318e1", + [ + null, + {} + ] + ], "upgrade.https.sub.html": [ "71a1fe1dde618163c259d13eb14797c22785c247", [ @@ -667861,6 +671434,27 @@ {} ] ], + "fixed-position-child-scroll.html": [ + "93602090463df74b71cbfdce33a622775540fede", + [ + null, + {} + ] + ], + "fixed-position-iframe-scroll.html": [ + "7d90331fd0b8ab3fdc8ffefb9c2a1ab3030f1384", + [ + null, + {} + ] + ], + "fixed-position-scroll.html": [ + "3dc02a8b0d3c561c6c17d29a593c4ef31e3fcd30", + [ + null, + {} + ] + ], "idlharness.window.js": [ "2059e1ce638b5f2cac4e4f013c567a56894599a0", [ @@ -671240,16 +674834,6 @@ } ] ], - "loaf-desired-exec-time.html": [ - "656c58d0c24c7738e9dc3c7fcdfb5c05d2a69506", - [ - null, - { - "testdriver": true, - "timeout": "long" - } - ] - ], "loaf-event-blocking-duration.html": [ "daa5f64c39e3aa186b0ff26cb74847fa26dcfe10", [ @@ -671270,7 +674854,7 @@ ] ], "loaf-first-ui-event.html": [ - "857ccd0a182ef0f061f9acff3ee42a12e47d89d2", + "807c9cfe017444bda4e67b0bef645c21bf5fc538", [ null, { @@ -671288,8 +674872,26 @@ } ] ], - "loaf-iframe.html": [ - "2885d4fbae9c88850478265fe6872a2f7c88c157", + "loaf-iframe-crossorigin.html": [ + "16ecfd70176957c7b3150595a22aeec92dc6ff86", + [ + null, + { + "timeout": "long" + } + ] + ], + "loaf-iframe-same-origin.html": [ + "65dc89f29abc60dc2d0c76ca0c9bf5d31fca02b7", + [ + null, + { + "timeout": "long" + } + ] + ], + "loaf-iframe-self.html": [ + "7511ff1072ab41c0f28851c0ffb443df15ffed62", [ null, { @@ -671352,7 +674954,7 @@ ] ], "loaf-source-location-redirect.html": [ - "013742354c15f25fe51aac6d44ea90966a6993ce", + "ba2478e6224501fbc9488365783e47e014914bda", [ null, { @@ -679350,7 +682952,7 @@ ] ], "after-transition-intercept-handler-modifies.html": [ - "78d1692104d3a069dd0b30f61d0c7324693d54cc", + "baff6fe542bbf0263b27c270981978ebf468e9b2", [ null, {} @@ -683256,13 +686858,6 @@ {} ] ], - "performance-entry-source-deleted-frame.html": [ - "8197060670797c928e070b9bd23a14603f37a275", - [ - null, - {} - ] - ], "performance-entry-source.html": [ "d10d3c5ed512b79cc9ea516de0d1d59d7959cedf", [ @@ -702613,10 +706208,12 @@ ] ], "wakelock-disabled-by-permissions-policy.https.html": [ - "fe4147b46cdd3949b25ce0f328a082979e635203", + "354b0a5e15469b497b2e8d4d8e93991f0305ca4a", [ null, - {} + { + "testdriver": true + } ] ], "wakelock-document-hidden.https.html": [ @@ -702629,17 +706226,21 @@ ] ], "wakelock-enabled-by-permissions-policy-attribute-redirect-on-load.https.html": [ - "acfce43f96247949d7e4963970d0502d9c0b5d5d", + "8898a571e8fb699a01f35ba2fc28d089b56b0fb9", [ null, - {} + { + "testdriver": true + } ] ], "wakelock-enabled-by-permissions-policy-attribute.https.html": [ - "c2be3a45080a36bd7d90244aa73aca0ee2190368", + "ea3ebf2449be56b2a042967e17a1a7ac74a0c8d5", [ null, - {} + { + "testdriver": true + } ] ], "wakelock-enabled-by-permissions-policy.https.html": [ @@ -702686,7 +706287,7 @@ ] ], "wakelock-onrelease.https.html": [ - "fb071b3763d6e1060e7b616da5102c3d463de163", + "896748411be22c8937421361b7dac95a36448f7a", [ null, { @@ -703696,11 +707297,12 @@ ] ], "force-load-at-top.html": [ - "1399de3d624927131c21ef9bf548825de4b059a4", + "fe3913dfac453ea899239de6d89a13dd75be2ab6", [ null, { - "testdriver": true + "testdriver": true, + "timeout": "long" } ] ], @@ -703750,7 +707352,7 @@ ] ], "percent-encoding.html": [ - "696734b663d2cbd49adbb6a2a400d0747be5ebc6", + "1f1794bdae09db3a501479717121d93938e9869a", [ null, { @@ -703759,11 +707361,12 @@ ] ], "redirects.html": [ - "5ad910affe55f6dd5ff63cdd3e019cf969fc6653", + "71bc1be02e65be68eced1ef7e3e492d1bff6cffd", [ null, { - "testdriver": true + "testdriver": true, + "timeout": "long" } ] ], @@ -708742,14 +712345,14 @@ "tentative": { "static-router": { "static-router-main-resource.https.html": [ - "523ececf317edeea73f1c833787c28b7b60108aa", + "1673b97ca7b61e4c1c193ca548c92706868a56ff", [ null, {} ] ], "static-router-subresource.https.html": [ - "1fd3880bf26b8617f80d14580f9124874d2192a2", + "6154c38f2d7013150021a2903d9b8a7301dc7013", [ null, {} @@ -709145,6 +712748,13 @@ ] ], "declarative": { + "clonable.window.js": [ + "5ebeacf37cbd8abfd4bf4eae73c28958e1449f81", + [ + "shadow-dom/declarative/clonable.window.html", + {} + ] + ], "declarative-after-attachshadow.html": [ "bfe2d66cfa9d3921bcdb046285fdb0af69b7354a", [ @@ -710877,8 +714487,22 @@ {} ] ], + "shared-storage-writable-service-worker-fetch.tentative.https.sub.html": [ + "ea7af527b540d303cf3e41c7afd8d88071bcd293", + [ + null, + {} + ] + ], + "shared-storage-writable-service-worker-iframe.tentative.https.sub.html": [ + "9eb2820145ea31c250e4a5003c0d5974941d71ca", + [ + null, + {} + ] + ], "shared-storage-writable-service-worker-img.tentative.https.sub.html": [ - "9e7326d3c4d62435ef7a344864341bdd318965fb", + "6d481559ee75e96955cc8f83c464200e4c4a9039", [ null, {} @@ -711367,15 +714991,6 @@ } ] ], - "click-event-bubbles.tentative.html": [ - "ee9d1e12335c8dc775a391585b02d892081000f7", - [ - null, - { - "testdriver": true - } - ] - ], "disabled.html": [ "b53c2f701222c4a85e80d2f604ea34baef2b859b", [ @@ -711467,22 +715082,22 @@ } ] ], - "multiple-nested-events.tentative.html": [ - "e51841865d654a65e44fefc505e8102196a4093c", + "multiple-paint-entries-buffered.tentative.html": [ + "dbb945a0a811330a3efa74b8b34da3f7987e9f38", [ null, { - "testdriver": true + "testdriver": true, + "timeout": "long" } ] ], - "multiple-paint-entries-buffered.tentative.html": [ - "dbb945a0a811330a3efa74b8b34da3f7987e9f38", + "multiple_nested_events.tentative.html": [ + "196cfa06868ca9fd321db59755e1908a52c26c1e", [ null, { - "testdriver": true, - "timeout": "long" + "testdriver": true } ] ], @@ -711496,7 +715111,7 @@ ] ], "navigation-api-after-transition-commit.tentative.html": [ - "ae17db7d59f4c5cf2bf01af2b7224fa6aa8232df", + "5c7d8f4f7a4fa4669ab42a18562bd1dceecc4c56", [ null, { @@ -711523,7 +715138,7 @@ ] ], "navigation-api-hash.tentative.html": [ - "e20578ea79ed7a6564a2d960cc1148b520c55ef2", + "a63b177a63f4974423954a720b77b3874139057d", [ null, { @@ -711532,7 +715147,7 @@ ] ], "navigation-api-preventDefault.tentative.html": [ - "b7b2a24c94203080d052411f080a0dd3c0d11cbe", + "d6c61efb3cbc3da1412748b9b2c8a50ab537be63", [ null, { @@ -711541,7 +715156,7 @@ ] ], "navigation-api-rejected.tentative.html": [ - "693f876b6e188b4c8ec8531aa7723c6afada70af", + "bcc0451d5bd80203092b6ed769d4ab2c9ccfff19", [ null, { @@ -711559,7 +715174,7 @@ ] ], "navigation-api-view-transition.tentative.html": [ - "4d88f3d0b7d9bee962f7b7e71c7695c421e7b560", + "2755f9f9ac75b980018f0ef78055c3f7874621b8", [ null, { @@ -711568,7 +715183,7 @@ ] ], "navigation-api.tentative.html": [ - "2d61736a486127cdfb37210906856cb4404a48d6", + "ca11f684f49908855323e8a337092f9dc971823b", [ null, { @@ -711577,7 +715192,7 @@ ] ], "popstate-multiple-backs.tentative.html": [ - "fd87f5f03e753b3ac5a8d8268a76496d93c15969", + "2a12a352bffc3fed4f207daaf877c781b0799ff3", [ null, { @@ -711586,7 +715201,7 @@ ] ], "popstate.tentative.html": [ - "f89991d76b044c5165c53b3b90b4620eb1e2d047", + "60a5ff72292c15abd281b1264e747a8f3c0d0d2b", [ null, { @@ -711875,7 +715490,7 @@ ] ], "duplicate-urls.https.html": [ - "c6d6fb7878d61f677285515e723cd5b82de83590", + "f9e46a6a384a5d1c15e9314a64b610186d63b11e", [ null, {} @@ -712346,6 +715961,21 @@ } ] ], + "prefetch-uses-cache.sub.https.html": [ + "c0e9e73c75e877f4e130a26de6764c8966ef8620", + [ + "speculation-rules/prefetch/prefetch-uses-cache.sub.https.html?cross-site", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/prefetch-uses-cache.sub.https.html?same-site", + { + "timeout": "long" + } + ] + ], "redirect-url.sub.https.html": [ "02bb35349ff9f72e74d0244473447b9ea89ce9a4", [ @@ -713721,7 +717351,7 @@ "storage": { "buckets": { "bucket-quota-indexeddb.tentative.https.any.js": [ - "e03aaa802d0869fbab732fc133c613f88837f3b5", + "ee9202777e7ec55faee0b89f4c656f7a76c05e83", [ "storage/buckets/bucket-quota-indexeddb.tentative.https.any.html", { @@ -713831,6 +717461,414 @@ ] } ] + ], + "bucket_names.tentative.https.any.js": [ + "e0f122dc47d86aedced40ad7e41e5c6c192ef573", + [ + "storage/buckets/bucket_names.tentative.https.any.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for bucket names." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/bucket_names.tentative.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for bucket names." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/bucket_names.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for bucket names." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/bucket_names.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for bucket names." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ] + ], + "buckets_basic.tentative.https.any.js": [ + "20ff227bac1ec1b8a2b4d36c9ba4488a6c13c827", + [ + "storage/buckets/buckets_basic.tentative.https.any.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for open(), keys(), delete()." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/buckets_basic.tentative.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for open(), keys(), delete()." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/buckets_basic.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for open(), keys(), delete()." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/buckets_basic.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Basic tests for open(), keys(), delete()." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ] + ], + "buckets_storage_policy.tentative.https.any.js": [ + "918364d731527ffe4b1e40896a15d3c3cce08f90", + [ + "storage/buckets/buckets_storage_policy.tentative.https.any.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for bucket storage policies." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/buckets_storage_policy.tentative.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for bucket storage policies." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/buckets_storage_policy.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for bucket storage policies." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/buckets_storage_policy.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for bucket storage policies." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window,worker" + ] + ] + } + ] + ], + "detached-iframe.https.html": [ + "a67c89efa3e89bf640d2b561a31067c3a9bd8051", + [ + null, + {} + ] + ], + "idlharness-worker.https.any.js": [ + "9a1a3f80b9bc8d58f934921c877fd605d70292e3", + [ + "storage/buckets/idlharness-worker.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ], + [ + "storage/buckets/idlharness-worker.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ], + [ + "storage/buckets/idlharness-worker.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ], + [ + "storage/buckets/idlharness-worker.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ] + ], + "opaque-origin.https.window.js": [ + "c91d3faa67a3b8041a0cc2605b0d3416e2fcb119", + [ + "storage/buckets/opaque-origin.https.window.html", + { + "script_metadata": [ + [ + "title", + "Storage Buckets API: Interface is not exposed in opaque origins." + ], + [ + "script", + "resources/util.js" + ], + [ + "global", + "window" + ] + ] + } + ] + ], + "storage_bucket_object.tentative.https.any.js": [ + "52f1693ccb22a3966d47ac90d6627818de4d9a65", + [ + "storage/buckets/storage_bucket_object.tentative.https.any.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for the StorageBucket object." + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/storage_bucket_object.tentative.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for the StorageBucket object." + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/storage_bucket_object.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for the StorageBucket object." + ], + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "storage/buckets/storage_bucket_object.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Buckets API: Tests for the StorageBucket object." + ], + [ + "global", + "window,worker" + ] + ] + } + ] ] }, "estimate-indexeddb.https.any.js": [ @@ -724061,7 +728099,7 @@ ] ], "requestStorageAccessFor.sub.https.window.js": [ - "8af30c497f243b43944a57f965611e39c9dd9721", + "dd2975e49c02193475a034987365df1d0f69ac81", [ "top-level-storage-access-api/tentative/requestStorageAccessFor.sub.https.window.html", { @@ -724751,7 +728789,7 @@ ] ], "trusted-types-event-handlers.html": [ - "57f8d3d90c4162949832ec0b48f62c0511007c93", + "9dd7133cbb0b5b75b4bc04b8e05762e7981ad864", [ null, {} @@ -725151,7 +729189,7 @@ ] ], "mousemove_prevent_default_action.tentative.html": [ - "4d9772369b7ae71b4c2154198ac740f171db61e4", + "4caf98087fbf4372dc5ad28afdb48cd0bae6cea2", [ null, { @@ -729156,6 +733194,13 @@ {} ] ], + "viewport-scrollbars-cause-resize-in-iframe.html": [ + "ce9ec3276886b5786ffe1309251469e92f29e1a9", + [ + null, + {} + ] + ], "viewport-scrollbars-cause-resize.html": [ "086e8d92b087afe8aea2fbc91c1f96dd7d328e72", [ @@ -738726,6 +742771,16 @@ } ] ], + "createcredential-hints.https.html": [ + "a662bcef46f156c212fcd81feb7d69b613f551c3", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "createcredential-large-blob-not-supported.https.html": [ "167a65b92262759e652009e51c5f8ad6f2e4ac1e", [ @@ -738875,6 +742930,16 @@ } ] ], + "getcredential-hints.https.html": [ + "45f6e6b48e2167fabb826f55f084c1b4a5a3501c", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "getcredential-large-blob-not-supported.https.html": [ "97cea30f27f491bf0fd1aec6fe6e4734d48e591a", [ @@ -744243,26 +748308,145 @@ ] ], "close-event": { - "close-event.tentative.any.js": [ - "a793269ddee432f68fa304b5ade025b9641f4d3e", + "document-destroyed.tentative.window.js": [ + "85e4ad30add19b9a1d733917f6d89ada74c62198", [ - "webmessaging/message-channels/close-event/close-event.tentative.any.html", + "webmessaging/message-channels/close-event/document-destroyed.tentative.window.html", { "script_metadata": [ [ "title", - "close event test" + "Close event test when the document is destroyed." + ], + [ + "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/helper.js" + ] + ] + } + ] + ], + "entangled-after-back-forward-cache-restore.https.tentative.window.js": [ + "c99e89f02b7ef4e3c9f3df3dcc35fcf020823dd1", + [ + "webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.html", + { + "script_metadata": [ + [ + "timeout", + "long" + ], + [ + "title", + "Confirm close event is not fired when the page enters BFCache and MessagePort still works after the page is restored." + ], + [ + "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", + "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "script", + "/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js" + ] + ], + "timeout": "long" + } + ] + ], + "explicitly-closed.tentative.window.js": [ + "612003d58eaea908ad93294a7bbf777184356a28", + [ + "webmessaging/message-channels/close-event/explicitly-closed.tentative.window.html", + { + "script_metadata": [ + [ + "title", + "Close event test when an entangled port is explicitly closed." + ], + [ + "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/helper.js" + ] + ] + } + ] + ], + "garbage-collected.tentative.any.js": [ + "11f19c3b246f90b742ee2969e4dbddfdb06865b1", + [ + "webmessaging/message-channels/close-event/garbage-collected.tentative.any.html", + { + "script_metadata": [ + [ + "title", + "Close event test when an entangled port is GCed." + ], + [ + "script", + "/common/gc.js" ] ] } ], [ - "webmessaging/message-channels/close-event/close-event.tentative.any.worker.html", + "webmessaging/message-channels/close-event/garbage-collected.tentative.any.worker.html", { "script_metadata": [ [ "title", - "close event test" + "Close event test when an entangled port is GCed." + ], + [ + "script", + "/common/gc.js" ] ] } @@ -745435,7 +749619,7 @@ ] ], "elementwise_unary.https.any.js": [ - "27902a406fb1bc32798f2504b7e9d7b6c28bc391", + "4cdfee5bcb07f8ab011460f23564e081372267ac", [ "webnn/elementwise_unary.https.any.html", { @@ -745536,6 +749720,57 @@ } ] ], + "expand.https.any.js": [ + "11abb9baa89da3a819ca67f99a83109c433fc88e", + [ + "webnn/expand.https.any.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API expand operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "./resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/expand.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API expand operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "./resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], "gemm.https.any.js": [ "e5de9521fba767d5269b0829af3e55248e16f6fc", [ @@ -745946,7 +750181,7 @@ ] ], "elementwise_unary.https.any.js": [ - "eff4631552909676ea69ee2dbbd8048c66c98c9b", + "45978f91ec4c5d7f0d00fd7d4abe4661788a38b8", [ "webnn/gpu/elementwise_unary.https.any.html", { @@ -746047,6 +750282,57 @@ } ] ], + "expand.https.any.js": [ + "82fa891a39933aa5420ce88e8d888e359732faa7", + [ + "webnn/gpu/expand.https.any.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API expand operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/gpu/expand.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API expand operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], "gemm.https.any.js": [ "a19dc39bbc87e845eadbf74ea369780bd38e90dc", [ @@ -747117,6 +751403,57 @@ "timeout": "long" } ] + ], + "where.https.any.js": [ + "ec0c5530a044b4b44077743eede15f75fea0afe3", + [ + "webnn/gpu/where.https.any.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API where operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/gpu/where.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API where operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] ] }, "hard_sigmoid.https.any.js": [ @@ -748197,6 +752534,57 @@ "timeout": "long" } ] + ], + "where.https.any.js": [ + "306128a814227550d3ce5de7d650d9d64ba67b60", + [ + "webnn/where.https.any.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API where operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "./resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/where.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API where operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "./resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] ] }, "webrtc": { @@ -748295,7 +752683,7 @@ ] ], "RTCDataChannel-binaryType.window.js": [ - "f641f51976215f45d1177a53bdc17571ae7c707f", + "c93d0cb1a09d52c70248e3b28494d53371940ae3", [ "webrtc/RTCDataChannel-binaryType.window.html", {} @@ -748343,7 +752731,7 @@ ] ], "RTCDataChannel-send.html": [ - "70cdf8657fd4c5637210234131a71cf60930ff82", + "193f38cd780292e95daceda0aade957ac53c95cc", [ null, { @@ -748490,7 +752878,7 @@ ] ], "RTCPeerConnection-connectionState.https.html": [ - "d7716a1d4da19acaf3bd8c016543dd1c75b471d6", + "b3884e4314d5a182df0d74f0db4ae4b2557a0a0d", [ null, {} @@ -748511,7 +752899,7 @@ ] ], "RTCPeerConnection-createDataChannel.html": [ - "7ad8bf7d46ecd7a3702542d8b484132afcc94d63", + "cddbd02c7bf22420532b5dc0d5a691660b5f44ec", [ null, { @@ -748897,6 +753285,13 @@ {} ] ], + "RTCRtpParameters-maxFramerate.html": [ + "3e348f0d147bdb6cd0583d4f5596feb30f86cb52", + [ + null, + {} + ] + ], "RTCRtpParameters-rtcp.html": [ "79653045200e667f405a749ae6f51a083dc1f99d", [ @@ -749326,6 +753721,15 @@ {} ] ], + "additional-codecs.html": [ + "5462d6147935705ca2370c3e9e5b3d125d7580fa", + [ + null, + { + "timeout": "long" + } + ] + ], "bundle.https.html": [ "73ea477e0473e698bec25ca01a3b21f1579b8b35", [ @@ -749984,13 +754388,6 @@ {} ] ], - "RTCRtpParameters-maxFramerate.html": [ - "3e348f0d147bdb6cd0583d4f5596feb30f86cb52", - [ - null, - {} - ] - ], "RTCRtpReceiver-jitterBufferTarget-stats.html": [ "33f71800bd8ed53eb7b0446e6535997bccb7b01a", [ @@ -794610,7 +799007,7 @@ ] ], "clip.py": [ - "4e37c4714c3ae27e4bb1bfe968cf2d81618b654e", + "8300e962b92c50c019c0afd3347c5c79cdb0c0d6", [ null, {} @@ -794631,7 +799028,7 @@ ] ], "invalid.py": [ - "58481c4e7ad4464f107dc8bb11ad2def93e7c67d", + "6fef42a48f01522a7cfa26baed85d12cdfb4df65", [ null, {} @@ -794798,6 +799195,64 @@ ] ] }, + "locate_nodes": { + "context.py": [ + "6aac78a48ba08e28944520f682fb7aa223da77b9", + [ + null, + {} + ] + ], + "invalid.py": [ + "d549cf35de281154e79d33fd2174c29943c96868", + [ + null, + {} + ] + ], + "locator.py": [ + "656eaddc1fc40c85050c3e267e45da3e47ed1b54", + [ + null, + {} + ] + ], + "max_node_count.py": [ + "9147fb318326d918d9ea9137abae18f94cdeeeb4", + [ + null, + {} + ] + ], + "ownership.py": [ + "d5450ffc80c8c060d575b7893f8bd8cd179c4c94", + [ + null, + {} + ] + ], + "sandbox.py": [ + "7f9cd9dfd8584bee967d1d070b79a6eb92f31d4f", + [ + null, + {} + ] + ], + "serialization_options.py": [ + "9d7e7a861380b51b15b0c15e18db93559fd5a94f", + [ + null, + {} + ] + ], + "start_nodes.py": [ + "3f46a50642c7c3bba1b8a92884c3a6ab50244a7f", + [ + null, + {} + ] + ] + }, "navigate": { "about_blank.py": [ "55ca351297732a3cc69073f8d68f60459346e379", @@ -795114,7 +799569,7 @@ ] ], "pointer_mouse_multiclick.py": [ - "87c29027b3aedc512cceb1897a3c1dcc11643b07", + "35381053413fac6baf0c6291a797ffa080372ee2", [ null, {} @@ -795243,7 +799698,7 @@ "network": { "add_intercept": { "add_intercept.py": [ - "8134d391189f0fa9c3f8f3fbb613b67fe391d17f", + "7648eb1934fa37d2eaef4ff1ed9be5a2d3859dbc", [ null, {} @@ -795257,21 +799712,21 @@ ] ], "phase_auth_required.py": [ - "84b7d2813220f6fbf7a41091148dfc04a1e5311e", + "dd322a23405e2f3d999c46fc3b0361bd67ffc012", [ null, {} ] ], "phases.py": [ - "787c5d16c4c92d9b73020200f43c6314e145709f", + "868f03041e265f87d71e39ac1c7bb9875578222b", [ null, {} ] ], "url_patterns.py": [ - "4c8e7720ae89a677b38e51bb7199987d02ff7d00", + "517a94ffc4b0172e4668c235b206381b4f26b716", [ null, {} @@ -795280,14 +799735,14 @@ }, "auth_required": { "auth_required.py": [ - "5a01937ecd036df624e14ef9f8dc8b3384c61aec", + "9a24946cde9c449039db83ef018ff03845baf874", [ null, {} ] ], "unsubscribe.py": [ - "d869fdff7a70d3eba5ff83cfcb984b83965c27db", + "cf818fee6f5af92ee69b80eee2149ef744026019", [ null, {} @@ -795296,7 +799751,7 @@ }, "before_request_sent": { "before_request_sent.py": [ - "766a27672bcb142cab6c1962c53fa6a063b9a5c3", + "c92337e5075bf0b4eb6fff85dcc550d181f6588e", [ null, {} @@ -795305,7 +799760,34 @@ }, "combined": { "network_events.py": [ - "1a71dc2cdf43407b69a5c4685e39559a8f4457e5", + "7b6d99727ae116587737abd0c02fd908a6690de9", + [ + null, + {} + ] + ] + }, + "continue_request": { + "invalid.py": [ + "cdc66cfaabb20dde4bd3e3caa0c8c8d948fe87f6", + [ + null, + {} + ] + ] + }, + "continue_response": { + "invalid.py": [ + "b8e1c08e0125fd16d405a9d07848db8a25adc47a", + [ + null, + {} + ] + ] + }, + "continue_with_auth": { + "invalid.py": [ + "ea188cbde88d1874bf3401a6507ef641144045fc", [ null, {} @@ -795314,7 +799796,16 @@ }, "fail_request": { "invalid.py": [ - "afbb44bd3253462dbb27dfb1378b9bb3145936b6", + "ead87c1a376ec403c24ca8cd6b4b04bf2a1de0fa", + [ + null, + {} + ] + ] + }, + "provide_response": { + "invalid.py": [ + "eec118a692df3a27d89236d7e2862dd2aca9f35d", [ null, {} @@ -795330,7 +799821,7 @@ ] ], "remove_intercept.py": [ - "31b11153578b39c62e3735cb270373763009125b", + "7935b94d2d1471e271cc64ec82efc83a34f131a7", [ null, { @@ -795341,21 +799832,21 @@ }, "response_completed": { "response_completed.py": [ - "513bfc31f741dd64393a97f3d065d1ad1cc3c922", + "b9b4ae727e56d5505c3221eaa7800584371f1123", [ null, {} ] ], "response_completed_cached.py": [ - "1b6f79f035607a171b8c28da8ef6fe7f960e845b", + "6457e7d412b7c94016e80bea2734b6a0aa675f8d", [ null, {} ] ], "response_completed_status.py": [ - "7d9e08657649bf9814745c8291d573fe86fc2099", + "36e3da667e92c3b5bd4d7f7c32c66b3dc658d77e", [ null, {} @@ -795364,14 +799855,14 @@ }, "response_started": { "response_started.py": [ - "4025be429b923015351215fb4acbc52730d58e70", + "dec743e175559b7068a44f043bce4951a17efcaa", [ null, {} ] ], "response_started_cached.py": [ - "64907a7d4848b020a99239ac3d3a354cc4276b82", + "2776950b0eccbe16ae74dde21906cb0dc30140d7", [ null, {} @@ -795498,7 +799989,7 @@ ] ], "remote_values.py": [ - "ae8e55d7746acbbe0a2758de5529679d14beeb7e", + "b9399662cddcd04a438bae3ce2d34ad436ab2808", [ null, {} @@ -795658,7 +800149,7 @@ ] ], "remote_values.py": [ - "d62f09e5df947b83938e59bc4549a29a4f5689d3", + "c3f29cbab5d8e40bcee1013803018099319ad57d", [ null, {} @@ -797076,7 +801567,7 @@ ] ], "pointer_dblclick.py": [ - "659e27bd5c8883db62333cb451c8e40ace6701ee", + "de83e77d36ad26b7393b5c1cebf34a55c2edb9db", [ null, {} diff --git a/tests/wpt/meta/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html.ini b/tests/wpt/meta/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html.ini new file mode 100644 index 00000000000..ed555fc3b90 --- /dev/null +++ b/tests/wpt/meta/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html.ini @@ -0,0 +1,2 @@ +[float-nowrap-hyphen-rewind-1.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-htb.html.ini new file mode 100644 index 00000000000..3519a1edcc5 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-htb-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-vlr.html.ini new file mode 100644 index 00000000000..fe7e53649b0 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-htb-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-vrl.html.ini new file mode 100644 index 00000000000..5e5d4af534e --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-htb-ltr-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-htb-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-htb.html.ini new file mode 100644 index 00000000000..17c6e9b0ba8 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-htb-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-vlr.html.ini new file mode 100644 index 00000000000..adb82f927de --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-htb-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-vrl.html.ini new file mode 100644 index 00000000000..71058584a68 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-htb-rtl-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-htb-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-htb.html.ini new file mode 100644 index 00000000000..a36399bb1f9 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-vlr.html.ini new file mode 100644 index 00000000000..1ffc961e43b --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-vrl.html.ini new file mode 100644 index 00000000000..405bea73872 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-ltr-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-htb.html.ini new file mode 100644 index 00000000000..dc1f0c8c023 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-vlr.html.ini new file mode 100644 index 00000000000..f386b38a44a --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-vrl.html.ini new file mode 100644 index 00000000000..ff173cfa08e --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vlr-rtl-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-vlr-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-htb.html.ini new file mode 100644 index 00000000000..90cbe9f9a85 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-vlr.html.ini new file mode 100644 index 00000000000..cda3646b918 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-vrl.html.ini new file mode 100644 index 00000000000..02297cef841 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-ltr-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-htb.html.ini new file mode 100644 index 00000000000..43a38301d1c --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-htb.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-vlr.html.ini new file mode 100644 index 00000000000..ce0dd7a9389 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-vlr.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-vrl.html.ini new file mode 100644 index 00000000000..b8f02656375 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-vrl-rtl-vrl.html.ini @@ -0,0 +1,48 @@ +[align-self-vrl-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-htb.html.ini new file mode 100644 index 00000000000..b31a6b0e7ba --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-vlr.html.ini new file mode 100644 index 00000000000..e9d7884e673 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-vrl.html.ini new file mode 100644 index 00000000000..b54541b8d50 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-ltr-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-htb.html.ini new file mode 100644 index 00000000000..5c58a2242e8 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-vlr.html.ini new file mode 100644 index 00000000000..01e6f92328d --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-vrl.html.ini new file mode 100644 index 00000000000..1a23f5106e0 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-htb-rtl-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-htb-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-htb.html.ini new file mode 100644 index 00000000000..4cf109344f7 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-vlr-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-vlr.html.ini new file mode 100644 index 00000000000..3ca268cc980 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-vlr-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-vrl.html.ini new file mode 100644 index 00000000000..3e4eda27ae6 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-ltr-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-vlr-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-htb.html.ini new file mode 100644 index 00000000000..b9450b935c0 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-vlr-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-vlr.html.ini new file mode 100644 index 00000000000..6d8375b3389 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-vlr-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-vrl.html.ini new file mode 100644 index 00000000000..35e5ee5dff8 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vlr-rtl-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-vlr-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-htb.html.ini new file mode 100644 index 00000000000..f101d33ca71 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-vrl-ltr-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-vlr.html.ini new file mode 100644 index 00000000000..7237d9dfe11 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-vrl-ltr-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-vrl.html.ini new file mode 100644 index 00000000000..56040ad1857 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-ltr-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-vrl-ltr-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-htb.html.ini new file mode 100644 index 00000000000..d330291751d --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-htb.html.ini @@ -0,0 +1,60 @@ +[justify-self-vrl-rtl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-vlr.html.ini new file mode 100644 index 00000000000..1271d6c04bc --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-vlr.html.ini @@ -0,0 +1,60 @@ +[justify-self-vrl-rtl-vlr.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-vrl.html.ini new file mode 100644 index 00000000000..573ff024c43 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-vrl-rtl-vrl.html.ini @@ -0,0 +1,60 @@ +[justify-self-vrl-rtl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/safe-align-self-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/safe-align-self-htb.html.ini new file mode 100644 index 00000000000..548fb403314 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/safe-align-self-htb.html.ini @@ -0,0 +1,36 @@ +[safe-align-self-htb.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL + + [.item 21] + expected: FAIL + + [.item 22] + expected: FAIL + + [.item 23] + expected: FAIL + + [.item 24] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/safe-align-self-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/safe-align-self-vlr.html.ini new file mode 100644 index 00000000000..0b2d83b4668 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/safe-align-self-vlr.html.ini @@ -0,0 +1,36 @@ +[safe-align-self-vlr.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 19] + expected: FAIL + + [.item 20] + expected: FAIL + + [.item 21] + expected: FAIL + + [.item 22] + expected: FAIL + + [.item 23] + expected: FAIL + + [.item 24] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/safe-align-self-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/safe-align-self-vrl.html.ini new file mode 100644 index 00000000000..da103ce6245 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/safe-align-self-vrl.html.ini @@ -0,0 +1,36 @@ +[safe-align-self-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/safe-justify-self-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/safe-justify-self-htb.html.ini new file mode 100644 index 00000000000..45b3cfd5335 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/safe-justify-self-htb.html.ini @@ -0,0 +1,36 @@ +[safe-justify-self-htb.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/safe-justify-self-vlr.html.ini b/tests/wpt/meta/css/css-align/abspos/safe-justify-self-vlr.html.ini new file mode 100644 index 00000000000..51d411cb81d --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/safe-justify-self-vlr.html.ini @@ -0,0 +1,36 @@ +[safe-justify-self-vlr.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/safe-justify-self-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/safe-justify-self-vrl.html.ini new file mode 100644 index 00000000000..5169b3af936 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/safe-justify-self-vrl.html.ini @@ -0,0 +1,36 @@ +[safe-justify-self-vrl.html] + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 9] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL + + [.item 13] + expected: FAIL + + [.item 14] + expected: FAIL + + [.item 15] + expected: FAIL + + [.item 16] + expected: FAIL + + [.item 17] + expected: FAIL + + [.item 18] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html.ini new file mode 100644 index 00000000000..06988033f18 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html.ini @@ -0,0 +1,33 @@ +[stretch-intrinsic-size-htb-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html.ini new file mode 100644 index 00000000000..2d3d13de31e --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html.ini @@ -0,0 +1,33 @@ +[stretch-intrinsic-size-htb-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html.ini b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html.ini new file mode 100644 index 00000000000..466e901fab8 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html.ini @@ -0,0 +1,33 @@ +[stretch-intrinsic-size-vrl-htb.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html.ini b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html.ini new file mode 100644 index 00000000000..87acce9e31e --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html.ini @@ -0,0 +1,33 @@ +[stretch-intrinsic-size-vrl-vrl.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL + + [.item 10] + expected: FAIL + + [.item 11] + expected: FAIL + + [.item 12] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/table-align-self-stretch.html.ini b/tests/wpt/meta/css/css-align/abspos/table-align-self-stretch.html.ini new file mode 100644 index 00000000000..c219de5a218 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/table-align-self-stretch.html.ini @@ -0,0 +1,24 @@ +[table-align-self-stretch.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/table-justify-self-stretch.html.ini b/tests/wpt/meta/css/css-align/abspos/table-justify-self-stretch.html.ini new file mode 100644 index 00000000000..00bbd9efe78 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/table-justify-self-stretch.html.ini @@ -0,0 +1,24 @@ +[table-justify-self-stretch.html] + [.item 1] + expected: FAIL + + [.item 2] + expected: FAIL + + [.item 3] + expected: FAIL + + [.item 4] + expected: FAIL + + [.item 5] + expected: FAIL + + [.item 6] + expected: FAIL + + [.item 7] + expected: FAIL + + [.item 8] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/blocks/align-content-block-display-coverage.html.ini b/tests/wpt/meta/css/css-align/blocks/align-content-block-display-coverage.html.ini new file mode 100644 index 00000000000..fc6a5eb0f9e --- /dev/null +++ b/tests/wpt/meta/css/css-align/blocks/align-content-block-display-coverage.html.ini @@ -0,0 +1,21 @@ +[align-content-block-display-coverage.html] + [display:block should support align-content] + expected: FAIL + + [display:flow should support align-content] + expected: FAIL + + [display:flow-root should support align-content] + expected: FAIL + + [display:inline-block should support align-content] + expected: FAIL + + [display:list-item should support align-content] + expected: FAIL + + [display:flow-root list-item should support align-content] + expected: FAIL + + [display:table-caption should support align-content] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/multicol/align-content-multicol.html.ini b/tests/wpt/meta/css/css-align/multicol/align-content-multicol.html.ini new file mode 100644 index 00000000000..ef2c8b6c1c7 --- /dev/null +++ b/tests/wpt/meta/css/css-align/multicol/align-content-multicol.html.ini @@ -0,0 +1,96 @@ +[align-content-multicol.html] + [align-content: normal] + expected: FAIL + + [align-content: normal; contain: size] + expected: FAIL + + [align-content: start] + expected: FAIL + + [align-content: start; contain: size] + expected: FAIL + + [align-content: unsafe start] + expected: FAIL + + [align-content: unsafe start; contain: size] + expected: FAIL + + [align-content: safe start] + expected: FAIL + + [align-content: safe start; contain: size] + expected: FAIL + + [align-content: flex-start] + expected: FAIL + + [align-content: flex-start; contain: size] + expected: FAIL + + [align-content: space-between] + expected: FAIL + + [align-content: space-between; contain: size] + expected: FAIL + + [align-content: stretch] + expected: FAIL + + [align-content: stretch; contain: size] + expected: FAIL + + [align-content: center] + expected: FAIL + + [align-content: center; contain: size] + expected: FAIL + + [align-content: unsafe center] + expected: FAIL + + [align-content: unsafe center; contain: size] + expected: FAIL + + [align-content: safe center] + expected: FAIL + + [align-content: safe center; contain: size] + expected: FAIL + + [align-content: space-around] + expected: FAIL + + [align-content: space-around; contain: size] + expected: FAIL + + [align-content: space-evenly] + expected: FAIL + + [align-content: space-evenly; contain: size] + expected: FAIL + + [align-content: end] + expected: FAIL + + [align-content: end; contain: size] + expected: FAIL + + [align-content: unsafe end] + expected: FAIL + + [align-content: unsafe end; contain: size] + expected: FAIL + + [align-content: safe end] + expected: FAIL + + [align-content: safe end; contain: size] + expected: FAIL + + [align-content: flex-end] + expected: FAIL + + [align-content: flex-end; contain: size] + expected: FAIL diff --git a/tests/wpt/meta/css/css-animations/animate-with-color-mix.html.ini b/tests/wpt/meta/css/css-animations/animate-with-color-mix.html.ini deleted file mode 100644 index 4172b4ec02b..00000000000 --- a/tests/wpt/meta/css/css-animations/animate-with-color-mix.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[animate-with-color-mix.html] - [Animate from neutral keyframe with color-mix to legacy rgb] - expected: FAIL - - [Animate from legacy rgb to neutral keyframe with color-mix] - expected: FAIL - - [Animate from neutral keyframe with color-mix to srgb] - expected: FAIL - - [Animate from srgb to neutral keyframe with color-mix] - expected: FAIL - - [Animate from color-mix with transparency to legacy rgba] - expected: FAIL - - [Animate from legacy rgba to color-mix with transparency] - expected: FAIL diff --git a/tests/wpt/meta/css/css-animations/animation-css-variable-dependent-property.html.ini b/tests/wpt/meta/css/css-animations/animation-css-variable-dependent-property.html.ini new file mode 100644 index 00000000000..f506d3af042 --- /dev/null +++ b/tests/wpt/meta/css/css-animations/animation-css-variable-dependent-property.html.ini @@ -0,0 +1,3 @@ +[animation-css-variable-dependent-property.html] + [Dependent property updates correctly] + expected: FAIL diff --git a/tests/wpt/meta/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html.ini b/tests/wpt/meta/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html.ini new file mode 100644 index 00000000000..ac507684c8e --- /dev/null +++ b/tests/wpt/meta/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html.ini @@ -0,0 +1,3 @@ +[animation-restarted-after-changing-iteration-count-after-completion.html] + [Setting 'animation-iteration-count: infinite' after a CSS Animation is completed restarts the animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/background-origin/origin-border-box_with_position.html.ini b/tests/wpt/meta/css/css-backgrounds/background-origin/origin-border-box_with_position.html.ini deleted file mode 100644 index 69809075f65..00000000000 --- a/tests/wpt/meta/css/css-backgrounds/background-origin/origin-border-box_with_position.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[origin-border-box_with_position.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/background-origin/origin-content-box_with_position.html.ini b/tests/wpt/meta/css/css-backgrounds/background-origin/origin-content-box_with_position.html.ini deleted file mode 100644 index f656f7f785b..00000000000 --- a/tests/wpt/meta/css/css-backgrounds/background-origin/origin-content-box_with_position.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[origin-content-box_with_position.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/background-origin/origin-padding-box_with_position.html.ini b/tests/wpt/meta/css/css-backgrounds/background-origin/origin-padding-box_with_position.html.ini deleted file mode 100644 index a45e4caaf32..00000000000 --- a/tests/wpt/meta/css/css-backgrounds/background-origin/origin-padding-box_with_position.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[origin-padding-box_with_position.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/parsing/background-image-valid.html.ini b/tests/wpt/meta/css/css-backgrounds/parsing/background-image-valid.html.ini index e3db293e1b9..f8414c28ca7 100644 --- a/tests/wpt/meta/css/css-backgrounds/parsing/background-image-valid.html.ini +++ b/tests/wpt/meta/css/css-backgrounds/parsing/background-image-valid.html.ini @@ -8,3 +8,14 @@ [e.style['background-image'\] = "cross-fade(50% url(http://www.example.com), 50% url(http://www.example.com))" should set the property value] expected: FAIL + [e.style['background-image'\] = "cross-fade( 1% red, green)" should set the property value] + expected: FAIL + + [e.style['background-image'\] = "cross-fade(1% red , green)" should set the property value] + expected: FAIL + + [e.style['background-image'\] = "cross-fade(1% red, green )" should set the property value] + expected: FAIL + + [e.style['background-image'\] = "cross-fade(1% red, cross-fade(2% red, green))" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/table-cell-background-local-002.html.ini b/tests/wpt/meta/css/css-backgrounds/table-cell-background-local-002.html.ini new file mode 100644 index 00000000000..9d3ab932e4b --- /dev/null +++ b/tests/wpt/meta/css/css-backgrounds/table-cell-background-local-002.html.ini @@ -0,0 +1,2 @@ +[table-cell-background-local-002.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/table-cell-background-local-003.html.ini b/tests/wpt/meta/css/css-backgrounds/table-cell-background-local-003.html.ini new file mode 100644 index 00000000000..a34e44278f1 --- /dev/null +++ b/tests/wpt/meta/css/css-backgrounds/table-cell-background-local-003.html.ini @@ -0,0 +1,2 @@ +[table-cell-background-local-003.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-conditional/at-supports-048.html.ini b/tests/wpt/meta/css/css-conditional/at-supports-048.html.ini new file mode 100644 index 00000000000..f23f24659a2 --- /dev/null +++ b/tests/wpt/meta/css/css-conditional/at-supports-048.html.ini @@ -0,0 +1,2 @@ +[at-supports-048.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html.ini b/tests/wpt/meta/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html.ini new file mode 100644 index 00000000000..c6b12cfcf5d --- /dev/null +++ b/tests/wpt/meta/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html.ini @@ -0,0 +1,2 @@ +[nested-flex-image-loading-invalidates-intrinsic-sizes.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini b/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini index bd0ee84320b..a14bb143495 100644 --- a/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini +++ b/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini @@ -29,9 +29,6 @@ [Matching font-weight: '399' should prefer '450 460' over '500 501'] expected: FAIL - [Matching font-stretch: '110%' should prefer '115% 116%' over '105%'] - expected: FAIL - [Matching font-style: 'normal' should prefer 'oblique 0deg' over 'oblique 10deg 40deg'] expected: FAIL @@ -65,9 +62,6 @@ [Matching font-style: 'oblique 20deg' should prefer 'oblique 40deg 50deg' over 'oblique 10deg'] expected: FAIL - [Matching font-weight: '399' should prefer '400' over '450 460'] - expected: FAIL - [Matching font-weight: '399' should prefer '500 501' over '502 510'] expected: FAIL @@ -116,9 +110,6 @@ [Matching font-style: 'italic' should prefer 'oblique 5deg' over 'normal'] expected: FAIL - [Matching font-style: 'oblique -21deg' should prefer 'oblique -21deg' over 'oblique -60deg -40deg'] - expected: FAIL - [Matching font-weight: '500' should prefer '350 399' over '351 398'] expected: FAIL @@ -134,9 +125,6 @@ [Matching font-weight: '400' should prefer '501 550' over '502 560'] expected: FAIL - [Matching font-weight: '501' should prefer '501' over '502 510'] - expected: FAIL - [Matching font-style: 'normal' should prefer 'normal' over 'oblique 0deg'] expected: FAIL @@ -179,9 +167,6 @@ [Matching font-weight: '501' should prefer '502 510' over '503 520'] expected: FAIL - [Matching font-weight: '501' should prefer '500' over '450 460'] - expected: FAIL - [Matching font-stretch: '90%' should prefer '110% 140%' over '120% 130%'] expected: FAIL @@ -212,24 +197,15 @@ [Matching font-weight: '430' should prefer '350 399' over '340 398'] expected: FAIL - [Matching font-weight: '501' should prefer '503 520' over '500'] - expected: FAIL - [Matching font-weight: '501' should prefer '450 460' over '390 410'] expected: FAIL - [Matching font-stretch: '100%' should prefer '100%' over '110% 120%'] - expected: FAIL - [Matching font-stretch: '110%' should prefer '110% 120%' over '115% 116%'] expected: FAIL [Matching font-style: 'normal' should prefer 'oblique 20deg 30deg' over 'oblique -50deg -20deg'] expected: FAIL - [Matching font-style: 'italic' should prefer 'italic' over 'oblique 20deg'] - expected: FAIL - [Matching font-style: 'oblique 20deg' should prefer 'oblique 10deg' over 'italic'] expected: FAIL @@ -239,9 +215,6 @@ [Matching font-style: 'oblique 21deg' should prefer 'italic' over 'oblique 0deg'] expected: FAIL - [Matching font-style: 'oblique 10deg' should prefer 'oblique 0deg' over 'oblique -50deg -20deg'] - expected: FAIL - [Matching font-weight: '400' should prefer '500' over '350 399'] expected: FAIL @@ -283,3 +256,33 @@ [Matching font-style: 'oblique -21deg' should prefer 'italic' over 'oblique 0deg'] expected: FAIL + + [Matching font-stretch: '100%' should prefer '110% 120%' over '115% 116%'] + expected: FAIL + + [Matching font-stretch: '90%' should prefer '60% 70%' over '110% 140%'] + expected: FAIL + + [Matching font-style: 'italic' should prefer 'normal' over 'oblique 0deg'] + expected: FAIL + + [Matching font-style: 'oblique 20deg' should prefer 'oblique 20deg' over 'oblique 30deg 60deg'] + expected: FAIL + + [Matching font-style: 'oblique 21deg' should prefer 'oblique 10deg' over 'italic'] + expected: FAIL + + [Matching font-style: 'oblique 10deg' should prefer 'oblique 15deg 20deg' over 'oblique 30deg 60deg'] + expected: FAIL + + [Matching font-style: 'oblique 0deg' should prefer 'oblique 0deg' over 'oblique 5deg'] + expected: FAIL + + [Matching font-style: 'oblique 0deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg'] + expected: FAIL + + [Matching font-style: 'oblique -10deg' should prefer 'oblique -60deg -30deg' over 'oblique -50deg -40deg'] + expected: FAIL + + [Matching font-style: 'oblique -10deg' should prefer 'oblique 0deg 10deg' over 'oblique 40deg 50deg'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/cross-fade-basic.html.ini b/tests/wpt/meta/css/css-images/cross-fade-basic.html.ini new file mode 100644 index 00000000000..89c1d1f0860 --- /dev/null +++ b/tests/wpt/meta/css/css-images/cross-fade-basic.html.ini @@ -0,0 +1,2 @@ +[cross-fade-basic.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/cross-fade-computed-value.html.ini b/tests/wpt/meta/css/css-images/cross-fade-computed-value.html.ini new file mode 100644 index 00000000000..f3812b46de2 --- /dev/null +++ b/tests/wpt/meta/css/css-images/cross-fade-computed-value.html.ini @@ -0,0 +1,18 @@ +[cross-fade-computed-value.html] + [Property background-image value 'cross-fade(30% color-mix(in srgb, currentcolor, blue), white)'] + expected: FAIL + + [Property background-image value 'cross-fade(50% red, 50% green)'] + expected: FAIL + + [Property background-image value 'cross-fade(20% red, 20% green)'] + expected: FAIL + + [Property background-image value 'cross-fade(50% red, 50% green, 50% blue)'] + expected: FAIL + + [Property background-image value 'cross-fade(calc(101%) red, green)'] + expected: FAIL + + [Property background-image value 'cross-fade(calc(-200%) red, green)'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/cross-fade-premultiplied-alpha.html.ini b/tests/wpt/meta/css/css-images/cross-fade-premultiplied-alpha.html.ini new file mode 100644 index 00000000000..fd0f03b4df0 --- /dev/null +++ b/tests/wpt/meta/css/css-images/cross-fade-premultiplied-alpha.html.ini @@ -0,0 +1,2 @@ +[cross-fade-premultiplied-alpha.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/cross-fade-target-alpha.html.ini b/tests/wpt/meta/css/css-images/cross-fade-target-alpha.html.ini new file mode 100644 index 00000000000..a9acc56ae3b --- /dev/null +++ b/tests/wpt/meta/css/css-images/cross-fade-target-alpha.html.ini @@ -0,0 +1,2 @@ +[cross-fade-target-alpha.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html.ini b/tests/wpt/meta/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html.ini new file mode 100644 index 00000000000..d6eca7d32f0 --- /dev/null +++ b/tests/wpt/meta/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html.ini @@ -0,0 +1,2 @@ +[transform-percent-with-width-and-height-separate.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-transforms/animation/transform-percent-with-width-and-height.html.ini b/tests/wpt/meta/css/css-transforms/animation/transform-percent-with-width-and-height.html.ini new file mode 100644 index 00000000000..571667c84a6 --- /dev/null +++ b/tests/wpt/meta/css/css-transforms/animation/transform-percent-with-width-and-height.html.ini @@ -0,0 +1,2 @@ +[transform-percent-with-width-and-height.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html.ini b/tests/wpt/meta/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html.ini new file mode 100644 index 00000000000..9c378f24ef8 --- /dev/null +++ b/tests/wpt/meta/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html.ini @@ -0,0 +1,2 @@ +[translate-percent-with-width-and-height-separate.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-transforms/animation/translate-percent-with-width-and-height.html.ini b/tests/wpt/meta/css/css-transforms/animation/translate-percent-with-width-and-height.html.ini new file mode 100644 index 00000000000..a3472b82a28 --- /dev/null +++ b/tests/wpt/meta/css/css-transforms/animation/translate-percent-with-width-and-height.html.ini @@ -0,0 +1,2 @@ +[translate-percent-with-width-and-height.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-transitions/animations/animate-with-color-mix.html.ini b/tests/wpt/meta/css/css-transitions/animations/animate-with-color-mix.html.ini deleted file mode 100644 index b195b0e5f61..00000000000 --- a/tests/wpt/meta/css/css-transitions/animations/animate-with-color-mix.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[animate-with-color-mix.html] - [Transition from color-mix to legacy rgb] - expected: FAIL - - [Transition from legacy rgb to color-mix] - expected: FAIL - - [Transition from color-mix to srgb] - expected: FAIL - - [Transition from srgb to color-mix] - expected: FAIL - - [Transition from color-mix with transparency to legacy rgba] - expected: FAIL - - [Transition from legacy rgba to color-mix with transparency] - expected: FAIL diff --git a/tests/wpt/meta/css/css-values/integer_interpolation_round_half_towards_positive_infinity_order.html.ini b/tests/wpt/meta/css/css-values/integer_interpolation_round_half_001.html.ini index 3b874030901..4dce4c4b9db 100644 --- a/tests/wpt/meta/css/css-values/integer_interpolation_round_half_towards_positive_infinity_order.html.ini +++ b/tests/wpt/meta/css/css-values/integer_interpolation_round_half_001.html.ini @@ -1,3 +1,3 @@ -[integer_interpolation_round_half_towards_positive_infinity_order.html] +[integer_interpolation_round_half_001.html] [Integer interpolation should be rounded towards positive infinity] expected: FAIL diff --git a/tests/wpt/meta/css/css-values/minmax-length-percent-serialize.html.ini b/tests/wpt/meta/css/css-values/minmax-length-percent-serialize.html.ini index 2028f309e92..8d2e9fb028a 100644 --- a/tests/wpt/meta/css/css-values/minmax-length-percent-serialize.html.ini +++ b/tests/wpt/meta/css/css-values/minmax-length-percent-serialize.html.ini @@ -4,3 +4,9 @@ ['max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)' as a computed value should serialize as 'max(10px + (10px + min(10%, 30px)) * 2, 5% + 80px)'.] expected: FAIL + + ['max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)' as a specified value should serialize as 'max(10px + ((10px + min(10%, 30px)) * 2), 5% + 5em)'.] + expected: FAIL + + ['max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)' as a computed value should serialize as 'max(10px + ((10px + min(10%, 30px)) * 2), 5% + 80px)'.] + expected: FAIL diff --git a/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini b/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini index 740691a9d0e..441914bc0c4 100644 --- a/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini +++ b/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini @@ -25,3 +25,30 @@ [calc(progress(1 from 0 to 1) * 1deg) should be used-value-equivalent to 1deg] expected: FAIL + + [progress(1000em from 10em to 110em) should be used-value-equivalent to 10] + expected: FAIL + + [scale(progress(1000em from 10rem to 110em)) should be used-value-equivalent to scale(10)] + expected: FAIL + + [scale(progress(0em from 0rem to 0em)) should be used-value-equivalent to scale(0)] + expected: FAIL + + [scale(progress(sign(1em - 1rem) * 1ex from 0rem to 0em)) should be used-value-equivalent to scale(0)] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 10em from 2rem to 12em) / 2) should be used-value-equivalent to 0.5] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 10) should be used-value-equivalent to 20] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 30) should be used-value-equivalent to 60] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) / 4) should be used-value-equivalent to 0.5] + expected: FAIL + + [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 4) should be used-value-equivalent to 8] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/MediaQueryList-addListener-handleEvent.html.ini b/tests/wpt/meta/css/cssom-view/MediaQueryList-addListener-handleEvent.html.ini index 9d001af55b9..037d7e0f951 100644 --- a/tests/wpt/meta/css/cssom-view/MediaQueryList-addListener-handleEvent.html.ini +++ b/tests/wpt/meta/css/cssom-view/MediaQueryList-addListener-handleEvent.html.ini @@ -4,6 +4,3 @@ [throws if handleEvent is thruthy and not callable] expected: FAIL - - [doesn't look up handleEvent method on callable event listeners] - expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini b/tests/wpt/meta/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini index 20c52b50c2a..f82461dd8e5 100644 --- a/tests/wpt/meta/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini +++ b/tests/wpt/meta/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini @@ -1,8 +1,5 @@ [MediaQueryList-extends-EventTarget.html] expected: TIMEOUT - [onchange removes listener] - expected: FAIL - [addEventListener "once" option is respected] expected: TIMEOUT diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-default-css.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-default-css.html.ini index 04435068708..0419495e62d 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-default-css.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-default-css.html.ini @@ -1,3 +1,6 @@ [scroll-behavior-default-css.html] [Smooth scrolling of an element with default scroll-behavior] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-element.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-element.html.ini index 40d0bdf5ee9..9fb41afca94 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-element.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-element.html.ini @@ -64,3 +64,6 @@ [Set scrollTop to element with smooth scroll-behavior] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini index 782ade6c1b0..cee83d041ad 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini @@ -112,3 +112,6 @@ [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-window.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-window.html.ini index d6929eec58d..3a6f134e005 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-window.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-main-frame-window.html.ini @@ -76,3 +76,6 @@ [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini index 0150811ae72..847d6fa45f5 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-scrollintoview-nested.html.ini @@ -2,3 +2,5 @@ [scrollIntoView with nested elements with different scroll-behavior] expected: FAIL + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini index 977ef8f774c..f4121525268 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini @@ -1,3 +1,6 @@ [scroll-behavior-smooth-navigation.html] [Instant scrolling while doing history navigation.] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-positions.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-positions.html.ini index 323e82d9f93..cb5aff6738d 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-positions.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-positions.html.ini @@ -10,3 +10,6 @@ [Scroll positions when performing smooth scrolling from (1000, 0) to (500, 250) using scrollIntoView() ] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth.html.ini index 5e7ef730970..02c82fe1523 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth.html.ini @@ -1,3 +1,6 @@ [scroll-behavior-smooth.html] [scroll-behavior: smooth on DIV element] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-root.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-root.html.ini index 86d0de5045f..16fec73ff53 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-root.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-root.html.ini @@ -112,3 +112,6 @@ [Aborting an ongoing smooth scrolling on a subframe with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-window.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-window.html.ini index ffadf832a1a..3ad50289fd8 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-window.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-subframe-window.html.ini @@ -76,3 +76,6 @@ [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] expected: FAIL + + [Make sure the page is ready for animation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html.ini new file mode 100644 index 00000000000..e32aeffe2e1 --- /dev/null +++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html.ini @@ -0,0 +1,3 @@ +[scrollIntoView-align-scrollport-covering-child.html] + [scrollIntoView scrolls scrollport-covering child in both axes] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html.ini b/tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html.ini new file mode 100644 index 00000000000..1790944d309 --- /dev/null +++ b/tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html.ini @@ -0,0 +1,6 @@ +[CSSStyleSheet-constructable-replace-cssRules.html] + [cssRules tests (sync: true)] + expected: FAIL + + [cssRules tests (sync: false)] + expected: FAIL diff --git a/tests/wpt/meta/css/selectors/any-link-dynamic-001.html.ini b/tests/wpt/meta/css/selectors/any-link-dynamic-001.html.ini deleted file mode 100644 index 586972d310f..00000000000 --- a/tests/wpt/meta/css/selectors/any-link-dynamic-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[any-link-dynamic-001.html] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/invalidation/any-link-attribute-removal.html.ini b/tests/wpt/meta/css/selectors/invalidation/any-link-attribute-removal.html.ini new file mode 100644 index 00000000000..8fc796a9fb8 --- /dev/null +++ b/tests/wpt/meta/css/selectors/invalidation/any-link-attribute-removal.html.ini @@ -0,0 +1,2 @@ +[any-link-attribute-removal.html] + expected: FAIL diff --git a/tests/wpt/meta/css/selectors/invalidation/has-sibling-insertion-removal.html.ini b/tests/wpt/meta/css/selectors/invalidation/has-sibling-insertion-removal.html.ini index 76513c88a16..78fdcc66a68 100644 --- a/tests/wpt/meta/css/selectors/invalidation/has-sibling-insertion-removal.html.ini +++ b/tests/wpt/meta/css/selectors/invalidation/has-sibling-insertion-removal.html.ini @@ -34,3 +34,6 @@ [subject12: color after #sibling12_1 removed should be rgb(255, 255, 0)] expected: FAIL + + [subject13: color after #sibling12_1 removed should be rgb(0, 128, 0)] + expected: FAIL diff --git a/tests/wpt/meta/css/selectors/is-where-parsing.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini index 83f85b33d30..55f8b960e45 100644 --- a/tests/wpt/meta/css/selectors/is-where-parsing.html.ini +++ b/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini @@ -1,46 +1,4 @@ -[is-where-parsing.html] - [Nested :is] - expected: FAIL - - [Pseudo-elements after] - expected: FAIL - - [Nested :where] - expected: FAIL - - [Pseudo-classes after] - expected: FAIL - - [Multiple selectors with combinators] - expected: FAIL - - [Combinators after] - expected: FAIL - - [Nested inside :host, without combinators] - expected: FAIL - - [Pseudo-classes inside] - expected: FAIL - - [After part with simple pseudo-class] - expected: FAIL - - [Nested inside :not, without combinators] - expected: FAIL - - [Nested inside :not, with combinators] - expected: FAIL - - [Trailing whitespace] - expected: FAIL - - [Nested inside :host, with trailing whitespace] - expected: FAIL - - [Pseudo-elements inside] - expected: FAIL - +[parse-is-where.html] [":is(div )" should be a valid selector] expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini new file mode 100644 index 00000000000..43cb05fcda9 --- /dev/null +++ b/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini @@ -0,0 +1,54 @@ +[parse-part.html] + ["::part(--foo)" should be a valid selector] + expected: FAIL + + ["::part(bar)" should be a valid selector] + expected: FAIL + + ["::part(--)" should be a valid selector] + expected: FAIL + + ["::part(--0)" should be a valid selector] + expected: FAIL + + ["::part(foo bar)" should be a valid selector] + expected: FAIL + + ["::part(-foo bar)" should be a valid selector] + expected: FAIL + + ["::part(foo):focus" should be a valid selector] + expected: FAIL + + ["::part(foo):hover" should be a valid selector] + expected: FAIL + + ["::part(foo):focus-within" should be a valid selector] + expected: FAIL + + ["::part(foo)::before" should be a valid selector] + expected: FAIL + + ["::part(foo)::after" should be a valid selector] + expected: FAIL + + ["::part(foo)::placeholder" should be a valid selector] + expected: FAIL + + ["::part(foo)::first-line" should be a valid selector] + expected: FAIL + + ["::part(foo)::first-letter" should be a valid selector] + expected: FAIL + + ["::part(foo)::file-selector-button" should be a valid selector] + expected: FAIL + + ["::part(foo):is(:focus)" should be a valid selector] + expected: FAIL + + [":lang(en)::part(foo)" should be a valid selector] + expected: FAIL + + [":dir(ltr)::part(foo)" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-slotted.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-slotted.html.ini new file mode 100644 index 00000000000..62fae425194 --- /dev/null +++ b/tests/wpt/meta/css/selectors/parsing/parse-slotted.html.ini @@ -0,0 +1,24 @@ +[parse-slotted.html] + ["::slotted(bar)" should be a valid selector] + expected: FAIL + + ["::slotted([attr=\\"foo\\"\])" should be a valid selector] + expected: FAIL + + ["::slotted(*)" should be a valid selector] + expected: FAIL + + ["::slotted(.class)" should be a valid selector] + expected: FAIL + + ["::slotted(:not(foo))" should be a valid selector] + expected: FAIL + + ["::slotted(:not(:nth-last-of-type(2)):not([slot=\\"foo\\"\]))" should be a valid selector] + expected: FAIL + + ["::slotted(:first-child)" should be a valid selector] + expected: FAIL + + ["::slotted(:hover)" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-state.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-state.html.ini index 3460fad94a9..d4069801d24 100644 --- a/tests/wpt/meta/css/selectors/parsing/parse-state.html.ini +++ b/tests/wpt/meta/css/selectors/parsing/parse-state.html.ini @@ -19,3 +19,15 @@ ["my-input[type=\\"foo\\"\]:state(--0)::before" should be a valid selector] expected: FAIL + + ["my-input[type=\\"foo\\"\]:state(--0)::part(inner)" should be a valid selector] + expected: FAIL + + ["my-input[type=\\"foo\\"\]:state(--0)::part(inner):state(bar)" should be a valid selector] + expected: FAIL + + ["::part(inner):state(bar)::before" should be a valid selector] + expected: FAIL + + ["::part(inner):state(bar)::after" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini b/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini index bfffdfb40db..6f86ee42541 100644 --- a/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini +++ b/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini @@ -89,6 +89,9 @@ [Teardowns should be called synchronously during addTeardown() if the subscription is inactive] expected: FAIL + [Subscribe with just a function as the next handler] + expected: FAIL + [observable-constructor.any.html] [Observable constructor] @@ -180,3 +183,6 @@ [Teardowns should be called synchronously during addTeardown() if the subscription is inactive] expected: FAIL + + [Subscribe with just a function as the next handler] + expected: FAIL diff --git a/tests/wpt/meta/dom/observable/tentative/observable-constructor.window.js.ini b/tests/wpt/meta/dom/observable/tentative/observable-constructor.window.js.ini index 394e39cd818..182e784b969 100644 --- a/tests/wpt/meta/dom/observable/tentative/observable-constructor.window.js.ini +++ b/tests/wpt/meta/dom/observable/tentative/observable-constructor.window.js.ini @@ -7,3 +7,6 @@ [Cannot subscribe to an Observable in a detached document] expected: FAIL + + [Observable from EventTarget does not get notified for events in detached documents] + expected: FAIL diff --git a/tests/wpt/meta/dom/observable/tentative/observable-event-target.any.js.ini b/tests/wpt/meta/dom/observable/tentative/observable-event-target.any.js.ini new file mode 100644 index 00000000000..94327ea5e4c --- /dev/null +++ b/tests/wpt/meta/dom/observable/tentative/observable-event-target.any.js.ini @@ -0,0 +1,20 @@ +[observable-event-target.any.worker.html] + [EventTarget.on() returns an Observable] + expected: FAIL + + [Aborting the subscription should stop the emission of events] + expected: FAIL + + [EventTarget Observables can multicast subscriptions for event handling] + expected: FAIL + + +[observable-event-target.any.html] + [EventTarget.on() returns an Observable] + expected: FAIL + + [Aborting the subscription should stop the emission of events] + expected: FAIL + + [EventTarget Observables can multicast subscriptions for event handling] + expected: FAIL diff --git a/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini index 4b5c3e26586..7b4cf2c5ae7 100644 --- a/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini +++ b/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini @@ -185,3 +185,6 @@ [border-image sec-fetch-site - HTTPS downgrade (header not sent)] expected: FAIL + + [background-image sec-fetch-site - HTTPS downgrade (header not sent)] + expected: TIMEOUT diff --git a/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.https.sub.html.ini b/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.https.sub.html.ini index 3d6068202c8..3ef7ed80f2a 100644 --- a/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.https.sub.html.ini +++ b/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.https.sub.html.ini @@ -4,13 +4,13 @@ expected: FAIL [sec-fetch-site - Cross-site, no attributes] - expected: TIMEOUT + expected: FAIL [sec-fetch-site - Same site, no attributes] - expected: NOTRUN + expected: FAIL [sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect, no attributes] - expected: NOTRUN + expected: TIMEOUT [sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect, no attributes] expected: NOTRUN diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini index 3e07e6b7d1f..3e07e6b7d1f 100644 --- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini new file mode 100644 index 00000000000..7dc346632a4 --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini @@ -0,0 +1,3 @@ +[navigation-unload-same-origin.window.html] + [Same-origin navigation started from unload handler must be ignored] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini deleted file mode 100644 index d993e8dcc42..00000000000 --- a/tests/wpt/meta/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pageload-image-in-popup.html] - [The document for a standalone media file should have one child in the body.] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini b/tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini new file mode 100644 index 00000000000..4b4820d1729 --- /dev/null +++ b/tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini @@ -0,0 +1,3 @@ +[creating_browsing_context_test_01.html] + [first argument: absolute url] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html.ini new file mode 100644 index 00000000000..a16f0fccdf1 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html.ini new file mode 100644 index 00000000000..2e2112c793f --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html.ini new file mode 100644 index 00000000000..0fd3c9ee532 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html.ini new file mode 100644 index 00000000000..b45e9850e78 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html.ini new file mode 100644 index 00000000000..e99615d8e03 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html.ini new file mode 100644 index 00000000000..3a6d2b315fe --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.isotropic.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html.ini new file mode 100644 index 00000000000..01c1322f5fd --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.mostly-x.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html.ini new file mode 100644 index 00000000000..3333d8908fd --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.mostly-y.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html.ini new file mode 100644 index 00000000000..b13d321b725 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.x-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html.ini new file mode 100644 index 00000000000..3bbc75904e1 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.anisotropic-blur.y-only.w.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.css-filters.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.css-filters.w.html.ini deleted file mode 100644 index 0e942652abd..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.css-filters.w.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[2d.layer.css-filters.w.html] - expected: TIMEOUT diff --git a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js.ini deleted file mode 100644 index 1aef60f3976..00000000000 --- a/tests/wpt/meta/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.layer.opaque-canvas.worker.html] - [Checks that layer blending works inside opaque canvas] - expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/document-render-blocking-partial.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/document-render-blocking-partial.tentative.html.ini deleted file mode 100644 index 33079ddf70d..00000000000 --- a/tests/wpt/meta/html/dom/render-blocking/document-render-blocking-partial.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[document-render-blocking-partial.tentative.html] - expected: ERROR diff --git a/tests/wpt/meta/html/dom/render-blocking/document-render-blocking.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/document-render-blocking.tentative.html.ini deleted file mode 100644 index bf425d34f4c..00000000000 --- a/tests/wpt/meta/html/dom/render-blocking/document-render-blocking.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[document-render-blocking.tentative.html] - expected: ERROR diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini new file mode 100644 index 00000000000..511925c1b61 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-002.tentative.html] + [blocking defers until needed element is parsed] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-004.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-004.tentative.html.ini new file mode 100644 index 00000000000..b3fd8fa38aa --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-004.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-004.tentative.html] + [removing link in the head makes it no longer blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-005.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-005.tentative.html.ini new file mode 100644 index 00000000000..42f9c7342db --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-005.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-005.tentative.html] + [removing 'blocking' makes it no longer blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-007.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-007.tentative.html.ini new file mode 100644 index 00000000000..6c63b2db412 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-007.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-007.tentative.html] + [link with non-matching media has no effect] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-009.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-009.tentative.html.ini new file mode 100644 index 00000000000..3c105de1140 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-009.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-009.tentative.html] + [changing media to non-matching makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-010.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-010.tentative.html.ini new file mode 100644 index 00000000000..ef4e023dfa6 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-010.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-010.tentative.html] + [changing rel to non-expect makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-013.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-013.tentative.html.ini new file mode 100644 index 00000000000..9ce1660b44c --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-013.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-013.tentative.html] + [removing href makes it no longer blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-014.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-014.tentative.html.ini new file mode 100644 index 00000000000..d338af1ff52 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-014.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-014.tentative.html] + [link in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-015.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-015.tentative.html.ini new file mode 100644 index 00000000000..0dd5e871106 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-015.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-015.tentative.html] + [removing link the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-016.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-016.tentative.html.ini new file mode 100644 index 00000000000..7718cf5bef3 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-016.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-016.tentative.html] + [removing 'blocking' in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-017.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-017.tentative.html.ini new file mode 100644 index 00000000000..3c50d660460 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-017.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-017.tentative.html] + [adding 'blocking=render' in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-018.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-018.tentative.html.ini new file mode 100644 index 00000000000..98fda576808 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-018.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-018.tentative.html] + [changing media to matching in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-019.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-019.tentative.html.ini new file mode 100644 index 00000000000..55b1e8fcbc4 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-019.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-019.tentative.html] + [changing media to non-matching in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-020.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-020.tentative.html.ini new file mode 100644 index 00000000000..d9ca447f339 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-020.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-020.tentative.html] + [changing rel to non-expect in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-021.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-021.tentative.html.ini new file mode 100644 index 00000000000..9944597e235 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-021.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-021.tentative.html] + [changing rel to expect in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-022.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-022.tentative.html.ini new file mode 100644 index 00000000000..17d86d7881a --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-022.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-022.tentative.html] + [adding href in the body has no effect] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-023.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-023.tentative.html.ini new file mode 100644 index 00000000000..a0bd7e500ca --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-023.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-023.tentative.html] + [removing href in the body makes it non blocking] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-025.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-025.tentative.html.ini new file mode 100644 index 00000000000..6d1a662295c --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-025.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-025.tentative.html] + [adding an id in the body satisfies render block] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-026.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-026.tentative.html.ini new file mode 100644 index 00000000000..76fadb90c93 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-026.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-026.tentative.html] + [removing id after it was renderer keeps render block satisfied] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini new file mode 100644 index 00000000000..342b4dbb48d --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-028.tentative.html] + [removing some links but not all keeps at least the matching link blocking] + 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 7d28d586f51..24903b5f66f 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,3 +1,4 @@ [iframe_sandbox_popups_escaping-1.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: FAIL + 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 8822f4daba6..bbc1f35d8d9 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,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-1.html] - expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index c6f1e5d7d84..4034793cc72 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-2.html] - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini index 99f79478d35..9f6ea9fb3fa 100644 --- a/tests/wpt/meta/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini +++ b/tests/wpt/meta/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini @@ -179,8 +179,5 @@ [multipart/form-data: \\r\\n in value (formdata event)] expected: FAIL - [multipart/form-data: 0x00 in name (normal form)] - expected: FAIL - [multipart/form-data: backslash in value (formdata event)] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini index 4fd60fd17f6..45ba8002606 100644 --- a/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini +++ b/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini @@ -83,9 +83,6 @@ [text/plain: double quote in name (formdata event)] expected: FAIL - [text/plain: double quote in value (formdata event)] - expected: FAIL - [text/plain: double quote in filename (normal form)] expected: FAIL @@ -178,3 +175,9 @@ [text/plain: \\n in name (normal form)] expected: FAIL + + [text/plain: 0x00 in name (normal form)] + expected: FAIL + + [text/plain: double quote in value (normal form)] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini index e7f6892ec61..0532bf902a1 100644 --- a/tests/wpt/meta/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini +++ b/tests/wpt/meta/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini @@ -181,3 +181,6 @@ [application/x-www-form-urlencoded: single quote in name (normal form)] expected: FAIL + + [application/x-www-form-urlencoded: \\r\\n in filename (formdata event)] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html.ini b/tests/wpt/meta/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html.ini new file mode 100644 index 00000000000..47036c2fa3e --- /dev/null +++ b/tests/wpt/meta/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html.ini @@ -0,0 +1,9 @@ +[popover-stacking-anchor-attribute.tentative.html] + [anchor attribute relationship] + expected: FAIL + + [indirect anchor attribute relationship] + expected: FAIL + + [more complex nesting, all using anchor ancestry] + expected: FAIL diff --git a/tests/wpt/meta/html/syntax/parsing/DOMContentLoaded-defer.html.ini b/tests/wpt/meta/html/syntax/parsing/DOMContentLoaded-defer.html.ini new file mode 100644 index 00000000000..b8bdf33cb65 --- /dev/null +++ b/tests/wpt/meta/html/syntax/parsing/DOMContentLoaded-defer.html.ini @@ -0,0 +1,3 @@ +[DOMContentLoaded-defer.html] + [The end: DOMContentLoaded and defer scripts] + expected: FAIL diff --git a/tests/wpt/meta/performance-timeline/tentative/performance-entry-source-deleted-frame.html.ini b/tests/wpt/meta/performance-timeline/tentative/performance-entry-source-deleted-frame.html.ini deleted file mode 100644 index 81f6bbe98f7..00000000000 --- a/tests/wpt/meta/performance-timeline/tentative/performance-entry-source-deleted-frame.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[performance-entry-source-deleted-frame.html] - expected: ERROR - [PerformanceEntry source is null when the window it points to is removed.] - expected: TIMEOUT diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index bc3890bb839..6fe9aa2c657 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -685,3 +685,9 @@ [X SNR (-55.798814412116315 dB) is not greater than or equal to 65.737. Got -55.798814412116315.] 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[15073\]\t2.6412914956707838e-34\t6.4605611562728882e-1\t6.4605611562728882e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[15074\]\t2.5936898589134216e-1\t5.9696805477142334e-1\t3.3759906888008118e-1\t5.6552283858697683e-1\t3.8985999999999999e-3\n\tMax AbsError of 6.4605611562728882e-1 at index of 15073.\n\tMax RelError of 1.0000000000000000e+0 at index of 15073.\n] + expected: FAIL + + [X SNR (46.13279577826709 dB) is not greater than or equal to 65.737. Got 46.13279577826709.] + expected: FAIL diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/close-event.tentative.any.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/close-event.tentative.any.js.ini deleted file mode 100644 index ce1bff28329..00000000000 --- a/tests/wpt/meta/webmessaging/message-channels/close-event/close-event.tentative.any.js.ini +++ /dev/null @@ -1,10 +0,0 @@ -[close-event.tentative.any.html] - expected: TIMEOUT - [Close event listener added with onclose must be called.] - expected: TIMEOUT - - -[close-event.tentative.any.worker.html] - expected: TIMEOUT - [Close event listener added with onclose must be called.] - expected: TIMEOUT diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js.ini new file mode 100644 index 00000000000..730f1a634dd --- /dev/null +++ b/tests/wpt/meta/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js.ini @@ -0,0 +1,10 @@ +[document-destroyed.tentative.window.html] + expected: ERROR + [The context is navigated to a new document and a close event is fired.] + expected: TIMEOUT + + [The window is closed and a close event is fired.] + expected: NOTRUN + + [The iframe is deleted and a close event is fired.] + expected: NOTRUN diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js.ini new file mode 100644 index 00000000000..99c50df9265 --- /dev/null +++ b/tests/wpt/meta/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js.ini @@ -0,0 +1,3 @@ +[entangled-after-back-forward-cache-restore.https.tentative.window.html] + [MessagePort still works after the page is restored from BFCache] + expected: FAIL diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini new file mode 100644 index 00000000000..c625c16f713 --- /dev/null +++ b/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini @@ -0,0 +1,7 @@ +[explicitly-closed.tentative.window.html] + expected: TIMEOUT + [Close event on port2 is fired when port1 is explicitly closed] + expected: TIMEOUT + + [Close event on port2 is fired when port1, which is in a different window, is explicitly closed.] + expected: TIMEOUT diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js.ini new file mode 100644 index 00000000000..428474cd836 --- /dev/null +++ b/tests/wpt/meta/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js.ini @@ -0,0 +1,8 @@ +[garbage-collected.tentative.any.html] + [Entangled port is garbage collected, and the close event is fired.] + expected: FAIL + + +[garbage-collected.tentative.any.worker.html] + [Entangled port is garbage collected, and the close event is fired.] + expected: FAIL diff --git a/tests/wpt/meta/webmessaging/without-ports/018.html.ini b/tests/wpt/meta/webmessaging/with-ports/018.html.ini index b7b36c1d3a4..b7b36c1d3a4 100644 --- a/tests/wpt/meta/webmessaging/without-ports/018.html.ini +++ b/tests/wpt/meta/webmessaging/with-ports/018.html.ini diff --git a/tests/wpt/tests/.github/workflows/documentation.yml b/tests/wpt/tests/.github/workflows/documentation.yml index 1d57acc6256..0efa736adef 100644 --- a/tests/wpt/tests/.github/workflows/documentation.yml +++ b/tests/wpt/tests/.github/workflows/documentation.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11' - name: Set up Node diff --git a/tests/wpt/tests/.github/workflows/manifest.yml b/tests/wpt/tests/.github/workflows/manifest.yml index e86ced78f60..597259eb72e 100644 --- a/tests/wpt/tests/.github/workflows/manifest.yml +++ b/tests/wpt/tests/.github/workflows/manifest.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11' - name: Checkout diff --git a/tests/wpt/tests/.github/workflows/regen_certs.yml b/tests/wpt/tests/.github/workflows/regen_certs.yml index 4b3565c0d6c..d3e1240e79a 100644 --- a/tests/wpt/tests/.github/workflows/regen_certs.yml +++ b/tests/wpt/tests/.github/workflows/regen_certs.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11' - name: Checkout diff --git a/tests/wpt/tests/.taskcluster.yml b/tests/wpt/tests/.taskcluster.yml index 2a005df772f..d9e5581861e 100644 --- a/tests/wpt/tests/.taskcluster.yml +++ b/tests/wpt/tests/.taskcluster.yml @@ -57,7 +57,7 @@ tasks: owner: ${owner} source: ${event.repository.clone_url} payload: - image: webplatformtests/wpt:0.55 + image: webplatformtests/wpt:0.56 maxRunTime: 7200 artifacts: public/results: diff --git a/tests/wpt/tests/IndexedDB/idbindex_reverse_cursor.any.js b/tests/wpt/tests/IndexedDB/idbindex_reverse_cursor.any.js index 88c367466df..1297b44d6ec 100644 --- a/tests/wpt/tests/IndexedDB/idbindex_reverse_cursor.any.js +++ b/tests/wpt/tests/IndexedDB/idbindex_reverse_cursor.any.js @@ -30,12 +30,13 @@ promise_test(async testCase => { txn3.objectStore('objectStore').add({'key': 'secondItem', 'indexedOn': 2}); const txn4 = db.transaction(['objectStore'], 'readonly'); + const txnWaiter = promiseForTransaction(testCase, txn4); cursor = txn4.objectStore('objectStore').index('index').openCursor(IDBKeyRange.bound(0, 10), "prev"); let results = await iterateAndReturnAllCursorResult(testCase, cursor); assert_equals(results.length, 1); - await promiseForTransaction(testCase, txn4); + await txnWaiter; db.close(); }, 'Reverse cursor sees update from separate transactions.'); @@ -50,11 +51,12 @@ promise_test(async testCase => { txn.objectStore('objectStore').add({'key': '2', 'indexedOn': 1}); const txn2 = db.transaction(['objectStore'], 'readonly'); + const txnWaiter = promiseForTransaction(testCase, txn2); cursor = txn2.objectStore('objectStore').index('index').openCursor(IDBKeyRange.bound(0, 10), "prev"); let results = await iterateAndReturnAllCursorResult(testCase, cursor); assert_equals(1, results.length); - await promiseForTransaction(testCase, txn2); + await txnWaiter; db.close(); }, 'Reverse cursor sees in-transaction update.'); diff --git a/tests/wpt/tests/IndexedDB/nested-cloning-basic.html b/tests/wpt/tests/IndexedDB/nested-cloning-basic.html new file mode 100644 index 00000000000..df4848b6937 --- /dev/null +++ b/tests/wpt/tests/IndexedDB/nested-cloning-basic.html @@ -0,0 +1,21 @@ +<!doctype html> +<meta charset="utf8"> +<meta name="timeout" content="long"> +<title>IndexedDB: basic objects are cloned correctly</title> +<link rel="help" href="https://w3c.github.io/IndexedDB/#abort-transaction"> +<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/support-promises.js"></script> +<script src="resources/nested-cloning-common.js"></script> +<script> + +cloningTest('small typed array', [ + { type: 'buffer', size: 64, seed: 1 }, +]); + +cloningTest('blob', [ + { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-1', seed: 1 }, +]); + +</script> diff --git a/tests/wpt/tests/IndexedDB/nested-cloning-small.html b/tests/wpt/tests/IndexedDB/nested-cloning-small.html index e92251410af..e5105a999f5 100644 --- a/tests/wpt/tests/IndexedDB/nested-cloning-small.html +++ b/tests/wpt/tests/IndexedDB/nested-cloning-small.html @@ -10,14 +10,6 @@ <script src="resources/nested-cloning-common.js"></script> <script> -cloningTest('small typed array', [ - { type: 'buffer', size: 64, seed: 1 }, -]); - -cloningTest('blob', [ - { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-1', seed: 1 }, -]); - cloningTestWithKeyGenerator('blob with small typed array', [ { blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01', diff --git a/tests/wpt/tests/IndexedDB/resources/nested-cloning-common.js b/tests/wpt/tests/IndexedDB/resources/nested-cloning-common.js index db5f710ceb5..042741b431c 100644 --- a/tests/wpt/tests/IndexedDB/resources/nested-cloning-common.js +++ b/tests/wpt/tests/IndexedDB/resources/nested-cloning-common.js @@ -109,6 +109,7 @@ function checkValue(testCase, value, descriptor) { function cloningTestInternal(label, valueDescriptors, options) { promise_test(testCase => { return createDatabase(testCase, (database, transaction) => { + testCase.add_cleanup(() => database.close()); let store; if (options.useKeyGenerator) { store = database.createObjectStore( diff --git a/tests/wpt/tests/IndexedDB/resources/support-promises.js b/tests/wpt/tests/IndexedDB/resources/support-promises.js index 1a5b8270842..f64b73adc90 100644 --- a/tests/wpt/tests/IndexedDB/resources/support-promises.js +++ b/tests/wpt/tests/IndexedDB/resources/support-promises.js @@ -16,8 +16,8 @@ function requestWatcher(testCase, request) { // EventWatcher covering all the events defined on IndexedDB transactions. // // The events cover IDBTransaction. -function transactionWatcher(testCase, request) { - return new EventWatcher(testCase, request, ['abort', 'complete', 'error']); +function transactionWatcher(testCase, transaction) { + return new EventWatcher(testCase, transaction, ['abort', 'complete', 'error']); } // Promise that resolves with an IDBRequest's result. @@ -35,9 +35,18 @@ function promiseForRequest(testCase, request) { // // The promise resolves with undefined if IDBTransaction receives the "complete" // event, and rejects with an error for any other event. -function promiseForTransaction(testCase, request) { - const eventWatcher = transactionWatcher(testCase, request); - return eventWatcher.wait_for('complete').then(() => {}); +// +// NB: be careful NOT to invoke this after the transaction may have already +// completed due to racing transaction auto-commit. A problematic sequence might +// look like: +// +// const txn = db.transaction('store', 'readwrite'); +// txn.objectStore('store').put(value, key); +// await foo(); +// await promiseForTransaction(t, txn); +function promiseForTransaction(testCase, transaction) { + const eventWatcher = transactionWatcher(testCase, transaction); + return eventWatcher.wait_for('complete'); } // Migrates an IndexedDB database whose name is unique for the test case. diff --git a/tests/wpt/tests/IndexedDB/structured-clone.any.js b/tests/wpt/tests/IndexedDB/structured-clone.any.js index 15ab0359e23..687b028e90c 100644 --- a/tests/wpt/tests/IndexedDB/structured-clone.any.js +++ b/tests/wpt/tests/IndexedDB/structured-clone.any.js @@ -41,11 +41,12 @@ function cloneTest(value, verifyFunc) { } }); const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'}); + const txWaiter = promiseForTransaction(t, tx); const store = tx.objectStore('store'); await promiseForRequest(t, store.put(value, 'key')); const result = await promiseForRequest(t, store.get('key')); await verifyFunc(value, result); - await promiseForTransaction(t, tx); + await txWaiter; }, describe(value)); } diff --git a/tests/wpt/tests/accessibility/crashtests/animated-textarea.html b/tests/wpt/tests/accessibility/crashtests/animated-textarea.html new file mode 100644 index 00000000000..a23eed669c2 --- /dev/null +++ b/tests/wpt/tests/accessibility/crashtests/animated-textarea.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<!-- This tests that the anonymous descendants of the textarea do not lose + their attachment to parent objects --> +<html class="test-wait"> +<canvas> +<textarea> +</textarea> +<script> +const canvas = document.querySelector('canvas'); +const animation = canvas.animate([ + {"listStylePosition":"outside"}, {"listStylePosition":"inside"}], + {"duration":100,"delay":0}); +animation.addEventListener('finish', () => { + document.documentElement.className = ''; +}); +</script> +</canvas> diff --git a/tests/wpt/tests/common/security-features/tools/generate.py b/tests/wpt/tests/common/security-features/tools/generate.py index 409b4f195ff..d1cd33147fc 100755 --- a/tests/wpt/tests/common/security-features/tools/generate.py +++ b/tests/wpt/tests/common/security-features/tools/generate.py @@ -321,7 +321,7 @@ def generate_test_source_files(spec_directory, test_helper_filenames, # Choose a debug/release template depending on the target. html_template = "test.%s.html.template" % target - artifact_order = test_expansion_schema.keys() + artifact_order = list(test_expansion_schema.keys()) artifact_order.remove('expansion') excluded_selection_pattern = '' diff --git a/tests/wpt/tests/common/security-features/tools/spec_validator.py b/tests/wpt/tests/common/security-features/tools/spec_validator.py index f8a1390ef0d..e4c9e145f83 100755 --- a/tests/wpt/tests/common/security-features/tools/spec_validator.py +++ b/tests/wpt/tests/common/security-features/tools/spec_validator.py @@ -5,7 +5,7 @@ import json, sys def assert_non_empty_string(obj, field): assert field in obj, 'Missing field "%s"' % field - assert isinstance(obj[field], basestring), \ + assert isinstance(obj[field], str), \ 'Field "%s" must be a string' % field assert len(obj[field]) > 0, 'Field "%s" must not be empty' % field @@ -34,7 +34,7 @@ def assert_value_from(obj, field, items): def assert_atom_or_list_items_from(obj, field, items): - if isinstance(obj[field], basestring) or isinstance( + if isinstance(obj[field], str) or isinstance( obj[field], int) or obj[field] is None: assert_value_from(obj, field, items) return @@ -236,7 +236,7 @@ def assert_valid_spec_json(spec_json): try: validate(spec_json, error_details) except AssertionError as err: - print('ERROR:', err.message) + print('ERROR:', err) print(json.dumps(error_details, indent=4)) sys.exit(1) diff --git a/tests/wpt/tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js b/tests/wpt/tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js deleted file mode 100644 index 950334d6fc5..00000000000 --- a/tests/wpt/tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js +++ /dev/null @@ -1,59 +0,0 @@ -// META: timeout=long -// META: script=/common/get-host-info.sub.js -// META: script=/resources/test-only-api.js -// META: script=resources/pressure-helpers.js - -'use strict'; - -pressure_test(async (t, mockPressureService) => { - const iframe = document.createElement('iframe'); - iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + - '/compute-pressure/resources/support-iframe.html'; - const iframeLoadWatcher = new EventWatcher(t, iframe, 'load'); - document.body.appendChild(iframe); - await iframeLoadWatcher.wait_for('load'); - iframe.contentWindow.focus(); - - const observer = new PressureObserver(() => { - assert_unreached('The observer callback should not be called'); - }); - t.add_cleanup(() => { - observer.disconnect(); - iframe.remove(); - }); - await observer.observe('cpu'); - mockPressureService.setPressureUpdate('cpu', 'critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - - return new Promise(resolve => t.step_timeout(resolve, 1000)); -}, 'Observer in main frame should not receive PressureRecord when focused on cross-origin iframe'); - -pressure_test(async (t, mockPressureService) => { - const iframe = document.createElement('iframe'); - iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + - '/compute-pressure/resources/support-iframe.html'; - iframe.allow = 'compute-pressure'; - const iframeLoadWatcher = new EventWatcher(t, iframe, 'load'); - document.body.appendChild(iframe); - await iframeLoadWatcher.wait_for('load'); - // Focus on the main frame to make the iframe lose focus, so that - // PressureObserver in the iframe can't receive PressureRecord by default. - // If the main frame has focus, but the iframe is cross-origin with the main - // frame, PressureObserver in the iframe still can't receive PressureRecord. - window.focus(); - - return new Promise((resolve, reject) => { - window.addEventListener('message', (e) => { - if (e.data.result === 'timeout') { - resolve(); - } else if (e.data.result === 'success') { - reject('Observer should not receive PressureRecord'); - } else { - reject('Got unexpected reply'); - } - }, {once: true}); - iframe.contentWindow.postMessage({command: 'start'}, '*'); - mockPressureService.setPressureUpdate('cpu', 'critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - }); -}, 'Observer in iframe should not receive PressureRecord when focused on cross-origin main frame'); diff --git a/tests/wpt/tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js b/tests/wpt/tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js deleted file mode 100644 index 113f4bdf79b..00000000000 --- a/tests/wpt/tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js +++ /dev/null @@ -1,77 +0,0 @@ -// META: timeout=long -// META: script=/common/get-host-info.sub.js -// META: script=/common/media.js -// META: script=/mediacapture-streams/permission-helper.js -// META: script=/picture-in-picture/resources/picture-in-picture-helpers.js -// META: script=/resources/testdriver.js -// META: script=/resources/testdriver-vendor.js -// META: script=/resources/test-only-api.js -// META: script=resources/pressure-helpers.js - -'use strict'; - -pressure_test(async (t, mockPressureService) => { - const video = await loadVideo(); - document.body.appendChild(video); - const pipWindow = await requestPictureInPictureWithTrustedClick(video); - assert_not_equals(pipWindow.width, 0); - assert_not_equals(pipWindow.height, 0); - - const iframe = document.createElement('iframe'); - iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + - '/compute-pressure/resources/support-iframe.html'; - const iframeLoadWatcher = new EventWatcher(t, iframe, 'load'); - document.body.appendChild(iframe); - await iframeLoadWatcher.wait_for('load'); - // Focus on the cross-origin iframe, so that PressureObserver in the main - // frame can't receive PressureRecord by default. However, if the main - // frame is the initiator of active Picture-in-Picture session, - // PressureObserver in the main frame can receive PressureRecord. - iframe.contentWindow.focus(); - - await new Promise(resolve => { - const observer = new PressureObserver(resolve); - t.add_cleanup(async () => { - observer.disconnect(); - iframe.remove(); - if (document.pictureInPictureElement) { - await document.exitPictureInPicture(); - } - video.remove(); - }); - observer.observe('cpu'); - mockPressureService.setPressureUpdate('cpu', 'critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - }); -}, 'Observer should receive PressureRecord if associated document is the initiator of active Picture-in-Picture session'); - -pressure_test(async (t, mockPressureService) => { - await setMediaPermission(); - const stream = - await navigator.mediaDevices.getUserMedia({video: true, audio: true}); - assert_true(stream.active); - - const iframe = document.createElement('iframe'); - iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + - '/compute-pressure/resources/support-iframe.html'; - const iframeLoadWatcher = new EventWatcher(t, iframe, 'load'); - document.body.appendChild(iframe); - await iframeLoadWatcher.wait_for('load'); - // Focus on the cross-origin iframe, so that PressureObserver in the main - // frame can't receive PressureRecord by default. However, if the main - // frame's browsing context is capturing, PressureObserver in the main - // frame can receive PressureRecord. - iframe.contentWindow.focus(); - - await new Promise(resolve => { - const observer = new PressureObserver(resolve); - t.add_cleanup(async () => { - observer.disconnect(); - iframe.remove(); - stream.getTracks().forEach(track => track.stop()); - }); - observer.observe('cpu'); - mockPressureService.setPressureUpdate('cpu', 'critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - }); -}, 'Observer should receive PressureRecord if browsing context is capturing'); diff --git a/tests/wpt/tests/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.js b/tests/wpt/tests/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.js index c2c5cc9f7f6..0ae20fdee6e 100644 --- a/tests/wpt/tests/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.js +++ b/tests/wpt/tests/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.js @@ -13,22 +13,27 @@ pressure_test(async (t, mockPressureService) => { const minPenaltyTimeInMs = 5000; const maxChangesThreshold = 100; const minChangesThreshold = 50; + let gotPenalty = false; await new Promise(async resolve => { const observerChanges = []; const observer = new PressureObserver(changes => { - if (observerChanges.length >= minChangesThreshold) { + if (observerChanges.length >= (minChangesThreshold - 1) && !gotPenalty) { // Add an assert to the maximum threshold possible. t.step(() => { assert_less_than_equal(observerChanges.length, maxChangesThreshold, "Sample count reaching maxChangesThreshold."); }); - if (observerChanges.length > 0) { - const lastSample = observerChanges.at(-1); - if ((changes[0].time - lastSample[0].time) >= minPenaltyTimeInMs) { - observer.disconnect(); - resolve(); - } + const lastSample = observerChanges.at(-1); + if ((changes[0].time - lastSample[0].time) >= minPenaltyTimeInMs) { + // The update delivery might still be working even if + // maxChangesThreshold have been reached and before disconnect() is + // processed. This will corrupt the result for the above t.step(). + // Therefore we are adding a flag to dismiss any updates after the + // penalty is detected, which is the condition for the test to pass. + gotPenalty = true; + observer.disconnect(); + resolve(); } } observerChanges.push(changes); diff --git a/tests/wpt/tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js b/tests/wpt/tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js deleted file mode 100644 index 7df0be5c47d..00000000000 --- a/tests/wpt/tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js +++ /dev/null @@ -1,43 +0,0 @@ -// META: timeout=long -// META: script=/resources/test-only-api.js -// META: script=resources/pressure-helpers.js - -'use strict'; - -pressure_test(async (t, mockPressureService) => { - const iframe = document.createElement('iframe'); - document.body.appendChild(iframe); - iframe.contentWindow.focus(); - - await new Promise(resolve => { - const observer = new PressureObserver(resolve); - t.add_cleanup(() => { - observer.disconnect(); - iframe.remove(); - }); - observer.observe('cpu'); - mockPressureService.setPressureUpdate('cpu', 'critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - }); -}, 'Observer in main frame should receive PressureRecord when focused on same-origin iframe'); - -pressure_test(async (t, mockPressureService) => { - const iframe = document.createElement('iframe'); - document.body.appendChild(iframe); - // Focus on the main frame to make the iframe lose focus, so that - // PressureObserver in the iframe can't receive PressureRecord by default. - // However, if the iframe is same-origin with the main frame and the main - // frame has focus, PressureObserver in iframe can receive PressureRecord. - window.focus(); - - await new Promise(resolve => { - const observer = new iframe.contentWindow.PressureObserver(resolve); - t.add_cleanup(() => { - observer.disconnect(); - iframe.remove(); - }); - observer.observe('cpu'); - mockPressureService.setPressureUpdate('cpu', 'critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - }); -}, 'Observer in iframe should receive PressureRecord when focused on same-origin main frame'); diff --git a/tests/wpt/tests/content-security-policy/reporting/report-preload-and-consume.https.html b/tests/wpt/tests/content-security-policy/reporting/report-preload-and-consume.https.html index 3e04f55f03c..2fc18023473 100644 --- a/tests/wpt/tests/content-security-policy/reporting/report-preload-and-consume.https.html +++ b/tests/wpt/tests/content-security-policy/reporting/report-preload-and-consume.https.html @@ -20,7 +20,7 @@ const failures = reports.filter( r => r['csp-report']['blocked-uri'].endsWith('fail.png')); return failures.length === 2; - }, "Should receive 2 CSP reports.", 5000, 500); + }, "Should receive 2 CSP reports.", 10000, 500); }, "Reporting endpoints received credentials."); </script> </body> diff --git a/tests/wpt/tests/content-security-policy/style-src/inline-style-blocked.sub.html b/tests/wpt/tests/content-security-policy/style-src/inline-style-blocked.sub.html index 3f34437dffd..90ec73341b2 100644 --- a/tests/wpt/tests/content-security-policy/style-src/inline-style-blocked.sub.html +++ b/tests/wpt/tests/content-security-policy/style-src/inline-style-blocked.sub.html @@ -2,32 +2,32 @@ <html> <head> - <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.--> - <meta http-equiv="Content-Security-Policy" content="style-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-inline'; connect-src 'self';"> + <meta http-equiv="Content-Security-Policy" content="style-src 'none'; script-src 'self' 'unsafe-inline'"> <title>inline-style-blocked</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["PASS"]'></script> - <script src="../support/alertAssert.sub.js?alerts=[]"></script> <script> - window.addEventListener('securitypolicyviolation', function(e) { - log("violated-directive=" + e.violatedDirective); - }); + async_test(t => { + window.addEventListener('securitypolicyviolation', t.step_func(e => { + if (e.blockedURI !== 'inline') return; + assert_equals(e.violatedDirective, 'style-src-elem'); + t.done(); + })); + }, "Triggers securitypolicyviolation."); </script> <style> .target { background-color: blue; } - </style> </head> -<body class="target"> - <script> - log(document.styleSheets.length > 0 ? 'FAIL' : 'PASS'); - - </script> - <div id="log"></div> +<body> + <script> + test(t => { + assert_equals(document.styleSheets.length, 0); + }, "Inline style element is blocked by CSP."); + </script> </body> </html> diff --git a/tests/wpt/tests/credential-management/fedcm-auto-reauthn-without-approved-clients.https.html b/tests/wpt/tests/credential-management/fedcm-auto-reauthn-without-approved-clients.https.html new file mode 100644 index 00000000000..fb93cb632db --- /dev/null +++ b/tests/wpt/tests/credential-management/fedcm-auto-reauthn-without-approved-clients.https.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<title>Federated Credential Management API auto reauthentication without approved client.</title> +<link rel="help" href="https://fedidcg.github.io/FedCM"> +<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 type="module"> +import {request_options_with_mediation_optional, + fedcm_test, + mark_signed_in, + select_manifest, + fedcm_get_and_select_first_account} from './support/fedcm-helper.sub.js'; + +fedcm_test(async t => { + await mark_signed_in(); + let test_options = request_options_with_mediation_optional( + "manifest_with_single_account.json"); + test_options.identity.providers[0].clientId = 'nomatch'; + await select_manifest(t, test_options); + + // Signs in john_doe so that they will be a returning user + let cred = await fedcm_get_and_select_first_account(t, test_options); + assert_equals(cred.token, "account_id=john_doe"); + + test_options.mediation = 'silent'; + cred = navigator.credentials.get(test_options); + return promise_rejects_dom(t, 'NetworkError', cred); +}, "Test that if the clientId is missing from approved_clients then auto\ +reauthentication cannot occur."); +</script> 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 7168d3b8fc8..41102cdabe1 100644 --- a/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html +++ b/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html @@ -23,20 +23,17 @@ 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`; - let disconnect = IdentityCredential.disconnect({ + await promise_rejects_js(t, TypeError, IdentityCredential.disconnect({ configURL: manifest, clientId: '1' - }); - await promise_rejects_dom(t, 'InvalidStateError', disconnect); - disconnect = IdentityCredential.disconnect({ + })); + await promise_rejects_js(t, TypeError, IdentityCredential.disconnect({ configURL: manifest, accountHint: 'hint' - }); - await promise_rejects_dom(t, 'InvalidStateError', disconnect); - disconnect = IdentityCredential.disconnect({ + })); + return promise_rejects_js(t, TypeError, IdentityCredential.disconnect({ clientId: '1', accountHint: 'hint' - }); - return promise_rejects_dom(t, 'InvalidStateError', disconnect); + })); }, "disconnect requires 3 parameters: configURL, clientId, and accountHint"); </script> diff --git a/tests/wpt/tests/credential-management/fedcm-pending-disconnect.https.html b/tests/wpt/tests/credential-management/fedcm-pending-disconnect.https.html new file mode 100644 index 00000000000..1b60acc1088 --- /dev/null +++ b/tests/wpt/tests/credential-management/fedcm-pending-disconnect.https.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<title>Federated Credential Management API pending disconnect() test.</title> +<link rel="help" href="https://fedidcg.github.io/FedCM"> +<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> + +<body> + +<script type="module"> +import {fedcm_test, + mark_signed_in, + set_fedcm_cookie, + disconnect_options, + fedcm_get_and_select_first_account, + request_options_with_mediation_required} from './support/fedcm-helper.sub.js'; + +fedcm_test(async t => { + await mark_signed_in(); + await set_fedcm_cookie(); + // Go through the FedCM flow so that the disconnect() call is not trivial. + const cred = await fedcm_get_and_select_first_account(t, request_options_with_mediation_required()); + + // Invoke disconnect without awaiting it to test that the browser can handle + // the page being destroyed while there is a pending disconnect call. + IdentityCredential.disconnect(disconnect_options("1234")); +}, 'Test that disconnect can be pending when the test finishes.'); +</script> diff --git a/tests/wpt/tests/credential-management/fedcm-pending-userinfo.https.html b/tests/wpt/tests/credential-management/fedcm-pending-userinfo.https.html new file mode 100644 index 00000000000..0ecae3e80a4 --- /dev/null +++ b/tests/wpt/tests/credential-management/fedcm-pending-userinfo.https.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<title>Federated Credential Management API pending getUserInfo() test.</title> +<link rel="help" href="https://fedidcg.github.io/FedCM"> +<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> + +<body> + +<script type="module"> +import {alt_manifest_origin, + alt_request_options_with_mediation_required, + fedcm_test, + fedcm_get_and_select_first_account} from './support/fedcm-helper.sub.js'; + +async function createIframeWithPermissionPolicyAndWaitForMessage(test, iframeUrl) { + const messageWatcher = new EventWatcher(test, window, "message"); + let iframe = document.createElement("iframe"); + iframe.src = iframeUrl; + iframe.allow = "identity-credentials-get"; + document.body.appendChild(iframe); + const message = await messageWatcher.wait_for("message"); + return message.data; +} + +fedcm_test(async t => { + const cred = await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); + assert_equals(cred.token, "token"); + + const iframe_in_idp_scope = `${alt_manifest_origin}/\ +credential-management/support/fedcm/pending-userinfo-iframe.html`; + const message = await createIframeWithPermissionPolicyAndWaitForMessage(t, iframe_in_idp_scope); + assert_equals(message, "Pass"); +}, 'Test basic User InFo API flow'); +</script> 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 new file mode 100644 index 00000000000..0afe279bcc5 --- /dev/null +++ b/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html @@ -0,0 +1,22 @@ +<!doctype html> +<script type="module"> +import {alt_manifest_origin} from './../fedcm-helper.sub.js'; + +// Invokes getUserInfo and immediately sends a message to the parent frame. +window.onload = async () => { + try { + const manifest_path = `${alt_manifest_origin}/\ +credential-management/support/fedcm/manifest.py`; + IdentityProvider.getUserInfo({ + configURL: manifest_path, + // Approved client + clientId: '123', + }); + window.top.postMessage("Pass", '*'); + } catch (error) { + window.top.postMessage("Fail", '*'); + } +}; + +</script> + diff --git a/tests/wpt/tests/css/CSS2/floats/float-nowrap-4-ref2.html b/tests/wpt/tests/css/CSS2/floats/float-nowrap-4-ref2.html new file mode 100644 index 00000000000..f86afdbce80 --- /dev/null +++ b/tests/wpt/tests/css/CSS2/floats/float-nowrap-4-ref2.html @@ -0,0 +1,27 @@ +<!doctype html> +<title>CSS Test Reference</title> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://www.mozilla.org" title="Mozilla"> +<style> + div { + width: 10ch; + font-family: monospace; + } + .float { + float: right; + width: 5ch; + height: 5ch; + background: blue; + } + .nowrap { + white-space: nowrap; + } +</style> +<div> + Some + <br> + <span class="float"></span> + <span class="nowrap"> + text that overflows my parent. + </span> +</div> diff --git a/tests/wpt/tests/css/CSS2/floats/float-nowrap-4.html b/tests/wpt/tests/css/CSS2/floats/float-nowrap-4.html index bf11e6e31c4..c7b5f8801c9 100644 --- a/tests/wpt/tests/css/CSS2/floats/float-nowrap-4.html +++ b/tests/wpt/tests/css/CSS2/floats/float-nowrap-4.html @@ -5,6 +5,7 @@ <link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> <link rel="author" href="https://www.mozilla.org" title="Mozilla"> <link rel="match" href="float-nowrap-4-ref.html"> +<link rel="match" href="float-nowrap-4-ref2.html"> <style> div { width: 10ch; diff --git a/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref.html b/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref.html new file mode 100644 index 00000000000..c1924998a12 --- /dev/null +++ b/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<style> +#container { + font-family: monospace; + font-size: 20px; + hyphens: auto; +} + +#container > div { + border: 1px solid blue; +} + +#container > div > div { + border: 1px solid gray; +} + +span.wrapper { + white-space: pre; +} + +.float { + float: right; + margin-right: -100px; +} +</style> +<div id="container" lang="en-US"> + <div style="width: 23ch"> + <div> + pppp + comprehension<span class="wrapper"> ppp</span> + pppp + <span class="float">float</span> + </div> + <div> + pppp + comprehension<span class="wrapper">[ppp</span> + pppp + <span class="float">float</span> + </div> + <div> + pppp + pppp pppp XXX<span class="wrapper"> ppp</span> + pppp + <span class="float">float</span> + </div> + <div> + pppp + pppp pppp XXX<span class="wrapper">[ppp</span> + pppp + <span class="float">float</span> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref2.html b/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref2.html new file mode 100644 index 00000000000..bdc489737f1 --- /dev/null +++ b/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1-ref2.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<style> +#container { + font-family: monospace; + font-size: 20px; + hyphens: auto; +} + +#container > div { + border: 1px solid blue; +} + +#container > div > div { + border: 1px solid gray; +} + +span.wrapper { + white-space: pre; +} + +.float { + float: right; + margin-right: -100px; +} +</style> +<div id="container" lang="en-US"> + <div style="width: 23ch"> + <div> + <span class="float">float</span> + pppp + comprehension<span class="wrapper"> ppp</span> + pppp + </div> + <div> + <span class="float">float</span> + pppp + comprehension<span class="wrapper">[ppp</span> + pppp + </div> + <div> + <span class="float">float</span> + pppp + pppp pppp XXX<span class="wrapper"> ppp</span> + pppp + </div> + <div> + <span class="float">float</span> + pppp + pppp pppp XXX<span class="wrapper">[ppp</span> + pppp + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html b/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html new file mode 100644 index 00000000000..9c629ef2872 --- /dev/null +++ b/tests/wpt/tests/css/CSS2/floats/float-nowrap-hyphen-rewind-1.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<title>CSS Test: Floats in nowrap context</title> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#float-position"> +<link rel="help" href="crbug.com/1499290"> +<link rel="match" href="float-nowrap-hyphen-rewind-1-ref.html"> +<link rel="match" href="float-nowrap-hyphen-rewind-1-ref2.html"> +<style> +#container { + font-family: monospace; + font-size: 20px; + hyphens: auto; +} + +#container > div { + border: 1px solid blue; +} + +#container > div > div { + border: 1px solid gray; +} + +span.wrapper { + white-space: pre; +} + +.float { + float: right; + margin-right: -100px; +} +</style> +<div id="container" lang="en-US"> + <div style="width: 23ch"> + <div> + pppp + comprehension<span class="wrapper"> ppp<span class="float">float</span></span> + pppp + </div> + <div> + pppp + comprehension<span class="wrapper">[ppp<span class="float">float</span></span> + pppp + </div> + <div> + pppp + pppp pppp XXX<span class="wrapper"> ppp<span class="float">float</span></span> + pppp + </div> + <div> + pppp + pppp pppp XXX<span class="wrapper">[ppp<span class="float">float</span></span> + pppp + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-htb.html b/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-htb.html new file mode 100644 index 00000000000..786cec7acf7 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-htb.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-vlr.html b/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-vlr.html new file mode 100644 index 00000000000..917e50d5e69 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-vlr.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-vrl.html b/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-vrl.html new file mode 100644 index 00000000000..b60d4615314 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-htb-ltr-vrl.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-htb.html b/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-htb.html new file mode 100644 index 00000000000..9bf919dd465 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-htb.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-vlr.html b/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-vlr.html new file mode 100644 index 00000000000..5c1e8c75c93 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-vlr.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-vrl.html b/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-vrl.html new file mode 100644 index 00000000000..b7f00569768 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-htb-rtl-vrl.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-htb.html b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-htb.html new file mode 100644 index 00000000000..98e3c0b9366 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-htb.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-vlr.html b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-vlr.html new file mode 100644 index 00000000000..73585d2db5a --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-vlr.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-vrl.html b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-vrl.html new file mode 100644 index 00000000000..39ecd388999 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-ltr-vrl.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-htb.html b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-htb.html new file mode 100644 index 00000000000..7a4167f62a5 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-htb.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-vlr.html b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-vlr.html new file mode 100644 index 00000000000..4ce7d46520a --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-vlr.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-vrl.html b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-vrl.html new file mode 100644 index 00000000000..0fe160442f4 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vlr-rtl-vrl.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-htb.html b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-htb.html new file mode 100644 index 00000000000..98e6145a631 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-htb.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-vlr.html b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-vlr.html new file mode 100644 index 00000000000..d22b347da30 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-vlr.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-vrl.html b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-vrl.html new file mode 100644 index 00000000000..602b7afb7b8 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-ltr-vrl.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-htb.html b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-htb.html new file mode 100644 index 00000000000..1dcfd8709f0 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-htb.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-vlr.html b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-vlr.html new file mode 100644 index 00000000000..d22b347da30 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-vlr.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-vrl.html b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-vrl.html new file mode 100644 index 00000000000..602b7afb7b8 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-vrl-rtl-vrl.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="align-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="align-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-htb.html b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-htb.html new file mode 100644 index 00000000000..cfef344e041 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-htb.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-vlr.html b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-vlr.html new file mode 100644 index 00000000000..55680f4b2c4 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-vlr.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-vrl.html b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-vrl.html new file mode 100644 index 00000000000..57ee3af6408 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-ltr-vrl.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-htb.html b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-htb.html new file mode 100644 index 00000000000..95e54c2b990 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-htb.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-vlr.html b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-vlr.html new file mode 100644 index 00000000000..e7224e76db6 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-vlr.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-vrl.html b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-vrl.html new file mode 100644 index 00000000000..ba7e98a6767 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-htb-rtl-vrl.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-width="20" data-offset-x="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-width="20" data-offset-x="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-width="20" data-offset-x="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-width="40" data-offset-x="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-htb.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-htb.html new file mode 100644 index 00000000000..d47c504679b --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-htb.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-vlr.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-vlr.html new file mode 100644 index 00000000000..71e3687f6f4 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-vlr.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-vrl.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-vrl.html new file mode 100644 index 00000000000..ae90d4da0d8 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-ltr-vrl.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-htb.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-htb.html new file mode 100644 index 00000000000..1a192b56924 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-htb.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-vlr.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-vlr.html new file mode 100644 index 00000000000..cb9986db101 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-vlr.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-vrl.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-vrl.html new file mode 100644 index 00000000000..fb717a051f2 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vlr-rtl-vrl.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-htb.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-htb.html new file mode 100644 index 00000000000..e2cbff322b3 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-htb.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-vlr.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-vlr.html new file mode 100644 index 00000000000..5aa2f482888 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-vlr.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-vrl.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-vrl.html new file mode 100644 index 00000000000..cf2db8d369b --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-ltr-vrl.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-htb.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-htb.html new file mode 100644 index 00000000000..317e53e92e0 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-htb.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-vlr.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-vlr.html new file mode 100644 index 00000000000..2d144d16aa0 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-vlr.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-lr; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-vrl.html b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-vrl.html new file mode 100644 index 00000000000..026c6e96816 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-vrl-rtl-vrl.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: rtl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: vertical-rl; + direction: ltr; + position: absolute; + background: green; + inset: 0; +} + +.item::before { + width: 20px; + height: 20px; + content: ''; + display: block; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-start;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: self-end;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container"> + <div class="item rtl" style="justify-self: start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: center;" data-expected-height="20" data-offset-y="10"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: baseline;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: last baseline;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-start;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: self-end;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: left;" data-expected-height="20" data-offset-y="0"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: right;" data-expected-height="20" data-offset-y="20"></div> +</div> + +<div class="container"> + <div class="item rtl" style="justify-self: stretch;" data-expected-height="40" data-offset-y="0"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/safe-align-self-htb.html b/tests/wpt/tests/css/css-align/abspos/safe-align-self-htb.html new file mode 100644 index 00000000000..9e259c1e630 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/safe-align-self-htb.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + position: absolute; + background: green; + inset: 5px; + margin: 10px; + width: 30px; + height: 30px; +} + +.safe { + align-self: safe end; +} +.unsafe { + align-self: unsafe end; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="15"></div> +</div> + +<!-- UNSAFE --> +<br> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="-5"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="15"></div> +</div> + +<!-- UNSAFE RTL --> +<br> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="-5"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/safe-align-self-vlr.html b/tests/wpt/tests/css/css-align/abspos/safe-align-self-vlr.html new file mode 100644 index 00000000000..d47b1836d52 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/safe-align-self-vlr.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + position: absolute; + background: green; + inset: 5px; + margin: 10px; + width: 30px; + height: 30px; +} + +.safe { + align-self: safe end; +} +.unsafe { + align-self: unsafe end; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="15"></div> +</div> + +<!-- UNSAFE --> +<br> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="-5"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="15"></div> +</div> + +<!-- UNSAFE RTL --> +<br> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="-5"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/safe-align-self-vrl.html b/tests/wpt/tests/css/css-align/abspos/safe-align-self-vrl.html new file mode 100644 index 00000000000..3432762007e --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/safe-align-self-vrl.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + position: absolute; + background: green; + inset: 5px; + margin: 10px; + width: 30px; + height: 30px; +} + +.safe { + align-self: safe end; +} +.unsafe { + align-self: unsafe end; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="-5"></div> +</div> + +<!-- UNSAFE --> +<br> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="15"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="-5"></div> +</div> + +<!-- UNSAFE RTL --> +<br> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="15"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/safe-justify-self-htb.html b/tests/wpt/tests/css/css-align/abspos/safe-justify-self-htb.html new file mode 100644 index 00000000000..0fa5cc34d57 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/safe-justify-self-htb.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + position: absolute; + background: green; + inset: 5px; + margin: 10px; + width: 30px; + height: 30px; +} + +.safe { + justify-self: safe end; +} +.unsafe { + justify-self: unsafe end; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="15"></div> +</div> + +<!-- UNSAFE --> +<br> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="-5"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="-5"></div> +</div> + +<!-- UNSAFE RTL --> +<br> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-x="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-x="15"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/safe-justify-self-vlr.html b/tests/wpt/tests/css/css-align/abspos/safe-justify-self-vlr.html new file mode 100644 index 00000000000..7554975f1be --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/safe-justify-self-vlr.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-lr; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + position: absolute; + background: green; + inset: 5px; + margin: 10px; + width: 30px; + height: 30px; +} + +.safe { + justify-self: safe end; +} +.unsafe { + justify-self: unsafe end; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="15"></div> +</div> + +<!-- UNSAFE --> +<br> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="-5"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="-5"></div> +</div> + +<!-- UNSAFE RTL --> +<br> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="15"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/safe-justify-self-vrl.html b/tests/wpt/tests/css/css-align/abspos/safe-justify-self-vrl.html new file mode 100644 index 00000000000..fe2405cf798 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/safe-justify-self-vrl.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + direction: ltr; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + position: absolute; + background: green; + inset: 5px; + margin: 10px; + width: 30px; + height: 30px; +} + +.safe { + justify-self: safe end; +} +.unsafe { + justify-self: unsafe end; +} + +.rtl { + direction: rtl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="15"></div> +</div> + +<!-- UNSAFE --> +<br> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="-5"></div> +</div> + +<!-- RTL --> +<br> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="-5"></div> +</div> + +<div class="container rtl"> + <div class="item safe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="-5"></div> +</div> + +<!-- UNSAFE RTL --> +<br> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: horizontal-tb; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: veritcal-rl; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-rl; direction: rtl;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: ltr;" data-offset-y="15"></div> +</div> + +<div class="container rtl"> + <div class="item unsafe" style="writing-mode: vertical-lr; direction: rtl;" data-offset-y="15"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html new file mode 100644 index 00000000000..dc7df332e40 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-htb-htb.html @@ -0,0 +1,100 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 60px; + height: 60px; +} + +.item { + writing-mode: horizontal-tb; + position: absolute; + background: green; + inset: 5px 10px 5px 10px; +} + +.child::before { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; + width: 100%; + height: 100%; + content: ''; + display: block; +} + +.ar { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<body> + +<div class="container"> + <div class="item child" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item child" style="justify-self: stretch; align-self: start;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item child" style="justify-self: start; align-self: stretch;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item child" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: start;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: stretch;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: start;" data-expected-width="10" data-expected-height="10"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: start;" data-expected-width="40" data-expected-height="40"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: stretch;" data-expected-width="50" data-expected-height="50"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html new file mode 100644 index 00000000000..cd2c9b9abc4 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-htb-vrl.html @@ -0,0 +1,100 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 60px; + height: 60px; +} + +.item { + writing-mode: vertical-rl; + position: absolute; + background: green; + inset: 5px 10px 5px 10px; +} + +.item::before { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; + width: 100%; + height: 100%; + content: ''; + display: block; +} + +.ar { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<body> + +<div class="container"> + <div class="item" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch; align-self: start;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: start; align-self: stretch;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: start;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: stretch;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: start;" data-expected-width="10" data-expected-height="10"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: start;" data-expected-width="40" data-expected-height="40"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: stretch;" data-expected-width="50" data-expected-height="50"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html new file mode 100644 index 00000000000..7b1002191f2 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-vrl-htb.html @@ -0,0 +1,100 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 60px; + height: 60px; +} + +.item { + writing-mode: horizontal-tb; + position: absolute; + background: green; + inset: 5px 10px 5px 10px; +} + +.item::before { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; + width: 100%; + height: 100%; + content: ''; + display: block; +} + +.ar { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<body> + +<div class="container"> + <div class="item" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch; align-self: start;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: start; align-self: stretch;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: start;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: stretch;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: start;" data-expected-width="10" data-expected-height="10"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: start;" data-expected-width="50" data-expected-height="50"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: stretch;" data-expected-width="40" data-expected-height="40"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html new file mode 100644 index 00000000000..10f11a9f12d --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/stretch-intrinsic-size-vrl-vrl.html @@ -0,0 +1,100 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: vertical-rl; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 60px; + height: 60px; +} + +.item { + writing-mode: vertical-rl; + position: absolute; + background: green; + inset: 5px 10px 5px 10px; +} + +.item::before { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; + width: 100%; + height: 100%; + content: ''; + display: block; +} + +.ar { + aspect-ratio: 1/1; + min-width: 20px; + min-height: 20px; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<body> + +<div class="container"> + <div class="item" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch; align-self: start;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: start; align-self: stretch;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: start;" data-expected-width="20" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: start;" data-expected-width="50" data-expected-height="50"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: start; align-self: stretch;" data-expected-width="40" data-expected-height="40"></div> +</div> + +<div class="container"> + <div class="item ar" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></div> +</div> + +<br> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: start;" data-expected-width="10" data-expected-height="10"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: start;" data-expected-width="50" data-expected-height="50"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: start; align-self: stretch;" data-expected-width="40" data-expected-height="40"></canvas> +</div> + +<div class="container"> + <canvas width="10" height="10" class="item" style="justify-self: stretch; align-self: stretch;" data-expected-width="40" data-expected-height="50"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/table-align-self-stretch.html b/tests/wpt/tests/css/css-align/abspos/table-align-self-stretch.html new file mode 100644 index 00000000000..bedd0a56950 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/table-align-self-stretch.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + position: absolute; + background: green; + inset: 5px; + align-self: stretch; + display: table; +} + +.item::before { + content: ''; + display: block; + width: 10px; + height: 20px; +} + +.big::before { + width: 50px; + height: 60px; +} + +.vrl { + writing-mode: vertical-rl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<body> + +<div class="container"> + <div class="item" data-expected-width="10" data-expected-height="30"></div> +</div> + +<div class="container"> + <div class="item big" data-expected-width="50" data-expected-height="60"></div> +</div> + +<div class="container"> + <div class="item vrl" data-expected-width="10" data-expected-height="30"></div> +</div> + +<div class="container"> + <div class="item big vrl" data-expected-width="50" data-expected-height="60"></div> +</div> + +<br> + +<div class="container vrl"> + <div class="item" data-expected-width="30" data-expected-height="20"></div> +</div> + +<div class="container vrl"> + <div class="item big" data-expected-width="50" data-expected-height="60"></div> +</div> + +<div class="container vrl"> + <div class="item vrl" data-expected-width="30" data-expected-height="20"></div> +</div> + +<div class="container vrl"> + <div class="item big vrl" data-expected-width="50" data-expected-height="60"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/abspos/table-justify-self-stretch.html b/tests/wpt/tests/css/css-align/abspos/table-justify-self-stretch.html new file mode 100644 index 00000000000..c409b107140 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/table-justify-self-stretch.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#justify-abspos"> +<style> +body { + margin: 0; +} + +.container { + writing-mode: horizontal-tb; + display: inline-block; + position: relative; + margin: 20px; + border: solid 4px; + width: 40px; + height: 40px; +} + +.item { + writing-mode: horizontal-tb; + position: absolute; + background: green; + inset: 5px; + justify-self: stretch; + display: table; +} + +.item::before { + content: ''; + display: block; + width: 10px; + height: 20px; +} + +.big::before { + width: 50px; + height: 60px; +} + +.vrl { + writing-mode: vertical-rl; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.item')"> + +<body> + +<div class="container"> + <div class="item" data-expected-width="30" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item big" data-expected-width="50" data-expected-height="60"></div> +</div> + +<div class="container"> + <div class="item vrl" data-expected-width="30" data-expected-height="20"></div> +</div> + +<div class="container"> + <div class="item big vrl" data-expected-width="50" data-expected-height="60"></div> +</div> + +<br> + +<div class="container vrl"> + <div class="item" data-expected-width="10" data-expected-height="30"></div> +</div> + +<div class="container vrl"> + <div class="item big" data-expected-width="50" data-expected-height="60"></div> +</div> + +<div class="container vrl"> + <div class="item vrl" data-expected-width="10" data-expected-height="30"></div> +</div> + +<div class="container vrl"> + <div class="item big vrl" data-expected-width="50" data-expected-height="60"></div> +</div> + diff --git a/tests/wpt/tests/css/css-align/blocks/align-content-block-display-coverage.html b/tests/wpt/tests/css/css-align/blocks/align-content-block-display-coverage.html new file mode 100644 index 00000000000..3d581be28c9 --- /dev/null +++ b/tests/wpt/tests/css/css-align/blocks/align-content-block-display-coverage.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align/#distribution-block"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +@import "/fonts/ahem.css"; +body { + font: 10px/1 Ahem; + margin: 0; +} +.target { + height: 50px; + align-content: unsafe center; +} +</style> + +<div class="target"> + <div class="content">foo</div> +</div> + +<script> +const supportedValues = ['block', 'flow', 'flow-root', 'inline-block', + 'list-item', 'flow-root list-item', 'table-caption']; +const unsupportedValues = ['ruby-text']; + +const target = document.querySelector('.target'); +const content = document.querySelector('.content'); +for (let value of supportedValues) { + test(() => { + target.style.display = value; + assert_equals(content.offsetTop, 20); + }, `display:${value} should support align-content`); +} + +for (let value of unsupportedValues) { + test(() => { + target.style.display = value; + assert_not_equals(content.offsetTop, 20); + }, `display:${value} should not support align-content`); +} +</script> diff --git a/tests/wpt/tests/css/css-align/multicol/align-content-multicol.html b/tests/wpt/tests/css/css-align/multicol/align-content-multicol.html new file mode 100644 index 00000000000..d14815930a9 --- /dev/null +++ b/tests/wpt/tests/css/css-align/multicol/align-content-multicol.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-align/#distribution-multicol"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +@import "/fonts/ahem.css"; +body { + font: 10px/1 Ahem; + margin: 0; +} + +#container { + width: 400px; + height: 90px; + columns: 2; + widows: 1; + orphans: 1; +} +</style> + +<div id="container" style="align-content: end;"> + <div>text<br>text</div> + <div style="column-span:all">span</div> + <div>text<br>text</div> +</div> + +<script> +const LINE_HEIGHT = 10; +const Result = { + START: 0, + CENTER: (90 - LINE_HEIGHT * 3) / 2, + END: 90 - LINE_HEIGHT * 3, +}; +const data = [ + ['normal', Result.START], + ['start', Result.START], + ['unsafe start', Result.START], + ['safe start', Result.START], + ['flex-start', Result.START], + ['space-between', Result.START], + ['stretch', Result.START], + ['center', Result.CENTER], + ['unsafe center', Result.CENTER], + ['safe center', Result.CENTER], + ['space-around', Result.CENTER], + ['space-evenly', Result.CENTER], + ['end', Result.END], + ['unsafe end', Result.END], + ['safe end', Result.END], + ['flex-end', Result.END] +]; + +for (let d of data) { + for (let c of ['none', 'size']) { + test(() => { + container.style.alignContent = d[0]; + container.style.contain = c; + const children = container.querySelectorAll('div'); + assert_equals(children[0].offsetTop, d[1]); + assert_equals(children[1].offsetTop, d[1] + LINE_HEIGHT); + assert_equals(children[2].offsetTop, d[1] + LINE_HEIGHT * 2); + }, `align-content: ${d[0]}` + (c == 'none' ? `` : `; contain: ${c}`)); + } +} +</script> diff --git a/tests/wpt/tests/css/css-animations/animate-with-color-mix.html b/tests/wpt/tests/css/css-animations/animate-with-color-mix.html deleted file mode 100644 index 0b6d9bb4ab3..00000000000 --- a/tests/wpt/tests/css/css-animations/animate-with-color-mix.html +++ /dev/null @@ -1,162 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>CSS animaitons with color-mix</title> -</head> -<style> - @keyframes missing-from-legacy-to { - to { background-color: rgb(0, 255, 0); } - } - - @keyframes missing-to-legacy-from { - from { background-color: rgb(0, 255, 0); } - } - - @keyframes missing-from-srgb-to { - to { background-color: color(srgb 0 1 0); } - } - - @keyframes missing-to-srgb-from { - from { background-color: color(srgb 0 1 0); } - } - - @keyframes missing-from-rgba-to { - to { background-color: rgba(255, 255, 255, 0.75); } - } - - @keyframes missing-to-rgba-from { - from { background-color: rgba(255, 255, 255, 0.75); } - } - - #target { - color: black; - background-color: color-mix(in srgb, white 50%, currentColor); - animation-duration: 1s; - animation-timing-function: linear; - animation-play-state: paused; - animation-fill-mode: forwards; - height: 100px; - width: 100px; - } - .missing-from-legacy-to { - animation-name: missing-from-legacy-to; - } - - .missing-to-legacy-from { - animation-name: missing-to-legacy-from; - } - - .missing-from-srgb-to { - animation-name: missing-from-srgb-to; - } - - .missing-to-srgb-from { - animation-name: missing-to-srgb-from; - } - - .missing-from-rgba-to { - background-color: color-mix(in srgb, transparent 50%, currentColor); - animation-name: missing-from-rgba-to; - } - - .missing-to-rgba-from { - background-color: color-mix(in srgb, transparent 50%, currentColor); - animation-name: missing-to-rgba-from; - } - -</style> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/web-animations/testcommon.js"></script> -<script src="/css/support/color-testcommon.js"></script> - -<body> - <div id="target"></div> - <div id="test"></div> -</body> -<script> - 'use strict'; - - async function runAnimationTest(t, name, expected_colors) { - const target = document.getElementById('target'); - target.classList.add(name); - t.add_cleanup(() => { - target.classList.remove(name); - }); - const anim = document.getAnimations()[0]; - await anim.ready; - expected_colors.forEach(data => { - anim.currentTime = 1000 * data.at; - const actual = getComputedStyle(target).backgroundColor; - const expected = data.value; - assert_oklab_color( - actual, expected, - `Background color at ${100*data.at}% animation progress`); - }); - } - - const gray_to_green = [ - { at: 0, value: 'oklab(0.5981 0.0000 0.0000)' }, - { at: 0.25, value: 'oklab(0.6652 -0.0584 0.0449)' }, - { at: 0.5, value: 'oklab(0.7323 -0.1169 0.0898)' }, - { at: 0.75, value: 'oklab(0.7994 -0.1754 0.1346)' }, - { at: 1, value: 'oklab(0.8664 -0.2338 0.1795)' } - ]; - - const green_to_gray = [ - { at: 0, value: 'oklab(0.8664 -0.2338 0.1795)' }, - { at: 0.25, value: 'oklab(0.7994 -0.1754 0.1346)' }, - { at: 0.5, value: 'oklab(0.7323 -0.1169 0.0898)' }, - { at: 0.75, value: 'oklab(0.6652 -0.0584 0.0449)' }, - { at: 1, value: 'oklab(0.5981 0.0000 0.0000)' } - ]; - - const translucent_black_to_white = [ - { at: 0, value: 'oklab(0.5981 0 0)' }, - { at: 0.25, value: 'oklab(0.6784 0 0 / 0.9373)' }, - { at: 0.5, value: 'oklab(0.7702 0 0 / 0.8745)' }, - { at: 0.75, value: 'oklab(0.8762 0 0 / 0.8118)' }, - { at: 1, value: 'oklab(1 0 0 / 0.75)' } - ]; - - const translucent_white_to_black = [ - { at: 0, value: 'oklab(1 0 0 / 0.75)' }, - { at: 0.25, value: 'oklab(0.8762 0 0 / 0.8118)' }, - { at: 0.5, value: 'oklab(0.7702 0 0 / 0.8745)' }, - { at: 0.75, value: 'oklab(0.6784 0 0 / 0.9373)' }, - { at: 1, value: 'oklab(0.5981 0 0)' } - ]; - - window.onload = async () => { - promise_test(t => { - return runAnimationTest(t, 'missing-from-legacy-to', gray_to_green); - }, 'Animate from neutral keyframe with color-mix to legacy rgb'); - - promise_test(t => { - return runAnimationTest(t, 'missing-to-legacy-from', green_to_gray); - }, 'Animate from legacy rgb to neutral keyframe with color-mix'); - - promise_test(t => { - return runAnimationTest(t, 'missing-from-srgb-to', gray_to_green); - }, 'Animate from neutral keyframe with color-mix to srgb'); - - promise_test(t => { - return runAnimationTest(t, 'missing-to-srgb-from', green_to_gray); - }, 'Animate from srgb to neutral keyframe with color-mix'); - - promise_test(t => { - return runAnimationTest(t, 'missing-from-rgba-to', - translucent_black_to_white); - }, 'Animate from color-mix with transparency to legacy rgba'); - - promise_test(t => { - return runAnimationTest(t, 'missing-to-rgba-from', - translucent_white_to_black); - }, 'Animate from legacy rgba to color-mix with transparency'); - }; - -</script> -</html> diff --git a/tests/wpt/tests/css/css-animations/animation-css-variable-dependent-property.html b/tests/wpt/tests/css/css-animations/animation-css-variable-dependent-property.html new file mode 100644 index 00000000000..26d183f116a --- /dev/null +++ b/tests/wpt/tests/css/css-animations/animation-css-variable-dependent-property.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Animations: Dependent property updates correctly when animating a declared custom property</title> +<link rel="help" href="https://drafts.csswg.org/css-animations/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/testcommon.js"></script> +<style> +@property --c { + syntax: "<color>"; + inherits: true; + initial-value: black; +} +@keyframes color-shift { + 0% { + --c: black; + } + 100% { + --c: white; + } +} +#target { + color: var(--c); + animation: color-shift 1s linear 1 forwards paused +} +</style> +<div id=target></div> +<div id="log"></div> +<script> + +test(t => { + const animation = target.getAnimations()[0]; + + assert_equals( + getComputedStyle(target).color, + 'rgb(0, 0, 0)' + ); + + animation.currentTime = 500; + + assert_equals( + getComputedStyle(target).color, + 'rgb(128, 128, 128)' + ); + + animation.currentTime = 1000; + + assert_equals( + getComputedStyle(target).color, + 'rgb(255, 255, 255)' + ); + +}, 'Dependent property updates correctly'); + +</script> diff --git a/tests/wpt/tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html b/tests/wpt/tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html new file mode 100644 index 00000000000..961104a8209 --- /dev/null +++ b/tests/wpt/tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>Setting 'animation-iteration-count: infinite' after a CSS Animation is completed restarts the animation</title> +<link rel="help" href="https://www.w3.org/TR/css-animations-1/#animation-iteration-count"> +<style> + +@keyframes anim { + to { margin-left: 100px } +} + +</style> +</head> +<body> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="target"></div> +<script> + +promise_test(async test => { + const target = document.getElementById("target"); + target.style.animation = "anim 0.1s linear"; + + const initialAnimations = target.getAnimations(); + assert_equals(initialAnimations.length, 1, "An animation runs initially."); + + await initialAnimations[0].finished; + assert_equals(target.getAnimations().length, 0, "An animation no longer runs after its completion."); + + await new Promise(setTimeout); + target.style.animationIterationCount = "infinite"; + assert_equals(target.getAnimations().length, 1, "An animation runs again once animation-iteration-count is set."); +}, "Setting 'animation-iteration-count: infinite' after a CSS Animation is completed restarts the animation."); + +</script> +</body> +</html> diff --git a/tests/wpt/tests/css/css-backgrounds/background-clip-padding-box-with-border-radius.html b/tests/wpt/tests/css/css-backgrounds/background-clip-padding-box-with-border-radius.html index 8595caec7bb..22d7bd9d297 100644 --- a/tests/wpt/tests/css/css-backgrounds/background-clip-padding-box-with-border-radius.html +++ b/tests/wpt/tests/css/css-backgrounds/background-clip-padding-box-with-border-radius.html @@ -8,6 +8,7 @@ <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-clip" /> <link rel="help" href="http://www.w3.org/TR/css3-background/#corner-shaping" /> <link rel="match" href="reference/background-clip-padding-box-with-border-radius-ref.html" /> +<meta name="fuzzy" content="maxDifference=0-29;totalPixels=0-80" /> <meta name="assert" content="Backgrounds clipped to the padding box should follow the padding box curve, which should be equal to the outer border radius minus the corresponding border thickness." /> <style> div { @@ -76,4 +77,4 @@ div { </div> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/tests/css/css-backgrounds/background-image-007.html b/tests/wpt/tests/css/css-backgrounds/background-image-007.html index 9bccd2d364a..b532dd6397c 100644 --- a/tests/wpt/tests/css/css-backgrounds/background-image-007.html +++ b/tests/wpt/tests/css/css-backgrounds/background-image-007.html @@ -32,7 +32,9 @@ div::first-letter { background-color: red; - background-image: url("support/1x1-green.png"), url("../support/60x60-red.png"); + background-image: + url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' style='background: green'></svg>"), + url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' style='background: red'></svg>"); font-family: Ahem; font-size: 100px; } diff --git a/tests/wpt/tests/css/css-backgrounds/background-position/background-position-right-in-body.html b/tests/wpt/tests/css/css-backgrounds/background-position/background-position-right-in-body.html new file mode 100644 index 00000000000..4c4024e2e59 --- /dev/null +++ b/tests/wpt/tests/css/css-backgrounds/background-position/background-position-right-in-body.html @@ -0,0 +1,16 @@ +<!doctype html> +<title>background-position with 'right' edge keywords when painting background for body in offset document root</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#background-position"> +<link rel="match" href="../../filter-effects/reference/green-100x100.html"> +<style> + html { + margin: 8px; + } + body { + background-image: linear-gradient(green, green), linear-gradient(red, red); + background-size: 100px 100px, 100px 100px; + background-position: right 100% top 0%, left 0% top 0%; + background-repeat: no-repeat; + } +</style> +<body></body> diff --git a/tests/wpt/tests/css/css-backgrounds/parsing/background-image-invalid.html b/tests/wpt/tests/css/css-backgrounds/parsing/background-image-invalid.html index c971811441e..8a48d5efe80 100644 --- a/tests/wpt/tests/css/css-backgrounds/parsing/background-image-invalid.html +++ b/tests/wpt/tests/css/css-backgrounds/parsing/background-image-invalid.html @@ -25,6 +25,10 @@ test_invalid_value("background-image", "radial-gradient(20px -30px at center, re test_invalid_value("background-image", "repeating-radial-gradient(20px -30px ellipse at center, red, blue)"); test_invalid_value("background-image", "cross-fade(auto blue, 50% red)"); +test_invalid_value("background-image", "cross-fade(1px red, green)"); +test_invalid_value("background-image", "cross-fade(calc(1% + 1px) red, green)"); +test_invalid_value("background-image", "cross-fade(-1% red, green)"); +test_invalid_value("background-image", "cross-fade(101% red, green)"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-backgrounds/parsing/background-image-valid.html b/tests/wpt/tests/css/css-backgrounds/parsing/background-image-valid.html index 7632a6b7c6d..da08a638853 100644 --- a/tests/wpt/tests/css/css-backgrounds/parsing/background-image-valid.html +++ b/tests/wpt/tests/css/css-backgrounds/parsing/background-image-valid.html @@ -30,6 +30,10 @@ test_valid_value( test_valid_value( "background-image", "cross-fade(blue, linear-gradient(90deg, rgb(2, 0, 36) 0%, rgb(0, 212, 255) 100%))"); +test_valid_value("background-image", "cross-fade( 1% red, green)", "cross-fade(1% red, green)"); +test_valid_value("background-image", "cross-fade(1% red , green)", "cross-fade(1% red, green)"); +test_valid_value("background-image", "cross-fade(1% red, green )", "cross-fade(1% red, green)"); +test_valid_value("background-image", "cross-fade(1% red, cross-fade(2% red, green))"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box-ref.html index 733210ab6a2..1bf307b0d53 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -22,19 +29,21 @@ div#multiple { background-image: url('../background-origin/support/yellow-orange-blue-160x160.png'); + bottom: 288px; margin-top: 8px; + position: relative; } div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; position: relative; - right: 514px; width: 482px; } </style> <div class="image"><img src="../background-origin/support/yellow-orange-blue-160x160.png" alt="Image download support must be enabled"></div><div class="light-blue-border"></div><br> -<div class="image" id="multiple"></div><div class="light-blue-border"></div> +<div class="image" id="multiple"></div><div class="light-blue-border" style="bottom: 576px;"></div> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_position-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_position-ref.html index 32d50ccc819..f965bba210f 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_position-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_position-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -31,8 +38,8 @@ div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; - right: 514px; width: 482px; } </style> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_radius-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_radius-ref.html index bfbe96cdce9..d84aa377580 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_radius-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_radius-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { border-radius: 60px; @@ -28,19 +35,21 @@ div#multiple { background-image: url('../background-origin/support/yellow-orange-blue-160x160.png'); + bottom: 288px; margin-top: 8px; + position: relative; } div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; position: relative; - right: 514px; width: 482px; } </style> <div class="image"><img src="../background-origin/support/yellow-orange-blue-160x160.png" alt="Image download support must be enabled"></div><div class="light-blue-border"></div><br> -<div class="image" id="multiple"></div><div class="light-blue-border"></div> +<div class="image" id="multiple"></div><div class="light-blue-border" style="bottom: 576px;"></div> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_size-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_size-ref.html index 526ddbbced9..99697422f2c 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_size-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-border-box_with_size-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -23,19 +30,21 @@ { background-image: url('../background-origin/support/yellow-orange-blue-160x160.png'); background-size: 257px auto; + bottom: 288px; margin-top: 8px; + position: relative; } div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; - position: relative; - right: 514px; width: 482px; + position: relative; } </style> -<div class="image"><img src="../background-origin/support/yellow-orange-blue-160x160.png" width="257" alt="Image download support must be enabled"></div><div class="light-blue-border"></div><br> +<div class="image"><img src="../background-origin/support/yellow-orange-blue-160x160.png" width="257" alt="Image download support must be enabled"></div><div class="light-blue-border"></div> -<div class="image" id="multiple"></div><div class="light-blue-border"></div> +<div class="image" id="multiple"></div><div class="light-blue-border" style="bottom: 576px;"></div> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_position-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_position-ref.html index 960bf7e2dc3..483e180bfa8 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_position-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_position-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -29,9 +36,9 @@ div.light-blue-border { + bottom: 288px; border: 16px solid rgba(60, 150, 255, 0.4); height: 256px; - right: 514px; width: 482px; } </style> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_size-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_size-ref.html index 87390d63161..cc429f661ec 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_size-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-content-box_with_size-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -31,19 +38,21 @@ background-image: url('../background-origin/support/yellow-orange-blue-160x160.png'); background-position: 32px 32px; background-size: 225px auto; + bottom: 288px; margin-top: 8px; + position: relative; } div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; position: relative; - right: 514px; width: 482px; } </style> <div class="image"><img src="../background-origin/support/yellow-orange-blue-160x160.png" width="225" alt="Image download support must be enabled"></div><div class="light-blue-border"></div><br> -<div class="image" id="multiple"></div><div class="light-blue-border"></div> +<div class="image" id="multiple"></div><div class="light-blue-border" style="bottom: 576px;"></div> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_position-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_position-ref.html index be30c7f0b09..6a96a9e3796 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_position-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_position-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -30,8 +37,8 @@ div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; - right: 514px; width: 482px; } </style> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_size-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_size-ref.html index bb39958b17d..d71bb83045d 100644 --- a/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_size-ref.html +++ b/tests/wpt/tests/css/css-backgrounds/reference/origin-padding-box_with_size-ref.html @@ -7,6 +7,13 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> + body + { + height: 568px; + overflow-y: hidden; + width: 584px; + } + div { display: inline-block; @@ -31,19 +38,21 @@ background-image: url('../background-origin/support/yellow-orange-blue-160x160.png'); background-position: 16px 16px; background-size: 241px auto; + bottom: 288px; margin-top: 8px; + position: relative; } div.light-blue-border { border: 16px solid rgba(60, 150, 255, 0.4); + bottom: 288px; height: 256px; position: relative; - right: 514px; width: 482px; } </style> <div class="image"><img src="../background-origin/support/yellow-orange-blue-160x160.png" width="241" alt="Image download support must be enabled"></div><div class="light-blue-border"></div><br> -<div class="image" id="multiple"></div><div class="light-blue-border"></div> +<div class="image" id="multiple"></div><div class="light-blue-border" style="bottom: 576px;"></div> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/table-cell-background-local-002-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/table-cell-background-local-002-ref.html new file mode 100644 index 00000000000..3fbb9f848ca --- /dev/null +++ b/tests/wpt/tests/css/css-backgrounds/reference/table-cell-background-local-002-ref.html @@ -0,0 +1,21 @@ + <!DOCTYPE html> + + <meta charset="UTF-8"> + + <title>CSS Reftest reference</title> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + + <style> + div + { + background-color: green; + height: 100px; + margin: 120px 0px 0px 104px; + width: 100px; + } + </style> + + <p>Test passes if there is a filled green square and <strong>no red</strong>. + + <div></div> diff --git a/tests/wpt/tests/css/css-backgrounds/reference/table-cell-background-local-003-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/table-cell-background-local-003-ref.html new file mode 100644 index 00000000000..6708df44ce4 --- /dev/null +++ b/tests/wpt/tests/css/css-backgrounds/reference/table-cell-background-local-003-ref.html @@ -0,0 +1,32 @@ + <!DOCTYPE html> + + <meta charset="UTF-8"> + + <title>CSS Reftest reference</title> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + + <style> + div#outer + { + height: 100px; + margin: 120px 0px 0px 104px; + overflow: auto; + width: 100px; + } + + div#inner + { + background-color: green; + height: 300px; + width: 300px; + } + </style> + + <body onload="document.getElementById('outer').scrollTop = 200; document.getElementById('outer').scrollLeft = 200;"> + + <p>Test passes if there is a filled green square and <strong>no red</strong>. + + <div id="outer"> + <div id="inner"></div> + </div> diff --git a/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-002.html b/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-002.html new file mode 100644 index 00000000000..5398ce8eff7 --- /dev/null +++ b/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-002.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> + + <meta charset="UTF-8"> + + <title>CSS Backgrounds and Borders Test: table cell background-image with local attachment</title> + + <!-- + + Created: December 8th 2023 + + Last modified: December 8th 2023 + + --> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + <link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#background-attachment"> + <link rel="help" href="https://www.w3.org/TR/css-overflow-3/#overflow-control"> + <link rel="match" href="reference/table-cell-background-local-002-ref.html"> + + <style> + td + { + height: 100px; + padding: 0px; + vertical-align: top; + width: 100px; + } + + td#middle-cell + { + background: url("support/500x500-red-with-green-center.png") local; + overflow: hidden; + } + + div#outer + { + height: 0px; + width: 0px; + } + + div#inner + { + height: 300px; + width: 300px; + } + </style> + + <body onload="document.getElementById('middle-cell').scrollTop = 200; document.getElementById('middle-cell').scrollLeft = 200;"> + + <p>Test passes if there is a filled green square and <strong>no red</strong>. + + <table> + + <tr><td><td><td> + + <tr> + <td> + <td id="middle-cell"> + <div id="outer"> + <div id="inner"></div> + </div> + <td> + + <tr><td><td><td> + + </table> diff --git a/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html b/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html new file mode 100644 index 00000000000..e2662bec1fa --- /dev/null +++ b/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> + + <meta charset="UTF-8"> + + <title>CSS Backgrounds and Borders Test: table cell background-image with local attachment</title> + + <!-- + + Created: December 8th 2023 + + Last modified: December 8th 2023 + + --> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + <link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#background-attachment"> + <link rel="help" href="https://www.w3.org/TR/css-overflow-3/#overflow-control"> + <link rel="match" href="reference/table-cell-background-local-003-ref.html"> + + <style> + td + { + height: 100px; + padding: 0px; + vertical-align: top; + width: 100px; + } + + td#middle-cell + { + background: url("support/500x500-red-with-green-center.png") local; + overflow: auto; + } + + div#outer + { + height: 0px; + width: 0px; + } + + div#inner + { + height: 300px; + width: 300px; + } + </style> + + <body onload="document.getElementById('middle-cell').scrollTop = 200; document.getElementById('middle-cell').scrollLeft = 200;"> + + <p>Test passes if there is a filled green square and <strong>no red</strong>. + + <table> + + <tr><td><td><td> + + <tr> + <td> + <td id="middle-cell"> + <div id="outer"> + <div id="inner"></div> + </div> + <td> + + <tr><td><td><td> + + </table> diff --git a/tests/wpt/tests/css/css-break/become-unfragmented-001.html b/tests/wpt/tests/css/css-break/become-unfragmented-001.html new file mode 100644 index 00000000000..df104fc494d --- /dev/null +++ b/tests/wpt/tests/css/css-break/become-unfragmented-001.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> + <link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1285795"> + <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 style="width:100px; height:100px; background:red;"> + <div id="mc" style="columns:4; column-fill:auto; width:100px; height:25px;"> + <div> + <div style="width:100px; height:100px; background:green;"></div> + </div> + </div> + </div> + <script> + requestAnimationFrame(()=> { + requestAnimationFrame(()=> { + mc.style.columns = 'auto'; + document.documentElement.classList.remove("reftest-wait"); + }); + }); + </script> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print-ref.html b/tests/wpt/tests/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print-ref.html new file mode 100644 index 00000000000..de6bd49c922 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print-ref.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1743890"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { margin: 0; } + + .flexbox { + display: block; + border: 0.25in solid black; + font-size: 0.25in; + } + .item { + width: 100%; + } + </style> + + <!-- This div makes the flexbox not at the top of first page. --> + <div style="height: 1in; background: gray;"></div> + + <div class="flexbox"> + <div class="item">1<br>2<br>3<br>4</div> + <div class="item">5</div> + </div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print.html b/tests/wpt/tests/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print.html new file mode 100644 index 00000000000..4fd577cc421 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/multi-line-row-flex-fragmentation-080-print.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- This test is adapted from https://bugzilla.mozilla.org/show_bug.cgi?id=1677339#c0 --> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1743890"> + <link rel="match" href="multi-line-row-flex-fragmentation-080-print-ref.html"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { margin: 0; } + + .flexbox { + display: flex; + border: 0.25in solid black; + font-size: 0.25in; + flex-flow: row wrap; + } + .item { + width: 100%; + } + </style> + + <!-- This div makes the flexbox not at the top of first page. --> + <div style="height: 1in; background: gray;"></div> + + <div class="flexbox"> + <div class="item">1<br>2<br>3<br>4</div> + <div class="item">5</div> + </div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print-ref.html b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print-ref.html new file mode 100644 index 00000000000..07d0c637667 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print-ref.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: block; + border: 0.25in solid black; + } + .flexbox table { + border-spacing: 0; + } + .flexbox thead, .flexbox tfoot { + background: gold; + } + .text, tr { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <table> + <thead><tr><td>Header</td></tr></thead> + <tfoot><tr><td>Footer</td></tr></tfoot> + <tbody> + <tr><td>1</td></tr> + <tr><td>2</td></tr> + <tr><td>3</td></tr> + <tr><td>4</td></tr> + <tr><td>5</td></tr> + <tr><td>6</td></tr> + <tr><td>7</td></tr> + </tbody> + </table> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print.html b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print.html new file mode 100644 index 00000000000..14a5dc6ac0c --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-065-print.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- This test is adapted from https://bugzilla.mozilla.org/show_bug.cgi?id=1744363#c9 --> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + <link rel="match" href="single-line-column-flex-fragmentation-065-print-ref.html"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: flex; /* This triggers the bug. */ + display: column; + border: 0.25in solid black; + } + .flexbox table { + border-spacing: 0; + } + .flexbox thead, .flexbox tfoot { + background: gold; + } + .text, tr { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <table> + <thead><tr><td>Header</td></tr></thead> + <tfoot><tr><td>Footer</td></tr></tfoot> + <tbody> + <tr><td>1</td></tr> + <tr><td>2</td></tr> + <tr><td>3</td></tr> + <tr><td>4</td></tr> + <tr><td>5</td></tr> + <tr><td>6</td></tr> + <tr><td>7</td></tr> + </tbody> + </table> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print-ref.html b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print-ref.html new file mode 100644 index 00000000000..100fcca0840 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print-ref.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: block; + border: 0.25in solid black; + } + .text { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <div> + <div>1</div> + <div style="break-after: page">2</div> + <div>3</div> + <div>4</div> + </div> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print.html b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print.html new file mode 100644 index 00000000000..4ee00f3601d --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-066-print.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- This test is adapted from https://bugzilla.mozilla.org/show_bug.cgi?id=1663079#c8 --> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + <link rel="match" href="single-line-column-flex-fragmentation-066-print-ref.html"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: flex; /* This triggers the bug. */ + flex-direction: column; + border: 0.25in solid black; + } + .text { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <div> + <div>1</div> + <div style="break-after: page">2</div> + <div>3</div> + <div>4</div> + </div> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-067.html b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-067.html new file mode 100644 index 00000000000..6ee57d1852d --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-column-flex-fragmentation-067.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tests that a percentage height is resolved correctly in a flex item in fragmented context.</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://drafts.csswg.org/css-flexbox-1/#pagination"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> +<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 style="width: 100px; height: 100px; columns: 2; column-gap: 0; column-fill: auto; background: red;"> + <div style="display: flex; flex-direction: column; height: 200px;"> + <div style="flex: none;"> + <div style="width: 50px; height: 100%; background: green;"></div> + <div style="contain: size; width: 50px; height: 100px; background: green;"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print-ref.html b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print-ref.html new file mode 100644 index 00000000000..07d0c637667 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print-ref.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: block; + border: 0.25in solid black; + } + .flexbox table { + border-spacing: 0; + } + .flexbox thead, .flexbox tfoot { + background: gold; + } + .text, tr { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <table> + <thead><tr><td>Header</td></tr></thead> + <tfoot><tr><td>Footer</td></tr></tfoot> + <tbody> + <tr><td>1</td></tr> + <tr><td>2</td></tr> + <tr><td>3</td></tr> + <tr><td>4</td></tr> + <tr><td>5</td></tr> + <tr><td>6</td></tr> + <tr><td>7</td></tr> + </tbody> + </table> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print.html b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print.html new file mode 100644 index 00000000000..f51d0d161f8 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-045-print.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- This test is adapted from https://bugzilla.mozilla.org/show_bug.cgi?id=1744363#c9 --> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + <link rel="match" href="single-line-row-flex-fragmentation-045-print-ref.html"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: flex; /* This triggers the bug. */ + border: 0.25in solid black; + } + .flexbox table { + border-spacing: 0; + } + .flexbox thead, .flexbox tfoot { + background: gold; + } + .text, tr { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <table> + <thead><tr><td>Header</td></tr></thead> + <tfoot><tr><td>Footer</td></tr></tfoot> + <tbody> + <tr><td>1</td></tr> + <tr><td>2</td></tr> + <tr><td>3</td></tr> + <tr><td>4</td></tr> + <tr><td>5</td></tr> + <tr><td>6</td></tr> + <tr><td>7</td></tr> + </tbody> + </table> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print-ref.html b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print-ref.html new file mode 100644 index 00000000000..100fcca0840 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print-ref.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: block; + border: 0.25in solid black; + } + .text { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <div> + <div>1</div> + <div style="break-after: page">2</div> + <div>3</div> + <div>4</div> + </div> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print.html b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print.html new file mode 100644 index 00000000000..2c934c303db --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-046-print.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- This test is adapted from https://bugzilla.mozilla.org/show_bug.cgi?id=1663079#c8 --> +<html> + <meta charset="utf-8"> + <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://drafts.csswg.org/css-flexbox-1/#pagination"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> + <link rel="match" href="single-line-row-flex-fragmentation-046-print-ref.html"> + + <style> + @page { size: 5in 3in; margin: 0.5in; } + body { + margin: 0; + } + .flexbox { + display: flex; /* This triggers the bug. */ + border: 0.25in solid black; + } + .text { + block-size: 0.25in; + } + </style> + + <div class="text">Before Flexbox</div> + <div class="flexbox"> + <div> + <div>1</div> + <div style="break-after: page">2</div> + <div>3</div> + <div>4</div> + </div> + </div> + <div class="text">After Flexbox</div> +</html> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-047.html b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-047.html new file mode 100644 index 00000000000..061e62f3c36 --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-047.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tests that a percentage height is resolved correctly in a flex item in fragmented context.</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://drafts.csswg.org/css-flexbox-1/#pagination"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> +<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 style="width: 100px; height: 100px; columns: 2; column-gap: 0; column-fill: auto; background: red;"> + <div style="display: flex; min-height: 100px;"> + <div style="width: 100px"> + <div style="width: 50px; height: 100%; background: green;"></div> + <div style="width: 50px; height: 100px; background: green;"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-048.html b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-048.html new file mode 100644 index 00000000000..96a302716ca --- /dev/null +++ b/tests/wpt/tests/css/css-break/flexbox/single-line-row-flex-fragmentation-048.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tests that a flex item with aspect-ratio applies the automatic content-based block-size in fragmented context.</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://drafts.csswg.org/css-flexbox-1/#pagination"> +<link rel="help" herf="https://drafts.csswg.org/css-sizing-4/#aspect-ratio-minimum"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1744363"> +<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 style="width: 100px; height: 100px; columns: 2; column-gap: 0; column-fill: auto; background: red;"> + <div style="display: flex;"> + <div style="width: 50px; aspect-ratio: 1/2; background: green;"> + <div style="height: 200px;"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-break/float-017-ref.html b/tests/wpt/tests/css/css-break/float-017-ref.html new file mode 100644 index 00000000000..2be6253c053 --- /dev/null +++ b/tests/wpt/tests/css/css-break/float-017-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<p>The numbers from 1 to 10 should be seen below. Each number only once.</p> +<div style="width:20em; line-height:20px;"> + <div style="float:left; width:10em;"> + 1<br> + 2<br> + 3<br> + 4<br> + 5<br> + </div> + <div style="float:left;"> + 6<br> + 7<br> + 8<br> + 9<br> + 10<br> + </div> +</div> diff --git a/tests/wpt/tests/css/css-break/float-017.html b/tests/wpt/tests/css/css-break/float-017.html new file mode 100644 index 00000000000..5ca1f80a4e8 --- /dev/null +++ b/tests/wpt/tests/css/css-break/float-017.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1506393"> +<link rel="match" href="float-017-ref.html"> +<p>The numbers from 1 to 10 should be seen below. Each number only once.</p> +<div style="width:20em; columns:4; gap:0; column-fill:auto; height:100px; line-height:20px; orphans:1; widows:1;"> + 1<br> + <div style="float:right; contain:size; width:100%; height:200px;"></div> + <div style="display:flow-root; width:100%;"> + 2<br> + 3<br> + <div style="float:right; break-inside:avoid; width:10px; height:200px;"></div> + 4<br> + 5<br> + 6<br> + 7<br> + 8<br> + 9<br> + 10<br> + </div> +</div> diff --git a/tests/wpt/tests/css/css-color/parsing/color-valid-rgb.html b/tests/wpt/tests/css/css-color/parsing/color-valid-rgb.html index a979dbc484f..a4995ac7ff9 100644 --- a/tests/wpt/tests/css/css-color/parsing/color-valid-rgb.html +++ b/tests/wpt/tests/css/css-color/parsing/color-valid-rgb.html @@ -41,6 +41,10 @@ test_valid_value("color", "rgba(-20% 20% 40% / 50%)", "rgba(0, 51, 102, 0.5)"); test_valid_value("color", "rgba(257 30 40 / 50%)", "rgba(255, 30, 40, 0.5)"); test_valid_value("color", "rgba(250% 20% 40% / .5)", "rgba(255, 51, 102, 0.5)"); +// Test with mixed components. +test_valid_value("color", "rgb(250% 51 40%)", "rgb(255, 51, 102)"); +test_valid_value("color", "rgb(255 20% 102)", "rgb(255, 51, 102)"); + // rgb are in the range [0, 255], alpha is in the range [0, 1]. // Values above or below these numbers should get resolved to the upper/lower bound. test_valid_value("color", "rgb(500, 0, 0)", "rgb(255, 0, 0)"); diff --git a/tests/wpt/tests/css/css-conditional/at-supports-048-ref.html b/tests/wpt/tests/css/css-conditional/at-supports-048-ref.html new file mode 100644 index 00000000000..414d9bf6f4c --- /dev/null +++ b/tests/wpt/tests/css/css-conditional/at-supports-048-ref.html @@ -0,0 +1,23 @@ +<!doctype html> +<html> + <head> + <title>CSS Test (Conditional Rules): Mixing @supports and CSS nesting</title> + <link rel="author" title="Matthieu Dubet" href="m_dubet@apple.com"> + <link rel="help" href="http://www.w3.org/TR/css3-conditional/#at-supports"> + <style> + div { + background:red; + height:100px; + width:100px; + margin: 10px; + border: solid 1px black; + background-color: green; + } + </style> + </head> + + <p>Test passes if there are only green rectangles. + <div class="test-1"></div> + <div class="test-2"></div> + <div class="test-3"></div> +</html> diff --git a/tests/wpt/tests/css/css-conditional/at-supports-048.html b/tests/wpt/tests/css/css-conditional/at-supports-048.html new file mode 100644 index 00000000000..dc0ed9dc425 --- /dev/null +++ b/tests/wpt/tests/css/css-conditional/at-supports-048.html @@ -0,0 +1,41 @@ +<!doctype html> +<html> + <head> + <title>CSS Test (Conditional Rules): Mixing @supports and CSS nesting</title> + <link rel="author" title="Matthieu Dubet" href="m_dubet@apple.com"> + <link rel="help" href="http://www.w3.org/TR/css3-conditional/#at-supports"> + <link rel="match" href="at-supports-048-ref.html"> + <style> + div { + background:red; + height:100px; + width:100px; + margin: 10px; + border: solid 1px black; + } + .test-1 { + background-color: red; + @supports (background-color: red) { + background-color: green; + } + } + .test-2 { + background-color: green; + @supports (invalid-declaration: foobar) { + background-color: red; + } + } + .test-3 { + background-color: green; + @supports (color: red) { + color: red; + } + } + </style> + </head> + + <p>Test passes if there are only green rectangles. + <div class="test-1"></div> + <div class="test-2"></div> + <div class="test-3"></div> +</html> diff --git a/tests/wpt/tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html b/tests/wpt/tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html index cff0dc2d277..daec039e406 100644 --- a/tests/wpt/tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html +++ b/tests/wpt/tests/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html @@ -85,10 +85,9 @@ const properties = [ "-moz-tab-size", "-moz-text-align-last", "-moz-text-size-adjust", - // No -moz-transform here, because it might intentionally break the + // No -moz-transform/origin here, because it might intentionally break the // expectations of this test for compat reasons, see: // https://bugzilla.mozilla.org/show_bug.cgi?id=1865332 - "-moz-transform-origin", "-moz-transform-style", "-moz-transition", "-moz-transition-delay", diff --git a/tests/wpt/tests/css/css-contain/contain-inline-size-grid-stretches-auto-rows.html b/tests/wpt/tests/css/css-contain/contain-inline-size-grid-stretches-auto-rows.html new file mode 100644 index 00000000000..c168950929d --- /dev/null +++ b/tests/wpt/tests/css/css-contain/contain-inline-size-grid-stretches-auto-rows.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#algo-stretch"> +<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="grid with inline-size containment, and min-height will still distribute extra space to auto rows"> +<style> +grid { + display: grid; + min-height: 100px; + grid-template-rows: auto; + contain: inline-size; +} +.absolute { + position: absolute; +} +.align-end { + align-self: end; +} +.item { + width: 100px; + height: 50px; + background-color: green; +} +</style> +</head> +<body> + <p>Test passes if there is a filled green square.</p> + <grid> + <div class="absolute item"></div> + <div class="item align-end"></div> + </grid> +</body> +</html> diff --git a/tests/wpt/tests/css/css-contain/contain-size-grid-stretches-auto-rows.html b/tests/wpt/tests/css/css-contain/contain-size-grid-stretches-auto-rows.html new file mode 100644 index 00000000000..10b84665aa9 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/contain-size-grid-stretches-auto-rows.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#size-containment"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#algo-stretch"> +<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="grid with size containment, and min-height will still distribute extra space to auto rows"> +<style> +grid { + display: grid; + min-height: 100px; + grid-template-rows: auto; + contain: size; +} +.absolute { + position: absolute; +} +.align-end { + align-self: end; +} +.item { + width: 100px; + height: 50px; + background-color: green; +} +</style> +</head> +<body> + <p>Test passes if there is a filled green square.</p> + <grid> + <div class="absolute item"></div> + <div class="item align-end"></div> + </grid> +</body> +</html> diff --git a/tests/wpt/tests/css/css-contain/container-queries/container-for-cue-ref.html b/tests/wpt/tests/css/css-contain/container-queries/container-for-cue-ref.html index 48b26223639..40b0a07ae01 100644 --- a/tests/wpt/tests/css/css-contain/container-queries/container-for-cue-ref.html +++ b/tests/wpt/tests/css/css-contain/container-queries/container-for-cue-ref.html @@ -16,8 +16,8 @@ <body> <video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <track default src="support/test.vtt"> - <source src="/media/white.webm" type="video/webm"> <source src="/media/white.mp4" type="video/mp4"> + <source src="/media/white.webm" type="video/webm"> </video> </body> </html> diff --git a/tests/wpt/tests/css/css-contain/container-queries/container-for-cue.html b/tests/wpt/tests/css/css-contain/container-queries/container-for-cue.html index f53d161db0d..a460f79af06 100644 --- a/tests/wpt/tests/css/css-contain/container-queries/container-for-cue.html +++ b/tests/wpt/tests/css/css-contain/container-queries/container-for-cue.html @@ -19,8 +19,8 @@ </head> <body> <video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> - <source src="/media/white.webm" type="video/webm"> <source src="/media/white.mp4" type="video/mp4"> + <source src="/media/white.webm" type="video/webm"> <track default src="support/test.vtt"> </video> </body> diff --git a/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-1505250-crash.html b/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-1505250-crash.html new file mode 100644 index 00000000000..befbfd33af7 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-1505250-crash.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title>::first-letter depending on size container query with changing list-style-type</title> +<link rel="help" href="https://crbug.com/1505250"> +<style> + div::first-letter{ + color: green; + } + div:only-of-type { + container-type: size; + list-style: my-circle inside; + } +</style> +<div>X + <div></div> + <script>document.body.offsetTop</script> +</div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075-ref.html index e0c485c59f3..6d33015466c 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075-ref.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075-ref.html @@ -4,7 +4,7 @@ <title>CSS Content Visibility: auto + scrollIntoView/fragment nav when size estimate is off (reference)</title> <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> @@ -18,6 +18,7 @@ #target { position: absolute; bottom: 0; + font: 25px/1 Ahem; } </style> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075.html index f7f834a68bb..ade27bdfaa7 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-075.html @@ -6,7 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="content-visibility-075-ref.html"> <meta name="assert" content="With content-visibility: auto, scrollIntoView targets the right element"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> @@ -21,6 +21,7 @@ #target { position: absolute; bottom: 0; + font: 25px/1 Ahem; } .before_target { height: 40000px; diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-076.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-076.html index 15d0906f715..2aadcde0c70 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-076.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-076.html @@ -6,7 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="content-visibility-075-ref.html"> <meta name="assert" content="With content-visibility: auto, fragment navigation targets the right element"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> @@ -21,6 +21,7 @@ #target { position: absolute; bottom: 0; + font: 25px/1 Ahem; } .before_target { height: 40000px; diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079-ref.html index 83a2206be2f..c4c1bb3beb4 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079-ref.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079-ref.html @@ -4,6 +4,11 @@ <title>CSS Content Visibility: auto in overflow hidden paints (reference)</title> <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> - -<p>Test passes if you see the word “PASS” below. +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> +<style> + div { + font: 25px/1 Ahem; + } +</style> +<p>Test passes if you see a black rectangle below. <div>PASS</div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079.html index 2fef671f0e6..c2cbbfb5a3d 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-079.html @@ -5,13 +5,16 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="content-visibility-079-ref.html"> <meta name="assert" content="content-visibility auto element paints in an overflow hidden element that is not sized"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> -.auto { content-visibility: auto; } +.auto { + content-visibility: auto; + font: 25px/1 Ahem; +} .overflow { overflow: hidden; } </style> -<p>Test passes if you see the word “PASS” below. +<p>Test passes if you see a black rectangle below. <div class=overflow> <div class=auto>PASS</div> </div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-in-auto-subtree.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-in-auto-subtree.html index 50f04f94f3f..690b49255fe 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-in-auto-subtree.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-in-auto-subtree.html @@ -14,7 +14,7 @@ to { opacity: 0; } } #target { - background: 'green'; + background: green; height: 100px; width: 100px; } @@ -185,4 +185,55 @@ promise_test(async t => { }, 'Events and promises are handled normally for animations without an ' + 'owning element'); +promise_test(async t => { + // The animation is hidden when it is created. + document.getElementById("spacer").style.height = "300vh"; + const container = document.getElementById('container'); + const target = createAnimatingElement(t, 'animate'); + const animation = target.getAnimations()[0]; + await waitForAnimationFrames(2); + // Make this animation no longer associated with its owning element. + target.className = ''; + assert_equals(target.getAnimations().length, 0); + + // Though originally a CSS animation, it is no longer associated with + // CSS rules and no longer has an owning element. It now behaves like a + // programmatic web animation. Animation playback events (but not CSS + // animation events) should be dispatched and promises resolved despite + // being in a content visibility subtree. + + let cssAnimationEndEvent = false; + target.addEventListener('animationend', () => { + cssAnimationEndEvent = true; + }); + + let animationFinishEvent = false; + animation.addEventListener('finish', () => { + animationFinishEvent = true; + }); + + let animationFinished = false; + animation.finished.then(() => { + animationFinished = true; + }); + + animation.play(); + assert_equals(target.getAnimations().length, 1); + + animation.currentTime = 1999; + await animation.ready; + await waitForAnimationFrames(2); + + assert_true(animationFinishEvent, + 'Animation event not blocked on content visibility subtree if ' + + 'no owning element'); + assert_true(animationFinished, + 'Finished promise not blocked on content visibility subtree if ' + + 'no owning element'); + assert_false(cssAnimationEndEvent, + 'CSS animation events should not be dispatched if there is no ' + + 'owning element'); +}, 'CSS animations without an owning element should handle events and promises ' + + 'normally, even c-v value does change'); + </script> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-with-scroll-timeline-in-auto-subtree.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-with-scroll-timeline-in-auto-subtree.html new file mode 100644 index 00000000000..0d9bde7d751 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-with-scroll-timeline-in-auto-subtree.html @@ -0,0 +1,82 @@ +<!DOCTYPE html> +<meta charset=utf8> +<title>Test getComputedStyle on a CSS animation with scroll timeline in a content visibility subtree using content-visibility: auto</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-2/"> +<script src="/web-animations/testcommon.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +#container { + content-visibility: auto; +} + +#scrollContainer { + height: 100vh; + overflow-y: scroll; + scroll-timeline-name: --targetTimeline; +} +#innerspacer { + height: 300vh; +} +@keyframes fade { + from { opacity: 1; } + to { opacity: 0; } +} +#target { + background: green; + height: 100px; + width: 100px; +} +.animate { + animation-name: fade; + animation-duration: 1ms; + animation-direction: alternate; + animation-timeline: --targetTimeline; +} + +</style> +<body> + <div id="log"></div> + <div id="spacer"></div> + <div id="scrollContainer"> + <div id="container"></div> + <div id="innerspacer"></div> + </div> + +</body> +<script> +"use strict"; + +function createAnimatingElement(test, name) { + const container = document.getElementById('container'); + const target = document.createElement('div'); + container.appendChild(target); + target.id = 'target'; + target.className = name; + return target; +} + +promise_test(async t => { + const container = document.getElementById('container'); + const target = createAnimatingElement(t, 'animate'); + scrollContainer.scrollTop = 10000; + const animation = target.getAnimations()[0]; + await animation.ready; + await waitForAnimationFrames(1); + let expectedOpacity = parseFloat(getComputedStyle(target).opacity); + assert_approx_equals(expectedOpacity, 0, 0.1, 'scrollContainer scrolls to bottom, so the opacity should be 0'); + document.getElementById('spacer').style.height = '300vh'; + await waitForAnimationFrames(1); + assert_equals(parseFloat(getComputedStyle(target).opacity), expectedOpacity, 'Opacity does not change when it is hidden by c-v'); + + scrollContainer.scrollTop = 0; + assert_equals(parseFloat(getComputedStyle(target).opacity), expectedOpacity, 'The animation is hidden by c-v, so opacity does not change even if scrollTop changes'); + + await waitForAnimationFrames(2); + + document.getElementById('spacer').style.height = '0vh'; + await waitForAnimationFrames(2); + assert_equals(getComputedStyle(target).opacity, '1', 'Now that the animation is visible, opacity should be updated'); +}, 'Animation with scroll-timeline should be affected c-v'); + +</script> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-with-scroll-timeline-in-hidden-subtree.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-with-scroll-timeline-in-hidden-subtree.html new file mode 100644 index 00000000000..af29a200f15 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-animation-with-scroll-timeline-in-hidden-subtree.html @@ -0,0 +1,81 @@ +<!DOCTYPE html> +<meta charset=utf8> +<title>Test getComputedStyle on a CSS animation with scroll-timeline in a content-visibility subtree</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-2/"> +<script src="/web-animations/testcommon.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +#container { + content-visibility: visible; +} + +#scrollContainer { + height: 100vh; + overflow-y: scroll; + scroll-timeline-name: --targetTimeline; +} +#innerspacer { + height: 300vh; +} +@keyframes fade { + from { opacity: 1; } + to { opacity: 0; } +} +#target { + background: green; + height: 100px; + width: 100px; +} +.animate { + animation-name: fade; + animation-duration: 1ms; + animation-direction: alternate; + animation-timeline: --targetTimeline; +} + +</style> +<body> + <div id="log"></div> + <div id="scrollContainer"> + <div id="container"></div> + <div id="innerspacer"></div> + </div> + +</body> +<script> +"use strict"; + +function createAnimatingElement(test, name) { + const container = document.getElementById('container'); + const target = document.createElement('div'); + container.appendChild(target); + target.id = 'target'; + target.className = name; + return target; +} + +promise_test(async t => { + const container = document.getElementById('container'); + const target = createAnimatingElement(t, 'animate'); + scrollContainer.scrollTop = 10000; + const animation = target.getAnimations()[0]; + await animation.ready; + await waitForAnimationFrames(1); + let expectedOpacity = parseFloat(getComputedStyle(target).opacity); + assert_approx_equals(expectedOpacity, 0, 0.1, 'scrollContainer scrolls to bottom, so the opacity should be 0'); + document.getElementById('container').style.contentVisibility = 'hidden'; + await waitForAnimationFrames(1); + assert_equals(parseFloat(getComputedStyle(target).opacity), expectedOpacity, 'Opacity does not change when it is hidden by c-v'); + + scrollContainer.scrollTop = 0; + assert_equals(parseFloat(getComputedStyle(target).opacity), expectedOpacity, 'The animation is hidden by c-v, so opacity does not change even if scrollTop changes'); + + await waitForAnimationFrames(2); + + document.getElementById('container').style.contentVisibility = 'visible'; + await waitForAnimationFrames(2); + assert_approx_equals(parseFloat(getComputedStyle(target).opacity), 1, 0.1, 'Now that the animation is visible, opacity should be updated'); +}, 'Animation with scroll-timeline should be affected c-v'); + +</script> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html index 897463844aa..746d770f85a 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html @@ -5,7 +5,7 @@ <link rel="author" title="Cathie Chen" href="mailto:cathiechen@igalia.com"> <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <meta name="assert" content="Test if target scrollIntoView is visible when it is inside a nested content-visibility: auto"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> @@ -18,6 +18,7 @@ #target { position: absolute; bottom: 0; + font: 25px/1 Ahem; } .before_target { diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html index 0f874e66075..b7af3462572 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html @@ -7,7 +7,7 @@ <link rel="match" href="content-visibility-vs-scrollIntoView-001-ref.html"> <meta name="assert" content="Test if target scrollIntoView is visible when it is inside a nested content-visibility: auto"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> @@ -24,6 +24,7 @@ #target { position: absolute; bottom: 0; + font: 25px/1 Ahem; } .before_target { diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-web-animation-in-auto-subtree.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-web-animation-in-auto-subtree.html new file mode 100644 index 00000000000..a663e58fe03 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-web-animation-in-auto-subtree.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<meta charset=utf8> +<title>Web Animation does not stop even if target is hidden by c-v</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-2/"> +<script src="/web-animations/testcommon.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +#container { + content-visibility: auto; +} +@keyframes fade { + from { opacity: 1; } + to { opacity: 0; } +} +#target { + background: green; + height: 100px; + width: 100px; +} +.animate { + animation: fade 1s linear 2 alternate; +} +.transition { + transition: opacity 1s linear; +} +</style> +<body> + <div id="spacer"></div> + <div id="container"></div> +</body> +<script> +"use strict"; + +function createElementWithWebAnimation(test) { + const container = document.getElementById('container'); + const target = document.createElement('div'); + container.appendChild(target); + target.id = 'target'; + const keyframes = [ + { opacity: 1 }, + { opacity: 0 }, + ]; + const options = { + duration: 2000, + iterations: 1, + easing: 'linear', + direction: 'alternate', + }; + target.animate(keyframes, options); + + return target; +} + +promise_test(async t => { + // Make sure the target is hidden from the beginning. + document.getElementById("spacer").style.height = "300vh"; + const target = createElementWithWebAnimation(t); + const animation = target.getAnimations()[0]; + + let animationFinishEvent = false; + animation.addEventListener('finish', () => { + animationFinishEvent = true; + }); + + animation.currentTime = 1999; + await animation.ready; + await waitForAnimationFrames(2); + + assert_true(animationFinishEvent, + 'Web Animation event should keep going even if target is hidden by c-v'); +}, 'Web Animation does not stop even if target is hidden by c-v'); + +</script> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html index bbf4567e37d..24fef4f67e9 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html @@ -6,13 +6,14 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="spacer-with-popover-top-layer-ref.html"> <meta name="assert" content="top layer popovers render under c-v auto"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> .box { width: 100px; height: 100px; border: 1px solid black; } .auto { content-visibility: auto } .spacer { width: 10px; height: 3000px; background: lightblue; } +#popover { font: 25px/1 Ahem } </style> <div class=spacer></div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html index 264d7b317e0..76b736a6379 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html @@ -6,13 +6,14 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="spacer-with-popover-top-layer-ref.html"> <meta name="assert" content="top layer popovers render under c-v auto"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> .box { width: 100px; height: 100px; border: 1px solid black; } .auto { content-visibility: auto } .spacer { width: 10px; height: 3000px; background: lightblue; } +#popover { font: 25px/1 Ahem; } </style> <div class=spacer></div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html index e21b11e92db..218251fdcdb 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html @@ -6,13 +6,14 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="spacer-with-top-layer-ref.html"> <meta name="assert" content="top layer dialogs render under c-v auto"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> .box { width: 100px; height: 100px; border: 1px solid black; } .auto { content-visibility: auto } .spacer { width: 10px; height: 3000px; background: lightblue; } +#dialog { font: 25px/1 Ahem; } </style> <div class=spacer></div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html index 5283aea1973..c1cb1bcde35 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html @@ -6,13 +6,14 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="spacer-with-top-layer-ref.html"> <meta name="assert" content="top layer dialogs render under c-v auto"> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <script src="/common/reftest-wait.js"></script> <style> .box { width: 100px; height: 100px; border: 1px solid black; } .auto { content-visibility: auto } .spacer { width: 10px; height: 3000px; background: lightblue; } +#dialog { font: 25px/1 Ahem; } </style> <div class=spacer></div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html index 6c4c65f58c3..5ae45afe9eb 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html @@ -1,10 +1,11 @@ <!doctype html> <meta charset="utf8"> <title>CSS Content Visibility: popover shows under c-v auto (ref)</title> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .box { width: 100px; height: 100px; border: 1px solid black; } .spacer { width: 10px; height: 3000px; background: lightblue; } +#popover { font: 25px/1 Ahem; } </style> <div class=spacer></div> diff --git a/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-top-layer-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-top-layer-ref.html index e274b0fcaa1..7cf1f1581b7 100644 --- a/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-top-layer-ref.html +++ b/tests/wpt/tests/css/css-contain/content-visibility/spacer-with-top-layer-ref.html @@ -1,10 +1,11 @@ <!doctype html> <meta charset="utf8"> <title>CSS Content Visibility: dialog shows under c-v auto (ref)</title> - +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .box { width: 100px; height: 100px; border: 1px solid black; } .spacer { width: 10px; height: 3000px; background: lightblue; } +#dialog { font: 25px/1 Ahem; } </style> <div class=spacer></div> diff --git a/tests/wpt/tests/css/css-flexbox/flexbox-align-self-horiz-001-table.xhtml b/tests/wpt/tests/css/css-flexbox/flexbox-align-self-horiz-001-table.xhtml index 1785ca8dfc0..c168c822e99 100644 --- a/tests/wpt/tests/css/css-flexbox/flexbox-align-self-horiz-001-table.xhtml +++ b/tests/wpt/tests/css/css-flexbox/flexbox-align-self-horiz-001-table.xhtml @@ -59,7 +59,6 @@ .stretch { background: pink; align-self: stretch; - display: block; /* XXXdholbert Hackaround for bug 799725 */ } .auto { background: yellow; diff --git a/tests/wpt/tests/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html b/tests/wpt/tests/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html new file mode 100644 index 00000000000..246740960c0 --- /dev/null +++ b/tests/wpt/tests/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/"> +<meta name="assert" content="Loaded image correctly invalidates intrinsic widths of its ancestor chain so that it can be recomputed in flex layout"> +<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html"> +<style> +.flexbox { + display: flex; +} +.green-border { + border: 20px solid green; +} +.img { + max-width: 100%; + max-height: 100%; +} +</style> +</head> +<body> + <p>Test passes if there is a filled green square.</p> + <div class="flexbox"> + <div> + <div class="flexbox green-border"> + <img src="/css/support/60x60-green.png" class="img"> + </div> + </div> + </div> +</body> +</html> diff --git a/tests/wpt/tests/css/css-fonts/font-size-adjust-text-orientation-ref.html b/tests/wpt/tests/css/css-fonts/font-size-adjust-text-orientation-ref.html new file mode 100644 index 00000000000..007e9befad3 --- /dev/null +++ b/tests/wpt/tests/css/css-fonts/font-size-adjust-text-orientation-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size-adjust and text-orientation</title> +<link rel="author" title="ChangSeok Oh" href="mailto:changseok@webkit.org" /> +<link rel="help" href="https://www.w3.org/TR/css-fonts-5/#font-size-adjust-prop" /> +<style> +@font-face { + font-family: IcTestFullWidth; + src: url(../css-values/resources/IcTestFullWidth.woff2); +} +div { + font-family: IcTestFullWidth; + font-size: 40px; + font-size-adjust: ic-width 1.0; + writing-mode: vertical-rl; + text-orientation: mixed; +} +</style> +<div>あ</div> diff --git a/tests/wpt/tests/css/css-fonts/font-size-adjust-text-orientation.html b/tests/wpt/tests/css/css-fonts/font-size-adjust-text-orientation.html new file mode 100644 index 00000000000..ab73e86e87f --- /dev/null +++ b/tests/wpt/tests/css/css-fonts/font-size-adjust-text-orientation.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size-adjust and text-orientation</title> +<link rel="author" title="ChangSeok Oh" href="mailto:changseok@webkit.org" /> +<link rel="help" href="https://www.w3.org/TR/css-fonts-5/#font-size-adjust-prop" /> +<link rel="match" href="font-size-adjust-text-orientation-ref.html" /> +<meta name="assert" content="Test checks whether text-orientation affects font-size-adjust."> +<style> +@font-face { + font-family: IcTestFullWidth; + src: url(../css-values/resources/IcTestFullWidth.woff2); +} +div { + font-family: IcTestFullWidth; + font-size: 40px; + font-size-adjust: ic-width 1.0; + writing-mode: vertical-rl; + text-orientation: upright; +} +</style> +<div>あ</div> diff --git a/tests/wpt/tests/css/css-grid/alignment/grid-align-baseline.html b/tests/wpt/tests/css/css-grid/alignment/grid-align-baseline.html index 25744ce61e5..175811718f7 100644 --- a/tests/wpt/tests/css/css-grid/alignment/grid-align-baseline.html +++ b/tests/wpt/tests/css/css-grid/alignment/grid-align-baseline.html @@ -68,6 +68,13 @@ </div> <div class="grid"> + <div data-expected-height="20" data-offset-y="70" class="firstRowFirstColumn alignSelfLastBaseline" style="height: 20px;"></div> + <div data-expected-height="10" data-offset-y="80" class="firstRowSecondColumn alignSelfLastBaseline" style="height: 10px; margin: 30px 0 10px;"></div> + <div data-expected-height="10" data-offset-y="80" class="firstRowThirdColumn alignSelfLastBaseline" style="height: 10px; margin: 20px 0 0;"></div> + <div data-expected-height="100" data-offset-y="0" class="firstRowFourthColumn" style="height: 100px;"></div> +</div> + +<div class="grid"> <div id="baseline1" class="firstRowFirstColumn alignSelfBaseline">ahem</div> <div id="baseline2" data-offset-y="0" class="firstRowSecondColumn alignSelfBaseline"><img src="/css/support/1x1-lime.png" style="height: 50px;"></div> <div data-expected-height="50" data-offset-y="25" class="firstRowThirdColumn alignSelfCenter"><img src="/css/support/1x1-lime.png" style="height: 50px; vertical-align: middle"></div> diff --git a/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html b/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html index e882ea9a9c1..e877b81480d 100644 --- a/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html +++ b/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html @@ -28,6 +28,7 @@ grid-auto-columns: 50px; align-items: baseline; align-content: start; + vertical-align: top; } .firstRowFirstColumn { grid-row: 1; diff --git a/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html b/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html index 8c91c67a9e4..21cc0b8ac21 100644 --- a/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html +++ b/tests/wpt/tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html @@ -28,6 +28,7 @@ grid-auto-columns: 50px; align-items: baseline; grid-row-gap: 20px; + vertical-align: top; } .firstRowFirstColumn { grid-row: 1; diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001-ref.html index 7108a11a100..2e100c3be61 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001-ref.html @@ -8,38 +8,38 @@ <title>Reference: Masonry layout using `grid-column/row`</title> <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,80px); - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-template-columns: repeat(4,80px); + grid-template-rows: masonry; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> <grid> + <item style="grid-column:1">6</item> + <item style="grid-column:2">5</item> + <item style="grid-column:span 2">4</item> <item style="margin-top:10px">3</item> <item style="grid-column:span 2">1</item> <item>2</item> - <item style="grid-column:2">5</item> - <item style="grid-column:span 2">4</item> - <item style="grid-column:1">6</item> </grid> </body> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001.html index 2f8cfbfacc2..649e1edb7cb 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-001.html @@ -10,38 +10,38 @@ <link rel="help" href="https://drafts.csswg.org/css-grid-2"> <link rel="match" href="masonry-item-placement-001-ref.html"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,80px); - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-template-columns: repeat(4,80px); + grid-template-rows: masonry; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> <grid> - <item style="grid-column:2/span 2">1</item> - <item>2</item> + <item style="grid-column:1">6</item> + <item>5</item> <item style="margin-top:10px">3</item> + <item style="grid-column:span 2">1</item> + <item>2</item> <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> </grid> </body> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-002.html index 5f7083b1733..7d321bf7316 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-002.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-002.html @@ -10,38 +10,38 @@ <link rel="help" href="https://drafts.csswg.org/css-grid-2"> <link rel="match" href="masonry-item-placement-002-ref.html"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-auto-columns: 80px; - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-auto-columns: 80px; + grid-template-rows: masonry; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> <grid> - <item style="grid-column:foo 2; grid-row:span 2">2</item> + <item style="grid-column:1/span 4;">1</item> <item>3</item> + <item style="grid-column:foo 2; grid-row:span 2">2</item> <item style="grid-column:span 3">4</item> <item>5</item> <item>6</item> - <item style="grid-column:span 4; grid-row:-100">1</item> </grid> </body> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-003.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-003.html index 4d490c18d5d..8a183cffc6b 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-003.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-003.html @@ -10,37 +10,37 @@ <link rel="help" href="https://drafts.csswg.org/css-grid-2"> <link rel="match" href="masonry-item-placement-003-ref.html"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-auto-flow: dense; - grid-auto-columns: 80px; - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-auto-flow: dense; + grid-auto-columns: 80px; + grid-template-rows: masonry; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> <grid> <item style="grid-row:-100">1</item> + <item>3</item> <item style="grid-column:foo 2; grid-row:span 2">2</item> <item style="grid-column:span 3">4</item> - <item>3</item> <item>5</item> <item>6</item> </grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-001-ref.html index 37169998154..6f20bd05838 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-001-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-001-ref.html @@ -8,28 +8,28 @@ <title>Reference: Masonry layout using `order`</title> <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,auto); - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-template-columns: repeat(4,auto); + grid-template-rows: masonry; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> @@ -38,6 +38,6 @@ item { <item style="margin-top:10px">4</item> <item>6</item> <item>2</item> + <item style="grid-column: span 2">5</item> <item>3</item> - <item style="grid-column:3/span 2">5</item> </grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html index 5dd4e47d80b..15be3fde837 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html @@ -8,36 +8,36 @@ <title>Reference: Masonry layout using `order` and `masonry-auto-flow: next`</title> <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,auto); - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-template-columns: repeat(4,auto); + grid-template-rows: masonry; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> <grid> - <item>1</item> - <item style="margin-top:10px">4</item> - <item>6</item> - <item>2</item> - <item style="grid-column:1/span 2">5</item> - <item style="grid-column:3">3</item> + <item style="grid-column: 1">1</item> + <item style="margin-top:10px; grid-column: 2;">4</item> + <item style="grid-column: 3">6</item> + <item style="grid-column: 4">2</item> + <item style="grid-column: 2/span 2">5</item> + <item>3</item> </grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html index ae68f4e631a..abad3d44b83 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html @@ -10,37 +10,37 @@ <link rel="help" href="https://drafts.csswg.org/css-grid-2"> <link rel="match" href="masonry-order-002-ref.html"> <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} + html,body { + color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; + } -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,auto); - grid-template-rows: masonry; - masonry-auto-flow: next; - color: #444; - border: 1px solid; - padding: 2px; -} + grid { + display: inline-grid; + gap: 10px 20px; + grid-template-columns: repeat(4,auto); + grid-template-rows: masonry; + masonry-auto-flow: next; + color: #444; + border: 1px solid; + padding: 2px; + } -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> + item { + background-color: #444; + color: #fff; + padding: 20px; + margin: 3px; + border: 5px solid blue; + } + </style> </head> <body> <grid> <item>1</item> <item style="order:1">2</item> - <item style="order:2">3</item> + <item style="order:1">3</item> <item style="margin-top:10px">4</item> - <item style="order:1; grid-column:span 2">5</item> + <item style="order:2; grid-column:span 2">5</item> <item>6</item> </grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-explicit-block.html b/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-explicit-block.html index 05f60893900..3cc98708fe9 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-explicit-block.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-explicit-block.html @@ -11,37 +11,35 @@ <body> <style> -grid { - display: grid; - grid-template-columns: auto 1fr; - grid-template-rows: masonry; - width: 300px; - height: 100px; -} - -box1 { - height: 50px; - width: 30px; - background-color: blue; -} - -box2 { - height: 50px; - background-color: red; -} - -box3 { - height: 50px; - width: 100px; - grid-row: 2; - grid-column: 1; - background-color: purple; -} - -box4 { - height: 50px; - background-color: green; -} + grid { + display: grid; + grid-template-columns: 100px 1fr; + grid-template-rows: masonry; + width: 300px; + height: 100px; + } + + box1 { + height: 50px; + width: 30px; + background-color: blue; + } + + box2 { + height: 50px; + background-color: red; + } + + box3 { + height: 50px; + width: 100px; + background-color: purple; + } + + box4 { + height: 50px; + background-color: green; + } </style> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-span-row.html b/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-span-row.html index 6058ca5e744..475c27f1ebe 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-span-row.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/track-sizing/masonry-track-sizing-span-row.html @@ -11,46 +11,45 @@ <body> <style> -grid { - display: grid; - grid-template-columns: auto 1fr; - grid-template-rows: masonry; - width: 300px; - height: 100px; -} - -box1 { - height: 50px; - width: 50px; - background-color: blue; -} - -box2 { - height: 50px; - background-color: red; -} - -box3 { - width: 100px; - height: 50px; - background-color: purple; - z-index: 1; -} - -box4 { - height: 50px; - width: 300px; - grid-column-start: 1; - grid-column-end: 3; - background-color: green; -} + grid { + display: grid; + grid-template-columns: 50px 1fr; + grid-template-rows: masonry; + width: 300px; + height: 100px; + } + + box1 { + height: 50px; + width: 50px; + background-color: blue; + } + + box2 { + height: 50px; + background-color: red; + } + + box3 { + width: 100px; + height: 50px; + background-color: purple; + z-index: 1; + } + + box4 { + height: 50px; + width: 300px; + grid-column: span 2; + background-color: green; + } </style> <grid> <box1>1</box1> <box2>2</box2> - <box3>3</box3> <box4>4</box4> + <box3>3</box3> </grid> </body> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-003.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-003.html new file mode 100644 index 00000000000..5c06ee62e10 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-003.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + background: green; + display: inline-grid; + grid-template-rows: 100px; +} +.subgrid { + width: 100px; + display: grid; + grid-template-rows: subgrid; +} +.w200 { width: 200px } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div class="w200"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-004.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-004.html new file mode 100644 index 00000000000..d69412d6252 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-004.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + display: inline-grid; + grid-template: 100px / minmax(auto, 100px); +} +.subgrid { + width: 100%; + display: grid; + background: green; + grid-template-rows: subgrid; +} +.w200 { width: 200px } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div class="w200"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-005.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-005.html new file mode 100644 index 00000000000..586d26bf2fe --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-005.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + display: grid; + background: red; + width: max-content; + grid-template-columns: minmax(min-content, max-content); +} +.subgrid { + display: grid; + background: green; + width: min-content; + grid-template-rows: subgrid; +} +.w100 { + display: inline-block; + height: 50px; + width: 100px; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div style="font-size: 0"> + <div class="w100"></div> + <div class="w100"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-006.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-006.html new file mode 100644 index 00000000000..056f0a40280 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-006.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + display: grid; + background: red; + width: min-content; +} +.subgrid { + display: grid; + background: green; + max-width: 100px; + width: max-content; + grid-template-rows: subgrid; +} +.w100 { + display: inline-block; + height: 50px; + width: 100px; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div style="font-size: 0"> + <div class="w100"></div> + <div class="w100"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-007.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-007.html new file mode 100644 index 00000000000..464200614c7 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-007.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + background: red; + display: inline-grid; +} +.subgrid { + display: grid; + grid-row: span 2; + background: green; + min-width: min-content; + grid-auto-flow: column; + grid-template-rows: subgrid; +} +.w100 { + height: 50px; + width: 100px; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div class="w100"></div> + <div class="w100"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-008.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-008.html new file mode 100644 index 00000000000..6ee4e77405b --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-008.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + background: green; + display: inline-grid; + grid-template-columns: 100px; +} +.subgrid { + height: 100px; + display: grid; + grid-template-columns: subgrid; +} +.h200 { height: 200px } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div class="h200"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-009.html b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-009.html new file mode 100644 index 00000000000..bbf585efd1a --- /dev/null +++ b/tests/wpt/tests/css/css-grid/subgrid/standalone-axis-size-009.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgrid contribution size on standalone axis</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.grid { + display: inline-grid; + grid-template: minmax(auto, 100px) / 100px; +} +.subgrid { + height: 100%; + display: grid; + background: green; + grid-template-columns: subgrid; +} +.h200 { height: 200px } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="grid"> + <div class="subgrid"> + <div class="h200"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-images/cross-fade-basic-ref.html b/tests/wpt/tests/css/css-images/cross-fade-basic-ref.html new file mode 100644 index 00000000000..2d7db8a867a --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-basic-ref.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSS reftest Reference</title> + <style> + div { + margin: 2px; + width: 50px; + height: 50px; + } + .div1 { + background-color: #7f007f; + } + .div2 { + background-color: #7f007f; + } + .div3 { + background-color: #7f007f; + } + .div4 { + width: 200px; + height: 200px; + background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200' style='background: black'><rect fill='red' width='150' height='150' fill-opacity='0.75' style='mix-blend-mode: screen'/><rect fill='blue' x='50' y='50' width='150' height='150' fill-opacity='0.25' style='mix-blend-mode: screen'/></svg>"); + } + </style> + </head> + <p>These three should all look the same; a dark purple.</p> + <div class="div1"></div> + <div class="div2"></div> + <div class="div3"></div> + <p>This should show red and blue translucent squares on a black background, with the red being clearer.</p> + <div class="div4"></div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-basic.html b/tests/wpt/tests/css/css-images/cross-fade-basic.html new file mode 100644 index 00000000000..be396e52785 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-basic.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> + <head> + <title>Basic cross-fade() tests</title> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-images-4/#cross-fade-function"> + <link rel="match" href="cross-fade-basic-ref.html"> + <meta name="fuzzy" content="0-1;0-10000"> + <style> + div { + margin: 2px; + width: 50px; + height: 50px; + } + .div1 { + background-image: cross-fade(50% #f00, 50% #00f); + } + .div2 { + background-image: cross-fade(50% #f00, #00f); + } + .div3 { + background-image: cross-fade(100% #f00, 100% #00f); + } + .div4 { + width: 200px; + height: 200px; + background: cross-fade( + 75% url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200' style='background: black'><rect fill='red' width='150' height='150'/></svg>"), + 25% url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200' style='background: black'><rect fill='blue' x='50' y='50' width='150' height='150'/></svg>") + ); + } + </style> + </head> + <p>These three should all look the same; a dark purple.</p> + <div class="div1"></div> + <div class="div2"></div> + <div class="div3"></div> + <p>This should show red and blue translucent squares on a black background, with the red being clearer.</p> + <div class="div4"></div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-computed-value.html b/tests/wpt/tests/css/css-images/cross-fade-computed-value.html new file mode 100644 index 00000000000..efb3b58d611 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-computed-value.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html> + <head> + <title>cross-fade() computed value</title> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-images-4/#cross-fade-function"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/css/support/computed-testcommon.js"></script> + <style> + #target { + color: red; + } + </style> + </head> + <body> + <div id="target"></div> + <script> + // https://drafts.csswg.org/css-images-4/#serialization specifies that + // “For cross-fade(), always serialize the <percentage>.”, but it's not clear what + // “the” percentage is, since the implicit percentages are different for drawing and + // sizing, and may not be known computed-value time, so we assume one that is not + // given should also not be serialized. + test_computed_value( + 'background-image', + 'cross-fade(30% color-mix(in srgb, currentcolor, blue), white)', + 'cross-fade(30% color(srgb 0.5 0 0.5), rgb(255, 255, 255))'); + + // Unneccessary percentages should be kept. + test_computed_value('background-image', 'cross-fade(50% red, 50% green)', + 'cross-fade(50% rgb(255, 0, 0), 50% rgb(0, 128, 0))'); + + // Percentage normalization should not be visible computed-value time. + test_computed_value('background-image', 'cross-fade(20% red, 20% green)', + 'cross-fade(20% rgb(255, 0, 0), 20% rgb(0, 128, 0))'); + + // More than two values. + test_computed_value('background-image', + 'cross-fade(50% red, 50% green, 50% blue)', + 'cross-fade(50% rgb(255, 0, 0), 50% rgb(0, 128, 0), 50% rgb(0, 0, 255))'); + + // More-than-100% should be invalid, but in calc() we can't reject it parse-time; + // it will be clamped on serialization. + test_computed_value('background-image', + 'cross-fade(calc(101%) red, green)', + 'cross-fade(100% rgb(255, 0, 0), rgb(0, 128, 0))'); + test_computed_value('background-image', + 'cross-fade(calc(-200%) red, green)', + 'cross-fade(0% rgb(255, 0, 0), rgb(0, 128, 0))'); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-legacy-crash.html b/tests/wpt/tests/css/css-images/cross-fade-legacy-crash.html new file mode 100644 index 00000000000..25445765036 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-legacy-crash.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html class="test-wait"> + <head> + <title>CSS Images Test: Serializing legacy cross-fade syntax crashes Chrome</title> + <link rel="help" href="https://crbug.com/1509173"> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <style> + .missing { border-image: -webkit-cross-fade(none, none, 13%); } + </style> + <script src="/common/gc.js"></script> + </head> + <body> + <p>Test passes if the browser does not crash.</p> + <script> + requestAnimationFrame(async () => { + await garbageCollect(); + document.styleSheets[0].cssRules[0].cssText; + document.documentElement.classList.remove('test-wait'); + }); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-natural-size-ref.html b/tests/wpt/tests/css/css-images/cross-fade-natural-size-ref.html new file mode 100644 index 00000000000..ad9752b7eb4 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-natural-size-ref.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSS reftest Reference</title> + <style> + div { + margin: 2px; + } + .div1::before { + content: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='375' height='350' style='background: black'><rect fill='red' width='140.625' height='131.25' fill-opacity='0.75'/><rect fill='blue' width='187.5' height='262.5' fill-opacity='0.25' style='mix-blend-mode: screen'/></svg>"); + } + .div2::before { + content: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='375' height='350' style='background: black'><rect fill='red' width='140.625' height='131.25' fill-opacity='0.375'/><rect fill='blue' width='187.5' height='262.5' fill-opacity='0.125' style='mix-blend-mode: screen'/><rect fill='green' width='375' height='350' fill-opacity='0.5' style='mix-blend-mode: screen'/></svg>"); + } + </style> + </head> + <p>This image should be 375x350, with a black background.</p> + <div class="div1"></div> + <p>This image should be identical in both size and appearance, except for a green tinge.</p> + <div class="div2"></div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-natural-size.html b/tests/wpt/tests/css/css-images/cross-fade-natural-size.html new file mode 100644 index 00000000000..9a62c61aa6d --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-natural-size.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> + <head> + <title>Natural size of cross-fade()</title> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-images-4/#cross-fade-function"> + <link rel="match" href="cross-fade-natural-size-ref.html"> + <meta name="fuzzy" content="0-1;0-300000"> + <style> + div { + margin: 2px; + } + .div1::before { + content: cross-fade( + 75% url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='400' style='background: black'><rect fill='red' width='150' height='150'/></svg>"), + 25% url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='200' style='background: black'><rect fill='blue' width='150' height='150'/></svg>") + ); + } + .div2::before { + content: cross-fade( + 37.5% url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='400' style='background: black'><rect fill='red' width='150' height='150'/></svg>"), + 12.5% url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='200' style='background: black'><rect fill='blue' width='150' height='150'/></svg>"), + green + ); + } + </style> + </head> + <p>This image should be 375x350, with a black background.</p> + <div class="div1"></div> + <p>This image should be identical in both size and appearance, except for a green tinge.</p> + <div class="div2"></div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-premultiplied-alpha-ref.html b/tests/wpt/tests/css/css-images/cross-fade-premultiplied-alpha-ref.html new file mode 100644 index 00000000000..d9a70843678 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-premultiplied-alpha-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSS Test Reference</title> + <style> + div { + margin: 2px; + width: 200px; + height: 200px; + background: color(srgb 0.005 1.0 0.0 / 0.5); + } + </style> + </head> + <p>There should be nearly no red in this box (it should be a translucent green).</p> + <div></div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-premultiplied-alpha.html b/tests/wpt/tests/css/css-images/cross-fade-premultiplied-alpha.html new file mode 100644 index 00000000000..23d78428118 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-premultiplied-alpha.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>cross-fade() is done in premultiplied alpha</title> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-images-4/#cross-fade-function"> + <link rel="match" href="cross-fade-premultiplied-alpha-ref.html"> + <meta name="fuzzy" content="1; 40000"> + <style> + div { + margin: 2px; + width: 200px; + height: 200px; + background-image: cross-fade(color(srgb 1.0 0.0 0.0 / 0.01), color(srgb 0.0 1.0 0.0 / 1.0)) + } + </style> + </head> + <p>There should be nearly no red in this box (it should be a translucent green).</p> + <div></div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-target-alpha-ref.html b/tests/wpt/tests/css/css-images/cross-fade-target-alpha-ref.html new file mode 100644 index 00000000000..e66cfb0ae5b --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-target-alpha-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <head> + <title>CSS reftest Reference</title> + <style> + .outer { + display:block; + width: 500px; + height: 500px; + padding: 50px; + background: linear-gradient(90deg, red, green); + } + .inner { + display: block; + width: 100%; + height: 100%; + color: white; + background: linear-gradient(#e66465, #9198e5); + opacity: 0.6; + } + </style> + </head> + <p>The inner gradient should be (in total) 60% covering over the outer.</p> + <div class="outer"> + <div class="inner"> + </div> + </div> +</html> diff --git a/tests/wpt/tests/css/css-images/cross-fade-target-alpha.html b/tests/wpt/tests/css/css-images/cross-fade-target-alpha.html new file mode 100644 index 00000000000..a10a2bfe8df --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-target-alpha.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html> + <head> + <title>cross-fade() with less than 100% total percentage gets faded correctly</title> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-images-4/#cross-fade-function"> + <link rel="match" href="cross-fade-target-alpha-ref.html"> + <!-- Implementations compositing in 8-bit may get fairly strong accuracy issues here, + so the fuzz needs to be set pretty liberally. --> + <meta name="fuzzy" content="0-8;0-300000"> + <style> + .outer { + display:block; + width: 500px; + height: 500px; + padding: 50px; + background: linear-gradient(90deg, red, green); + } + .inner { + display: block; + width: 100%; + height: 100%; + color: white; + /* NOTE: The same gradient several times, so that we can easily simulate this using opacity. */ + background: cross-fade( + 10% linear-gradient(#e66465, #9198e5), + 10% linear-gradient(#e66465, #9198e5), + 10% linear-gradient(#e66465, #9198e5), + 10% linear-gradient(#e66465, #9198e5), + 10% linear-gradient(#e66465, #9198e5), + 10% linear-gradient(#e66465, #9198e5) + ); + } + </style> + </head> + <p>The inner gradient should be (in total) 60% covering over the outer.</p> + <div class="outer"> + <div class="inner"> + </div> + </div> +</html> diff --git a/tests/wpt/tests/css/css-lists/crashtests/chrome-bug-1377573.html b/tests/wpt/tests/css/css-lists/crashtests/chrome-bug-1377573.html new file mode 100644 index 00000000000..3419a23ee43 --- /dev/null +++ b/tests/wpt/tests/css/css-lists/crashtests/chrome-bug-1377573.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>Chrome crash with nested ::after::marker with failing list-style-image</title> +<link rel="help" href="https://crbug.com/1377573"> +<style> + :is(body, html)::after { + display: list-item; + content: " "; + } + :root { list-style-image:url('.'); } +</style> +<body> + diff --git a/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-003.svg b/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-003.svg new file mode 100644 index 00000000000..01c4a2610e8 --- /dev/null +++ b/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-003.svg @@ -0,0 +1,24 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml" clip-path="url(#clip1)"> +<g id="testmeta"> + <title>CSS Masking: Clipped clipPath on root <svg></title> + <html:link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"/> + <html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-clipping-paths"/> + <html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#ClipPathElement"/> + <html:link rel="match" href="reference/clip-path-square-002-ref.svg" /> + <metadata class="flags">svg</metadata> + <desc class="assert">A clipPath element can be applied to a root + <svg> element. This clipPath element can be clipped itself. You + should see a green square.</desc> +</g> +<clipPath id="clip2"> + <rect x="50" y="50" width="100" height="100"/> +</clipPath> +<clipPath id="clip1"> + <rect x="25" y="25" width="150" height="150"/> +</clipPath> +<rect width="200" height="200" fill="green"/> +<script> + var svg = document.documentElement; + svg.setAttribute('clip-path','url(#clip2)'); +</script> +</svg> diff --git a/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-004.svg b/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-004.svg new file mode 100644 index 00000000000..62a020e5586 --- /dev/null +++ b/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-004.svg @@ -0,0 +1,22 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml" clip-path="url(#clip1)"> +<g id="testmeta"> + <title>CSS Masking: Clipped clipPath on root <svg></title> + <html:link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"/> + <html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-clipping-paths"/> + <html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#ClipPathElement"/> + <html:link rel="match" href="reference/clip-path-square-002-ref.svg" /> + <metadata class="flags">svg</metadata> + <desc class="assert">A clipPath element can be applied to a root + <svg> element. This clipPath element can be clipped itself. You + should see a green square.</desc> +</g> +<clipPath id="clip2"> + <rect width="150" height="150"/> +</clipPath> +<clipPath id="clip1"> + <rect x="50" y="50" width="175" height="175"/> +</clipPath> +<svg clip-path="url(#clip2)"> + <rect width="200" height="200" fill="green"/> +</svg> +</svg> diff --git a/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-005.svg b/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-005.svg new file mode 100644 index 00000000000..c39d2660280 --- /dev/null +++ b/tests/wpt/tests/css/css-masking/clip-path-svg-content/clip-path-on-svg-005.svg @@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml" style="-webkit-clip-path: url(#clip1)"> +<g id="testmeta"> + <title>CSS Masking: clipPath on root <svg></title> + <html:link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"/> + <html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-clipping-paths"/> + <html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#ClipPathElement"/> + <html:link rel="match" href="reference/clip-path-square-002-ref.svg" /> + <metadata class="flags">svg</metadata> + <desc class="assert">A clipPath element can be applied to a root + <svg> element. You should see a green square.</desc> +</g> +<clipPath id="clip1"> + <rect x="50" y="50" width="100" height="100"/> +</clipPath> +<rect width="200" height="200" fill="green"/> +</svg> diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-contentBox-1e.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-contentBox-1e.html index aa2f961f668..5fde5ccd9a9 100644 --- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-contentBox-1e.html +++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-contentBox-1e.html @@ -3,7 +3,7 @@ <link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> <link rel="help" href="https://drafts.csswg.org/css-shapes-1/#valdef-shape-box-content-box"> <link rel="match" href="reference/green-circle-100x100.html"> -<meta name="fuzzy" content="maxDifference=0-64; totalPixels=0-400"> +<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-400"> <meta name="assert" content="Check that the 'clip-path' property supports content-box with border-radius."> <style> diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-fillBox-1b.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-fillBox-1b.html index d77fd716fd5..529cee6a429 100644 --- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-fillBox-1b.html +++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-fillBox-1b.html @@ -5,7 +5,7 @@ <title>CSS Masking: clip-path: clip path fill-box</title> <link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path"> <link rel="match" href="clip-path-geometryBox-1-ref.html"> - <meta name="fuzzy" content="maxDifference=0-52; totalPixels=0-355"> + <meta name="fuzzy" content="maxDifference=0-52; totalPixels=0-376"> <meta name="assert" content="Test checks whether clip-path fill-box works correctly or not. This test is for clip-path applied to an SVG foreign object element."> </head> <body> diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-inline-007.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-inline-007.html index ffbc8310802..9518b587c4f 100644 --- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-inline-007.html +++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-inline-007.html @@ -3,7 +3,7 @@ <link rel="help" href="https://drafts.csswg.org/css-shapes-1/#valdef-shape-box-border-box"> <link rel="help" href="https://drafts.csswg.org/css-shapes-1/#typedef-shape-box"> <link rel="match" href="clip-path-inline-007-ref.html"> -<meta name="fuzzy" content="maxDifference=0-62; totalPixels=0-325"> +<meta name="fuzzy" content="maxDifference=0-62; totalPixels=0-332"> <meta content="ahem" name="flags"> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-marginBox-1c.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-marginBox-1c.html index cfeebeedf38..7d6780731ed 100644 --- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-marginBox-1c.html +++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-marginBox-1c.html @@ -3,7 +3,7 @@ <link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> <link rel="help" href="https://drafts.csswg.org/css-shapes-1/#valdef-shape-box-margin-box"> <link rel="match" href="reference/green-circle-100x100.html"> -<meta name="fuzzy" content="maxDifference=0-98; totalPixels=0-287"> +<meta name="fuzzy" content="maxDifference=0-98; totalPixels=0-424"> <meta name="assert" content="Check that the 'clip-path' property supports margin-box with border-radius."> <style> diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1d.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1d.html index 3d5f355825b..0d58e4f331b 100644 --- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1d.html +++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1d.html @@ -5,7 +5,7 @@ <title>CSS Masking: clip-path: clip path view-box</title> <link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path"> <link rel="match" href="clip-path-geometryBox-1-ref.html"> - <meta name="fuzzy" content="maxDifference=0-64; totalPixels=0-368"> + <meta name="fuzzy" content="maxDifference=0-64; totalPixels=0-376"> <meta name="assert" content="Test checks whether clip-path view-box works correctly or not. This test is for clip-path applied to an SVG foreign object element."> </head> <body> diff --git a/tests/wpt/tests/css/css-masking/mask-image/mask-image-3h.html b/tests/wpt/tests/css/css-masking/mask-image/mask-image-3h.html index 7d33be43814..29f2c33bdf1 100644 --- a/tests/wpt/tests/css/css-masking/mask-image/mask-image-3h.html +++ b/tests/wpt/tests/css/css-masking/mask-image/mask-image-3h.html @@ -7,7 +7,7 @@ <link rel="author" title="Mozilla" href="https://www.mozilla.org"> <link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-mask-image"> <link rel="match" href="mask-image-3-ref.html"> - <meta name="fuzzy" content="maxDifference=0-10; totalPixels=0-80"> + <meta name="fuzzy" content="maxDifference=0-37; totalPixels=0-146"> <meta name="assert" content="Test checks whether clip-path in SVG mask works correctly or not."> <svg height="0"> <mask id="mask1" x="0" y="0" width="1" height="1" > diff --git a/tests/wpt/tests/css/css-masking/mask-image/mask-image-svg-foreignobject-zoomed.html b/tests/wpt/tests/css/css-masking/mask-image/mask-image-svg-foreignobject-zoomed.html new file mode 100644 index 00000000000..85a8b2dbf27 --- /dev/null +++ b/tests/wpt/tests/css/css-masking/mask-image/mask-image-svg-foreignobject-zoomed.html @@ -0,0 +1,24 @@ +<!doctype html> +<title><mask> on <foreignObject> in zoomed SVG</title> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> +<link rel="help" href="https://drafts.fxtf.org/css-masking/#svg-masks"> +<style> + svg { + zoom: 2; + } + .inner { + width: 100%; + height: 100%; + background: green; + } +</style> +<p>Test passes if there is a filled green square.</p> +<svg> + <rect width="50" height="50" fill="red"/> + <mask id="m"> + <rect width="50" height="50" fill="white"/> + </mask> + <foreignObject width="50" height="50" mask="url(#m)"> + <div class="inner"></div> + </foreignObject> +</svg> diff --git a/tests/wpt/tests/css/css-multicol/crashtests/add-list-item-marker.html b/tests/wpt/tests/css/css-multicol/crashtests/add-list-item-marker.html new file mode 100644 index 00000000000..fa14315cabf --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/crashtests/add-list-item-marker.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1510614"> +<div style="columns:2;"> + <div id="outer" style="display:list-item; list-style-type:none;"> + text + <div></div> + </div> +</div> +<script> + document.body.offsetTop; + outer.style.listStyleType = "disc"; +</script> diff --git a/tests/wpt/tests/css/css-multicol/crashtests/interleaved-bfc-crash.html b/tests/wpt/tests/css/css-multicol/crashtests/interleaved-bfc-crash.html new file mode 100644 index 00000000000..30a619de67b --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/crashtests/interleaved-bfc-crash.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1506393"> +<div style="float:right; overflow:auto; columns:1; height:100px;"> + x + <div style="float:right; contain:size; height:100px; padding-left:65536px;"></div> + <div style="display:flow-root; width:100%;"> + y + <div style="position:relative; float:right; padding-left:65536px; width:1px; border-style:solid; columns:1;"> + z + <div style="contain:size; height:100px;"></div> + <div style="position:absolute;"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-inside-fixed-size-overflow-hidden-print.html b/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-inside-fixed-size-overflow-hidden-print.html new file mode 100644 index 00000000000..77f9dc335fd --- /dev/null +++ b/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-inside-fixed-size-overflow-hidden-print.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1507840"> +<div style="position:relative; overflow:hidden; width:100px; height:100px;"> + <div style="position:absolute; width:100px; height:100px; background:green;"> + <div id="trouble"></div> + </div> +</div> +<script> + var mediaQuery = window.matchMedia("print"); + mediaQuery.addListener(function() { + trouble.style.width = "100px"; + }); +</script> diff --git a/tests/wpt/tests/css/css-page/page-orientation-landscape-ref.html b/tests/wpt/tests/css/css-page/page-orientation-landscape-ref.html new file mode 100644 index 00000000000..caa7542dac9 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-orientation-landscape-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"> + <style> + +@page { + size: landscape; +} +div { + box-sizing: border-box; + width: 4in; + height: 2in; + border-top: none; + border-right: 15px solid orange; + border-bottom: none; + border-left: 15px solid blue; +} +body { + margin: 0; +} + + </style> + <body> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-orientation-on-landscape-001-print.html b/tests/wpt/tests/css/css-page/page-orientation-on-landscape-001-print.html new file mode 100644 index 00000000000..6832a5537d9 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-orientation-on-landscape-001-print.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"> + <link rel="help" href="https://drafts.csswg.org/css-page/#page-orientation-prop"> + <meta name="assert" content="page-orientation rotates landscape page to match portrait ref"> + <link rel="match" href="page-orientation-portrait-ref.html"> + <meta name="reftest-pages" content="2"> + <style> + +@page second-page { + size: landscape; + page-orientation: rotate-right; +} +div:nth-of-type(2) { + page: second-page; + break-before: page; + + box-sizing: border-box; + width: 4in; + height: 2in; + border-top: 15px solid orange; + border-right: none; + border-bottom: 15px solid blue; + border-left: none; +} +body { + margin: 0; +} + + </style> + <body> + <div>Page 1. Not compared. Just bumps testing to page 2.</div> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-orientation-on-portrait-001-print.html b/tests/wpt/tests/css/css-page/page-orientation-on-portrait-001-print.html new file mode 100644 index 00000000000..5ab3e1edfd1 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-orientation-on-portrait-001-print.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"> + <link rel="help" href="https://drafts.csswg.org/css-page/#page-orientation-prop"> + <meta name="assert" content="page-orientation rotates portrait page to match landscape ref"> + <link rel="match" href="page-orientation-landscape-ref.html"> + <meta name="reftest-pages" content="2"> + <style> + +@page second-page { + size: portrait; + page-orientation: rotate-right; +} +div:nth-of-type(2) { + page: second-page; + break-before: page; + + box-sizing: border-box; + width: 2in; + height: 4in; + border-top: 15px solid orange; + border-right: none; + border-bottom: 15px solid blue; + border-left: none; +} +body { + margin: 0; +} + + </style> + <body> + <div>Page 1. Not compared. Just bumps testing to page 2.</div> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-orientation-on-square-001-print.html b/tests/wpt/tests/css/css-page/page-orientation-on-square-001-print.html new file mode 100644 index 00000000000..06e4f00d3c4 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-orientation-on-square-001-print.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"> + <link rel="help" href="https://drafts.csswg.org/css-page/#page-orientation-prop"> + <meta name="assert" content="page-orientation rotates square page"> + <link rel="match" href="page-orientation-square-ref.html"> + <meta name="reftest-pages" content="2"> + <style> + +@page { + size: 3in 3in; + margin: 0.5in; +} +@page second-page { + page-orientation: rotate-right; +} +div:nth-of-type(2) { + page: second-page; + break-before: page; + + box-sizing: border-box; + width: 2in; + height: 2in; + border-top: 15px solid orange; + border-right: none; + border-bottom: 15px solid blue; + border-left: none; +} +body { + margin: 0; +} + + </style> + <body> + <div>Page 1. Not compared. Just bumps testing to page 2.</div> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-orientation-portrait-ref.html b/tests/wpt/tests/css/css-page/page-orientation-portrait-ref.html new file mode 100644 index 00000000000..c545c3163c7 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-orientation-portrait-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"> + <style> + +@page { + size: portrait; +} +div { + box-sizing: border-box; + width: 2in; + height: 4in; + border-top: none; + border-right: 15px solid orange; + border-bottom: none; + border-left: 15px solid blue; +} +body { + margin: 0; +} + + </style> + <body> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-orientation-square-ref.html b/tests/wpt/tests/css/css-page/page-orientation-square-ref.html new file mode 100644 index 00000000000..9eacc3e0921 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-orientation-square-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"> + <style> + +@page { + size: 3in 3in; + margin: 0.5in; +} +div { + box-sizing: border-box; + width: 2in; + height: 2in; + border-top: none; + border-right: 15px solid orange; + border-bottom: none; + border-left: 15px solid blue; +} +body { + margin: 0; +} + + </style> + <body> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-rule-specificity-001-print.html b/tests/wpt/tests/css/css-page/page-rule-specificity-001-print.html new file mode 100644 index 00000000000..dc28ad75db3 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-rule-specificity-001-print.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Paged Media: @page without selector provides defaults</title> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/> + <link rel="help" href="https://drafts.csswg.org/css-page/#cascading-and-page-context"/> + <meta name="assert" content="@page with a selector should not apply to non-matched pages"> + <link rel="match" href="page-rule-specificity-print-landscape-ref.html"/> + <meta name="reftest-pages" content="2"> + <style> + +/* WPT Print Reftest default size is 5x3in - this should only change that for the first page */ +@page :first { + size: portrait; +} +div:first-of-type { + break-after: page; +} +body { + margin: 0; +} + + </style> + <body> + <div>Portrait</div> + <div>Landscape</div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-rule-specificity-002-print.html b/tests/wpt/tests/css/css-page/page-rule-specificity-002-print.html new file mode 100644 index 00000000000..01d9b2b92d8 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-rule-specificity-002-print.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Paged Media: @page without selector provides defaults</title> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/> + <link rel="help" href="https://drafts.csswg.org/css-page/#cascading-and-page-context"/> + <meta name="assert" content="@page rule without a selector list should apply to pages not matched by rules with selectors"> + <link rel="match" href="page-rule-specificity-print-landscape-ref.html"/> + <meta name="reftest-pages" content="2"> + <style> + +@page :first { + size: portrait; +} +@page { + size: landscape; +} +div:first-of-type { + break-after: page; +} +body { + margin: 0; +} + + </style> + <body> + <div>Portrait</div> + <div>Landscape</div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-rule-specificity-003-print.html b/tests/wpt/tests/css/css-page/page-rule-specificity-003-print.html new file mode 100644 index 00000000000..eda6c7ee51b --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-rule-specificity-003-print.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Paged Media: @page without selector provides defaults</title> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/> + <link rel="help" href="https://drafts.csswg.org/css-page/#cascading-and-page-context"/> + <meta name="assert" content="@page rule without a selector list should apply to pages not matched by rules with selectors"> + <link rel="match" href="page-rule-specificity-print-portrait-ref.html"/> + <meta name="reftest-pages" content="2"> + <style> + +@page :first { + size: landscape; +} +@page { + size: portrait; +} +div:first-of-type { + break-after: page; +} +body { + margin: 0; +} + + </style> + <body> + <div>Landscape</div> + <div>Portrait</div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-rule-specificity-print-landscape-ref.html b/tests/wpt/tests/css/css-page/page-rule-specificity-print-landscape-ref.html new file mode 100644 index 00000000000..0e39390e8e7 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-rule-specificity-print-landscape-ref.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/> + <style> + +body { + margin: 0; +} + + </style> + <body> + <div>Landscape</div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/page-rule-specificity-print-portrait-ref.html b/tests/wpt/tests/css/css-page/page-rule-specificity-print-portrait-ref.html new file mode 100644 index 00000000000..76ccfed10a8 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-rule-specificity-print-portrait-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/> + <style> + +@page :first { + size: portrait; +} +body { + margin: 0; +} + + </style> + <body> + <div>Portrait</div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-page/parsing/margin-rules-001.html b/tests/wpt/tests/css/css-page/parsing/margin-rules-001.html new file mode 100644 index 00000000000..b73d1bc56fc --- /dev/null +++ b/tests/wpt/tests/css/css-page/parsing/margin-rules-001.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-at-rules"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<style> +#test{ } +</style> +<script> +'use strict'; +test(t => { + const ruleTypes = [ + "@top-left-corner", + "@top-left", + "@top-center", + "@top-right", + "@top-right-corner", + "@bottom-left-corner", + "@bottom-left", + "@bottom-center", + "@bottom-right", + "@bottom-right-corner", + "@left-top", + "@left-middle", + "@left-bottom", + "@right-top", + "@right-middle", + "@right-bottom" + ]; + // Test that margin-rules are not valid at a top-level. + for(let t in ruleTypes){ + test_invalid_rule(ruleTypes[t] + "{ }"); + } + // Test that margin-rules are not valid in style rules. + assert_equals(document.styleSheets.length, 1); + let styleSheet = document.styleSheets[0]; + assert_equals(styleSheet.rules.length, 1); + let rule = styleSheet.rules[0]; + for(let t in ruleTypes){ + assert_throws_dom( + DOMException.SYNTAX_ERR, + () => rule.insertRule(ruleTypes[t] + "{ }"), + "Should not be able to add " + ruleTypes[t] + " to a style rule"); + } + // Test that margin-rules are valid inside page-rules. + for(let t in ruleTypes){ + test_valid_rule("@page{ " + ruleTypes[t] + "{ } }"); + } +}, "margin-rules-001"); +</script> diff --git a/tests/wpt/tests/css/css-page/parsing/nested-rules-001.html b/tests/wpt/tests/css/css-page/parsing/nested-rules-001.html new file mode 100644 index 00000000000..23c8eb0894c --- /dev/null +++ b/tests/wpt/tests/css/css-page/parsing/nested-rules-001.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-page-3/#syntax-page-selector"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +@page p0{ + @page a{ size: letter; } +} +@page p1{ + @namespace svg url(http://www.w3.org/2000/svg); +} +@page p2{ + @font-face{} +} +@page p3{ + @font-feature-values font one{} +} +@page p4{ + @font-palette-values --alternate{} +} +@page p5{ + @counter-style x{} +} +@page p6{ + @keyframes y{} +} +@page p7{ + @property z{ + syntax: "<color>"; + inherits: false; + initial-value: #c0ffee; + } +} +@page p8{ + @import url("style.css") screen; +} +</style> + +<script> +'use strict'; +test(t => { + assert_equals(document.styleSheets.length, 1); + let styleSheet = document.styleSheets[0]; + const ruleTypes = [ + "page", + "namespace", + "font-face", + "font-feature-values", + "font-palette-values", + "counter-style", + "keyframes", + "property", + "import" + ]; + assert_equals(styleSheet.rules.length, ruleTypes.length); + for(let i = 0; i < styleSheet.rules.length; i++){ + // Just test that this is the right rule first. + assert_equals(styleSheet.rules[i].selectorText, "p" + i, + "@page p" + i + " was not parsed at all"); + // Test that the nested rule was not valid. + assert_equals(styleSheet.rules[i].cssText, "@page p" + i + " { }", + "@" + ruleTypes[i] + " rules should not be allowed in @page rules"); + } +}, "nested-rules-001"); +</script> diff --git a/tests/wpt/tests/css/css-scroll-anchoring/focused-element-in-excluded-subtree.html b/tests/wpt/tests/css/css-scroll-anchoring/focused-element-in-excluded-subtree.html new file mode 100644 index 00000000000..85b3107802d --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-anchoring/focused-element-in-excluded-subtree.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + +body { height: 4000px; } +div { height: 100px; } + +.scroller { + overflow: scroll; + position: fixed; + width: 300px; + height: 300px; + background-color: green; +} + +#posSticky { + top: 300px; + position: relative; + height: 50px; + width: 50px; + background-color: blue; +} + +#content { + background-color: #D3D3D3; + height: 50px; + width: 50px; + position: relative; + top: 500px; +} + +</style> +<div id="scroller" class="scroller"> + <div id="content"></div> + + <div id="posSticky"> + <div id="block1" tabindex="-1">abc</div> + </div> +</div> + +<script> + +// Tests that a focused element doesn't become the +// priority candidate of the main frame if it is +// in an excluded subtree + +promise_test(async function() { + var scroller = document.querySelector("#scroller"); + var focusElement = document.querySelector("#block1"); + focusElement.focus(); + scroller.scrollBy(0,150); + document.scrollingElement.scrollBy(0,100); + + await new Promise(resolve => { + document.addEventListener("scroll", () => step_timeout(resolve, 0)); + }); + + assert_equals(document.scrollingElement.scrollTop, 100); +}, "Ensure there is no scroll anchoring adjustment in the main frame."); + +</script> diff --git a/tests/wpt/tests/css/css-scroll-anchoring/focused-element-outside-scroller.html b/tests/wpt/tests/css/css-scroll-anchoring/focused-element-outside-scroller.html new file mode 100644 index 00000000000..73a5944856b --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-anchoring/focused-element-outside-scroller.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + +body { height: 4000px; } +div { height: 100px; } + +.scroller { + overflow: scroll; + position: fixed; + width: 300px; + height: 300px; + background-color: green; +} + +#content { + background-color: #D3D3D3; + height: 50px; + width: 50px; + position: relative; + top: 500px; +} + +</style> +<div id="scroller" class="scroller"> + <div id="content"></div> +</div> +<div id="block1" tabindex="-1">abc</div> + +<script> + +// Tests that a focused element doesn't become the +// priority candidate of the subscroller + +promise_test(async function() { + var scroller = document.querySelector("#scroller"); + var focusElement = document.querySelector("#block1"); + focusElement.focus(); + scroller.scrollBy(0,150); + document.scrollingElement.scrollBy(0,100); + await new Promise(resolve => { + document.addEventListener("scroll", () => step_timeout(resolve, 0)); + }); + + assert_equals(scroller.scrollTop, 150); +}, "Ensure there is no scroll anchoring adjustment in subscroller."); + +</script> diff --git a/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js b/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js index 457ae857cc6..1a2edab90bb 100644 --- a/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js +++ b/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js @@ -67,6 +67,20 @@ function waitForEventUntil(event_target, event_type, wait_until) { }); } +function waitForEventsUntil(event_target, event_type, wait_until) { + return new Promise(resolve => { + let result = []; + const listener = (evt) => { + result.push(evt); + }; + event_target.addEventListener(event_type, listener); + wait_until.then(() => { + event_target.removeEventListener(event_type, listener); + resolve(result); + }); + }); +} + // Proxy a wait for a snap event. We want to avoid having a test // timeout in the event of an expected snap event not firing in a particular // test case as that would cause the entire file to fail. diff --git a/tests/wpt/tests/css/css-scroll-snap-2/resources/user-scroll-common.js b/tests/wpt/tests/css/css-scroll-snap-2/resources/user-scroll-common.js index 647f4213a6a..6587aebd920 100644 --- a/tests/wpt/tests/css/css-scroll-snap-2/resources/user-scroll-common.js +++ b/tests/wpt/tests/css/css-scroll-snap-2/resources/user-scroll-common.js @@ -7,11 +7,11 @@ function snap_event_touch_scroll_helper(start_pos, end_pos) { return new test_driver.Actions() .addPointer("TestPointer", "touch") - .pointerMove(start_pos.x, start_pos.y) + .pointerMove(Math.round(start_pos.x), Math.round(start_pos.y)) .pointerDown() .addTick() .pause(200) - .pointerMove(end_pos.x, end_pos.y) + .pointerMove(Math.round(end_pos.x), Math.round(end_pos.y)) .addTick() .pointerUp() .send(); @@ -25,17 +25,17 @@ function snap_event_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt) { let x, y, bounds; if (scroller == document.scrollingElement) { bounds = document.documentElement.getBoundingClientRect(); - x = window.innerWidth - Math.round(scrollbar_width / 2); + x = Math.round(window.innerWidth - scrollbar_width / 2); } else { bounds = scroller.getBoundingClientRect(); - x = bounds.right - Math.round(scrollbar_width / 2); + x = Math.round(bounds.right - Math.round(scrollbar_width / 2)); } - y = bounds.top + vertical_offset_into_scrollbar; + y = Math.round(bounds.top + vertical_offset_into_scrollbar); return new test_driver.Actions() .addPointer('TestPointer', 'mouse') .pointerMove(x, y) .pointerDown() - .pointerMove(x, y + drag_amt) + .pointerMove(x, Math.round(y + drag_amt)) .addTick() .pointerUp() .send(); @@ -54,7 +54,8 @@ async function test_no_snap_event(test, scroller, delta, event_type) { let snap_event_promise = waitForSnapEvent(listening_element, event_type); // Set the scroll destination to just a little off (0, 0) top so we snap // back to the top box. - await new test_driver.Actions().scroll(0, 0, delta, delta).send(); + await new test_driver.Actions().scroll(0, 0, delta, delta, + { origin: scroller }).send(); let evt = await snap_event_promise; assert_equals(evt, null, "no snap event since scroller is back to top"); assert_equals(scroller.scrollTop, 0, "scroller snaps back to the top"); @@ -64,3 +65,7 @@ async function test_no_snap_event(test, scroller, delta, event_type) { async function test_no_snapchanged(t, scroller, delta) { await test_no_snap_event(t, scroller, delta, "snapchanged"); } + +async function test_no_snapchanging(t, scroller, delta) { + await test_no_snap_event(t, scroller, delta, "snapchanging"); +}
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html index d7cc409b5b0..2e33c3c970f 100644 --- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html +++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html @@ -111,9 +111,9 @@ evt = await snapchanged_promise; assertSnapEvent(evt, [snap_point_2.id]); - assert_equals(scroller.scrollTop, snap_point_2.offsetTop, + assert_approx_equals(scroller.scrollTop, snap_point_2.offsetTop, 1, "scroller snaps to the top of snap_point_2"); - assert_equals(scroller.scrollLeft, snap_point_2.offsetLeft, + assert_approx_equals(scroller.scrollLeft, snap_point_2.offsetLeft, 1, "scroller snaps to the left of snap_point_2"); }, "snapchanged is not fired if snap target doesn't change on " + "programmatic scroll"); diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html index eebe05704ec..6082e090130 100644 --- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html +++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html @@ -116,9 +116,9 @@ evt = await snapchanged_promise; assertSnapEvent(evt, [snap_point_2.id]); - assert_equals(scroller.scrollTop, snap_point_2.offsetTop, + assert_approx_equals(scroller.scrollTop, snap_point_2.offsetTop, 1, "scroller snaps to the top of snap_point_2"); - assert_equals(scroller.scrollLeft, snap_point_2.offsetLeft, + assert_approx_equals(scroller.scrollLeft, snap_point_2.offsetLeft, 1, "scroller snaps to the left of snap_point_2"); }, "snapchanged is not fired if snap target doesn't change on " + "programmatic scroll"); diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html new file mode 100644 index 00000000000..5474b7ddce2 --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<html> +<head> + <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="/dom/events/scrolling/scroll_support.js"></script> + <script src="/css/css-scroll-snap-2/resources/common.js"></script> + <script src="/css/css-scroll-snap-2/resources/user-scroll-common.js"></script> + <script src="/web-animations/testcommon.js"></script> + <style> + body { + margin: 0px; + } + #space { + height: 200vh; + width: 200vw; + } + .scroller { + scroll-snap-type: x mandatory; + overflow-x: auto; + overflow-y: hidden; + position: relative; + height: 500px; + width: 500px; + } + + .box { + scroll-snap-align: start; + height: 100px; + width: 100px; + position: absolute; + top: 200px; + } + + #box1 { + background-color: red; + } + + #box2 { + background-color: yellow; + left: 200px; + } + + #box3 { + background-color: blue; + left: 400px; + } + </style> +</head> +<body> + <div id="scroller" class="scroller"> + <div id="space"></div> + <div id="box1" class="box"><h1>1</h1></div> + <div id="box2" class="box"><h1>2</h1></div> + <div id="box3" class="box"><h1>3</h1></div> + </div> + <script> + const scroller = document.getElementById("scroller"); + promise_test(async (t) => { + // This tests snapchanging firing after a layout change in the middle of a + // touch scroll. We start a touch scroll far enough that snapchanging + // fires and then, with the pointer still down, we change the layout so + // that snapchanging should fire with a different target. + await waitForScrollReset(t, scroller); + await waitForCompositorCommit(); + + const start_pos_x = Math.round(box2.offsetLeft); + // Drag by enough to ensure box2 is the preferred snap target. + const drag_amt = Math.round(box2.offsetLeft / 2) + 50; + const end_pos_x = start_pos_x - drag_amt; + const pos_y = Math.round(scroller.clientHeight / 2); + let evt_promise; + let snap_evt; + + const save_snapchanging_evt = (evt) => { snap_evt = evt; } + evt_promise = scroller.addEventListener("snapchanging", + save_snapchanging_evt); + // We wait to reach the expected scroll position rather than waiting for a + // snapchanging event to avoid timing out if the snapchanging event does + // not fire. + const scroll_promise = new Promise((resolve) => { + scroller.addEventListener("scroll", async () => { + if (scroller.scrollLeft >= (box2.offsetLeft / 2)) { + await waitForAnimationFrames(2); + resolve(); + } + }); + }); + + await new test_driver.Actions() + .addPointer("TestPointer", "touch") + .pointerMove(start_pos_x, pos_y) + .pointerDown() + .addTick() + .pause(200) + // Drag closer to box2, which should trigger a snapchanging event. + .pointerMove(start_pos_x - drag_amt, pos_y) + .send(); + + // assert snapchanging that should have already happened. + await scroll_promise; + assertSnapEvent(snap_evt, [box2.id]); + + evt_promise = waitForSnapEvent(scroller, "snapchanging", false); + // Change layout while pointer is still down. + let box2_prev_left = getComputedStyle(box2).getPropertyValue("left"); + let box3_prev_left = getComputedStyle(box3).getPropertyValue("left"); + box2.style.left = box3_prev_left; + box3.style.left = box2_prev_left; + snap_evt = await evt_promise; + assertSnapEvent(snap_evt, [box3.id]); + }, "snapchanging fires after layout change"); + </script> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html new file mode 100644 index 00000000000..29d0239e2d6 --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html @@ -0,0 +1,198 @@ +<!DOCTYPE html> +<html> + +<head> + <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="/dom/events/scrolling/scroll_support.js"></script> + <script src="/css/css-scroll-snap-2/resources/common.js"></script> + <script src="/css/css-scroll-snap-2/resources/user-scroll-common.js"></script> +</head> + +<body> + <style> + :root { + scroll-snap-type: y mandatory; + } + #scroller { + height: 400px; + width: 400px; + position: relative; + overflow: scroll; + scroll-snap-type: y mandatory; + border: solid 1px black; + } + + .box { + position: absolute; + left: 150px; + height: 80vh; + width: 100px; + border: solid 1px white; + } + + .snap { + scroll-snap-align: start; + } + + .blue { + background-color: blue; + } + + .green { + background-color: green; + } + + .yellow { + background-color: yellow; + } + + #snap_area_1 { + top: 0px; + } + + #snap_area_2 { + top: calc(80vh + 2px); /* height of snap_area_1 + its borders. */ + } + + #snap_area_3 { + top: calc(160vh + 4px); /* heights of snap areas 1 & 2 + their borders */ + } + + .large_space { + height: 400vh; + width: 400vw; + position: absolute; + } + </style> + <div class="large_space"></div> + <div id="snap_area_1" class="blue snap box"></div> + <div id="snap_area_2" class="green snap box"></div> + <div id="snap_area_3" class="yellow snap box"></div> + <script> + const scroller = document.scrollingElement; + + // Touch scroll test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const scroller_middle = Math.round(scroller.clientWidth / 2); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + const start_pos = { x: scroller_middle, y: snap_area_2.offsetTop }; + const end_pos = { x: scroller_middle, y: 0 }; + await snap_event_touch_scroll_helper(start_pos, end_pos); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "touch scrolling fires snapchanging."); + + // Wheel scroll test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + await new test_driver.Actions().scroll(0, 0, 0, + Math.round(snap_area_2.offsetTop / 2) + 1).send(); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "mouse wheel scroll triggers snapchanging."); + + // Scrollbar drag test. + promise_test(async (t) => { + await waitForCompositorCommit(); + // Skip test on platforms that do not have a visible scrollbar (e.g. + // overlay scrollbar). + const scrollbar_width = window.innerWidth - + document.documentElement.clientWidth; + const test_data = { + scroller: scroller, + scrolling_function: async () => { + const scrollbar_to_scroller_ratio = + getScrollbarToScrollerRatio(scroller); + // Scroll by just over half of the top box's height. + const drag_amt = (snap_area_2.offsetTop / 2 + 1) * + scrollbar_to_scroller_ratio; + await snap_event_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "scrollbar dragging fires snapchanging."); + + // Keyboard test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + scroller.focus(); + window.test_driver.send_keys(document.documentElement, '\ue015'/*ArrowDown*/); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "keyboard scroll triggers snapchanging."); + + // Touch scroll test: peek at snap_area_2 and then drag back to + // snap_area_1. + promise_test(async (t) => { + await waitForScrollReset(t, scroller); + await waitForCompositorCommit(); + const pos_x = Math.round(scroller.clientWidth / 2); + const start_pos_y = Math.round(snap_area_2.offsetTop); + let evts_promise = waitForEventsUntil(document, "snapchanging", + waitForScrollendEventNoTimeout(document)); + await new test_driver.Actions() + .addPointer("TestPointer", "touch") + .pointerMove(pos_x, start_pos_y) + .pointerDown() + .addTick() + .pause(200) + // Drag up to y=0, which should trigger a snapchanging event. + .pointerMove(pos_x, 0) + .addTick() + .pause(200) + // Drag down again to start position, which should trigger a + // snapchanging event. + .pointerMove(pos_x, start_pos_y) + .pointerUp() + .send(); + let evts = await evts_promise; + assert_equals(evts.length, 2, "2 snapchanging events are seens"); + assertSnapEvent(evts[0], [snap_area_2.id]); + assertSnapEvent(evts[1], [snap_area_1.id]); + }, "snapchanging fires as scroll moves through different snap targets."); + + // snapchanging doesn't fire test. + promise_test(async (t) => { + test_no_snapchanging(t, scroller, 10); + }, "snapchanging doesn't fire if scroll doesn't reach different snap " + + "targets."); + </script> +</body> + +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html new file mode 100644 index 00000000000..2c1f9742b62 --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html @@ -0,0 +1,188 @@ +<!DOCTYPE html> +<html> +<head> + <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="/dom/events/scrolling/scroll_support.js"></script> + <script src="/css/css-scroll-snap-2/resources/common.js"></script> + <script src="/css/css-scroll-snap-2/resources/user-scroll-common.js"></script> +</head> + +<body> + <style> + #scroller { + height: 400px; + width: 400px; + position: relative; + overflow: scroll; + scroll-snap-type: y mandatory; + border: solid 1px black; + } + .box { + position: absolute; + left: 150px; + height: 350px; + width: 100px; + border: solid 1px white; + } + .snap { + scroll-snap-align: start; + } + .blue { + background-color: blue; + } + .green { + background-color: green; + } + .yellow { + background-color: yellow; + } + #snap_area_1 { + top: 0px; + } + #snap_area_2 { + top: 352px; + } + #snap_area_3 { + top: 704px; + } + .large_space { + height: 400vh; + width: 400vw; + position: absolute; + } + </style> + <div id="scroller"> + <div class="large_space"></div> + <div id="snap_area_1" class="blue snap box"></div> + <div id="snap_area_2" class="green snap box"></div> + <div id="snap_area_3" class="yellow snap box"></div> + </div> + <script> + const scroller = document.getElementById("scroller"); + + // Touch scroll test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const scroller_middle = Math.round(scroller.clientWidth / 2); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + const start_pos = { x: scroller_middle, y: snap_area_2.offsetTop }; + const end_pos = { x: scroller_middle, y: 0 }; + await snap_event_touch_scroll_helper(start_pos, end_pos); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "touch scrolling fires snapchanging."); + + // Wheel scroll test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + await new test_driver.Actions().scroll(0, 0, 0, + Math.round(snap_area_2.offsetTop / 2) + 1, + { origin: scroller }).send(); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "mouse wheel scroll triggers snapchanging."); + + // Scrollbar drag test. + promise_test(async (t) => { + await waitForCompositorCommit(); + // Skip test on platforms that do not have a visible scrollbar (e.g. + // overlay scrollbar). + const scrollbar_width = scroller.offsetWidth - scroller.clientWidth; + if (scrollbar_width == 0) + return; + const test_data = { + scroller: scroller, + scrolling_function: async () => { + const scrollbar_to_scroller_ratio = + getScrollbarToScrollerRatio(scroller); + // Scroll by just over half of the top box's height. + const drag_amt = (snap_area_2.offsetTop / 2 + 1) * + scrollbar_to_scroller_ratio; + await snap_event_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "scrollbar dragging fires snapchanging."); + + // Keyboard test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + scroller.focus(); + window.test_driver.send_keys(scroller, '\ue015'/*ArrowDown*/); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "keyboard scroll triggers snapchanging."); + + // Touch scroll test: peek at snap_area_2 and then drag back to + // snap_area_1. + promise_test(async (t) => { + await waitForScrollReset(t, scroller); + await waitForCompositorCommit(); + const pos_x = Math.round(scroller.clientWidth / 2); + const start_pos_y = Math.round(snap_area_2.offsetTop); + let evts_promise = waitForEventsUntil(scroller, "snapchanging", + waitForScrollendEventNoTimeout(scroller)); + await new test_driver.Actions() + .addPointer("TestPointer", "touch") + .pointerMove(pos_x, start_pos_y) + .pointerDown() + .addTick() + .pause(200) + // Drag up to y=0, which should trigger a snapchanging event. + .pointerMove(pos_x, 0) + .addTick() + .pause(200) + // Drag down again to start position, which should trigger a + // snapchanging event. + .pointerMove(pos_x, start_pos_y) + .pointerUp() + .send(); + let evts = await evts_promise; + assert_equals(evts.length, 2, "2 snapchanging events are seens"); + assertSnapEvent(evts[0], [snap_area_2.id]); + assertSnapEvent(evts[1], [snap_area_1.id]); + }, "snapchanging fires as scroll moves through different snap targets."); + + // snapchanging doesn't fire test. + promise_test(async (t) => { + test_no_snapchanging(t, scroller, 10); + }, "snapchanging doesn't fire if scroll doesn't reach different snap " + + "targets."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align-nested.tentative.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align-nested.tentative.html new file mode 100644 index 00000000000..ddea5705517 --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align-nested.tentative.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<title> + Updating the snap alignment of a snap container's content should make the snap + container resnap accordingly. +</title> +<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +div { + position: absolute; + margin: 0; +} + +#scroller { + height: 200px; + width: 200px; + overflow: hidden; + scroll-snap-type: both mandatory; +} + +#initial-target { + width: 300px; + height: 300px; + top: 100px; + left: 100px; + background-color: green; + scroll-snap-align: start; +} + +#other-target { + width: 300px; + height: 300px; + top: 300px; + left: 300px; + background-color: red; + scroll-snap-align: start; +} + +.area { + width: 2000px; + height: 2000px; +} + +.snap-area { + scroll-snap-align: start !important; +} +</style> + +<div id="scroller"> + <div class="area"></div> + <div id="initial-target"></div> + <div id="other-target"></div> +</div> + +<script> +const initial_target = document.getElementById("initial-target"); +const other_target = document.getElementById("other-target"); +const scroller = document.getElementById("scroller"); + +function cleanup() { + initial_target.style.setProperty("scroll-snap-align", "start"); + other_target.style.setProperty("scroll-snap-align", "start"); + initial_target.removeAttribute("class"); +} + +test(t => { + t.add_cleanup(cleanup); + scroller.scrollTo(0,0); + assert_equals(scroller.scrollTop, 100); + assert_equals(scroller.scrollLeft, 100); + + initial_target.style.setProperty("scroll-snap-align", "end"); + // scroller maintains scroll position which is still valid as the target's + // snap area covers the snap port. + assert_equals(scroller.scrollTop, 100); + assert_equals(scroller.scrollLeft, 100); +}, "Changing a large target's snap alignment shouldn't make the scroller" + + " resnap if the scroller is already in a valid snap position."); + +// Similar to above test case except targets are too small to cover snap port, +// so scroller must snap in response to change in scroll-snap-align. +test(t => { + t.add_cleanup(cleanup); + const initial_target_height = initial_target.offsetHeight; + const initial_target_width = initial_target.offsetWidth; + const other_target_height = initial_target.offsetHeight; + const other_target_width = initial_target.offsetWidth; + t.add_cleanup(() => { + initial_target.style.setProperty("height", `${initial_target_height}px`); + initial_target.style.setProperty("width", `${initial_target_width}px`); + other_target.style.setProperty("height", `${other_target_height}px`); + other_target.style.setProperty("width", `${other_target_width}px`); + }) + scroller.scrollTo(0,0); + assert_equals(scroller.scrollTop, 100); + assert_equals(scroller.scrollLeft, 100); + + initial_target.style.setProperty("height", `${scroller.clientHeight * 2/3 }px`); + initial_target.style.setProperty("width", `${scroller.clientWidth * 2/3 }px`); + other_target.style.setProperty("height", `${scroller.clientHeight * 2/3 }px`); + other_target.style.setProperty("width", `${scroller.clientWidth * 2/3 }px`); + + // scroll (and snap) to top left of other target. + scroller.scrollTo(other_target.offsetTop, + other_target.offsetLeft); + assert_equals(scroller.scrollTop, other_target.offsetTop,); + assert_equals(scroller.scrollLeft, other_target.offsetLeft); + + other_target.style.setProperty("scroll-snap-align", "end"); + // should be scrolled so as to align scroller's bottom-right with + // other_target's bottom-right. + assert_equals(scroller.scrollTop, + other_target.offsetTop + other_target.offsetHeight - scroller.clientHeight); + assert_equals(scroller.scrollLeft, + other_target.offsetLeft + other_target.offsetWidth - scroller.clientWidth); +}, "Changing the current (non-covering) target's snap alignment should make " + + "the scroller snap according to the new alignment."); +</script> diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html index c4bb2e9ff42..a625621c270 100644 --- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html +++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html @@ -70,59 +70,6 @@ test(t => { assert_equals(scroller.scrollTop, 100); assert_equals(scroller.scrollLeft, 100); - initial_target.style.setProperty("scroll-snap-align", "end"); - // scroller maintains scroll position which is still valid as the target's - // snap area covers the snap port. - assert_equals(scroller.scrollTop, 100); - assert_equals(scroller.scrollLeft, 100); -}, "Changing a large target's snap alignment shouldn't make the scroller" + - " resnap if the scroller is already in a valid snap position."); - -// Similar to above test case except targets are too small to cover snap port, -// so scroller must snap in response to change in scroll-snap-align. -test(t => { - t.add_cleanup(cleanup); - const initial_target_height = initial_target.offsetHeight; - const initial_target_width = initial_target.offsetWidth; - const other_target_height = initial_target.offsetHeight; - const other_target_width = initial_target.offsetWidth; - t.add_cleanup(() => { - initial_target.style.setProperty("height", `${initial_target_height}px`); - initial_target.style.setProperty("width", `${initial_target_width}px`); - other_target.style.setProperty("height", `${other_target_height}px`); - other_target.style.setProperty("width", `${other_target_width}px`); - }) - scroller.scrollTo(0,0); - assert_equals(scroller.scrollTop, 100); - assert_equals(scroller.scrollLeft, 100); - - initial_target.style.setProperty("height", `${scroller.clientHeight * 2/3 }px`); - initial_target.style.setProperty("width", `${scroller.clientWidth * 2/3 }px`); - other_target.style.setProperty("height", `${scroller.clientHeight * 2/3 }px`); - other_target.style.setProperty("width", `${scroller.clientWidth * 2/3 }px`); - - // scroll (and snap) to top left of other target. - scroller.scrollTo(other_target.offsetTop, - other_target.offsetLeft); - assert_equals(scroller.scrollTop, other_target.offsetTop,); - assert_equals(scroller.scrollLeft, other_target.offsetLeft); - - other_target.style.setProperty("scroll-snap-align", "end"); - // should be scrolled so as to align scroller's bottom-right with - // other_target's bottom-right. - assert_equals(scroller.scrollTop, - other_target.offsetTop + other_target.offsetHeight - scroller.clientHeight); - assert_equals(scroller.scrollLeft, - other_target.offsetLeft + other_target.offsetWidth - scroller.clientWidth); -}, "Changing the current (non-covering) target's snap alignment should make " + - "the scroller snap according to the new alignment."); - -test(t => { - t.add_cleanup(cleanup); - scroller.scrollTo(0,0); - assert_equals(scroller.scrollTop, 100); - assert_equals(scroller.scrollLeft, 100); - initial_target.style.setProperty("scroll-snap-align", "none"); assert_equals(scroller.scrollTop, 300); assert_equals(scroller.scrollLeft, 300); diff --git a/tests/wpt/tests/css/css-text/overflow-wrap/crashtests/overflow-wrap-leading-floats-crash.html b/tests/wpt/tests/css/css-text/overflow-wrap/crashtests/overflow-wrap-leading-floats-crash.html new file mode 100644 index 00000000000..0661cf72864 --- /dev/null +++ b/tests/wpt/tests/css/css-text/overflow-wrap/crashtests/overflow-wrap-leading-floats-crash.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link ref="help" href="crbug.com/1510579"> +<style> +#container { + width: 0; + text-indent: 1em; + overflow-wrap: anywhere; +} +</style> +<div id="container"> + <div style="float: left"></div> + 12 +</div> diff --git a/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-ref.html b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-ref.html new file mode 100644 index 00000000000..8025539309f --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + width: 200px; + height: 200px; + background-color: black; + transform: translate(50%, 50%); +} + +</style> +</head> +<body> +<div></div> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate-ref.html b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate-ref.html new file mode 100644 index 00000000000..8025539309f --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + width: 200px; + height: 200px; + background-color: black; + transform: translate(50%, 50%); +} + +</style> +</head> +<body> +<div></div> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html new file mode 100644 index 00000000000..d03ba24f936 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height-separate.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<title>Animating the "transform" property with a percent value while also animating "width" and "height" using two separate animations</title> +<link rel="help" href="https://drafts.csswg.org/css-transforms/"> +<link rel="match" href="transform-percent-with-width-and-height-separate-ref.html"> +<script src="../../../common/reftest-wait.js"></script> +<style> + +div { + width: 10px; + height: 10px; + background-color: black; + animation-duration: 10s; + animation-name: size, transform; +} + +@keyframes size { + 0.000000001%, to { + width: 200px; + height: 200px; + } +} + +@keyframes transform { + 0.000000001%, to { + transform: translate(50%, 50%); + } +} + +</style> +</head> +<body> +<div></div> +<script> +(async function() { + await Promise.all(document.getAnimations().map(animation => animation.ready)); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + takeScreenshot(); +})(); +</script> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height.html b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height.html new file mode 100644 index 00000000000..a207435db40 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/transform-percent-with-width-and-height.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<title>Animating the "transform" property with percent values while also animating "width" and "height"</title> +<link rel="help" href="https://drafts.csswg.org/css-transforms/"> +<link rel="match" href="transform-percent-with-width-and-height-ref.html"> +<script src="../../../common/reftest-wait.js"></script> +<style> + +div { + width: 10px; + height: 10px; + background-color: black; + animation: anim 10s linear forwards; +} + +@keyframes anim { + 0.000000001%, to { + width: 200px; + height: 200px; + transform: translate(50%, 50%); + } +} + +</style> +</head> +<body> +<div></div> +<script> +(async function() { + await Promise.all(document.getAnimations().map(animation => animation.ready)); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + takeScreenshot(); +})(); +</script> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-ref.html b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-ref.html new file mode 100644 index 00000000000..ddd7d01b691 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + width: 200px; + height: 200px; + background-color: black; + translate: 50%, 50%; +} + +</style> +</head> +<body> +<div></div> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate-ref.html b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate-ref.html new file mode 100644 index 00000000000..62ec4d9b3d4 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + width: 200px; + height: 200px; + background-color: black; + translate: 50% 50%; +} + +</style> +</head> +<body> +<div></div> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html new file mode 100644 index 00000000000..bfd5d483fee --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height-separate.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<title>Animating the "translate" property with a percent value while also animating "width" and "height" using two separate animations</title> +<link rel="help" href="https://drafts.csswg.org/css-transforms/"> +<link rel="match" href="translate-percent-with-width-and-height-separate-ref.html"> +<script src="../../../common/reftest-wait.js"></script> +<style> + +div { + width: 10px; + height: 10px; + background-color: black; + animation-duration: 10s; + animation-name: size, translate; +} + +@keyframes size { + 0.000000001%, to { + width: 200px; + height: 200px; + } +} + +@keyframes translate { + 0.000000001%, to { + translate: 50% 50%; + } +} + +</style> +</head> +<body> +<div></div> +<script> +(async function() { + await Promise.all(document.getAnimations().map(animation => animation.ready)); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + takeScreenshot(); +})(); +</script> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height.html b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height.html new file mode 100644 index 00000000000..fa7ea844630 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/animation/translate-percent-with-width-and-height.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<title>Animating the "translate" property with percent values while also animating "width" and "height"</title> +<link rel="help" href="https://drafts.csswg.org/css-transforms/"> +<link rel="match" href="translate-percent-with-width-and-height-ref.html"> +<script src="../../../common/reftest-wait.js"></script> +<style> + +div { + width: 10px; + height: 10px; + background-color: black; + animation: anim 10s linear forwards; +} + +@keyframes anim { + 0.000000001%, to { + width: 200px; + height: 200px; + translate: 50%, 50%; + } +} + +</style> +</head> +<body> +<div></div> +<script> +(async function() { + await Promise.all(document.getAnimations().map(animation => animation.ready)); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + takeScreenshot(); +})(); +</script> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-transitions/animations/animate-with-color-mix.html b/tests/wpt/tests/css/css-transitions/animations/animate-with-color-mix.html deleted file mode 100644 index 3e630a7a2b1..00000000000 --- a/tests/wpt/tests/css/css-transitions/animations/animate-with-color-mix.html +++ /dev/null @@ -1,146 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>CSS transitions with color-mix</title> -</head> -<style> - #target-1, #target-2, #target-3, #target-4, #target-5, #target-6 { - color: black; - height: 100px; - width: 100px; - display: inline-block; - transition: background-color 1s linear; - } - #target-1, - #target-2.update-2, - #target-3, - #target-4.update-4 { - background-color: color-mix(in srgb, white 50%, - currentcolor); - } - #target-1.update-1, - #target-2 { - background-color: rgb(0, 255, 0); - } - - #target-3.update-3, - #target-4 { - background-color: color(srgb 0.0 1.0 0.0); - } - - #target-5, #target-6.update-6 { - background-color: color-mix(in srgb, transparent 50%, - currentcolor); - } - - #target-6, #target-5.update-5 { - background-color: rgba(255, 255, 255, 0.75); - } - -</style> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/web-animations/testcommon.js"></script> -<script src="/css/support/color-testcommon.js"></script> -<body> - <div id="target-1"></div> - <div id="target-2"></div> - <div id="target-3"></div> - <div id="target-4"></div> - <div id="target-5"></div> - <div id="target-6"></div> -</body> -<script> - 'use strict'; - - async function runAnimationTest(t, elementId, update, - expected_colors) { - const elem = document.getElementById(elementId); - t.add_cleanup(() => { - elem.classList.remove(update); - }); - await waitForNextFrame(); - await waitForNextFrame(); - elem.classList.add(update); - const anim = elem.getAnimations()[0]; - await anim.ready; - // Keep the animation in effect when it reaches the end. - anim.effect.updateTiming({ fill: 'forwards' }); - expected_colors.forEach(data => { - anim.currentTime = 1000 * data.at; - const actual = getComputedStyle(elem).backgroundColor; - const expected = data.value; - assert_oklab_color( - actual, expected, - `Background color at ${100*data.at}% animation progress`); - }); - } - - const gray_to_green = [ - { at: 0, value: 'oklab(0.5981 0.0000 0.0000)' }, - { at: 0.25, value: 'oklab(0.6652 -0.0584 0.0449)' }, - { at: 0.5, value: 'oklab(0.7323 -0.1169 0.0898)' }, - { at: 0.75, value: 'oklab(0.7994 -0.1754 0.1346)' }, - { at: 1, value: 'oklab(0.8664 -0.2338 0.1795)' } - ]; - - const green_to_gray = [ - { at: 0, value: 'oklab(0.8664 -0.2338 0.1795)' }, - { at: 0.25, value: 'oklab(0.7994 -0.1754 0.1346)' }, - { at: 0.5, value: 'oklab(0.7323 -0.1169 0.0898)' }, - { at: 0.75, value: 'oklab(0.6652 -0.0584 0.0449)' }, - { at: 1, value: 'oklab(0.5981 0.0000 0.0000)' } - ]; - - const translucent_black_to_white = [ - { at: 0, value: 'oklab(0 0 0 / 0.5)' }, - { at: 0.25, value: 'oklab(0.3330 0 0 / 0.5623)' }, - { at: 0.5, value: 'oklab(0.5997 0 0 / 0.6245)' }, - { at: 0.75, value: 'oklab(0.8180 0 0 / 0.6868)' }, - { at: 1, value: 'oklab(1 0 0 / 0.75)' } - ]; - - const translucent_white_to_black = [ - { at: 0, value: 'oklab(1 0 0 / 0.75)' }, - { at: 0.25, value: 'oklab(0.8180 0 0. / 0.6868)' }, - { at: 0.5, value: 'oklab(0.5997 0 0 / 0.6245)' }, - { at: 0.75, value: 'oklab(0.3330 0 0 / 0.5623)' }, - { at: 1, value: 'oklab(0 0 0 / 0.5)' } - ]; - - window.onload = async () => { - promise_test(t => { - return runAnimationTest(t, 'target-1', 'update-1', - gray_to_green); - }, 'Transition from color-mix to legacy rgb'); - - promise_test(t => { - return runAnimationTest(t, 'target-2', 'update-2', - green_to_gray); - }, 'Transition from legacy rgb to color-mix'); - - promise_test(t => { - return runAnimationTest(t, 'target-3', 'update-3', - gray_to_green); - }, 'Transition from color-mix to srgb'); - - promise_test(t => { - return runAnimationTest(t, 'target-4', 'update-4', - green_to_gray); - }, 'Transition from srgb to color-mix'); - - promise_test(t => { - return runAnimationTest(t, 'target-5', 'update-5', - translucent_black_to_white); - }, 'Transition from color-mix with transparency to legacy rgba'); - - promise_test(t => { - return runAnimationTest(t, 'target-6', 'update-6', - translucent_white_to_black); - }, 'Transition from legacy rgba to color-mix with transparency'); - }; -</script> -</html> diff --git a/tests/wpt/tests/css/css-values/integer_interpolation_round_half_towards_positive_infinity_order.html b/tests/wpt/tests/css/css-values/integer_interpolation_round_half_001.html index 60c439ebcf4..60c439ebcf4 100644 --- a/tests/wpt/tests/css/css-values/integer_interpolation_round_half_towards_positive_infinity_order.html +++ b/tests/wpt/tests/css/css-values/integer_interpolation_round_half_001.html diff --git a/tests/wpt/tests/css/css-values/integer_interpolation_round_half_towards_positive_infinity_z_index.html b/tests/wpt/tests/css/css-values/integer_interpolation_round_half_002.html index c9b042ccb8f..c9b042ccb8f 100644 --- a/tests/wpt/tests/css/css-values/integer_interpolation_round_half_towards_positive_infinity_z_index.html +++ b/tests/wpt/tests/css/css-values/integer_interpolation_round_half_002.html diff --git a/tests/wpt/tests/css/css-values/minmax-length-percent-serialize.html b/tests/wpt/tests/css/css-values/minmax-length-percent-serialize.html index 20d54d8cb0c..0a109d7c18e 100644 --- a/tests/wpt/tests/css/css-values/minmax-length-percent-serialize.html +++ b/tests/wpt/tests/css/css-values/minmax-length-percent-serialize.html @@ -126,8 +126,8 @@ test_serialization( test_serialization( 'max((min(10%, 30px) + 10px) * 2 + 10px, 5em + 5%)', - 'max(10px + (10px + min(10%, 30px)) * 2, 5% + 5em)', - 'max(10px + (10px + min(10%, 30px)) * 2, 5% + 80px)', + 'max(10px + ((10px + min(10%, 30px)) * 2), 5% + 5em)', + 'max(10px + ((10px + min(10%, 30px)) * 2), 5% + 80px)', '85px', prop='width'); </script> diff --git a/tests/wpt/tests/css/css-values/progress-computed.tentative.html b/tests/wpt/tests/css/css-values/progress-computed.tentative.html index cb1edfffb47..2f564fa14e9 100644 --- a/tests/wpt/tests/css/css-values/progress-computed.tentative.html +++ b/tests/wpt/tests/css/css-values/progress-computed.tentative.html @@ -18,9 +18,20 @@ test_math_used('progress(sign(-10px) * 10px from (10px - 10px) to 10px * progres test_math_used('calc(progress(100px from 0px to 50px) * 10px + 100px)', '120px'); test_math_used('calc(progress(100 from 0 to sign(50px)))', '100', {type:'number'}); test_math_used('calc(progress(abs(5%) from hypot(3%, 4%) to 10%))', '1', {type:'number', approx:0.001}); +test_math_used('progress(1000em from 10em to 110em)', '10', {type:'number'}); +test_math_used('scale(progress(1000em from 10rem to 110em))', 'scale(10)', {prop:'transform', type:'number'}); +test_math_used('scale(progress(0em from 0rem to 0em))', 'scale(0)', {prop:'transform', type:'number'}); +test_math_used('scale(progress(sign(1em - 1rem) * 1ex from 0rem to 0em))', 'scale(0)', {prop:'transform', type:'number'}); // Type checking test_math_used('calc(progress(1 from 0 to 1) * 10px)', '10px'); test_math_used('calc(progress(1 from 0 to 1) * 1s)', '1s', {type:'time'}); test_math_used('calc(progress(1 from 0 to 1) * 1deg)', '1deg', {type:'angle', approx:0.001}); + +// Test different number accepting properties +test_math_used('calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 10em from 2rem to 12em) / 2)', '0.5', {prop:'opacity', type:'number'}); +test_math_used('calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 10)', '20', {prop:'order', type:'number'}); +test_math_used('calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 30)', '60', {prop:'flex-grow', type:'number'}); +test_math_used('calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) / 4)', '0.5', {prop:'flex-grow', type:'number'}); +test_math_used('calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 4)', '8', {prop:'column-count', type:'number'}); </script> diff --git a/tests/wpt/tests/css/css-variables/variable-recalc-with-initial.html b/tests/wpt/tests/css/css-variables/variable-recalc-with-initial.html new file mode 100644 index 00000000000..0d880f41f14 --- /dev/null +++ b/tests/wpt/tests/css/css-variables/variable-recalc-with-initial.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<head> + <title>Style recalculation picks up “initial” variable declaration</title> + <link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> + <link rel="help" href="https://crbug.com/1508841"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <style> + .a { + --color: red; + } + .b { + --color: initial; + } + .c { + color: var(--color, green); + } + </style> +</head> +<body> + <div class="a"> + <div class="b"> + <div class="c" id="target">Test passes if this text is green.</div> + </div> + </div> + <script> + test(() => { + let target = document.getElementById('target'); + target.offsetTop; + document.body.style.pointerEvents = 'none'; + assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)'); + }); + </script> +</body> diff --git a/tests/wpt/tests/css/css-view-transitions/document-element-detatched-crash.html b/tests/wpt/tests/css/css-view-transitions/document-element-detached-crash.html index 3c5419a8102..cfdf769695d 100644 --- a/tests/wpt/tests/css/css-view-transitions/document-element-detatched-crash.html +++ b/tests/wpt/tests/css/css-view-transitions/document-element-detached-crash.html @@ -1,4 +1,5 @@ <!DOCTYPE html> +<html class="test-wait"> <title>View transitions: documentElement.remove</title> <link rel="help" href="https://github.com/WICG/view-transitions"> <link rel="author" href="mailto:vmpstr@chromium.org"> @@ -10,12 +11,15 @@ html { </style> <script> -async function runTest() { +function runTest() { document.startViewTransition(() => { - requestAnimationFrame(() => document.documentElement.remove()); - }) - + requestAnimationFrame(() => { + const html = document.documentElement; + html.remove(); + html.classList.remove('test-wait'); + }); + }); } onload = () => requestAnimationFrame(runTest); </script> - +</html> diff --git a/tests/wpt/tests/css/css-view-transitions/list-style-position-style-change-crash.html b/tests/wpt/tests/css/css-view-transitions/list-style-position-style-change-crash.html new file mode 100644 index 00000000000..5910d5d95a1 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/list-style-position-style-change-crash.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html class="test-wait"> +<title>View transitions: list-style-position crash</title> +<link rel="help" href="https://github.com/WICG/view-transitions"> +<link rel="author" href="mailto:bokan@chromium.org"> + +<script> +onload = async () => { + let vt = document.startViewTransition(); + await vt.ready; + await new Promise(resolve => requestAnimationFrame(resolve)); + + document.documentElement.style.listStylePosition = 'inside'; + // Force style update. + window.scrollX; + + document.documentElement.classList.remove('test-wait'); +} +</script> +</html> diff --git a/tests/wpt/tests/css/css-writing-modes/forms/checkbox-switch-input-computed-style.tentative.html b/tests/wpt/tests/css/css-writing-modes/forms/checkbox-switch-input-computed-style.tentative.html new file mode 100644 index 00000000000..f8d8d6fca28 --- /dev/null +++ b/tests/wpt/tests/css/css-writing-modes/forms/checkbox-switch-input-computed-style.tentative.html @@ -0,0 +1,37 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Switch input writing mode computed style</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<input type=checkbox switch id=horizontal-input style="writing-mode: horizontal-tb"> +<input type=checkbox switch id=vertical-lr-input style="writing-mode: vertical-lr"> +<input type=checkbox switch id=vertical-rl-input style="writing-mode: vertical-rl"> + +<script> +for (const element of document.querySelectorAll("[id^='horizontal-']")) { + test(() => { + const style = getComputedStyle(element); + const blockSize = parseInt(style.blockSize, 10); + const inlineSize = parseInt(style.inlineSize, 10); + assert_not_equals(blockSize, 0); + assert_not_equals(inlineSize, 0); + assert_greater_than(inlineSize, blockSize); + assert_equals(style.blockSize, style.height); + assert_equals(style.inlineSize, style.width); + }, `${element.id} block size should match height and inline size should match width`); +} + +for (const element of document.querySelectorAll("[id^='vertical-']")) { + test(() => { + const style = getComputedStyle(element); + const blockSize = parseInt(style.blockSize, 10); + const inlineSize = parseInt(style.inlineSize, 10); + assert_not_equals(blockSize, 0); + assert_not_equals(inlineSize, 0); + assert_greater_than(inlineSize, blockSize); + assert_equals(style.blockSize, style.width); + assert_equals(style.inlineSize, style.height); + }, `${element.id} block size should match width and inline size should match height`); +} +</script> diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-default-css.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-default-css.html index 8606b1f3ed4..575d7318601 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-default-css.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-default-css.html @@ -6,6 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <style> .scrollable { @@ -27,6 +28,10 @@ var elementToRevealTop = 250; var scrollFunction = "scroll"; + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + promise_test(() => { resetScroll(scrollingElement); assert_equals(scrollingElement.scrollLeft, 0); diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-element.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-element.html index c598d97b331..2b3adf0a70d 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-element.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-element.html @@ -6,6 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <style> .scrollable { @@ -33,6 +34,10 @@ var elementToRevealLeft = 500; var elementToRevealTop = 250; + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + ["scroll", "scrollTo", "scrollBy", "scrollIntoView"].forEach((scrollFunction) => { promise_test(() => { resetScroll(scrollingElement); diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-root.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-root.html index d60275f1ccf..228f549989f 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-root.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-root.html @@ -7,6 +7,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <style> body { @@ -40,9 +41,8 @@ add_completion_callback(() => { resetScroll(scrollingElement); }); promise_test(async () => { - await new Promise(resolve => requestAnimationFrame(resolve)); - await new Promise(resolve => requestAnimationFrame(resolve)); - }, `Make sure the page content is stable`); + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); ["scroll", "scrollTo", "scrollBy", "scrollIntoView"].forEach((scrollFunction) => { promise_test(() => { diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-window.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-window.html index 7593baf1b86..c3f05da335f 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-window.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-main-frame-window.html @@ -7,6 +7,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <style> body { @@ -40,9 +41,8 @@ add_completion_callback(() => { resetScrollForWindow(window); }); promise_test(async () => { - await new Promise(resolve => requestAnimationFrame(resolve)); - await new Promise(resolve => requestAnimationFrame(resolve)); - }, `Make sure the page content is stable`); + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); ["scroll", "scrollTo", "scrollBy"].forEach((scrollFunction) => { promise_test(() => { diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-scrollintoview-nested.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-scrollintoview-nested.html index 2a97e065663..d05dd772f3b 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-scrollintoview-nested.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-scrollintoview-nested.html @@ -6,6 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <style> .scrollable { @@ -48,6 +49,10 @@ </div> </div> <script> + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + // The CSSOM-View spec and implementations follow different algorithms (scrolls performed in parallel, as inner-to-outer sequence or as outer-to-inner sequence). // See https://github.com/w3c/csswg-drafts/issues/3127 promise_test(() => { diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-navigation.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-navigation.html index 299fd76976c..11f0d6a2d9e 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-navigation.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-navigation.html @@ -4,6 +4,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#smooth-scrolling"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <style> .filler { height: 10000px } @@ -24,6 +25,10 @@ <div class="filler"></div> </div> <script> + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + var instantHistoryNavigationTest = async_test("Instant scrolling while doing history navigation."); var smoothHistoryNavigationTest = diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-positions.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-positions.html index 97905bb7081..ce32825223d 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-positions.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth-positions.html @@ -6,6 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <style> .scrollable { @@ -23,6 +24,10 @@ </div> </div> <script> + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + // For smooth behavior, evolution of scroll positions over time is not specified by CSSOM View. // This test relies on the minimal assumption that scroll position functions are monotonic. ["scroll", "scrollTo", "scrollBy", "scrollIntoView"].forEach(function(scrollFunction) { diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth.html index cb2dd9e48a4..909afdef092 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-smooth.html @@ -5,6 +5,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#smooth-scrolling"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <style> .filler { height: 10000px } @@ -25,6 +26,10 @@ <div class="filler"></div> </div> <script> + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + test(() => { scrollable.scrollTo(0, 5000); assert_equals(scrollable.scrollTop, 5000, "Initially scrolls instantly"); diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-root.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-root.html index 050817d416f..2687d6eb5ca 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-root.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-root.html @@ -6,6 +6,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <div id="log"> </div> @@ -35,6 +36,10 @@ var elementToRevealLeft = 500; var elementToRevealTop = 250; iframeNode.addEventListener("load", iframeLoadTest.step_func_done(() => { + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + scrollingElement = iframeNode.contentDocument.scrollingElement; styledElement = iframeNode.contentDocument.documentElement; elementToReveal = iframeNode.contentDocument.getElementById("elementToReveal"); diff --git a/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-window.html b/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-window.html index ef587fea49c..3113cbc88e3 100644 --- a/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-window.html +++ b/tests/wpt/tests/css/cssom-view/scroll-behavior-subframe-window.html @@ -7,6 +7,7 @@ <link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <script src="support/scroll-behavior.js"></script> <div id="log"> </div> @@ -36,6 +37,10 @@ var elementToRevealLeft = 500; var elementToRevealTop = 250; iframeNode.addEventListener("load", iframeLoadTest.step_func_done(() => { + promise_test(async () => { + await waitForCompositorReady(); + }, "Make sure the page is ready for animation."); + scrollingWindow = iframeNode.contentWindow; styledElement = iframeNode.contentDocument.documentElement; elementToReveal = iframeNode.contentDocument.getElementById("elementToReveal"); diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html new file mode 100644 index 00000000000..b8ea73cc1fb --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html @@ -0,0 +1,52 @@ +<!doctype html> +<title>CSSOM View - scrollIntoView aligns scrollport-covering child in both inline and block directions.</title> +<meta charset="utf-8"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1497677"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #scroller { + width: 200px; + height: 200px; + background-color: purple; + overflow: hidden; + position: relative; + } + #child { + width: 400px; + height: 400px; + background-color: green; + position: absolute; + left: 0px; + top: 0px; + } +</style> +<div id="scroller"> + <div id="space" style="height:400%; width: 400%"></div> + <div id="child"></div> +</div> +<script> + const scroller = document.getElementById("scroller"); + const child = document.getElementById("child"); + + function test_alignment(alignment, start_offset, expected_offset) { + scroller.scrollTop = start_offset.top; + scroller.scrollLeft = start_offset.left; + + child.scrollIntoView({block: alignment, inline: alignment}); + + assert_equals(scroller.scrollTop, expected_offset.top, + `${alignment} sets top`); + assert_equals(scroller.scrollLeft, expected_offset.left, + `${alignment} sets left`); + } + + test(function() { + // child, being positioned at (0, 0) and having size 400 x 400 covers the + // scrollport at scroll offsets (0,0) and (100, 100). + test_alignment("start", {top: 100, left: 100}, {top: 0, left: 0}); + test_alignment("center", {top: 0, left: 0}, {top: 100, left: 100}); + test_alignment("end", {top: 100, left: 100}, {top: 200, left: 200}); + }, "scrollIntoView scrolls scrollport-covering child in both axes"); +</script> diff --git a/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html b/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html new file mode 100644 index 00000000000..adb1b5f7098 --- /dev/null +++ b/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-replace-cssRules.html @@ -0,0 +1,41 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSSStyleSheet.replace reflects the right cssRules.</title> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1864815"> +<link rel="help" href="https://drafts.csswg.org/cssom/#dom-cssstylesheet-replace"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<p></p> +<script> +async function runTest(sync) { + let sheet = new CSSStyleSheet(); + let rules = sheet.cssRules; + function replace(text) { + return sync ? sheet.replaceSync(text) : sheet.replace(text); + } + function assert_color(color) { + assert_equals(sheet.cssRules, rules, "StyleSheet.cssRules is [SameObject]"); + assert_equals(rules.length, 1, "Should have one rule"); + assert_equals(rules[0].style.color, color, "Should be the right css rule"); + } + async function replace_and_test(color) { + await replace(`p { color: ${color} }`); + assert_equals(sheet.cssRules, rules, "StyleSheet.cssRules is [SameObject]"); + assert_equals(rules.length, 1, "Should have one rule"); + assert_equals(rules[0].style.color, color, "Should be the right css rule"); + } + + await replace_and_test("red"); + await replace_and_test("green"); + document.adoptedStyleSheets.push(sheet); + assert_equals(getComputedStyle(document.querySelector("p")).color, "rgb(0, 128, 0)", "Sheet should apply"); + document.adoptedStyleSheets.pop(sheet); + assert_not_equals(getComputedStyle(document.querySelector("p")).color, "rgb(0, 128, 0)", "Sheet should stop applying"); +} + +for (let sync of [true, false]) { + promise_test(() => runTest(sync), `cssRules tests (sync: ${sync})`); +} +</script> diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-svg.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-svg.html new file mode 100644 index 00000000000..01771ed5638 --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-svg.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Correctly apply backdrop-filter with an SVG filter</title> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="reference/backdrop-filter-svg-ref.html"> + +<div class="fuchsiabox"></div> +<div class="filter"></div> + +<svg> + <filter id="invert" color-interpolation-filters="sRGB"> + <feComponentTransfer> + <feFuncR type="table" tableValues="1 0"/> + <feFuncG type="table" tableValues="1 0"/> + <feFuncB type="table" tableValues="1 0"/> + </feComponentTransfer> + </filter> +</svg> + +<style> +.fuchsiabox { + position: absolute; + background: fuchsia; + width: 100px; + height: 100px; + top: 100px; + left: 60px; +} +.filter { + position: absolute; + width: 100px; + height: 100px; + top: 100px; + left: 60px; + backdrop-filter: url(#invert); +} +</style> diff --git a/tests/wpt/tests/css/filter-effects/reference/backdrop-filter-svg-ref.html b/tests/wpt/tests/css/filter-effects/reference/backdrop-filter-svg-ref.html new file mode 100644 index 00000000000..3d5853ac669 --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/reference/backdrop-filter-svg-ref.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<meta charset="utf-8"> + +<div class="fuchsiabox"></div> +<div class="filter"></div> + +<style> +.fuchsiabox { + position: absolute; + background: fuchsia; + width: 100px; + height: 100px; + top: 100px; + left: 60px; +} +.filter { + position: absolute; + width: 100px; + height: 100px; + top: 100px; + left: 60px; + backdrop-filter: invert(1); +} +</style> diff --git a/tests/wpt/tests/css/selectors/any-link-dynamic-001-ref.html b/tests/wpt/tests/css/selectors/invalidation/any-link-attribute-removal-ref.html index b5407429be8..b5407429be8 100644 --- a/tests/wpt/tests/css/selectors/any-link-dynamic-001-ref.html +++ b/tests/wpt/tests/css/selectors/invalidation/any-link-attribute-removal-ref.html diff --git a/tests/wpt/tests/css/selectors/any-link-dynamic-001.html b/tests/wpt/tests/css/selectors/invalidation/any-link-attribute-removal.html index e84989fd0c2..9da6b2edeba 100644 --- a/tests/wpt/tests/css/selectors/any-link-dynamic-001.html +++ b/tests/wpt/tests/css/selectors/invalidation/any-link-attribute-removal.html @@ -2,7 +2,7 @@ <meta charset="utf-8"> <title>CSS test: Handling of dynamic changes to :any-link selectors</title> <link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"> -<link rel="match" href="any-link-dynamic-001-ref.html"> +<link rel="match" href="any-link-attribute-removal-ref.html"> <link rel="help" href="https://drafts.csswg.org/selectors-4/#the-any-link-pseudo"> <style> span { color: green; } diff --git a/tests/wpt/tests/css/selectors/invalidation/has-sibling-insertion-removal.html b/tests/wpt/tests/css/selectors/invalidation/has-sibling-insertion-removal.html index 1331a22ad55..3c05a0f495a 100644 --- a/tests/wpt/tests/css/selectors/invalidation/has-sibling-insertion-removal.html +++ b/tests/wpt/tests/css/selectors/invalidation/has-sibling-insertion-removal.html @@ -19,6 +19,7 @@ div, main { color: grey } #subject10:has(+ #sibling10_2 ~ #sibling10_3) { color: green } #subject11:has(+ #sibling11_1 + #sibling11_2 ~ #sibling11_3 > #siblingchild11_3_1) { color: blue } #subject12:has(+ #sibling12_2 ~ #sibling12_3 > #siblingchild12_3_1) { color: yellow } +.sibling13:has(~ .sibling13) { color: green } </style> <main id="main"> @@ -103,6 +104,10 @@ div, main { color: grey } </div> <div id="sibling12_4"></div> </div> + <div id="parent13"> + <div class="sibling13"></div> + <div id="subject13" class="sibling13"></div> + </div> </main> <script> @@ -183,4 +188,11 @@ testColor(`subject12: initial color should be ${grey}`, subject12, grey); sibling12_1.remove(); testColor(`subject12: color after #sibling12_1 removed should be ${yellow}`, subject12, yellow); + +testColor(`subject13: initial color should be ${grey}`, subject13, grey); +const d = document.createElement("div"); +d.classList.add("sibling13"); +parent13.appendChild(d); +testColor(`subject13: color after #sibling12_1 removed should be ${green}`, + subject13, green); </script> diff --git a/tests/wpt/tests/css/selectors/invalidation/link-pseudo-class-in-has.html b/tests/wpt/tests/css/selectors/invalidation/link-pseudo-class-in-has.html new file mode 100644 index 00000000000..d0c617a1761 --- /dev/null +++ b/tests/wpt/tests/css/selectors/invalidation/link-pseudo-class-in-has.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>CSS Selectors Invalidation: :any-link and :link pseudo class in :has()</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/selectors/#relational"> + +<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> + +<style> + /* :any-link and :link should match similarly */ + #subject:has(#target:link:any-link) { color: green; } + #subject:has(#svgTarget:link:any-link) { color: blue; } +</style> + +<div id="subject"> + This is some text. + <a id="target">This is an anchor element</a> + <svg xmlns="http://www.w3.org/2000/svg"> + <a id="svgTarget"><text>This is an SVG anchor element</text></a> + </svg> +</div> + +<script> +test(function() { + assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)", + "ancestor should be black"); + target.setAttribute("href", "/"); + assert_equals(getComputedStyle(subject).color, "rgb(0, 128, 0)", + "ancestor should be green since target is a link"); + target.removeAttribute("href"); + assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)", + "ancestor should be black since target is no longer a link"); +}, ":any-link & :link pseudo-class invalidation with an HTML link"); + +test(function() { + assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)", + "ancestor should be black"); + svgTarget.setAttribute("href", "/") + assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 255)", + "ancestor should be blue since target is a link"); + svgTarget.removeAttribute("href"); + assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)", + "ancestor should be black since target is no longer a link"); +}, ":any-link & :link pseudo-class invalidation with an SVG link"); +</script> diff --git a/tests/wpt/tests/css/selectors/user-valid-user-invalid-invalidation.html b/tests/wpt/tests/css/selectors/invalidation/user-valid-user-invalid.html index bca20fc99c3..bca20fc99c3 100644 --- a/tests/wpt/tests/css/selectors/user-valid-user-invalid-invalidation.html +++ b/tests/wpt/tests/css/selectors/invalidation/user-valid-user-invalid.html diff --git a/tests/wpt/tests/css/selectors/anplusb-selector-parsing.html b/tests/wpt/tests/css/selectors/parsing/parse-anplusb.html index b7cfd293515..b7cfd293515 100644 --- a/tests/wpt/tests/css/selectors/anplusb-selector-parsing.html +++ b/tests/wpt/tests/css/selectors/parsing/parse-anplusb.html diff --git a/tests/wpt/tests/css/selectors/is-where-parsing.html b/tests/wpt/tests/css/selectors/parsing/parse-is-where.html index ee73fe0f887..ee73fe0f887 100644 --- a/tests/wpt/tests/css/selectors/is-where-parsing.html +++ b/tests/wpt/tests/css/selectors/parsing/parse-is-where.html diff --git a/tests/wpt/tests/css/selectors/parsing/parse-part.html b/tests/wpt/tests/css/selectors/parsing/parse-part.html new file mode 100644 index 00000000000..d6ee5d54d83 --- /dev/null +++ b/tests/wpt/tests/css/selectors/parsing/parse-part.html @@ -0,0 +1,34 @@ +<!doctype html> +<meta charset="utf-8" /> +<title>CSS Selectors: part pseudo selectors</title> +<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/#part" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script> + test_valid_selector("::part(--foo)"); + test_valid_selector("::part(bar)"); + test_valid_selector("::part(--)"); + test_valid_selector("::part(--0)"); + test_valid_selector("::part(foo bar)"); + test_valid_selector("::part(-foo bar)"); + test_valid_selector("::part(foo):focus"); + test_valid_selector("::part(foo):hover"); + test_valid_selector("::part(foo):focus-within"); + test_valid_selector("::part(foo)::before"); + test_valid_selector("::part(foo)::after"); + test_valid_selector("::part(foo)::placeholder"); + test_valid_selector("::part(foo)::first-line"); + test_valid_selector("::part(foo)::first-letter"); + test_valid_selector("::part(foo)::file-selector-button"); + test_valid_selector("::part(foo):is(:focus)"); + test_valid_selector(":lang(en)::part(foo)"); + test_valid_selector(":dir(ltr)::part(foo)"); + test_invalid_selector(":part()"); + test_invalid_selector(":part(0)"); + test_invalid_selector(":part('foo')"); + test_invalid_selector(":part([foo])"); + test_invalid_selector("::part(foo):lang(en)"); + test_invalid_selector("::part(foo):dir(ltr)"); + test_invalid_selector('::part(foo) + ::part(bar)'); +</script> diff --git a/tests/wpt/tests/css/selectors/parsing/parse-slotted.html b/tests/wpt/tests/css/selectors/parsing/parse-slotted.html new file mode 100644 index 00000000000..4b7b4a3b56f --- /dev/null +++ b/tests/wpt/tests/css/selectors/parsing/parse-slotted.html @@ -0,0 +1,27 @@ +<!doctype html> +<meta charset="utf-8" /> +<title>CSS Selectors: slotted pseudo selectors</title> +<link rel="help" href="https://drafts.csswg.org/css-scoping/#slotted-pseudo" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script> + test_valid_selector("::slotted(bar)"); + test_valid_selector('::slotted([attr="foo"])'); + test_valid_selector("::slotted(*)"); + test_valid_selector("::slotted(.class)"); + test_valid_selector("::slotted(:not(foo))"); + test_valid_selector('::slotted(:not(:nth-last-of-type(2)):not([slot="foo"]))'); + test_valid_selector("::slotted(:first-child)"); + test_valid_selector("::slotted(:hover)"); + test_invalid_selector("::slotted"); + test_invalid_selector("::slotted()"); + test_invalid_selector("::slotted(0)"); + test_invalid_selector(":slotted(foo)"); + test_invalid_selector("::slotted(foo):first-child"); + test_invalid_selector("::slotted(foo):hover"); + test_invalid_selector("::slotted(foo):focus"); + test_invalid_selector("::slotted(foo):lang(en)"); + test_invalid_selector("::slotted(foo):dir(ltr)"); + test_invalid_selector('::slotted(foo) + ::slotted(bar)'); +</script> diff --git a/tests/wpt/tests/css/selectors/parsing/parse-state.html b/tests/wpt/tests/css/selectors/parsing/parse-state.html index 35a8364181e..95e3134b2cf 100644 --- a/tests/wpt/tests/css/selectors/parsing/parse-state.html +++ b/tests/wpt/tests/css/selectors/parsing/parse-state.html @@ -13,6 +13,12 @@ test_valid_selector(":host(:state(--foo))"); test_valid_selector('my-input[type="foo"]:state(checked)'); test_valid_selector('my-input[type="foo"]:state(--0)::before'); + test_valid_selector('my-input[type="foo"]:state(--0)::part(inner)'); + test_valid_selector( + 'my-input[type="foo"]:state(--0)::part(inner):state(bar)', + ); + test_valid_selector('::part(inner):state(bar)::before'); + test_valid_selector('::part(inner):state(bar)::after'); test_invalid_selector(":state"); test_invalid_selector(":state("); test_invalid_selector(":state()"); @@ -21,4 +27,9 @@ test_invalid_selector(":state(url())"); test_invalid_selector(":state(foo(1))"); test_invalid_selector(":state(:host)"); + test_invalid_selector("my-input::after:state(foo)"); + test_invalid_selector('::part(inner):state(bar)::before:state(foo)'); + test_invalid_selector('::part(inner):state(bar)::after:state(foo)'); + test_invalid_selector("my-input::first-letter:state(foo)"); + test_invalid_selector('::slotted(foo):state(foo)'); </script> diff --git a/tests/wpt/tests/css/support/color-testcommon.js b/tests/wpt/tests/css/support/color-testcommon.js index 18ab4420f67..44ca0bbb33c 100644 --- a/tests/wpt/tests/css/support/color-testcommon.js +++ b/tests/wpt/tests/css/support/color-testcommon.js @@ -79,50 +79,3 @@ function fuzzy_test_valid_color(specified, parsed, epsilon) { test_valid_value("color", specified, parsed, {comparisonFunction: set_up_fuzzy_color_test(epsilon)}); } - -/** - * Fuzzy color matcher for oklab color with optional transparency. - * @param {string} actual Observed color - * @param {string} expected What the color should be - * @param {string} message Error message to facilitate diagnostics - */ -function assert_oklab_color(actual, expected, message) { - const paramMatch = '(\\-?\\d*\\.?\\d*)'; - const optAlphaMatch = '( \\/ (\\d*\\.?\\d*))?'; - const pattern = - `oklab\\(${paramMatch} ${paramMatch} ${paramMatch}${optAlphaMatch}\\)`; - const oklabRegex = new RegExp(pattern); - let matches = - expected.match(oklabRegex); - assert_true(!!matches, - `Expected value ${expected} not recognized as an oklab color`); - - const p0 = parseFloat(matches[1]); - const p1 = parseFloat(matches[2]); - const p2 = parseFloat(matches[3]); - const alpha = - (matches[5] !== undefined) ? parseFloat(matches[5]) : undefined; - - matches = - actual.match(oklabRegex); - assert_true(!!matches, - `Actual value ${actual} not recognized as an oklab color`); - - const tolerance = 0.01; - let colorMatch = - Math.abs(parseFloat(matches[1]) - p0) <= tolerance && - Math.abs(parseFloat(matches[2]) - p1) <= tolerance && - Math.abs(parseFloat(matches[3]) - p2) <= tolerance; - if (colorMatch) { - if (alpha !== undefined) { - colorMatch = - matches[5] != undefined && - Math.abs(parseFloat(matches[5]) - alpha) <= tolerance; - } else { - colorMatch = matches[5] == undefined; - } - } - assert_true( - colorMatch, - `expected: ${expected} actual ${actual} -- ${message}`); -} diff --git a/tests/wpt/tests/docs/requirements.txt b/tests/wpt/tests/docs/requirements.txt index b29747cac17..d8fb98888fd 100644 --- a/tests/wpt/tests/docs/requirements.txt +++ b/tests/wpt/tests/docs/requirements.txt @@ -1,6 +1,6 @@ recommonmark==0.7.1 sphinx-argparse==0.4.0 sphinx-autobuild==2021.3.14 -sphinx-js==3.2.1 +sphinx-js==3.2.2 sphinx==4.4.0 markupsafe==2.0.1 diff --git a/tests/wpt/tests/docs/writing-tests/print-reftests.md b/tests/wpt/tests/docs/writing-tests/print-reftests.md index 62a037da124..cbcd5e920b2 100644 --- a/tests/wpt/tests/docs/writing-tests/print-reftests.md +++ b/tests/wpt/tests/docs/writing-tests/print-reftests.md @@ -16,8 +16,10 @@ directory named `print`. Examples: Like ordinary reftests, the reference is specified using a `<link rel=match>` element. -The default page size for print reftests is 12.7 cm by 7.62 cm (5 -inches by 3 inches). +The default page size +([page box](https://drafts.csswg.org/css-page-3/#page-model)) for +print reftests is 12.7 cm by 7.62 cm (5 inches by 3 inches) with a +default margin of 12.7 mm (0.5 inches) on all sides. All the features of ordinary reftests also work with print reftests including [fuzzy matching](reftests.html#fuzzy-matching). Any fuzzy diff --git a/tests/wpt/tests/dom/events/scrolling/scroll_support.js b/tests/wpt/tests/dom/events/scrolling/scroll_support.js index f05251ce21a..e86ead54564 100644 --- a/tests/wpt/tests/dom/events/scrolling/scroll_support.js +++ b/tests/wpt/tests/dom/events/scrolling/scroll_support.js @@ -115,10 +115,10 @@ function waitForCompositorCommit() { }); } -// Please don't remove this. This is necessary for chromium-based browsers. -// This shouldn't be necessary if the test harness deferred running the tests -// until after paint holding. This can be a no-op on user-agents that do not -// have a separate compositor thread. +// Please don't remove this. This is necessary for chromium-based browsers. It +// can be a no-op on user-agents that do not have a separate compositor thread. +// TODO(crbug.com/1509054): This shouldn't be necessary if the test harness +// deferred running the tests until after paint holding. async function waitForCompositorReady() { const animation = document.body.animate({ opacity: [ 1, 1 ] }, {duration: 1 }); diff --git a/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js b/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js index 851369e2c98..2f3f6a0be5a 100644 --- a/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js +++ b/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js @@ -52,6 +52,32 @@ test(() => { subscriber.next(1); subscriber.next(2); subscriber.next(3); + }); + + assert_false( + initializerCalled, + "initializer should not be called by construction" + ); + + source.subscribe(x => results.push(x)); + + assert_true(initializerCalled, "initializer should be called by subscribe"); + assert_array_equals( + results, + [1, 2, 3], + "should emit values synchronously, but not complete" + ); +}, "Subscribe with just a function as the next handler"); + +test(() => { + let initializerCalled = false; + const results = []; + + const source = new Observable((subscriber) => { + initializerCalled = true; + subscriber.next(1); + subscriber.next(2); + subscriber.next(3); subscriber.complete(); }); diff --git a/tests/wpt/tests/dom/observable/tentative/observable-constructor.window.js b/tests/wpt/tests/dom/observable/tentative/observable-constructor.window.js index 34776f8fc56..d2b597c8190 100644 --- a/tests/wpt/tests/dom/observable/tentative/observable-constructor.window.js +++ b/tests/wpt/tests/dom/observable/tentative/observable-constructor.window.js @@ -98,3 +98,30 @@ promise_test(async t => { assert_array_equals(results, ["detached"], "Subscribe callback is never invoked"); }, "Cannot subscribe to an Observable in a detached document"); + +promise_test(async t => { + // Make this available off the global so the child can reach it. + window.results = []; + const contentWin = await loadIframeAndReturnContentWindow(); + + contentWin.eval(` + const parentResults = parent.results; + const event_target = new EventTarget(); + // Set up two event listeners, both of which will mutate |parentResults|: + // 1. A traditional event listener + // 2. An observable + event_target.addEventListener('customevent', e => parentResults.push(e)); + const source = event_target.on('customevent'); + source.subscribe(e => parentResults.push(e)); + + // Detach the iframe and fire an event at the event target. The parent will + // confirm that the observable's next handler did not get invoked, because + // the window is detached. + const event = new Event('customevent'); + window.frameElement.remove(); + parentResults.push('detached'); + event_target.dispatchEvent(event); + `); + + assert_array_equals(results, ["detached"], "Subscribe callback is never invoked"); +}, "Observable from EventTarget does not get notified for events in detached documents"); diff --git a/tests/wpt/tests/dom/observable/tentative/observable-event-target.any.js b/tests/wpt/tests/dom/observable/tentative/observable-event-target.any.js new file mode 100644 index 00000000000..0f7ace2acc0 --- /dev/null +++ b/tests/wpt/tests/dom/observable/tentative/observable-event-target.any.js @@ -0,0 +1,71 @@ +test(() => { + const target = new EventTarget(); + assert_implements(target.on, "The EventTarget interface has an `on` method"); + assert_equals(typeof target.on, "function", + "EventTarget should have the on method"); + + const testEvents = target.on("test"); + assert_true(testEvents instanceof Observable, + "EventTarget.on returns an Observable"); + + const results = []; + testEvents.subscribe({ + next: value => results.push(value), + error: () => results.push("error"), + complete: () => results.push("complete"), + }); + + assert_array_equals(results, [], + "Observable does not emit events until event is fired"); + + const event = new Event("test"); + target.dispatchEvent(event); + assert_array_equals(results, [event]); + + target.dispatchEvent(event); + assert_array_equals(results, [event, event]); +}, "EventTarget.on() returns an Observable"); + +test(() => { + const target = new EventTarget(); + const testEvents = target.on("test"); + const ac = new AbortController(); + const results = []; + testEvents.subscribe({ + next: (value) => results.push(value), + error: () => results.push('error'), + complete: () => results.complete('complete'), + }, { signal: ac.signal }); + + assert_array_equals(results, [], + "Observable does not emit events until event is fired"); + + const event1 = new Event("test"); + const event2 = new Event("test"); + const event3 = new Event("test"); + target.dispatchEvent(event1); + target.dispatchEvent(event2); + + assert_array_equals(results, [event1, event2]); + + ac.abort(); + target.dispatchEvent(event3); + + assert_array_equals(results, [event1, event2], + "Aborting the subscription removes the event listener and stops the " + + "emission of events"); +}, "Aborting the subscription should stop the emission of events"); + +test(() => { + const target = new EventTarget(); + const testEvents = target.on("test"); + const results = []; + testEvents.subscribe(e => results.push(e)); + testEvents.subscribe(e => results.push(e)); + + const event1 = new Event("test"); + const event2 = new Event("test"); + target.dispatchEvent(event1); + target.dispatchEvent(event2); + assert_array_equals(results, [event1, event1, event2, event2]); +}, "EventTarget Observables can multicast subscriptions for event handling"); diff --git a/tests/wpt/tests/editing/crashtests/change-input-type-of-focused-text-control-and-make-it-editing-host.html b/tests/wpt/tests/editing/crashtests/change-input-type-of-focused-text-control-and-make-it-editing-host.html new file mode 100644 index 00000000000..fec4ff13e8c --- /dev/null +++ b/tests/wpt/tests/editing/crashtests/change-input-type-of-focused-text-control-and-make-it-editing-host.html @@ -0,0 +1,16 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +document.addEventListener("DOMContentLoaded", () => { + const input = document.createElement("input"); + document.documentElement.appendChild(input); + input.focus(); + input.type = "file"; + input.getBoundingClientRect(); + input.setAttribute("contenteditable", "true"); +}); +</script> +<body></body> +</html> diff --git a/tests/wpt/tests/editing/data/delete.js b/tests/wpt/tests/editing/data/delete.js index 5fad8c26783..3c2855e28f5 100644 --- a/tests/wpt/tests/editing/data/delete.js +++ b/tests/wpt/tests/editing/data/delete.js @@ -3042,4 +3042,36 @@ var browserTests = [ "<div><span style=\"display:list-item\">abcdef</span></div>", [true], {}], +// Don't remove parent blocks of selection start to insert new text into the +// selection start container. +["<div>{abc</div><div>def</div>}", + [["delete",""]], + "<div><br></div>", + [true], + {}], +["<div>abc</div><div>{def</div>}", + [["delete",""]], + "<div>abc</div><div><br></div>", + [true], + {}], +["<div style=display:flex><span>{abc</span><span>def</span>}</div>", + [["delete",""]], + "<div style=\"display:flex\"><span><br></span></div>", + [true], + {}], +["<div style=display:flex><span>abc</span><span>{def</span>}</div>", + [["delete",""]], + "<div style=\"display:flex\"><span>abc</span><span><br></span></div>", + [true], + {}], +["<div style=display:grid><span>{abc</span><span>def</span>}</div>", + [["delete",""]], + "<div style=\"display:grid\"><span><br></span></div>", + [true], + {}], +["<div style=display:grid><span>abc</span><span>{def</span>}</div>", + [["delete",""]], + "<div style=\"display:grid\"><span>abc</span><span><br></span></div>", + [true], + {}], ] diff --git a/tests/wpt/tests/editing/data/forwarddelete.js b/tests/wpt/tests/editing/data/forwarddelete.js index 5119d6f50de..5e76ee89885 100644 --- a/tests/wpt/tests/editing/data/forwarddelete.js +++ b/tests/wpt/tests/editing/data/forwarddelete.js @@ -2922,4 +2922,36 @@ var browserTests = [ "<div><span style=\"display:list-item\">abcdef</span></div>", [true], {}], +// Don't remove parent blocks of selection start to insert new text into the +// selection start container. +["<div>{abc</div><div>def</div>}", + [["forwarddelete",""]], + "<div><br></div>", + [true], + {}], +["<div>abc</div><div>{def</div>}", + [["forwarddelete",""]], + "<div>abc</div><div><br></div>", + [true], + {}], +["<div style=display:flex><span>{abc</span><span>def</span>}</div>", + [["forwarddelete",""]], + "<div style=\"display:flex\"><span><br></span></div>", + [true], + {}], +["<div style=display:flex><span>abc</span><span>{def</span>}</div>", + [["forwarddelete",""]], + "<div style=\"display:flex\"><span>abc</span><span><br></span></div>", + [true], + {}], +["<div style=display:grid><span>{abc</span><span>def</span>}</div>", + [["forwarddelete",""]], + "<div style=\"display:grid\"><span><br></span></div>", + [true], + {}], +["<div style=display:grid><span>abc</span><span>{def</span>}</div>", + [["forwarddelete",""]], + "<div style=\"display:grid\"><span>abc</span><span><br></span></div>", + [true], + {}], ] diff --git a/tests/wpt/tests/editing/data/inserttext.js b/tests/wpt/tests/editing/data/inserttext.js index ab73a2ac49c..8fa8127f2df 100644 --- a/tests/wpt/tests/editing/data/inserttext.js +++ b/tests/wpt/tests/editing/data/inserttext.js @@ -1470,5 +1470,79 @@ var browserTests = [ "<div>abc<s></s><b><i>def</i></b>ghi</div>"], [true,true], {}], - +// Don't remove parent blocks of selection start to insert new text into the +// selection start container. +["<div>{abc</div><div>def</div>}", + [["inserttext","g"],["inserttext","h"]], + ["<div>gh</div>", + "<div>gh<br></div>"], + [true,true], + {}], +["<div>abc</div><div>{def</div>}", + [["inserttext","g"],["inserttext","h"]], + ["<div>abc</div><div>gh</div>", + "<div>abc</div><div>gh<br></div>"], + [true,true], + {}], +["<div style=display:flex><span>{abc</span><span>def</span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span>gh</span></div>", + "<div style=\"display:flex\"><span>gh<br></span></div>"], + [true,true], + {}], +["<div style=display:flex><span>abc</span><span>{def</span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span>abc</span><span>gh</span></div>", + "<div style=\"display:flex\"><span>abc</span><span>gh<br></span></div>"], + [true,true], + {}], +["<div style=display:grid><span>{abc</span><span>def</span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span>gh</span></div>", + "<div style=\"display:grid\"><span>gh<br></span></div>"], + [true,true], + {}], +["<div style=display:grid><span>abc</span><span>{def</span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span>abc</span><span>gh</span></div>", + "<div style=\"display:grid\"><span>abc</span><span>gh<br></span></div>"], + [true,true], + {}], +// The inline style at selection start should be preserved for typed text. +["<div><b>{abc</b></div><div>def</div>}", + [["inserttext","g"],["inserttext","h"]], + ["<div><b>gh</b></div>", + "<div><b>gh<br></b></div>"], + [true,true], + {}], +["<div>abc</div><div><b>{def</b></div>}", + [["inserttext","g"],["inserttext","h"]], + ["<div>abc</div><div><b>gh</b></div>", + "<div>abc</div><div><b>gh<br></b></div>"], + [true,true], + {}], +["<div style=display:flex><span><b>{abc</b></span><span>def</span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span><b>gh</b></span></div>", + "<div style=\"display:flex\"><span><b>gh<br></b></span></div>"], + [true,true], + {}], +["<div style=display:flex><span>abc</span><span><b>{def</b></span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span>abc</span><span><b>gh</b></span></div>", + "<div style=\"display:flex\"><span>abc</span><span><b>gh<br></b></span></div>"], + [true,true], + {}], +["<div style=display:grid><span><b>{abc</b></span><span>def</span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span><b>gh</b></span></div>", + "<div style=\"display:grid\"><span><b>gh<br></b></span></div>"], + [true,true], + {}], +["<div style=display:grid><span>abc</span><span><b>{def</b></span>}</div>", + [["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span>abc</span><span><b>gh</b></span></div>", + "<div style=\"display:grid\"><span>abc</span><span><b>gh<br></b></span></div>"], + [true,true], + {}], ] diff --git a/tests/wpt/tests/editing/data/multitest.js b/tests/wpt/tests/editing/data/multitest.js index 8ec4dfaf68b..aeda7b2e7b6 100644 --- a/tests/wpt/tests/editing/data/multitest.js +++ b/tests/wpt/tests/editing/data/multitest.js @@ -3137,4 +3137,85 @@ var browserTests = [ "<p><font size=\"5\"><b>ab[]</b></font><i>c</i></p>", [true,true,true,true], {}], +// Don't remove parent blocks of selection start to insert new text into the +// selection start container. +["<div>{abc</div><div>def</div>}", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div>gh</div>", + "<div>gh<br></div>"], + [true,true,true], + {}], +["<div>abc</div><div>{def</div>}", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div>abc</div><div>gh</div>", + "<div>abc</div><div>gh<br></div>"], + [true,true,true], + {}], +["<div style=display:flex><span>{abc</span><span>def</span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span>gh</span></div>", + "<div style=\"display:flex\"><span>gh<br></span></div>"], + [true,true,true], + {}], +["<div style=display:flex><span>abc</span><span>{def</span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span>abc</span><span>gh</span></div>", + "<div style=\"display:flex\"><span>abc</span><span>gh<br></span></div>"], + [true,true,true], + {}], +["<div style=display:grid><span>{abc</span><span>def</span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span>gh</span></div>", + "<div style=\"display:grid\"><span>gh<br></span></div>"], + [true,true,true], + {}], +["<div style=display:grid><span>abc</span><span>{def</span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span>abc</span><span>gh</span></div>", + "<div style=\"display:grid\"><span>abc</span><span>gh<br></span></div>"], + [true,true,true], + {}], +// The inline style at selection start should be preserved for typed text. +["<div><b>{abc</b></div><div>def</div>}", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div><b>gh</b></div>", + "<div><b>gh<br></b></div>", + "<div><b>gh</b><br></div>"], + [true,true,true], + {}], +["<div>abc</div><div><b>{def</b></div>}", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div>abc</div><div><b>gh</b></div>", + "<div>abc</div><div><b>gh<br></b></div>", + "<div>abc</div><div><b>gh</b><br></div>"], + [true,true,true], + {}], +["<div style=display:flex><span><b>{abc</b></span><span>def</span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span><b>gh</b></span></div>", + "<div style=\"display:flex\"><span><b>gh<br></b></span></div>", + "<div style=\"display:flex\"><span><b>gh</b><br></span></div>"], + [true,true,true], + {}], +["<div style=display:flex><span>abc</span><span><b>{def</b></span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:flex\"><span>abc</span><span><b>gh</b></span></div>", + "<div style=\"display:flex\"><span>abc</span><span><b>gh<br></b></span></div>", + "<div style=\"display:flex\"><span>abc</span><span><b>gh</b><br></span></div>"], + [true,true,true], + {}], +["<div style=display:grid><span><b>{abc</b></span><span>def</span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span><b>gh</b></span></div>", + "<div style=\"display:grid\"><span><b>gh<br></b></span></div>", + "<div style=\"display:grid\"><span><b>gh</b><br></span></div>"], + [true,true,true], + {}], +["<div style=display:grid><span>abc</span><span><b>{def</b></span>}</div>", + [["delete",""],["inserttext","g"],["inserttext","h"]], + ["<div style=\"display:grid\"><span>abc</span><span><b>gh</b></span></div>", + "<div style=\"display:grid\"><span>abc</span><span><b>gh<br></b></span></div>", + "<div style=\"display:grid\"><span>abc</span><span><b>gh</b><br></span></div>"], + [true,true,true], + {}], ] diff --git a/tests/wpt/tests/editing/other/input-in-text-control-which-is-also-editing-host.tentative.html b/tests/wpt/tests/editing/other/input-in-text-control-which-is-also-editing-host.tentative.html new file mode 100644 index 00000000000..1ca22b6730c --- /dev/null +++ b/tests/wpt/tests/editing/other/input-in-text-control-which-is-also-editing-host.tentative.html @@ -0,0 +1,184 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<meta name="timeout" content="long"> +<meta name="variant" content="?textcontrol=text"> +<meta name="variant" content="?textcontrol=password"> +<meta name="variant" content="?textcontrol=textarea"> +<title>Check whether a text control element handles user input when it's an editing host</title> +<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="/resources/testdriver-actions.js"></script> +</head> +<body> +<div></div> +<script> +const searchParams = new URLSearchParams(document.location.search); +const textControlType = searchParams.get("textcontrol"); +const textControlDescription = + textControlType == "textarea" + ? "<textarea contenteditable>" + : `<input type="${textControlType}" contenteditable>`; +const div = document.querySelector("div"); + +function createTextControl() { + const textControl = document.createElement( + textControlType == "textarea" ? "textarea" : "input" + ); + if (textControlType != "textarea") { + textControl.type = textControlType; + } + return textControl; +} + +promise_test(async t => { + const textControl = createTextControl(); + div.appendChild(textControl); + textControl.setAttribute("contenteditable", ""); + textControl.focus(); + await (new test_driver.Actions() + .keyDown("a") + .keyUp("a") + .keyDown("b") + .keyUp("b") + .keyDown("c") + .keyUp("c") + .send()); + assert_equals( + textControl.value, + "abc", + `${t.name}: The text control value should be updated` + ); + assert_equals( + document.querySelector("div").textContent.trim(), + "", + `${t.name}: No text should be inserted as a child of the text control` + ); + textControl.remove(); +}, `User typing in ${textControlDescription} should update the value`); + +promise_test(async t => { + const textControl = createTextControl(); + div.appendChild(textControl); + textControl.setAttribute("contenteditable", ""); + textControl.focus(); + document.execCommand("insertText", false, "abc"); + assert_equals( + textControl.value, + "abc", + `${t.name}: The text control value should be updated` + ); + assert_equals( + div.textContent.trim(), + "", + `${t.name}: No text should be inserted as a child of the text control` + ); + textControl.remove(); +}, `execCommand("insertText") in ${textControlDescription} should update the value`); + +promise_test(async t => { + const textControl = createTextControl(); + div.appendChild(textControl); + textControl.focus(); + textControl.setAttribute("contenteditable", ""); + await (new test_driver.Actions() + .keyDown("a") + .keyUp("a") + .keyDown("b") + .keyUp("b") + .keyDown("c") + .keyUp("c") + .send()); + assert_equals( + textControl.value, + "abc", + `${t.name}: The text control value should be updated` + ); + assert_equals( + div.textContent.trim(), + "", + `${t.name}: No text should be inserted as a child of the text control` + ); + textControl.remove(); +}, `User typing in ${textControlDescription} should update the value (became an editing host during focused)`); + +promise_test(async t => { + const textControl = createTextControl(); + div.appendChild(textControl); + textControl.focus(); + textControl.setAttribute("contenteditable", ""); + document.execCommand("insertText", false, "abc"); + assert_equals( + textControl.value, + "abc", + `${t.name}: The text control value should be updated` + ); + assert_equals( + div.textContent.trim(), + "", + `${t.name}: No text should be inserted as a child of the text control` + ); + textControl.remove(); +}, `execCommand("insertText") in ${textControlDescription} should update the value (became an editing host during focused)`); + +if (textControlType != "textarea") { + promise_test(async t => { + const textControl = createTextControl(); + textControl.type = "button"; + div.appendChild(textControl); + textControl.setAttribute("contenteditable", ""); + textControl.focus(); + textControl.type = textControlType; + await (new test_driver.Actions() + .keyDown("a") + .keyUp("a") + .keyDown("b") + .keyUp("b") + .keyDown("c") + .keyUp("c") + .send()); + assert_equals( + textControl.value, + "abc", + `${t.name}: The text control value should be updated` + ); + assert_equals( + document.querySelector("div").textContent.trim(), + "", + `${t.name}: No text should be inserted as a child of the text control` + ); + textControl.remove(); + }, `User typing in ${ + textControlDescription + } should update the value (became an editing host during focused and different type)`); + + promise_test(async t => { + const textControl = createTextControl(); + textControl.type = "button"; + div.appendChild(textControl); + textControl.setAttribute("contenteditable", ""); + textControl.focus(); + textControl.type = textControlType; + document.execCommand("insertText", false, "abc"); + assert_equals( + textControl.value, + "abc", + `${t.name}: The text control value should be updated` + ); + assert_equals( + div.textContent.trim(), + "", + `${t.name}: No text should be inserted as a child of the text control` + ); + textControl.remove(); + }, `execCommand("insertText") in ${ + textControlDescription + } should update the value (became an editing host during focused and different type)`); +} + +</script> +</body> +</html> diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-anchor-click-handler.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-anchor-click-handler.https.html index d6e52f90865..c3161fd5c31 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-anchor-click-handler.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-anchor-click-handler.https.html @@ -19,8 +19,9 @@ promise_test(async(t) => { origin: get_host_info().HTTPS_REMOTE_ORIGIN}); const new_url = new URL("resources/dummy.html", location.href); const beacon_data = "This is the second test's beacon data!"; + const beacon_type = "reserved.top_navigation_commit"; - await fencedframe.execute((new_url, beacon_data) => { + await fencedframe.execute((new_url, beacon_data, beacon_type) => { let a = document.createElement('a'); a.textContent = "Click me!"; a.href = new_url; @@ -36,7 +37,7 @@ promise_test(async(t) => { // data makes it to the correct place by the time the navigation commits. a.onclick = () => { let beacon_event = { - eventType: "reserved.top_navigation_commit", + eventType: beacon_type, eventData: beacon_data, destination: ["buyer"], } @@ -44,7 +45,7 @@ promise_test(async(t) => { }; document.body.appendChild(a); - }, [new_url, beacon_data]); + }, [new_url, beacon_data, beacon_type]); // This will trigger the beacon data storing + navigation. await actions.pointerMove(0, 0, {origin: fencedframe.element}) @@ -52,7 +53,8 @@ promise_test(async(t) => { .pointerUp() .send(); - const beacon_initiator_origin = await nextAutomaticBeacon(beacon_data); + const beacon_initiator_origin = + await nextAutomaticBeacon(beacon_type, beacon_data); assert_equals(beacon_initiator_origin, get_host_info().HTTPS_ORIGIN); // Leaving this fenced frame around for subsequent tests can lead to diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-click-handler.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-click-handler.https.html index 0dac25bfa4c..0fe3fbb9335 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-click-handler.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-click-handler.https.html @@ -23,6 +23,14 @@ promise_test(async(t) => { await fencedframe.execute( (new_url, start_beacon_data, commit_beacon_data) => { + // This tests that old automatic beacon data is overwritten in subsequent + // calls to setReportEventDataForAutomaticBeacons(). + let start_beacon_event_old = { + eventType: "reserved.top_navigation_start", + eventData: "this should not be the data", + destination: ["buyer"], + } + window.fence.setReportEventDataForAutomaticBeacons(start_beacon_event_old); addEventListener("click", (event) => { let start_beacon_event = { eventType: "reserved.top_navigation_start", @@ -45,9 +53,11 @@ promise_test(async(t) => { .pointerUp() .send(); - const beacon_1_initiator_origin = await nextAutomaticBeacon(start_beacon_data); + const beacon_1_initiator_origin = await nextAutomaticBeacon( + "reserved.top_navigation_start", start_beacon_data); assert_equals(beacon_1_initiator_origin, get_host_info().HTTPS_ORIGIN); - const beacon_2_initiator_origin = await nextAutomaticBeacon(commit_beacon_data); + const beacon_2_initiator_origin = await nextAutomaticBeacon( + "reserved.top_navigation_commit", commit_beacon_data); assert_equals(beacon_2_initiator_origin, get_host_info().HTTPS_ORIGIN); // Leaving this fenced frame around for subsequent tests can lead to diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-false.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-false.https.html new file mode 100644 index 00000000000..ccd86349734 --- /dev/null +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-false.https.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<title>Test window.fence.setReportEventDataForAutomaticBeacons from + SharedStorage</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext({ + generator_api: 'fledge', + automatic_beacon: true, + }); + const new_url = new URL("resources/close.html", location.href); + const beacon_type = "reserved.top_navigation_start"; + + await fencedframe.execute(async (new_url, beacon_type) => { + let beacon_event = { + eventType: beacon_type, + eventData: "this is the beacon data", + destination: ["buyer"], + crossOriginExposed: false, + } + window.fence.setReportEventDataForAutomaticBeacons(beacon_event); + + // Add a cross-origin iframe that will perform the top-level navigation. + const iframe = await attachIFrameContext({ + origin: get_host_info().HTTPS_REMOTE_ORIGIN, + headers: [["Allow-Fenced-Frame-Automatic-Beacons", "true"]], + }); + await iframe.execute(async (new_url) => { + addEventListener("click", (event) => { + window.open(new_url); + }); + }, [new_url]); + }, [new_url, beacon_type]); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + const expected_beacon_data = "<No data>"; + const received_beacon_data = await nextAutomaticBeacon( + "reserved.top_navigation_start", expected_beacon_data); +}, 'Automatic beacon in a cross-origin subframe should send without data ' + + 'when crossOrigin=false.'); +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-navigation.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-navigation.https.html new file mode 100644 index 00000000000..5a191174cfe --- /dev/null +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-navigation.https.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<title>Test cross-origin automatic beacons</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext({ + generator_api: 'fledge', + automatic_beacon: true + }); + const new_url = new URL("resources/close.html", location.href); + const beacon_data = "this is the beacon data"; + const beacon_type = "reserved.top_navigation_start"; + + await fencedframe.execute(async (new_url, beacon_data, beacon_type) => { + let beacon_event = { + eventType: beacon_type, + eventData: beacon_data, + destination: ["buyer"], + crossOriginExposed: true, + } + window.fence.setReportEventDataForAutomaticBeacons(beacon_event); + + // Add a cross-origin iframe that will perform the top-level navigation. + const iframe = await attachIFrameContext({ + origin: get_host_info().HTTPS_REMOTE_ORIGIN, + headers: [["Allow-Fenced-Frame-Automatic-Beacons", "true"]] + }); + await iframe.execute(async (new_url) => { + addEventListener("click", (event) => { + window.open(new_url, "_blank"); + }); + }, [new_url]); + }, [new_url, beacon_data, beacon_type]); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + const received_beacon_data = + await nextAutomaticBeacon(beacon_type, beacon_data); +}, 'Automatic beacon in a cross-origin subframe'); +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-no-data.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-no-data.https.html new file mode 100644 index 00000000000..1b5710035d9 --- /dev/null +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-no-data.https.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<title>Test cross-origin automatic beacons without data</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext({ + generator_api: 'fledge', + automatic_beacon: true + }); + const new_url = new URL("resources/close.html", location.href); + + // Add a fenced frame that does not set automatic beacon data. + await fencedframe.execute(async (new_url) => { + // Add a cross-origin iframe that will perform the top-level navigation. + const iframe = await attachIFrameContext({ + origin: get_host_info().HTTPS_REMOTE_ORIGIN, + headers: [['Allow-Fenced-Frame-Automatic-Beacons', 'true']], + }); + await iframe.execute(async (new_url) => { + addEventListener("click", (event) => { + window.open(new_url); + }); + }, [new_url]); + }, [new_url]); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + const expected_beacon_data = "<No data>"; + const received_beacon_data = + await nextAutomaticBeacon( + "reserved.top_navigation_start", expected_beacon_data); + const received_beacon_data_commit = + await nextAutomaticBeacon( + "reserved.top_navigation_commit", expected_beacon_data); +}, 'Automatic beacon in a cross-origin subframe with no beacon data set'); +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-no-opt-in.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-no-opt-in.https.html new file mode 100644 index 00000000000..6d43a73bc7c --- /dev/null +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-cross-origin-no-opt-in.https.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<title>Test cross-origin automatic beacons without opt-in</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext({ + generator_api: 'fledge', + automatic_beacon: true + }); + const new_url = new URL("resources/close.html", location.href); + const beacon_data = "this is the beacon data"; + const beacon_type = "reserved.top_navigation_start"; + + await fencedframe.execute(async (new_url, beacon_data, beacon_type) => { + let beacon_event = { + eventType: beacon_type, + eventData: beacon_data, + destination: ["buyer"], + crossOriginExposed: true, + } + window.fence.setReportEventDataForAutomaticBeacons(beacon_event); + + // Add a cross-origin iframe that will perform the top-level navigation. + // Do not set the 'Allow-Fenced-Frame-Automatic-Beacons' header to true. + const iframe = await attachIFrameContext({ + origin: get_host_info().HTTPS_REMOTE_ORIGIN, + headers: [["Allow-Fenced-Frame-Automatic-Beacons", "false"]] + }); + await iframe.execute(async (new_url) => { + addEventListener("click", (event) => { + window.open(new_url, "_blank"); + }); + }, [new_url]); + }, [new_url, beacon_data, beacon_type]); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + const timeout = new Promise(resolve => t.step_timeout(resolve, 1000)); + const result = await Promise.race( + [nextAutomaticBeacon(beacon_type, beacon_data), timeout]); + assert_true(typeof result === "undefined"); +}, 'Automatic beacon in a cross-origin subframe with no opt-in header should ' + + 'not send.'); +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-no-destination.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-no-destination.https.html index 65281b122f2..c3fa3d657fa 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-no-destination.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-no-destination.https.html @@ -21,12 +21,13 @@ promise_test(async (t) => { }); const new_url = new URL("resources/dummy.html", location.href); const beacon_data = "This is the beacon data!"; + const beacon_type = "reserved.top_navigation_commit"; await fencedframe.execute( - (new_url, beacon_data) => { + (new_url, beacon_data, beacon_type) => { addEventListener("click", (event) => { let beacon_event = { - eventType: "reserved.top_navigation_commit", + eventType: beacon_type, eventData: beacon_data, destination: ["component-seller"], }; @@ -34,7 +35,7 @@ promise_test(async (t) => { window.open(new_url, "_blank"); }); }, - [new_url, beacon_data] + [new_url, beacon_data, beacon_type] ); await actions @@ -47,7 +48,8 @@ promise_test(async (t) => { // of the beacon because the "buyer" destination was not specified in // setReportEventDataForAutomaticBeacons(). const expected_data = "<No data>"; - const beacon_initiator_origin = await nextAutomaticBeacon(expected_data); + const beacon_initiator_origin = + await nextAutomaticBeacon(beacon_type, expected_data); assert_equals(beacon_initiator_origin, get_host_info().HTTPS_ORIGIN); }, "Set and trigger an automatic beacon with no destination specified"); diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-no-opt-in.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-no-opt-in.https.html index 38ae769a189..5a815a81389 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-no-opt-in.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-no-opt-in.https.html @@ -29,7 +29,8 @@ promise_test(async (t) => { ); // An automatic beacon should not be sent out, as the document did not opt in - // through the call to setReportEventDataForAutomaticBeacons(). + // through the call to setReportEventDataForAutomaticBeacons(), nor through + // the 'Allow-Fenced-Frame-Automatic-Beacons' header. // Set up a timeout to ensure that there's enough time to send any potential // automatic beacons. await actions @@ -39,7 +40,8 @@ promise_test(async (t) => { .send(); const timeout = new Promise(resolve => t.step_timeout(resolve, 1000)); const result = await Promise.race( - [nextAutomaticBeacon("<No data>"), timeout]); + [nextAutomaticBeacon("reserved.top_navigation_start", "<No data>"), + timeout]); assert_true(typeof result === "undefined"); }, "Automatic beacons will not send if the document does not opt in."); diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-shared-storage.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-shared-storage.https.html index e93bde442c4..093e55bca90 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-shared-storage.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-shared-storage.https.html @@ -46,9 +46,11 @@ promise_test(async(t) => { .pointerUp() .send(); - const beacon_1_initiator_origin = await nextAutomaticBeacon(start_beacon_data); + const beacon_1_initiator_origin = await nextAutomaticBeacon( + "reserved.top_navigation_start", start_beacon_data); assert_equals(beacon_1_initiator_origin, get_host_info().HTTPS_ORIGIN); - const beacon_2_initiator_origin = await nextAutomaticBeacon(commit_beacon_data); + const beacon_2_initiator_origin = await nextAutomaticBeacon( + "reserved.top_navigation_commit", commit_beacon_data); assert_equals(beacon_2_initiator_origin, get_host_info().HTTPS_ORIGIN); }, 'Set and trigger an automatic beacon in a click handler for SharedStorage'); diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-clear.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-clear.https.html index 8ad2f4e2672..f59fda5fca9 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-clear.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-clear.https.html @@ -19,10 +19,11 @@ promise_test(async(t) => { origin: get_host_info().HTTPS_REMOTE_ORIGIN}); const new_url = new URL("resources/dummy.html", location.href); const beacon_data = "This is the beacon data!"; + const beacon_type = "reserved.top_navigation_commit"; - await fencedframe.execute((new_url, beacon_data) => { + await fencedframe.execute((new_url, beacon_data, beacon_type) => { let beacon_event = { - eventType: "reserved.top_navigation_commit", + eventType: beacon_type, eventData: beacon_data, destination: ["buyer"], once: true, @@ -31,7 +32,7 @@ promise_test(async(t) => { addEventListener("click", (event) => { window.open(new_url, "_blank"); }); - }, [new_url, beacon_data]); + }, [new_url, beacon_data, beacon_type]); // The first click should trigger the automatic beacon and clear the beacon // data. @@ -39,7 +40,8 @@ promise_test(async(t) => { .pointerDown() .pointerUp() .send(); - const beacon_initiator_origin = await nextAutomaticBeacon(beacon_data); + const beacon_initiator_origin = + await nextAutomaticBeacon(beacon_type, beacon_data); assert_equals(beacon_initiator_origin, get_host_info().HTTPS_ORIGIN); // The second click should not have any associated automatic beacon info, so @@ -52,7 +54,7 @@ promise_test(async(t) => { .send(); const timeout = new Promise(resolve => t.step_timeout(resolve, 1000)); const result = await Promise.race( - [nextAutomaticBeacon(beacon_data), timeout]); + [nextAutomaticBeacon(beacon_type, beacon_data), timeout]); assert_true(typeof result === "undefined"); }, 'Set expiring automatic beacon but trigger two events in a click handler'); diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-persist.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-persist.https.html index 769c8f3129d..4da4f89e6e5 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-persist.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-two-events-persist.https.html @@ -19,11 +19,12 @@ promise_test(async(t) => { origin: get_host_info().HTTPS_REMOTE_ORIGIN}); const new_url = new URL("resources/dummy.html", location.href); const beacon_data = "This is the beacon data!"; + const beacon_type = "reserved.top_navigation_commit"; - await fencedframe.execute((new_url, beacon_data) => { + await fencedframe.execute((new_url, beacon_data, beacon_type) => { // `once` defaults to false. let beacon_event = { - eventType: "reserved.top_navigation_commit", + eventType: beacon_type, eventData: beacon_data, destination: ["buyer"], } @@ -31,7 +32,7 @@ promise_test(async(t) => { addEventListener("click", (event) => { window.open(new_url, "_blank"); }); - }, [new_url, beacon_data]); + }, [new_url, beacon_data, beacon_type]); // The first click should trigger the automatic beacon, but the beacon data // should not be cleared out. @@ -39,7 +40,8 @@ promise_test(async(t) => { .pointerDown() .pointerUp() .send(); - const beacon_1_initiator_origin = await nextAutomaticBeacon(beacon_data); + const beacon_1_initiator_origin = + await nextAutomaticBeacon(beacon_type, beacon_data); assert_equals(beacon_1_initiator_origin, get_host_info().HTTPS_ORIGIN); // The second click should still have associated automatic beacon data, and a @@ -48,7 +50,8 @@ promise_test(async(t) => { .pointerDown() .pointerUp() .send(); - const beacon_2_initiator_origin = await nextAutomaticBeacon(beacon_data); + const beacon_2_initiator_origin = + await nextAutomaticBeacon(beacon_type, beacon_data); assert_equals(beacon_2_initiator_origin, get_host_info().HTTPS_ORIGIN); }, 'Set persisting automatic beacon but trigger two events in a click handler'); diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-unfenced-top.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-unfenced-top.https.html index 6b6c4af1cf8..945e80921d8 100644 --- a/tests/wpt/tests/fenced-frame/automatic-beacon-unfenced-top.https.html +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-unfenced-top.https.html @@ -36,6 +36,7 @@ async function init() { eventType: "reserved.top_navigation_commit", eventData: beacon_data, destination: ["buyer"], + randomField: "blah", } window.fence.setReportEventDataForAutomaticBeacons(beacon_event); addEventListener("click", (event) => { diff --git a/tests/wpt/tests/fenced-frame/automatic-beacon-use-ancestor-data.https.html b/tests/wpt/tests/fenced-frame/automatic-beacon-use-ancestor-data.https.html new file mode 100644 index 00000000000..39df6f5c73f --- /dev/null +++ b/tests/wpt/tests/fenced-frame/automatic-beacon-use-ancestor-data.https.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<title>Test ancestor data for automatic beacons</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext({ + generator_api: 'fledge', + automatic_beacon: true + }); + const new_url = new URL("resources/close.html", location.href); + const beacon_data = "this is the beacon data"; + const beacon_type = "reserved.top_navigation_start"; + + await fencedframe.execute(async (new_url, beacon_data, beacon_type) => { + let beacon_event = { + eventType: beacon_type, + eventData: beacon_data, + destination: ["buyer"], + crossOriginExposed: false, + } + window.fence.setReportEventDataForAutomaticBeacons(beacon_event); + + // Add a same-origin iframe that will perform the top-level navigation. + const iframe = await attachIFrameContext(); + await iframe.execute(async (new_url) => { + // Set beacon data for an unrelated event. + let unrelated_event = { + eventType: "reserved.top_navigation_commit", + eventData: "unrelated data", + destination: ["buyer"], + crossOriginExposed: false, + } + window.fence.setReportEventDataForAutomaticBeacons(unrelated_event); + addEventListener("click", (event) => { + window.open(new_url, "_blank"); + }); + }, [new_url]); + }, [new_url, beacon_data, beacon_type]); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + // The document should use the beacon data from its parent, since it doesn't + // have any beacon data set for `reserved.top_navigation_start`, even though + // it does have beacon data set. + const received_beacon_data = + await nextAutomaticBeacon(beacon_type, beacon_data); +}, 'Documents should use ancestor beacon data if not available'); +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/document-activeelement.https.html b/tests/wpt/tests/fenced-frame/document-activeelement.https.html new file mode 100644 index 00000000000..3ac1fd866fc --- /dev/null +++ b/tests/wpt/tests/fenced-frame/document-activeelement.https.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<title>Test document.activeElement</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext(); + + assert_equals(document.activeElement, document.body); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + assert_equals(document.activeElement, fencedframe.element); +}, 'document.activeElement should be the fenced frame when it has focus'); + +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext(); + + await fencedframe.execute(() => { + assert_equals(document.activeElement, document.body); + }) + +}, "a fenced frame's document.activeElement should be its body when it " + + "doesn't have focus"); + +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/document-hasfocus.https.html b/tests/wpt/tests/fenced-frame/document-hasfocus.https.html new file mode 100644 index 00000000000..24ea9988e91 --- /dev/null +++ b/tests/wpt/tests/fenced-frame/document-hasfocus.https.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<title>Test document.hasFocus</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext(); + + assert_true(document.hasFocus(), "The main document should initially have " + + "focus."); + await fencedframe.execute(() => { + assert_false(document.hasFocus(), "The fenced frame should not initially " + + "have focus."); + }) + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + assert_true(document.hasFocus(), "The main document should have focus."); + await fencedframe.execute(() => { + assert_true(document.hasFocus(), "The fenced frame should have focus."); + }) +}, 'document.hasFocus should be the true when a fenced frame has focus'); + +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/permission-geolocation.https.html b/tests/wpt/tests/fenced-frame/permission-geolocation.https.html index 98b5a72b3c6..e9ad53511b2 100644 --- a/tests/wpt/tests/fenced-frame/permission-geolocation.https.html +++ b/tests/wpt/tests/fenced-frame/permission-geolocation.https.html @@ -35,13 +35,14 @@ async function runTest(policy_header_in_primary_page, win.onload = resolve; }); - const unloadPromise = new Promise(resolve => { - win.onunload = resolve; + // Pagehide can be used to detect the document destruction. + const pagehidePromise = new Promise(resolve => { + win.onpagehide = resolve; }); await win.runTest(fenced_frame_url); win.close(); - await unloadPromise; + await pagehidePromise; } promise_test(async t => { diff --git a/tests/wpt/tests/fenced-frame/report-event-reserved-event.https.html b/tests/wpt/tests/fenced-frame/report-event-reserved-event.https.html new file mode 100644 index 00000000000..0a541bb0c5c --- /dev/null +++ b/tests/wpt/tests/fenced-frame/report-event-reserved-event.https.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<title>Test window.fence.reportEvent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> +promise_test(async(t) => { + const fencedframe = await attachFencedFrameContext({ + generator_api: "fledge", + automatic_beacon: true, + }); + const new_url = new URL("resources/dummy.html", location.href); + const beacon_data = "This is the beacon data!"; + const beacon_type = "reserved.top_navigation_commit"; + + await fencedframe.execute( + (new_url, beacon_data, beacon_type) => { + let beacon_event = { + eventType: beacon_type, + eventData: beacon_data, + destination: ["buyer", "seller"], + }; + window.fence.reportEvent(beacon_event); + }, + [new_url, beacon_data, beacon_type] + ); + + const timeout = new Promise(resolve => t.step_timeout(resolve, 1000)); + const result = await Promise.race( + [nextAutomaticBeacon(beacon_type, beacon_data), timeout]); + assert_true(typeof result === "undefined", + "A beacon should not have been sent."); + +}, 'Reserved events should not be callable through reportEvent()'); +</script> +</body> diff --git a/tests/wpt/tests/fenced-frame/resources/automatic-beacon-store.py b/tests/wpt/tests/fenced-frame/resources/automatic-beacon-store.py index 00007b8c630..ba1b73201bc 100644 --- a/tests/wpt/tests/fenced-frame/resources/automatic-beacon-store.py +++ b/tests/wpt/tests/fenced-frame/resources/automatic-beacon-store.py @@ -23,6 +23,7 @@ def string_to_uuid(input): def main(request, response): stash = request.server.stash; + event_type = request.GET.first(b"type", NO_DATA_STRING) # The stash is accessed concurrently by many clients. A lock is used to # avoid interleaved read/write from different clients. @@ -32,11 +33,12 @@ def main(request, response): if request.method == "POST": request_body = request.body or NO_DATA_STRING request_headers = request.headers.get("Origin") or NO_DATA_STRING - stash.put(string_to_uuid(request_body), request_headers) + stash.put(string_to_uuid(event_type + request_body), + request_headers) return (200, [], b"") # Requests without a body imply they were sent as the request from # nextAutomaticBeacon(). expected_body = request.GET.first(b"expected_body", NO_DATA_STRING) - data = stash.take(string_to_uuid(expected_body)) or NOT_SET_STRING + data = stash.take(string_to_uuid(event_type + expected_body)) or NOT_SET_STRING return(200, [], data) diff --git a/tests/wpt/tests/fenced-frame/resources/automatic-beacon-unfenced-page.html b/tests/wpt/tests/fenced-frame/resources/automatic-beacon-unfenced-page.html index 4559d8154eb..4ce7e0d78a5 100644 --- a/tests/wpt/tests/fenced-frame/resources/automatic-beacon-unfenced-page.html +++ b/tests/wpt/tests/fenced-frame/resources/automatic-beacon-unfenced-page.html @@ -13,7 +13,8 @@ // '../automatic-beacon-unfenced-top.https.html'. An automatic beacon will // have been sent as a result of the navigation. const beacon_data = "This is the beacon data!"; - const beacon_initiator_origin = await nextAutomaticBeacon(beacon_data); + const beacon_initiator_origin = await nextAutomaticBeacon( + "reserved.top_navigation_commit", beacon_data); assert_equals(beacon_initiator_origin, get_host_info().HTTPS_ORIGIN); }); </script> diff --git a/tests/wpt/tests/fenced-frame/resources/close.html b/tests/wpt/tests/fenced-frame/resources/close.html new file mode 100644 index 00000000000..7fd946d6ff9 --- /dev/null +++ b/tests/wpt/tests/fenced-frame/resources/close.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<title>This window will close when it loads</title> +<script> + window.close(); +</script>
\ No newline at end of file diff --git a/tests/wpt/tests/fenced-frame/resources/fledge-bidding-logic.py b/tests/wpt/tests/fenced-frame/resources/fledge-bidding-logic.py index 2c541bff346..c91b31fd02f 100644 --- a/tests/wpt/tests/fenced-frame/resources/fledge-bidding-logic.py +++ b/tests/wpt/tests/fenced-frame/resources/fledge-bidding-logic.py @@ -58,10 +58,10 @@ def main(request, response): '''registerAdBeacon({ 'reserved.top_navigation_start': browserSignals.interestGroupOwner + - '/fenced-frame/resources/automatic-beacon-store.py', + '/fenced-frame/resources/automatic-beacon-store.py?type=reserved.top_navigation_start', 'reserved.top_navigation_commit': browserSignals.interestGroupOwner + - '/fenced-frame/resources/automatic-beacon-store.py', + '/fenced-frame/resources/automatic-beacon-store.py?type=reserved.top_navigation_commit', }); ''' ) diff --git a/tests/wpt/tests/fenced-frame/resources/navigate-ancestor-helper.js b/tests/wpt/tests/fenced-frame/resources/navigate-ancestor-helper.js index 6178ea78da4..ade17c69f2c 100644 --- a/tests/wpt/tests/fenced-frame/resources/navigate-ancestor-helper.js +++ b/tests/wpt/tests/fenced-frame/resources/navigate-ancestor-helper.js @@ -18,11 +18,11 @@ async function runNavigateAncestorTest(test_type, ancestor_type) { win.onload = resolve; }); - const unloadPromise = new Promise(resolve => { - win.onunload = resolve; + const pagehidePromise = new Promise(resolve => { + win.onpagehide = resolve; }); await win.runTest(test_type, ancestor_type); win.close(); - await unloadPromise; + await pagehidePromise; } diff --git a/tests/wpt/tests/fenced-frame/resources/utils.js b/tests/wpt/tests/fenced-frame/resources/utils.js index d5230380157..f6c884ca74d 100644 --- a/tests/wpt/tests/fenced-frame/resources/utils.js +++ b/tests/wpt/tests/fenced-frame/resources/utils.js @@ -38,8 +38,10 @@ async function runSelectRawURL(href, resolve_to_config = false) { return await sharedStorage.selectURL( 'test-url-selection-operation', [{url: href, reportingMetadata: { - 'reserved.top_navigation_start': BEACON_URL, - 'reserved.top_navigation_commit': BEACON_URL, + 'reserved.top_navigation_start': BEACON_URL + + "?type=reserved.top_navigation_start", + 'reserved.top_navigation_commit': BEACON_URL + + "?type=reserved.top_navigation_commit", }}], { data: {'mockResult': 0}, resolveToConfig: resolve_to_config, @@ -497,10 +499,12 @@ async function nextValueFromServer(key) { } } -// Reads the data from the latest automatic beacon sent to the server. -async function readAutomaticBeaconDataFromServer(expected_body) { +// Checks the automatic beacon data server to see if it has received an +// automatic beacon with a given event type and body. +async function readAutomaticBeaconDataFromServer(event_type, expected_body) { let serverURL = `${BEACON_URL}`; const response = await fetch(serverURL + "?" + new URLSearchParams({ + type: event_type, expected_body: expected_body, })); if (!response.ok) @@ -515,12 +519,14 @@ async function readAutomaticBeaconDataFromServer(expected_body) { } // Convenience wrapper around the above getter that will wait until a value is -// available on the server. -async function nextAutomaticBeacon(expected_body) { +// available on the server. The server uses a hash of the concatenated event +// type and beacon data as the key when storing the beacon in the database. To +// retrieve it, we need to supply the endpoint with both pieces of information. +async function nextAutomaticBeacon(event_type, expected_body) { while (true) { // Fetches the test result from the server. const { status, value } = - await readAutomaticBeaconDataFromServer(expected_body); + await readAutomaticBeaconDataFromServer(event_type, expected_body); if (!status) { // The test result has not been stored yet. Retry after a while. await new Promise(resolve => setTimeout(resolve, 20)); diff --git a/tests/wpt/tests/fetch/api/crashtests/aborted-fetch-response.https.html b/tests/wpt/tests/fetch/api/crashtests/aborted-fetch-response.https.html new file mode 100644 index 00000000000..fa1ad1717f0 --- /dev/null +++ b/tests/wpt/tests/fetch/api/crashtests/aborted-fetch-response.https.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<script type="module"> + const abort = new AbortController(); + const resp = await fetch("5401a7dfd80adbd578b3e91b86fdc6966a752de7.vtt", { + signal: abort.signal, + }); + abort.abort(); + await resp.body.closed; + const cache = await caches.open("cache_name_0"); + await cache.put("bb4ea079adb4fe423f1d6cec18bc1caf78ac4cd6.ico", resp); +</script> diff --git a/tests/wpt/tests/fetch/http-cache/freshness.any.js b/tests/wpt/tests/fetch/http-cache/freshness.any.js index 6b97c8244f6..86c2620aa66 100644 --- a/tests/wpt/tests/fetch/http-cache/freshness.any.js +++ b/tests/wpt/tests/fetch/http-cache/freshness.any.js @@ -60,6 +60,34 @@ var tests = [ ] }, { + name: "HTTP cache does not reuse a response with an invalid Expires with Last-Modified now", + requests: [ + { + response_headers: [ + ["Expires", "0"], + ['Last-Modified', 0] + ] + }, + { + expected_type: "not_cached" + } + ] + }, + { + name: "HTTP cache does not reuse a response with an invalid Expires with past Last-Modified", + requests: [ + { + response_headers: [ + ["Expires", "0"], + ['Last-Modified', -100000] + ] + }, + { + expected_type: "not_cached" + } + ] + }, + { name: "HTTP cache reuses a response with positive Cache-Control: max-age", requests: [ { diff --git a/tests/wpt/tests/fetch/private-network-access/anchor.tentative.https.window.js b/tests/wpt/tests/fetch/private-network-access/anchor.tentative.https.window.js index 8ad99b1ee9c..4e860ad381d 100644 --- a/tests/wpt/tests/fetch/private-network-access/anchor.tentative.https.window.js +++ b/tests/wpt/tests/fetch/private-network-access/anchor.tentative.https.window.js @@ -2,6 +2,7 @@ // META: script=/common/dispatcher/dispatcher.js // META: script=/common/utils.js // META: script=resources/support.sub.js +// META: timeout=long // META: variant=?include=from-local // META: variant=?include=from-private // META: variant=?include=from-public diff --git a/tests/wpt/tests/fetch/private-network-access/anchor.tentative.window.js b/tests/wpt/tests/fetch/private-network-access/anchor.tentative.window.js index 60ccbde74d6..cb538658081 100644 --- a/tests/wpt/tests/fetch/private-network-access/anchor.tentative.window.js +++ b/tests/wpt/tests/fetch/private-network-access/anchor.tentative.window.js @@ -1,6 +1,7 @@ // META: script=/common/dispatcher/dispatcher.js // META: script=/common/utils.js // META: script=resources/support.sub.js +// META: timeout=long // // Spec: https://wicg.github.io/private-network-access/ // diff --git a/tests/wpt/tests/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js b/tests/wpt/tests/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js index 54485dc7047..dbae5193b5c 100644 --- a/tests/wpt/tests/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js +++ b/tests/wpt/tests/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js @@ -1,5 +1,6 @@ // META: script=/common/utils.js // META: script=resources/support.sub.js +// META: timeout=long // // Spec: https://wicg.github.io/private-network-access // diff --git a/tests/wpt/tests/fetch/private-network-access/resources/support.sub.js b/tests/wpt/tests/fetch/private-network-access/resources/support.sub.js index 920ded6cff7..69d8f50f18f 100644 --- a/tests/wpt/tests/fetch/private-network-access/resources/support.sub.js +++ b/tests/wpt/tests/fetch/private-network-access/resources/support.sub.js @@ -499,7 +499,7 @@ async function windowOpenTest(t, { source, target, expected }) { const result = await Promise.race([ reply, new Promise((resolve) => { - t.step_timeout(() => resolve("timeout"), 3000 /* ms */); + t.step_timeout(() => resolve("timeout"), 10000 /* ms */); }), ]); @@ -526,7 +526,7 @@ async function anchorTest(t, { source, target, expected }) { const result = await Promise.race([ reply, new Promise((resolve) => { - t.step_timeout(() => resolve("timeout"), 4000 /* ms */); + t.step_timeout(() => resolve("timeout"), 10000 /* ms */); }), ]); diff --git a/tests/wpt/tests/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js b/tests/wpt/tests/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js index 6369b166e21..8d1028cc5ee 100644 --- a/tests/wpt/tests/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js +++ b/tests/wpt/tests/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js @@ -1,5 +1,6 @@ // META: script=/common/utils.js // META: script=resources/support.sub.js +// META: timeout=long // // Spec: https://wicg.github.io/private-network-access/#integration-fetch // Spec: https://wicg.github.io/background-fetch/ diff --git a/tests/wpt/tests/fetch/private-network-access/window-open.tentative.https.window.js b/tests/wpt/tests/fetch/private-network-access/window-open.tentative.https.window.js index c91ec235511..6793d1f3b4d 100644 --- a/tests/wpt/tests/fetch/private-network-access/window-open.tentative.https.window.js +++ b/tests/wpt/tests/fetch/private-network-access/window-open.tentative.https.window.js @@ -2,6 +2,7 @@ // META: script=/common/dispatcher/dispatcher.js // META: script=/common/utils.js // META: script=resources/support.sub.js +// META: timeout=long // META: variant=?include=from-local // META: variant=?include=from-private // META: variant=?include=from-public diff --git a/tests/wpt/tests/fetch/private-network-access/window-open.tentative.window.js b/tests/wpt/tests/fetch/private-network-access/window-open.tentative.window.js index 18a0260cb10..5e2313d60a2 100644 --- a/tests/wpt/tests/fetch/private-network-access/window-open.tentative.window.js +++ b/tests/wpt/tests/fetch/private-network-access/window-open.tentative.window.js @@ -1,6 +1,7 @@ // META: script=/common/dispatcher/dispatcher.js // META: script=/common/utils.js // META: script=resources/support.sub.js +// META: timeout=long // // Spec: https://wicg.github.io/private-network-access/ // diff --git a/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js b/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js new file mode 100644 index 00000000000..c78a27bb87a --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js @@ -0,0 +1,208 @@ +// 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-5 +// META: variant=?6-10 +// META: variant=?11-15 +// META: variant=?16-last + +"use strict;" + +// These tests focus on making sure AuctionConfig fields are passed to seller worklets, +// and are normalized if necessary. This test does not check the behaviors of the +// fields. + +const makeTest = ({ + // Test name. + name, + // AuctionConfig field name. + fieldName, + // AuctionConfig field value, both expected in worklets and acution in the + // auction. If undefined, value will not be set in auctionConfig, and will + // be expected to also not be set in the auctionConfig passed to worklets. + fieldValue, + // Additional values to use in the AuctionConfig passed to runAdAuction(). + // If it contains a value for the key specified in `fieldName`, that takes + // precedent over `fieldValue`. + auctionConfigOverrides = {} +}) => { + subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + + if (!(fieldName in auctionConfigOverrides) && fieldValue !== undefined) + auctionConfigOverrides[fieldName] = fieldValue; + + let comparison = `deepEquals(auctionConfig["${fieldName}"], ${JSON.stringify(fieldValue)})`; + // In the case it's undefined, require value not to be set. + if (fieldValue === undefined) + comparison = `!("${fieldName}" in auctionConfig)`; + + // Prefer to use `auctionConfigOverrides.seller` if present. Treat it as a URL + // and then convert it to an origin because one test passes in a URL. + let origin = location.origin; + if (auctionConfigOverrides.seller) + origin = new URL(auctionConfigOverrides.seller).origin; + + auctionConfigOverrides.decisionLogicURL = createDecisionScriptURL( + uuid, + { origin: origin, + scoreAd: + `if (!${comparison}) + throw "Unexpected value: " + JSON.stringify(auctionConfig["${fieldName}"]);`, + reportResult: + `let error = ''; + if (!${comparison}) + error += "_unexpected_value:" + JSON.stringify(auctionConfig["${fieldName}"]); + sendReportTo("${createSellerReportURL(uuid)}" + error);` }), + + // Join an interest group so the auction has a winner. The details of the + // interest group do not matter. + await joinInterestGroup(test, uuid); + await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); + await waitForObservedRequests( + uuid, [createBidderReportURL(uuid), createSellerReportURL(uuid)]); + }, name); +}; + +makeTest({ + name: 'AuctionConfig.seller.', + fieldName: 'seller', + fieldValue: OTHER_ORIGIN1 +}); + +makeTest({ + name: 'AuctionConfig.seller with non-normalized origin.', + fieldName: 'seller', + fieldValue: OTHER_ORIGIN1, + auctionConfigOverrides: {seller: ` ${OTHER_ORIGIN1.toUpperCase()} `} +}); + +makeTest({ + name: 'AuctionConfig.seller is URL.', + fieldName: 'seller', + fieldValue: OTHER_ORIGIN1, + auctionConfigOverrides: {seller: OTHER_ORIGIN1 + "/Foopy"} +}); + +makeTest({ + name: 'AuctionConfig.trustedScoringSignalsURL passed to seller worklets.', + fieldName: 'trustedScoringSignalsURL', + fieldValue: `${OTHER_ORIGIN1}${BASE_PATH}this-file-does-not-exist.json`, + auctionConfigOverrides: {seller: OTHER_ORIGIN1} +}); + +makeTest({ + name: 'AuctionConfig.trustedScoringSignalsURL with non-normalized values.', + fieldName: 'trustedScoringSignalsURL', + fieldValue: `${OTHER_ORIGIN1}${BASE_PATH}this-file-does-not-exist.json`, + auctionConfigOverrides: { + seller: OTHER_ORIGIN1, + trustedScoringSignalsURL: + `${OTHER_ORIGIN1.toUpperCase()}${BASE_PATH}this-file-does-not-exist.json` + } +}); + +makeTest({ + name: 'AuctionConfig.trustedScoringSignalsKeys not set.', + fieldName: 'trustedScoringSignalsKeys', + fieldValue: undefined +}); + +makeTest({ + name: 'AuctionConfig.interestGroupBuyers.', + fieldName: 'interestGroupBuyers', + fieldValue: [OTHER_ORIGIN1, location.origin, OTHER_ORIGIN2] +}); + +makeTest({ + name: 'AuctionConfig.interestGroupBuyers with non-normalized values.', + fieldName: 'interestGroupBuyers', + fieldValue: [OTHER_ORIGIN1, location.origin, OTHER_ORIGIN2], + auctionConfigOverrides: { + interestGroupBuyers: [ + ` ${OTHER_ORIGIN1} `, + location.origin.toUpperCase(), + `${OTHER_ORIGIN2}/Foo`] + } +}); + +makeTest({ + name: 'AuctionConfig.nonStandardField.', + fieldName: 'nonStandardField', + fieldValue: undefined, + aucitonConfigOverrides: {nonStandardField: 'This value should not be passed to worklets'} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize not set.', + fieldName: 'requestedSize', + fieldValue: undefined +}); + +makeTest({ + name: 'AuctionConfig.requestedSize in pixels.', + fieldName: 'requestedSize', + fieldValue: {width: '100px', height: '200px'} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize in implicit pixels.', + fieldName: 'requestedSize', + fieldValue: {width: '100px', height: '200px'}, + auctionConfigOverrides: {fieldValue: {width: '100', height: '200'}} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize in screen units.', + fieldName: 'requestedSize', + fieldValue: {width: '70sw', height: '80sh'} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize in inverse screen units.', + fieldName: 'requestedSize', + fieldValue: {width: '70sh', height: '80sw'} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize in mixed units.', + fieldName: 'requestedSize', + fieldValue: {width: '100px', height: '80sh'} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize with decimals.', + fieldName: 'requestedSize', + fieldValue: {width: '70.5sw', height: '80.56sh'} +}); + +makeTest({ + name: 'AuctionConfig.requestedSize with non-normalized values.', + fieldName: 'requestedSize', + fieldValue: {width: '100px', height: '200.5px'}, + auctionConfigOverrides: {fieldValue: {width: ' 100.0px', height: '200.50px'}} +}); + +makeTest({ + name: 'Unset AuctionConfig.allSlotsRequestedSizes.', + fieldName: 'allSlotsRequestedSizes', + fieldValue: undefined +}); + +makeTest({ + name: 'AuctionConfig.allSlotsRequestedSizes.', + fieldName: 'allSlotsRequestedSizes', + fieldValue: [{width: '100px', height: '200px'}, {width: '70sh', height: '80sw'}] +}); + +makeTest({ + name: 'AuctionConfig.allSlotsRequestedSizes with non-normalized values.', + fieldName: 'allSlotsRequestedSizes', + fieldValue: [{width: '100px', height: '200.5px'}, + {width: '70sh', height: '80.5sw'}], + auctionConfigOverrides: {fieldValue: + [{width: ' 100', height: '200.50px '}, + {width: ' 70.00sh ', height: '80.50sw'}]} +}); diff --git a/tests/wpt/tests/fledge/tentative/auction-config.https.window.js b/tests/wpt/tests/fledge/tentative/auction-config.https.window.js index efb05fc14da..3b5814b5d4a 100644 --- a/tests/wpt/tests/fledge/tentative/auction-config.https.window.js +++ b/tests/wpt/tests/fledge/tentative/auction-config.https.window.js @@ -8,7 +8,9 @@ // META: variant=?11-15 // META: variant=?16-20 // META: variant=?21-25 -// META: variant=?26-last +// META: variant=?26-30 +// META: variant=?31-35 +// META: variant=?36-last "use strict;" @@ -76,7 +78,6 @@ const makeTest = ({ assert_false(dontExpectPromiseError.sawError, "Should not see a promise error"); } - }, name); }; @@ -304,3 +305,88 @@ makeTest({ expectPromiseError: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: {perBuyerCurrencies: 123} }); + +makeTest({ + name: 'requestedSize has no width', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {height: '100'}} +}); + +makeTest({ + name: 'requestedSize has no height', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '100'}} +}); + +makeTest({ + name: 'requestedSize width not a number', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '10 0', height: '100'}} +}); + +makeTest({ + name: 'requestedSize height not a number', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '100', height: '10 0'}} +}); + +makeTest({ + name: 'requestedSize 0', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '0', height: '100'}} +}); + +makeTest({ + name: 'requestedSize space before units', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '100 px', height: '100'}} +}); + +makeTest({ + name: 'requestedSize leading 0', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '0100', height: '100'}} +}); + +makeTest({ + name: 'requestedSize invalid unit type', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '100furlongs', height: '100'}} +}); + +makeTest({ + name: 'requestedSize hexideximal', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: {width: '0x100', height: '100'}} +}); + +makeTest({ + name: 'Empty allSlotsRequestedSizes', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {allSlotsRequestedSizes: []} +}); + +makeTest({ + name: 'allSlotsRequestedSizes without matching value in requestedSize', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {requestedSize: + {width: '100', height: '100'}, + allSlotsRequestedSizes: + [{width: '100', height: '101'}]} +}); + +makeTest({ + name: 'allSlotsRequestedSizes has duplicate values', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {allSlotsRequestedSizes: + [{width: '100', height: '100'}, + {width: '100', height: '100'}]} +}); + +makeTest({ + name: 'allSlotsRequestedSizes has invalid value', + expect: EXPECT_EXCEPTION(TypeError), + auctionConfigOverrides: {allSlotsRequestedSizes: + [{width: '100', height: '100'}, + {width: '200furlongs', height: '200'}]} +}); diff --git a/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js b/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js index 016c20c2b72..0ae1efd8d37 100644 --- a/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js @@ -502,3 +502,117 @@ subsetTest(promise_test, async test => { }).catch((e) => {}); assert_true(dfss); }, 'Test directFromSellerSignals feature detection.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin }); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1'}); + await runReportTest( + test, uuid, + directFromSellerSignalsValidatorCode( + uuid, 'altSellerSignals/1', + /*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null), + // expectedReportUrls + [createSellerReportURL(uuid), createBidderReportURL(uuid)], + // renderURLOverride + null, + // auctionConfigOverrides + { directFromSellerSignalsHeaderAdSlot: 'adSlot/1' } + ); +}, 'Test directFromSellerSignals with 2 responses -- the later overwrites the former.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin }); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1'}); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1 v2'}); + await runReportTest( + test, uuid, + directFromSellerSignalsValidatorCode( + uuid, 'altV2SellerSignals/1', + /*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null), + // expectedReportUrls + [createSellerReportURL(uuid), createBidderReportURL(uuid)], + // renderURLOverride + null, + // auctionConfigOverrides + { directFromSellerSignalsHeaderAdSlot: 'adSlot/1' } + ); +}, 'Test directFromSellerSignals with 3 responses -- the last response overwrites the former responses.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin }); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1'}); + await runReportTest( + test, uuid, + directFromSellerSignalsValidatorCode( + uuid, /*expectedSellerSignals=*/null, + 'auctionSignals/2', /*expectedPerBuyerSignals=*/null), + // expectedReportUrls + [createSellerReportURL(uuid), createBidderReportURL(uuid)], + // renderURLOverride + null, + // auctionConfigOverrides + { directFromSellerSignalsHeaderAdSlot: 'adSlot/2' } + ); +}, 'Test directFromSellerSignals with 2 responses -- old non-overwritten ad slot remains.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Duplicate adSlot/1'}); + await runReportTest( + test, uuid, + directFromSellerSignalsValidatorCode( + uuid, 'firstSellerSignals/1', + /*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null), + // expectedReportUrls + [createSellerReportURL(uuid), createBidderReportURL(uuid)], + // renderURLOverride + null, + // auctionConfigOverrides + { directFromSellerSignalsHeaderAdSlot: 'adSlot/1' } + ); +}, 'Test invalid directFromSellerSignals with duplicate adSlot in response -- the second is ignored.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Duplicate adSlot/1'}); + await runReportTest( + test, uuid, + directFromSellerSignalsValidatorCode( + uuid, 'nonDupSellerSignals/2', + /*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null), + // expectedReportUrls + [createSellerReportURL(uuid), createBidderReportURL(uuid)], + // renderURLOverride + null, + // auctionConfigOverrides + { directFromSellerSignalsHeaderAdSlot: 'adSlot/2' } + ); +}, 'Test invalid directFromSellerSignals with duplicate adSlot in response, selecting a non duplicated adSlot.'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + await fetchDirectFromSellerSignals( + { 'Buyer-Origin': window.location.origin, + 'Alternative-Response': 'Two keys with same values'}); + await runReportTest( + test, uuid, + directFromSellerSignalsValidatorCode( + uuid, 'sameSellerSignals', + 'sameAuctionSignals', 'samePerBuyerSignals'), + // expectedReportUrls + [createSellerReportURL(uuid), createBidderReportURL(uuid)], + // renderURLOverride + null, + // auctionConfigOverrides + { directFromSellerSignalsHeaderAdSlot: 'adSlot/1' } + ); +}, 'Test invalid directFromSellerSignals with duplicate values in response.'); diff --git a/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js b/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js new file mode 100644 index 00000000000..cf46855a3d1 --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js @@ -0,0 +1,177 @@ +// 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-5 +// META: variant=?6-10 +// META: variant=?11-15 +// META: variant=?16-last + +"use strict;" + +// These tests focus on making sure InterestGroup fields are passed to generateBid(), +// and are normalized if necessary. This test does not check the behaviors of the +// fields. + +const makeTest = ({ + // Test name. + name, + // InterestGroup field name. + fieldName, + // InterestGroup field value, both expected in worklets and acution in the + // auction. If undefined, value will not be set in interestGroup, and will + // be expected to also not be set in the interestGroup passed to generateBid(). + fieldValue, + // Additional values to use in the InterestGroup passed to joinInterestGroup(). + // If it contains a value for the key specified in `fieldName`, that takes + // precedent over `fieldValue`. + interestGroupOverrides = {} +}) => { + subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + + if (!(fieldName in interestGroupOverrides) && fieldValue !== undefined) + interestGroupOverrides[fieldName] = fieldValue; + + let comparison = `deepEquals(interestGroup["${fieldName}"], ${JSON.stringify(fieldValue)})`; + // In the case it's undefined, require value not to be set. + if (fieldValue === undefined) + comparison = `!("${fieldName}" in interestGroup)`; + + // Prefer to use `interestGroupOverrides.owner` if present. Treat it as a URL + // and then convert it to an origin because one test passes in a URL. + let origin = location.origin; + if (interestGroupOverrides.owner) + origin = new URL(interestGroupOverrides.owner).origin; + + interestGroupOverrides.biddingLogicURL = + createBiddingScriptURL( + { origin: origin, + generateBid: + `if (!${comparison}) + throw "Unexpected value: " + JSON.stringify(interestGroup["${fieldName}"]);` + }); + if (origin !== location.origin) { + await joinCrossOriginInterestGroup(test, uuid, origin, interestGroupOverrides); + } else { + await joinInterestGroup(test, uuid, interestGroupOverrides); + } + + await runBasicFledgeTestExpectingWinner(test, uuid, {interestGroupBuyers: [origin]}); + }, name); +}; + +makeTest({ + name: 'InterestGroup.owner.', + fieldName: 'owner', + fieldValue: OTHER_ORIGIN1 +}); + +makeTest({ + name: 'InterestGroup.owner with non-normalized origin.', + fieldName: 'owner', + fieldValue: OTHER_ORIGIN1, + interestGroupOverrides: {seller: ` ${OTHER_ORIGIN1.toUpperCase()} `} +}); + +makeTest({ + name: 'InterestGroup.owner is URL.', + fieldName: 'owner', + fieldValue: OTHER_ORIGIN1, + interestGroupOverrides: {seller: OTHER_ORIGIN1 + "/Foopy"} +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsURL not set.', + fieldName: 'trustedBiddingSignalsURL', + fieldValue: undefined +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsURL.', + fieldName: 'trustedBiddingSignalsURL', + fieldValue: `${OTHER_ORIGIN1}${BASE_PATH}this-file-does-not-exist.json`, + interestGroupOverrides: {owner: OTHER_ORIGIN1} +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsURL with non-normalized value.', + fieldName: 'trustedBiddingSignalsURL', + fieldValue: `${OTHER_ORIGIN1}${BASE_PATH}this-file-does-not-exist.json`, + interestGroupOverrides: { + owner: OTHER_ORIGIN1, + trustedScoringSignalsURL: + `${OTHER_ORIGIN1.toUpperCase()}${BASE_PATH}this-file-does-not-exist.json` + } +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsKeys not set.', + fieldName: 'trustedBiddingSignalsKeys', + fieldValue: undefined +}); + +makeTest({ + name: 'InterestGroup.name.', + fieldName: 'name', + fieldValue: 'Jim' +}); + +makeTest({ + name: 'InterestGroup.name with unicode characters.', + fieldName: 'name', + fieldValue: '\u2665' +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsKeys.', + fieldName: 'trustedBiddingSignalsKeys', + fieldValue: ['a', ' b ', 'c', '1', '%20', '3', '\u2665'] +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsKeys with non-normalized values.', + fieldName: 'trustedBiddingSignalsKeys', + fieldValue: ['1', '2', '3'], + interestGroupOverrides: { trustedBiddingSignalsKeys: [1, 0x2, '3'] } +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsSlotSizeMode empty.', + fieldName: 'trustedBiddingSignalsSlotSizeMode', + fieldValue: 'none', + interestGroupOverrides: { trustedBiddingSignalsSlotSizeMode: undefined } +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsSlotSizeMode none.', + fieldName: 'trustedBiddingSignalsSlotSizeMode', + fieldValue: 'none' +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsSlotSizeMode slot-size.', + fieldName: 'trustedBiddingSignalsSlotSizeMode', + fieldValue: 'slot-size' +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsSlotSizeMode all-slots-requested-sizes.', + fieldName: 'trustedBiddingSignalsSlotSizeMode', + fieldValue: 'all-slots-requested-sizes' +}); + +makeTest({ + name: 'InterestGroup.trustedBiddingSignalsSlotSizeMode unrecognized value.', + fieldName: 'trustedBiddingSignalsSlotSizeMode', + fieldValue: 'none', + interestGroupOverrides: { trustedBiddingSignalsSlotSizeMode: 'unrecognized value' } +}); + +makeTest({ + name: 'InterestGroup.nonStandardField.', + fieldName: 'nonStandardField', + fieldValue: undefined, + interestGroupOverrides: {nonStandardField: 'This value should not be passed to worklets'} +}); diff --git a/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py b/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py index c0d6114ab2c..707e37f36bb 100644 --- a/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py +++ b/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py @@ -1,3 +1,5 @@ +from pathlib import Path + # General bidding logic script. Depending on query parameters, it can # simulate a variety of network errors, and its generateBid() and # reportWin() functions can have arbitrary Javascript code injected @@ -30,9 +32,10 @@ def main(request, response): elif error != b"no-allow-fledge": response.headers.set(b"Ad-Auction-Allowed", b"true") - body = b'' if error == b"no-body": - return body + return b'' + + body = (Path(__file__).parent.resolve() / 'worklet-helpers.js').read_text().encode("ASCII") if error != b"no-generateBid": # Use bid query param if present. Otherwise, use a bid of 9. bid = (request.GET.first(b"bid", None) or b"9").decode("ASCII") diff --git a/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py b/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py index 39a4fede5c5..78d459e3f9d 100644 --- a/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py +++ b/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py @@ -1,3 +1,5 @@ +from pathlib import Path + # General decision logic script. Depending on query parameters, it can # simulate a variety of network errors, and its scoreAd() and # reportResult() functions can have arbitrary Javascript code injected @@ -30,13 +32,14 @@ def main(request, response): elif error != b"no-allow-fledge": response.headers.set(b"Ad-Auction-Allowed", b"true") - body = b'' if error == b"no-body": - return body + return b'' + + body = (Path(__file__).parent.resolve() / 'worklet-helpers.js').read_text().encode("ASCII") if error != b"no-scoreAd": body += b""" function scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals, - browserSignals, directFromSellerSignals) { + browserSignals, directFromSellerSignals) { // Don't bid on interest group with the wrong uuid. This is to prevent // left over interest groups from other tests from affecting auction // results. diff --git a/tests/wpt/tests/fledge/tentative/resources/direct-from-seller-signals.py b/tests/wpt/tests/fledge/tentative/resources/direct-from-seller-signals.py index 0f9e29dd572..e94b9c5b47c 100644 --- a/tests/wpt/tests/fledge/tentative/resources/direct-from-seller-signals.py +++ b/tests/wpt/tests/fledge/tentative/resources/direct-from-seller-signals.py @@ -91,34 +91,78 @@ def main(request, response): response.status = (200, b"OK") buyerOrigin = request.headers.get("Buyer-Origin").decode('utf-8') - adAuctionSignals = json.dumps( - [{ - "adSlot": "adSlot/0", - }, - { - "adSlot": "adSlot/1", - "sellerSignals": "sellerSignals/1", - }, - { - "adSlot": "adSlot/2", - "auctionSignals": "auctionSignals/2", - }, - { - "adSlot": "adSlot/3", - "perBuyerSignals": { buyerOrigin: "perBuyerSignals/3" } - }, - { - "adSlot": "adSlot/4", - "sellerSignals": "sellerSignals/4", - "auctionSignals": "auctionSignals/4", - "perBuyerSignals": { buyerOrigin: "perBuyerSignals/4" } - }, - { - "adSlot": "adSlot/5", - "sellerSignals": "sellerSignals/5", - "auctionSignals": "auctionSignals/5", - "perBuyerSignals": { "mismatchOrigin": "perBuyerSignals/5" } - }]) + + altResponse = request.headers.get("Alternative-Response") + + if altResponse == b"Overwrite adSlot/1": + adAuctionSignals = json.dumps( + [{ + "adSlot": "adSlot/1", + "sellerSignals": "altSellerSignals/1", + }]) + elif altResponse == b"Overwrite adSlot/1 v2": + adAuctionSignals = json.dumps( + [{ + "adSlot": "adSlot/1", + "sellerSignals": "altV2SellerSignals/1", + }]) + elif altResponse == b"Two keys with same values": + adAuctionSignals = json.dumps( + [{ + "adSlot": "adSlot/1", + "sellerSignals": "sameSellerSignals", + "auctionSignals": "sameAuctionSignals", + "perBuyerSignals": { buyerOrigin: "samePerBuyerSignals" } + }, + { + "adSlot": "adSlot/2", + "sellerSignals": "sameSellerSignals", + "auctionSignals": "sameAuctionSignals", + "perBuyerSignals": { buyerOrigin: "samePerBuyerSignals" } + }]) + elif altResponse == b"Duplicate adSlot/1": + adAuctionSignals = json.dumps( + [{ + "adSlot": "adSlot/1", + "sellerSignals": "firstSellerSignals/1", + }, + { + "adSlot": "adSlot/2", + "sellerSignals": "nonDupSellerSignals/2", + }, + { + "adSlot": "adSlot/1", + "sellerSignals": "secondSellerSignals/1", + }]) + else: + adAuctionSignals = json.dumps( + [{ + "adSlot": "adSlot/0", + }, + { + "adSlot": "adSlot/1", + "sellerSignals": "sellerSignals/1", + }, + { + "adSlot": "adSlot/2", + "auctionSignals": "auctionSignals/2", + }, + { + "adSlot": "adSlot/3", + "perBuyerSignals": { buyerOrigin: "perBuyerSignals/3" } + }, + { + "adSlot": "adSlot/4", + "sellerSignals": "sellerSignals/4", + "auctionSignals": "auctionSignals/4", + "perBuyerSignals": { buyerOrigin: "perBuyerSignals/4" } + }, + { + "adSlot": "adSlot/5", + "sellerSignals": "sellerSignals/5", + "auctionSignals": "auctionSignals/5", + "perBuyerSignals": { "mismatchOrigin": "perBuyerSignals/5" } + }]) response.headers.set("Ad-Auction-Signals", adAuctionSignals) response.headers.set(b"Content-Type", b"text/plain") diff --git a/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py b/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py index b8e7c9ffb05..5ec487fcc90 100644 --- a/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py +++ b/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py @@ -32,6 +32,8 @@ def main(request, response): if pair[0] == "interestGroupNames" and interestGroupNames == None: interestGroupNames = list(map(unquote_plus, pair[1].split(","))) continue + if pair[0] == "slotSize" or pair[0] == "allSlotsRequestedSizes": + continue return fail(response, "Unexpected query parameter: " + param) # "interestGroupNames" and "hostname" are mandatory. @@ -102,6 +104,10 @@ def main(request, response): value = request.GET.first(b"hostname", b"not-found").decode("ASCII") elif key == "headers": value = headersToAscii(request.headers) + elif key == "slotSize": + value = request.GET.first(b"slotSize", b"not-found").decode("ASCII") + elif key == "allSlotsRequestedSizes": + value = request.GET.first(b"allSlotsRequestedSizes", b"not-found").decode("ASCII") responseBody["keys"][key] = value if "data-version" in interestGroupNames: diff --git a/tests/wpt/tests/fledge/tentative/resources/worklet-helpers.js b/tests/wpt/tests/fledge/tentative/resources/worklet-helpers.js new file mode 100644 index 00000000000..dd3b9a7dd51 --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/resources/worklet-helpers.js @@ -0,0 +1,23 @@ +// This file contains helper methods that are appended to the start of bidder +// and seller worklets. + +// Comparison function that checks if two arguments are the same. +// Not intended for use on anything other than built-in types +// (Arrays, objects, and primitive types). +function deepEquals(a, b) { + if (typeof a !== typeof b) + return false; + if (typeof a !== 'object' || a === null || b === null) + return a === b; + + let aKeys = Object.keys(a); + if (aKeys.length != Object.keys(b).length) + return false; + for (key in aKeys) { + if (a.hasOwnProperty(key) != b.hasOwnProperty(key) || + !deepEquals(a[key], b[key])) { + return false; + } + } + return true; +} diff --git a/tests/wpt/tests/fledge/tentative/trusted-bidding-signals.https.window.js b/tests/wpt/tests/fledge/tentative/trusted-bidding-signals.https.window.js index 8c15e93e66d..9799af6ac1f 100644 --- a/tests/wpt/tests/fledge/tentative/trusted-bidding-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/trusted-bidding-signals.https.window.js @@ -11,7 +11,12 @@ // META: variant=?26-30 // META: variant=?31-35 // META: variant=?36-40 -// META: variant=?41-last +// META: variant=?41-45 +// META: variant=?46-50 +// META: variant=?51-55 +// META: variant=?56-60 +// META: variant=?61-65 +// META: variant=?66-last "use strict"; @@ -31,12 +36,18 @@ // allowing trusted bidding signals keys and URL to be set, in addition to other // fields. async function runTrustedBiddingSignalsTest( - test, generateBidCheck, interestGroupOverrides = {}) { + test, generateBidCheck, interestGroupOverrides = {}, auctionConfigOverrides = {}, uuidOverride = null) { interestGroupOverrides.biddingLogicURL = - createBiddingScriptURL({ + createBiddingScriptURL({ + allowComponentAuction: true, generateBid: `if (!(${generateBidCheck})) return false;` }); - await joinGroupAndRunBasicFledgeTestExpectingWinner( - test, {interestGroupOverrides: interestGroupOverrides}); + let testConfig = { + interestGroupOverrides: interestGroupOverrides, + auctionConfigOverrides: auctionConfigOverrides + }; + if (uuidOverride) + testConfig.uuid = uuidOverride; + await joinGroupAndRunBasicFledgeTestExpectingWinner(test, testConfig); } // Much like runTrustedBiddingSignalsTest, but runs auctions through reporting @@ -438,3 +449,339 @@ subsetTest(promise_test, async test => { { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:{"keys":5}'], trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); }, 'Trusted bidding signals response with Data-Version and invalid keys entry'); + +///////////////////////////////////////////////////////////////////////////// +// trustedBiddingSignalsSlotSizeMode tests +///////////////////////////////////////////////////////////////////////////// + +async function runTrustedBiddingSignalsSlotSizeTest( + test, + expectedSlotSize, + expectedAllSlotsRequestedSizes, + trustedBiddingSignalsSlotSizeMode = null, + auctionConfigOverrides = {}, + uuidOverride = null) { + await runTrustedBiddingSignalsTest( + test, + `trustedBiddingSignals["slotSize"] === + ${JSON.stringify(expectedSlotSize)} && + trustedBiddingSignals["allSlotsRequestedSizes"] === + ${JSON.stringify(expectedAllSlotsRequestedSizes)}`, + { trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], + trustedBiddingSignalsSlotSizeMode: trustedBiddingSignalsSlotSizeMode, + trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL}, + auctionConfigOverrides, + uuidOverride); +} + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found'); +}, 'Null trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode'); +}, 'Unknown trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'none'); +}, 'none trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size'); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size'); +}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'none', + {requestedSize: {width:'10', height:'20'}}); +}, 'none trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/null, + {requestedSize: {width:'10', height:'20'}}); +}, 'Null trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode', + {requestedSize: {width:'10', height:'20'}}); +}, 'Unknown trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'10px,20px', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + {requestedSize: {width:'10', height:'20'}}); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', + {requestedSize: {width:'10', height:'20'}}); +}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'none', + {allSlotsRequestedSizes: [{width:10, height:20}]}); +}, 'none trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/null, + {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); +}, 'Null trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode', + {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); +}, 'Unknown trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'10px,20px', + /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', + {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); +}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'10px,20px', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + {requestedSize: {width:'10px', height:'20px'}}); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, explicit pixel units'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'80sw,12.5sh', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + {requestedSize: {width:'80sw', height:'12.50sh'}}); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, screen size units'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'80sh,12.5sw', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + {requestedSize: {width:'80sh', height:'12.5sw'}}); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, flipped screen size units'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'10px,25sh', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + {requestedSize: {width:'10', height:'25sh'}}); +}, 'slot-size trustedBiddingSignalsSlotSizeMode, mixed pixel and screen width units'); + +subsetTest(promise_test, async test => { + await runTrustedBiddingSignalsSlotSizeTest( + test, + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'10px,20px,25sw,20px,22px,80sh', + /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', + { allSlotsRequestedSizes: [ {width:'10', height:'20'}, + {width:'25sw', height:'20px'}, + {width:'22', height:'80sh'}]}); +}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, multiple unit types'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + + let group1ReportURL = createBidderReportURL(uuid, /*id=*/'none') + let group2ReportURL = createBidderReportURL(uuid, /*id=*/'slot-size') + let group3ReportURL = createBidderReportURL(uuid, /*id=*/'all-slots-requested-sizes') + + // The simplest way to make sure interest groups with different modes all receive + // the right sizes is to have interest groups that modify their bids based on ad + // size sent to the trusted server. + await Promise.all( + [ joinInterestGroup( + test, uuid, + { name: 'group 1', + trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], + trustedBiddingSignalsSlotSizeMode: 'none', + trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, + biddingLogicURL: createBiddingScriptURL( + { generateBid: + `if (trustedBiddingSignals["slotSize"] !== "not-found" || + trustedBiddingSignals["allSlotsRequestedSizes"] !== "not-found") { + throw "unexpected trustedBiddingSignals"; + } + return {bid: 5, render: interestGroup.ads[0].renderURL};`, + reportWin: `sendReportTo("${group1ReportURL}");`})}), + joinInterestGroup( + test, uuid, + { name: 'group 2', + trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], + trustedBiddingSignalsSlotSizeMode: 'slot-size', + trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, + biddingLogicURL: createBiddingScriptURL( + { generateBid: + `if (trustedBiddingSignals["slotSize"] === "not-found" || + trustedBiddingSignals["allSlotsRequestedSizes"] !== "not-found") { + throw "unexpected trustedBiddingSignals"; + } + // Group 3 bids using the first digit of the first dimension. + return { bid: trustedBiddingSignals["slotSize"].substr(0, 1), + render: interestGroup.ads[0].renderURL};`, + reportWin: `sendReportTo("${group2ReportURL}");`})}), + joinInterestGroup( + test, uuid, + { name: 'group 3', + trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], + trustedBiddingSignalsSlotSizeMode: 'all-slots-requested-sizes', + trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, + biddingLogicURL: createBiddingScriptURL( + { generateBid: + `if (trustedBiddingSignals["slotSize"] !== "not-found" || + trustedBiddingSignals["allSlotsRequestedSizes"] === "not-found") { + throw "unexpected trustedBiddingSignals"; + } + // Group 3 bids using the second digit of the first dimension. + return { bid: trustedBiddingSignals["allSlotsRequestedSizes"].substr(1, 1), + render: interestGroup.ads[0].renderURL};`, + reportWin: `sendReportTo("${group3ReportURL}");`})}), + ] + ); + + let auctionConfigOverrides = { + // Disable the default seller reporting, for simplicity. + decisionLogicURL: createDecisionScriptURL(uuid, { reportResult: '' }), + // Default sizes start with a "11", so groups 2 and 3 will start with a bid + // of 1 and lose. + requestedSize: {width:'11', height:'20'}, + allSlotsRequestedSizes: [{width:'11', height:'20'}] + }; + + // Group 1 wins the first auction. + await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); + await waitForObservedRequests(uuid, [group1ReportURL]); + + // Group2 should bid "6" in the second auction, and win it. + auctionConfigOverrides.requestedSize = {width:'61', height:'20'}; + auctionConfigOverrides.allSlotsRequestedSizes = [{width:'61', height:'20'}]; + await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); + await waitForObservedRequests(uuid, [group1ReportURL, group2ReportURL]); + + // Group3 should bid "7" in the third auction, and win it. + auctionConfigOverrides.requestedSize = {width:'67', height:'20'}; + auctionConfigOverrides.allSlotsRequestedSizes = [{width:'67', height:'20'}]; + await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); + await waitForObservedRequests(uuid, [group1ReportURL, group2ReportURL, group3ReportURL]); +}, 'Mixed trustedBiddingSignalsSlotSizeModes in a single auction'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + let componentAuctionConfig = { + seller: window.location.origin, + decisionLogicURL: createDecisionScriptURL(uuid), + interestGroupBuyers: [window.location.origin], + requestedSize: {width:'10', height:'20'} + }; + + let auctionConfigOverrides = { + interestGroupBuyers: [], + componentAuctions: [componentAuctionConfig], + requestedSize: {width:'22', height:'33'} + } + + await runTrustedBiddingSignalsSlotSizeTest( + test, + // Dimensions from the component auction should be used. + /*expectedSlotSize=*/'10px,20px', + /*expectedAllSlotsRequestedSizes=*/'not-found', + /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', + auctionConfigOverrides, + uuid); +}, 'slot-size trustedBiddingSignalsSlotSizeMode in a component auction'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + let componentAuctionConfig = { + seller: window.location.origin, + decisionLogicURL: createDecisionScriptURL(uuid), + interestGroupBuyers: [window.location.origin], + allSlotsRequestedSizes: [{width:'11', height:'22'}, {width:'12', height:'23'}] + }; + + let auctionConfigOverrides = { + interestGroupBuyers: [], + componentAuctions: [componentAuctionConfig], + allSlotsRequestedSizes: [{width:'10', height:'20'}] + } + + await runTrustedBiddingSignalsSlotSizeTest( + test, + // Dimensions from the component auction should be used. + /*expectedSlotSize=*/'not-found', + /*expectedAllSlotsRequestedSizes=*/'11px,22px,12px,23px', + /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', + auctionConfigOverrides, + uuid); +}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode in a component auction'); diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js b/tests/wpt/tests/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js index df9ce65acda..ab9a3239ea0 100644 --- a/tests/wpt/tests/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js +++ b/tests/wpt/tests/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js @@ -23,6 +23,20 @@ self.addEventListener('message', function(event) { client.postMessage("dummyValue"); } event.data.port.postMessage("PASS"); + } else if (event.data.type == 'storeMessagePort') { + let isCloseEventFired = false; + const port = event.ports[0]; + port.start(); + port.onmessage = (event) => { + if (event.data == 'Confirm the ports can communicate') { + port.postMessage('Receive message'); + } else if (event.data == 'Ask if the close event was fired') { + port.postMessage(isCloseEventFired); + } + }; + port.onclose = () => { + isCloseEventFired = true; + }; } }); diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html b/tests/wpt/tests/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html index f4e4e36f372..d20a440d039 100644 --- a/tests/wpt/tests/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html +++ b/tests/wpt/tests/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html @@ -38,7 +38,7 @@ promise_test(async t => { // If the newly-opened window tries to navigate, fail the test. const failPromise = new Promise((resolve, reject) => { - win.onunload = () => + win.onpagehide = () => reject(new Error("Navigation was attempted to unparseable URL")); }); diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html b/tests/wpt/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html index 72f41ae3e8d..2a9cab4aa4d 100644 --- a/tests/wpt/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html +++ b/tests/wpt/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html @@ -1,7 +1,7 @@ <!DOCTYPE HTML> <script> t = opener.t; - do_test = t.step(function () { + do_test = t.step_func(function () { localStorage.test6564729 += '4'; var d = document; var e = document.open(); // has no effect (ignore-opens-during-unload > 0) diff --git a/tests/wpt/tests/html/browsers/the-window-object/BarProp.window.js b/tests/wpt/tests/html/browsers/the-window-object/BarProp.window.js index 27a357cab59..266779ee0b6 100644 --- a/tests/wpt/tests/html/browsers/the-window-object/BarProp.window.js +++ b/tests/wpt/tests/html/browsers/the-window-object/BarProp.window.js @@ -45,7 +45,7 @@ async_test(t => { assert_identical_barProps(barProps, openee, barPropObjects, true); - openee.onunload = t.step_func(() => { + openee.onpagehide = t.step_func(() => { assert_identical_barProps(barProps, openee, barPropObjects, true); t.step_timeout(() => { assert_identical_barProps(barProps, openee, barPropObjects, false); diff --git a/tests/wpt/tests/html/browsers/the-window-object/open-close/close_pagehide-1.html b/tests/wpt/tests/html/browsers/the-window-object/open-close/close_pagehide-1.html new file mode 100644 index 00000000000..5631b539a6a --- /dev/null +++ b/tests/wpt/tests/html/browsers/the-window-object/open-close/close_pagehide-1.html @@ -0,0 +1,7 @@ +<!doctype html> +<script> +onload = function() {opener.postMessage("loaded", "*")}; +onpagehide = function() { + opener.callback(); +} +</script> diff --git a/tests/wpt/tests/html/browsers/the-window-object/open-close/close_pagehide.html b/tests/wpt/tests/html/browsers/the-window-object/open-close/close_pagehide.html new file mode 100644 index 00000000000..4d726437c23 --- /dev/null +++ b/tests/wpt/tests/html/browsers/the-window-object/open-close/close_pagehide.html @@ -0,0 +1,16 @@ +<!doctype html> +<title>Running pagehide handler in window.close()</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var w = window.open("close_pagehide-1.html"); +onmessage = t.step_func(function(event) { + if (event.data != "loaded") { + return; + } + w.close(); +}); +callback = function() {t.done()} +</script> diff --git a/tests/wpt/tests/html/browsers/the-window-object/self-et-al.window.js b/tests/wpt/tests/html/browsers/the-window-object/self-et-al.window.js index 1b0fa1211a7..c42522803ab 100644 --- a/tests/wpt/tests/html/browsers/the-window-object/self-et-al.window.js +++ b/tests/wpt/tests/html/browsers/the-window-object/self-et-al.window.js @@ -28,8 +28,8 @@ function delayed_assert_done(t, w, windowProxySelfReference) { async_test(t => { const otherW = window.open(); assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} is broken`); - otherW.onunload = t.step_func(() => { - assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context unload`); + otherW.onpagehide = t.step_func(() => { + assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context pagehide`); t.step_timeout(() => { assert_equals(otherW.opener, null); // Ensure browsing context is discarded assert_equals(otherW[windowProxySelfReference], otherW, `${windowProxySelfReference} got cleared after browsing context removal`); diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html index f43e10703df..42fb1ee8f84 100644 --- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html @@ -22,7 +22,7 @@ _addTest(function(canvas, ctx) { assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); }); - assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2]}); }); + assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); }); diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html new file mode 100644 index 00000000000..f9571f208ea --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="4 4" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html new file mode 100644 index 00000000000..6376d07b0e6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 4], + }); + ctx.fillRect(25, 25, 50, 50); +</script> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html new file mode 100644 index 00000000000..e76613271f3 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="4 1" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html new file mode 100644 index 00000000000..145cb32757a --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 1], + }); + ctx.fillRect(25, 25, 50, 50); +</script> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html new file mode 100644 index 00000000000..0f214fca9fd --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="1 4" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html new file mode 100644 index 00000000000..e921e0eaa65 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [1, 4], + }); + ctx.fillRect(25, 25, 50, 50); +</script> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html new file mode 100644 index 00000000000..285a6417266 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="4 0" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html new file mode 100644 index 00000000000..fd6ac687f9c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 0], + }); + ctx.fillRect(25, 25, 50, 50); +</script> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html new file mode 100644 index 00000000000..d59945b5da6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="0 4" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html new file mode 100644 index 00000000000..6442433e7c5 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [0, 4], + }); + ctx.fillRect(25, 25, 50, 50); +</script> diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html index c19bc700880..c40e718d722 100644 --- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html +++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html @@ -24,6 +24,8 @@ _addTest(function(canvas, ctx) { _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 5}); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); + ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1, 2]}); + _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); ctx.filter = new CanvasFilter([ {name: 'gaussianBlur', stdDeviation: 5}, {name: 'gaussianBlur', stdDeviation: 10} diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic-expected.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic-expected.html new file mode 100644 index 00000000000..6a6f0f68928 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.isotropic</title> +<h1>2d.layer.anisotropic-blur.isotropic</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="4 4" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic.html new file mode 100644 index 00000000000..4e496b7e481 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.isotropic-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.isotropic</title> +<h1>2d.layer.anisotropic-blur.isotropic</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); +</script> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x-expected.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x-expected.html new file mode 100644 index 00000000000..b0473f2ff0a --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-x</title> +<h1>2d.layer.anisotropic-blur.mostly-x</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="4 1" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.html new file mode 100644 index 00000000000..4217d9fad3f --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.mostly-x-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-x</title> +<h1>2d.layer.anisotropic-blur.mostly-x</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 1] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); +</script> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y-expected.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y-expected.html new file mode 100644 index 00000000000..43da016eeaf --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-y</title> +<h1>2d.layer.anisotropic-blur.mostly-y</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="1 4" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.html new file mode 100644 index 00000000000..97a44e9045a --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.mostly-y-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-y</title> +<h1>2d.layer.anisotropic-blur.mostly-y</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [1, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); +</script> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only-expected.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only-expected.html new file mode 100644 index 00000000000..0b4d269189f --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.x-only</title> +<h1>2d.layer.anisotropic-blur.x-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="4 0" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.html new file mode 100644 index 00000000000..fdf604616b8 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.x-only-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.x-only</title> +<h1>2d.layer.anisotropic-blur.x-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 0] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); +</script> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only-expected.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only-expected.html new file mode 100644 index 00000000000..25723864122 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.y-only</title> +<h1>2d.layer.anisotropic-blur.y-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="0 4" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.html new file mode 100644 index 00000000000..c7ceb63a87c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.y-only-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.y-only</title> +<h1>2d.layer.anisotropic-blur.y-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [0, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html index e4d4798a8e8..d8f14529c53 100644 --- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html @@ -23,7 +23,7 @@ t.step(function() { assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); }); - assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2]}); }); + assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); }); t.done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js index 75afb17b792..9b3fb3c04cd 100644 --- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js @@ -19,7 +19,7 @@ t.step(function() { assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); }); - assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2]}); }); + assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); }); assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); }); t.done(); diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html new file mode 100644 index 00000000000..f9571f208ea --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="4 4" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html new file mode 100644 index 00000000000..4417a1917c9 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 4], + }); + ctx.fillRect(25, 25, 50, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html new file mode 100644 index 00000000000..d2024ad205e --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.isotropic</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 4], + }); + ctx.fillRect(25, 25, 50, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html new file mode 100644 index 00000000000..e76613271f3 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="4 1" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html new file mode 100644 index 00000000000..2ea26359fe9 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 1], + }); + ctx.fillRect(25, 25, 50, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html new file mode 100644 index 00000000000..fa49ea46828 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-x</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 1], + }); + ctx.fillRect(25, 25, 50, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html new file mode 100644 index 00000000000..0f214fca9fd --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="1 4" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html new file mode 100644 index 00000000000..a9783ccb6a0 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [1, 4], + }); + ctx.fillRect(25, 25, 50, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html new file mode 100644 index 00000000000..ab83f50ea0e --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.mostly-y</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [1, 4], + }); + ctx.fillRect(25, 25, 50, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html new file mode 100644 index 00000000000..285a6417266 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="4 0" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html new file mode 100644 index 00000000000..3028c2a700e --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 0], + }); + ctx.fillRect(25, 25, 50, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html new file mode 100644 index 00000000000..e8482cf3ed8 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.x-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [4, 0], + }); + ctx.fillRect(25, 25, 50, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html new file mode 100644 index 00000000000..d59945b5da6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="100" height="100" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="0 4" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html new file mode 100644 index 00000000000..fca324716b4 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [0, 4], + }); + ctx.fillRect(25, 25, 50, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html new file mode 100644 index 00000000000..50cfb3083a2 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only-expected.html"> +<title>Canvas test: 2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</title> +<h1>2d.filter.canvasFilterObject.gaussianBlur.tentative.y-only</h1> +<p class="desc">Test CanvasFilter() with gaussianBlur.</p> +<canvas id="canvas" width="100" height="100"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [0, 4], + }); + ctx.fillRect(25, 25, 50, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html index 0d057e41050..fb99ef7d1ff 100644 --- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html @@ -25,6 +25,8 @@ t.step(function() { _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 5}); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); + ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1, 2]}); + _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); ctx.filter = new CanvasFilter([ {name: 'gaussianBlur', stdDeviation: 5}, {name: 'gaussianBlur', stdDeviation: 10} diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js index 22a743877ff..db95e0b006c 100644 --- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js +++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js @@ -21,6 +21,8 @@ t.step(function() { _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 5}); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); + ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1, 2]}); + _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); ctx.filter = new CanvasFilter([ {name: 'gaussianBlur', stdDeviation: 5}, {name: 'gaussianBlur', stdDeviation: 10} diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic-expected.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic-expected.html new file mode 100644 index 00000000000..6a6f0f68928 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.isotropic</title> +<h1>2d.layer.anisotropic-blur.isotropic</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="4 4" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.html new file mode 100644 index 00000000000..d59a4ccf62e --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.isotropic-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.isotropic</title> +<h1>2d.layer.anisotropic-blur.isotropic</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters.w.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html index 0c086af825d..15961d5c7ea 100644 --- a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters.w.html +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.w.html @@ -1,10 +1,10 @@ <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> <html class="reftest-wait"> -<link rel="match" href="2d.layer.css-filters-expected.html"> -<title>Canvas test: 2d.layer.css-filters</title> -<h1>2d.layer.css-filters</h1> -<p class="desc">Checks that beginLayer works with a CSS filter string as input.</p> +<link rel="match" href="2d.layer.anisotropic-blur.isotropic-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.isotropic</title> +<h1>2d.layer.anisotropic-blur.isotropic</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> <canvas id="canvas" width="200" height="200"> <p class="fallback">FAIL (fallback content)</p> </canvas> @@ -13,24 +13,10 @@ const canvas = new OffscreenCanvas(200, 200); const ctx = canvas.getContext('2d'); - ctx.beginLayer({filter: 'drop-shadow(-10px -10px 5px purple)'}); + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 4] }}); ctx.fillStyle = 'teal'; - ctx.fillRect(25, 25, 50, 50); - - ctx.endLayer(); - - ctx.beginLayer({filter: 'blur(10px)'}); - - ctx.fillStyle = 'violet'; - ctx.fillRect(125, 25, 50, 50); - - ctx.endLayer(); - - ctx.beginLayer({filter: 'blur(5px) drop-shadow(10px 10px 5px orange)'}); - - ctx.fillStyle = 'navy'; - ctx.fillRect(50, 125, 100, 50); + ctx.fillRect(50, 50, 100, 100); ctx.endLayer(); diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x-expected.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x-expected.html new file mode 100644 index 00000000000..b0473f2ff0a --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-x</title> +<h1>2d.layer.anisotropic-blur.mostly-x</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="4 1" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.html new file mode 100644 index 00000000000..c5ad2ee6c58 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.mostly-x-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-x</title> +<h1>2d.layer.anisotropic-blur.mostly-x</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 1] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html new file mode 100644 index 00000000000..60f5ac3ebdb --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.anisotropic-blur.mostly-x-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-x</title> +<h1>2d.layer.anisotropic-blur.mostly-x</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 1] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y-expected.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y-expected.html new file mode 100644 index 00000000000..43da016eeaf --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-y</title> +<h1>2d.layer.anisotropic-blur.mostly-y</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="1 4" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.html new file mode 100644 index 00000000000..9545257cfa0 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.mostly-y-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-y</title> +<h1>2d.layer.anisotropic-blur.mostly-y</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [1, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html new file mode 100644 index 00000000000..d533ad3187b --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.anisotropic-blur.mostly-y-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.mostly-y</title> +<h1>2d.layer.anisotropic-blur.mostly-y</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [1, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only-expected.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only-expected.html new file mode 100644 index 00000000000..0b4d269189f --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.x-only</title> +<h1>2d.layer.anisotropic-blur.x-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="4 0" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.html new file mode 100644 index 00000000000..4552ad44339 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.x-only-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.x-only</title> +<h1>2d.layer.anisotropic-blur.x-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 0] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html new file mode 100644 index 00000000000..38abb21cd99 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.anisotropic-blur.x-only-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.x-only</title> +<h1>2d.layer.anisotropic-blur.x-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [4, 0] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only-expected.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only-expected.html new file mode 100644 index 00000000000..25723864122 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only-expected.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.anisotropic-blur.y-only</title> +<h1>2d.layer.anisotropic-blur.y-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> + +<svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur stdDeviation="0 4" /> + </filter> + <g filter="url(#filter)"> + <rect x="50" y="50" width="100" height="100" fill="teal"/> + </g> +</svg> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.html new file mode 100644 index 00000000000..87dbcd3708e --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.anisotropic-blur.y-only-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.y-only</title> +<h1>2d.layer.anisotropic-blur.y-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [0, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html new file mode 100644 index 00000000000..062328db751 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.w.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.anisotropic-blur.y-only-expected.html"> +<title>Canvas test: 2d.layer.anisotropic-blur.y-only</title> +<h1>2d.layer.anisotropic-blur.y-only</h1> +<p class="desc">Checks that layers allow gaussian blur with separate X and Y components.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.beginLayer({filter: { name: 'gaussianBlur', stdDeviation: [0, 4] }}); + + ctx.fillStyle = 'teal'; + ctx.fillRect(50, 50, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters-expected.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters-expected.html deleted file mode 100644 index 19aec30ec4d..00000000000 --- a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters-expected.html +++ /dev/null @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<title>Canvas test: 2d.layer.css-filters</title> -<h1>2d.layer.css-filters</h1> -<p class="desc">Checks that beginLayer works with a CSS filter string as input.</p> -<canvas id="canvas" width="200" height="200"> - <p class="fallback">FAIL (fallback content)</p> -</canvas> -<script> - const canvas = document.getElementById("canvas"); - const ctx = canvas.getContext('2d'); - - const svg = ` - <svg xmlns="http://www.w3.org/2000/svg" - width="200" height="200" - color-interpolation-filters="sRGB"> - <filter id="filter_1" x="-100%" y="-100%" width="300%" height="300%"> - <feDropShadow dx="-10" dy="-10" stdDeviation="5" flood-color="purple" /> - </filter> - <filter id="filter_2" x="-100%" y="-100%" width="300%" height="300%"> - <feGaussianBlur stdDeviation="10" /> - </filter> - <filter id="filter_3" x="-100%" y="-100%" width="300%" height="300%"> - <feGaussianBlur stdDeviation="5" /> - <feDropShadow dx="10" dy="10" stdDeviation="5" flood-color="orange" /> - </filter> - <g filter="url(#filter_1)"> - <rect x="25" y="25" width="50" height="50" fill="teal"/> - </g> - <g filter="url(#filter_2)"> - <rect x="125" y="25" width="50" height="50" fill="violet"/> - </g> - <g filter="url(#filter_3)"> - <rect x="50" y="125" width="100" height="50" fill="navy"/> - </g> - </svg>`; - - const img = new Image(); - img.width = 200; - img.height = 200; - img.onload = () => { - ctx.drawImage(img, 0, 0); - }; - img.src = 'data:image/svg+xml;base64,' + btoa(svg); -</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters.html deleted file mode 100644 index 6f170aa1632..00000000000 --- a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.css-filters.html +++ /dev/null @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> -<link rel="match" href="2d.layer.css-filters-expected.html"> -<title>Canvas test: 2d.layer.css-filters</title> -<h1>2d.layer.css-filters</h1> -<p class="desc">Checks that beginLayer works with a CSS filter string as input.</p> -<canvas id="canvas" width="200" height="200"> - <p class="fallback">FAIL (fallback content)</p> -</canvas> -<script> - const canvas = new OffscreenCanvas(200, 200); - const ctx = canvas.getContext('2d'); - - ctx.beginLayer({filter: 'drop-shadow(-10px -10px 5px purple)'}); - - ctx.fillStyle = 'teal'; - ctx.fillRect(25, 25, 50, 50); - - ctx.endLayer(); - - ctx.beginLayer({filter: 'blur(10px)'}); - - ctx.fillStyle = 'violet'; - ctx.fillRect(125, 25, 50, 50); - - ctx.endLayer(); - - ctx.beginLayer({filter: 'blur(5px) drop-shadow(10px 10px 5px orange)'}); - - ctx.fillStyle = 'navy'; - ctx.fillRect(50, 125, 100, 50); - - ctx.endLayer(); - - const outputCanvas = document.getElementById("canvas"); - outputCanvas.getContext('2d').drawImage(canvas, 0, 0); -</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js deleted file mode 100644 index df8bee54885..00000000000 --- a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.opaque-canvas.worker.js +++ /dev/null @@ -1,40 +0,0 @@ -// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -// OffscreenCanvas test in a worker:2d.layer.opaque-canvas -// Description:Checks that layer blending works inside opaque canvas -// Note: - -importScripts("/resources/testharness.js"); -importScripts("/html/canvas/resources/canvas-tests.js"); - -var t = async_test("Checks that layer blending works inside opaque canvas"); -var t_pass = t.done.bind(t); -var t_fail = t.step_func(function(reason) { - throw reason; -}); -t.step(function() { - - var canvas = new OffscreenCanvas(200, 200); - var ctx = canvas.getContext('2d'); - - const canvas2 = new OffscreenCanvas(200, 200); - const ctx2 = canvas2.getContext('2d', {alpha: false}); - - ctx2.fillStyle = 'purple'; - ctx2.fillRect(10, 10, 100, 100); - - ctx2.globalAlpha = 0.5; - - ctx2.beginLayer({filter: {name: "dropShadow", dx: -10, dy: 10, floodColor: "pink"}}); - ctx2.fillStyle = 'green'; - ctx2.fillRect(50, 50, 100, 100); - ctx2.globalAlpha = 0.9; - ctx2.fillStyle = 'yellow'; - ctx2.fillRect(75, 25, 100, 100); - ctx2.endLayer(); - - ctx.fillStyle = 'blue'; - ctx.fillRect(0, 0, 300, 300); - ctx.drawImage(canvas2, 0, 0); - t.done(); -}); -done(); diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml index 6133628335a..01c83a33e2c 100644 --- a/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml +++ b/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml @@ -42,6 +42,8 @@ @assert ctx.filter == 'blur(5px)'; ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 5}); @assert ctx.filter.toString() == '[object CanvasFilter]'; + ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1, 2]}); + @assert ctx.filter.toString() == '[object CanvasFilter]'; ctx.filter = new CanvasFilter([ {name: 'gaussianBlur', stdDeviation: 5}, {name: 'gaussianBlur', stdDeviation: 10} @@ -68,6 +70,8 @@ @assert ctx.filter == 'blur(5px)'; ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 5}); @assert ctx.filter.toString() == '[object CanvasFilter]'; + ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1, 2]}); + @assert ctx.filter.toString() == '[object CanvasFilter]'; ctx.filter = new CanvasFilter([ {name: 'gaussianBlur', stdDeviation: 5}, {name: 'gaussianBlur', stdDeviation: 10} @@ -91,7 +95,7 @@ @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); - @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2]}); + @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); @@ -347,6 +351,43 @@ _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2); } +- name: 2d.filter.canvasFilterObject.gaussianBlur.tentative + desc: Test CanvasFilter() with gaussianBlur. + size: [100, 100] + code: | + ctx.fillStyle = 'teal'; + ctx.filter = new CanvasFilter({ + name: 'gaussianBlur', + stdDeviation: [{{ blur_x }}, {{blur_y}}], + }); + ctx.fillRect(25, 25, 50, 50); + html_reference: | + <svg xmlns="http://www.w3.org/2000/svg" + width="{{ size[0] }}" height="{{ size[1] }}" + color-interpolation-filters="sRGB"> + <filter id="blur" x="-50%" y="-50%" width="200%" height="200%"> + <feGaussianBlur stdDeviation="{{ blur_x }} {{blur_y}}" /> + </filter> + <rect x="25" y="25" width="50" height="50" + fill="teal" filter="url(#blur)" /> + </svg> + variants: + x-only: + blur_x: 4 + blur_y: 0 + mostly-x: + blur_x: 4 + blur_y: 1 + isotropic: + blur_x: 4 + blur_y: 4 + mostly-y: + blur_x: 1 + blur_y: 4 + y-only: + blur_x: 0 + blur_y: 4 + - name: 2d.filter.canvasFilterObject.dropShadow.tentative desc: Test CanvasFilter() dropShadow object. size: [520, 420] diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml index 3a05e755213..d255a834f6c 100644 --- a/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml +++ b/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml @@ -102,7 +102,6 @@ ctx.shadowColor = 'rgba(255, 165, 0, 0.5)'; ctx.shadowBlur = 3; - - name: 2d.layer.global-states.filter desc: Checks that layers with filters correctly use global render states. size: [200, 200] @@ -953,14 +952,14 @@ - name: 2d.layer.css-filters desc: Checks that beginLayer works with a CSS filter string as input. size: [200, 200] - code: | - ctx.beginLayer({filter: '{{ css_filter }}'}); + code: &filter-test-code | + ctx.beginLayer({filter: {{ ctx_filter }}}); ctx.fillStyle = 'teal'; ctx.fillRect(50, 50, 100, 100); ctx.endLayer(); - html_reference: | + html_reference: &filter-test-reference | <svg xmlns="http://www.w3.org/2000/svg" width="{{ size[0] }}" height="{{ size[1] }}" color-interpolation-filters="sRGB"> @@ -973,18 +972,54 @@ </svg> variants: blur: - css_filter: blur(10px) - svg_filter: <feGaussianBlur stdDeviation="10" /> + ctx_filter: |- + 'blur(10px)' + svg_filter: |- + <feGaussianBlur stdDeviation="10" /> shadow: - css_filter: drop-shadow(-10px -10px 5px purple) + ctx_filter: |- + 'drop-shadow(-10px -10px 5px purple)' svg_filter: |- <feDropShadow dx="-10" dy="-10" stdDeviation="5" flood-color="purple" /> blur-and-shadow: - css_filter: blur(5px) drop-shadow(10px 10px 5px orange) + ctx_filter: |- + 'blur(5px) drop-shadow(10px 10px 5px orange)' svg_filter: |- <feGaussianBlur stdDeviation="5" /> <feDropShadow dx="10" dy="10" stdDeviation="5" flood-color="orange" /> +- name: 2d.layer.anisotropic-blur + desc: Checks that layers allow gaussian blur with separate X and Y components. + size: [200, 200] + code: *filter-test-code + html_reference: *filter-test-reference + variants: + x-only: + ctx_filter: |- + { name: 'gaussianBlur', stdDeviation: [4, 0] } + svg_filter: |- + <feGaussianBlur stdDeviation="4 0" /> + mostly-x: + ctx_filter: |- + { name: 'gaussianBlur', stdDeviation: [4, 1] } + svg_filter: |- + <feGaussianBlur stdDeviation="4 1" /> + isotropic: + ctx_filter: |- + { name: 'gaussianBlur', stdDeviation: [4, 4] } + svg_filter: |- + <feGaussianBlur stdDeviation="4 4" /> + mostly-y: + ctx_filter: |- + { name: 'gaussianBlur', stdDeviation: [1, 4] } + svg_filter: |- + <feGaussianBlur stdDeviation="1 4" /> + y-only: + ctx_filter: |- + { name: 'gaussianBlur', stdDeviation: [0, 4] } + svg_filter: |- + <feGaussianBlur stdDeviation="0 4" /> + - name: 2d.layer.nested-filters desc: Checks that nested layers work properly when both apply filters. size: [400, 200] diff --git a/tests/wpt/tests/html/dom/render-blocking/document-render-blocking-partial.tentative.html b/tests/wpt/tests/html/dom/render-blocking/document-render-blocking-partial.tentative.html deleted file mode 100644 index 89ab05ed845..00000000000 --- a/tests/wpt/tests/html/dom/render-blocking/document-render-blocking-partial.tentative.html +++ /dev/null @@ -1,34 +0,0 @@ -<!DOCTYPE html> - <html blocking=render> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="support/utils.js"></script> - <title>`blocking=render` defers frames until the attribute is set</title> - <script> - assert_implements(document.documentElement.blocking, "no blocking attribute"); - - promise_test(() => { - return new Promise((resolve, reject) => { - requestAnimationFrame(() => { - if (document.getElementById("last")) - reject(); - else - resolve(); - }); - }); - }, "blocking defers frames until removed"); - </script> - </head> - <body> - <div id="first"></div> - <script> - jankMany(100, 10); - document.documentElement.blocking=""; - </script> - <div id="second"></div> - <script> - jankMany(100, 10); - </script> - <div id="last"></div> - </body> -</html> diff --git a/tests/wpt/tests/html/dom/render-blocking/document-render-blocking.tentative.html b/tests/wpt/tests/html/dom/render-blocking/document-render-blocking.tentative.html deleted file mode 100644 index 909029b73db..00000000000 --- a/tests/wpt/tests/html/dom/render-blocking/document-render-blocking.tentative.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> - <html blocking=render> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="support/utils.js"></script> - <title>`blocking=render` defers frames until complete document parsed</title> - <script> - assert_implements(document.documentElement.blocking, "no blocking attribute"); - - promise_test(() => { - return new Promise((resolve, reject) => { - requestAnimationFrame(() => { - if (document.getElementById("last")) - resolve(); - else - reject(); - }); - }); - }, "blocking defers frames until full parsing"); - </script> - </head> - <body> - <div id="first"></div> - <script> - jankMany(100, 10); - </script> - <div id="second"></div> - <script> - jankMany(100, 10); - </script> - <div id="last"></div> - </body> -</html> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.tentative.html new file mode 100644 index 00000000000..9624b41a194 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.tentative.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>`link rel=expect` defers frames until href element is parsed</title> + +<link rel=expect href="#last" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "blocking defers frames until full parsing"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.tentative.html new file mode 100644 index 00000000000..ab0fd511156 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.tentative.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Frames starts after href element is parsed before the end</title> + +<link rel=expect href="#third" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("third"))); + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "blocking defers until needed element is parsed"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="fourth"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.tentative.html new file mode 100644 index 00000000000..eb3a347a6eb --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.tentative.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Adding link in the head has an effect</title> + +<script> +let link = document.createElement("link"); +link.rel = "expect"; +link.href = "#last"; +link.blocking = "render"; +document.head.appendChild(link) + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "adding link in the head defers frames"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.tentative.html new file mode 100644 index 00000000000..2c50f2d362a --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Removing link in the head has an effect</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +link.remove(); + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing link in the head makes it no longer blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.tentative.html new file mode 100644 index 00000000000..04cdab467de --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Removing blocking attr in the head has an effect</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +link.blocking = "" + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing 'blocking' makes it no longer blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.tentative.html new file mode 100644 index 00000000000..1c9da255a62 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Adding blocking attr in the head has an effect</title> + +<link id=link rel=expect href="#last"> +<script> +link.blocking = "render" + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "adding 'blocking=render' in the head makes it blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.tentative.html new file mode 100644 index 00000000000..df8f9ae3d12 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.tentative.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Media attribute that doesn't match makes the link not apply</title> + +<link rel=expect href="#last" blocking="render" media="(max-width: 10px)"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "link with non-matching media has no effect"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.tentative.html new file mode 100644 index 00000000000..c2458a0bab3 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Media attribute changes in the head to apply</title> + +<link id=link rel=expect href="#last" blocking="render" media="(max-width: 10px)"> +<script> +link.media = "(min-width: 10px)"; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "changing media to matching causes link to have an effect"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.tentative.html new file mode 100644 index 00000000000..d765ac8a5d3 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Media attribute changes in the head to not apply</title> + +<link id=link rel=expect href="#last" blocking="render" media="(min-width: 10px)"> +<script> +link.media = "(max-width: 10px)"; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "changing media to non-matching makes it non blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.tentative.html new file mode 100644 index 00000000000..7ef6a1baf35 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Rel attribute changes in the head to not apply</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +link.rel = "stylesheet"; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "changing rel to non-expect makes it non blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.tentative.html new file mode 100644 index 00000000000..31df9b068c0 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Rel attribute changes in the head to apply</title> + +<link id=link rel=stylesheet href="#last" blocking="render"> +<script> +link.rel = "expect"; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "changing rel to expect in the head causes it to be blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.tentative.html new file mode 100644 index 00000000000..8f2594d2590 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Href attribute changes in the head to apply</title> + +<link id=link rel=expect href="" blocking="render"> +<script> +link.href = "#last"; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "adding href in the head makes it blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.tentative.html new file mode 100644 index 00000000000..9d65bd96b73 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Href attribute changes in the head to not apply</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +link.href = ""; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing href makes it no longer blocking"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.tentative.html new file mode 100644 index 00000000000..d042b96b643 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.tentative.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Blocking link added in the body has no effect</title> + +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "link in the body has no effect"); +</script> +</head> +<body> +<link rel=expect href="#last" blocking="render"> +<script> +let link = document.createElement("link"); +link.rel = "rel"; +link.href = "#last"; +link.blocking = "render"; +document.head.appendChild(link); +</script> + + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.tentative.html new file mode 100644 index 00000000000..f7ac0b1015d --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Blocking link removed in the body has an effect</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing link the body makes it non blocking"); +</script> +</head> +<body> +<script> +link.remove(); +</script> + + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.tentative.html new file mode 100644 index 00000000000..d32a0468e79 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Removing blocking attr in the body has an effect</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing 'blocking' in the body makes it non blocking"); +</script> +</head> +<body> +<script> +link.blocking = ""; +</script> + + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.tentative.html new file mode 100644 index 00000000000..d3a6046cbb3 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.tentative.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Adding blocking attr in the body has no effect</title> + +<link id=link rel=expect href="#last"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "adding 'blocking=render' in the body has no effect"); +</script> +</head> +<body> +<script> +link.blocking = "render" +</script> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.tentative.html new file mode 100644 index 00000000000..0d7402201ac --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Media attribute changes in the body to apply, but has no effect</title> + +<link id=link rel=expect href="#last" blocking="render" media="(max-width: 10px)"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "changing media to matching in the body has no effect"); +</script> +</head> +<body> +<script> +link.media = "(min-width: 10px)"; +</script> + + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.tentative.html new file mode 100644 index 00000000000..fea9e3a2b21 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Media attribute changes in the body to not apply</title> + +<link id=link rel=expect href="#last" blocking="render" media="(min-width: 10px)"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "changing media to non-matching in the body makes it non blocking"); +</script> +</head> +<body> +<script> +link.media = "(max-width: 10px)"; +</script> + + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.tentative.html new file mode 100644 index 00000000000..7fc0fe19bba --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.tentative.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Rel attribute changes in the body to not apply</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "changing rel to non-expect in the body makes it non blocking"); +</script> +</head> +<body> +<script> +link.rel = "stylesheet"; +</script> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.tentative.html new file mode 100644 index 00000000000..29430349f04 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.tentative.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Rel attribute changes in the body to apply, but has no effect</title> + +<link id=link rel=stylesheet href="#last" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "changing rel to expect in the body has no effect"); +</script> +</head> +<body> +<script> +link.rel = "expect"; +</script> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.tentative.html new file mode 100644 index 00000000000..6548c9ec4df --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Href attribute changes in the body to apply, but has no effect</title> + +<link id=link rel=expect href="" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "adding href in the body has no effect"); +</script> +</head> +<body> +<script> +link.href = "#last"; +</script> + + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.tentative.html new file mode 100644 index 00000000000..c3661bcaa6a --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.tentative.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Href attribute changes in the body to not apply</title> + +<link id=link rel=expect href="#last" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing href in the body makes it non blocking"); +</script> +</head> +<body> +<script> +link.href = ""; +</script> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.tentative.html new file mode 100644 index 00000000000..c98022cfeab --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.tentative.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Unknown href causes the whole document to be blocked</title> + +<link rel=expect href="#unknown" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "unknown href causes the whole document to be blocked"); +</script> +</head> +<body> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="fourth"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.tentative.html new file mode 100644 index 00000000000..29868b92cbc --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.tentative.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Adding an id to parsed element satisfies render block</title> + +<link rel=expect href="#first" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("first"))); + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "adding an id in the body satisfies render block"); +</script> +</head> +<body> + <div id="willbefirst"></div> + <script> + willbefirst.id = "first"; + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="fourth"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.tentative.html new file mode 100644 index 00000000000..dc23211b8b0 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.tentative.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Removing id keeps render block satisfied</title> + +<link rel=expect href="#first" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("wasfirst"))); + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing id after it was renderer keeps render block satisfied"); +</script> +</head> +<body> + <div id="first"></div> + <script> + first.id = "wasfirst"; + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="fourth"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.tentative.html new file mode 100644 index 00000000000..5b8a5eb24d5 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.tentative.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Unknown href causes the whole document to be blocked</title> + +<link id=link rel=expect href="#unknown" blocking="render"> +<script> +link.href = "#stillunknown"; + +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("last"))); + t.done(); + }); +}, "unknown href causes the whole document to be blocked (with href changes!)"); +</script> +</head> +<body> + <div id="notfirst"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="fourth"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.tentative.html new file mode 100644 index 00000000000..57ba3d60260 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.tentative.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>Multiple links and all but one removed</title> + +<link rel=expect href="#third" blocking="render"> +<link id=one rel=expect href="#third" blocking="render"> +<link id=two rel=expect href="#third" blocking="render"> +<link id=three rel=expect href="#third" blocking="render"> +<link id=four rel=expect href="#third" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("third"))); + t.step(() => assert_false(!!document.getElementById("last"))); + t.done(); + }); +}, "removing some links but not all keeps at least the matching link blocking"); + +one.remove(); +two.remove(); +</script> +</head> +<body> +<script> +three.remove(); +four.remove(); +</script> + <div id="first"></div> + <script> + jankMany(100, 10); + </script> + <div id="second"></div> + <script> + jankMany(100, 10); + </script> + <div id="third"></div> + <script> + jankMany(100, 10); + </script> + <div id="fourth"></div> + <script> + jankMany(100, 10); + </script> + <div id="last"></div> +</body> diff --git a/tests/wpt/tests/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html b/tests/wpt/tests/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html index 9d9bbaee721..03eba222855 100644 --- a/tests/wpt/tests/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html +++ b/tests/wpt/tests/html/semantics/invokers/invoketarget-on-popover-behavior.tentative.html @@ -37,12 +37,19 @@ promise_test(async function (t) { invokee.showPopover(); assert_true(invokee.matches(":popover-open")); - await clickOn(invokerbutton2); + await clickOn(invokerbutton); assert_false(invokee.matches(":popover-open")); }, "invoking (as auto) open popover closes"); promise_test(async function (t) { invokee.showPopover(); + assert_true(invokee.matches(":popover-open")); + await clickOn(invokerbutton2); + assert_false(invokee.matches(":popover-open")); + }, "invoking (as auto) from within open popover closes"); + + promise_test(async function (t) { + invokee.showPopover(); t.add_cleanup(() => invokee.hidePopover()); invokee.addEventListener("invoke", (e) => e.preventDefault(), { once: true, @@ -89,12 +96,21 @@ invokerbutton2.setAttribute("invokeaction", "togglepopover"); t.add_cleanup(() => invokerbutton2.removeAttribute("invokeaction")); assert_true(invokee.matches(":popover-open")); - await clickOn(invokerbutton2); + await clickOn(invokerbutton); assert_false(invokee.matches(":popover-open")); }, "invoking (as togglepopover) open popover closes"); promise_test(async function (t) { invokee.showPopover(); + invokerbutton2.setAttribute("invokeaction", "togglepopover"); + t.add_cleanup(() => invokerbutton2.removeAttribute("invokeaction")); + assert_true(invokee.matches(":popover-open")); + await clickOn(invokerbutton2); + assert_false(invokee.matches(":popover-open")); + }, "invoking (as togglepopover) from within open popover closes"); + + promise_test(async function (t) { + invokee.showPopover(); t.add_cleanup(() => invokee.hidePopover()); invokerbutton2.setAttribute("invokeaction", "togglepopover"); t.add_cleanup(() => invokerbutton2.removeAttribute("invokeaction")); diff --git a/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute-hint.tentative.html b/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute-hint.tentative.html new file mode 100644 index 00000000000..b531ddc460e --- /dev/null +++ b/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute-hint.tentative.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Popover invoking attribute</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popover.research.explainer"> +<link rel=help href="https://html.spec.whatwg.org/multipage/popover.html"> +<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-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/popover-utils.js"></script> +<script src="resources/popover-invoking-attribute.js"></script> + +<body> +<script> +runPopoverInvokerTests(["hint"]); +</script> diff --git a/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute.html b/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute.html index 22e7dc14a17..8e312e90d7a 100644 --- a/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute.html +++ b/tests/wpt/tests/html/semantics/popovers/popover-invoking-attribute.html @@ -11,134 +11,13 @@ <script src="/resources/testdriver-actions.js"></script> <script src="/resources/testdriver-vendor.js"></script> <script src="resources/popover-utils.js"></script> +<script src="resources/popover-invoking-attribute.js"></script> <body> <script> -const actionReflectionLogic = (action) => { - switch (action?.toLowerCase()) { - case "show": return "show"; - case "hide": return "hide"; - default: return "toggle"; - } -} -const noActivationLogic = (action) => { - return "none"; -} -function makeElementWithType(element,type) { - return (test) => { - const el = Object.assign(document.createElement(element),{type}); - document.body.appendChild(el); - test.add_cleanup(() => el.remove()); - return el; - }; -} -const supportedButtonTypes = ['button','reset','submit',''].map(type => { - return { - name: `<button type="${type}">`, - makeElement: makeElementWithType('button',type), - invokeFn: el => {el.focus(); el.click()}, - getExpectedLogic: actionReflectionLogic, - }; -}); -const supportedInputButtonTypes = ['button','reset','submit','image'].map(type => { - return { - name: `<input type="${type}">`, - makeElement: makeElementWithType('input',type), - invokeFn: el => {el.focus(); el.click()}, - getExpectedLogic: actionReflectionLogic, - }; -}); -const unsupportedTypes = ['text','email','password','search','tel','url','checkbox','radio','range','file','color','date','datetime-local','month','time','week','number'].map(type => { - return { - name: `<input type="${type}">`, - makeElement: makeElementWithType('input',type), - invokeFn: (el) => {el.focus();}, - getExpectedLogic: noActivationLogic, // None of these support popover invocation - }; -}); -const invokers = [ - ...supportedButtonTypes, - ...supportedInputButtonTypes, - ...unsupportedTypes, -]; -const validTypes = popoverHintSupported() ? ["auto","hint","manual"] : ["auto","manual"]; -window.addEventListener('load', () => { - validTypes.forEach(type => { - invokers.forEach(testcase => { - ["toggle","hide","show","ShOw","garbage",null,undefined].forEach(action => { - [false,true].forEach(use_idl_for_target => { - [false,true].forEach(use_idl_for_action => { - promise_test(async test => { - const popover = Object.assign(document.createElement('div'),{popover: type, id: 'my-popover'}); - assert_equals(popover.popover,type,'reflection'); - const invoker = testcase.makeElement(test); - if (use_idl_for_target) { - invoker.popoverTargetElement = popover; - assert_equals(invoker.getAttribute('popovertarget'),'','attribute value'); - } else { - invoker.setAttribute('popovertarget',popover.id); - } - if (use_idl_for_action) { - invoker.popoverTargetAction = action; - assert_equals(invoker.getAttribute('popovertargetaction'),String(action),'action reflection'); - } else { - invoker.setAttribute('popovertargetaction',action); - } - assert_true(!document.getElementById(popover.id)); - assert_equals(invoker.popoverTargetElement,null,'targetElement should be null before the popover is in the document'); - assert_equals(invoker.popoverTargetAction,actionReflectionLogic(action),'action should be correct immediately'); - document.body.appendChild(popover); - test.add_cleanup(() => {popover.remove();}); - assert_equals(invoker.popoverTargetElement,popover,'target element should be returned once it\'s in the document'); - assert_false(popover.matches(':popover-open')); - await testcase.invokeFn(invoker); - assert_equals(document.activeElement,invoker,'Focus should end up on the invoker'); - expectedBehavior = testcase.getExpectedLogic(action); - switch (expectedBehavior) { - case "toggle": - case "show": - assert_true(popover.matches(':popover-open'),'Toggle or show should show the popover'); - popover.hidePopover(); // Hide the popover - break; - case "hide": - case "none": - assert_false(popover.matches(':popover-open'),'Hide or none should leave the popover hidden'); - break; - default: - assert_unreached(); - } - if (expectedBehavior === "none") { - // If no behavior is expected, then there is nothing left to test. Even re-focusing - // a control that has no expected behavior may hide an open popover via light dismiss. - return; - } - assert_false(popover.matches(':popover-open')); - popover.showPopover(); // Show the popover directly - assert_equals(document.activeElement,invoker,'The popover should not shift focus'); - assert_true(popover.matches(':popover-open')); - await testcase.invokeFn(invoker); - switch (expectedBehavior) { - case "toggle": - case "hide": - assert_false(popover.matches(':popover-open'),'Toggle or hide should hide the popover'); - break; - case "show": - assert_true(popover.matches(':popover-open'),'Show should leave the popover showing'); - break; - default: - assert_unreached(); - } - },`Test ${testcase.name}, action=${action}, ${use_idl_for_target ? "popoverTarget IDL" : "popovertarget attr"}, ${use_idl_for_action ? "popoverTargetAction IDL" : "popovertargetaction attr"}, with popover=${type}`); - }); - }); - }); - }); - }); -}); +runPopoverInvokerTests(["auto","manual"]); </script> - - <button popovertarget=p1>Toggle Popover 1</button> <div popover id=p1 style="border: 5px solid red;top: 100px;left: 100px;">This is popover #1</div> diff --git a/tests/wpt/tests/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html b/tests/wpt/tests/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html new file mode 100644 index 00000000000..6895b8625ac --- /dev/null +++ b/tests/wpt/tests/html/semantics/popovers/popover-stacking-anchor-attribute.tentative.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://www.w3.org/TR/css-anchor-position-1/#implicit"> +<link rel=help href="https://html.spec.whatwg.org/multipage/popover.html"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<!-- Once this test is made non-tentative, it can be folded back into popover-stacking.html --> + +<div class="example"> + <p>anchor attribute relationship</p> + <div id=anchor1 popover class=ancestor><p>Ancestor popover</p></div> + <div anchor=anchor1 popover class=child><p>Child popover</p></div> +</div> + +<div class="example"> + <p>indirect anchor attribute relationship</p> + <div popover class=ancestor> + <p>Ancestor popover</p> + <div> + <div> + <span id=anchor2>Anchor</span> + </div> + </div> + </div> + <div anchor=anchor2 popover class=child><p>Child popover</p></div> +</div> + +<!-- Other examples --> + +<div popover id=p1 anchor=b1><p>This is popover #1</p> + <button id=b2 onclick='p2.showPopover()'>Popover 2</button> + <button id=b4 onclick='p4.showPopover()'>Popover 4</button> +</div> +<div popover id=p2 anchor=b2><p>This is popover #2</p> + <button id=b3 onclick='p3.showPopover()'>Popover 3</button> +</div> +<div popover id=p3 anchor=b3><p>This is popover #3</p></div> +<div popover id=p4 anchor=b4><p>This is popover #4</p></div> +<button id=b1 onclick='p1.showPopover()'>Popover 1</button> + +<dialog id=d1>This is a dialog<button onclick='this.parentElement.close()'>Close</button></dialog> +<button id=b5 onclick='d1.showPopover()'>Dialog</button> + +<script> + // Test basic ancestor relationships + for(let example of document.querySelectorAll('.example')) { + const descr = example.querySelector('p').textContent; + const ancestor = example.querySelector('[popover].ancestor'); + const child = example.querySelector('[popover].child'); + const clickToActivate = example.querySelector('.clickme'); + test(function() { + assert_true(!!descr && !!ancestor && !!child); + assert_false(ancestor.matches(':popover-open')); + assert_false(child.matches(':popover-open')); + ancestor.showPopover(); + if (clickToActivate) + clickToActivate.click(); + else + child.showPopover(); + assert_true(child.matches(':popover-open')); + assert_true(ancestor.matches(':popover-open')); + ancestor.hidePopover(); + assert_false(ancestor.matches(':popover-open')); + assert_false(child.matches(':popover-open')); + },descr); + } + + const popovers = [p1, p2, p3, p4]; + + function assertState(...states) { + assert_equals(popovers.length,states.length); + for(let i=0;i<popovers.length;++i) { + assert_equals(popovers[i].matches(':popover-open'),states[i],`Popover #${i+1} incorrect state`); + } + } + test(function() { + assertState(false,false,false,false); + p1.showPopover(); + assertState(true,false,false,false); + p2.showPopover(); + assertState(true,true,false,false); + p3.showPopover(); + assertState(true,true,true,false); + // P4 is a sibling of P2, so showing it should + // close P2 and P3. + p4.showPopover(); + assertState(true,false,false,true); + // P2 should close P4 now. + p2.showPopover(); + assertState(true,true,false,false); + // Hiding P1 should hide all. + p1.hidePopover(); + assertState(false,false,false,false); + }, "more complex nesting, all using anchor ancestry") +</script> + +<style> + #p1 { top:350px; } + #p2 { top:350px; left:200px; } + #p3 { top:500px; } + #p4 { top:500px;left:200px; } +</style> diff --git a/tests/wpt/tests/html/semantics/popovers/popover-stacking.html b/tests/wpt/tests/html/semantics/popovers/popover-stacking.html index 7452fae7da3..1c352d566e7 100644 --- a/tests/wpt/tests/html/semantics/popovers/popover-stacking.html +++ b/tests/wpt/tests/html/semantics/popovers/popover-stacking.html @@ -1,7 +1,6 @@ <!DOCTYPE html> <meta charset="utf-8"> <link rel="author" href="mailto:masonf@chromium.org"> -<link rel=help href="https://open-ui.org/components/popover.research.explainer"> <link rel=help href="https://html.spec.whatwg.org/multipage/popover.html"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -46,37 +45,16 @@ <div id=trigger2 popover class=child><p>Child popover</p></div> </div> -<div class="example"> - <p>anchor attribute relationship</p> - <div id=anchor1 popover class=ancestor><p>Ancestor popover</p></div> - <div anchor=anchor1 popover class=child><p>Child popover</p></div> -</div> - -<div class="example"> - <p>indirect anchor attribute relationship</p> - <div popover class=ancestor> - <p>Ancestor popover</p> - <div> - <div> - <span id=anchor2>Anchor</span> - </div> - </div> - </div> - <div anchor=anchor2 popover class=child><p>Child popover</p></div> -</div> - <!-- Other examples --> -<div popover id=p1 anchor=b1><p>This is popover #1</p> +<button id=b1 onclick='p1.showPopover()'>Popover 1</button> +<div popover id=p1><p>This is popover #1</p> <button id=b2 onclick='p2.showPopover()'>Popover 2</button> - <button id=b4 onclick='p4.showPopover()'>Popover 4</button> -</div> -<div popover id=p2 anchor=b2><p>This is popover #2</p> - <button id=b3 onclick='p3.showPopover()'>Popover 3</button> + <div popover id=p2><p>This is popover #2</p> + <button id=b3 onclick='p3.showPopover()'>Popover 3</button> + <div popover id=p3><p>This is popover #3</p></div> + </div> </div> -<div popover id=p3 anchor=b3><p>This is popover #3</p></div> -<div popover id=p4 anchor=b4><p>This is popover #4</p></div> -<button id=b1 onclick='p1.showPopover()'>Popover 1</button> <dialog id=d1>This is a dialog<button onclick='this.parentElement.close()'>Close</button></dialog> <button id=b5 onclick='d1.showPopover()'>Dialog</button> @@ -105,7 +83,7 @@ },descr); } - const popovers = [p1, p2, p3, p4]; + const popovers = [p1, p2, p3]; function assertState(...states) { assert_equals(popovers.length,states.length); @@ -113,40 +91,21 @@ assert_equals(popovers[i].matches(':popover-open'),states[i],`Popover #${i+1} incorrect state`); } } - test(function() { - assertState(false,false,false,false); - p1.showPopover(); - assertState(true,false,false,false); - p2.showPopover(); - assertState(true,true,false,false); - p3.showPopover(); - assertState(true,true,true,false); - // P4 is a sibling of P2, so showing it should - // close P2 and P3. - p4.showPopover(); - assertState(true,false,false,true); - // P2 should close P4 now. - p2.showPopover(); - assertState(true,true,false,false); - // Hiding P1 should hide all. - p1.hidePopover(); - assertState(false,false,false,false); - }, "more complex nesting, all using anchor ancestry") test(function() { function openManyPopovers() { p1.showPopover(); p2.showPopover(); p3.showPopover(); - assertState(true,true,true,false); + assertState(true,true,true); } openManyPopovers(); d1.show(); // Dialog.show() should hide all popovers. - assertState(false,false,false,false); + assertState(false,false,false); d1.close(); openManyPopovers(); d1.showModal(); // Dialog.showModal() should also hide all popovers. - assertState(false,false,false,false); + assertState(false,false,false); d1.close(); }, "popovers should be closed by dialogs") @@ -156,7 +115,7 @@ d1.show(); assert_true(d1.open); p1.showPopover(); - assertState(true,false,false,false); + assertState(true,false,false); assert_true(d1.open); p1.hidePopover(); assert_true(d1.open); @@ -169,5 +128,4 @@ #p1 { top:350px; } #p2 { top:350px; left:200px; } #p3 { top:500px; } - #p4 { top:500px;left:200px; } </style> diff --git a/tests/wpt/tests/html/semantics/popovers/resources/popover-invoking-attribute.js b/tests/wpt/tests/html/semantics/popovers/resources/popover-invoking-attribute.js new file mode 100644 index 00000000000..d2911647e15 --- /dev/null +++ b/tests/wpt/tests/html/semantics/popovers/resources/popover-invoking-attribute.js @@ -0,0 +1,122 @@ +const actionReflectionLogic = (action) => { + switch (action?.toLowerCase()) { + case "show": return "show"; + case "hide": return "hide"; + default: return "toggle"; + } +} +const noActivationLogic = (action) => { + return "none"; +} +function makeElementWithType(element,type) { + return (test) => { + const el = Object.assign(document.createElement(element),{type}); + document.body.appendChild(el); + test.add_cleanup(() => el.remove()); + return el; + }; +} +const supportedButtonTypes = ['button','reset','submit',''].map(type => { + return { + name: `<button type="${type}">`, + makeElement: makeElementWithType('button',type), + invokeFn: el => {el.focus(); el.click()}, + getExpectedLogic: actionReflectionLogic, + }; +}); +const supportedInputButtonTypes = ['button','reset','submit','image'].map(type => { + return { + name: `<input type="${type}">`, + makeElement: makeElementWithType('input',type), + invokeFn: el => {el.focus(); el.click()}, + getExpectedLogic: actionReflectionLogic, + }; +}); +const unsupportedTypes = ['text','email','password','search','tel','url','checkbox','radio','range','file','color','date','datetime-local','month','time','week','number'].map(type => { + return { + name: `<input type="${type}">`, + makeElement: makeElementWithType('input',type), + invokeFn: (el) => {el.focus();}, + getExpectedLogic: noActivationLogic, // None of these support popover invocation + }; +}); +const invokers = [ + ...supportedButtonTypes, + ...supportedInputButtonTypes, + ...unsupportedTypes, +]; +function runPopoverInvokerTests(popoverTypes) { + window.addEventListener('load', () => { + popoverTypes.forEach(type => { + invokers.forEach(testcase => { + ["toggle","hide","show","ShOw","garbage",null,undefined].forEach(action => { + [false,true].forEach(use_idl_for_target => { + [false,true].forEach(use_idl_for_action => { + promise_test(async test => { + const popover = Object.assign(document.createElement('div'),{popover: type, id: 'my-popover'}); + assert_equals(popover.popover,type,'reflection'); + const invoker = testcase.makeElement(test); + if (use_idl_for_target) { + invoker.popoverTargetElement = popover; + assert_equals(invoker.getAttribute('popovertarget'),'','attribute value'); + } else { + invoker.setAttribute('popovertarget',popover.id); + } + if (use_idl_for_action) { + invoker.popoverTargetAction = action; + assert_equals(invoker.getAttribute('popovertargetaction'),String(action),'action reflection'); + } else { + invoker.setAttribute('popovertargetaction',action); + } + assert_true(!document.getElementById(popover.id)); + assert_equals(invoker.popoverTargetElement,null,'targetElement should be null before the popover is in the document'); + assert_equals(invoker.popoverTargetAction,actionReflectionLogic(action),'action should be correct immediately'); + document.body.appendChild(popover); + test.add_cleanup(() => {popover.remove();}); + assert_equals(invoker.popoverTargetElement,popover,'target element should be returned once it\'s in the document'); + assert_false(popover.matches(':popover-open')); + await testcase.invokeFn(invoker); + assert_equals(document.activeElement,invoker,'Focus should end up on the invoker'); + expectedBehavior = testcase.getExpectedLogic(action); + switch (expectedBehavior) { + case "toggle": + case "show": + assert_true(popover.matches(':popover-open'),'Toggle or show should show the popover'); + popover.hidePopover(); // Hide the popover + break; + case "hide": + case "none": + assert_false(popover.matches(':popover-open'),'Hide or none should leave the popover hidden'); + break; + default: + assert_unreached(); + } + if (expectedBehavior === "none") { + // If no behavior is expected, then there is nothing left to test. Even re-focusing + // a control that has no expected behavior may hide an open popover via light dismiss. + return; + } + assert_false(popover.matches(':popover-open')); + popover.showPopover(); // Show the popover directly + assert_equals(document.activeElement,invoker,'The popover should not shift focus'); + assert_true(popover.matches(':popover-open')); + await testcase.invokeFn(invoker); + switch (expectedBehavior) { + case "toggle": + case "hide": + assert_false(popover.matches(':popover-open'),'Toggle or hide should hide the popover'); + break; + case "show": + assert_true(popover.matches(':popover-open'),'Show should leave the popover showing'); + break; + default: + assert_unreached(); + } + },`Test ${testcase.name}, action=${action}, ${use_idl_for_target ? "popoverTarget IDL" : "popovertarget attr"}, ${use_idl_for_action ? "popoverTargetAction IDL" : "popovertargetaction attr"}, with popover=${type}`); + }); + }); + }); + }); + }); + }); +} diff --git a/tests/wpt/tests/https-upgrades/resources/pass-with-referrer.html b/tests/wpt/tests/https-upgrades/resources/pass-with-referrer.html new file mode 100644 index 00000000000..be978c16dc8 --- /dev/null +++ b/tests/wpt/tests/https-upgrades/resources/pass-with-referrer.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> + <body> + <script> + window.onload = (event) => { + window.opener.postMessage({ + 'pass': true, + 'referrer': document.referrer}, + '*'); + }; + </script> + </body> +</html> diff --git a/tests/wpt/tests/https-upgrades/tentative/referrer.https.sub.html b/tests/wpt/tests/https-upgrades/tentative/referrer.https.sub.html new file mode 100644 index 00000000000..3cd83ba561c --- /dev/null +++ b/tests/wpt/tests/https-upgrades/tentative/referrer.https.sub.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + <head> + <title>HTTPS Upgrades: Upgrade.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/get-host-info.sub.js"></script> + + <meta name="referrer" content="no-referrer-when-downgrade" /> + + </head> + <body> + <script> + setup({ single_test: true }); + // When the referrer policy is no-referrer-when-downgrade, HTTPS upgrades should not drop + // the referrer upon navigating to an HTTP URL if the upgrade is successful. + + // HTTPS upgrades don't change custom ports, so this will load correctly if an HTTPS upgrade is performed, + // and will fail to load otherwise (since the port will be wrong for http). + var url = new URL("http://{{host}}:{{ports[https][0]}}/https-upgrades/resources/pass-with-referrer.html") + window.onmessage = function(event) { + if (event.data['pass'] && event.data['referrer'] == document.location.href) { + done(); + } + } + win = window.open(url) + </script> + </body> +</html> diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/actions/mouseClickCount.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/actions/mouseClickCount.html.ini index cc35c1c8761..063a712424f 100644 --- a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/actions/mouseClickCount.html.ini +++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/actions/mouseClickCount.html.ini @@ -1,5 +1,5 @@ [mouseClickCount.html] [TestDriver actions: test the mouse click counts at different cases] expected: - if (product == "firefox") or (product == "safari"): FAIL + if product == "safari": FAIL if product == "firefox_android": FAIL diff --git a/tests/wpt/tests/intersection-observer/fixed-position-child-scroll.html b/tests/wpt/tests/intersection-observer/fixed-position-child-scroll.html new file mode 100644 index 00000000000..93602090463 --- /dev/null +++ b/tests/wpt/tests/intersection-observer/fixed-position-child-scroll.html @@ -0,0 +1,39 @@ +<!doctype html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/intersection-observer-test-utils.js"></script> +<div style="position: fixed; top: 0; left: 0"> + <div id="target" style="width: 100px; height: 100px"></div> +</div> +<div id="log" style="height: 2000px"></div> +<script> +var entries = []; + +runTestCycle(function() { + var observer = new IntersectionObserver(function(changes) { + entries = entries.concat(changes) + }); + observer.observe(target); + entries = entries.concat(observer.takeRecords()); + assert_equals(entries.length, 0, 'No initial notifications.'); + runTestCycle(step0, 'First rAF.'); +}, 'Fixed-position intersection observer on scroll'); + +function step0() { + window.scrollTo(0, 1000); + runTestCycle(step1, 'scrollTo(0, 1000)'); + checkLastEntry(entries, 0, + [0, 100, 0, 100, 0, 100, 0, 100, 0, + document.documentElement.clientWidth, 0, document.documentElement.clientHeight, + true]); +} + +function step1() { + window.scrollTo(0, 0); + checkLastEntry(entries, 0, + [0, 100, 0, 100, 0, 100, 0, 100, 0, + document.documentElement.clientWidth, 0, document.documentElement.clientHeight, + true]); +} +</script> diff --git a/tests/wpt/tests/intersection-observer/fixed-position-iframe-scroll.html b/tests/wpt/tests/intersection-observer/fixed-position-iframe-scroll.html new file mode 100644 index 00000000000..7d90331fd0b --- /dev/null +++ b/tests/wpt/tests/intersection-observer/fixed-position-iframe-scroll.html @@ -0,0 +1,44 @@ +<!doctype html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/intersection-observer-test-utils.js"></script> +<div style="position: fixed; top: 0; left: 0"> + <iframe id="iframe" style="width: 300px; height: 300px; border: none" + srcdoc="<style>body {margin: 0}</style> + <div id='target' style='width: 100px; height: 100px'></div>"> + </iframe> +</div> +<div id="log" style="height: 2000px"></div> +<script> +var entries = []; + +iframe.onload = () => { + runTestCycle(function() { + var observer = new IntersectionObserver(function(changes) { + entries = entries.concat(changes) + }); + observer.observe(iframe.contentDocument.getElementById('target')); + entries = entries.concat(observer.takeRecords()); + assert_equals(entries.length, 0, 'No initial notifications.'); + runTestCycle(step0, 'First rAF.'); + }, 'Fixed-position intersection observer on scroll'); +}; + +function step0() { + window.scrollTo(0, 1000); + runTestCycle(step1, 'scrollTo(0, 1000)'); + checkLastEntry(entries, 0, + [0, 100, 0, 100, 0, 100, 0, 100, 0, + document.documentElement.clientWidth, 0, document.documentElement.clientHeight, + true]); +} + +function step1() { + window.scrollTo(0, 0); + checkLastEntry(entries, 0, + [0, 100, 0, 100, 0, 100, 0, 100, 0, + document.documentElement.clientWidth, 0, document.documentElement.clientHeight, + true]); +} +</script> diff --git a/tests/wpt/tests/intersection-observer/fixed-position-scroll.html b/tests/wpt/tests/intersection-observer/fixed-position-scroll.html new file mode 100644 index 00000000000..3dc02a8b0d3 --- /dev/null +++ b/tests/wpt/tests/intersection-observer/fixed-position-scroll.html @@ -0,0 +1,37 @@ +<!doctype html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/intersection-observer-test-utils.js"></script> +<div id="target" style="width: 100px; height: 100px; position: fixed; top: 0; left: 0"></div> +<div id="log" style="height: 2000px"></div> +<script> +var entries = []; + +runTestCycle(function() { + var observer = new IntersectionObserver(function(changes) { + entries = entries.concat(changes) + }); + observer.observe(target); + entries = entries.concat(observer.takeRecords()); + assert_equals(entries.length, 0, 'No initial notifications.'); + runTestCycle(step0, 'First rAF.'); +}, 'Fixed-position intersection observer on scroll'); + +function step0() { + window.scrollTo(0, 1000); + runTestCycle(step1, 'scrollTo(0, 1000)'); + checkLastEntry(entries, 0, + [0, 100, 0, 100, 0, 100, 0, 100, 0, + document.documentElement.clientWidth, 0, document.documentElement.clientHeight, + true]); +} + +function step1() { + window.scrollTo(0, 0); + checkLastEntry(entries, 0, + [0, 100, 0, 100, 0, 100, 0, 100, 0, + document.documentElement.clientWidth, 0, document.documentElement.clientHeight, + true]); +} +</script> diff --git a/tests/wpt/tests/lint.ignore b/tests/wpt/tests/lint.ignore index a39705ddf86..c82f8027f69 100644 --- a/tests/wpt/tests/lint.ignore +++ b/tests/wpt/tests/lint.ignore @@ -520,6 +520,7 @@ SET TIMEOUT: css/CSS2/tables/tables-102.xht SET TIMEOUT: css/mediaqueries/min-width-tables-001.html SET TIMEOUT: css/css-text/crashtests/rendering-rtl-bidi-override-crash.html SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint-parent.html +SET TIMEOUT: svg/painting/color-mix-currentcolor-fill-stroke-repaint.html SET TIMEOUT: svg/painting/currentcolor-fill-stroke-repaint.html SET TIMEOUT: resource-timing/resources/run-async-tasks-promise.js diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-desired-exec-time.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-desired-exec-time.html deleted file mode 100644 index 656c58d0c24..00000000000 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-desired-exec-time.html +++ /dev/null @@ -1,121 +0,0 @@ -<!DOCTYPE HTML> -<meta charset=utf-8> -<title>Long Animation Frame Timing: queue time</title> -<meta name="timeout" content="long"> -<script src=/resources/testdriver.js></script> -<script src=/resources/testdriver-actions.js></script> -<script src=/resources/testdriver-vendor.js></script> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="resources/utils.js"></script> - -<body> -<h1>Long Animation Frame: queue time</h1> -<div id="log"></div> -<script> - -const INTERNAL_OVERHEAD_DELAY_EPSILON = 5; - -promise_test(async t => { - const button = document.createElement("button"); - button.innerText = "Click"; - document.body.appendChild(button); - t.add_cleanup(() => button.remove()); - const eventPromise = new Promise(resolve => button.addEventListener("click", event => { - busy_wait(); - resolve(event); - })); - const entryPromise = new Promise(resolve => new PerformanceObserver( - (entryList, observer) => { - const scriptPredicate = s => s.name === "BUTTON.onclick"; - const entry = entryList.getEntries().find( - e => e.scripts.length && e.scripts.find(scriptPredicate)); - if (entry) { - resolve([entry, entry.scripts.find(scriptPredicate)]); - observer.disconnect(); - } - }).observe({entryTypes: ["long-animation-frame"]})); - test_driver.click(button); - await new Promise(resolve => t.step_timeout(resolve, 0)); - const event = await eventPromise; - const [entry, script] = await entryPromise; - assert_equals(script.desiredExecutionStart, event.timeStamp); -}, "event-listener entries desiredExecutionStart is the eventTimestamp"); - -promise_test(async t => { - const entryPromise = loaf_promise(t); - let timeBeforeSetup, timeAfterSetup; - const delay = 100; - const timeoutPromise = new Promise(resolve => { - timeBeforeSetup = performance.now(); - t.step_timeout(() => { - busy_wait(); - resolve(); - }, delay); - timeAfterSetup = performance.now(); - }); - const entry = await entryPromise; - const script = entry.scripts.find(s => s.name === "TimerHandler:setTimeout"); - assert_greater_than_equal(script.desiredExecutionStart, timeBeforeSetup + delay - INTERNAL_OVERHEAD_DELAY_EPSILON); - assert_less_than_equal(script.desiredExecutionStart, timeAfterSetup + delay + INTERNAL_OVERHEAD_DELAY_EPSILON); -}, "desiredExecutionStart for setTimeout should be the setup time + delay"); - -promise_test(async t => { - const entryPromise = loaf_promise(t); - let timeBeforeSetup, timeAfterSetup; - const timeoutPromise = new Promise(resolve => { - timeBeforeSetup = performance.now(); - scheduler.postTask(t.step_func(() => { - busy_wait(); - resolve(); - })); - timeAfterSetup = performance.now(); - }); - const entry = await entryPromise; - const script = entry.scripts.find(s => s.name === "SchedulerPostTaskCallback"); - assert_greater_than_equal(script.desiredExecutionStart, timeBeforeSetup - INTERNAL_OVERHEAD_DELAY_EPSILON); - assert_less_than_equal(script.desiredExecutionStart, timeAfterSetup + INTERNAL_OVERHEAD_DELAY_EPSILON); -}, "desiredExecutionStart for Scheduler.postTask should be the time it was called"); - -promise_test(async t => { - const entryPromise = loaf_promise(t); - const rafPromise = new Promise(resolve => { - // We fire two rAFs to ensure both of them receive the same - // desiredExecutionStart - requestAnimationFrame(rafTime => { - busy_wait(); - }) - requestAnimationFrame(rafTime => { - busy_wait(); - resolve(rafTime); - }) - }); - const entry = await entryPromise; - const rafTime = await rafPromise; - const scripts = entry.scripts.filter( - s => s.name === "FrameRequestCallback"); - for (const script of scripts) { - assert_approx_equals(script.desiredExecutionStart, rafTime, INTERNAL_OVERHEAD_DELAY_EPSILON); - } - assert_approx_equals(entry.desiredRenderStart, rafTime, INTERNAL_OVERHEAD_DELAY_EPSILON); -}, "desiredExecutionStart & desiredRenderStart for requestAnimationFrame " + - "should be the same as the rAF argument"); - -promise_test(async t => { - const entryPromise = loaf_promise(t); - const timeBeforeWait = performance.now(); - let timeAfterWait; - const rafPromise = new Promise(resolve => t.step_timeout(() => { - requestAnimationFrame(rafTime => { - busy_wait(very_long_frame_duration / 2); - resolve(rafTime); - }); - - busy_wait(very_long_frame_duration / 2); - timeAfterWait = performance.now(); - }), 0); - const [entry, rafTime] = await Promise.all([entryPromise, rafPromise]); - assert_approx_equals(entry.desiredRenderStart, rafTime, INTERNAL_OVERHEAD_DELAY_EPSILON); -}, "desiredRenderStart and renderStart should reflect main thread delays"); -</script> -</body> diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-first-ui-event.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-first-ui-event.html index 857ccd0a182..807c9cfe017 100644 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-first-ui-event.html +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-first-ui-event.html @@ -77,25 +77,5 @@ promise_test(async t => { const [event, [entry]] = await Promise.all([eventPromise, entryPromise]); assert_equals(entry.firstUIEventTimestamp, firstUIEventTimestamp); }, "firstUIEventTimestamp doesn't have to come from a long script"); - - -promise_test(async t => { - const entryPromise = expect_long_frame_with_script(() => { - const img = document.createElement("img"); - img.src = "/images/green.png"; - const promise = new Promise(resolve => - img.addEventListener("load", event => { - busy_wait(); - resolve(); - })); - document.body.appendChild(img); - t.add_cleanup(() => img.remove()); - return promise; - }, s => s.name === "IMG[src=/images/green.png].onload", t); - - const [entry, script] = await entryPromise; - assert_not_equals(entry.firstUIEventTimestamp, script.desiredExecutionStart); -}, "Non-UI events don't affect firstUIEventTimestamp"); - </script> </body> diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-crossorigin.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-crossorigin.html new file mode 100644 index 00000000000..16ecfd70176 --- /dev/null +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-crossorigin.html @@ -0,0 +1,27 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Long Animation Frame Timing: iframes (cross-origin)</title> +<meta name="timeout" content="long"> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<div id="log"></div> +<script> +const host_info = get_host_info(); + +for (const type of ["REMOTE_ORIGIN", "HTTP_NOTSAMESITE_ORIGIN"]) { + promise_test(async t => { + const [executor] = await prepare_exec_iframe(t, host_info[type]); + await expect_no_long_frame(() => executor.execute_script((duration) => { + const deadline = performance.now() + duration; + while (performance.now() < deadline) {} + }, [very_long_frame_duration]), t); + }, `A long busy wait in a ${type} iframe is not a long animation frame`); +} + +</script> +</body> diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-same-origin.html index 2885d4fbae9..65dc89f29ab 100644 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe.html +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-same-origin.html @@ -1,6 +1,6 @@ <!DOCTYPE HTML> <meta charset=utf-8> -<title>Long Animation Frame Timing: iframes</title> +<title>Long Animation Frame Timing: iframes (same-origin)</title> <meta name="timeout" content="long"> <body> <script src="/resources/testharness.js"></script> @@ -23,14 +23,6 @@ promise_test(async t => { }, 'A long busy wait without render in a same-origin iframe is not a long animation frame'); promise_test(async t => { - const [executor] = await prepare_exec_iframe(t, HTTP_NOTSAMESITE_ORIGIN); - await expect_no_long_frame(() => executor.execute_script((duration) => { - const deadline = performance.now() + duration; - while (performance.now() < deadline) {} - }, [very_long_frame_duration]), t); -}, 'A long busy wait in a cross-origin iframe is not a long animation frame'); - -promise_test(async t => { const [executor] = await prepare_exec_iframe(t, ORIGIN); await expect_long_frame(() => executor.execute_script(async (duration) => { await new Promise(resolve => window.requestAnimationFrame(resolve)); @@ -39,19 +31,5 @@ promise_test(async t => { }, [very_long_frame_duration]), t); }, 'A long busy wait in a same-origin requestAnimationFrame is a long animation frame'); -for (const origin of ["ORIGIN", "REMOTE_ORIGIN", "HTTP_NOTSAMESITE_ORIGIN"]) { - promise_test(async t => { - const [executor] = await prepare_exec_iframe(t, host_info[origin]); - const entry = await executor.execute_script(async (duration) => { - const entryPromise = new Promise(resolve => new PerformanceObserver(list => { - resolve(list.getEntries(0)); - }).observe({entryTypes: ["long-animation-frame"]})); - const deadline = performance.now() + duration; - while (performance.now() < deadline) {} - return entryPromise; - }, [very_long_frame_duration]); - }, `frames receive own long animation frames (${origin})`); -} - </script> </body> diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-self.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-self.html new file mode 100644 index 00000000000..7511ff1072a --- /dev/null +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-iframe-self.html @@ -0,0 +1,31 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Long Animation Frame Timing: iframes (self)</title> +<meta name="timeout" content="long"> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<div id="log"></div> +<script> +const host_info = get_host_info(); + +for (const origin of ["ORIGIN", "REMOTE_ORIGIN", "HTTP_NOTSAMESITE_ORIGIN"]) { + promise_test(async t => { + const [executor] = await prepare_exec_iframe(t, host_info[origin]); + const entry = await executor.execute_script(async (duration) => { + const entryPromise = new Promise(resolve => new PerformanceObserver(list => { + resolve(list.getEntries(0)); + }).observe({entryTypes: ["long-animation-frame"]})); + const deadline = performance.now() + duration; + while (performance.now() < deadline) {} + return entryPromise; + }, [very_long_frame_duration]); + }, `frames receive own long animation frames (${origin})`); +} + +</script> +</body> diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-source-location-redirect.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-source-location-redirect.html index 013742354c1..ba2478e6224 100644 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-source-location-redirect.html +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-source-location-redirect.html @@ -56,6 +56,8 @@ function test_source_location_with_redirect({path, type, name}) { "empty" : "other"; assert_not_equals(result, "other", `Unexpected source location ${script.sourceLocation}`); + if (!cors) + assert_equals(script.executionStart, script.startTime, "Opaque scripts should hide execution start time"); if (cors) { assert_not_equals(result, "empty", "CORS-ok scripts should expose sourceLocation"); diff --git a/tests/wpt/tests/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html b/tests/wpt/tests/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html index 78d1692104d..baff6fe542b 100644 --- a/tests/wpt/tests/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html +++ b/tests/wpt/tests/navigation-api/scroll-behavior/after-transition-intercept-handler-modifies.html @@ -26,6 +26,10 @@ promise_test(async t => { } ); await navigation.navigate("?go").finished; + // Ensure the layout changes and scroll position update from the first + // navigation are processed before navigating back, otherwise the restored + // scroll postion can be overwritten. + await new Promise(resolve => requestAnimationFrame(resolve)); await navigation.back().finished; assert_equals(window.scrollY, 100); }, "scroll: state should be saved before intercept handlers run"); diff --git a/tests/wpt/tests/performance-timeline/tentative/performance-entry-source-deleted-frame.html b/tests/wpt/tests/performance-timeline/tentative/performance-entry-source-deleted-frame.html deleted file mode 100644 index 81970606707..00000000000 --- a/tests/wpt/tests/performance-timeline/tentative/performance-entry-source-deleted-frame.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> - -<head> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> - -<body> -</body> -<script> - promise_test(async () => { - // Create child iframe. - const childFrame = document.createElement('iframe'); - childFrame.src = '../resources/child-frame.html'; - - let childEntry; - // Load child frame. - const loadChildFramePromise = new Promise(resolve => { - childFrame.addEventListener('load', () => { - childEntry = performance.getEntries( - { name: 'mark_child_frame', includeChildFrames: true })[0]; - - // Child PerformanceMark source should be the child window. - assert_equals(childEntry.source, childFrame.contentWindow); - - resolve(); - }); - }); - document.body.appendChild(childFrame); - await loadChildFramePromise; - - // Remove child frame; - childFrame.parentNode.removeChild(childFrame); - - // Child PerformanceMark source should be null after the child frame is - // removed. - assert_equals(childEntry.source, null); - }, 'PerformanceEntry source is null when the window it points to is removed.') -</script>
\ No newline at end of file diff --git a/tests/wpt/tests/permissions-policy/resources/permissions-policy-screen-wakelock.html b/tests/wpt/tests/permissions-policy/resources/permissions-policy-screen-wakelock.html index b1866322518..5c2562946b7 100644 --- a/tests/wpt/tests/permissions-policy/resources/permissions-policy-screen-wakelock.html +++ b/tests/wpt/tests/permissions-policy/resources/permissions-policy-screen-wakelock.html @@ -4,15 +4,19 @@ "use strict"; Promise.resolve().then(async () => { - try { - await test_driver.set_permission( - { name: 'screen-wake-lock' }, 'granted'); + test_driver.set_test_context(window.parent); + await test_driver.set_permission({ name: 'screen-wake-lock' }, 'granted'); + try { const wakeLock = await navigator.wakeLock.request("screen"); - await wakeLock.release(); window.parent.postMessage({ type: 'availability-result', enabled: true }, "*"); + await wakeLock.release(); } catch (e) { - window.parent.postMessage({ type: 'availability-result', enabled: false }, "*"); + if (e instanceof DOMException && e.name === "NotAllowedError") { + window.parent.postMessage({ type: 'availability-result', enabled: false }, "*"); + } else { + throw e; + } } }); </script> diff --git a/tests/wpt/tests/png/apng/apng-blue-rect-checkerboard-ref.html b/tests/wpt/tests/png/apng/apng-blue-rect-checkerboard-ref.html index 0c997d350a1..3058aa633f4 100644 --- a/tests/wpt/tests/png/apng/apng-blue-rect-checkerboard-ref.html +++ b/tests/wpt/tests/png/apng/apng-blue-rect-checkerboard-ref.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html class="reftest-wait"> +<html> <meta charset="utf-8"> <title>PNG Third Edition: animated PNG, dispose ops and regions</title> <link rel="author" title="Chris Lilley" href="mailto:chris@w3.org"> diff --git a/tests/wpt/tests/screen-wake-lock/wakelock-disabled-by-permissions-policy.https.html b/tests/wpt/tests/screen-wake-lock/wakelock-disabled-by-permissions-policy.https.html index fe4147b46cd..354b0a5e154 100644 --- a/tests/wpt/tests/screen-wake-lock/wakelock-disabled-by-permissions-policy.https.html +++ b/tests/wpt/tests/screen-wake-lock/wakelock-disabled-by-permissions-policy.https.html @@ -2,6 +2,8 @@ <body> <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="/permissions-policy/resources/permissions-policy.js"></script> <script src="/common/get-host-info.sub.js"></script> <script> diff --git a/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute-redirect-on-load.https.html b/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute-redirect-on-load.https.html index acfce43f962..8898a571e8f 100644 --- a/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute-redirect-on-load.https.html +++ b/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute-redirect-on-load.https.html @@ -2,6 +2,8 @@ <body> <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="/permissions-policy/resources/permissions-policy.js"></script> <script src="/common/get-host-info.sub.js"></script> <script> diff --git a/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute.https.html b/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute.https.html index c2be3a45080..ea3ebf2449b 100644 --- a/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute.https.html +++ b/tests/wpt/tests/screen-wake-lock/wakelock-enabled-by-permissions-policy-attribute.https.html @@ -2,6 +2,8 @@ <body> <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="/permissions-policy/resources/permissions-policy.js"></script> <script src="/common/get-host-info.sub.js"></script> <script> diff --git a/tests/wpt/tests/screen-wake-lock/wakelock-onrelease.https.html b/tests/wpt/tests/screen-wake-lock/wakelock-onrelease.https.html index fb071b3763d..896748411be 100644 --- a/tests/wpt/tests/screen-wake-lock/wakelock-onrelease.https.html +++ b/tests/wpt/tests/screen-wake-lock/wakelock-onrelease.https.html @@ -35,5 +35,20 @@ promise_test(async t => { assert_true(releaseFired, "The 'release' event fires immediately after release() is called"); return releasePromise; -}, "Ensure onreleased is called before WakeLockSentinel.release() resolves"); +}, "Ensure onrelease is called before WakeLockSentinel.release() resolves"); + +promise_test(async t => { + await test_driver.set_permission({ name: 'screen-wake-lock' }, 'granted'); + + const lock = await navigator.wakeLock.request("screen"); + + let eventCount = 0; + lock.onrelease = t.step_func(() => { + eventCount++; + }); + + await lock.release(); + await lock.release(); + assert_equals(eventCount, 1, "The 'release' event was fired once"); +}, "Ensure onrelease is fired exactly once"); </script> diff --git a/tests/wpt/tests/scroll-to-text-fragment/force-load-at-top.html b/tests/wpt/tests/scroll-to-text-fragment/force-load-at-top.html index 1399de3d624..fe3913dfac4 100644 --- a/tests/wpt/tests/scroll-to-text-fragment/force-load-at-top.html +++ b/tests/wpt/tests/scroll-to-text-fragment/force-load-at-top.html @@ -1,6 +1,7 @@ <!doctype html> <title>ForceLoadAtTop blocks scroll on load</title> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel="help" href="https://wicg.github.io/ScrollToTextFragment/"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/tests/scroll-to-text-fragment/percent-encoding.html b/tests/wpt/tests/scroll-to-text-fragment/percent-encoding.html index 696734b663d..1f1794bdae0 100644 --- a/tests/wpt/tests/scroll-to-text-fragment/percent-encoding.html +++ b/tests/wpt/tests/scroll-to-text-fragment/percent-encoding.html @@ -6,8 +6,6 @@ <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 src="resources/util.js"></script> <style> .target { @@ -16,86 +14,69 @@ } </style> <script> -const params = new URLSearchParams(location.search); -const is_popup = params.has('key'); -// This test opens a popup to this document which invokes a text directive. The -// popup checks the result of navigating the text directive and communicates it -// back to the original page via Stash (since text fragments require noopener). -if (is_popup) { - const key = params.get('key'); +function determineResult() { + if (window.scrollY == 0) + return 'noscroll'; - function sendResult() { - let result = 'unknown'; - if (window.scrollY == 0) - result = 'noscroll'; - else { - for (let target of document.querySelectorAll('.target')) { - if (isInViewport(target)) { - result = target.id; - break; - } - } + for (let target of document.querySelectorAll('.target')) { + if (isInViewport(target)) { + return target.id; } - - stashResultsThenClose(key, result); } + return 'UNEXPECTED'; +} - // Ensure two animation frames on load to test the fallback to element anchor, - // which gets queued for the next frame if the text fragment is not found. - onload = () => { requestAnimationFrame( () => requestAnimationFrame(sendResult) ); }; -} else { - let test_cases = [ - { - fragment: '#:~:text=%25', - expect: 'singlepercent', - description: 'Percent-encoded "%" char.' - }, - { - fragment: '#:~:text=%', - expect: 'noscroll', - description: 'Percent char without hex digits is invalid.' - }, - { - fragment: '#:~:text=%%', - expect: 'noscroll', - description: 'Percent char followed by percent char is invalid.' - }, - { - fragment: '#:~:text=%F', - expect: 'noscroll', - description: 'Single digit percent-encoding is invalid.' - }, - { - fragment: '#:~:text=%25F', - expect: 'percentf', - description: 'Percent-encoding limited to two digits.' - }, - { - fragment: '#:~:text=%25%25F', - expect: 'doublepercentf', - description: 'Percent-encoded "%%F"' - }, - { - fragment: '#:~:text=%E2%9C%85', - expect: 'checkmark', - description: 'Percent-encoding multibyte codepoint (CHECKMARK).' - }, - ]; - - for (const test_case of test_cases) { - promise_test(t => new Promise((resolve, reject) => { - let key = token(); +let test_cases = [ + { + fragment: '#:~:text=%25', + expect: 'singlepercent', + description: 'Percent-encoded "%" char.' + }, + { + fragment: '#:~:text=%', + expect: 'noscroll', + description: 'Percent char without hex digits is invalid.' + }, + { + fragment: '#:~:text=%%', + expect: 'noscroll', + description: 'Percent char followed by percent char is invalid.' + }, + { + fragment: '#:~:text=%F', + expect: 'noscroll', + description: 'Single digit percent-encoding is invalid.' + }, + { + fragment: '#:~:text=%25F', + expect: 'percentf', + description: 'Percent-encoding limited to two digits.' + }, + { + fragment: '#:~:text=%25%25F', + expect: 'doublepercentf', + description: 'Percent-encoded "%%F"' + }, + { + fragment: '#:~:text=%E2%9C%85', + expect: 'checkmark', + description: 'Percent-encoding multibyte codepoint (CHECKMARK).' + }, +]; - test_driver.bless('Open a URL with a text fragment directive', () => { - window.open(`${location.href}?key=${key}${test_case.fragment}`, '_blank', 'noopener'); - }); +for (const test_case of test_cases) { + promise_test(t => new Promise(resolve => { + // Clear the fragment and reset the scroll offset to prepare for the next + // test case. + location = `${location.pathname}#`; + scrollTo(0, 0); - fetchResults(key, resolve, reject); - }).then(result => { - assert_equals(result, test_case.expect); - }), `Test navigation with fragment: ${test_case.description}.`); - } + location = `${location.pathname}${test_case.fragment}`; + requestAnimationFrame( () => requestAnimationFrame(resolve) ); + }).then(() => { + assert_equals(determineResult(), test_case.expect); + }), `Test navigation with fragment: ${test_case.description}.`); } </script> diff --git a/tests/wpt/tests/scroll-to-text-fragment/redirects.html b/tests/wpt/tests/scroll-to-text-fragment/redirects.html index 5ad910affe5..71bc1be02e6 100644 --- a/tests/wpt/tests/scroll-to-text-fragment/redirects.html +++ b/tests/wpt/tests/scroll-to-text-fragment/redirects.html @@ -1,6 +1,7 @@ <!doctype html> <title>TextFragment invoked on redirects</title> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel="help" href="https://wicg.github.io/ScrollToTextFragment/"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js index 67871a2d4fd..f8fe4032986 100644 --- a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js +++ b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js @@ -12,6 +12,18 @@ const routerRules = { 'condition-urlpattern-string-source-network': [ {condition: {urlPattern: '/**/direct.txt'}, source: 'network'}, ], + 'condition-urlpattern-constructed-ignore-case-source-network': [{ + condition: { + urlPattern: new URLPattern( + {pathname: '/**/DiReCT.TxT'}, + {ignoreCase: true}) + }, + source: 'network' + }], + 'condition-urlpattern-constructed-respect-case-source-network': [{ + condition: {urlPattern: new URLPattern({pathname: '/**/DiReCT.TxT'})}, + source: 'network' + }], 'condition-request-source-network': [{condition: {requestMode: 'no-cors'}, source: 'network'}], 'condition-or-source-network': [{ diff --git a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html index 523ececf317..1673b97ca7b 100644 --- a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html +++ b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html @@ -11,6 +11,10 @@ <script> const SCRIPT = 'resources/static-router-sw.js'; const ROUTER_RULE_KEY = 'condition-urlpattern-constructed-source-network'; +const ROUTER_RULE_KEY_IGNORE_CASE = + 'condition-urlpattern-constructed-ignore-case-source-network'; +const ROUTER_RULE_KEY_RESPECT_CASE = + 'condition-urlpattern-constructed-respect-case-source-network'; const SCOPE = 'resources/'; const REGISTERED_ROUTE = 'resources/direct.txt'; const NON_REGISTERED_ROUTE = 'resources/simple.html'; @@ -48,6 +52,19 @@ iframeTest(REGISTERED_ROUTE, ROUTER_RULE_KEY, async (t, iwin, worker) => { assert_equals(iwin.document.body.innerText, "Network\n"); }, 'Main resource load matched with the condition'); +iframeTest(REGISTERED_ROUTE, ROUTER_RULE_KEY_IGNORE_CASE, async (t, iwin, worker) => { + const fetched_urls = await get_fetched_urls(worker); + const {requests} = fetched_urls.data; + assert_equals(requests.length, 0); + assert_equals(iwin.document.body.innerText, "Network\n"); +}, 'Main resource load matched with the ignore case condition'); + +iframeTest(REGISTERED_ROUTE, ROUTER_RULE_KEY_RESPECT_CASE, async (t, iwin, worker) => { + const fetched_urls = await get_fetched_urls(worker); + const {requests} = fetched_urls.data; + assert_equals(requests.length, 1); +}, 'Main resource load matched without the ignore case condition'); + iframeTest(NON_REGISTERED_ROUTE, ROUTER_RULE_KEY, async (t, iwin, worker) => { const fetched_urls = await get_fetched_urls(worker); const {requests} = fetched_urls.data; diff --git a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-subresource.https.html b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-subresource.https.html index 1fd3880bf26..6154c38f2d7 100644 --- a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-subresource.https.html +++ b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-subresource.https.html @@ -10,6 +10,10 @@ const SCRIPT = 'resources/static-router-sw.js'; const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED = 'condition-urlpattern-constructed-source-network'; +const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_IGNORE_CASE = + 'condition-urlpattern-constructed-ignore-case-source-network'; +const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_RESPECT_CASE = + 'condition-urlpattern-constructed-respect-case-source-network'; const ROUTER_RULE_KEY_URL_PATTERN_URLPATTERNINIT = 'condition-urlpattern-urlpatterninit-source-network'; const ROUTER_RULE_KEY_URL_PATTERN_STRING = @@ -89,6 +93,18 @@ iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED, async (t, iwin, wo assert_equals(response.type, 'opaque'); }, 'Subresource cross origin load matched with URLPattern condition via constructed object'); +iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_IGNORE_CASE, async (t, iwin) => { + const rnd = randomString(); + const response = await iwin.fetch('?nonce=' + rnd); + assert_equals(await response.text(), "Network\n"); +}, 'Subresource load matched with ignoreCase URLPattern condition'); + +iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_RESPECT_CASE, async (t, iwin) => { + const rnd = randomString(); + const response = await iwin.fetch('?nonce=' + rnd); + assert_equals(await response.text(), rnd); +}, 'Subresource load matched without ignoreCase URLPattern condition'); + iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_URLPATTERNINIT, async (t, iwin) => { const rnd = randomString(); const response = await iwin.fetch('?nonce=' + rnd); diff --git a/tests/wpt/tests/shadow-dom/declarative/clonable.window.js b/tests/wpt/tests/shadow-dom/declarative/clonable.window.js new file mode 100644 index 00000000000..5ebeacf37cb --- /dev/null +++ b/tests/wpt/tests/shadow-dom/declarative/clonable.window.js @@ -0,0 +1,10 @@ +test(() => { + const div = document.createElement("div"); + const root = div.attachShadow({ mode: "open", clonable: true }); + root.appendChild(document.createElement("input")); + assert_true(root.clonable, "clonable attribute"); + + const cloned = div.cloneNode(true); + assert_equals(cloned.shadowRoot.children.length, 1, "children count"); + assert_equals(cloned.shadowRoot.children[0].localName, "input", "children content"); +}, "attachShadow with clonable: true"); diff --git a/tests/wpt/tests/shared-storage/resources/register-service-worker-iframe.https.html b/tests/wpt/tests/shared-storage/resources/register-service-worker-iframe.https.html new file mode 100644 index 00000000000..547ab1d93d9 --- /dev/null +++ b/tests/wpt/tests/shared-storage/resources/register-service-worker-iframe.https.html @@ -0,0 +1,66 @@ +<!doctype html> +<body> + <script src=/resources/testharness.js></script> + <script src=/common/utils.js></script> + <script src=/fenced-frame/resources/utils.js></script> + <script src=/shared-storage/resources/util.js></script> + <script src=/shared-storage/resources/util.sub.js></script> + <script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> + <script> + const INTERMEDIATE_FRAME_SUFFIX = + 'able-fetch-request-fallback-to-network-iframe.https.html' + const ORIGIN = new URL("", location.href).origin; + + window.addEventListener('message', async function handler(event) { + const data = event.data; + if (data.script && data.scope && data.port) { + var absoluteScope = (new URL(data.scope, window.location).href); + let oldReg =await navigator.serviceWorker.getRegistration(data.scope); + if (oldReg && oldReg.scope === absoluteScope) { + await oldReg.unregister(); + } + let reg = await navigator.serviceWorker.register(data.script, + { scope: data.scope }); + let worker = reg.installing; + await new Promise(function(resolve) { + worker.addEventListener('statechange', function() { + if (worker.state == 'activated') { + resolve(); + } + }); + }); + assert_not_equals(worker, null, 'worker is installing'); + + let result = await loadNestedSharedStorageFrameInNewFrame({ + key: 'c', value: 'd', + hasSharedStorageWritableAttribute: true, + // Same-origin to this frame, cross-origin to top. + isSameOrigin: true, + }); + const urls = [ + { + "url": ORIGIN + data.scope + INTERMEDIATE_FRAME_SUFFIX, + "mode": "navigate", + "SSWHeader": "null" + }, + { + "url": ORIGIN + "/resources/testharness.js", + "mode": "no-cors", + "SSWHeader": "null" + }, + { + "url": ORIGIN + result.nestedFrameUrl, + "mode": "navigate", + "SSWHeader": "null" + }, + ]; + await checkInterceptedUrls(worker, urls); + await verifyKeyValueForOrigin('c', 'd', ORIGIN); + await deleteKeyForOrigin('c', ORIGIN); + data.port.postMessage({msg: 'test completed'}); + reg.unregister() + window.removeEventListener('message', handler); + } + }); + </script> +</body> diff --git a/tests/wpt/tests/shared-storage/resources/shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html b/tests/wpt/tests/shared-storage/resources/shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html index 8229ce88d82..3451d91477d 100644 --- a/tests/wpt/tests/shared-storage/resources/shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html +++ b/tests/wpt/tests/shared-storage/resources/shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html @@ -18,5 +18,39 @@ img.src = url; }); } + + function loadFrame(url, hasSharedStorageWritableAttribute) { + return new Promise(function(resolve, reject) { + var frame = document.createElement('iframe'); + document.body.appendChild(frame); + frame.onload = function() { + window.parent.postMessage({msg: 'iframe loaded'}, "*"); + resolve(frame); + }; + frame.onerror = function() { + reject(new Error('Nested iframe load failed')); + }; + if (hasSharedStorageWritableAttribute) { + frame.sharedStorageWritable = true; + } + frame.src = url; + }); + } + + function fetchUrl(url, hasSharedStorageWritableAttribute) { + return new Promise(function(resolve, reject) { + fetch(url, {sharedStorageWritable: + hasSharedStorageWritableAttribute}) + .then(response => { + if (!response.ok) { + throw new Error('Failed to fetch ' + url + '; ' + + String(response.status) + ' ' + response.statusText); + } + resolve(response); + }).catch(error => { + reject(error); + }); + }); + } </script> </body> diff --git a/tests/wpt/tests/shared-storage/resources/util.js b/tests/wpt/tests/shared-storage/resources/util.js index f82765846c2..4a7fcc4590f 100644 --- a/tests/wpt/tests/shared-storage/resources/util.js +++ b/tests/wpt/tests/shared-storage/resources/util.js @@ -196,3 +196,22 @@ async function deleteKeyForOrigin(key, origin) { const result = await nextValueFromServer(outerKey); assert_equals(result, 'delete_key_loaded'); } + +function getFetchedUrls(worker) { + return new Promise(function(resolve) { + var channel = new MessageChannel(); + channel.port1.onmessage = function(msg) { + resolve(msg); + }; + worker.postMessage({port: channel.port2}, [channel.port2]); + }); +} + +function checkInterceptedUrls(worker, expectedRequests) { + return getFetchedUrls(worker).then(function(msg) { + let actualRequests = msg.data.requests; + assert_equals(actualRequests.length, expectedRequests.length); + assert_equals( + JSON.stringify(actualRequests), JSON.stringify(expectedRequests)); + }); +} diff --git a/tests/wpt/tests/shared-storage/resources/util.sub.js b/tests/wpt/tests/shared-storage/resources/util.sub.js index 970c33b7f25..f147209d609 100644 --- a/tests/wpt/tests/shared-storage/resources/util.sub.js +++ b/tests/wpt/tests/shared-storage/resources/util.sub.js @@ -69,3 +69,49 @@ function navigateSharedStorageIframe(data) { document.body.appendChild(frame); return promise; } + +async function loadNestedSharedStorageFrameInNewFrame(data) { + const SCOPE = '/shared-storage/resources/shared-storage-writ'; + const INTERMEDIATE_FRAME_SUFFIX = + 'able-fetch-request-fallback-to-network-iframe.https.html' + const CROSS_ORIGIN = 'https://{{domains[www]}}:{{ports[https][0]}}'; + + let {key, value, hasSharedStorageWritableAttribute, isSameOrigin} = data; + + const windowPromise = new Promise((resolve, reject) => { + window.addEventListener('message', async function handler(evt) { + if (evt.data.msg && evt.data.msg === 'iframe loaded') { + window.removeEventListener('message', handler); + resolve(); + } + }); + window.addEventListener('error', () => { + reject(new Error('Navigation error')); + }); + }); + + const framePromise = new Promise((resolve, reject) => { + let frame = document.createElement('iframe'); + frame.src = SCOPE + INTERMEDIATE_FRAME_SUFFIX; + frame.onload = function() { + resolve(frame); + }; + frame.onerror = function() { + reject(new Error('Iframe load failed')); + }; + document.body.appendChild(frame); + }); + let frame = await framePromise; + + let rawWriteHeader = `set;key=${key};value=${value}`; + let writeHeader = encodeURIComponent(rawWriteHeader); + const sameOriginNestedSrc = `/shared-storage/resources/` + + `shared-storage-write.py?write=${writeHeader}`; + const nestedSrc = + isSameOrigin ? sameOriginNestedSrc : CROSS_ORIGIN + sameOriginNestedSrc; + + let nestedFrame = frame.contentWindow.loadFrame( + nestedSrc, hasSharedStorageWritableAttribute); + await windowPromise; + return {frame: frame, nestedFrame: nestedFrame, nestedFrameUrl: nestedSrc}; +} diff --git a/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-fetch.tentative.https.sub.html b/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-fetch.tentative.https.sub.html new file mode 100644 index 00000000000..ea7af527b54 --- /dev/null +++ b/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-fetch.tentative.https.sub.html @@ -0,0 +1,109 @@ +<!doctype html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/common/utils.js></script> + <script src=/fenced-frame/resources/utils.js></script> + <script src=/shared-storage/resources/util.js></script> + <script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> + <script> + const SCOPE = '/shared-storage/resources/' + + 'shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html'; + const SCRIPT = '/shared-storage/resources/' + + 'shared-storage-writable-fetch-request-fallback-to-network-worker.js'; + const SAME_ORIGIN = new URL("", location.href).origin; + const CROSS_ORIGIN = 'https://{{domains[www]}}:{{ports[https][0]}}'; + + async function fetchSharedStorageUrlInNewFrame(data) { + let {test, key, value, hasSharedStorageWritableAttribute, isSameOrigin} + = data; + + const framePromise = new Promise((resolve, reject) => { + let frame = document.createElement('iframe'); + frame.src = SCOPE; + frame.onload = function() { + resolve(frame); + }; + frame.onerror = function() { + reject(new Error('Iframe load failed')); + }; + test.add_cleanup(function() { + frame.remove(); + }); + document.body.appendChild(frame); + }); + let frame = await framePromise; + + let rawWriteHeader = `set;key=${key};value=${value}`; + let writeHeader = encodeURIComponent(rawWriteHeader); + const sameOriginSrc = `/shared-storage/resources/` + + `shared-storage-write.py?write=${writeHeader}`; + const src = isSameOrigin ? + sameOriginSrc : + CROSS_ORIGIN + sameOriginSrc; + return { + response: frame.contentWindow.fetchUrl(src, + hasSharedStorageWritableAttribute), + url: src, + }; + } + + promise_test(async t => { + await service_worker_unregister(t, SCOPE); + let reg = await navigator.serviceWorker.register(SCRIPT, + { scope: SCOPE }); + t.add_cleanup(_ => reg.unregister()); + let worker = reg.installing; + await wait_for_state(t, worker, 'activated'); + assert_not_equals(worker, null, 'worker is installing'); + + let {response, url} = await fetchSharedStorageUrlInNewFrame({ + test: t, + key: 'a', value: 'b', + hasSharedStorageWritableAttribute: true, + isSameOrigin: true, + }); + checkInterceptedUrls(worker, [ + {"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, + { + "url": SAME_ORIGIN + "/resources/testharness.js", + "mode": "no-cors", + "SSWHeader": "null" + }, + {"url": SAME_ORIGIN + url, "mode": "cors", "SSWHeader": "null"}, + ]); + await verifyKeyValueForOrigin('a', 'b', SAME_ORIGIN); + await deleteKeyForOrigin('a', SAME_ORIGIN); + }, 'test fetch(url, {sharedStorageWritable: true}) via JS from service ' + + 'worker for same origin fetch'); + + promise_test(async t => { + await service_worker_unregister(t, SCOPE); + let reg = await navigator.serviceWorker.register(SCRIPT, + { scope: SCOPE }); + t.add_cleanup(_ => reg.unregister()); + let worker = reg.installing; + await wait_for_state(t, worker, 'activated'); + assert_not_equals(worker, null, 'worker is installing'); + + let {response, url} = await fetchSharedStorageUrlInNewFrame({ + test: t, + key: 'c', value: 'd', + hasSharedStorageWritableAttribute: true, + isSameOrigin: false, + }); + checkInterceptedUrls(worker, [ + {"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, + { + "url": SAME_ORIGIN + "/resources/testharness.js", + "mode": "no-cors", + "SSWHeader": "null" + }, + {"url": url, "mode": "cors", "SSWHeader": "null"}, + ]); + await verifyKeyValueForOrigin('c', 'd', CROSS_ORIGIN); + await deleteKeyForOrigin('c', CROSS_ORIGIN); + }, 'test fetch(url, {sharedStorageWritable: true}) via JS from service ' + + 'worker for cross origin fetch'); + </script> +</body> diff --git a/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-iframe.tentative.https.sub.html b/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-iframe.tentative.https.sub.html new file mode 100644 index 00000000000..9eb2820145e --- /dev/null +++ b/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-iframe.tentative.https.sub.html @@ -0,0 +1,98 @@ +<!doctype html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/common/utils.js></script> + <script src=/fenced-frame/resources/utils.js></script> + <script src=/shared-storage/resources/util.js></script> + <script src=/shared-storage/resources/util.sub.js></script> + <script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> + <script> + const SCOPE = '/shared-storage/resources/shared-storage-writ'; + const INTERMEDIATE_FRAME_SUFFIX = + 'able-fetch-request-fallback-to-network-iframe.https.html' + const SCRIPT = '/shared-storage/resources/' + + 'shared-storage-writable-fetch-request-fallback-to-network-worker.js'; + const WORKER_FRAME = '/shared-storage/resources/' + + 'register-service-worker-iframe.https.html'; + const SAME_ORIGIN = new URL("", location.href).origin; + const CROSS_ORIGIN = 'https://{{domains[www]}}:{{ports[https][0]}}'; + + promise_test(async t => { + await service_worker_unregister(t, SCOPE); + let reg = await navigator.serviceWorker.register(SCRIPT, + { scope: SCOPE }); + t.add_cleanup(_ => reg.unregister()); + let worker = reg.installing; + await wait_for_state(t, worker, 'activated'); + assert_not_equals(worker, null, 'worker is installing'); + + let {frame, nestedFrame, nestedFrameUrl} = + await loadNestedSharedStorageFrameInNewFrame({ + key: 'a', value: 'b', + hasSharedStorageWritableAttribute: true, + isSameOrigin: true, + }); + t.add_cleanup(function() { + frame.remove(); + }); + checkInterceptedUrls(worker, [ + { + "url": SAME_ORIGIN + SCOPE + INTERMEDIATE_FRAME_SUFFIX, + "mode": "navigate", + "SSWHeader": "null" + }, + { + "url": SAME_ORIGIN + "/resources/testharness.js", + "mode": "no-cors", + "SSWHeader": "null" + }, + { + "url": SAME_ORIGIN + nestedFrameUrl, + "mode": "navigate", + "SSWHeader": "null" + }, + ]); + await verifyKeyValueForOrigin('a', 'b', SAME_ORIGIN); + await deleteKeyForOrigin('a', SAME_ORIGIN); + }, 'test <iframe sharedstoragewritable src=[url]> via JS from service ' + + 'worker for same origin iframe'); + + promise_test(async t => { + const workerFramePromise = new Promise((resolve, reject) => { + let workerFrame = document.createElement('iframe'); + workerFrame.src = CROSS_ORIGIN + WORKER_FRAME; + workerFrame.id = 'worker_frame'; + workerFrame.onload = function() { + resolve(workerFrame); + }; + workerFrame.onerror = function() { + reject(new Error('Worker frame load failed')); + }; + t.add_cleanup(function() { + workerFrame.remove(); + }); + document.body.appendChild(workerFrame); + }); + let workerFrame = await workerFramePromise; + + const messagePromise = new Promise((resolve, reject) => { + let channel = new MessageChannel(); + channel.port1.onmessage = function(e) { + resolve(e.data); + }; + let message = { + script: SCRIPT, + scope: SCOPE, + port: channel.port2, + }; + document.getElementById('worker_frame').contentWindow + .postMessage(message, "*", + [channel.port2]); + }); + let {msg} = await messagePromise; + assert_equals(msg, 'test completed'); + }, 'test <iframe sharedstoragewritable src=[url]> via JS from service ' + + 'worker for cross origin iframe'); + </script> +</body> diff --git a/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-img.tentative.https.sub.html b/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-img.tentative.https.sub.html index 9e7326d3c4d..6d481559ee7 100644 --- a/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-img.tentative.https.sub.html +++ b/tests/wpt/tests/shared-storage/shared-storage-writable-service-worker-img.tentative.https.sub.html @@ -7,23 +7,6 @@ <script src=/shared-storage/resources/util.js></script> <script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> <script> - function getFetchedUrls(worker) { - return new Promise(function(resolve) { - var channel = new MessageChannel(); - channel.port1.onmessage = function(msg) { resolve(msg); }; - worker.postMessage({port: channel.port2}, [channel.port2]); - }); - } - - function checkInterceptedUrls(worker, expectedRequests) { - return getFetchedUrls(worker) - .then(function(msg) { - let actualRequests = msg.data.requests; - assert_equals(actualRequests.length, expectedRequests.length); - assert_equals(JSON.stringify(actualRequests), JSON.stringify(expectedRequests)); - }); - } - const SCOPE = '/shared-storage/resources/' + 'shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html'; const SCRIPT = '/shared-storage/resources/' @@ -31,10 +14,11 @@ const SAME_ORIGIN = new URL("", location.href).origin; const CROSS_ORIGIN = 'https://{{domains[www]}}:{{ports[https][0]}}'; - async function loadSharedStorageImageFromNewFrame(data) { - let {test, key, value, hasSharedStorageWritableAttribute, isSameOrigin} = data; + async function loadSharedStorageImageInNewFrame(data) { + let {test, key, value, hasSharedStorageWritableAttribute, isSameOrigin} + = data; - const frame_promise = new Promise((resolve, reject) => { + const framePromise = new Promise((resolve, reject) => { let frame = document.createElement('iframe'); frame.src = SCOPE; frame.onload = function() { @@ -48,27 +32,30 @@ }); document.body.appendChild(frame); }); - let frame = await frame_promise; + let frame = await framePromise; const sameOriginImgSrc = `/shared-storage/resources/` + `shared-storage-writable-pixel.png?key=${key}&value=${value}`; - const imgSrc = isSameOrigin ? sameOriginImgSrc : CROSS_ORIGIN + sameOriginImgSrc; + const imgSrc = isSameOrigin ? + sameOriginImgSrc : + CROSS_ORIGIN + sameOriginImgSrc; return { loadedImage: frame.contentWindow.loadImage(imgSrc, - hasSharedStorageWritableAttribute), + hasSharedStorageWritableAttribute), imageUrl: imgSrc, }; } promise_test(async t => { await service_worker_unregister(t, SCOPE); - let reg = await navigator.serviceWorker.register(SCRIPT, { scope: SCOPE }); + let reg = await navigator.serviceWorker.register(SCRIPT, + { scope: SCOPE }); t.add_cleanup(_ => reg.unregister()); let worker = reg.installing; await wait_for_state(t, worker, 'activated'); assert_not_equals(worker, null, 'worker is installing'); - let {loadedImage, imageUrl} = await loadSharedStorageImageFromNewFrame({ + let {loadedImage, imageUrl} = await loadSharedStorageImageInNewFrame({ test: t, key: 'a', value: 'b', hasSharedStorageWritableAttribute: true, @@ -76,7 +63,11 @@ }); checkInterceptedUrls(worker, [ {"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, - {"url": SAME_ORIGIN + "/resources/testharness.js", "mode": "no-cors", "SSWHeader": "null"}, + { + "url": SAME_ORIGIN + "/resources/testharness.js", + "mode": "no-cors", + "SSWHeader": "null" + }, {"url": SAME_ORIGIN + imageUrl, "mode": "no-cors", "SSWHeader": "null"}, ]); await verifyKeyValueForOrigin('a', 'b', SAME_ORIGIN); @@ -86,13 +77,14 @@ promise_test(async t => { await service_worker_unregister(t, SCOPE); - let reg = await navigator.serviceWorker.register(SCRIPT, { scope: SCOPE }); + let reg = await navigator.serviceWorker.register(SCRIPT, + { scope: SCOPE }); t.add_cleanup(_ => reg.unregister()); let worker = reg.installing; await wait_for_state(t, worker, 'activated'); assert_not_equals(worker, null, 'worker is installing'); - let {loadedImage, imageUrl} = await loadSharedStorageImageFromNewFrame({ + let {loadedImage, imageUrl} = await loadSharedStorageImageInNewFrame({ test: t, key: 'c', value: 'd', hasSharedStorageWritableAttribute: true, @@ -100,7 +92,11 @@ }); checkInterceptedUrls(worker, [ {"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, - {"url": SAME_ORIGIN + "/resources/testharness.js", "mode": "no-cors", "SSWHeader": "null"}, + { + "url": SAME_ORIGIN + "/resources/testharness.js", + "mode": "no-cors", + "SSWHeader": "null" + }, {"url": imageUrl, "mode": "no-cors", "SSWHeader": "null"}, ]); await verifyKeyValueForOrigin('c', 'd', CROSS_ORIGIN); diff --git a/tests/wpt/tests/soft-navigation-heuristics/click-event-bubbles.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/click-event-bubbles.tentative.html deleted file mode 100644 index ee9d1e12335..00000000000 --- a/tests/wpt/tests/soft-navigation-heuristics/click-event-bubbles.tentative.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<meta charset="utf-8"> -<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="resources/soft-navigation-helper.js"></script> -</head> -<body> - <main id=main> - <a id=link>Click me!</a> - </main> - <script> - const link = document.getElementById("link"); - // Adding a noop event that the "click" would bubble to. - document.getElementById("main").addEventListener("click", () => {}); - - testSoftNavigation({ - addContent: () => { - addTextParagraphToMain("Lorem Ipsum"); - }, - link: link, - test: "Ensure event bubbling works well with soft navigations."}); - </script> -</body> -</html> diff --git a/tests/wpt/tests/soft-navigation-heuristics/multiple-nested-events.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/multiple_nested_events.tentative.html index e51841865d6..196cfa06868 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/multiple-nested-events.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/multiple_nested_events.tentative.html @@ -24,6 +24,7 @@ }); testSoftNavigation({ eventPrepWork: url => { + timestamps[counter]["eventStart"] = performance.now(); addTextToDivOnMain(); history.pushState({}, '', 'foobar1.html'); // Here we're bypassing the regular test's event logic, as this test is diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html index ae17db7d59f..5c7d8f4f7a4 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html @@ -16,11 +16,11 @@ <script> const link = document.getElementById("link"); testNavigationApi("Test soft navigation when navigate event intecepts with { commit: 'after-transition' }", e => { + timestamps[counter]["eventStart"] = performance.now(); e.intercept({commit: "after-transition", handler: async () => { await addImageToMain(); e.commit(); }}); - timestamps[counter]["eventEnd"] = performance.now(); }, link); </script> </body> diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-hash.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-hash.tentative.html index e20578ea79e..a63b177a63f 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-hash.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-hash.tentative.html @@ -16,11 +16,11 @@ <script> const link = document.getElementById("link"); testNavigationApi("Test soft navigation with the Navigation API", e => { + timestamps[counter]["eventStart"] = performance.now(); e.intercept({handler: async () => { await addImageToMain(); main.appendChild(img); }}); - timestamps[counter]["eventEnd"] = performance.now(); }, link); </script> </body> diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-preventDefault.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-preventDefault.tentative.html index b7b2a24c942..d6c61efb3cb 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-preventDefault.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-preventDefault.tentative.html @@ -19,12 +19,12 @@ testSoftNavigationNotDetected({ testName: "Aborted navigate event is not a soft navigation", eventHandler: e => { + timestamps[counter]["eventStart"] = performance.now(); e.intercept({handler: async () => { await addImageToMain(); main.appendChild(img); }}); e.preventDefault(); - timestamps[counter]["eventEnd"] = performance.now(); }, eventTarget: navigation, eventName: "navigate", diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-rejected.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-rejected.tentative.html index 693f876b6e1..bcc0451d5bd 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-rejected.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-rejected.tentative.html @@ -16,11 +16,11 @@ <script> const link = document.getElementById("link"); testNavigationApi("Test intercepted and rejected navigate event", e => { + timestamps[counter]["eventStart"] = performance.now(); e.intercept({handler: async () => { await addImageToMain(); throw new Error("This navigation handler rejected"); }}); - timestamps[counter]["eventEnd"] = performance.now(); }, link); </script> </body> diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-view-transition.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-view-transition.tentative.html index 4d88f3d0b7d..2755f9f9ac7 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-view-transition.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-view-transition.tentative.html @@ -23,6 +23,7 @@ await new Promise(r => step_timeout(r, 0)); const navigate_callback = e => { + timestamps[counter]["eventStart"] = performance.now(); e.intercept({ async handler() { const lcp_promise = new Promise(resolve => { @@ -40,7 +41,6 @@ await lcp_promise; } }); - timestamps[counter]["eventEnd"] = performance.now(); }; const link = document.getElementById("link"); diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api.tentative.html index 2d61736a486..ca11f684f49 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api.tentative.html @@ -16,10 +16,10 @@ <script> const link = document.getElementById("link"); testNavigationApi("Test soft navigation with the Navigation API", e => { + timestamps[counter]["eventStart"] = performance.now(); e.intercept({handler: async () => { await addImageToMain(); }}); - timestamps[counter]["eventEnd"] = performance.now(); }, link); </script> </body> diff --git a/tests/wpt/tests/soft-navigation-heuristics/popstate-multiple-backs.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/popstate-multiple-backs.tentative.html index fd87f5f03e7..2a12a352bff 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/popstate-multiple-backs.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/popstate-multiple-backs.tentative.html @@ -39,10 +39,7 @@ return t.popped == 2; } const link = document.getElementById("link"); - link.addEventListener("click", () => { - history.back(); - timestamps[counter]["eventEnd"] = performance.now(); - }); + link.addEventListener("click", () => history.back()); testSoftNavigation({ addContent: () => { // Add the content to the main element diff --git a/tests/wpt/tests/soft-navigation-heuristics/popstate.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/popstate.tentative.html index f89991d76b0..60a5ff72292 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/popstate.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/popstate.tentative.html @@ -22,10 +22,7 @@ history.pushState({}, "", "another_one.html"); const link = document.getElementById("link"); - link.addEventListener("click", () => { - history.back(); - timestamps[counter]["eventEnd"] = performance.now(); - }); + link.addEventListener("click", () => history.back()); testSoftNavigation({ addContent: () => { // Add the content to the main element diff --git a/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js b/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js index 685bc21f43c..58ca9c22657 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js +++ b/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js @@ -144,17 +144,10 @@ const setEvent = (t, button, pushState, addContent, pushUrl, eventType, prepWork const eventObject = (eventType == 'click' || eventType.startsWith("key")) ? button : window; eventObject.addEventListener(eventType, async e => { - let prepWorkFailed = false; if (prepWork &&!prepWork(t)) { - prepWorkFailed = true; - } - // This is the end of the event's sync processing. - if (!timestamps[counter]["eventEnd"]) { - timestamps[counter]["eventEnd"] = performance.now(); - } - if (prepWorkFailed) { return; } + timestamps[counter]["eventStart"] = performance.now(); // Jump through a task, to ensure task tracking is working properly. await new Promise(r => t.step_timeout(r, 0)); @@ -172,9 +165,9 @@ const setEvent = (t, button, pushState, addContent, pushUrl, eventType, prepWork await new Promise(r => t.step_timeout(r, 10)); await addContent(url); + ++counter; interacted = true; - ++counter; }); }; @@ -197,7 +190,7 @@ const validateSoftNavigationEntry = async (clicks, extraValidations, assert_less_than_equal(timestamps[i]["syncPostInteraction"], entryTimestamp, "Entry timestamp is lower than the post interaction one"); assert_greater_than_equal( - entryTimestamp, timestamps[i]['eventEnd'], + timestamps[i]['eventStart'], entryTimestamp, 'Event start timestamp matches'); assert_not_equals(entry.navigationId, performance.getEntriesByType("navigation")[0].navigationId, diff --git a/tests/wpt/tests/speculation-rules/prefetch/duplicate-urls.https.html b/tests/wpt/tests/speculation-rules/prefetch/duplicate-urls.https.html index c6d6fb7878d..f9e46a6a384 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/duplicate-urls.https.html +++ b/tests/wpt/tests/speculation-rules/prefetch/duplicate-urls.https.html @@ -14,9 +14,7 @@ insertSpeculationRules({ prefetch: [{ source: 'list', urls: urls }] }); await new Promise(resolve => t.step_timeout(resolve, 2000)); - let prefetched_count = (await Promise.all(urls.map(isUrlPrefetched))).reduce( - (count, was_prefetched) => count + (was_prefetched ? 1 : 0), 0); - + let prefetched_count = await isUrlPrefetched(urls[0]); assert_equals(prefetched_count, 1, "url should be prefetched just once."); }, "browser should remove duplicate urls from prefetch buffer."); </script> diff --git a/tests/wpt/tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https.html b/tests/wpt/tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https.html new file mode 100644 index 00000000000..c0e9e73c75e --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="../resources/utils.js"></script> +<script src="resources/utils.sub.js"></script> + +<meta name="variant" content="?same-site"> +<meta name="variant" content="?cross-site"> + +<script> +setup(() => assertSpeculationRulesIsSupported()); + +promise_test(async t => { + const is_same_site = location.search === '?same-site'; + const initiator = await spawnWindow(t); + const url1 = initiator.getExecutorURL({ + hostname: is_same_site ? undefined : '{{hosts[alt][www]}}', + executor: 'cacheable-executor.sub.html', + page: 1 + }); + const url2 = initiator.getExecutorURL({ + hostname: is_same_site ? undefined : '{{hosts[][]}}', + executor: 'cacheable-executor.sub.html', + page: 2 + }); + + await initiator.forceSinglePrefetch(url1); + initiator.navigate(url2); + assert_equals(await initiator.getDeliveryType(), ''); + assert_not_prefetched(await initiator.getRequestHeaders(), + 'Content should not have been prefetched.'); + + initiator.navigate(url1); + if (is_same_site) { + assert_equals(await initiator.getDeliveryType(), 'cache', + 'Navigation should have retrieved the response from the HTTP Cache.'); + // Note: Even though we didn't use a prefetch, the cached response for + // |url1| was obtained using a prefetch request, and the recorded headers + // at the time of the first request would have Sec-Purpose: 'prefetch'. + assert_prefetched(await initiator.getRequestHeaders(), + 'The cached response should have been from the initial prefetch request.'); + } else { + assert_equals(await initiator.getDeliveryType(), '', + 'Navigation response should not have been from the HTTP Cache.'); + } + + + await initiator.forceSinglePrefetch(url2); + initiator.navigate(url2); + assert_equals(await initiator.getDeliveryType(), 'navigational-prefetch', + 'Navigation should have used the prefetch'); + if (is_same_site) { + // Note: Even though we did use a prefetch, the recorded request headers in + // the response will not be prefetch headers. This is because the prefetch + // request retrieved its response from the HTTP cache, and the response in + // the cache was initially obtained from the first navigation to |url2|, + // which was not a prefetch. + assert_not_prefetched(await initiator.getRequestHeaders(), + 'The prefetch request should have used a response from the HTTP cache.'); + } else { + assert_prefetched(await initiator.getRequestHeaders(), + 'The prefetch request should have used a fresh response'); + } + +}, 'Test that prefetches use/store responses to/from the HTTP cache.'); +</script> diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/authenticate.py b/tests/wpt/tests/speculation-rules/prefetch/resources/authenticate.py index 037a7c144e0..8820781709d 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/authenticate.py +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/authenticate.py @@ -6,7 +6,11 @@ def main(request, response): purpose = request.headers.get("Purpose", b"").decode("utf-8") sec_purpose = request.headers.get("Sec-Purpose", b"").decode("utf-8") - headers = [(b"Content-Type", b"text/html"), (b'WWW-Authenticate', 'Basic')] + headers = [ + (b"Content-Type", b"text/html"), + (b'WWW-Authenticate', b'Basic'), + (b'Cache-Control', b'no-store') + ] status = 200 if request.auth.username is not None or sec_purpose.startswith( "prefetch") else 401 diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/cacheable-executor.sub.html b/tests/wpt/tests/speculation-rules/prefetch/resources/cacheable-executor.sub.html new file mode 100644 index 00000000000..ba1b3acb0c1 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/cacheable-executor.sub.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="utils.sub.js"></script> +<script> +window.requestHeaders = { + purpose: "{{header_or_default(Purpose, )}}", + sec_purpose: "{{header_or_default(Sec-Purpose, )}}", + referer: "{{header_or_default(Referer, )}}", +}; + +const uuid = new URLSearchParams(location.search).get('uuid'); +window.executor = new Executor(uuid); +</script> diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/cacheable-executor.sub.html.headers b/tests/wpt/tests/speculation-rules/prefetch/resources/cacheable-executor.sub.html.headers new file mode 100644 index 00000000000..0ee6ec2ab10 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/cacheable-executor.sub.html.headers @@ -0,0 +1 @@ +Cache-Control: private, max-age=604800 diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/cookies.py b/tests/wpt/tests/speculation-rules/prefetch/resources/cookies.py index 3c2299aa3a6..3ba9cd9270b 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/cookies.py +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/cookies.py @@ -17,7 +17,7 @@ def main(request, response): response.set_cookie( "type", "prefetch" if sec_purpose.startswith("prefetch") else "navigate") - headers = [(b"Content-Type", b"text/html")] + headers = [(b"Content-Type", b"text/html"), (b"Cache-Control", b"no-store")] content = f''' <!DOCTYPE html> diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html.headers b/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html.headers new file mode 100644 index 00000000000..4030ea1d3dd --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html.headers @@ -0,0 +1 @@ +Cache-Control: no-store diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch.py b/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch.py index 4a0a7a36020..14ac4d1699e 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch.py +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch.py @@ -5,6 +5,7 @@ def main(request, response): uuid = request.GET[b"uuid"] prefetch = request.headers.get( "Sec-Purpose", b"").decode("utf-8").startswith("prefetch") + response.headers.set("Cache-Control", "no-store") n = request.server.stash.take(uuid) if n is None: diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch_nvs_hint.py b/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch_nvs_hint.py index 1de33a75d86..d912eff90a5 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch_nvs_hint.py +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/prefetch_nvs_hint.py @@ -1,6 +1,7 @@ import time def main(request, response): + response.headers.set("Cache-Control", "no-store") uuid = request.GET[b"uuid"] wait_for_prefetch_start_uuid = None if b"wait_for_prefetch_uuid" in request.GET: diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/sw.js b/tests/wpt/tests/speculation-rules/prefetch/resources/sw.js index db774f9d5b8..dd8a9631b4e 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/sw.js +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/sw.js @@ -1 +1 @@ -self.addEventListener('fetch', () => event.respondWith(fetch(event.request))); +self.addEventListener('fetch', event => event.respondWith(fetch(event.request))); diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/utils.js b/tests/wpt/tests/speculation-rules/prerender/resources/utils.js index 687f6a43982..56ab603fdff 100644 --- a/tests/wpt/tests/speculation-rules/prerender/resources/utils.js +++ b/tests/wpt/tests/speculation-rules/prerender/resources/utils.js @@ -29,6 +29,9 @@ class PrerenderChannel extends EventTarget { while (this.#active) { // Add the "keepalive" option to avoid fetch() results in unhandled // rejection with fetch abortion due to window.close(). + // TODO(crbug.com/1356128): After this migration, "keepalive" will not + // be able to extend the lifetime of a Document, such that it cannot be + // used here to guarantee the promise resolution. const messages = await (await fetch(this.#url, {keepalive: true})).json(); for (const {data, id} of messages) { if (!this.#ids.has(id)) diff --git a/tests/wpt/tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js b/tests/wpt/tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js index e03aaa802d0..ee9202777e7 100644 --- a/tests/wpt/tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js +++ b/tests/wpt/tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js @@ -2,6 +2,7 @@ // META: script=/storage/buckets/resources/util.js promise_test(async t => { + prepareForBucketTest(t); const arraySize = 1e6; const objectStoreName = "storageManager"; const dbname = diff --git a/tests/wpt/tests/storage/buckets/bucket_names.tentative.https.any.js b/tests/wpt/tests/storage/buckets/bucket_names.tentative.https.any.js new file mode 100644 index 00000000000..e0f122dc47d --- /dev/null +++ b/tests/wpt/tests/storage/buckets/bucket_names.tentative.https.any.js @@ -0,0 +1,93 @@ +// META: title=Buckets API: Basic tests for bucket names. +// META: script=resources/util.js +// META: global=window,worker + +const kGoodBucketNameTests = [ + ['abcdefghijklmnopqrstuvwxyz0123456789-_', 'with allowed characters'], + ['2021-01-01', 'with `-` in the middle'], + ['2021_01_01', 'with `_` in the middle'], + ['2021_01_01_', 'ending with `_`'], + ['2021-01-01-', 'ending with `-`'], +]; + +const kBadBucketNameTests = [ + ['_bucket', 'start with `_`'], + ['-bucket', 'start with `-`'], + ['bucket name', 'have a space'], + ['bUcKet123', 'are not all lower case'], + ['bucket♦♥♠♣', 'are not in ASCII'], + ['2021/01/01', 'include an invalid special character'], + [' ', 'have no characters'], + ['', 'are an empty string'], + ['mjnkhtwsiyjsrxvrzzqafldfvomqopdjfiuxqelfkllcugrhvvblkvmiqlguhhqepoggyu', + 'exceed 64 chars'] +]; + +// Test valid bucket names on open(). +kGoodBucketNameTests.forEach(test_data => { + const bucket_name = test_data[0]; + const test_description = test_data[1]; + + promise_test(async testCase => { + await prepareForBucketTest(testCase); + const bucket = await navigator.storageBuckets.open(bucket_name); + assert_equals(bucket.name, bucket_name); + + const buckets = await navigator.storageBuckets.keys(); + assert_array_equals(buckets, [bucket_name]); + }, `open() allows bucket names ${test_description}`); +}); + +// Test invalid bucket names on open(). +kBadBucketNameTests.forEach(test_data => { + const bucket_name = test_data[0]; + const test_description = test_data[1]; + + promise_test(async testCase => { + await prepareForBucketTest(testCase); + return promise_rejects_js( + testCase, TypeError, + navigator.storageBuckets.open(bucket_name)); + }, `open() throws an error if bucket names ${test_description}`); +}); + +// Test valid bucket names on delete(). +kGoodBucketNameTests.forEach(test_data => { + const bucket_name = test_data[0]; + const test_description = test_data[1]; + + promise_test(async testCase => { + await prepareForBucketTest(testCase); + await navigator.storageBuckets.open(bucket_name); + let buckets = await navigator.storageBuckets.keys(); + assert_equals(buckets.length, 1); + + await navigator.storageBuckets.delete(bucket_name); + + buckets = await navigator.storageBuckets.keys(); + assert_equals(buckets.length, 0); + }, `delete() allows bucket names ${test_description}`); +}); + +// Test invalid bucket names on delete(). +kBadBucketNameTests.forEach(test_data => { + const bucket_name = test_data[0]; + const test_description = test_data[1]; + + promise_test(async testCase => { + await prepareForBucketTest(testCase); + return promise_rejects_js( + testCase, TypeError, + navigator.storageBuckets.delete(bucket_name)); + }, `delete() throws an error if bucket names ${test_description}`); +}); + +promise_test(async testCase => { + await prepareForBucketTest(testCase); + + await navigator.storageBuckets.open('bucket_name'); + await navigator.storageBuckets.open('bucket_name'); + + const buckets = await navigator.storageBuckets.keys(); + assert_array_equals(buckets, ['bucket_name']); +}, 'open() does not store duplicate bucket names'); diff --git a/tests/wpt/tests/storage/buckets/buckets_basic.tentative.https.any.js b/tests/wpt/tests/storage/buckets/buckets_basic.tentative.https.any.js new file mode 100644 index 00000000000..20ff227bac1 --- /dev/null +++ b/tests/wpt/tests/storage/buckets/buckets_basic.tentative.https.any.js @@ -0,0 +1,50 @@ +// META: title=Buckets API: Basic tests for open(), keys(), delete(). +// META: script=resources/util.js +// META: global=window,worker + +'use strict'; + +// This test is for initial IDL version optimized for debugging. +// Split and add extensive testing once implementation for the endpoints are +// added and method definitions are more defined. +promise_test(async testCase => { + await prepareForBucketTest(testCase); + + await navigator.storageBuckets.open('bucket_name3'); + await navigator.storageBuckets.open('bucket_name1'); + await navigator.storageBuckets.open('bucket_name2'); + + const buckets = await navigator.storageBuckets.keys(); + assert_array_equals( + buckets, ['bucket_name1', 'bucket_name2', 'bucket_name3']); +}, 'keys() lists all stored bucket names alphabetically'); + +promise_test(async testCase => { + await prepareForBucketTest(testCase); + + await navigator.storageBuckets.open('bucket_name1'); + await navigator.storageBuckets.open('bucket_name2'); + + let buckets = await navigator.storageBuckets.keys(); + assert_array_equals(buckets, ['bucket_name1', 'bucket_name2']); + + await navigator.storageBuckets.delete('bucket_name1'); + + buckets = await navigator.storageBuckets.keys(); + assert_array_equals(buckets, ['bucket_name2']); +}, 'delete() removes stored bucket name'); + +promise_test(async testCase => { + await prepareForBucketTest(testCase); + + await navigator.storageBuckets.open('bucket_name'); + + let buckets = await navigator.storageBuckets.keys(); + assert_array_equals(buckets, ['bucket_name']); + + await navigator.storageBuckets.delete('does-not-exist'); + + buckets = await navigator.storageBuckets.keys(); + assert_equals(buckets.length, 1); + assert_equals(buckets[0], 'bucket_name'); +}, 'delete() does nothing if bucket name does not exist'); diff --git a/tests/wpt/tests/storage/buckets/buckets_storage_policy.tentative.https.any.js b/tests/wpt/tests/storage/buckets/buckets_storage_policy.tentative.https.any.js new file mode 100644 index 00000000000..918364d7315 --- /dev/null +++ b/tests/wpt/tests/storage/buckets/buckets_storage_policy.tentative.https.any.js @@ -0,0 +1,32 @@ +// META: title=Buckets API: Tests for bucket storage policies. +// META: script=resources/util.js +// META: global=window,worker + +'use strict'; + +function sanitizeQuota(quota) { + return Math.max(1, Math.min(Number.MAX_SAFE_INTEGER, Math.floor(quota))); +} + +async function testQuota(storageKeyQuota, quota, name) { + const safeQuota = sanitizeQuota(quota); + const bucket = await navigator.storageBuckets.open(name, { quota: safeQuota }); + const estimateQuota = (await bucket.estimate()).quota; + assert_equals(estimateQuota, Math.min(safeQuota, storageKeyQuota)); +} + +promise_test(async testCase => { + await prepareForBucketTest(testCase); + + const storageKeyQuota = (await navigator.storage.estimate()).quota; + + testQuota(storageKeyQuota, 1, 'one'); + testQuota(storageKeyQuota, storageKeyQuota / 4, 'quarter'); + testQuota(storageKeyQuota, storageKeyQuota / 2, 'half'); + testQuota(storageKeyQuota, storageKeyQuota - 1, 'one_less'); + testQuota(storageKeyQuota, storageKeyQuota, 'origin_quota'); + testQuota(storageKeyQuota, storageKeyQuota + 1, 'one_more'); + testQuota(storageKeyQuota, storageKeyQuota * 2, 'twice'); + testQuota(storageKeyQuota, storageKeyQuota * 4, 'four_times'); + testQuota(storageKeyQuota, Number.MAX_SAFE_INTEGER, 'max_safe_int'); +}, 'For an individual bucket, the quota is the minimum of the requested quota and the StorageKey quota.'); diff --git a/tests/wpt/tests/storage/buckets/detached-iframe.https.html b/tests/wpt/tests/storage/buckets/detached-iframe.https.html new file mode 100644 index 00000000000..a67c89efa3e --- /dev/null +++ b/tests/wpt/tests/storage/buckets/detached-iframe.https.html @@ -0,0 +1,62 @@ +<!doctype html> +<meta charset=utf-8> +<title>Storage Buckets API on detached iframe</title> +<link rel='help' href=''> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<body> +<script> +'use strict'; + +promise_test(async testCase => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + const bucketManager = iframe.contentWindow.navigator.storageBuckets; + await bucketManager.open('iframe-bucket'); + + let bucketKeys = await bucketManager.keys(); + assert_equals(bucketKeys.length, 1); + + // Note that these tests cannot make use of `prepareForBucketTest` because the + // iframe is detached before the test ends, so the test's cleanup step comes + // too late to delete buckets. + await bucketManager.delete('iframe-bucket'); + + iframe.remove(); + + // Calling open() from a detached iframe should fail but not crash. + assert_equals(bucketManager.open('iframe-bucket'), undefined); +}, 'Verify open() on detached iframe returns an error'); + +promise_test(async testCase => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + const bucketManager = iframe.contentWindow.navigator.storageBuckets; + await bucketManager.open('iframe-bucket'); + + let bucketKeys = await bucketManager.keys(); + assert_equals(bucketKeys.length, 1); + await bucketManager.delete('iframe-bucket'); + + iframe.remove(); + + // Calling keys() from a detached iframe should fail but not crash. + assert_equals(bucketManager.keys(), undefined); +}, 'Verify keys() on detached iframe returns an error'); + +promise_test(async testCase => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + const bucketManager = iframe.contentWindow.navigator.storageBuckets; + await bucketManager.open('iframe-bucket'); + await bucketManager.delete('iframe-bucket'); + + iframe.remove(); + + // Calling delete() from a detached iframe should fail but not crash. + assert_equals(bucketManager.delete('foo-bucket'), undefined); +}, 'Verify delete() on detached iframe returns an error'); + +</script> +</body> diff --git a/tests/wpt/tests/storage/buckets/idlharness-worker.https.any.js b/tests/wpt/tests/storage/buckets/idlharness-worker.https.any.js new file mode 100644 index 00000000000..9a1a3f80b9b --- /dev/null +++ b/tests/wpt/tests/storage/buckets/idlharness-worker.https.any.js @@ -0,0 +1,22 @@ +// META: global=window,worker +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +idl_test( + ['storage-buckets'], + ['html'], + async (idl_array, t) => { + idl_array.add_objects({ + StorageBucketManager: ['navigator.storageBuckets'], + StorageBucket: [] + }); + + if (self.Window) { + idl_array.add_objects({ Navigator: ['navigator'] }); + } else { + idl_array.add_objects({ WorkerNavigator: ['navigator'] }); + } + } +); diff --git a/tests/wpt/tests/storage/buckets/opaque-origin.https.window.js b/tests/wpt/tests/storage/buckets/opaque-origin.https.window.js new file mode 100644 index 00000000000..c91d3faa67a --- /dev/null +++ b/tests/wpt/tests/storage/buckets/opaque-origin.https.window.js @@ -0,0 +1,58 @@ +// META: title=Storage Buckets API: Interface is not exposed in opaque origins. +// META: script=resources/util.js +// META: global=window + +const kSandboxWindowUrl = 'resources/opaque-origin-sandbox.html'; + +function add_iframe(test, src, sandbox) { + const iframe = document.createElement('iframe'); + iframe.src = src; + if (sandbox !== undefined) { + iframe.sandbox = sandbox; + } + document.body.appendChild(iframe); + test.add_cleanup(() => { + iframe.remove(); + }); +} + +// |kSandboxWindowUrl| sends the result of methods on StorageBucketManager. +// For windows using sandbox="allow-scripts", it must produce a rejected +// promise. +async function verify_results_from_sandboxed_child_window(test) { + const event_watcher = new EventWatcher(test, self, 'message'); + + const first_message_event = await event_watcher.wait_for('message'); + assert_equals( + first_message_event.data, + 'navigator.storageBuckets.open(): REJECTED: SecurityError'); + + const second_message_event = await event_watcher.wait_for('message'); + assert_equals( + second_message_event.data, + 'navigator.storageBuckets.keys(): REJECTED: SecurityError'); + + const third_message_event = await event_watcher.wait_for('message'); + assert_equals( + third_message_event.data, + 'navigator.storageBuckets.delete(): REJECTED: SecurityError'); +} + +promise_test(async testCase => { + prepareForBucketTest(testCase); + add_iframe(testCase, kSandboxWindowUrl, /*sandbox=*/ 'allow-scripts'); + await verify_results_from_sandboxed_child_window(testCase); +}, 'StorageBucketManager methods must reject in a sandboxed iframe.'); + +promise_test(async testCase => { + prepareForBucketTest(testCase); + const child_window_url = kSandboxWindowUrl + + '?pipe=header(Content-Security-Policy, sandbox allow-scripts)'; + + const child_window = window.open(child_window_url); + testCase.add_cleanup(() => { + child_window.close(); + }); + + await verify_results_from_sandboxed_child_window(testCase); +}, 'StorageBucketManager methods must reject in a sandboxed opened window.'); diff --git a/tests/wpt/tests/storage/buckets/resources/opaque-origin-sandbox.html b/tests/wpt/tests/storage/buckets/resources/opaque-origin-sandbox.html new file mode 100644 index 00000000000..4a1ac39fdf6 --- /dev/null +++ b/tests/wpt/tests/storage/buckets/resources/opaque-origin-sandbox.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<script> + 'use strict' + + // Sends the result of navigator.storageBuckets.open('bucket'). + + function post_message(data) { + if (window.parent !== null) { + window.parent.postMessage(data, { targetOrigin: '*' }); + } + if (window.opener !== null) { + window.opener.postMessage(data, { targetOrigin: '*' }); + } + } + + try { + navigator.storageBuckets.open('opaque-origin-bucket') + .then(() => { + post_message('navigator.storageBuckets.open(): FULFILLED'); + }).catch(error => { + post_message( + `navigator.storageBuckets.open(): REJECTED: ${error.name}`); + }); + } catch (error) { + post_message(`navigator.storageBuckets.open(): EXCEPTION: ${error.name}`); + } + + try { + navigator.storageBuckets.keys() + .then(() => { + post_message('navigator.storageBuckets.keys(): FULFILLED'); + }).catch(error => { + post_message( + `navigator.storageBuckets.keys(): REJECTED: ${error.name}`); + }); + } catch (error) { + post_message(`navigator.storageBuckets.keys(): EXCEPTION: ${error.name}`); + } + + try { + navigator.storageBuckets.delete('opaque-origin-bucket') + .then(() => { + post_message('navigator.storageBuckets.delete(): FULFILLED'); + }).catch(error => { + post_message( + `navigator.storageBuckets.delete(): REJECTED: ${error.name}`); + }); + } catch (error) { + post_message(`navigator.storageBuckets.delete(): EXCEPTION: ${error.name}`); + } +</script> + diff --git a/tests/wpt/tests/storage/buckets/resources/util.js b/tests/wpt/tests/storage/buckets/resources/util.js index 425303ce2c9..5fff4894442 100644 --- a/tests/wpt/tests/storage/buckets/resources/util.js +++ b/tests/wpt/tests/storage/buckets/resources/util.js @@ -4,7 +4,7 @@ // is over (whether it passes or fails). async function prepareForBucketTest(test) { // Verify initial state. - assert_equals('', (await navigator.storageBuckets.keys()).join()); + assert_equals((await navigator.storageBuckets.keys()).join(), ''); // Clean up after test. test.add_cleanup(async function() { const keys = await navigator.storageBuckets.keys(); diff --git a/tests/wpt/tests/storage/buckets/storage_bucket_object.tentative.https.any.js b/tests/wpt/tests/storage/buckets/storage_bucket_object.tentative.https.any.js new file mode 100644 index 00000000000..52f1693ccb2 --- /dev/null +++ b/tests/wpt/tests/storage/buckets/storage_bucket_object.tentative.https.any.js @@ -0,0 +1,143 @@ +// META: title=Buckets API: Tests for the StorageBucket object. +// META: global=window,worker + +'use strict'; + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open('bucket_name'); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + const persisted = await bucket.persisted(); + assert_false(persisted); + + // Also verify that the promise is rejected after the bucket is deleted. + await navigator.storageBuckets.delete('bucket_name'); + await promise_rejects_dom(testCase, 'UnknownError', bucket.persisted()); +}, 'persisted() should default to false'); + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open('bucket_name'); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + const estimate = await bucket.estimate(); + assert_greater_than(estimate.quota, 0); + assert_equals(estimate.usage, 0); + + const cacheName = 'attachments'; + const cacheKey = 'receipt1.txt'; + var inboxCache = await bucket.caches.open(cacheName); + await inboxCache.put(cacheKey, new Response('bread x 2')) + + const estimate2 = await bucket.estimate(); + assert_equals(estimate.quota, estimate2.quota); + assert_less_than(estimate.usage, estimate2.usage); +}, 'estimate() should retrieve quota usage'); + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open( + 'bucket_name', { durability: 'strict' }); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + + const durability = await bucket.durability(); + assert_equals('strict', durability); + + await navigator.storageBuckets.delete('bucket_name'); + await promise_rejects_dom(testCase, 'UnknownError', bucket.durability()); +}, 'durability() should retrieve bucket durability specified during creation'); + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open('bucket_name'); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + + const durability = await bucket.durability(); + assert_equals('relaxed', durability); +}, 'Bucket durability defaults to relaxed'); + +promise_test(async testCase => { + const oneYear = 365 * 24 * 60 * 60 * 1000; + const expiresDate = Date.now() + oneYear; + const bucket = await navigator.storageBuckets.open( + 'bucket_name', { expires: expiresDate }); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + + const expires = await bucket.expires(); + assert_equals(expires, expiresDate); +}, 'expires() should retrieve expires date'); + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open('bucket_name'); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + + const expires = await bucket.expires(); + assert_equals(expires, null); + + await navigator.storageBuckets.delete('bucket_name'); + await promise_rejects_dom(testCase, 'UnknownError', bucket.expires()); +}, 'expires() should be defaulted to null'); + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open('bucket_name'); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + + const oneYear = 365 * 24 * 60 * 60 * 1000; + const expiresDate = Date.now() + oneYear; + await bucket.setExpires(expiresDate); + + const expires = await bucket.expires(); + assert_equals(expires, expiresDate); + + await navigator.storageBuckets.delete('bucket_name'); + await promise_rejects_dom(testCase, 'UnknownError', bucket.setExpires(expiresDate)); +}, 'setExpires() should set bucket expires date'); + +promise_test(async testCase => { + const oneDay = 24 * 60 * 60 * 1000; + const expiresDate = Date.now() + oneDay; + const bucket = await navigator.storageBuckets.open('bucket_name', { + expires: expiresDate + }); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + let expires = await bucket.expires(); + assert_equals(expires, expiresDate); + + const oneYear = 365 * oneDay; + const newExpiresDate = Date.now() + oneYear; + await bucket.setExpires(newExpiresDate); + + expires = await bucket.expires(); + assert_equals(expires, newExpiresDate); +}, 'setExpires() should update expires date'); + +promise_test(async testCase => { + const bucket = await navigator.storageBuckets.open( + 'bucket_name', { durability: 'strict' }); + testCase.add_cleanup(async () => { + await navigator.storageBuckets.delete('bucket_name'); + }); + + const same_bucket = await navigator.storageBuckets.open('bucket_name'); + const durability = await bucket.durability(); + const other_durability = await same_bucket.durability(); + assert_equals(durability, other_durability); + + // Delete the bucket and remake it. + await navigator.storageBuckets.delete('bucket_name'); + const remade_bucket = await navigator.storageBuckets.open('bucket_name'); + await promise_rejects_dom(testCase, 'UnknownError', bucket.durability()); + const remade_durability = await remade_bucket.durability(); + assert_not_equals(remade_durability, durability); +}, 'two handles can refer to the same bucket, and a bucket name can be reused after deletion'); diff --git a/tests/wpt/tests/svg/animations/use-animate-display-none-symbol-2.html b/tests/wpt/tests/svg/animations/use-animate-display-none-symbol-2.html new file mode 100644 index 00000000000..db06b641d9a --- /dev/null +++ b/tests/wpt/tests/svg/animations/use-animate-display-none-symbol-2.html @@ -0,0 +1,28 @@ +<!doctype html> +<html class="reftest-wait"> +<title>Animate a symbol in a display: none subtree 2 </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() { + waitForAtLeastOneFrame().then(takeScreenshot); +} +</script> +<svg> + <use href="#hidden"/> +</svg> +<svg style="display: none"> + <symbol id="hidden"> + <rect width="100" height="100" fill="red"> + <animate + attributeName="fill" + values="red; green" + keyTimes="0; 0.01" + dur="1s" + calcMode="discrete" + fill="freeze" + onbegin="test()"/> + </rect> + </symbol> +</svg> diff --git a/tests/wpt/tests/svg/geometry/reftests/circle-001.svg b/tests/wpt/tests/svg/geometry/reftests/circle-001.svg index 2fbd70d5a63..4ece9da683b 100644 --- a/tests/wpt/tests/svg/geometry/reftests/circle-001.svg +++ b/tests/wpt/tests/svg/geometry/reftests/circle-001.svg @@ -3,7 +3,8 @@ xmlns:html="http://www.w3.org/1999/xhtml"> <title>Circle coordinates and radius specified by properties</title> <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> - <html:link rel="match" href="circle-ref.svg" /> + <html:link rel="match" href="circle-ref.svg" /> + <html:meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-8" /> <style> circle { cx: 204px; diff --git a/tests/wpt/tests/svg/geometry/reftests/circle-002.svg b/tests/wpt/tests/svg/geometry/reftests/circle-002.svg index 7f98f56ad0f..d9dd067b048 100644 --- a/tests/wpt/tests/svg/geometry/reftests/circle-002.svg +++ b/tests/wpt/tests/svg/geometry/reftests/circle-002.svg @@ -3,7 +3,8 @@ xmlns:html="http://www.w3.org/1999/xhtml"> <title>Circle coordinates and radius specified in user units</title> <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> - <html:link rel="match" href="circle-ref.svg" /> + <html:link rel="match" href="circle-ref.svg" /> + <html:meta name="fuzzy" content="maxDifference=0-53; totalPixels=0-370" /> <style> circle { cx: 62040px; diff --git a/tests/wpt/tests/svg/geometry/reftests/circle-003.svg b/tests/wpt/tests/svg/geometry/reftests/circle-003.svg index 74c32fb33cb..5cd5cbf3a5c 100644 --- a/tests/wpt/tests/svg/geometry/reftests/circle-003.svg +++ b/tests/wpt/tests/svg/geometry/reftests/circle-003.svg @@ -3,7 +3,8 @@ xmlns:html="http://www.w3.org/1999/xhtml"> <title>Circle coordinates and radius specified by percentage</title> <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> - <html:link rel="match" href="circle-ref.svg" /> + <html:link rel="match" href="circle-ref.svg" /> + <html:meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-2" /> <style> circle { cx: 60%; /* 60% of width 340 */ diff --git a/tests/wpt/tests/svg/geometry/reftests/circle-004.svg b/tests/wpt/tests/svg/geometry/reftests/circle-004.svg index 36c9e0096f0..1027078953d 100644 --- a/tests/wpt/tests/svg/geometry/reftests/circle-004.svg +++ b/tests/wpt/tests/svg/geometry/reftests/circle-004.svg @@ -3,7 +3,8 @@ xmlns:html="http://www.w3.org/1999/xhtml"> <title>Circle coordinates and radius specified using calc</title> <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> - <html:link rel="match" href="circle-ref.svg" /> + <html:link rel="match" href="circle-ref.svg" /> + <html:meta name="fuzzy" content="maxDifference=0-35; totalPixels=0-434" /> <style> circle { fill: blue; diff --git a/tests/wpt/tests/svg/geometry/reftests/ellipse-002.svg b/tests/wpt/tests/svg/geometry/reftests/ellipse-002.svg index 081617288a1..86c40f38973 100644 --- a/tests/wpt/tests/svg/geometry/reftests/ellipse-002.svg +++ b/tests/wpt/tests/svg/geometry/reftests/ellipse-002.svg @@ -3,7 +3,8 @@ xmlns:html="http://www.w3.org/1999/xhtml"> <title>Ellipse coordinates and radii specified in user units</title> <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> - <html:link rel="match" href="ellipse-ref.svg" /> + <html:link rel="match" href="ellipse-ref.svg" /> + <html:meta name="fuzzy" content="maxDifference=0-53; totalPixels=0-278" /> <style> ellipse { cx: 6150px; diff --git a/tests/wpt/tests/svg/geometry/reftests/ellipse-003.svg b/tests/wpt/tests/svg/geometry/reftests/ellipse-003.svg index 6b81eadf1b7..a4f0ed141c5 100644 --- a/tests/wpt/tests/svg/geometry/reftests/ellipse-003.svg +++ b/tests/wpt/tests/svg/geometry/reftests/ellipse-003.svg @@ -3,7 +3,8 @@ xmlns:html="http://www.w3.org/1999/xhtml"> <title>Ellipse coordinates and radii specified by percentage</title> <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> - <html:link rel="match" href="ellipse-ref.svg" /> + <html:link rel="match" href="ellipse-ref.svg" /> + <html:meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4" /> <style> ellipse { cx: 25%; diff --git a/tests/wpt/tests/svg/shapes/rect-rx-set-by-css-expected.svg b/tests/wpt/tests/svg/shapes/rect-rx-set-by-css-expected.svg new file mode 100644 index 00000000000..2b53158c0ac --- /dev/null +++ b/tests/wpt/tests/svg/shapes/rect-rx-set-by-css-expected.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> + <rect width="100" height="100" rx="40" /> +</svg> diff --git a/tests/wpt/tests/svg/shapes/rect-rx-set-by-css-ref.svg b/tests/wpt/tests/svg/shapes/rect-rx-set-by-css-ref.svg new file mode 100644 index 00000000000..2b53158c0ac --- /dev/null +++ b/tests/wpt/tests/svg/shapes/rect-rx-set-by-css-ref.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> + <rect width="100" height="100" rx="40" /> +</svg> diff --git a/tests/wpt/tests/svg/shapes/rect-rx-set-by-css.svg b/tests/wpt/tests/svg/shapes/rect-rx-set-by-css.svg new file mode 100644 index 00000000000..375147a7d20 --- /dev/null +++ b/tests/wpt/tests/svg/shapes/rect-rx-set-by-css.svg @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> + <metadata> + <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG/shapes.html#RectElement"/> + <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-rx-set-by-css-ref.svg"/> + <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rx can be set via CSS."/> + </metadata> + <rect width="100" height="100" style="rx: 40px" /> +</svg> diff --git a/tests/wpt/tests/svg/struct/reftests/use-data-url-set-attributeName.tentative.svg b/tests/wpt/tests/svg/struct/reftests/use-data-url-set-attributeName.tentative.svg new file mode 100644 index 00000000000..248f218bd79 --- /dev/null +++ b/tests/wpt/tests/svg/struct/reftests/use-data-url-set-attributeName.tentative.svg @@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title><use> with a data: URL resource loaded by <set attributeName></title> + <h:link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElementHrefAttribute"/> + <h:link rel="match" href="reference/green-100x100.svg"/> + <rect width="100" height="100" fill="green"/> + <use> + <set attributeName="href" to="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IGlkPSJyZWQtcmVjdCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InJlZCIvPgo8L3N2Zz4=#red-rect"/> + </use> +</svg> diff --git a/tests/wpt/tests/svg/struct/reftests/use-data-url-setAttribute.tentative.html b/tests/wpt/tests/svg/struct/reftests/use-data-url-setAttribute.tentative.html new file mode 100644 index 00000000000..b28dd0ecf5b --- /dev/null +++ b/tests/wpt/tests/svg/struct/reftests/use-data-url-setAttribute.tentative.html @@ -0,0 +1,18 @@ +<!doctype HTML> +<meta charset="utf-8"> +<title>Testcase for changing a valid <use> to a data URL:</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElementHrefAttribute"> +<link rel="match" href="reference/green-100x100.html"> +<script> + function go() { + const use = document.querySelector("use"); + use.setAttribute("href", "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IGlkPSJvcmFuZ2UtcmVjdCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9Im9yYW5nZSIvPgo8L3N2Zz4=#orange-rect"); + } +</script> +<body onload="go()"> + <svg id="mySVG"> + <rect id="red" width="100" height="100" fill="red"></rect> + <rect id="green" width="100" height="100" fill="green"></rect> + <use x="100" y="0" href="#red"></use> + </svg> +</body> diff --git a/tests/wpt/tests/svg/struct/reftests/use-ref-inside-data-url.tentative.html b/tests/wpt/tests/svg/struct/reftests/use-ref-inside-data-url.tentative.html new file mode 100644 index 00000000000..d6ac2e3654a --- /dev/null +++ b/tests/wpt/tests/svg/struct/reftests/use-ref-inside-data-url.tentative.html @@ -0,0 +1,15 @@ +<!doctype HTML> +<meta charset="utf-8"> +<title>Testcase for where SVG loaded via data: uses #ref</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElementHrefAttribute"> +<link rel="match" href="reference/green-100x100.html"> +<body> +<!-- base64 SVG source: +<svg xmlns="http://www.w3.org/2000/svg"> + <rect id="green-rect" width="100" height="100" fill="green"/> + <rect width="100" height="100" fill="red"/> + <use href="#green-rect"/> +</svg> +--> +<img src="data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KICA8cmVjdCBpZD0iZ3JlZW4tcmVjdCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9ImdyZWVuIi8+DQogIDxyZWN0IHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBmaWxsPSJyZWQiLz4NCiAgPHVzZSBocmVmPSIjZ3JlZW4tcmVjdCIvPg0KPC9zdmc+"> +</body> diff --git a/tests/wpt/tests/tools/ci/ci_wptrunner_infrastructure.sh b/tests/wpt/tests/tools/ci/ci_wptrunner_infrastructure.sh index fc6907f8de6..9204f6a318b 100755 --- a/tests/wpt/tests/tools/ci/ci_wptrunner_infrastructure.sh +++ b/tests/wpt/tests/tools/ci/ci_wptrunner_infrastructure.sh @@ -13,7 +13,6 @@ run_infra_test() { main() { run_infra_test "chrome" "dev" run_infra_test "firefox" "nightly" - run_infra_test "firefox_android" "nightly" } main diff --git a/tests/wpt/tests/tools/ci/tc/tasks/test.yml b/tests/wpt/tests/tools/ci/tc/tasks/test.yml index cdb6687d065..def49808678 100644 --- a/tests/wpt/tests/tools/ci/tc/tasks/test.yml +++ b/tests/wpt/tests/tools/ci/tc/tasks/test.yml @@ -4,7 +4,7 @@ components: workerType: ci schedulerId: taskcluster-github deadline: "24 hours" - image: webplatformtests/wpt:0.55 + image: webplatformtests/wpt:0.56 maxRunTime: 7200 artifacts: public/results: @@ -545,7 +545,6 @@ tasks: - wpt-base - trigger-pr - browser-firefox - - browser-firefox_android command: ./tools/ci/ci_wptrunner_infrastructure.sh install: - python3-pip @@ -557,7 +556,6 @@ tasks: browser: - firefox - chrome - - firefox_android channel: experimental xvfb: true hosts: false diff --git a/tests/wpt/tests/tools/docker/Dockerfile b/tests/wpt/tests/tools/docker/Dockerfile index d54d8e94bd2..a9162559ab8 100644 --- a/tests/wpt/tests/tools/docker/Dockerfile +++ b/tests/wpt/tests/tools/docker/Dockerfile @@ -13,6 +13,7 @@ RUN apt-get -qqy update \ curl \ dbus-x11 \ earlyoom \ + fonts-noto \ fluxbox \ gdebi \ git \ diff --git a/tests/wpt/tests/tools/metadata/__init__.py b/tests/wpt/tests/tools/metadata/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/tools/metadata/__init__.py diff --git a/tests/wpt/tests/tools/metadata/meta/__init__.py b/tests/wpt/tests/tools/metadata/meta/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/tools/metadata/meta/__init__.py diff --git a/tests/wpt/tests/tools/metadata/meta/schema.py b/tests/wpt/tests/tools/metadata/meta/schema.py new file mode 100644 index 00000000000..b3c56736190 --- /dev/null +++ b/tests/wpt/tests/tools/metadata/meta/schema.py @@ -0,0 +1,31 @@ +from dataclasses import dataclass +from typing import Any, ClassVar, Dict, List, Optional, Set + +from ..schema import SchemaValue, validate_dict + +""" +YAML filename for meta files +""" +META_YML_FILENAME = "META.yml" + +@dataclass +class MetaFile(): + """documented structure of META files. + Reference: https://github.com/web-platform-tests/wpt/pull/18434 + """ + + """a link to the specification covered by the tests in the directory""" + spec: Optional[str] = None + """a list of GitHub account username belonging to people who are notified when pull requests + modify files in the directory + """ + suggested_reviewers: Optional[List[str]] = None + + _optional_keys: ClassVar[Set[str]] = {"spec", "suggested_reviewers"} + + def __init__(self, obj: Dict[str, Any]): + validate_dict(obj, optional_keys=MetaFile._optional_keys) + self.spec = SchemaValue.from_union([SchemaValue.from_str, SchemaValue.from_none], obj.get("spec")) + self.suggested_reviewers = SchemaValue.from_union( + [lambda x: SchemaValue.from_list(SchemaValue.from_str, x), SchemaValue.from_none], + obj.get("suggested_reviewers")) diff --git a/tests/wpt/tests/tools/metadata/meta/tests/__init__.py b/tests/wpt/tests/tools/metadata/meta/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/tools/metadata/meta/tests/__init__.py diff --git a/tests/wpt/tests/tools/metadata/meta/tests/test_schema.py b/tests/wpt/tests/tools/metadata/meta/tests/test_schema.py new file mode 100644 index 00000000000..31e13f356bb --- /dev/null +++ b/tests/wpt/tests/tools/metadata/meta/tests/test_schema.py @@ -0,0 +1,77 @@ +# mypy: allow-untyped-defs + +from dataclasses import asdict +from ..schema import MetaFile + +import pytest +import re + +@pytest.mark.parametrize( + "input,expected_result,expected_exception_type,exception_message", + [ + ( + { + "spec": "spec-value", + "suggested_reviewers": ["reviewer_1", "reviewer_2"] + }, + { + "spec": "spec-value", + "suggested_reviewers": ["reviewer_1", "reviewer_2"] + }, + None, + None + ), + ( + { + "spec": "spec-value", + }, + { + "spec": "spec-value", + "suggested_reviewers": None, + }, + None, + None + ), + ( + { + "suggested_reviewers": ["reviewer_1", "reviewer_2"] + }, + { + "spec": None, + "suggested_reviewers": ["reviewer_1", "reviewer_2"], + }, + None, + None + ), + ( + {}, + {"spec": None, "suggested_reviewers": None}, + None, + None + ), + ( + { + "spec": "spec-value", + "suggested_reviewers": ["reviewer_1", 3] + }, + None, + ValueError, + "Input value ['reviewer_1', 3] does not fit one of the expected values for the union" + ), + ( + { + "spec": "spec-value", + "suggested_reviewers": ["reviewer_1", "reviewer_2"], + "extra": "test" + }, + None, + ValueError, + "Object contains invalid keys: ['extra']" + ), + ]) +def test_meta_file(input, expected_result, expected_exception_type, exception_message): + if expected_exception_type: + with pytest.raises(expected_exception_type, match=re.escape(exception_message)): + MetaFile(input) + else: + assert expected_result == asdict(MetaFile(input)) diff --git a/tests/wpt/tests/tools/metadata/schema.py b/tests/wpt/tests/tools/metadata/schema.py new file mode 100644 index 00000000000..e21f3b4a8f3 --- /dev/null +++ b/tests/wpt/tests/tools/metadata/schema.py @@ -0,0 +1,78 @@ +from typing import Any, Callable, cast, Dict, Sequence, Set, TypeVar, Union + +T = TypeVar("T") + + +def validate_dict(obj: Any, required_keys: Set[str] = set(), optional_keys: Set[str] = set()) -> None: + """ + Validates the keys for a particular object + This logic ensures: + 1. the obj is type dict + 2. That at a minimum the provided required_keys are present. + Additionally, the logic checks for a set of optional_keys. With those two + sets of keys, the logic will raise an error if there are extra keys in obj. + :param obj: The object that will be checked. + :param required_keys: Set of required keys that the obj should have. + :param optional_keys: Set of optional keys that the obj should have. + :return: `None` if obj does not have any extra keys. + :raises ValueError: If there unexpected keys or missing required keys. + """ + if not isinstance(obj, dict): + raise ValueError(f"Object is not a dictionary. Input: {obj}") + extra_keys = set(obj.keys()) - required_keys - optional_keys + missing_required_keys = required_keys - set(obj.keys()) + if extra_keys: + raise ValueError(f"Object contains invalid keys: {sorted(extra_keys)}") + if missing_required_keys: + raise ValueError(f"Object missing required keys: {sorted(missing_required_keys)}") + + +class SchemaValue(): + """ + Set of helpers to convert raw input into an expected value for a given schema + """ + @staticmethod + def from_dict(x: Any) -> Dict[str, Any]: + if not isinstance(x, dict): + raise ValueError(f"Input value {x} is not a dict") + keys = x.keys() + for key in keys: + if not isinstance(key, str): + raise ValueError(f"Input value {x} contains key {key} that is not a string") + return cast(Dict[str, Any], x) + + + @staticmethod + def from_str(x: Any) -> str: + if not isinstance(x, str): + raise ValueError(f"Input value {x} is not a string") + return x + + + @staticmethod + def from_none(x: Any) -> None: + if x is not None: + raise ValueError(f"Input value {x} is not none") + return x + + + @staticmethod + def from_union(fs: + Sequence[Union[ + Callable[[Any], Sequence[T]], + Callable[[Any], T], + ]], + x: Any) -> Any: + for f in fs: + try: + return f(x) + except Exception: + pass + raise ValueError(f"Input value {x} does not fit one of the expected values for the union") + + + @staticmethod + def from_list(f: Callable[[Any], T], x: Any) -> Sequence[T]: + if not isinstance(x, list): + raise ValueError(f"Input value {x} is not a list") + return [f(y) for y in x] diff --git a/tests/wpt/tests/tools/metadata/tests/__init__.py b/tests/wpt/tests/tools/metadata/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/tools/metadata/tests/__init__.py diff --git a/tests/wpt/tests/tools/metadata/tests/test_schema.py b/tests/wpt/tests/tools/metadata/tests/test_schema.py new file mode 100644 index 00000000000..2803c5eea6a --- /dev/null +++ b/tests/wpt/tests/tools/metadata/tests/test_schema.py @@ -0,0 +1,94 @@ +# mypy: allow-untyped-defs + +from ..schema import SchemaValue, validate_dict +from dataclasses import dataclass, asdict + +import pytest +import re + +@pytest.mark.parametrize( + "input,kwargs,expected_result,expected_exception_type,exception_message", + [ + ({}, {}, None, None, None), + ("2", {}, None, ValueError, "Object is not a dictionary. Input: 2"), + ({"extra": 3}, {}, None, ValueError, "Object contains invalid keys: ['extra']"), + ({"required": 1}, {"required_keys": {"required"}}, None, None, None), + ({"optional": 2}, {"optional_keys": {"optional"}}, None, None, None), + ({"extra": 3, "optional": 2}, {"optional_keys": {"optional"}}, None, + ValueError, "Object contains invalid keys: ['extra']"), + ({"required": 1, "optional": 2}, {"required_keys": {"required"}, "optional_keys": {"optional"}}, None, None, None), + ({"optional": 2}, {"required_keys": {"required"}, "optional_keys": {"optional"}}, None, + ValueError, "Object missing required keys: ['required']"), + ]) +def test_validate_dict(input, kwargs, expected_result, expected_exception_type, exception_message): + if expected_exception_type: + with pytest.raises(expected_exception_type, match=re.escape(exception_message)): + validate_dict(input, **kwargs) + else: + expected_result == validate_dict(input, **kwargs) + + +@dataclass +class FromDictTestDataClass: + key: str + + def __init__(self, input): + self.key = input.get("key") + +@pytest.mark.parametrize( + "input,expected_result,expected_exception_type,exception_message", + [ + ({"key": "value"}, {"key": "value"}, None, None), + ({1: "value"}, None, ValueError, "Input value {1: 'value'} contains key 1 that is not a string"), + (3, None, ValueError, "Input value 3 is not a dict") + ]) +def test_from_dict(input, expected_result, expected_exception_type, exception_message): + if expected_exception_type: + with pytest.raises(expected_exception_type, match=exception_message): + FromDictTestDataClass(SchemaValue.from_dict(input)) + else: + assert expected_result == asdict(FromDictTestDataClass(SchemaValue.from_dict(input))) + + +@pytest.mark.parametrize( + "input,expected_result,expected_exception_type,exception_message", + [ + ("test", "test", None, None), + (2, None, ValueError, "Input value 2 is not a string") + ]) +def test_from_str(input, expected_result, expected_exception_type, exception_message): + if expected_exception_type: + with pytest.raises(expected_exception_type, match=exception_message): + SchemaValue.from_str(input) + else: + assert expected_result == SchemaValue.from_str(input) + + +@pytest.mark.parametrize( + "input,expected_result,expected_exception_type,exception_message", + [ + (["1", "2"], ["1", "2"], None, None), + (2, None, ValueError, "Input value 2 is not a list") + ]) +def test_from_list(input, expected_result, expected_exception_type, exception_message): + if expected_exception_type: + with pytest.raises(expected_exception_type, match=exception_message): + SchemaValue.from_list(SchemaValue.from_str, input) + else: + assert expected_result == SchemaValue.from_list(SchemaValue.from_str, input) + + +@pytest.mark.parametrize( + "input,expected_result,expected_exception_type,exception_message", + [ + ("test", "test", None, None), + (None, None, None, None), + (2, None, ValueError, "Input value 2 does not fit one of the expected values for the union") + ]) +def test_from_union(input,expected_result, expected_exception_type, exception_message): + union_input = [SchemaValue.from_str, SchemaValue.from_none] + if expected_exception_type: + with pytest.raises(expected_exception_type, match=exception_message): + SchemaValue.from_union(union_input, input) + else: + assert expected_result == SchemaValue.from_union(union_input, input) diff --git a/tests/wpt/tests/tools/metadata/yaml/__init__.py b/tests/wpt/tests/tools/metadata/yaml/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/tools/metadata/yaml/__init__.py diff --git a/tests/wpt/tests/tools/metadata/yaml/load.py b/tests/wpt/tests/tools/metadata/yaml/load.py new file mode 100644 index 00000000000..831f7e8fff1 --- /dev/null +++ b/tests/wpt/tests/tools/metadata/yaml/load.py @@ -0,0 +1,11 @@ +from typing import Any, Dict, IO +from ..meta.schema import SchemaValue + +import yaml + +def load_data_to_dict(f: IO[bytes]) -> Dict[str, Any]: + try: + raw_data = yaml.safe_load(f) + return SchemaValue.from_dict(raw_data) + except Exception as e: + raise e diff --git a/tests/wpt/tests/tools/metadata/yaml/requirements.txt b/tests/wpt/tests/tools/metadata/yaml/requirements.txt new file mode 100644 index 00000000000..cf39afa6b4c --- /dev/null +++ b/tests/wpt/tests/tools/metadata/yaml/requirements.txt @@ -0,0 +1 @@ +pyyaml==6.0.1 diff --git a/tests/wpt/tests/tools/metadata/yaml/tests/__init__.py b/tests/wpt/tests/tools/metadata/yaml/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/tools/metadata/yaml/tests/__init__.py diff --git a/tests/wpt/tests/tools/metadata/yaml/tests/test_file.py b/tests/wpt/tests/tools/metadata/yaml/tests/test_file.py new file mode 100644 index 00000000000..50a9b4e1a77 --- /dev/null +++ b/tests/wpt/tests/tools/metadata/yaml/tests/test_file.py @@ -0,0 +1,31 @@ +# mypy: allow-untyped-defs + +from ..load import load_data_to_dict +from io import StringIO + +import pytest +import yaml + +def test_load_data_to_dict(): + input_buffer = StringIO(""" +key: + - value1 + - value2 +""") + result = load_data_to_dict(input_buffer) + assert result == {"key": ["value1", "value2"]} + +def test_load_data_to_dict_not_dict(): + input_buffer = StringIO(""" +- key: 2 +""") + with pytest.raises(ValueError): + load_data_to_dict(input_buffer) + +def test_load_data_to_dict_invalid_yaml(): + input_buffer = StringIO(""" +key: 1 +- test: value +""") + with pytest.raises(yaml.parser.ParserError): + load_data_to_dict(input_buffer) diff --git a/tests/wpt/tests/tools/requirements_mypy.txt b/tests/wpt/tests/tools/requirements_mypy.txt index 45261d0321f..af20e5a9a76 100644 --- a/tests/wpt/tests/tools/requirements_mypy.txt +++ b/tests/wpt/tests/tools/requirements_mypy.txt @@ -5,7 +5,7 @@ tomli==2.0.1 typed-ast==1.5.5 types-atomicwrites==1.4.5.1 types-python-dateutil==2.8.19.14 -types-PyYAML==6.0.12.11 +types-PyYAML==6.0.12.12 types-requests==2.31.0.2 types-setuptools==68.0.0.3 types-six==1.16.21.9 diff --git a/tests/wpt/tests/tools/third_party/six/CHANGES b/tests/wpt/tests/tools/third_party/six/CHANGES index ffa702601b6..f3bf6a4a7f9 100644 --- a/tests/wpt/tests/tools/third_party/six/CHANGES +++ b/tests/wpt/tests/tools/third_party/six/CHANGES @@ -3,6 +3,31 @@ Changelog for six This file lists the changes in each six version. +1.16.0 +------ + +- Pull request #343, issue #341, pull request #349: Port _SixMetaPathImporter to + Python 3.10. + +1.15.0 +------ + +- Pull request #331: Optimize `six.ensure_str` and `six.ensure_binary`. + +1.14.0 +------ + +- Issue #288, pull request #289: Add `six.assertNotRegex`. + +- Issue #317: `six.moves._dummy_thread` now points to the `_thread` module on + Python 3.9+. Python 3.7 and later requires threading and deprecated the + `_dummy_thread` module. + +- Issue #308, pull request #314: Remove support for Python 2.6 and Python 3.2. + +- Issue #250, issue #165, pull request #251: `six.wraps` now ignores missing + attributes. This follows the Python 3.2+ standard library behavior. + 1.13.0 ------ @@ -81,7 +106,7 @@ This file lists the changes in each six version. - Issue #98: Fix `six.moves` race condition in multi-threaded code. -- Pull request #51: Add `six.view(keys|values|itmes)`, which provide dictionary +- Pull request #51: Add `six.view(keys|values|items)`, which provide dictionary views on Python 2.7+. - Issue #112: `six.moves.reload_module` now uses the importlib module on @@ -208,7 +233,7 @@ This file lists the changes in each six version. - Issue #40: Add import mapping for the Python 2 gdbm module. - Issue #35: On Python versions less than 2.7, print_ now encodes unicode - strings when outputing to standard streams. (Python 2.7 handles this + strings when outputting to standard streams. (Python 2.7 handles this automatically.) 1.4.1 diff --git a/tests/wpt/tests/tools/third_party/six/CONTRIBUTORS b/tests/wpt/tests/tools/third_party/six/CONTRIBUTORS new file mode 100644 index 00000000000..a76dffd51c2 --- /dev/null +++ b/tests/wpt/tests/tools/third_party/six/CONTRIBUTORS @@ -0,0 +1,44 @@ +The primary author and maintainer of six is Benjamin Peterson. He would like to +acknowledge the following people who submitted bug reports, pull requests, and +otherwise worked to improve six: + +Marc Abramowitz +immerrr again +Alexander Artemenko +Aymeric Augustin +Lee Ball +Ben Bariteau +Ned Batchelder +Wouter Bolsterlee +Brett Cannon +Jason R. Coombs +Julien Danjou +Ben Darnell +Ben Davis +Jon Dufresne +Tim Graham +Thomas Grainger +Max Grender-Jones +Pierre Grimaud +Joshua Harlow +Toshiki Kataoka +Hugo van Kemenade +Anselm Kruis +Ivan Levkivskyi +Alexander Lukanin +James Mills +Jordan Moldow +Berker Peksag +Sridhar Ratnakumar +Erik Rose +Mirko Rossini +Peter Ruibal +Miroslav Shubernetskiy +Eli Schwartz +Anthony Sottile +Victor Stinner +Jonathan Vanasco +Lucas Wiman +Jingxin Zhu + +If you think you belong on this list, please let me know! --Benjamin diff --git a/tests/wpt/tests/tools/third_party/six/LICENSE b/tests/wpt/tests/tools/third_party/six/LICENSE index 4b05a545261..de6633112c1 100644 --- a/tests/wpt/tests/tools/third_party/six/LICENSE +++ b/tests/wpt/tests/tools/third_party/six/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2019 Benjamin Peterson +Copyright (c) 2010-2020 Benjamin Peterson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/tests/wpt/tests/tools/third_party/six/README.rst b/tests/wpt/tests/tools/third_party/six/README.rst index a99e6f5585a..6339ba5d932 100644 --- a/tests/wpt/tests/tools/third_party/six/README.rst +++ b/tests/wpt/tests/tools/third_party/six/README.rst @@ -19,7 +19,7 @@ for smoothing over the differences between the Python versions with the goal of writing Python code that is compatible on both Python versions. See the documentation for more information on what is provided. -Six supports every Python version since 2.6. It is contained in only one Python +Six supports Python 2.7 and 3.3+. It is contained in only one Python file, so it can be easily copied into your project. (The copyright and license notice must be retained.) @@ -27,6 +27,3 @@ Online documentation is at https://six.readthedocs.io/. Bugs can be reported to https://github.com/benjaminp/six. The code can also be found there. - -For questions about six or porting in general, email the python-porting mailing -list: https://mail.python.org/mailman/listinfo/python-porting diff --git a/tests/wpt/tests/tools/third_party/six/documentation/conf.py b/tests/wpt/tests/tools/third_party/six/documentation/conf.py index b3d1328adc2..2f0f3238ae8 100644 --- a/tests/wpt/tests/tools/third_party/six/documentation/conf.py +++ b/tests/wpt/tests/tools/third_party/six/documentation/conf.py @@ -33,7 +33,7 @@ master_doc = "index" # General information about the project. project = u"six" -copyright = u"2010-2019, Benjamin Peterson" +copyright = u"2010-2020, Benjamin Peterson" sys.path.append(os.path.abspath(os.path.join(".", ".."))) from six import __version__ as six_version diff --git a/tests/wpt/tests/tools/third_party/six/documentation/index.rst b/tests/wpt/tests/tools/third_party/six/documentation/index.rst index b7ec2754ecf..45390b81b13 100644 --- a/tests/wpt/tests/tools/third_party/six/documentation/index.rst +++ b/tests/wpt/tests/tools/third_party/six/documentation/index.rst @@ -257,9 +257,10 @@ functions and methods is the stdlib :mod:`py3:inspect` module. .. decorator:: wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES) - This is exactly the :func:`py3:functools.wraps` decorator, but it sets the - ``__wrapped__`` attribute on what it decorates as :func:`py3:functools.wraps` - does on Python versions after 3.2. + This is Python 3.2's :func:`py3:functools.wraps` decorator. It sets the + ``__wrapped__`` attribute on what it decorates. It doesn't raise an error if + any of the attributes mentioned in ``assigned`` and ``updated`` are missing + on ``wrapped`` object. Syntax compatibility @@ -451,7 +452,7 @@ string data in all Python versions. .. function:: ensure_text(s, encoding='utf-8', errors='strict') Coerce *s* to :data:`text_type`. *encoding*, *errors* are the same as - :meth:`py3:str.encode` + :meth:`py3:bytes.decode` .. data:: StringIO @@ -509,6 +510,11 @@ Note these functions are only available on Python 2.7 or later. Alias for :meth:`~py3:unittest.TestCase.assertRegex` on Python 3 and :meth:`~py2:unittest.TestCase.assertRegexpMatches` on Python 2. +.. function:: assertNotRegex() + + Alias for :meth:`~py3:unittest.TestCase.assertNotRegex` on Python 3 and + :meth:`~py2:unittest.TestCase.assertNotRegexpMatches` on Python 2. + Renamed modules and attributes compatibility >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -590,7 +596,8 @@ Supported renames: +------------------------------+-------------------------------------+---------------------------------------+ | ``dbm_ndbm`` | :mod:`py2:dbm` | :mod:`py3:dbm.ndbm` | +------------------------------+-------------------------------------+---------------------------------------+ -| ``_dummy_thread`` | :mod:`py2:dummy_thread` | :mod:`py3:_dummy_thread` | +| ``_dummy_thread`` | :mod:`py2:dummy_thread` | :mod:`py3:_dummy_thread` (< 3.9) | +| | | :mod:`py3:_thread` (3.9+) | +------------------------------+-------------------------------------+---------------------------------------+ | ``email_mime_base`` | :mod:`py2:email.MIMEBase` | :mod:`py3:email.mime.base` | +------------------------------+-------------------------------------+---------------------------------------+ diff --git a/tests/wpt/tests/tools/third_party/six/setup.py b/tests/wpt/tests/tools/third_party/six/setup.py index 97c685b5a50..d90958b69d3 100644 --- a/tests/wpt/tests/tools/third_party/six/setup.py +++ b/tests/wpt/tests/tools/third_party/six/setup.py @@ -1,4 +1,4 @@ -# Copyright (c) 2010-2019 Benjamin Peterson +# Copyright (c) 2010-2020 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -54,5 +54,5 @@ setup(name="six", long_description=six_long_description, license="MIT", classifiers=six_classifiers, - python_requires=">=2.6, !=3.0.*, !=3.1.*", + python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*", ) diff --git a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/INSTALLER b/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e38a3..00000000000 --- a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/LICENSE b/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/LICENSE deleted file mode 100644 index de6633112c1..00000000000 --- a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2010-2020 Benjamin Peterson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/METADATA b/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/METADATA deleted file mode 100644 index 869bf25a884..00000000000 --- a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/METADATA +++ /dev/null @@ -1,49 +0,0 @@ -Metadata-Version: 2.1 -Name: six -Version: 1.15.0 -Summary: Python 2 and 3 compatibility utilities -Home-page: https://github.com/benjaminp/six -Author: Benjamin Peterson -Author-email: benjamin@python.org -License: MIT -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 3 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Utilities -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.* - -.. image:: https://img.shields.io/pypi/v/six.svg - :target: https://pypi.org/project/six/ - :alt: six on PyPI - -.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master - :target: https://travis-ci.org/benjaminp/six - :alt: six on TravisCI - -.. image:: https://readthedocs.org/projects/six/badge/?version=latest - :target: https://six.readthedocs.io/ - :alt: six's documentation on Read the Docs - -.. image:: https://img.shields.io/badge/license-MIT-green.svg - :target: https://github.com/benjaminp/six/blob/master/LICENSE - :alt: MIT License badge - -Six is a Python 2 and 3 compatibility library. It provides utility functions -for smoothing over the differences between the Python versions with the goal of -writing Python code that is compatible on both Python versions. See the -documentation for more information on what is provided. - -Six supports Python 2.7 and 3.3+. It is contained in only one Python -file, so it can be easily copied into your project. (The copyright and license -notice must be retained.) - -Online documentation is at https://six.readthedocs.io/. - -Bugs can be reported to https://github.com/benjaminp/six. The code can also -be found there. - - diff --git a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/RECORD b/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/RECORD deleted file mode 100644 index d9754c61c4d..00000000000 --- a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/RECORD +++ /dev/null @@ -1,8 +0,0 @@ -six-1.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-six-1.15.0.dist-info/LICENSE,sha256=i7hQxWWqOJ_cFvOkaWWtI9gq3_YPI5P8J2K2MYXo5sk,1066
-six-1.15.0.dist-info/METADATA,sha256=W6rlyoeMZHXh6srP9NXNsm0rjAf_660re8WdH5TBT8E,1795
-six-1.15.0.dist-info/RECORD,,
-six-1.15.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
-six-1.15.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
-six.py,sha256=U4Z_yv534W5CNyjY9i8V1OXY2SjAny8y2L5vDLhhThM,34159
-six.pyc,,
diff --git a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/WHEEL b/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/WHEEL deleted file mode 100644 index ef99c6cf328..00000000000 --- a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.34.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/top_level.txt b/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/top_level.txt deleted file mode 100644 index ffe2fce4989..00000000000 --- a/tests/wpt/tests/tools/third_party/six/six-1.15.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -six diff --git a/tests/wpt/tests/tools/third_party/six/six.py b/tests/wpt/tests/tools/third_party/six/six.py index 83f69783d1a..4e15675d8b5 100644 --- a/tests/wpt/tests/tools/third_party/six/six.py +++ b/tests/wpt/tests/tools/third_party/six/six.py @@ -29,7 +29,7 @@ import sys import types __author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.15.0" +__version__ = "1.16.0" # Useful for very coarse version differentiation. @@ -71,6 +71,11 @@ else: MAXSIZE = int((1 << 63) - 1) del X +if PY34: + from importlib.util import spec_from_loader +else: + spec_from_loader = None + def _add_doc(func, doc): """Add documentation to a function.""" @@ -186,6 +191,11 @@ class _SixMetaPathImporter(object): return self return None + def find_spec(self, fullname, path, target=None): + if fullname in self.known_modules: + return spec_from_loader(fullname, self) + return None + def __get_module(self, fullname): try: return self.known_modules[fullname] @@ -223,6 +233,12 @@ class _SixMetaPathImporter(object): return None get_source = get_code # same as get_code + def create_module(self, spec): + return self.load_module(spec.name) + + def exec_module(self, module): + pass + _importer = _SixMetaPathImporter(__name__) diff --git a/tests/wpt/tests/tools/third_party/six/test_six.py b/tests/wpt/tests/tools/third_party/six/test_six.py index 3eefce37c32..7b8b03b5e61 100644 --- a/tests/wpt/tests/tools/third_party/six/test_six.py +++ b/tests/wpt/tests/tools/third_party/six/test_six.py @@ -1,4 +1,4 @@ -# Copyright (c) 2010-2019 Benjamin Peterson +# Copyright (c) 2010-2020 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -121,34 +121,23 @@ def test_move_items(item_name): item = getattr(six.moves, item_name) if isinstance(item, types.ModuleType): __import__("six.moves." + item_name) - except AttributeError: - if item_name == "zip_longest" and sys.version_info < (2, 6): - pytest.skip("zip_longest only available on 2.6+") except ImportError: if item_name == "winreg" and not sys.platform.startswith("win"): pytest.skip("Windows only module") if item_name.startswith("tkinter"): if not have_tkinter: pytest.skip("requires tkinter") - if item_name == "tkinter_ttk" and sys.version_info[:2] <= (2, 6): - pytest.skip("ttk only available on 2.7+") if item_name.startswith("dbm_gnu") and not have_gdbm: pytest.skip("requires gdbm") raise - if sys.version_info[:2] >= (2, 6): - assert item_name in dir(six.moves) + assert item_name in dir(six.moves) @pytest.mark.parametrize("item_name", [item.name for item in six._urllib_parse_moved_attributes]) def test_move_items_urllib_parse(item_name): """Ensure that everything loads correctly.""" - if item_name == "ParseResult" and sys.version_info < (2, 5): - pytest.skip("ParseResult is only found on 2.5+") - if item_name in ("parse_qs", "parse_qsl") and sys.version_info < (2, 6): - pytest.skip("parse_qs[l] is new in 2.6") - if sys.version_info[:2] >= (2, 6): - assert item_name in dir(six.moves.urllib.parse) + assert item_name in dir(six.moves.urllib.parse) getattr(six.moves.urllib.parse, item_name) @@ -156,8 +145,7 @@ def test_move_items_urllib_parse(item_name): [item.name for item in six._urllib_error_moved_attributes]) def test_move_items_urllib_error(item_name): """Ensure that everything loads correctly.""" - if sys.version_info[:2] >= (2, 6): - assert item_name in dir(six.moves.urllib.error) + assert item_name in dir(six.moves.urllib.error) getattr(six.moves.urllib.error, item_name) @@ -165,8 +153,7 @@ def test_move_items_urllib_error(item_name): [item.name for item in six._urllib_request_moved_attributes]) def test_move_items_urllib_request(item_name): """Ensure that everything loads correctly.""" - if sys.version_info[:2] >= (2, 6): - assert item_name in dir(six.moves.urllib.request) + assert item_name in dir(six.moves.urllib.request) getattr(six.moves.urllib.request, item_name) @@ -174,8 +161,7 @@ def test_move_items_urllib_request(item_name): [item.name for item in six._urllib_response_moved_attributes]) def test_move_items_urllib_response(item_name): """Ensure that everything loads correctly.""" - if sys.version_info[:2] >= (2, 6): - assert item_name in dir(six.moves.urllib.response) + assert item_name in dir(six.moves.urllib.response) getattr(six.moves.urllib.response, item_name) @@ -183,8 +169,7 @@ def test_move_items_urllib_response(item_name): [item.name for item in six._urllib_robotparser_moved_attributes]) def test_move_items_urllib_robotparser(item_name): """Ensure that everything loads correctly.""" - if sys.version_info[:2] >= (2, 6): - assert item_name in dir(six.moves.urllib.robotparser) + assert item_name in dir(six.moves.urllib.robotparser) getattr(six.moves.urllib.robotparser, item_name) @@ -244,7 +229,6 @@ def test_zip(): assert six.advance_iterator(zip(range(2), range(2))) == (0, 0) -@pytest.mark.skipif("sys.version_info < (2, 6)") def test_zip_longest(): from six.moves import zip_longest it = zip_longest(range(2), range(1)) @@ -417,8 +401,6 @@ def test_dictionary_iterators(monkeypatch): monkeypatch.undo() -@pytest.mark.skipif("sys.version_info[:2] < (2, 7)", - reason="view methods on dictionaries only available on 2.7+") def test_dictionary_views(): d = dict(zip(range(10), (range(11, 20)))) for name in "keys", "values", "items": @@ -636,7 +618,6 @@ def test_raise_from(): # We should have done a raise f from None equivalent. assert val.__cause__ is None assert val.__context__ is ctx - if sys.version_info[:2] >= (3, 3): # And that should suppress the context on the exception. assert val.__suppress_context__ # For all versions the outer exception should have raised successfully. @@ -682,24 +663,6 @@ def test_print_(): assert out.flushed -@pytest.mark.skipif("sys.version_info[:2] >= (2, 6)") -def test_print_encoding(monkeypatch): - # Fool the type checking in print_. - monkeypatch.setattr(six, "file", six.BytesIO, raising=False) - out = six.BytesIO() - out.encoding = "utf-8" - out.errors = None - six.print_(six.u("\u053c"), end="", file=out) - assert out.getvalue() == six.b("\xd4\xbc") - out = six.BytesIO() - out.encoding = "ascii" - out.errors = "strict" - pytest.raises(UnicodeEncodeError, six.print_, six.u("\u053c"), file=out) - out.errors = "backslashreplace" - six.print_(six.u("\u053c"), end="", file=out) - assert out.getvalue() == six.b("\\u053c") - - def test_print_exceptions(): pytest.raises(TypeError, six.print_, x=3) pytest.raises(TypeError, six.print_, end=3) @@ -737,7 +700,6 @@ def test_with_metaclass(): assert Y.__mro__ == (Y, X, object) -@pytest.mark.skipif("sys.version_info[:2] < (2, 7)") def test_with_metaclass_typing(): try: import typing @@ -832,14 +794,33 @@ def test_wraps(): def f(g, assign, update): def w(): return 42 - w.glue = {"foo" : "bar"} + w.glue = {"foo": "bar"} + w.xyzzy = {"qux": "quux"} return six.wraps(g, assign, update)(w) - k.glue = {"melon" : "egg"} + k.glue = {"melon": "egg"} k.turnip = 43 - k = f(k, ["turnip"], ["glue"]) + k = f(k, ["turnip", "baz"], ["glue", "xyzzy"]) assert k.__name__ == "w" assert k.turnip == 43 - assert k.glue == {"melon" : "egg", "foo" : "bar"} + assert not hasattr(k, "baz") + assert k.glue == {"melon": "egg", "foo": "bar"} + assert k.xyzzy == {"qux": "quux"} + + +def test_wraps_raises_on_missing_updated_field_on_wrapper(): + """Ensure six.wraps doesn't ignore missing attrs wrapper. + + Because that's what happens in Py3's functools.update_wrapper. + """ + def wrapped(): + pass + + def wrapper(): + pass + + with pytest.raises(AttributeError, match='has no attribute.*xyzzy'): + six.wraps(wrapped, [], ['xyzzy'])(wrapper) + def test_add_metaclass(): @@ -935,7 +916,6 @@ def test_add_metaclass_nested(): assert A.B.__qualname__ == expected -@pytest.mark.skipif("sys.version_info[:2] < (2, 7) or sys.version_info[:2] in ((3, 0), (3, 1))") def test_assertCountEqual(): class TestAssertCountEqual(unittest.TestCase): def test(self): @@ -947,7 +927,6 @@ def test_assertCountEqual(): TestAssertCountEqual('test').test() -@pytest.mark.skipif("sys.version_info[:2] < (2, 7)") def test_assertRegex(): class TestAssertRegex(unittest.TestCase): def test(self): @@ -959,7 +938,17 @@ def test_assertRegex(): TestAssertRegex('test').test() -@pytest.mark.skipif("sys.version_info[:2] < (2, 7)") +def test_assertNotRegex(): + class TestAssertNotRegex(unittest.TestCase): + def test(self): + with self.assertRaises(AssertionError): + six.assertNotRegex(self, 'test', r'^t') + + six.assertNotRegex(self, 'test', r'^a') + + TestAssertNotRegex('test').test() + + def test_assertRaisesRegex(): class TestAssertRaisesRegex(unittest.TestCase): def test(self): diff --git a/tests/wpt/tests/tools/third_party/six/tox.ini b/tests/wpt/tests/tools/third_party/six/tox.ini new file mode 100644 index 00000000000..a1e34676267 --- /dev/null +++ b/tests/wpt/tests/tools/third_party/six/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist=py27,py33,py34,py35,py36,py37,py38,pypy,flake8 + +[testenv] +deps= pytest +commands= python -m pytest -rfsxX {posargs} + +[testenv:flake8] +basepython=python +deps=flake8 +commands= flake8 six.py diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/error.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/error.py index 75505ea88da..01935a6dadc 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/error.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/error.py @@ -35,6 +35,10 @@ class InvalidArgumentException(BidiException): error_code = "invalid argument" +class InvalidSelectorError(BidiException): + error_code = "invalid selector" + + class InvalidSessionIDError(BidiException): error_code = "invalid session id" diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py index e0371a79ecd..d34fb4f9e03 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py @@ -3,9 +3,11 @@ from enum import Enum from typing import Any, Dict, List, Mapping, MutableMapping, Optional, Union from ._module import BidiModule, command +from .script import OwnershipModel, SerializationOptions from ..undefined import UNDEFINED, Undefined + class ElementOptions(Dict[str, Any]): def __init__(self, element: Mapping[str, Any]): self["type"] = "element" @@ -130,6 +132,38 @@ class BrowsingContext(BidiModule): return params @command + def locate_nodes(self, + context: str, + locator: Mapping[str, Any], + max_node_count: Optional[int] = None, + ownership: Optional[OwnershipModel] = None, + sandbox: Optional[str] = None, + serialization_options: Optional[SerializationOptions] = None, + start_nodes: Optional[List[Mapping[str, Any]]] = None) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = {"context": context, "locator": locator} + if max_node_count is not None: + params["maxNodeCount"] = max_node_count + if ownership is not None: + params["ownership"] = ownership + if sandbox is not None: + params["sandbox"] = sandbox + if serialization_options is not None: + params["serializationOptions"] = serialization_options + if start_nodes is not None: + params["startNodes"] = start_nodes + return params + + @locate_nodes.result + def _locate_nodes(self, result: Mapping[str, Any]) -> Any: + assert result["context"] is not None + assert isinstance(result["context"], str) + + assert result["nodes"] is not None + assert isinstance(result["nodes"], List) + + return result + + @command def navigate(self, context: str, url: str, diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py index b82c8539e86..073aa637c97 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py @@ -3,6 +3,11 @@ from typing import Any, Dict, List, Mapping, MutableMapping, Optional, Union from ._module import BidiModule, command +class AuthCredentials(Dict[str, Any]): + def __init__(self, username: str, password: str): + dict.__init__(self, type="password", username=username, password=password) + + class URLPatternPattern(Dict[str, Any]): def __init__( self, @@ -58,11 +63,87 @@ class Network(BidiModule): return result["intercept"] @command + def continue_with_auth( + self, + request: str, + action: str, + credentials: Optional[AuthCredentials] = None + ) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "request": request, + "action": action, + } + + if action == "provideCredentials" and credentials is not None: + params["credentials"] = credentials + + return params + + @command + def continue_request(self, + request: str, + method: Optional[str] = None, + url: Optional[str] = None) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "request": request, + } + + if method is not None: + params["method"] = method + + if url is not None: + params["url"] = url + + # TODO: Add support for missing parameters: body, cookies, headers + + return params + + @command + def continue_response( + self, + request: str, + reason_phrase: Optional[str] = None, + status_code: Optional[int] = None) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "request": request, + } + + if reason_phrase is not None: + params["reasonPhrase"] = reason_phrase + + if status_code is not None: + params["statusCode"] = status_code + + # TODO: Add support for missing parameters: body, credentials, headers + + return params + + @command def fail_request(self, request: str) -> Mapping[str, Any]: params: MutableMapping[str, Any] = {"request": request} return params @command + def provide_response( + self, + request: str, + reason_phrase: Optional[str] = None, + status_code: Optional[int] = None) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "request": request, + } + + if reason_phrase is not None: + params["reasonPhrase"] = reason_phrase + + if status_code is not None: + params["statusCode"] = status_code + + # TODO: Add support for missing parameters: body, cookies, headers + + return params + + @command def remove_intercept(self, intercept: str) -> Mapping[str, Any]: params: MutableMapping[str, Any] = {"intercept": intercept} return params diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py index 2d81cab7983..69e3cbd0f1d 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py @@ -679,7 +679,7 @@ class TestRunnerManager(threading.Thread): # Due to inherent race conditions in EXTERNAL-TIMEOUT, we might # receive multiple test_ended for a test (e.g. from both Executor # and TestRunner), in which case we ignore the duplicate message. - self.logger.error("Received unexpected test_ended for %s" % test) + self.logger.warning("Received unexpected test_ended for %s" % test) return if self.timer is not None: self.timer.cancel() diff --git a/tests/wpt/tests/top-level-storage-access-api/tentative/requestStorageAccessFor.sub.https.window.js b/tests/wpt/tests/top-level-storage-access-api/tentative/requestStorageAccessFor.sub.https.window.js index 8af30c497f2..dd2975e49c0 100644 --- a/tests/wpt/tests/top-level-storage-access-api/tentative/requestStorageAccessFor.sub.https.window.js +++ b/tests/wpt/tests/top-level-storage-access-api/tentative/requestStorageAccessFor.sub.https.window.js @@ -93,9 +93,9 @@ promise_test( '[top-level-context] document.requestStorageAccessFor() should be resolved when called properly with a user gesture and the same origin'); promise_test( - async t => { - await RunCallbackWithGesture( - () => promise_rejects_dom(t, 'NotAllowedError', document.requestStorageAccessFor('bogus-url'), + async t =>{ + await RunCallbackWithGesture( + () => promise_rejects_js(t, TypeError, document.requestStorageAccessFor('bogus-url'), 'document.requestStorageAccessFor() call with bogus URL')); }, '[top-level-context] document.requestStorageAccessFor() should be rejected when called with an invalid origin'); diff --git a/tests/wpt/tests/trusted-types/trusted-types-event-handlers.html b/tests/wpt/tests/trusted-types/trusted-types-event-handlers.html index 57f8d3d90c4..9dd7133cbb0 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-event-handlers.html +++ b/tests/wpt/tests/trusted-types/trusted-types-event-handlers.html @@ -37,7 +37,9 @@ const element = document.createElement("div"); // element about which attributes it knows. const div = document.createElement("div"); for(name in div.__proto__) { - const should_be_event_handler = name.startsWith("on"); + // This captures all "on{foo}" handlers, but not "on" itself, which is an IDL + // attribute that returns an Observable. + const should_be_event_handler = name.startsWith("on") && name !== "on"; if (should_be_event_handler) { test(t => { assert_throws_js(TypeError, diff --git a/tests/wpt/tests/uievents/mouse/mousemove_prevent_default_action.tentative.html b/tests/wpt/tests/uievents/mouse/mousemove_prevent_default_action.tentative.html index 4d9772369b7..4caf98087fb 100644 --- a/tests/wpt/tests/uievents/mouse/mousemove_prevent_default_action.tentative.html +++ b/tests/wpt/tests/uievents/mouse/mousemove_prevent_default_action.tentative.html @@ -25,15 +25,17 @@ event_log.push(e.type); } - // Deliberately avoiding mouseup here because the last selectionchange - // may be fired before or after the mouseup. - document.addEventListener("mousedown", logEvents); - document.addEventListener("mousemove", e => e.preventDefault()); + function initialize(test) { + // Deliberately avoiding mouseup here because the last selectionchange + // may be fired before or after the mouseup. + addTestScopedListener(document, "mousedown", logEvents, test); + addTestScopedListener(document, "mousemove", e => e.preventDefault(), test); + event_log = []; + } promise_test(async test => { - document.addEventListener("selectionchange", logEvents); - test.add_cleanup(() => { document.removeEventListener("selectionchange", logEvents); }); - event_log = []; + initialize(test); + addTestScopedListener(document, "selectionchange", logEvents, test); const a = document.getElementById("a"); const b = document.getElementById("b"); @@ -60,18 +62,20 @@ }, "selectionchange event firing when mousemove event is prevented"); promise_test(async test => { - document.addEventListener("dragstart", logEvents); - test.add_cleanup(() => { document.removeEventListener("dragstart", logEvents); }); - event_log = []; + initialize(test); + addTestScopedListener(document, 'dragstart', (event) => { + // For this test, it is enough to see the dragstart event. The event is + // cancelled here to suppress the actual drag operation because Blink's + // implementation of test_driver doesn't seem to be able to dispatch any + // event once the dragging is active. + event.preventDefault(); + logEvents(event); + }, test); const b = document.getElementById("b"); const c = document.getElementById("c"); - let dragstart_promise = getEvent("dragstart", document); - - // A mouseup event is not expected. This avoids timing out when the - // dragstart event is missing. - let mouseup_promise = getEvent("mouseup", document); + const mouseup_promise = getEvent('mouseup', document); await new test_driver.Actions() .pointerMove(0, 0, {origin: c}) @@ -84,7 +88,7 @@ .pointerUp() .send(); - await Promise.race([dragstart_promise, mouseup_promise]); + await mouseup_promise; const expected_events = ["mousedown", "dragstart"]; diff --git a/tests/wpt/tests/uievents/mouse/resources/utils.js b/tests/wpt/tests/uievents/mouse/resources/utils.js index 669a2e2edd9..6f5f6f4b6cd 100644 --- a/tests/wpt/tests/uievents/mouse/resources/utils.js +++ b/tests/wpt/tests/uievents/mouse/resources/utils.js @@ -11,6 +11,14 @@ function getEvent(event_type, target) { }); } +// Adds a listener that is automatically removed at the end of the test. +function addTestScopedListener(target, type, listener, test) { + target.addEventListener(type, listener); + test.add_cleanup(() => { + target.removeEventListener(type, listener); + }); +} + // Returns a |Promise| that gets resolved with |event.data| when |window| // receives from |source| a "message" event whose |event.data.type| matches the string // |message_data_type|. diff --git a/tests/wpt/tests/visual-viewport/viewport-scrollbars-cause-resize-in-iframe.html b/tests/wpt/tests/visual-viewport/viewport-scrollbars-cause-resize-in-iframe.html new file mode 100644 index 00000000000..ce9ec327688 --- /dev/null +++ b/tests/wpt/tests/visual-viewport/viewport-scrollbars-cause-resize-in-iframe.html @@ -0,0 +1,41 @@ +<!doctype html> +<title>Viewport: Scrollbars Cause Resize</title> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, minimum-scale=1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="viewport_support.js"></script> +<h1>Viewport: Scrollbars Cause Resize In IFrame</h1> +<h4> + Test Description: This test checks that the appearance of classic + scrollbars will cause a resize event to be fired at window.visualViewport in iframe. +</h4> +<iframe srcdoc="<p>Hello, world!</p>"></iframe> +<script> + async_test(t => { + window.onload = () => { + const iframe = document.querySelector("iframe"); + + let resize_event_count = 0; + iframe.contentWindow.visualViewport.addEventListener("resize", () => { + resize_event_count++; + }); + + const originalVisualViewportWidth = iframe.contentWindow.visualViewport.width; + + iframe.contentDocument.body.style.height = "10000px"; + // Force layout to queue a resize event at this moment. + iframe.contentDocument.body.clientWidth; + + requestAnimationFrame(t.step_func_done(() => { + // it's uncontrollable whether the test will run + // with classic or overlay scrollbars in the case of Mac, + // so the check has to be conditional. + const width_changed = iframe.contentWindow.visualViewport.width !== originalVisualViewportWidth; + assert_equals(resize_event_count, width_changed ? 1 : 0); + })); + } + }, "the appearance of classic scrollbars will fire a resize event" + + "at window.visualViewport in iframe"); +</script> +<div id="log"></div> diff --git a/tests/wpt/tests/web-animations/crashtests/color-mix-crashtest.html b/tests/wpt/tests/web-animations/crashtests/color-mix-crashtest.html deleted file mode 100644 index 91d29464f50..00000000000 --- a/tests/wpt/tests/web-animations/crashtests/color-mix-crashtest.html +++ /dev/null @@ -1,35 +0,0 @@ -<!DOCTYPE html> -<html class="test-wait"> -<title>Interpolation of a color-mix function with currentcolor should not crash</title> -<!-- crbug.com/1493430 --> -<style type="text/css"> - @keyframes colorize { - from { color: forestgreen; } - to { color: plum; } - } - #target { - animation: colorize 1s Infinite alternate; - border: 1px solid transparent; - transition: border-color 1s ease-in-out; - } - #target.update { - border-color: - color-mix(in hsl longer hue, hsl(120 100% 50%) 20%, - currentcolor); - } -</style> -<body> - <div id="target">Hello world</div> -</body> -<script src="../testcommon.js"></script> -<script> - window.onload = async () => { - await waitForNextFrame(); - target.classList.add('update'); - await Promise.all(document.getAnimations().map(a => a.resolve)); - await waitForNextFrame(); - await waitForNextFrame(); - document.documentElement.classList.remove('test-wait'); - }; -</script> -</html> diff --git a/tests/wpt/tests/webauthn/createcredential-hints.https.html b/tests/wpt/tests/webauthn/createcredential-hints.https.html new file mode 100644 index 00000000000..a662bcef46f --- /dev/null +++ b/tests/wpt/tests/webauthn/createcredential-hints.https.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>WebAuthn createWithHints</title> +<meta name="timeout" content="long"> +<link rel="help" href="https://w3c.github.io/webauthn/#sctn-public-key-easy"> +<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="helpers.js"></script> +<script src="resources/utils.js"></script> +<script> +function testCreateWithHints() { + "use strict"; + + // The 'hints' parameter affects UI, which cannot be tested with WPTs. + // However, we can check that unknown values are ignored, as they + // should be, and don't trigger an error. + standardSetup(function() { + promise_test(async t => { + return createCredential({ + options: { + publicKey: { + hints: ["not-a-defined-value"], + }, + }, + }); + }); + }); +} + +testCreateWithHints(); +</script> +</head> +<body></body> +</html> diff --git a/tests/wpt/tests/webauthn/getcredential-hints.https.html b/tests/wpt/tests/webauthn/getcredential-hints.https.html new file mode 100644 index 00000000000..45f6e6b48e2 --- /dev/null +++ b/tests/wpt/tests/webauthn/getcredential-hints.https.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>navigator.credentials.get() with hints</title> +<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=helpers.js></script> +<body></body> +<script> +standardSetup(async function() { + "use strict"; + + const credPromise = createCredential(); + + // The 'hints' parameter affects UI, which cannot be tested with WPTs. + // However, we can check that unknown values are ignored, as they + // should be, and don't trigger an error. + new GetCredentialsTest("options.publicKey.hints", ["not-a-defined-value"]) + .addCredential(credPromise) + .runTest("navigator.credentials.get with hints"); +}, {}); +</script> diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/clip.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/clip.py index 4e37c4714c3..8300e962b92 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/clip.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/clip.py @@ -263,23 +263,71 @@ async def test_clip_box_partially_visible( assert comparison.equal() -async def test_clip_box_outside_of_window_viewport(bidi_session, top_context): +@pytest.mark.parametrize("origin", ["document", "viewport"]) +async def test_clip_box_outside_of_window_viewport( + bidi_session, top_context, inline, compare_png_bidi, origin +): + element_styles = "background-color: black; width: 50px; height:50px;" viewport_dimensions = await get_viewport_dimensions(bidi_session, top_context) - with pytest.raises(error.UnableToCaptureScreenException): - await bidi_session.browsing_context.capture_screenshot( + # Render the element outside of viewport. + url = inline( + f"""<div style="{element_styles} margin-top: {viewport_dimensions["height"]}px"></div>""" + ) + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + element = await bidi_session.script.call_function( + await_promise=False, + function_declaration="""() => document.querySelector('div')""", + target=ContextTarget(top_context["context"]), + ) + element_coordinates = await get_element_coordinates( + bidi_session, top_context, element + ) + element_dimensions = await get_physical_element_dimensions( + bidi_session, top_context, element + ) + + if origin == "viewport": + with pytest.raises(error.UnableToCaptureScreenException): + await bidi_session.browsing_context.capture_screenshot( + context=top_context["context"], + clip=BoxOptions( + x=element_coordinates[0], + y=element_coordinates[1], + width=element_dimensions[0], + height=element_dimensions[1], + ), + ) + else: + data = await bidi_session.browsing_context.capture_screenshot( context=top_context["context"], clip=BoxOptions( - x=viewport_dimensions["width"], - y=viewport_dimensions["height"], - width=1, - height=1, + x=element_coordinates[0], + y=element_coordinates[1], + width=element_dimensions[0], + height=element_dimensions[1], ), + origin="document", ) + assert png_dimensions(data) == element_dimensions + + # Render an element inside of viewport for the reference. + reference_data = await get_reference_screenshot( + bidi_session, + inline, + top_context["context"], + f"""<div style="{element_styles}"></div>""", + ) + + comparison = await compare_png_bidi(reference_data, data) + assert comparison.equal() +@pytest.mark.parametrize("origin", ["document", "viewport"]) async def test_clip_element_outside_of_window_viewport( - bidi_session, top_context, inline + bidi_session, top_context, inline, compare_png_bidi, origin ): viewport_dimensions = await get_viewport_dimensions(bidi_session, top_context) @@ -297,8 +345,31 @@ async def test_clip_element_outside_of_window_viewport( target=ContextTarget(top_context["context"]), ) - with pytest.raises(error.UnableToCaptureScreenException): - await bidi_session.browsing_context.capture_screenshot( + if origin == "viewport": + with pytest.raises(error.UnableToCaptureScreenException): + await bidi_session.browsing_context.capture_screenshot( + context=top_context["context"], + clip=ElementOptions(element=element), + ) + else: + data = await bidi_session.browsing_context.capture_screenshot( context=top_context["context"], clip=ElementOptions(element=element), + origin="document", + ) + + expected_size = await get_physical_element_dimensions( + bidi_session, top_context, element + ) + assert png_dimensions(data) == expected_size + + # Render an element inside of viewport for the reference. + reference_data = await get_reference_screenshot( + bidi_session, + inline, + top_context["context"], + f"""<div style="{element_styles}"></div>""", ) + + comparison = await compare_png_bidi(reference_data, data) + assert comparison.equal() diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/invalid.py index 58481c4e7ad..6fef42a48f0 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/invalid.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/capture_screenshot/invalid.py @@ -6,7 +6,6 @@ from webdriver.bidi.modules.browsing_context import ( ElementOptions, FormatOptions, ) -from webdriver.bidi.modules.script import ContextTarget pytestmark = pytest.mark.asyncio @@ -128,6 +127,14 @@ async def test_params_clip_box_dimensions_invalid_value(bidi_session, top_contex ) +@pytest.mark.parametrize("value", [False, 42, [], {}]) +async def test_params_origin_invalid_type(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.capture_screenshot( + context=top_context["context"], origin=value + ) + + async def test_params_origin_invalid_value(bidi_session, top_context): with pytest.raises(error.InvalidArgumentException): await bidi_session.browsing_context.capture_screenshot( diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/__init__.py diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/context.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/context.py new file mode 100644 index 00000000000..6aac78a48ba --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/context.py @@ -0,0 +1,15 @@ +import pytest +import webdriver.bidi.error as error + + +@pytest.mark.asyncio +async def test_params_context_invalid_value(bidi_session, inline, top_context): + url = inline("""<div>foo</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + with pytest.raises(error.NoSuchFrameException): + await bidi_session.browsing_context.locate_nodes( + context="foo", locator={ "type": "css", "value": "div" } + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py new file mode 100644 index 00000000000..d549cf35de2 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py @@ -0,0 +1,153 @@ +import pytest +import webdriver.bidi.error as error + +pytestmark = pytest.mark.asyncio + + +MAX_INT = 9007199254740991 + + +async def navigate_to_page(bidi_session, inline, top_context): + url = inline("""<div>foo</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_context_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=value, locator={"type": "css", "value": "div"} + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_locator_type_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], locator={ "type": value, "value": "div" } + ) + + +@pytest.mark.parametrize("type", ["", "invalid"]) +async def test_params_locator_type_invalid_value(bidi_session, inline, top_context, type): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], locator={ "type": type, "value": "div" } + ) + + +@pytest.mark.parametrize("type,value", [ + ("css", "a*b"), + ("xpath", ""), + ("xpath", "invalid-xpath") + ("innerText", "") +]) +async def test_params_locator_value_invalid_value(bidi_session, inline, top_context, type, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidSelectorException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], locator={ "type": type, "value": value } + ) + + +@pytest.mark.parametrize("value", [False, "string", 1.5, {}, []]) +async def test_params_max_node_count_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div" }, + max_node_count=value + ) + + +@pytest.mark.parametrize("value", [0, MAX_INT + 1]) +async def test_params_max_node_count_invalid_value(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "invalid", "value": "div" }, + max_node_count=value + ) + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_params_ownership_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div" }, + ownership=value + ) + + +async def test_params_ownership_invalid_value(bidi_session, inline, top_context): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div" }, + ownership="foo" + ) + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_params_sandbox_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div" }, + sandbox=value + ) + + +@pytest.mark.parametrize("value", [False, 42, "foo", []]) +async def test_params_serialization_options_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div" }, + serialization_options=value + ) + + +@pytest.mark.parametrize("value", [False, "string", 42, {}]) +async def test_params_start_nodes_invalid_type(bidi_session, inline, top_context, value): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div" }, + start_nodes=value + ) + + +async def test_params_start_nodes_empty_list(bidi_session, inline, top_context): + await navigate_to_page(bidi_session, inline, top_context) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "invalid", "value": "div" }, + start_nodes=[] + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py new file mode 100644 index 00000000000..656eaddc1fc --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py @@ -0,0 +1,207 @@ +import pytest + +from ... import any_string, recursive_compare + + +@pytest.mark.parametrize("type,value", [ + ("css", "div"), + ("xpath", "//div"), + ("innerText", "foobarBARbaz") +]) +@pytest.mark.asyncio +async def test_find_by_locator(bidi_session, inline, top_context, type, value): + url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": type, "value": value } + ) + + expected = [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"two"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + } + ] + + recursive_compare(expected, result["nodes"]) + + +@pytest.mark.parametrize("ignore_case,match_type,max_depth,value,expected", [ + (True, "full", None, "bar", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 1, + "children": [], + "localName": "strong", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 1, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (False, "full", None, "BAR", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 1, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (True, "partial", None, "ba", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 1, + "localName": "strong", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 1, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (False, "partial", None, "ba", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 1, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (True, "full", 0, "foobarbarbaz", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 4, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (False, "full", 0, "foobarBARbaz", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 4, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (True, "partial", 0, "bar", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 4, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ), + (False, "partial", 0, "BAR", [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {}, + "childNodeCount": 4, + "localName": "span", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }] + ) +], ids=[ + "ignore_case_true_full_match_no_max_depth", + "ignore_case_false_full_match_no_max_depth", + "ignore_case_true_partial_match_no_max_depth", + "ignore_case_false_partial_match_no_max_depth", + "ignore_case_true_full_match_max_depth_zero", + "ignore_case_false_full_match_max_depth_zero", + "ignore_case_true_partial_match_max_depth_zero", + "ignore_case_false_partial_match_max_depth_zero", +]) +@pytest.mark.asyncio +async def test_find_by_inner_text(bidi_session, inline, top_context, ignore_case, match_type, max_depth, value, expected): + url = inline("""<div>foo<span><strong>bar</strong></span><span>BAR</span>baz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ + "type": "innerText", + "value": value, + "ignoreCase": ignore_case, + "matchType": match_type, + "maxDepth": max_depth + } + ) + + recursive_compare(expected, result["nodes"]) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py new file mode 100644 index 00000000000..9147fb31832 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py @@ -0,0 +1,139 @@ +import pytest + +from ... import any_string, recursive_compare + + +@pytest.mark.parametrize("type,value,max,expected", [ + ("css", "div", 1, [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }] + ), + ("xpath", "//div", 1, [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }] + ), + ("innerText", "foo", 1, [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }] + ), + ("css", "div", 10, [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"two"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }] + ), + ("xpath", "//div", 10, [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"two"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }] + ), + ("innerText", "foo", 10, [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"two"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + }, + }] + ) +], ids=[ + "css_single", + "xpath_single", + "inner_text_single", + "css_multiple", + "xpath_multiple", + "inner_text_multiple" +]) +@pytest.mark.asyncio +async def test_find_by_css_limit_return_count(bidi_session, inline, top_context, type, value, max_count, expected): + url = inline("""<div data-class="one">foo</div><div data-class="two">foo</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": type, "value": value }, + max_node_count = max_count + ) + + recursive_compare(expected, result["nodes"]) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py new file mode 100644 index 00000000000..d5450ffc80c --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py @@ -0,0 +1,26 @@ +import pytest + +from webdriver.bidi.modules.script import assert_handle + + +@pytest.mark.parametrize("ownership,has_handle", [ + ("root", True), + ("none", False) +]) +@pytest.mark.asyncio +async def test_root_ownership_of_located_nodes(bidi_session, inline, top_context, ownership, has_handle): + url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + ownership=ownership + ) + + assert result["nodes"].length == 1 + result_node = result["nodes"][0] + + assert_handle(result_node, has_handle) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py new file mode 100644 index 00000000000..7f9cd9dfd85 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py @@ -0,0 +1,113 @@ +import pytest + +from webdriver.bidi.modules.script import ContextTarget,OwnershipModel + + +@pytest.mark.asyncio +async def test_locate_nodes_in_sandbox(bidi_session, inline, top_context): + url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + sandbox="sandbox" + ) + + assert len(result["nodes"]) == 1 + node_id = result["nodes"][0]["sharedId"] + + # Since the node was found in the sandbox, it should be available + # to scripts running in the sandbox. + result_in_sandbox = await bidi_session.script.call_function( + function_declaration="() => arguments[0]", + target=ContextTarget(top_context["context"], "sandbox"), + await_promise=True, + arguments=[ + { + "sharedId": node_id + } + ] + ) + assert result_in_sandbox["type"] == "node" + assert result_in_sandbox["sharedId"] == node_id + + +@pytest.mark.asyncio +async def test_locate_same_node_in_different_sandboxes_returns_same_id(bidi_session, inline, top_context): + url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + first_result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + sandbox="first_sandbox" + ) + + assert first_result["context"] == top_context["context"] + assert len(first_result["nodes"]) == 1 + + second_result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + sandbox="second_sandbox" + ) + assert len(second_result["nodes"]) == 1 + assert first_result["nodes"][0]["sharedId"] == second_result["nodes"][0]["sharedId"] + + +@pytest.mark.asyncio +async def test_locate_same_node_in_default_sandbox_returns_same_id_as_sandbox(bidi_session, inline, top_context): + url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" } + ) + + assert len(result["nodes"]) == 1 + node_id = result["nodes"][0]["sharedId"] + + result_in_sandbox = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + sandbox="sandbox" + ) + assert len(result_in_sandbox["nodes"]) == 1 + assert result_in_sandbox["nodes"][0]["sharedId"] == node_id + + +@pytest.mark.asyncio +async def test_locate_same_node_in_different_sandboxes_with_root_ownership_returns_different_handles(bidi_session, inline, top_context): + url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + first_result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + sandbox="first_sandbox", + ownership=OwnershipModel.ROOT + ) + + assert first_result["context"] == top_context["context"] + assert len(first_result["nodes"]) == 1 + + second_result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "div[data-class='one']" }, + sandbox="second_sandbox", + ownership=OwnershipModel.ROOT + ) + + assert len(second_result["nodes"]) == 1 + assert first_result["nodes"][0]["sharedId"] == second_result["nodes"][0]["sharedId"] + assert first_result["nodes"][0]["handle"] != second_result["nodes"][0]["handle"] diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/serialization_options.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/serialization_options.py new file mode 100644 index 00000000000..9d7e7a86138 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/serialization_options.py @@ -0,0 +1,65 @@ +import pytest + +from webdriver.bidi.modules.script import SerializationOptions +from ... import any_string, recursive_compare + + +@pytest.mark.parametrize("mode", [ + "open", + "closed" +]) +@pytest.mark.asyncio +async def test_locate_nodes_serialization_options(bidi_session, top_context, get_test_page, mode): + await bidi_session.browsing_context.navigate( + context=top_context["context"], + url=get_test_page(shadow_root_mode=mode), + wait="complete", + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": "css", "value": "custom-element" }, + serialization_options=SerializationOptions(include_shadow_tree="all", max_dom_depth=1) + ) + + expected = [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": { + "id": "custom-element", + }, + "childNodeCount": 0, + "localName": "custom-element", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + "shadowRoot": { + "type": "node", + "sharedId": any_string, + "value": { + "childNodeCount": 1, + "children": [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": { + "id": "in-shadow-dom" + }, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1 + } + } + ], + "mode": mode, + "nodeType": 11, + } + }, + } + } + ] + + recursive_compare(expected, result["nodes"]) diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py new file mode 100644 index 00000000000..3f46a50642c --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py @@ -0,0 +1,113 @@ +import pytest + +from webdriver.bidi.modules.script import ContextTarget +from ... import any_string, recursive_compare + + +@pytest.mark.parametrize("type,value", [ + ("css", "div"), + ("xpath", "//div"), + ("innerText", "foo") +]) +@pytest.mark.asyncio +async def test_locate_with_context_nodes(bidi_session, inline, top_context, type, value): + url = inline("""<p id="parent"><div data-class="one">foo</div><div data-class="two">foo</div></p>""") + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + context_nodes = await bidi_session.script.evaluate( + expression="""document.querySelector("p")""", + target=ContextTarget(top_context["context"]), + await_promise=True, + ) + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": type, "value": value }, + start_nodes=[context_nodes] + ) + + expected = [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"two"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + } + ] + + recursive_compare(expected, result["nodes"]) + + +@pytest.mark.parametrize("type,value", [ + ("css", "div[data-class='one']"), + ("xpath", ".//div[@data-class='one']"), + ("innerText", "foo") +]) +@pytest.mark.asyncio +async def test_locate_with_multiple_context_nodes(bidi_session, inline, top_context, type, value): + url = inline(""" + <p id="parent-one"><div data-class="one">foo</div><div data-class="two">bar</div></p> + <p id="parent-two"><div data-class="one">foo</div><div data-class="two">bar</div></p> + """) + await bidi_session.browsing_context.navigate( + context=top_context["context"], url=url, wait="complete" + ) + + script_result = await bidi_session.script.evaluate( + expression="""document.querySelectorAll("p")""", + target=ContextTarget(top_context["context"]), + await_promise=True, + ) + + context_nodes = script_result["value"] + + result = await bidi_session.browsing_context.locate_nodes( + context=top_context["context"], + locator={ "type": type, "value": value }, + start_nodes=context_nodes + ) + + expected = [ + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + }, + { + "type": "node", + "sharedId": any_string, + "value": { + "attributes": {"data-class":"one"}, + "childNodeCount": 1, + "localName": "div", + "namespaceURI": "http://www.w3.org/1999/xhtml", + "nodeType": 1, + } + } + ] + + recursive_compare(expected, result["nodes"]) diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse_multiclick.py b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse_multiclick.py index 87c29027b3a..35381053413 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse_multiclick.py +++ b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse_multiclick.py @@ -69,6 +69,45 @@ async def test_dblclick_at_coordinates( assert expected == filtered_events[1:] +async def test_no_dblclick_when_mouse_moves( + bidi_session, top_context, load_static_test_page +): + await load_static_test_page(page="test_actions.html") + + div_point = { + "x": 82, + "y": 187, + } + actions = Actions() + ( + actions.add_pointer() + .pointer_move(x=div_point["x"], y=div_point["y"]) + .pointer_down(button=0) + .pointer_up(button=0) + .pointer_move(x=div_point["x"] + 10, y=div_point["y"] + 10) + .pointer_down(button=0) + .pointer_up(button=0) + ) + + await bidi_session.input.perform_actions( + actions=actions, context=top_context["context"] + ) + + events = await get_events(bidi_session, top_context["context"]) + + expected = [ + {"type": "mousedown", "button": 0}, + {"type": "mouseup", "button": 0}, + {"type": "click", "button": 0}, + {"type": "mousedown", "button": 0}, + {"type": "mouseup", "button": 0}, + {"type": "click", "button": 0}, + ] + + filtered_events = [filter_dict(e, expected[0]) for e in events] + assert expected == filtered_events[1:] + + lots_of_text = ( "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud " diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py index f4f0cf295a7..c6b8e328859 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py @@ -275,3 +275,19 @@ HTTP_STATUS_AND_STATUS_TEXT = [ (504, "Gateway Timeout"), (505, "HTTP Version Not Supported"), ] + +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" +PAGE_EMPTY_SVG = "/webdriver/tests/bidi/network/support/empty.svg" +PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" +PAGE_OTHER_TEXT = "/webdriver/tests/bidi/network/support/other.txt" +PAGE_REDIRECT_HTTP_EQUIV = ( + "/webdriver/tests/bidi/network/support/redirect_http_equiv.html" +) +PAGE_REDIRECTED_HTML = "/webdriver/tests/bidi/network/support/redirected.html" + +AUTH_REQUIRED_EVENT = "network.authRequired" +BEFORE_REQUEST_SENT_EVENT = "network.beforeRequestSent" +RESPONSE_COMPLETED_EVENT = "network.responseCompleted" +RESPONSE_STARTED_EVENT = "network.responseStarted" diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/add_intercept.py b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/add_intercept.py index 8134d391189..7648eb1934f 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/add_intercept.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/add_intercept.py @@ -4,11 +4,15 @@ import uuid import pytest from webdriver.bidi.modules.script import ScriptEvaluateResultException -from .. import assert_before_request_sent_event - -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" -PAGE_OTHER_TEXT = "/webdriver/tests/bidi/network/support/other.txt" +from .. import ( + assert_before_request_sent_event, + PAGE_EMPTY_HTML, + PAGE_EMPTY_TEXT, + PAGE_OTHER_TEXT, + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_COMPLETED_EVENT, + RESPONSE_STARTED_EVENT, +) @pytest.mark.asyncio @@ -25,9 +29,9 @@ async def test_other_context( # Subscribe to network events only in top_context await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ], contexts=[top_context["context"]], ) @@ -65,9 +69,9 @@ async def test_other_url( ): await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ], ) @@ -107,9 +111,9 @@ async def test_two_intercepts( ): await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ], ) @@ -126,7 +130,7 @@ async def test_two_intercepts( ) # Perform a request to PAGE_EMPTY_TEXT, which should match both intercepts - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(text_url)) event = await wait_for_future_safe(on_network_event) @@ -137,7 +141,7 @@ async def test_two_intercepts( # Perform a request to PAGE_OTHER_TEXT, which should only match one intercept other_url = url(PAGE_OTHER_TEXT) - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(other_url)) event = await wait_for_future_safe(on_network_event) @@ -152,7 +156,7 @@ async def test_two_intercepts( # Requests to PAGE_EMPTY_TEXT should still be blocked, but only by one # intercept. - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(text_url)) event = await wait_for_future_safe(on_network_event) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py index 84b7d281322..dd322a23405 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py @@ -5,9 +5,15 @@ from .. import ( assert_response_event, ) -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" - -AUTH_REQUIRED_EVENT = "network.authRequired" +from .. import ( + assert_before_request_sent_event, + assert_response_event, + PAGE_EMPTY_TEXT, + AUTH_REQUIRED_EVENT, + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_COMPLETED_EVENT, + RESPONSE_STARTED_EVENT, +) pytestmark = pytest.mark.asyncio @@ -23,16 +29,16 @@ async def test_basic_authentication( ): network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.authRequired", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + AUTH_REQUIRED_EVENT, + RESPONSE_COMPLETED_EVENT, ] ) - before_request_sent_events = network_events["network.beforeRequestSent"] - response_started_events = network_events["network.responseStarted"] - auth_required_events = network_events["network.authRequired"] - response_completed_events = network_events["network.responseCompleted"] + before_request_sent_events = network_events[BEFORE_REQUEST_SENT_EVENT] + response_started_events = network_events[RESPONSE_STARTED_EVENT] + auth_required_events = network_events[AUTH_REQUIRED_EVENT] + response_completed_events = network_events[RESPONSE_COMPLETED_EVENT] auth_url = url("/webdriver/tests/support/http_handlers/authentication.py") intercept = await add_intercept( @@ -87,16 +93,16 @@ async def test_no_authentication( ): network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.authRequired", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + AUTH_REQUIRED_EVENT, + RESPONSE_COMPLETED_EVENT, ] ) - before_request_sent_events = network_events["network.beforeRequestSent"] - response_started_events = network_events["network.responseStarted"] - auth_required_events = network_events["network.authRequired"] - response_completed_events = network_events["network.responseCompleted"] + before_request_sent_events = network_events[BEFORE_REQUEST_SENT_EVENT] + response_started_events = network_events[RESPONSE_STARTED_EVENT] + auth_required_events = network_events[AUTH_REQUIRED_EVENT] + response_completed_events = network_events[RESPONSE_COMPLETED_EVENT] text_url = url(PAGE_EMPTY_TEXT) intercept = await add_intercept( @@ -106,7 +112,7 @@ async def test_no_authentication( assert isinstance(intercept, str) - on_network_event = wait_for_event("network.responseCompleted") + on_network_event = wait_for_event(RESPONSE_COMPLETED_EVENT) await fetch(text_url) await wait_for_future_safe(on_network_event) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phases.py b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phases.py index 787c5d16c4c..868f03041e2 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phases.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phases.py @@ -4,10 +4,12 @@ from webdriver.bidi.modules.script import ScriptEvaluateResultException from .. import ( assert_before_request_sent_event, assert_response_event, + PAGE_EMPTY_TEXT, + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_COMPLETED_EVENT, + RESPONSE_STARTED_EVENT, ) -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" - @pytest.mark.asyncio @pytest.mark.parametrize( @@ -32,14 +34,14 @@ async def test_request_response_phases( ): network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ] ) - before_request_sent_events = network_events["network.beforeRequestSent"] - response_started_events = network_events["network.responseStarted"] - response_completed_events = network_events["network.responseCompleted"] + before_request_sent_events = network_events[BEFORE_REQUEST_SENT_EVENT] + response_started_events = network_events[RESPONSE_STARTED_EVENT] + response_completed_events = network_events[RESPONSE_COMPLETED_EVENT] text_url = url(PAGE_EMPTY_TEXT) intercept = await add_intercept( @@ -97,9 +99,9 @@ async def test_not_listening_to_phase_event( phase, ): events = [ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ] # Remove the event corresponding to the intercept phase from the monitored diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/url_patterns.py b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/url_patterns.py index 4c8e7720ae8..517a94ffc4b 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/url_patterns.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/url_patterns.py @@ -2,7 +2,7 @@ import asyncio import pytest -from .. import assert_before_request_sent_event +from .. import assert_before_request_sent_event, BEFORE_REQUEST_SENT_EVENT @pytest.fixture @@ -67,7 +67,7 @@ async def test_pattern_patterns_matching( patterns, url_template, ): - await subscribe_events(events=["network.beforeRequestSent"], contexts=[top_context["context"]]) + await subscribe_events(events=[BEFORE_REQUEST_SENT_EVENT], contexts=[top_context["context"]]) for pattern in patterns: for key in pattern: @@ -77,7 +77,7 @@ async def test_pattern_patterns_matching( intercept = await add_intercept(phases=["beforeRequestSent"], url_patterns=patterns) - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(substitute_host(url_template))) event = await wait_for_future_safe(on_network_event) @@ -114,7 +114,7 @@ async def test_pattern_patterns_not_matching( pattern, url_template, ): - await subscribe_events(events=["network.beforeRequestSent"], contexts=[top_context["context"]]) + await subscribe_events(events=[BEFORE_REQUEST_SENT_EVENT], contexts=[top_context["context"]]) for key in pattern: pattern[key] = substitute_host(pattern[key]) @@ -123,7 +123,7 @@ async def test_pattern_patterns_not_matching( await add_intercept(phases=["beforeRequestSent"], url_patterns=[pattern]) - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(substitute_host(url_template))) event = await wait_for_future_safe(on_network_event) @@ -164,14 +164,14 @@ async def test_string_patterns_matching( pattern, url_template, ): - await subscribe_events(events=["network.beforeRequestSent"], contexts=[top_context["context"]]) + await subscribe_events(events=[BEFORE_REQUEST_SENT_EVENT], contexts=[top_context["context"]]) intercept = await add_intercept( phases=["beforeRequestSent"], url_patterns=[{"type": "string", "pattern": substitute_host(pattern)}], ) - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(substitute_host(url_template))) event = await wait_for_future_safe(on_network_event) @@ -206,14 +206,14 @@ async def test_string_patterns_not_matching( pattern, url_template, ): - await subscribe_events(events=["network.beforeRequestSent"], contexts=[top_context["context"]]) + await subscribe_events(events=[BEFORE_REQUEST_SENT_EVENT], contexts=[top_context["context"]]) await add_intercept( phases=["beforeRequestSent"], url_patterns=[{"type": "string", "pattern": substitute_host(pattern)}], ) - on_network_event = wait_for_event("network.beforeRequestSent") + on_network_event = wait_for_event(BEFORE_REQUEST_SENT_EVENT) asyncio.ensure_future(fetch(substitute_host(url_template))) event = await wait_for_future_safe(on_network_event) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py index 5a01937ecd0..9a24946cde9 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py @@ -1,10 +1,6 @@ import pytest -from .. import assert_response_event - -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" - -AUTH_REQUIRED_EVENT = "network.authRequired" +from .. import assert_response_event, AUTH_REQUIRED_EVENT, PAGE_EMPTY_HTML @pytest.mark.asyncio diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py index d869fdff7a7..cf818fee6f5 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py @@ -4,9 +4,7 @@ import pytest pytestmark = pytest.mark.asyncio -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" - -AUTH_REQUIRED_EVENT = "network.authRequired" +from .. import AUTH_REQUIRED_EVENT, PAGE_EMPTY_HTML # This test can be moved back to `auth_required.py` when all implementations 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 766a27672bc..c92337e5075 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 @@ -6,19 +6,19 @@ from webdriver.bidi.modules.script import ContextTarget from tests.support.sync import AsyncPoll -from .. import assert_before_request_sent_event - -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" -PAGE_REDIRECT_HTTP_EQUIV = ( - "/webdriver/tests/bidi/network/support/redirect_http_equiv.html" +from .. import ( + assert_before_request_sent_event, + PAGE_EMPTY_HTML, + PAGE_EMPTY_TEXT, + PAGE_REDIRECT_HTTP_EQUIV, + PAGE_REDIRECTED_HTML, + BEFORE_REQUEST_SENT_EVENT, ) -PAGE_REDIRECTED_HTML = "/webdriver/tests/bidi/network/support/redirected.html" @pytest.mark.asyncio async def test_subscribe_status(bidi_session, subscribe_events, top_context, wait_for_event, wait_for_future_safe, url, fetch): - await subscribe_events(events=["network.beforeRequestSent"]) + await subscribe_events(events=[BEFORE_REQUEST_SENT_EVENT]) await bidi_session.browsing_context.navigate( context=top_context["context"], @@ -33,11 +33,11 @@ async def test_subscribe_status(bidi_session, subscribe_events, top_context, wai events.append(data) remove_listener = bidi_session.add_event_listener( - "network.beforeRequestSent", on_event + BEFORE_REQUEST_SENT_EVENT, on_event ) text_url = url(PAGE_EMPTY_TEXT) - on_before_request_sent = wait_for_event("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await fetch(text_url) await wait_for_future_safe(on_before_request_sent) @@ -49,7 +49,7 @@ async def test_subscribe_status(bidi_session, subscribe_events, top_context, wai redirect_count=0, ) - await bidi_session.session.unsubscribe(events=["network.beforeRequestSent"]) + await bidi_session.session.unsubscribe(events=[BEFORE_REQUEST_SENT_EVENT]) # Fetch the text url again, with an additional parameter to bypass the cache # and check no new event is received. @@ -61,15 +61,48 @@ async def test_subscribe_status(bidi_session, subscribe_events, top_context, wai @pytest.mark.asyncio +async def test_iframe_load( + bidi_session, + top_context, + setup_network_test, + test_page, + test_page_same_origin_frame, +): + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] + + await bidi_session.browsing_context.navigate( + context=top_context["context"], + url=test_page_same_origin_frame, + wait="complete", + ) + + contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"]) + frame_context = contexts[0]["children"][0] + + assert len(events) == 2 + assert_before_request_sent_event( + events[0], + expected_request={"url": test_page_same_origin_frame}, + context=top_context["context"], + ) + assert_before_request_sent_event( + events[1], + expected_request={"url": test_page}, + context=frame_context["context"], + ) + + +@pytest.mark.asyncio async def test_load_page_twice( bidi_session, top_context, wait_for_event, url, setup_network_test, wait_for_future_safe ): html_url = url(PAGE_EMPTY_HTML) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + 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("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await bidi_session.browsing_context.navigate( context=top_context["context"], url=html_url, @@ -92,10 +125,10 @@ async def test_navigation_id( ): html_url = url(PAGE_EMPTY_HTML) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + 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("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) result = await bidi_session.browsing_context.navigate( context=top_context["context"], url=html_url, @@ -111,7 +144,7 @@ async def test_navigation_id( assert events[0]["navigation"] is not None text_url = url(PAGE_EMPTY_TEXT) - on_before_request_sent = wait_for_event("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await fetch(text_url, method="GET") await wait_for_future_safe(on_before_request_sent) @@ -143,10 +176,10 @@ async def test_request_method( ): text_url = url(PAGE_EMPTY_TEXT) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + 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("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await fetch(text_url, method=method) await wait_for_future_safe(on_before_request_sent) @@ -165,10 +198,10 @@ async def test_request_headers( ): text_url = url(PAGE_EMPTY_TEXT) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + 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("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await fetch(text_url, method="GET", headers={"foo": "bar"}) await wait_for_future_safe(on_before_request_sent) @@ -191,8 +224,8 @@ async def test_request_cookies( ): text_url = url(PAGE_EMPTY_TEXT) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] await bidi_session.script.evaluate( expression="document.cookie = 'foo=bar';", @@ -200,7 +233,7 @@ async def test_request_cookies( await_promise=False, ) - on_before_request_sent = wait_for_event("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await fetch(text_url, method="GET") await wait_for_future_safe(on_before_request_sent) @@ -222,7 +255,7 @@ async def test_request_cookies( await_promise=False, ) - on_before_request_sent = wait_for_event("network.beforeRequestSent") + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) await fetch(text_url, method="GET") await wait_for_future_safe(on_before_request_sent) @@ -250,8 +283,8 @@ async def test_redirect(bidi_session, wait_for_event, url, fetch, setup_network_ f"/webdriver/tests/support/http_handlers/redirect.py?location={text_url}" ) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] await fetch(redirect_url, method="GET") @@ -284,8 +317,8 @@ async def test_redirect_http_equiv( http_equiv_url = url(PAGE_REDIRECT_HTTP_EQUIV) redirected_url = url(PAGE_REDIRECTED_HTML) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] result = await bidi_session.browsing_context.navigate( context=top_context["context"], @@ -333,8 +366,8 @@ async def test_redirect_navigation( f"/webdriver/tests/support/http_handlers/redirect.py?location={html_url}" ) - network_events = await setup_network_test(events=["network.beforeRequestSent"]) - events = network_events["network.beforeRequestSent"] + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] result = await bidi_session.browsing_context.navigate( context=top_context["context"], diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/combined/network_events.py b/tests/wpt/tests/webdriver/tests/bidi/network/combined/network_events.py index 1a71dc2cdf4..7b6d99727ae 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/combined/network_events.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/combined/network_events.py @@ -5,10 +5,115 @@ import pytest from .. import ( assert_before_request_sent_event, assert_response_event, + PAGE_EMPTY_HTML, + PAGE_EMPTY_TEXT, + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_COMPLETED_EVENT, + RESPONSE_STARTED_EVENT, ) -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" + +@pytest.mark.asyncio +async def test_iframe_navigation_request( + bidi_session, + top_context, + subscribe_events, + setup_network_test, + inline, + test_page, + test_page_cross_origin, + test_page_same_origin_frame, +): + network_events = await setup_network_test( + events=[ + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, + ], + contexts=[top_context["context"]], + ) + + navigation_events = [] + + async def on_event(method, data): + navigation_events.append(data) + + remove_listener = bidi_session.add_event_listener( + "browsingContext.navigationStarted", on_event + ) + await subscribe_events(events=["browsingContext.navigationStarted"]) + + result = await bidi_session.browsing_context.navigate( + context=top_context["context"], url=test_page_same_origin_frame, wait="complete" + ) + + # Get the frame_context loaded in top_context + contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"]) + assert len(contexts[0]["children"]) == 1 + frame_context = contexts[0]["children"][0] + + assert len(navigation_events) == 2 + assert len(network_events[BEFORE_REQUEST_SENT_EVENT]) == 2 + assert len(network_events[RESPONSE_STARTED_EVENT]) == 2 + assert len(network_events[RESPONSE_COMPLETED_EVENT]) == 2 + + # Check that 2 distinct navigations were captured, for the expected contexts + assert navigation_events[0]["navigation"] == result["navigation"] + assert navigation_events[0]["context"] == top_context["context"] + assert navigation_events[1]["navigation"] != result["navigation"] + assert navigation_events[1]["context"] == frame_context["context"] + + # Helper to assert the 3 main network events for this test + def assert_events(event_index, url, context, navigation): + expected_request = {"method": "GET", "url": url} + expected_response = {"url": url} + assert_before_request_sent_event( + network_events[BEFORE_REQUEST_SENT_EVENT][event_index], + expected_request=expected_request, + context=context, + navigation=navigation, + ) + assert_response_event( + network_events[RESPONSE_STARTED_EVENT][event_index], + expected_response=expected_response, + context=context, + navigation=navigation, + ) + assert_response_event( + network_events[RESPONSE_COMPLETED_EVENT][event_index], + expected_response=expected_response, + context=context, + navigation=navigation, + ) + + assert_events( + 0, + url=test_page_same_origin_frame, + context=top_context["context"], + navigation=navigation_events[0]["navigation"], + ) + assert_events( + 1, + url=test_page, + context=frame_context["context"], + navigation=navigation_events[1]["navigation"], + ) + + # Navigate the iframe to another url + result = await bidi_session.browsing_context.navigate( + context=frame_context["context"], url=test_page_cross_origin, wait="complete" + ) + + assert len(navigation_events) == 3 + assert len(network_events[BEFORE_REQUEST_SENT_EVENT]) == 3 + assert len(network_events[RESPONSE_STARTED_EVENT]) == 3 + assert len(network_events[RESPONSE_COMPLETED_EVENT]) == 3 + assert_events( + 2, + url=test_page_cross_origin, + context=frame_context["context"], + navigation=navigation_events[2]["navigation"], + ) @pytest.mark.asyncio @@ -17,15 +122,15 @@ async def test_same_navigation_id( ): network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ], contexts=[top_context["context"]], ) html_url = url(PAGE_EMPTY_HTML) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) result = await bidi_session.browsing_context.navigate( context=top_context["context"], url=html_url, @@ -33,25 +138,25 @@ async def test_same_navigation_id( ) await wait_for_future_safe(on_response_completed) - assert len(network_events["network.beforeRequestSent"]) == 1 - assert len(network_events["network.responseStarted"]) == 1 - assert len(network_events["network.responseCompleted"]) == 1 + assert len(network_events[BEFORE_REQUEST_SENT_EVENT]) == 1 + assert len(network_events[RESPONSE_STARTED_EVENT]) == 1 + assert len(network_events[RESPONSE_COMPLETED_EVENT]) == 1 expected_request = {"method": "GET", "url": html_url} expected_response = {"url": html_url} assert_before_request_sent_event( - network_events["network.beforeRequestSent"][0], + network_events[BEFORE_REQUEST_SENT_EVENT][0], expected_request=expected_request, context=top_context["context"], navigation=result["navigation"], ) assert_response_event( - network_events["network.responseStarted"][0], + network_events[RESPONSE_STARTED_EVENT][0], expected_response=expected_response, context=top_context["context"], navigation=result["navigation"], ) assert_response_event( - network_events["network.responseCompleted"][0], + network_events[RESPONSE_COMPLETED_EVENT][0], expected_response=expected_response, context=top_context["context"], navigation=result["navigation"], @@ -62,17 +167,17 @@ async def test_same_navigation_id( async def test_same_request_id(wait_for_event, wait_for_future_safe, url, setup_network_test, fetch): network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ] ) - before_request_sent_events = network_events["network.beforeRequestSent"] - response_started_events = network_events["network.responseStarted"] - response_completed_events = network_events["network.responseCompleted"] + before_request_sent_events = network_events[BEFORE_REQUEST_SENT_EVENT] + response_started_events = network_events[RESPONSE_STARTED_EVENT] + response_completed_events = network_events[RESPONSE_COMPLETED_EVENT] text_url = url(PAGE_EMPTY_TEXT) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) await fetch(text_url) await wait_for_future_safe(on_response_completed) @@ -118,38 +223,38 @@ async def test_subscribe_to_one_context( network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ], contexts=[top_context["context"]], ) # Perform a fetch request in the subscribed context and wait for the response completed event. text_url = url(PAGE_EMPTY_TEXT) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) await fetch(text_url, context=top_context) await wait_for_future_safe(on_response_completed) - assert len(network_events["network.beforeRequestSent"]) == 1 - assert len(network_events["network.responseStarted"]) == 1 - assert len(network_events["network.responseCompleted"]) == 1 + assert len(network_events[BEFORE_REQUEST_SENT_EVENT]) == 1 + assert len(network_events[RESPONSE_STARTED_EVENT]) == 1 + assert len(network_events[RESPONSE_COMPLETED_EVENT]) == 1 # Check the received events have the correct context. expected_request = {"method": "GET", "url": text_url} expected_response = {"url": text_url} assert_before_request_sent_event( - network_events["network.beforeRequestSent"][0], + network_events[BEFORE_REQUEST_SENT_EVENT][0], expected_request=expected_request, context=top_context["context"], ) assert_response_event( - network_events["network.responseStarted"][0], + network_events[RESPONSE_STARTED_EVENT][0], expected_response=expected_response, context=top_context["context"], ) assert_response_event( - network_events["network.responseCompleted"][0], + network_events[RESPONSE_COMPLETED_EVENT][0], expected_response=expected_response, context=top_context["context"], ) @@ -159,6 +264,6 @@ async def test_subscribe_to_one_context( await asyncio.sleep(0.5) # Check that no other event was received. - assert len(network_events["network.beforeRequestSent"]) == 1 - assert len(network_events["network.responseStarted"]) == 1 - assert len(network_events["network.responseCompleted"]) == 1 + assert len(network_events[BEFORE_REQUEST_SENT_EVENT]) == 1 + assert len(network_events[RESPONSE_STARTED_EVENT]) == 1 + assert len(network_events[RESPONSE_COMPLETED_EVENT]) == 1 diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py index 668ffacc989..fb6dcc45dd7 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py @@ -1,14 +1,13 @@ import json +import asyncio import pytest import pytest_asyncio from webdriver.bidi.error import NoSuchInterceptException from webdriver.bidi.modules.script import ContextTarget -RESPONSE_COMPLETED_EVENT = "network.responseCompleted" - -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" +from . import PAGE_EMPTY_HTML, PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT @pytest_asyncio.fixture @@ -126,3 +125,36 @@ async def setup_network_test( # cleanup for remove_listener in listeners: remove_listener() + + +@pytest_asyncio.fixture +async def setup_blocked_request( + setup_network_test, url, add_intercept, fetch, wait_for_event +): + async def setup_blocked_request(phase): + await setup_network_test(events=[f"network.{phase}"]) + + if phase == "authRequired": + blocked_url = url( + "/webdriver/tests/support/http_handlers/authentication.py?realm=testrealm" + ) + else: + blocked_url = url(PAGE_EMPTY_TEXT) + + await add_intercept( + phases=[phase], + url_patterns=[ + { + "type": "string", + "pattern": blocked_url, + } + ], + ) + + asyncio.ensure_future(fetch(blocked_url)) + event = await wait_for_event(f"network.{phase}") + request = event["request"]["request"] + + return request + + return setup_blocked_request diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_request/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_request/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_request/__init__.py diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_request/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_request/invalid.py new file mode 100644 index 00000000000..cdc66cfaabb --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_request/invalid.py @@ -0,0 +1,67 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_params_method_invalid_type(setup_blocked_request, bidi_session, value): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_request(request=request, method=value) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_request_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_request(request=value) + + +@pytest.mark.parametrize("value", ["", "foo"]) +async def test_params_request_invalid_value(bidi_session, value): + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.continue_request(request=value) + + +async def test_params_request_no_such_request( + bidi_session, setup_network_test, wait_for_event, fetch, url +): + await setup_network_test( + events=[ + RESPONSE_COMPLETED_EVENT, + ] + ) + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) + + text_url = url(PAGE_EMPTY_TEXT) + await fetch(text_url) + + response_completed_event = await on_response_completed + request = response_completed_event["request"]["request"] + + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.continue_request(request=request) + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_params_url_invalid_type(setup_blocked_request, bidi_session, value): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_request(request=request, url=value) + + +@pytest.mark.parametrize("protocol", ["http", "https"]) +@pytest.mark.parametrize("value", [":invalid", "#invalid"]) +async def test_params_url_invalid_value( + setup_blocked_request, bidi_session, protocol, value +): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_request( + request=request, url=f"{protocol}://{value}" + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/__init__.py diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/invalid.py new file mode 100644 index 00000000000..b8e1c08e012 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/invalid.py @@ -0,0 +1,77 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT + +pytestmark = pytest.mark.asyncio + + +async def test_params_request_invalid_phase(setup_blocked_request, bidi_session): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_response(request=request) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_request_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_response(request=value) + + +@pytest.mark.parametrize("value", ["", "foo"]) +async def test_params_request_invalid_value(bidi_session, value): + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.continue_response(request=value) + + +async def test_params_request_no_such_request( + bidi_session, setup_network_test, wait_for_event, fetch, url +): + await setup_network_test( + events=[ + RESPONSE_COMPLETED_EVENT, + ] + ) + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) + + text_url = url(PAGE_EMPTY_TEXT) + await fetch(text_url) + + response_completed_event = await on_response_completed + request = response_completed_event["request"]["request"] + + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.continue_response(request=request) + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_params_reason_phrase_invalid_type( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("responseStarted") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_response( + request=request, reason_phrase=value + ) + + +@pytest.mark.parametrize("value", [False, "foo", {}, []]) +async def test_params_status_code_invalid_type( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("responseStarted") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_response(request=request, status_code=value) + + +@pytest.mark.parametrize("value", [-1, 4.3]) +async def test_params_status_code_invalid_value( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("responseStarted") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_response(request=request, status_code=value) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/__init__.py diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/invalid.py new file mode 100644 index 00000000000..ea188cbde88 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/invalid.py @@ -0,0 +1,141 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", ["beforeRequestSent", "responseStarted"]) +async def test_params_request_invalid_phase(setup_blocked_request, bidi_session, value): + request = await setup_blocked_request(value) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth(request=request, action="cancel") + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_request_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth(request=value, action="cancel") + + +@pytest.mark.parametrize("value", ["", "foo"]) +async def test_params_request_invalid_value(bidi_session, value): + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.continue_with_auth(request=value, action="cancel") + + +async def test_params_request_no_such_request( + bidi_session, setup_network_test, wait_for_event, fetch, url +): + await setup_network_test( + events=[ + RESPONSE_COMPLETED_EVENT, + ] + ) + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) + + text_url = url(PAGE_EMPTY_TEXT) + await fetch(text_url) + + response_completed_event = await on_response_completed + request = response_completed_event["request"]["request"] + + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.continue_with_auth(request=request, action="cancel") + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_action_invalid_type(setup_blocked_request, bidi_session, value): + request = await setup_blocked_request("authRequired") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth(request=request, action=value) + + +@pytest.mark.parametrize("value", ["", "foo"]) +async def test_params_action_invalid_value(setup_blocked_request, bidi_session, value): + request = await setup_blocked_request("authRequired") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth(request=request, action=value) + + +@pytest.mark.parametrize( + "value", + [ + {"type": "password", "password": "foo"}, + {"type": "password", "username": "foo"}, + { + "type": "password", + }, + { + "username": "foo", + "password": "bar", + }, + None, + ], + ids=[ + "missing username", + "missing password", + "missing username and password", + "missing type", + "missing credentials", + ], +) +async def test_params_action_provideCredentials_invalid_credentials( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("authRequired") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth( + request=request, action="provideCredentials", credentials=value + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_action_provideCredentials_credentials_type_invalid_type( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("authRequired") + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth( + request=request, action="provideCredentials", credentials={"type": value,} + ) + + +@pytest.mark.parametrize("value", ["", "foo"]) +async def test_params_action_provideCredentials_credentials_type_invalid_value( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("authRequired") + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth( + request=request, action="provideCredentials", credentials={"type": value,} + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_action_provideCredentials_credentials_username_invalid_type( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("authRequired") + credentials = {"type": "password", "username": value, "password": "foo"} + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth( + request=request, action="provideCredentials", credentials=credentials + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_action_provideCredentials_credentials_password_invalid_type( + setup_blocked_request, bidi_session, value +): + request = await setup_blocked_request("authRequired") + credentials = {"type": "password", "username": "foo", "password": value} + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.continue_with_auth( + request=request, action="provideCredentials", credentials=credentials + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/fail_request/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/fail_request/invalid.py index afbb44bd325..ead87c1a376 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/fail_request/invalid.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/fail_request/invalid.py @@ -1,9 +1,16 @@ import pytest import webdriver.bidi.error as error +from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT + pytestmark = pytest.mark.asyncio -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" + +async def test_params_request_invalid_phase(setup_blocked_request, bidi_session): + request = await setup_blocked_request("authRequired") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.fail_request(request=request) @pytest.mark.parametrize("value", [None, False, 42, {}, []]) @@ -18,18 +25,20 @@ async def test_params_request_invalid_value(bidi_session, value): await bidi_session.network.fail_request(request=value) -async def test_params_request_no_such_request(bidi_session, setup_network_test, - wait_for_event, wait_for_future_safe, - fetch, url): - await setup_network_test(events=[ - "network.responseCompleted", - ]) - on_response_completed = wait_for_event("network.responseCompleted") +async def test_params_request_no_such_request( + bidi_session, setup_network_test, wait_for_event, fetch, url +): + await setup_network_test( + events=[ + RESPONSE_COMPLETED_EVENT, + ] + ) + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) text_url = url(PAGE_EMPTY_TEXT) await fetch(text_url) - response_completed_event = await wait_for_future_safe(on_response_completed) + response_completed_event = await on_response_completed request = response_completed_event["request"]["request"] with pytest.raises(error.NoSuchRequestException): diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/provide_response/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/provide_response/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/provide_response/__init__.py diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/provide_response/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/provide_response/invalid.py new file mode 100644 index 00000000000..eec118a692d --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/provide_response/invalid.py @@ -0,0 +1,68 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_request_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.provide_response(request=value) + + +@pytest.mark.parametrize("value", ["", "foo"]) +async def test_params_request_invalid_value(bidi_session, value): + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.provide_response(request=value) + + +async def test_params_request_no_such_request( + bidi_session, setup_network_test, wait_for_event, fetch, url +): + await setup_network_test( + events=[ + RESPONSE_COMPLETED_EVENT, + ] + ) + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) + + text_url = url(PAGE_EMPTY_TEXT) + await fetch(text_url) + + response_completed_event = await on_response_completed + request = response_completed_event["request"]["request"] + + with pytest.raises(error.NoSuchRequestException): + await bidi_session.network.provide_response(request=request) + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_params_reason_phrase_invalid_type(setup_blocked_request, + bidi_session, + value): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.provide_response(request=request, + reason_phrase=value) + + +@pytest.mark.parametrize("value", [False, "foo", {}, []]) +async def test_params_status_code_invalid_type(setup_blocked_request, bidi_session, + value): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.provide_response(request=request, + status_code=value) + + +@pytest.mark.parametrize("value", [-1, 4.3]) +async def test_params_status_code_invalid_value(setup_blocked_request, bidi_session, value): + request = await setup_blocked_request("beforeRequestSent") + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.provide_response(request=request, + status_code=value) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/remove_intercept/remove_intercept.py b/tests/wpt/tests/webdriver/tests/bidi/network/remove_intercept/remove_intercept.py index 31b11153578..7935b94d2d1 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/remove_intercept/remove_intercept.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/remove_intercept/remove_intercept.py @@ -6,12 +6,14 @@ import pytest from .. import ( assert_before_request_sent_event, assert_response_event, + PAGE_EMPTY_HTML, + PAGE_EMPTY_TEXT, + PAGE_OTHER_TEXT, + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_COMPLETED_EVENT, + RESPONSE_STARTED_EVENT, ) -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" -PAGE_OTHER_TEXT = "/webdriver/tests/bidi/network/support/other.txt" - @pytest.mark.asyncio @pytest.mark.parametrize("phase", [ @@ -23,14 +25,14 @@ async def test_remove_intercept( ): network_events = await setup_network_test( events=[ - "network.beforeRequestSent", - "network.responseStarted", - "network.responseCompleted", + BEFORE_REQUEST_SENT_EVENT, + RESPONSE_STARTED_EVENT, + RESPONSE_COMPLETED_EVENT, ] ) - before_request_sent_events = network_events["network.beforeRequestSent"] - response_started_events = network_events["network.responseStarted"] - response_completed_events = network_events["network.responseCompleted"] + before_request_sent_events = network_events[BEFORE_REQUEST_SENT_EVENT] + response_started_events = network_events[RESPONSE_STARTED_EVENT] + response_completed_events = network_events[RESPONSE_COMPLETED_EVENT] text_url = url(PAGE_EMPTY_TEXT) intercept = await add_intercept( @@ -74,7 +76,7 @@ async def test_remove_intercept( await bidi_session.network.remove_intercept(intercept=intercept) # The next request should not be blocked - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) await bidi_session.browsing_context.navigate(context=top_context["context"], url=text_url, wait="complete") await wait_for_future_safe(on_response_completed) 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 513bfc31f74..b9b4ae727e5 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 @@ -5,15 +5,16 @@ import pytest from tests.support.sync import AsyncPoll -from .. import assert_response_event, HTTP_STATUS_AND_STATUS_TEXT - -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" -PAGE_EMPTY_SVG = "/webdriver/tests/bidi/network/support/empty.svg" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" - -RESPONSE_COMPLETED_EVENT = "network.responseCompleted" +from .. import ( + assert_response_event, + HTTP_STATUS_AND_STATUS_TEXT, + PAGE_EMPTY_HTML, + PAGE_EMPTY_IMAGE, + PAGE_EMPTY_SCRIPT, + PAGE_EMPTY_SVG, + PAGE_EMPTY_TEXT, + RESPONSE_COMPLETED_EVENT, +) @pytest.mark.asyncio @@ -88,6 +89,39 @@ async def test_subscribe_status(bidi_session, subscribe_events, top_context, wai @pytest.mark.asyncio +async def test_iframe_load( + bidi_session, + top_context, + setup_network_test, + test_page, + test_page_same_origin_frame, +): + network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT]) + events = network_events[RESPONSE_COMPLETED_EVENT] + + await bidi_session.browsing_context.navigate( + context=top_context["context"], + url=test_page_same_origin_frame, + wait="complete", + ) + + contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"]) + frame_context = contexts[0]["children"][0] + + assert len(events) == 2 + assert_response_event( + events[0], + expected_request={"url": test_page_same_origin_frame}, + context=top_context["context"], + ) + assert_response_event( + events[1], + expected_request={"url": test_page}, + context=frame_context["context"], + ) + + +@pytest.mark.asyncio async def test_load_page_twice( bidi_session, top_context, wait_for_event, wait_for_future_safe, url, setup_network_test ): diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py index 1b6f79f0356..6457e7d412b 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py @@ -3,9 +3,7 @@ import random from tests.support.sync import AsyncPoll -from .. import assert_response_event - -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" +from .. import assert_response_event, PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT @pytest.mark.asyncio @@ -18,15 +16,15 @@ async def test_cached( ): network_events = await setup_network_test( events=[ - "network.responseCompleted", + RESPONSE_COMPLETED_EVENT, ] ) - events = network_events["network.responseCompleted"] + events = network_events[RESPONSE_COMPLETED_EVENT] cached_url = url( f"/webdriver/tests/support/http_handlers/cached.py?status=200&nocache={random.random()}" ) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) await fetch(cached_url) await wait_for_future_safe(on_response_completed) @@ -46,7 +44,7 @@ async def test_cached( expected_response=expected_response, ) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) await fetch(cached_url) await wait_for_future_safe(on_response_completed) @@ -74,10 +72,10 @@ async def test_cached_redirect( ): network_events = await setup_network_test( events=[ - "network.responseCompleted", + RESPONSE_COMPLETED_EVENT, ] ) - events = network_events["network.responseCompleted"] + events = network_events[RESPONSE_COMPLETED_EVENT] text_url = url(PAGE_EMPTY_TEXT) cached_url = url( @@ -145,15 +143,15 @@ async def test_cached_revalidate( ): network_events = await setup_network_test( events=[ - "network.responseCompleted", + RESPONSE_COMPLETED_EVENT, ] ) - events = network_events["network.responseCompleted"] + events = network_events[RESPONSE_COMPLETED_EVENT] revalidate_url = url( f"/webdriver/tests/support/http_handlers/must-revalidate.py?nocache={random.random()}" ) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) await fetch(revalidate_url) await wait_for_future_safe(on_response_completed) @@ -170,7 +168,7 @@ async def test_cached_revalidate( expected_response=expected_response, ) - on_response_completed = wait_for_event("network.responseCompleted") + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) # Note that we pass a specific header so that the must-revalidate.py handler # can decide to return a 304 without having to use another URL. diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_status.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_status.py index 7d9e0865764..36e3da667e9 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_status.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_status.py @@ -11,9 +11,11 @@ import pytest -from .. import assert_response_event, HTTP_STATUS_AND_STATUS_TEXT - -RESPONSE_COMPLETED_EVENT = "network.responseCompleted" +from .. import ( + assert_response_event, + HTTP_STATUS_AND_STATUS_TEXT, + RESPONSE_COMPLETED_EVENT, +) @pytest.mark.parametrize( 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 4025be429b9..dec743e1755 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 @@ -4,15 +4,16 @@ import pytest from tests.support.sync import AsyncPoll -from .. import assert_response_event, HTTP_STATUS_AND_STATUS_TEXT - -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" -PAGE_EMPTY_SVG = "/webdriver/tests/bidi/network/support/empty.svg" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" - -RESPONSE_STARTED_EVENT = "network.responseStarted" +from .. import ( + assert_response_event, + HTTP_STATUS_AND_STATUS_TEXT, + PAGE_EMPTY_HTML, + PAGE_EMPTY_IMAGE, + PAGE_EMPTY_SCRIPT, + PAGE_EMPTY_SVG, + PAGE_EMPTY_TEXT, + RESPONSE_STARTED_EVENT, +) @pytest.mark.asyncio @@ -66,6 +67,39 @@ async def test_subscribe_status(bidi_session, subscribe_events, top_context, wai @pytest.mark.asyncio +async def test_iframe_load( + bidi_session, + top_context, + setup_network_test, + test_page, + test_page_same_origin_frame, +): + network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT]) + events = network_events[RESPONSE_STARTED_EVENT] + + await bidi_session.browsing_context.navigate( + context=top_context["context"], + url=test_page_same_origin_frame, + wait="complete", + ) + + contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"]) + frame_context = contexts[0]["children"][0] + + assert len(events) == 2 + assert_response_event( + events[0], + expected_request={"url": test_page_same_origin_frame}, + context=top_context["context"], + ) + assert_response_event( + events[1], + expected_request={"url": test_page}, + context=frame_context["context"], + ) + + +@pytest.mark.asyncio async def test_load_page_twice( bidi_session, top_context, wait_for_event, wait_for_future_safe, url, setup_network_test ): @@ -219,11 +253,11 @@ async def test_www_authenticate( events = network_events[RESPONSE_STARTED_EVENT] on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) - - # Note that here we explicitly do not navigate to the auth_url and instead - # simply do a fetch, because otherwise Firefox fails to cleanly cancel the - # authentication prompt on test teardown. - asyncio.ensure_future(fetch(auth_url, context=new_tab, method="GET")) + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=auth_url, + wait="none", + ) await wait_for_future_safe(on_response_started) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started_cached.py index 64907a7d484..2776950b0ec 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started_cached.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started_cached.py @@ -3,9 +3,7 @@ import random from tests.support.sync import AsyncPoll -from .. import assert_response_event - -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" +from .. import assert_response_event, PAGE_EMPTY_TEXT, RESPONSE_STARTED_EVENT @pytest.mark.asyncio @@ -18,15 +16,15 @@ async def test_cached( ): network_events = await setup_network_test( events=[ - "network.responseStarted", + RESPONSE_STARTED_EVENT, ] ) - events = network_events["network.responseStarted"] + events = network_events[RESPONSE_STARTED_EVENT] cached_url = url( f"/webdriver/tests/support/http_handlers/cached.py?status=200&nocache={random.random()}" ) - on_response_started = wait_for_event("network.responseStarted") + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) await fetch(cached_url) await wait_for_future_safe(on_response_started) @@ -46,7 +44,7 @@ async def test_cached( expected_response=expected_response, ) - on_response_started = wait_for_event("network.responseStarted") + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) await fetch(cached_url) await wait_for_future_safe(on_response_started) @@ -74,10 +72,10 @@ async def test_cached_redirect( ): network_events = await setup_network_test( events=[ - "network.responseStarted", + RESPONSE_STARTED_EVENT, ] ) - events = network_events["network.responseStarted"] + events = network_events[RESPONSE_STARTED_EVENT] text_url = url(PAGE_EMPTY_TEXT) cached_url = url( @@ -153,15 +151,15 @@ async def test_cached_revalidate( ): network_events = await setup_network_test( events=[ - "network.responseStarted", + RESPONSE_STARTED_EVENT, ] ) - events = network_events["network.responseStarted"] + events = network_events[RESPONSE_STARTED_EVENT] revalidate_url = url( f"/webdriver/tests/support/http_handlers/must-revalidate.py?nocache={random.random()}" ) - on_response_started = wait_for_event("network.responseStarted") + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) await fetch(revalidate_url, method=method) await wait_for_future_safe(on_response_started) @@ -178,7 +176,7 @@ async def test_cached_revalidate( expected_response=expected_response, ) - on_response_started = wait_for_event("network.responseStarted") + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) # Note that we pass a specific header so that the must-revalidate.py handler # can decide to return a 304 without having to use another URL. diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/remote_values.py b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/remote_values.py index ae8e55d7746..b9399662cdd 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/remote_values.py +++ b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/remote_values.py @@ -65,14 +65,17 @@ async def test_window_context_top_level(bidi_session, top_context, @pytest.mark.asyncio +@pytest.mark.parametrize("domain", ["", "alt"], + ids=["same_origin", "cross_origin"]) @pytest.mark.parametrize("await_promise", [True, False]) async def test_window_context_iframe_window(bidi_session, top_context, - test_page_same_origin_frame, - await_promise): + inline, domain, await_promise): + frame_url = inline("<div>foo</div>") + url = inline(f"<iframe src='{frame_url}'></iframe>", domain=domain) await bidi_session.browsing_context.navigate( context=top_context["context"], - url=test_page_same_origin_frame, + url=url, wait="complete", ) @@ -99,13 +102,17 @@ async def test_window_context_iframe_window(bidi_session, top_context, @pytest.mark.asyncio +@pytest.mark.parametrize("domain", ["", "alt"], + ids=["same_origin", "cross_origin"]) @pytest.mark.parametrize("await_promise", [True, False]) async def test_window_context_iframe_content_window( - bidi_session, top_context, test_page_same_origin_frame, await_promise): + bidi_session, top_context, inline, domain, await_promise): + frame_url = inline("<div>foo</div>") + url = inline(f"<iframe src='{frame_url}'></iframe>", domain=domain) await bidi_session.browsing_context.navigate( context=top_context["context"], - url=test_page_same_origin_frame, + url=url, wait="complete", ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/remote_values.py b/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/remote_values.py index d62f09e5df9..c3f29cbab5d 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/remote_values.py +++ b/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/remote_values.py @@ -37,13 +37,16 @@ async def test_window_context_top_level(bidi_session, top_context, await_promise @pytest.mark.asyncio +@pytest.mark.parametrize("domain", ["", "alt"], + ids=["same_origin", "cross_origin"]) @pytest.mark.parametrize("await_promise", [True, False]) async def test_window_context_iframe_window( - bidi_session, top_context, test_page_same_origin_frame, await_promise): - + bidi_session, top_context, inline, domain, await_promise): + frame_url = inline("<div>foo</div>") + url = inline(f"<iframe src='{frame_url}'></iframe>", domain=domain) await bidi_session.browsing_context.navigate( context=top_context["context"], - url=test_page_same_origin_frame, + url=url, wait="complete", ) @@ -67,13 +70,17 @@ async def test_window_context_iframe_window( @pytest.mark.asyncio +@pytest.mark.parametrize("domain", ["", "alt"], + ids=["same_origin", "cross_origin"]) @pytest.mark.parametrize("await_promise", [True, False]) async def test_window_context_iframe_content_window( - bidi_session, top_context, test_page_same_origin_frame, await_promise): + bidi_session, top_context, inline, domain, await_promise): + frame_url = inline("<div>foo</div>") + url = inline(f"<iframe src='{frame_url}'></iframe>", domain=domain) await bidi_session.browsing_context.navigate( context=top_context["context"], - url=test_page_same_origin_frame, + url=url, wait="complete", ) diff --git a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_dblclick.py b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_dblclick.py index 659e27bd5c8..de83e77d36a 100644 --- a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_dblclick.py +++ b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_dblclick.py @@ -31,3 +31,28 @@ def test_dblclick_at_coordinates(session, test_actions_page, mouse_chain, click_ assert len(events) == 8 filtered_events = [filter_dict(e, expected[0]) for e in events] assert expected == filtered_events[1:] + + +def test_no_dblclick_when_mouse_moves(session, test_actions_page, mouse_chain): + div_point = { + "x": 82, + "y": 187, + } + mouse_chain \ + .pointer_move(div_point["x"], div_point["y"]) \ + .click() \ + .pointer_move(div_point["x"] + 10, div_point["y"] + 10) \ + .click() \ + .perform() + events = get_events(session) + expected = [ + {"type": "mousedown", "button": 0}, + {"type": "mouseup", "button": 0}, + {"type": "click", "button": 0}, + {"type": "mousedown", "button": 0}, + {"type": "mouseup", "button": 0}, + {"type": "click", "button": 0}, + ] + assert len(events) == 7 + filtered_events = [filter_dict(e, expected[0]) for e in events] + assert expected == filtered_events[1:] diff --git a/tests/wpt/tests/webdriver/tests/support/http_handlers/headers.py b/tests/wpt/tests/webdriver/tests/support/http_handlers/headers.py index 71c4901c445..cb8d18d9644 100644 --- a/tests/wpt/tests/webdriver/tests/support/http_handlers/headers.py +++ b/tests/wpt/tests/webdriver/tests/support/http_handlers/headers.py @@ -16,4 +16,7 @@ def main(request, response): except ValueError: pass + if b"Content-Type" not in response.headers: + response.headers.set(b"Content-Type", "text/plain") + response.content = "HTTP Response Headers" diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/close-event.tentative.any.js b/tests/wpt/tests/webmessaging/message-channels/close-event/close-event.tentative.any.js deleted file mode 100644 index a793269ddee..00000000000 --- a/tests/wpt/tests/webmessaging/message-channels/close-event/close-event.tentative.any.js +++ /dev/null @@ -1,8 +0,0 @@ -// META: title=close event test - -async_test(t => { - const channel = new MessageChannel(); - channel.port1.start(); - channel.port1.onclose = t.step_func_done(); - channel.port1.dispatchEvent(new Event('close')); -}, 'Close event listener added with onclose must be called.'); diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js b/tests/wpt/tests/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js new file mode 100644 index 00000000000..85e4ad30add --- /dev/null +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/document-destroyed.tentative.window.js @@ -0,0 +1,43 @@ +// META: title=Close event test when the document is destroyed. +// 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/helper.js + +promise_test(async t => { + const rc = await addWindow(); + const waitForPort = expectMessagePortFromWindow(window); + await createMessageChannelAndSendPort(rc); + const closeEventPromise = createCloseEventPromise(await waitForPort); + rc.navigateToNew(); + await closeEventPromise; +}, 'The context is navigated to a new document and a close event is fired.') + +promise_test(async t => { + const rc = await addWindow(); + const waitForPort = expectMessagePortFromWindow(window); + await createMessageChannelAndSendPort(rc); + const closeEventPromise = createCloseEventPromise(await waitForPort); + rc.executeScript(() => window.close()); + await closeEventPromise; +}, 'The window is closed and a close event is fired.') + +promise_test(async t => { + let iframe; + const waitForLoad = new Promise(resolve => { + iframe = document.createElement('iframe'); + iframe.onload = resolve; + document.documentElement.appendChild(iframe); + }); + await waitForLoad; + + const waitForPort = expectMessagePortFromWindow(iframe.contentWindow); + const {port1, port2} = new MessageChannel(); + port1.start(); + iframe.contentWindow.postMessage('', '*', [port2]); + await waitForPort; + const closeEventPromise = createCloseEventPromise(port1); + iframe.remove(); + await closeEventPromise; +}, 'The iframe is deleted and a close event is fired.') diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js b/tests/wpt/tests/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js new file mode 100644 index 00000000000..c99e89f02b7 --- /dev/null +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.js @@ -0,0 +1,64 @@ +// META: timeout=long +// META: title=Confirm close event is not fired when the page enters BFCache and MessagePort still works after the page is restored. +// 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=/service-workers/service-worker/resources/test-helpers.sub.js +// META: script=/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js + +promise_test(async t => { + // Register a service worker. + const scope = + '/html/browsers/browsing-the-web/remote-context-helper/resources' + const workerUrl = + `/html/browsers/browsing-the-web/back-forward-cache/resources/` + + `service-worker.js?pipe=header(Service-Worker-Allowed,${scope})`; + const registration = + await service_worker_unregister_and_register(t, workerUrl, scope); + t.add_cleanup(_ => registration.unregister()); + await wait_for_state(t, registration.installing, 'activated'); + + // Open a window with noopener so that BFCache will work. + const rcHelper = new RemoteContextHelper(); + const rc1 = await rcHelper.addWindow( + /*extraConfig=*/ null, /*options=*/ {features: 'noopener'}); + + // Confirm the page is controlled. + assert_true( + await rc1.executeScript( + () => (navigator.serviceWorker.controller !== null)), + 'The page should be controlled before navigation'); + + // Send MessagePort to the service worker. + await rc1.executeScript(() => { + const {port1, port2} = new MessageChannel(); + port1.start(); + const ctrl = navigator.serviceWorker.controller; + ctrl.postMessage({type: 'storeMessagePort'}, [port2]); + self.waitForMessage = (sentMessage) => { + return new Promise(resolve => { + port1.addEventListener('message', (event) => { + resolve(event.data); + }); + port1.postMessage(sentMessage); + }); + }; + }); + + // Verify that the page was BFCached. + await assertBFCacheEligibility(rc1, /*shouldRestoreFromBFCache=*/ true); + + // Confirm MessagePort can still work after the page is restored from + // BFCache. + assert_equals( + await rc1.executeScript( + async () => + await self.waitForMessage('Confirm the ports can communicate')), + 'Receive message'); + + // Confirm the close event was not fired. + assert_false(await rc1.executeScript( + async () => + await self.waitForMessage('Ask if the close event was fired'))); +}, 'MessagePort still works after the page is restored from BFCache');
\ No newline at end of file diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js b/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js new file mode 100644 index 00000000000..612003d58ea --- /dev/null +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js @@ -0,0 +1,35 @@ +// META: title=Close event test when an entangled port is explicitly closed. +// 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/helper.js + +async_test(t => { + const channel = new MessageChannel(); + channel.port1.start(); + channel.port2.start(); + channel.port2.onclose = t.step_func_done(); + channel.port1.close(); +}, 'Close event on port2 is fired when port1 is explicitly closed'); + +async_test(t => { + const channel = new MessageChannel(); + channel.port1.start(); + channel.port2.start(); + channel.port1.onclose = + t.unreached_func('Should not fire a close event on port1'); + channel.port1.close(); + t.step_timeout(t.step_func_done(), 1000); +}, 'Close event on port1 is not fired when port1 is explicitly closed'); + +promise_test(async t => { + const rc = await addWindow(); + const waitForPort = expectMessagePortFromWindow(window); + await createMessageChannelAndSendPort(rc); + const closeEventPromise = createCloseEventPromise(await waitForPort); + rc.executeScript(() => { + window.closePort(); + }); + await closeEventPromise; +}, 'Close event on port2 is fired when port1, which is in a different window, is explicitly closed.') diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js b/tests/wpt/tests/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js new file mode 100644 index 00000000000..11f19c3b246 --- /dev/null +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/garbage-collected.tentative.any.js @@ -0,0 +1,23 @@ +// META: title=Close event test when an entangled port is GCed. +// META: script=/common/gc.js + +/** + * Create a new MessageChannel and return port1 and a weak reference to port2. + * It is expected that port2 will be garbage collected and a close event + * will be fired on port1. + * + * @returns {Array.<[MessagePort, WeakRef<MessagePort>]>} + */ +function createMessageChannelAndWeakReferToPort() { + const {port1, port2} = new MessageChannel(); + port1.start(); + return [port1, new WeakRef(port2)]; +} + +promise_test(async t => { + const [port1, weakport2] = createMessageChannelAndWeakReferToPort(); + const closeEventPromise = new Promise(resolve => port1.onclose = resolve); + garbageCollect(); + await closeEventPromise; + assert_equals(weakport2.deref(), undefined, 'port2 should be GCed'); +}, 'Entangled port is garbage collected, and the close event is fired.') diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js b/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js new file mode 100644 index 00000000000..cb9ea9fe981 --- /dev/null +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js @@ -0,0 +1,62 @@ +/** + * Create a new promise that resolves when the window receives + * the MessagePort and starts it. + * + * @param {Window} window - The window to wait for the MessagePort. + * @returns {Promise<MessagePort>} A promise you should await to ensure the + * window + * receives the MessagePort. + */ +function expectMessagePortFromWindow(window) { + return new Promise(resolve => { + window.onmessage = e => { + try { + assert_true(e.ports[0] instanceof window.MessagePort); + e.ports[0].start(); + resolve(e.ports[0]); + } catch (e) { + reject(e); + } + }; + }); +} + +/** + * Create a new MessageChannel and transfers one of the ports to + * the window which opened the window with a remote context provided + * as an argument. + * + * @param {RemoteContextWrapper} remoteContextWrapper + */ +async function createMessageChannelAndSendPort(remoteContextWrapper) { + await remoteContextWrapper.executeScript(() => { + const {port1, port2} = new MessageChannel(); + port1.start(); + window.opener.postMessage({}, '*', [port2]); + window.closePort = () => { + port1.close(); + } + }); +} + +/** + * Creates a window with a remote context. + * + * @returns {Promise<RemoteContextWrapper>} + */ +async function addWindow() { + const helper = new RemoteContextHelper(); + return helper.addWindow(); +} + +/** + * Creates a new promise that resolves when the close event is fired. + * + * @param {MessagePort} port - MessagePort on which the close event will + * be fired. + * @returns {Promise} A promise you should await to ensure the close event + * is dispatched. + */ +function createCloseEventPromise(port) { + return new Promise(resolve => port.onclose = resolve); +} diff --git a/tests/wpt/tests/webnn/elementwise_unary.https.any.js b/tests/wpt/tests/webnn/elementwise_unary.https.any.js index 27902a406fb..4cdfee5bcb0 100644 --- a/tests/wpt/tests/webnn/elementwise_unary.https.any.js +++ b/tests/wpt/tests/webnn/elementwise_unary.https.any.js @@ -8,6 +8,6 @@ // https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-unary testWebNNOperation( - ['abs', 'ceil', 'cos', 'exp', 'floor', 'identity', 'log', 'neg', 'reciprocal', 'sin', 'sqrt', 'tan'], + ['abs', 'ceil', 'cos', 'erf', 'exp', 'floor', 'identity', 'log', 'neg', 'reciprocal', 'sin', 'sqrt', 'tan'], buildOperationWithSingleInput );
\ No newline at end of file diff --git a/tests/wpt/tests/webnn/expand.https.any.js b/tests/wpt/tests/webnn/expand.https.any.js new file mode 100644 index 00000000000..11abb9baa89 --- /dev/null +++ b/tests/wpt/tests/webnn/expand.https.any.js @@ -0,0 +1,11 @@ +// META: title=test WebNN API expand operation +// META: global=window,dedicatedworker +// META: script=./resources/utils.js +// META: timeout=long + +'use strict'; + +// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-expand + +// reuse buildReshape method +testWebNNOperation('expand', buildReshape);
\ No newline at end of file diff --git a/tests/wpt/tests/webnn/gpu/elementwise_unary.https.any.js b/tests/wpt/tests/webnn/gpu/elementwise_unary.https.any.js index eff46315529..45978f91ec4 100644 --- a/tests/wpt/tests/webnn/gpu/elementwise_unary.https.any.js +++ b/tests/wpt/tests/webnn/gpu/elementwise_unary.https.any.js @@ -8,6 +8,6 @@ // https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-unary testWebNNOperation( - ['abs', 'ceil', 'cos', 'exp', 'floor', 'identity', 'log', 'neg', 'reciprocal', 'sin', 'sqrt', 'tan'], + ['abs', 'ceil', 'cos', 'erf', 'exp', 'floor', 'identity', 'log', 'neg', 'reciprocal', 'sin', 'sqrt', 'tan'], buildOperationWithSingleInput, 'gpu' );
\ No newline at end of file diff --git a/tests/wpt/tests/webnn/gpu/expand.https.any.js b/tests/wpt/tests/webnn/gpu/expand.https.any.js new file mode 100644 index 00000000000..82fa891a399 --- /dev/null +++ b/tests/wpt/tests/webnn/gpu/expand.https.any.js @@ -0,0 +1,11 @@ +// META: title=test WebNN API expand operation +// META: global=window,dedicatedworker +// META: script=../resources/utils.js +// META: timeout=long + +'use strict'; + +// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-expand + +// reuse buildReshape method +testWebNNOperation('expand', buildReshape, 'gpu');
\ No newline at end of file diff --git a/tests/wpt/tests/webnn/gpu/where.https.any.js b/tests/wpt/tests/webnn/gpu/where.https.any.js new file mode 100644 index 00000000000..ec0c5530a04 --- /dev/null +++ b/tests/wpt/tests/webnn/gpu/where.https.any.js @@ -0,0 +1,10 @@ +// META: title=test WebNN API where operation +// META: global=window,dedicatedworker +// META: script=../resources/utils.js +// META: timeout=long + +'use strict'; + +// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-where + +testWebNNOperation('where', buildWhere, 'gpu');
\ No newline at end of file diff --git a/tests/wpt/tests/webnn/resources/test_data/average_pool2d.json b/tests/wpt/tests/webnn/resources/test_data/average_pool2d.json index badcfc888d8..802e0d76462 100644 --- a/tests/wpt/tests/webnn/resources/test_data/average_pool2d.json +++ b/tests/wpt/tests/webnn/resources/test_data/average_pool2d.json @@ -1117,6 +1117,182 @@ } }, { + "name": "averagePool2d float32 4D tensor options.layout=nhwc and options.roundingType=floor", + "inputs": { + "input": { + "shape": [1, 5, 5, 2], + "data": [ + 22.975555502750634, + 91.59549689157087, + 78.15438048012338, + 65.64701225681809, + 9.68611138116071, + 55.14215004436653, + 51.29803808129347, + 18.432438840756184, + 32.19308601456918, + 49.34624267439973, + 87.65037289600019, + 15.648024969290454, + 87.25082191311348, + 68.02723372727797, + 39.49793996935087, + 20.342549040418124, + 80.09963591169489, + 26.72794900604616, + 10.220142557736978, + 64.87446829774323, + 52.60270021646585, + 46.56714896227794, + 1.4128639882603933, + 79.57832937136276, + 11.954064466077474, + 4.338463748959498, + 85.0007506374375, + 38.18383968382213, + 64.7837446465813, + 45.253981324455175, + 88.03128735720126, + 80.9717996657439, + 11.333851214909307, + 67.58124910163149, + 70.61659435728073, + 6.026499585657263, + 84.90442561999888, + 29.77881349289366, + 79.06688041781518, + 58.58993337807239, + 7.328724951604215, + 2.2384984647495054, + 35.97796581186121, + 14.505490166700486, + 10.17730631094398, + 68.72449589246624, + 1.4140757517112412, + 76.45657404642184, + 78.10038172113374, + 23.53263275794233 + ], + "type": "float32" + } + }, + "options": { + "windowDimensions": [3, 3], + "padding": [1, 0, 0, 1], + "strides": [2, 2], + "layout": "nhwc", + "roundingType": "floor" + }, + "expected": { + "name": "output", + "shape": [1, 2, 2, 2], + "data": [ + 54.20252990722656, + 52.73374557495117, + 37.16582489013672, + 39.1442985534668, + 50.038944244384766, + 43.23125457763672, + 58.46046447753906, + 32.67961120605469 + ], + "type": "float32" + } + }, + { + "name": "averagePool2d float32 4D tensor options.layout=nhwc and options.roundingType=ceil", + "inputs": { + "input": { + "shape": [1, 5, 5, 2], + "data": [ + 22.975555502750634, + 91.59549689157087, + 78.15438048012338, + 65.64701225681809, + 9.68611138116071, + 55.14215004436653, + 51.29803808129347, + 18.432438840756184, + 32.19308601456918, + 49.34624267439973, + 87.65037289600019, + 15.648024969290454, + 87.25082191311348, + 68.02723372727797, + 39.49793996935087, + 20.342549040418124, + 80.09963591169489, + 26.72794900604616, + 10.220142557736978, + 64.87446829774323, + 52.60270021646585, + 46.56714896227794, + 1.4128639882603933, + 79.57832937136276, + 11.954064466077474, + 4.338463748959498, + 85.0007506374375, + 38.18383968382213, + 64.7837446465813, + 45.253981324455175, + 88.03128735720126, + 80.9717996657439, + 11.333851214909307, + 67.58124910163149, + 70.61659435728073, + 6.026499585657263, + 84.90442561999888, + 29.77881349289366, + 79.06688041781518, + 58.58993337807239, + 7.328724951604215, + 2.2384984647495054, + 35.97796581186121, + 14.505490166700486, + 10.17730631094398, + 68.72449589246624, + 1.4140757517112412, + 76.45657404642184, + 78.10038172113374, + 23.53263275794233 + ], + "type": "float32" + } + }, + "options": { + "windowDimensions": [3, 3], + "padding": [1, 0, 0, 1], + "strides": [2, 2], + "layout": "nhwc", + "roundingType": "ceil" + }, + "expected": { + "name": "output", + "shape": [1, 3, 3, 2], + "data": [ + 54.20252990722656, + 52.73374557495117, + 37.16582489013672, + 39.1442985534668, + 21.206613540649414, + 57.1103515625, + 50.038944244384766, + 43.23125457763672, + 58.46046447753906, + 32.67961120605469, + 51.3569221496582, + 56.23945999145508, + 37.24428939819336, + 40.00800323486328, + 54.04661178588867, + 43.85149002075195, + 78.58363342285156, + 41.061283111572266 + ], + "type": "float32" + } + }, + { "name": "averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor", "inputs": { "input": { diff --git a/tests/wpt/tests/webnn/resources/test_data/erf.json b/tests/wpt/tests/webnn/resources/test_data/erf.json new file mode 100644 index 00000000000..8a9ae6e68c1 --- /dev/null +++ b/tests/wpt/tests/webnn/resources/test_data/erf.json @@ -0,0 +1,354 @@ +{ + "tests": [ + { + "name": "erf float32 0D scalar", + "inputs": { + "input": { + "shape": [], + "data": [ + -0.004352752727565523 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [], + "data": [ + -0.004911554511636496 + ], + "type": "float32" + } + }, + { + "name": "erf float32 1D tensor", + "inputs": { + "input": { + "shape": [24], + "data": [ + -0.5883062462825124, + -0.5323766618091814, + 0.127987056070479, + 0.5772181473181615, + 0.9045778906827358, + -0.49856746753516346, + 0.9843886624146143, + 0.21642259286228738, + 0.25235170684373465, + -0.14916697974435467, + 0.9136939573458718, + -0.5736439986742754, + 0.740446832641029, + 0.5202203195176929, + -0.16549504687505712, + 0.8005731834523444, + 0.4001320000966242, + -0.7489422658248586, + -0.8946002438575227, + -0.392025619231934, + 0.6854220843685903, + -0.674490045974586, + -0.4398081957860396, + 0.2709762572248531 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [24], + "data": [ + -0.5945858955383301, + -0.5484867095947266, + 0.14363321661949158, + 0.5856771469116211, + 0.7991966009140015, + -0.5192402005195618, + 0.8361185789108276, + 0.2404468059539795, + 0.27881762385368347, + -0.16707675158977509, + 0.8036975860595703, + -0.5827808976173401, + 0.7049695253372192, + 0.5380884408950806, + -0.1850501298904419, + 0.742441713809967, + 0.4285193383693695, + -0.710474967956543, + -0.7941843867301941, + -0.4207003712654114, + 0.6676210165023804, + -0.6598520874977112, + -0.46604686975479126, + 0.29844197630882263 + ], + "type": "float32" + } + }, + { + "name": "erf float32 2D tensor", + "inputs": { + "input": { + "shape": [4, 6], + "data": [ + -0.5883062462825124, + -0.5323766618091814, + 0.127987056070479, + 0.5772181473181615, + 0.9045778906827358, + -0.49856746753516346, + 0.9843886624146143, + 0.21642259286228738, + 0.25235170684373465, + -0.14916697974435467, + 0.9136939573458718, + -0.5736439986742754, + 0.740446832641029, + 0.5202203195176929, + -0.16549504687505712, + 0.8005731834523444, + 0.4001320000966242, + -0.7489422658248586, + -0.8946002438575227, + -0.392025619231934, + 0.6854220843685903, + -0.674490045974586, + -0.4398081957860396, + 0.2709762572248531 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [4, 6], + "data": [ + -0.5945858955383301, + -0.5484867095947266, + 0.14363321661949158, + 0.5856771469116211, + 0.7991966009140015, + -0.5192402005195618, + 0.8361185789108276, + 0.2404468059539795, + 0.27881762385368347, + -0.16707675158977509, + 0.8036975860595703, + -0.5827808976173401, + 0.7049695253372192, + 0.5380884408950806, + -0.1850501298904419, + 0.742441713809967, + 0.4285193383693695, + -0.710474967956543, + -0.7941843867301941, + -0.4207003712654114, + 0.6676210165023804, + -0.6598520874977112, + -0.46604686975479126, + 0.29844197630882263 + ], + "type": "float32" + } + }, + { + "name": "erf float32 3D tensor", + "inputs": { + "input": { + "shape": [2, 3, 4], + "data": [ + -0.5883062462825124, + -0.5323766618091814, + 0.127987056070479, + 0.5772181473181615, + 0.9045778906827358, + -0.49856746753516346, + 0.9843886624146143, + 0.21642259286228738, + 0.25235170684373465, + -0.14916697974435467, + 0.9136939573458718, + -0.5736439986742754, + 0.740446832641029, + 0.5202203195176929, + -0.16549504687505712, + 0.8005731834523444, + 0.4001320000966242, + -0.7489422658248586, + -0.8946002438575227, + -0.392025619231934, + 0.6854220843685903, + -0.674490045974586, + -0.4398081957860396, + 0.2709762572248531 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [2, 3, 4], + "data": [ + -0.5945858955383301, + -0.5484867095947266, + 0.14363321661949158, + 0.5856771469116211, + 0.7991966009140015, + -0.5192402005195618, + 0.8361185789108276, + 0.2404468059539795, + 0.27881762385368347, + -0.16707675158977509, + 0.8036975860595703, + -0.5827808976173401, + 0.7049695253372192, + 0.5380884408950806, + -0.1850501298904419, + 0.742441713809967, + 0.4285193383693695, + -0.710474967956543, + -0.7941843867301941, + -0.4207003712654114, + 0.6676210165023804, + -0.6598520874977112, + -0.46604686975479126, + 0.29844197630882263 + ], + "type": "float32" + } + }, + { + "name": "erf float32 4D tensor", + "inputs": { + "input": { + "shape": [2, 2, 2, 3], + "data": [ + -0.5883062462825124, + -0.5323766618091814, + 0.127987056070479, + 0.5772181473181615, + 0.9045778906827358, + -0.49856746753516346, + 0.9843886624146143, + 0.21642259286228738, + 0.25235170684373465, + -0.14916697974435467, + 0.9136939573458718, + -0.5736439986742754, + 0.740446832641029, + 0.5202203195176929, + -0.16549504687505712, + 0.8005731834523444, + 0.4001320000966242, + -0.7489422658248586, + -0.8946002438575227, + -0.392025619231934, + 0.6854220843685903, + -0.674490045974586, + -0.4398081957860396, + 0.2709762572248531 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [2, 2, 2, 3], + "data": [ + -0.5945858955383301, + -0.5484867095947266, + 0.14363321661949158, + 0.5856771469116211, + 0.7991966009140015, + -0.5192402005195618, + 0.8361185789108276, + 0.2404468059539795, + 0.27881762385368347, + -0.16707675158977509, + 0.8036975860595703, + -0.5827808976173401, + 0.7049695253372192, + 0.5380884408950806, + -0.1850501298904419, + 0.742441713809967, + 0.4285193383693695, + -0.710474967956543, + -0.7941843867301941, + -0.4207003712654114, + 0.6676210165023804, + -0.6598520874977112, + -0.46604686975479126, + 0.29844197630882263 + ], + "type": "float32" + } + }, + { + "name": "erf float32 5D tensor", + "inputs": { + "input": { + "shape": [2, 1, 4, 1, 3], + "data": [ + -0.5883062462825124, + -0.5323766618091814, + 0.127987056070479, + 0.5772181473181615, + 0.9045778906827358, + -0.49856746753516346, + 0.9843886624146143, + 0.21642259286228738, + 0.25235170684373465, + -0.14916697974435467, + 0.9136939573458718, + -0.5736439986742754, + 0.740446832641029, + 0.5202203195176929, + -0.16549504687505712, + 0.8005731834523444, + 0.4001320000966242, + -0.7489422658248586, + -0.8946002438575227, + -0.392025619231934, + 0.6854220843685903, + -0.674490045974586, + -0.4398081957860396, + 0.2709762572248531 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [2, 1, 4, 1, 3], + "data": [ + -0.5945858955383301, + -0.5484867095947266, + 0.14363321661949158, + 0.5856771469116211, + 0.7991966009140015, + -0.5192402005195618, + 0.8361185789108276, + 0.2404468059539795, + 0.27881762385368347, + -0.16707675158977509, + 0.8036975860595703, + -0.5827808976173401, + 0.7049695253372192, + 0.5380884408950806, + -0.1850501298904419, + 0.742441713809967, + 0.4285193383693695, + -0.710474967956543, + -0.7941843867301941, + -0.4207003712654114, + 0.6676210165023804, + -0.6598520874977112, + -0.46604686975479126, + 0.29844197630882263 + ], + "type": "float32" + } + } + ] +}
\ No newline at end of file diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js index 1e31886c9c5..c3b10a70201 100644 --- a/tests/wpt/tests/webnn/resources/utils.js +++ b/tests/wpt/tests/webnn/resources/utils.js @@ -306,6 +306,7 @@ const PrecisionMetrics = { abs: {ULP: {float32: 0, float16: 0}}, ceil: {ULP: {float32: 0, float16: 0}}, cos: {ATOL: {float32: 1/1024, float16: 1/512}}, + erf: {ATOL: {float32: 1/1024, float16: 1/512}}, exp: {ULP: {float32: 32, float16: 1}}, floor: {ULP: {float32: 0, float16: 0}}, identity: {ULP: {float32: 0, float16: 0}}, @@ -317,6 +318,7 @@ const PrecisionMetrics = { tan: {ATOL: {float32: 1/1024, float16: 1/512}}, // End Element-wise unary operations elu: {ULP: {float32: 18, float16: 18}}, + expand: {ULP: {float32: 0, float16: 0}}, gemm: {ULP: {float32: getGemmPrecisionTolerance, float16: getGemmPrecisionTolerance}}, hardSigmoid: {ULP: {float32: 2, float16: 2}}, hardSwish: {ULP: {float32: 4, float16: 4}}, @@ -352,6 +354,7 @@ const PrecisionMetrics = { squeeze: {ULP: {float32: 0, float16: 0}}, tanh: {ATOL: {float32: 1/1024, float16: 1/512}}, transpose: {ULP: {float32: 0, float16: 0}}, + where: {ULP: {float32: 0, float16: 0}}, }; /** @@ -660,10 +663,11 @@ const buildPad = (operationName, builder, resources) => { }; const buildReshape = (operationName, builder, resources) => { - // MLOperand reshape(MLOperand input, sequence<unsigned long?> newShape); + // MLOperand reshape(MLOperand input, sequence<unsigned long> newShape); + // MLOperand expand(MLOperand input, sequence<unsigned long> newShape); const namedOutputOperand = {}; const inputOperand = createSingleInputOperand(builder, resources); - // invoke builder.reshape() + // invoke builder.reshape() or builder.expand() namedOutputOperand[resources.expected.name] = builder[operationName](inputOperand, resources.newShape); return namedOutputOperand; }; @@ -691,6 +695,15 @@ const buildSplit = (operationName, builder, resources) => { return namedOutputOperand; }; +const buildWhere = (operationName, builder, resources) => { + // MLOperand where(MLOperand condition, MLOperand trueValues, MLOperand falseValues); + const namedOutputOperand = {}; + const [conditionOperand, trueValuesOperand, falseValuesOperand] = createMultiInputOperands(builder, resources); + // invoke builder.where() + namedOutputOperand[resources.expected.name] = builder[operationName](conditionOperand, trueValuesOperand, falseValuesOperand); + return namedOutputOperand; +}; + /** * Build a graph. * @param {String} operationName - An operation name diff --git a/tests/wpt/tests/webnn/where.https.any.js b/tests/wpt/tests/webnn/where.https.any.js new file mode 100644 index 00000000000..306128a8142 --- /dev/null +++ b/tests/wpt/tests/webnn/where.https.any.js @@ -0,0 +1,10 @@ +// META: title=test WebNN API where operation +// META: global=window,dedicatedworker +// META: script=./resources/utils.js +// META: timeout=long + +'use strict'; + +// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-where + +testWebNNOperation('where', buildWhere);
\ No newline at end of file diff --git a/tests/wpt/tests/webrtc/RTCDataChannel-binaryType.window.js b/tests/wpt/tests/webrtc/RTCDataChannel-binaryType.window.js index f641f519762..c93d0cb1a09 100644 --- a/tests/wpt/tests/webrtc/RTCDataChannel-binaryType.window.js +++ b/tests/wpt/tests/webrtc/RTCDataChannel-binaryType.window.js @@ -8,7 +8,7 @@ test((t) => { t.add_cleanup(() => pc.close()); const dc = pc.createDataChannel('test-binary-type'); - assert_equals(dc.binaryType, "blob", `dc.binaryType should be 'blob'`); + assert_equals(dc.binaryType, "arraybuffer", `dc.binaryType should be 'arraybuffer'`); }, `Default binaryType value`); for (const binaryType of validBinaryTypes) { diff --git a/tests/wpt/tests/webrtc/RTCDataChannel-send.html b/tests/wpt/tests/webrtc/RTCDataChannel-send.html index 70cdf8657fd..193f38cd780 100644 --- a/tests/wpt/tests/webrtc/RTCDataChannel-send.html +++ b/tests/wpt/tests/webrtc/RTCDataChannel-send.html @@ -261,24 +261,18 @@ for (const options of [{}, {negotiated: true, id: 0}]) { promise_test(t => { return createDataChannelPair(t, options) .then(([channel1, channel2]) => { - assert_equals(channel2.binaryType, 'blob', - 'Expect initial binaryType value to be blob'); + assert_equals(channel2.binaryType, 'arraybuffer', + 'Expect initial binaryType value to be arraybuffer'); channel1.send(helloBuffer); return awaitMessage(channel2); - }) - .then(messageBlob => { - assert_true(messageBlob instanceof Blob, - 'Expect received messageBlob to be a Blob'); - - return blobToArrayBuffer(messageBlob); }).then(messageBuffer => { assert_true(messageBuffer instanceof ArrayBuffer, 'Expect messageBuffer to be an ArrayBuffer'); assert_equals_typed_array(messageBuffer, helloBuffer.buffer); }); - }, `${mode} binaryType should receive message as Blob by default`); + }, `${mode} binaryType should receive message as ArrayBuffer by default`); // Test sending 3 messages: helloBuffer, unicodeString, helloBlob async_test(t => { diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-connectionState.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-connectionState.https.html index d7716a1d4da..b3884e4314d 100644 --- a/tests/wpt/tests/webrtc/RTCPeerConnection-connectionState.https.html +++ b/tests/wpt/tests/webrtc/RTCPeerConnection-connectionState.https.html @@ -271,6 +271,50 @@ assert_array_equals(states, ['connecting', 'connected']); }, 'connectionState transitions to connected via connecting'); + + // Make the callee act as if not bundle-aware + async function exchangeOfferAnswerUnbundled(caller, callee) { + const offer = await caller.createOffer(); + const sdp = offer.sdp.replace('BUNDLE', 'SOMETHING') + .replace(/rtp-hdrext:sdes/g, 'rtp-hdrext:something') + .replace(/a=ssrc:/g, 'a=notssrc'); + await caller.setLocalDescription(offer); + await callee.setRemoteDescription({type: 'offer', sdp}); + + await exchangeAnswer(caller, callee); + } + + promise_test(async t => { + const pc1 = new RTCPeerConnection({bundlePolicy: 'max-compat'}); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + const stream = await getNoiseStream({ audio: true }); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + stream.getTracks().forEach(track => pc1.addTrack(track, stream)); + exchangeIceCandidates(pc1, pc2); + exchangeOfferAnswerUnbundled(pc1, pc2); + await listenToConnected(pc1); + + // https://github.com/w3c/webrtc-pc/issues/2678#issuecomment-948554126 + let had_intermediary_connecting = false + let channel; + const onConnectionStateChange = t.step_func(() => { + const {connectionState, iceConnectionState} = pc1; + if (connectionState === 'connecting') { + had_intermediary_connecting = true; + } + }); + + pc1.addEventListener('connectionstatechange', onConnectionStateChange); + channel = pc1.createDataChannel('test'); + await exchangeOfferAnswer(pc1, pc2); + await listenToConnected(pc1); + + assert_true(had_intermediary_connecting, "state should re-pass connecting before reaching connected"); + }, 'when adding a datachannel to an existing unbundled connected PC, it should go through a connecting state'); + + promise_test(async t => { const pc1 = new RTCPeerConnection(); t.add_cleanup(() => pc1.close()); diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-createDataChannel.html b/tests/wpt/tests/webrtc/RTCPeerConnection-createDataChannel.html index 7ad8bf7d46e..cddbd02c7bf 100644 --- a/tests/wpt/tests/webrtc/RTCPeerConnection-createDataChannel.html +++ b/tests/wpt/tests/webrtc/RTCPeerConnection-createDataChannel.html @@ -139,7 +139,7 @@ test(t => { assert_equals(dc.readyState, 'connecting'); assert_equals(dc.bufferedAmount, 0); assert_equals(dc.bufferedAmountLowThreshold, 0); - assert_equals(dc.binaryType, 'blob'); + assert_equals(dc.binaryType, 'arraybuffer'); }, 'createDataChannel attribute default values'); test(t => { @@ -166,7 +166,7 @@ test(t => { assert_equals(dc.readyState, 'connecting'); assert_equals(dc.bufferedAmount, 0); assert_equals(dc.bufferedAmountLowThreshold, 0); - assert_equals(dc.binaryType, 'blob'); + assert_equals(dc.binaryType, 'arraybuffer'); const dc2 = pc.createDataChannel('test2', { ordered: false, diff --git a/tests/wpt/tests/webrtc-extensions/RTCRtpParameters-maxFramerate.html b/tests/wpt/tests/webrtc/RTCRtpParameters-maxFramerate.html index 3e348f0d147..3e348f0d147 100644 --- a/tests/wpt/tests/webrtc-extensions/RTCRtpParameters-maxFramerate.html +++ b/tests/wpt/tests/webrtc/RTCRtpParameters-maxFramerate.html diff --git a/tests/wpt/tests/webrtc/protocol/additional-codecs.html b/tests/wpt/tests/webrtc/protocol/additional-codecs.html new file mode 100644 index 00000000000..5462d614793 --- /dev/null +++ b/tests/wpt/tests/webrtc/protocol/additional-codecs.html @@ -0,0 +1,56 @@ +<!doctype html> +<meta charset=utf-8> +<title>Send additional codec supported by the other side</title> +<meta name=timeout content=long> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../RTCPeerConnection-helper.js"></script> +<script> +'use strict'; +// Tests behaviour from +// https://www.rfc-editor.org/rfc/rfc8829.html#section-5.3.1 +// in particular "but MAY include formats that are locally +// supported but not present in the offer" + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + exchangeIceCandidates(pc1, pc2); + + const stream = await getNoiseStream({video: true}); + t.add_cleanup(() => stream.getTracks().forEach(t => t.stop())); + pc1.addTrack(stream.getTracks()[0], stream); + pc2.addTrack(stream.getTracks()[0], stream); + // Only offer VP8. + pc1.getTransceivers()[0].setCodecPreferences([{ + clockRate: 90000, + mimeType: 'video/VP8' + }]); + await pc1.setLocalDescription(); + + // Add H264 to the SDP. + const sdp = pc1.localDescription.sdp.split('\n') + .map(l => { + if (l.startsWith('m=')) { + return l.trim() + ' 63'; // 63 is the least-likely to be used PT. + } + return l.trim(); + }).join('\r\n') + + 'a=rtpmap:63 H264/90000\r\n' + + 'a=fmtp:63 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n' + await pc2.setRemoteDescription({ + type: 'offer', + sdp: sdp.replaceAll('VP8', 'no-such-codec'), // Remove VP8 + }); + await pc2.setLocalDescription(); + await pc1.setRemoteDescription(pc2.localDescription); + + await listenToConnected(pc2); + const stats = await pc1.getStats(); + const rtp = [...stats.values()].find(({type}) => type === 'outbound-rtp'); + assert_true(!!rtp); + assert_equals(stats.get(rtp.codecId).mimeType, 'video/H264'); +}, 'Listing an additional codec in the answer causes it to be sent.'); +</script> |