author | Coroiu Cristina <ccoroiu@mozilla.com> |
Tue, 08 Oct 2019 00:52:41 +0300 | |
changeset 496680 | 4651f71eeb5476a6dc9002a47a45c3a5b17aba6c |
parent 496679 | 2b4c8b7a255c3ffd1ead1e555aa061f3c3f88330 (current diff) |
parent 496678 | aa50a7580ed4a38b59ff40fdaf541f911110e71c (diff) |
child 496681 | 480000073f4668def97fda2a50fef3e29225308e |
push id | 97366 |
push user | ccoroiu@mozilla.com |
push date | Mon, 07 Oct 2019 22:35:10 +0000 |
treeherder | autoland@4837c8bbf06a [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 71.0a1 |
first release with | nightly linux32
4651f71eeb54
/
71.0a1
/
20191007215350
/
files
nightly linux64
4651f71eeb54
/
71.0a1
/
20191007215350
/
files
nightly mac
4651f71eeb54
/
71.0a1
/
20191007215350
/
files
nightly win32
4651f71eeb54
/
71.0a1
/
20191007215350
/
files
nightly win64
4651f71eeb54
/
71.0a1
/
20191007215350
/
files
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly linux32
71.0a1
/
20191007215350
/
pushlog to previous
nightly linux64
71.0a1
/
20191007215350
/
pushlog to previous
nightly mac
71.0a1
/
20191007215350
/
pushlog to previous
nightly win32
71.0a1
/
20191007215350
/
pushlog to previous
nightly win64
71.0a1
/
20191007215350
/
pushlog to previous
|
testing/web-platform/meta/content-security-policy/font-src/font-self-allowed.html.ini | file | annotate | diff | comparison | revisions | |
testing/web-platform/meta/streams/readable-streams/floating-point-total-queue-size.any.js.ini | file | annotate | diff | comparison | revisions | |
testing/web-platform/meta/webrtc-stats/idlharness.window.js.ini | file | annotate | diff | comparison | revisions | |
testing/web-platform/meta/workers/Worker-replace-self.any.js.ini | file | annotate | diff | comparison | revisions | |
testing/web-platform/tests/fonts/CanvasTest.ttf.sub.headers | file | annotate | diff | comparison | revisions | |
testing/web-platform/tests/proximity/ProximitySensor_onerror-manual.https.html | file | annotate | diff | comparison | revisions | |
testing/web-platform/tests/upgrade-insecure-requests/support/generate.py | file | annotate | diff | comparison | revisions |
--- a/testing/web-platform/meta/animation-worklet/idlharness.any.js.ini +++ b/testing/web-platform/meta/animation-worklet/idlharness.any.js.ini @@ -68,8 +68,11 @@ expected: FAIL [Partial interface AnimationEffect: valid exposure set] expected: FAIL [WorkletAnimation interface: new WorkletAnimation("name") must not have property "animatorName"] expected: FAIL + [WorkletAnimation interface: new WorkletAnimation("name") must not have property "undefined"] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/compression/decompression-bad-chunks.any.js.ini @@ -0,0 +1,223 @@ +[decompression-bad-chunks.any.worker.html] + [chunk of type array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for deflate] + expected: FAIL + + [chunk of type array should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for deflate] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for deflate] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for gzip] + expected: FAIL + + [chunk of type undefined should error the stream for gzip] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for gzip] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for gzip] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for deflate] + expected: FAIL + + [chunk of type undefined should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for deflate] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for gzip] + expected: FAIL + + +[decompression-bad-chunks.any.sharedworker.html] + [chunk of type array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for deflate] + expected: FAIL + + [chunk of type array should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for deflate] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for deflate] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for gzip] + expected: FAIL + + [chunk of type undefined should error the stream for gzip] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for gzip] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for gzip] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for deflate] + expected: FAIL + + [chunk of type undefined should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for deflate] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for gzip] + expected: FAIL + + +[decompression-bad-chunks.any.serviceworker.html] + [chunk of type array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for deflate] + expected: FAIL + + [chunk of type array should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for deflate] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for deflate] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for gzip] + expected: FAIL + + [chunk of type undefined should error the stream for gzip] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for gzip] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for gzip] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for deflate] + expected: FAIL + + [chunk of type undefined should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for deflate] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for gzip] + expected: FAIL + + +[decompression-bad-chunks.any.html] + [chunk of type array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for deflate] + expected: FAIL + + [chunk of type array should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for deflate] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for deflate] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for gzip] + expected: FAIL + + [chunk of type undefined should error the stream for gzip] + expected: FAIL + + [chunk of type SharedArrayBuffer should error the stream for gzip] + expected: FAIL + + [chunk of type numeric should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for gzip] + expected: FAIL + + [chunk of type object, not BufferSource should error the stream for gzip] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for gzip] + expected: FAIL + + [chunk of type invalid gzip bytes should error the stream for deflate] + expected: FAIL + + [chunk of type undefined should error the stream for deflate] + expected: FAIL + + [chunk of type shared Uint8Array should error the stream for deflate] + expected: FAIL + + [chunk of type invalid deflate bytes should error the stream for deflate] + expected: FAIL + + [chunk of type null should error the stream for gzip] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/compression/decompression-constructor-error.any.js.ini @@ -0,0 +1,82 @@ +[decompression-constructor-error.any.worker.html] + [construction error by unsupported format] + expected: FAIL + + [constructor error by input object that cannot be converted to a string] + expected: FAIL + + [constructor error by non-input] + expected: FAIL + + [non-string input should cause the constructor to throw] + expected: FAIL + + ["a" should cause the constructor to throw] + expected: FAIL + + [no input should cause the constructor to throw] + expected: FAIL + + +[decompression-constructor-error.any.serviceworker.html] + [construction error by unsupported format] + expected: FAIL + + [constructor error by input object that cannot be converted to a string] + expected: FAIL + + [constructor error by non-input] + expected: FAIL + + [non-string input should cause the constructor to throw] + expected: FAIL + + ["a" should cause the constructor to throw] + expected: FAIL + + [no input should cause the constructor to throw] + expected: FAIL + + [decompression-constructor-error] + expected: FAIL + + +[decompression-constructor-error.any.html] + [construction error by unsupported format] + expected: FAIL + + [constructor error by input object that cannot be converted to a string] + expected: FAIL + + [constructor error by non-input] + expected: FAIL + + [non-string input should cause the constructor to throw] + expected: FAIL + + ["a" should cause the constructor to throw] + expected: FAIL + + [no input should cause the constructor to throw] + expected: FAIL + + +[decompression-constructor-error.any.sharedworker.html] + [construction error by unsupported format] + expected: FAIL + + [constructor error by input object that cannot be converted to a string] + expected: FAIL + + [constructor error by non-input] + expected: FAIL + + [non-string input should cause the constructor to throw] + expected: FAIL + + ["a" should cause the constructor to throw] + expected: FAIL + + [no input should cause the constructor to throw] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/compression/decompression-correct-input.any.js.ini @@ -0,0 +1,34 @@ +[decompression-correct-input.any.worker.html] + [decompressing gzip input should work] + expected: FAIL + + [decompressing deflated input should work] + expected: FAIL + + +[decompression-correct-input.any.serviceworker.html] + [decompressing gzip input should work] + expected: FAIL + + [decompressing deflated input should work] + expected: FAIL + + [decompression-correct-input] + expected: FAIL + + +[decompression-correct-input.any.html] + [decompressing gzip input should work] + expected: FAIL + + [decompressing deflated input should work] + expected: FAIL + + +[decompression-correct-input.any.sharedworker.html] + [decompressing gzip input should work] + expected: FAIL + + [decompressing deflated input should work] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/compression/decompression-empty-input.any.js.ini @@ -0,0 +1,31 @@ +[decompression-empty-input.any.sharedworker.html] + [decompressing gzip empty input should work] + expected: FAIL + + [decompressing deflate empty input should work] + expected: FAIL + + +[decompression-empty-input.any.html] + [decompressing gzip empty input should work] + expected: FAIL + + [decompressing deflate empty input should work] + expected: FAIL + + +[decompression-empty-input.any.serviceworker.html] + [decompressing gzip empty input should work] + expected: FAIL + + [decompressing deflate empty input should work] + expected: FAIL + + +[decompression-empty-input.any.worker.html] + [decompressing gzip empty input should work] + expected: FAIL + + [decompressing deflate empty input should work] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/compression/decompression-split-chunk.any.js.ini @@ -0,0 +1,367 @@ +[decompression-split-chunk.any.worker.html] + [decompressing splitted chunk into pieces of size 1 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 1 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in gzip] + expected: FAIL + + +[decompression-split-chunk.any.sharedworker.html] + [decompressing splitted chunk into pieces of size 1 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 1 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in gzip] + expected: FAIL + + +[decompression-split-chunk.any.html] + [decompressing splitted chunk into pieces of size 1 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 1 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in gzip] + expected: FAIL + + +[decompression-split-chunk.any.serviceworker.html] + [decompressing splitted chunk into pieces of size 1 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 5 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 8 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 12 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 9 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 11 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 13 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 14 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 3 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 1 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 2 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 7 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 6 should work in gzip] + expected: FAIL + + [decompressing splitted chunk into pieces of size 15 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 4 should work in deflate] + expected: FAIL + + [decompressing splitted chunk into pieces of size 10 should work in gzip] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/compression/decompression-uint8array-output.any.js.ini @@ -0,0 +1,31 @@ +[decompression-uint8array-output.any.html] + [decompressing gzip output should give Uint8Array chunks] + expected: FAIL + + [decompressing deflated output should give Uint8Array chunks] + expected: FAIL + + +[decompression-uint8array-output.any.worker.html] + [decompressing gzip output should give Uint8Array chunks] + expected: FAIL + + [decompressing deflated output should give Uint8Array chunks] + expected: FAIL + + +[decompression-uint8array-output.any.serviceworker.html] + [decompressing gzip output should give Uint8Array chunks] + expected: FAIL + + [decompressing deflated output should give Uint8Array chunks] + expected: FAIL + + +[decompression-uint8array-output.any.sharedworker.html] + [decompressing gzip output should give Uint8Array chunks] + expected: FAIL + + [decompressing deflated output should give Uint8Array chunks] + expected: FAIL +
deleted file mode 100644 --- a/testing/web-platform/meta/content-security-policy/font-src/font-self-allowed.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[font-self-allowed.html] - [Test font loads if it matches font-src.] - expected: FAIL -
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/content-security-policy/frame-ancestors/frame-ancestors-from-serviceworker.https.html.ini @@ -0,0 +1,5 @@ +[frame-ancestors-from-serviceworker.https.html] + expected: TIMEOUT + [A 'frame-ancestors' CSP directive set from a serviceworker response with a value 'none' should block rendering.] + expected: TIMEOUT +
--- a/testing/web-platform/meta/content-security-policy/navigate-to/href-location-blocked.sub.html.ini +++ b/testing/web-platform/meta/content-security-policy/navigate-to/href-location-blocked.sub.html.ini @@ -1,6 +1,6 @@ [href-location-blocked.sub.html] [Violation report status OK.] expected: + if (os == "android") and debug: ["FAIL", "PASS"] if (os == "android") and not debug: ["PASS", "FAIL"] - if (os == "android") and debug: ["PASS", "FAIL"]
--- a/testing/web-platform/meta/cookie-store/serviceworker_cookieStore_subscriptions.tentative.https.html.ini +++ b/testing/web-platform/meta/cookie-store/serviceworker_cookieStore_subscriptions.tentative.https.html.ini @@ -1,22 +1,22 @@ [serviceworker_cookieStore_subscriptions.tentative.https.html] disabled: if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1573036 if (os == "win") and (processor == "aarch64"): https://bugzilla.mozilla.org/show_bug.cgi?id=1573036 expected: - if (os == "mac") and not debug: [TIMEOUT, OK] + if (os == "mac") and not debug: ["OK", "TIMEOUT"] TIMEOUT [getChangeSubscriptions returns subscriptions passed to subscribeToChanges] expected: - if (os == "mac") and not debug: [TIMEOUT, FAIL] + if (os == "mac") and not debug: ["FAIL", "TIMEOUT"] TIMEOUT [subscribeToChanges rejects when called outside the install handler] expected: - if (os == "mac") and not debug: [NOTRUN, FAIL] + if (os == "mac") and not debug: ["FAIL", "NOTRUN"] NOTRUN [cookiechange dispatched with cookie change that matches subscription] expected: - if (os == "mac") and not debug: [NOTRUN, FAIL] + if (os == "mac") and not debug: ["FAIL", "NOTRUN"] NOTRUN
--- a/testing/web-platform/meta/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini +++ b/testing/web-platform/meta/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini @@ -1,7 +1,6 @@ [relpos-percentage-top-in-scrollable.html] [Top percentage resolved correctly for overflow contribution] expected: - if (os == "android") and not debug: [FAIL, PASS] - if (os == "android") and debug: [FAIL, PASS] + if (os == "android") and debug: ["FAIL", "PASS"] + if (os == "android") and not debug: ["FAIL", "PASS"] -
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/css/css-animations/parsing/animation-computed.html.ini @@ -0,0 +1,34 @@ +[animation-computed.html] + [Property animation value 'paused' computes to '0s ease 0s 1 normal none paused none'] + expected: FAIL + + [Property animation value 'anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none'] + expected: FAIL + + [Property animation value 'cubic-bezier(0, -2, 1, 3)' computes to '0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none'] + expected: FAIL + + [Property animation value 'anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim'] + expected: FAIL + + [Property animation value 'anim' computes to '0s ease 0s 1 normal none running anim'] + expected: FAIL + + [Property animation value '1s -3s' computes to '1s ease -3s 1 normal none running none'] + expected: FAIL + + [Property animation value '4' computes to '0s ease 0s 4 normal none running none'] + expected: FAIL + + [Property animation value 'reverse' computes to '0s ease 0s 1 reverse none running none'] + expected: FAIL + + [Property animation value 'none' computes to '0s ease 0s 1 normal none running none'] + expected: FAIL + + [Property animation value '1s' computes to '1s ease 0s 1 normal none running none'] + expected: FAIL + + [Property animation value 'both' computes to '0s ease 0s 1 normal both running none'] + expected: FAIL +
--- a/testing/web-platform/meta/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.ini +++ b/testing/web-platform/meta/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.ini @@ -1,4 +1,2 @@ [font-display-feature-policy-02.tentative.html] - expected: - if os == "linux": PASS - FAIL + expected: FAIL
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/css/css-fonts/parsing/font-variant-valid.html.ini @@ -0,0 +1,10 @@ +[font-variant-valid.html] + [e.style['font-variant'\] = "common-ligatures discretionary-ligatures historical-ligatures contextual small-caps stylistic(flowing) lining-nums proportional-nums diagonal-fractions ordinal slashed-zero jis78 full-width ruby sub" should set the property value] + expected: FAIL + + [e.style['font-variant'\] = "annotation(flowing) ornaments(flowing) swash(flowing) character-variant(flowing) styleset(flowing) historical-forms stylistic(flowing)" should set the property value] + expected: FAIL + + [e.style['font-variant'\] = "super proportional-width jis83 stacked-fractions tabular-nums oldstyle-nums historical-forms all-small-caps no-contextual no-historical-ligatures no-discretionary-ligatures no-common-ligatures" should set the property value] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/css/css-transitions/parsing/transition-computed.html.ini @@ -0,0 +1,22 @@ +[transition-computed.html] + [Property transition value '1s -3s, cubic-bezier(0, -2, 1, 3) top' computes to 'all 1s ease -3s, top 0s cubic-bezier(0, -2, 1, 3) 0s'] + expected: FAIL + + [Property transition value 'cubic-bezier(0, -2, 1, 3)' computes to 'all 0s cubic-bezier(0, -2, 1, 3) 0s'] + expected: FAIL + + [Property transition value '1s' computes to 'all 1s ease 0s'] + expected: FAIL + + [Property transition value '1s -3s' computes to 'all 1s ease -3s'] + expected: FAIL + + [Property transition value 'none' computes to 'none 0s ease 0s'] + expected: FAIL + + [Property transition value 'top' computes to 'top 0s ease 0s'] + expected: FAIL + + [Property transition value '1s -3s cubic-bezier(0, -2, 1, 3) top' computes to 'top 1s cubic-bezier(0, -2, 1, 3) -3s'] + expected: FAIL +
--- a/testing/web-platform/meta/css/css-ui/appearance-auto-001.html.ini +++ b/testing/web-platform/meta/css/css-ui/appearance-auto-001.html.ini @@ -1,8 +1,7 @@ [appearance-auto-001.html] disabled: if debug and (os == "win") and (version == "6.1.7601"): https://bugzilla.mozilla.org/show_bug.cgi?id=1560360 expected: if (os == "win") and (processor == "x86"): FAIL - if (os == "win") and (processor == "aarch64"): ["PASS", "FAIL"] + if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"] if (os == "win") and (processor == "x86_64"): FAIL -
--- a/testing/web-platform/meta/css/css-ui/appearance-textfield-001.html.ini +++ b/testing/web-platform/meta/css/css-ui/appearance-textfield-001.html.ini @@ -1,5 +1,6 @@ [appearance-textfield-001.html] expected: - if (os == "win") and (processor == "x86_64"): [FAIL, PASS] if (os == "win") and (processor == "x86") and debug: ["PASS", "FAIL"] - if (os == "win") and (processor == "x86") and not debug: ["FAIL", "PASS"] + if (os == "win") and (processor == "x86") and not debug: ["PASS", "FAIL"] + if (os == "win") and (processor == "x86_64"): ["FAIL", "PASS"] + if (os == "win") and (processor == "aarch64"): FAIL
--- a/testing/web-platform/meta/css/css-variables/variable-presentation-attribute.html.ini +++ b/testing/web-platform/meta/css/css-variables/variable-presentation-attribute.html.ini @@ -1,13 +1,13 @@ [variable-presentation-attribute.html] [Testing 'clip' on '#test4'.] expected: + if os == "android": FAIL if os == "linux": FAIL - if os == "android": FAIL [Testing 'alignment-baseline'.] expected: FAIL [Testing 'baseline-shift'.] expected: FAIL [Testing 'color-interpolation-filters'.]
--- a/testing/web-platform/meta/css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html.ini +++ b/testing/web-platform/meta/css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html.ini @@ -1,7 +1,8 @@ [position-sticky-root-scroller-with-scroll-behavior.html] [Sticky elements work with the root (document) scroller] bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1556685 expected: + if (os == "linux") and webrender and debug: ["PASS", "FAIL"] if (os == "linux") and webrender and not debug: ["PASS", "FAIL"] if os == "android": FAIL
--- a/testing/web-platform/meta/css/cssom-view/scroll-behavior-default-css.html.ini +++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-default-css.html.ini @@ -1,6 +1,7 @@ [scroll-behavior-default-css.html] [Smooth scrolling of an element with default scroll-behavior] expected: - if webrender and (os == "linux") and not debug: [PASS, FAIL] + if (os == "linux") and webrender and not debug: ["PASS", "FAIL"] + if (os == "linux") and webrender and debug: ["PASS", "FAIL"] if (os == "android") and debug: ["PASS", "FAIL"]
--- a/testing/web-platform/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini +++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini @@ -1,135 +1,136 @@ [scroll-behavior-main-frame-root.html] disabled: if (os == "android") and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499003 [Main frame with smooth scroll-behavior ; scrollBy() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scroll() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scroll() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scroll() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollTo() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollTo() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollIntoView() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollTo() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollBy() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollIntoView() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollBy() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Aborting an ongoing smooth scrolling on the main frame with another smooth scrolling] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollTo() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollTo() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scroll() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollIntoView() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollTo() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollTo() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollIntoView() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollBy() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scroll() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollBy() with auto behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollBy() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollBy() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollBy() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scroll() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollIntoView() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollTo() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scroll() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollIntoView() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scrollIntoView() with default behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with smooth scroll-behavior ; scrollIntoView() with instant behavior] expected: - if (os == "android") and e10s: FAIL + if os == "android": FAIL [Main frame with auto scroll-behavior ; scroll() with smooth behavior] expected: - if (os == "android") and e10s: FAIL + if (os == "linux") and webrender and debug: ["PASS", "FAIL"] + if os == "android": FAIL
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-main-frame-window.html.ini @@ -0,0 +1,9 @@ +[scroll-behavior-main-frame-window.html] + [Main frame with smooth scroll-behavior ; scroll() with default behavior] + expected: + if webrender and (os == "linux") and debug: ["PASS", "FAIL"] + + [Main frame with auto scroll-behavior ; scroll() with smooth behavior] + expected: + if webrender and (os == "linux") and debug: ["PASS", "FAIL"] +
--- a/testing/web-platform/meta/encrypted-media/clearkey-mp4-playback-temporary-multikey.https.html.ini +++ b/testing/web-platform/meta/encrypted-media/clearkey-mp4-playback-temporary-multikey.https.html.ini @@ -1,6 +1,9 @@ [clearkey-mp4-playback-temporary-multikey.https.html] + expected: + if (os == "win") and (processor == "x86_64") and not webrender and not debug: ["OK", "TIMEOUT"] [org.w3.clearkey, temporary, mp4, playback, multikey audio/video] expected: + if (os == "win") and (processor == "x86_64") and not webrender and not debug: ["PASS", "TIMEOUT"] if (os == "win") and (processor == "aarch64"): FAIL if os == "android": FAIL
--- a/testing/web-platform/meta/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html.ini +++ b/testing/web-platform/meta/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html.ini @@ -32,17 +32,17 @@ if (os == "win") and debug: [wpt-sync Bug 1565002, https://bugzilla.mozilla.org/show_bug.cgi?id=1568816] if (os == "linux") and (processor == "x86_64") and not debug and webrender: wpt-sync Bug 1565002 if (os == "linux") and (processor == "x86_64") and not debug and not webrender: wpt-sync Bug 1565002 if (os == "linux") and (processor == "x86_64") and debug and webrender: wpt-sync Bug 1565002 if (os == "linux") and (processor == "x86_64") and debug and not webrender and not sw-e10s: wpt-sync Bug 1565002 if (os == "linux") and (processor == "x86_64") and debug and not webrender and sw-e10s: wpt-sync Bug 1565002 if (os == "mac") and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1568816 expected: - if os == "linux": ["FAIL", "TIMEOUT"] + if os == "linux": ["TIMEOUT", "FAIL"] FAIL [Http upgrade fetch() api => No headers] expected: FAIL [redirect-http-upgrade] expected: FAIL
--- a/testing/web-platform/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html.ini +++ b/testing/web-platform/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html.ini @@ -1,28 +1,28 @@ [fieldset-default-style.html] [fieldset default style] expected: FAIL [border-left-color] expected: + if os == "linux": PASS if os == "android": PASS - if os == "linux": PASS FAIL [border-top-color] expected: + if os == "linux": PASS if os == "android": PASS - if os == "linux": PASS FAIL [border-bottom-color] expected: + if os == "linux": PASS if os == "android": PASS - if os == "linux": PASS FAIL [border-right-color] expected: if os == "android": PASS if os == "linux": PASS FAIL
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/html/semantics/embedded-content/media-elements/track/track-element/track-mode-not-changed-by-new-track.html.ini @@ -0,0 +1,5 @@ +[track-mode-not-changed-by-new-track.html] + [A track appended after the initial track configuration does not change other tracks] + expected: + if (os == "android") and debug: ["PASS", "FAIL"] +
--- a/testing/web-platform/meta/html/semantics/forms/autofocus/update-the-rendering.html.ini +++ b/testing/web-platform/meta/html/semantics/forms/autofocus/update-the-rendering.html.ini @@ -1,4 +1,10 @@ [update-the-rendering.html] ["Flush autofocus candidates" should be happen after the first animation frame callbacks, and before a resize event in the next iteration of window event loop.] - expected: [FAIL, PASS] + expected: + if (os == "linux") and not sw-e10s and (processor == "x86_64") and debug and webrender: ["FAIL", "PASS"] + if (os == "linux") and not sw-e10s and (processor == "x86_64") and debug and not webrender: ["PASS", "FAIL"] + if (os == "linux") and not sw-e10s and (processor == "x86_64") and not debug: ["FAIL", "PASS"] + if (os == "linux") and sw-e10s: ["PASS", "FAIL"] + if (os == "win") and debug: ["FAIL", "PASS"] + FAIL
--- a/testing/web-platform/meta/mathml/relations/html5-tree/integration-point-3.html.ini +++ b/testing/web-platform/meta/mathml/relations/html5-tree/integration-point-3.html.ini @@ -1,3 +1,3 @@ [integration-point-3.html] expected: - if (processor == "x86") and not debug: [FAIL, PASS] + if (processor == "x86") and not debug: ["PASS", "FAIL"]
--- a/testing/web-platform/meta/mozilla-sync +++ b/testing/web-platform/meta/mozilla-sync @@ -1,2 +1,2 @@ -local: a7c230cd7c1f0c84cc2b0e49119bbc1785569627 -upstream: 22372be821a57fc1c98e1b2250410368dd3be77b +local: 383a1471e251243a31f913d97d7e090a48ff1b28 +upstream: e2381a6676f1ae4a491cfbac5805d25d491798a2
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy.html.ini +++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy.html.ini @@ -1,8 +1,7 @@ [pointerevent_movementxy.html] expected: - if (os == "mac") and debug: [OK, ERROR] - if (os == "mac") and not debug: ["OK", "ERROR"] + if (os == "mac") and debug: ["OK", "ERROR"] [ERROR, OK] [mouse pointerevent attributes] expected: FAIL
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini +++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini @@ -1,10 +1,9 @@ [pointerevent_movementxy_with_pointerlock.html] [mouse pointerevent movementX/Y with pointerlock test] expected: - if (os == "win") and (processor == "x86_64") and not webrender and debug: [PASS, FAIL] - if (os == "win") and (processor == "x86_64") and webrender: [FAIL, PASS] - if (os == "mac") and not debug: [FAIL, PASS] - if (os == "win") and (processor == "x86_64") and not debug: ["FAIL", "PASS"] - if (os == "mac") and debug: ["FAIL", "PASS"] + if (processor == "x86_64") and (os == "linux") and webrender and debug: ["FAIL", "PASS"] + if (processor == "x86_64") and (os == "win") and not webrender: ["FAIL", "PASS"] + if (processor == "x86_64") and (os == "mac"): ["FAIL", "PASS"] + if processor == "aarch64": ["FAIL", "PASS"] [PASS, FAIL]
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini +++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini @@ -1,10 +1,8 @@ [pointerevent_pointermove_on_chorded_mouse_button_when_locked.html] [pointer locked pointermove events received for button state changes] expected: if ccov and (os == "win"): [PASS, FAIL] - if (os == "linux") and not sw-e10s and debug and webrender: [FAIL, PASS] - if (os == "linux") and not sw-e10s and debug and not webrender: [PASS, FAIL] - if (os == "linux") and sw-e10s: [PASS, FAIL] - if (os == "linux") and not debug and (processor == "x86_64"): ["PASS", "FAIL"] - if (os == "linux") and not debug and (processor == "x86"): ["PASS", "FAIL"] + if (os == "linux") and webrender and debug: ["PASS", "FAIL"] + if (os == "linux") and webrender and not debug: ["PASS", "FAIL"] + if (os == "linux") and not webrender: ["PASS", "FAIL"]
--- a/testing/web-platform/meta/proximity/ProximitySensor.https.html.ini +++ b/testing/web-platform/meta/proximity/ProximitySensor.https.html.ini @@ -33,8 +33,65 @@ expected: FAIL [ProximitySensor: sensor receives suspend / resume notifications when cross-origin subframe is focused] expected: FAIL [ProximitySensor: throw 'TypeError' if frequency is invalid] expected: FAIL + [ProximitySensor: Test that 'onreading' is called and sensor reading is valid.] + expected: FAIL + + [ProximitySensor: no exception is thrown when calling start() on already started sensor.] + expected: FAIL + + [ProximitySensor: Test that frequency is capped to allowed maximum.] + expected: FAIL + + [ProximitySensor: Test that onerror is sent when permissions are not granted.] + expected: FAIL + + [ProximitySensor: throw 'TypeError' if frequency is invalid.] + expected: FAIL + + [ProximitySensor: Test that frequency is limited to the minimum supported frequency.] + expected: FAIL + + [ProximitySensor: sensor timestamp is updated when time passes.] + expected: FAIL + + [ProximitySensor: Test that onerror is sent when sensor is not supported.] + expected: FAIL + + [ProximitySensor: Test that sensor can be constructed within an iframe allowed to use feature policy.] + expected: FAIL + + [ProximitySensor: Test that fresh reading is fetched on start().] + expected: FAIL + + [ProximitySensor: sensor.start() returns undefined.] + expected: FAIL + + [ProximitySensor: sensor reading is correct.] + expected: FAIL + + [ProximitySensor: Test that frequency is capped to the maximum supported frequency.] + expected: FAIL + + [ProximitySensor: sensor.stop() returns undefined.] + expected: FAIL + + [ProximitySensor: Test that sensor cannot be constructed within iframe disallowed to use feature policy.] + expected: FAIL + + [ProximitySensor: sensor receives suspend / resume notifications when cross-origin subframe is focused.] + expected: FAIL + + [ProximitySensor: Test that onerror is send when start() call has failed.] + expected: FAIL + + [ProximitySensor: no exception is thrown when calling stop() on already stopped sensor.] + expected: FAIL + + [ProximitySensor: frequency hint works.] + expected: FAIL +
--- a/testing/web-platform/meta/resize-observer/observe.html.ini +++ b/testing/web-platform/meta/resize-observer/observe.html.ini @@ -1,14 +1,14 @@ [observe.html] expected: if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"] if webrender and (os == "linux") and not debug: ["OK", "TIMEOUT"] [guard] expected: + if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"] if webrender and (os == "linux") and not debug: ["PASS", "NOTRUN"] - if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"] [test6: iframe notifications] expected: if webrender and (os == "linux") and not debug: ["PASS", "FAIL"] if webrender and (os == "linux") and debug: ["PASS", "FAIL"]
--- a/testing/web-platform/meta/resource-timing/resource-reload-TAO.sub.html.ini +++ b/testing/web-platform/meta/resource-timing/resource-reload-TAO.sub.html.ini @@ -1,11 +1,11 @@ [resource-reload-TAO.sub.html] expected: - if (os == "win") and not debug and not webrender and (processor == "x86"): [TIMEOUT, OK] - if (os == "win") and not debug and webrender: [TIMEOUT, OK] + if (processor == "x86_64") and webrender and (os == "win") and not debug: ["TIMEOUT", "OK"] + if (processor == "x86") and (os == "win") and not debug: ["TIMEOUT", "OK"] TIMEOUT [Test that TAO headers are reused on reloads.] expected: - if (os == "win") and not debug and not webrender and (processor == "x86"): [TIMEOUT, PASS] - if (os == "win") and not debug and webrender: [TIMEOUT, PASS] + if (processor == "x86_64") and webrender and (os == "win") and not debug: ["TIMEOUT", "PASS"] + if (processor == "x86") and (os == "win") and not debug: ["TIMEOUT", "PASS"] TIMEOUT
--- a/testing/web-platform/meta/service-workers/service-worker/client-navigate.https.html.ini +++ b/testing/web-platform/meta/service-workers/service-worker/client-navigate.https.html.ini @@ -1,31 +1,35 @@ [client-navigate.https.html] disabled: if (os == "android") and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499972 if (os == "android") and e10s: bug 1550895 (frequently fails on geckoview) expected: if (os == "linux") and webrender and not debug: ["OK", "TIMEOUT"] - if os == "mac": ["OK", "TIMEOUT"] + if (os == "mac") and debug: ["OK", "TIMEOUT"] + if (os == "mac") and not debug: ["TIMEOUT", "OK"] [Frame location should not update on failed mixed-content navigation] expected: - if (os == "linux") and webrender and not debug: ["PASS", "NOTRUN", "TIMEOUT"] + if (os == "linux") and webrender and not debug: ["PASS", "TIMEOUT", "NOTRUN"] if (os == "mac") and debug: ["PASS", "TIMEOUT", "NOTRUN"] - if (os == "mac") and not debug: ["PASS", "NOTRUN"] + if (os == "mac") and not debug: ["NOTRUN", "PASS"] [Frame location should update on successful navigation] expected: - if os == "mac": ["PASS", "TIMEOUT"] + if (os == "mac") and debug: ["PASS", "TIMEOUT"] + if (os == "mac") and not debug: ["TIMEOUT", "PASS"] [Frame location should not be accessible after cross-origin navigation] expected: - if os == "mac": ["PASS", "NOTRUN"] + if (os == "mac") and debug: ["PASS", "NOTRUN"] + if (os == "mac") and not debug: ["NOTRUN", "PASS"] [Frame location should not be accessible after redirect] expected: - if os == "mac": ["PASS", "NOTRUN"] + if (os == "mac") and not debug: ["NOTRUN", "PASS"] + if (os == "mac") and debug: ["PASS", "NOTRUN"] [Frame location should not update on failed about:blank navigation] expected: if (os == "linux") and webrender and not debug: ["PASS", "TIMEOUT"] if (os == "mac") and debug: ["PASS", "TIMEOUT", "NOTRUN"] - if (os == "mac") and not debug: ["PASS", "NOTRUN"] + if (os == "mac") and not debug: ["NOTRUN", "PASS"]
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-event-respond-with-readable-stream.https.html.ini +++ b/testing/web-platform/meta/service-workers/service-worker/fetch-event-respond-with-readable-stream.https.html.ini @@ -1,4 +1,3 @@ [fetch-event-respond-with-readable-stream.https.html] disabled: - if os == "android" and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499972 - + if (os == "android") and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499972
--- a/testing/web-platform/meta/service-workers/service-worker/registration-updateviacache.https.html.ini +++ b/testing/web-platform/meta/service-workers/service-worker/registration-updateviacache.https.html.ini @@ -23,10 +23,10 @@ [register-via-link-header-updateViaCache-none] expected: FAIL [updateViaCache is not updated if register() rejects] expected: FAIL [register-with-updateViaCache-imports-then-imports] expected: - if (os == "win") and debug and (processor == "x86_64"): ["PASS", "FAIL"] + if debug and (os == "win") and (processor == "x86_64"): ["PASS", "FAIL"]
--- a/testing/web-platform/meta/service-workers/service-worker/skip-waiting-using-registration.https.html.ini +++ b/testing/web-platform/meta/service-workers/service-worker/skip-waiting-using-registration.https.html.ini @@ -1,13 +1,13 @@ [skip-waiting-using-registration.https.html] disabled: if (os == "win") and (version == "6.1.7601"): https://bugzilla.mozilla.org/show_bug.cgi?id=1425175 if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1425175 expected: - if os == "mac": [OK, FAIL] - if os == "android": [OK, FAIL] + if os == "mac": ["OK", "FAIL"] + if os == "android": ["OK", "FAIL"] [Test skipWaiting while a client is using the registration] expected: - if (os == "mac") and debug: [FAIL, PASS] - if (os == "mac") and not debug: [PASS, FAIL] - if os == "android": [PASS, FAIL] + if (os == "mac") and not debug: ["PASS", "FAIL"] + if (os == "mac") and debug: ["PASS", "FAIL"] + if os == "android": ["PASS", "FAIL"]
--- a/testing/web-platform/meta/service-workers/service-worker/waiting.https.html.ini +++ b/testing/web-platform/meta/service-workers/service-worker/waiting.https.html.ini @@ -1,7 +1,6 @@ [waiting.https.html] [waiting is set after installation] expected: - if webrender and (os == "win") and debug: PASS if webrender and (os == "linux"): ["FAIL", "PASS"] FAIL
--- a/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-cert_parse_error-downgraded.tentative.html.ini +++ b/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-cert_parse_error-downgraded.tentative.html.ini @@ -1,21 +1,23 @@ [sxg-reporting-prefetch-cert_parse_error-downgraded.tentative.html] expected: if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT - if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [OK, TIMEOUT] + if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "OK"] if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT + if not debug and (os == "win") and (processor == "x86"): TIMEOUT + if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT if not debug and (os == "linux") and webrender: TIMEOUT if not debug and (os == "mac"): TIMEOUT - if not debug and (os == "win"): TIMEOUT [SXG reporting test of sxg.failed downgraded from sxg.cert_parse_error for prefetch.] expected: if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT + if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "FAIL"] if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT - if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [FAIL, TIMEOUT] + if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT + if not debug and (os == "win") and (processor == "x86"): TIMEOUT if not debug and (os == "linux") and webrender: TIMEOUT if not debug and (os == "mac"): TIMEOUT - if not debug and (os == "win"): TIMEOUT FAIL
--- a/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-invalid_integrity_header.tentative.html.ini +++ b/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-invalid_integrity_header.tentative.html.ini @@ -1,21 +1,23 @@ [sxg-reporting-prefetch-invalid_integrity_header.tentative.html] expected: if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT - if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [OK, TIMEOUT] + if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "OK"] + if not debug and (os == "win") and (processor == "x86"): TIMEOUT + if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT if not debug and (os == "linux") and webrender: TIMEOUT - if not debug and (os == "win"): TIMEOUT if not debug and (os == "mac"): TIMEOUT [SXG reporting test of sxg.invalid_integrity_header for prefetch.] expected: if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT + if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "FAIL"] if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT - if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [FAIL, TIMEOUT] if not debug and (os == "linux") and webrender: TIMEOUT - if not debug and (os == "win"): TIMEOUT + if not debug and (os == "win") and (processor == "x86"): TIMEOUT + if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT if not debug and (os == "mac"): TIMEOUT FAIL
deleted file mode 100644 --- a/testing/web-platform/meta/streams/readable-streams/floating-point-total-queue-size.any.js.ini +++ /dev/null @@ -1,10 +0,0 @@ -[floating-point-total-queue-size.any.worker.html] - -[floating-point-total-queue-size.any.sharedworker.html] - -[floating-point-total-queue-size.any.serviceworker.html] - [floating-point-total-queue-size] - expected: FAIL - - -[floating-point-total-queue-size.any.html]
--- a/testing/web-platform/meta/svg/animations/correct-events-for-short-animations-with-syncbases.html.ini +++ b/testing/web-platform/meta/svg/animations/correct-events-for-short-animations-with-syncbases.html.ini @@ -1,6 +1,6 @@ [correct-events-for-short-animations-with-syncbases.html] [Correct events for short animations with syncbases] expected: - if (processor == "x86") and (os == "linux"): PASS + if (os == "linux") and (processor == "x86"): PASS [PASS, FAIL]
--- a/testing/web-platform/meta/svg/animations/slider-switch.html.ini +++ b/testing/web-platform/meta/svg/animations/slider-switch.html.ini @@ -1,7 +1,7 @@ [slider-switch.html] [Check correct event bases for onclick] expected: - if (os == "android") and debug: [PASS, FAIL] - if (os == "android") and not debug: [FAIL, PASS] + if (processor == "x86_64") and (os == "android") and not debug: ["FAIL", "PASS"] + if processor == "aarch64": ["FAIL", "PASS"] [PASS, FAIL]
--- a/testing/web-platform/meta/svg/shapes/rect-03.svg.ini +++ b/testing/web-platform/meta/svg/shapes/rect-03.svg.ini @@ -1,9 +1,3 @@ [rect-03.svg] expected: - if (os == "linux") and not webrender: PASS - if os == "mac": PASS - if (os == "win") and (version == "6.1.7601"): PASS - if not webrender and (os == "win") and (version == "10.0.17134"): PASS - if (os == "android") and not e10s: PASS - if (os == "android") and e10s: PASS - FAIL + if webrender: FAIL
--- a/testing/web-platform/meta/user-timing/measure.html.ini +++ b/testing/web-platform/meta/user-timing/measure.html.ini @@ -1,15 +1,13 @@ [measure.html] [window.performance.getEntriesByName("measure_start_end")[0\].startTime is correct] expected: - if not debug and (processor == "x86_64") and (os == "linux") and not webrender: [FAIL, PASS] - if not debug and (processor == "x86_64") and (os == "win") and not webrender: [PASS, FAIL] - if not debug and (os == "linux") and (processor == "x86"): [PASS, FAIL] - if not debug and (os == "win"): [PASS, FAIL] + if not debug and (os == "linux") and not webrender and (processor == "x86"): ["PASS", "FAIL"] + if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["PASS", "FAIL"] + if not debug and (os == "win"): ["PASS", "FAIL"] [window.performance.getEntriesByName("measure_start_no_end")[0\].startTime is correct] expected: - if not debug and (processor == "x86_64") and (os == "linux") and not webrender: [FAIL, PASS] - if not debug and (processor == "x86_64") and (os == "win") and not webrender: [PASS, FAIL] - if not debug and (os == "linux") and (processor == "x86"): [PASS, FAIL] - if not debug and (os == "win"): [PASS, FAIL] + if not debug and (os == "linux") and not webrender and (processor == "x86"): ["PASS", "FAIL"] + if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["PASS", "FAIL"] + if not debug and (os == "win"): ["PASS", "FAIL"]
--- a/testing/web-platform/meta/web-locks/query-empty.tentative.https.any.js.ini +++ b/testing/web-platform/meta/web-locks/query-empty.tentative.https.any.js.ini @@ -10,16 +10,15 @@ [query-empty.tentative.https.any.sharedworker.html] [query() returns dictionary with empty arrays when no locks are held] expected: FAIL [query-empty.tentative.https.any.serviceworker.html] expected: - if (os == "linux") and debug and webrender: [OK, TIMEOUT] - if (os == "linux") and debug and not webrender: [OK, TIMEOUT] + if (os == "linux") and debug: ["OK", "TIMEOUT"] [query() returns dictionary with empty arrays when no locks are held] expected: FAIL [Web Locks API: navigator.locks.query method - no locks held] expected: FAIL
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webdriver/tests/take_element_screenshot/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webdriver/tests/take_screenshot/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webrtc-identity/idlharness.https.window.js.ini @@ -0,0 +1,55 @@ +[idlharness.https.window.html] + [MediaStreamTrack interface: track must inherit property "isolated" with the proper type] + expected: FAIL + + [RTCIdentityAssertion interface object name] + expected: FAIL + + [RTCIdentityAssertion interface: new RTCIdentityAssertion('idp', 'name') must inherit property "idp" with the proper type] + expected: FAIL + + [RTCIdentityAssertion must be primary interface of new RTCIdentityAssertion('idp', 'name')] + expected: FAIL + + [RTCIdentityAssertion interface: attribute name] + expected: FAIL + + [RTCIdentityAssertion interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [MediaStreamTrack interface: attribute isolated] + expected: FAIL + + [MediaStreamTrack interface: track must inherit property "onisolationchange" with the proper type] + expected: FAIL + + [RTCIdentityAssertion interface: existence and properties of interface object] + expected: FAIL + + [RTCIdentityAssertion interface object length] + expected: FAIL + + [RTCIdentityAssertion interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [RTCIdentityAssertion interface: existence and properties of interface prototype object] + expected: FAIL + + [RTCPeerConnection interface: attribute idpErrorInfo] + expected: FAIL + + [RTCIdentityAssertion interface: new RTCIdentityAssertion('idp', 'name') must inherit property "name" with the proper type] + expected: FAIL + + [RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type] + expected: FAIL + + [MediaStreamTrack interface: attribute onisolationchange] + expected: FAIL + + [Stringification of new RTCIdentityAssertion('idp', 'name')] + expected: FAIL + + [RTCIdentityAssertion interface: attribute idp] + expected: FAIL +
deleted file mode 100644 --- a/testing/web-platform/meta/webrtc-stats/idlharness.window.js.ini +++ /dev/null @@ -1,4 +0,0 @@ -[idlharness.window.html] - [idl_test validation] - expected: FAIL -
--- a/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini +++ b/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini @@ -588,11 +588,8 @@ expected: FAIL [RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit)] expected: FAIL [RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)] expected: FAIL - [idl_test validation] - expected: FAIL -
--- a/testing/web-platform/meta/websockets/stream-tentative/close.any.js.ini +++ b/testing/web-platform/meta/websockets/stream-tentative/close.any.js.ini @@ -250,16 +250,19 @@ expected: FAIL [aborting the writable should result in a clean close] expected: FAIL [unspecified close code should send empty Close frame] expected: FAIL + [close] + expected: FAIL + [close.any.sharedworker.html] [unspecified close code with non-empty reason should set code to 1000] expected: FAIL [canceling the readable with an invalid code should be ignored] expected: FAIL
--- a/testing/web-platform/meta/webusb/idlharness.https.any.js.ini +++ b/testing/web-platform/meta/webusb/idlharness.https.any.js.ini @@ -1502,16 +1502,37 @@ expected: FAIL [USBIsochronousOutTransferResult interface: existence and properties of interface prototype object's "constructor" property] expected: FAIL [USBConfiguration interface object name] expected: FAIL + [USBPermissionResult interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [USBPermissionResult interface: attribute devices] + expected: FAIL + + [USBPermissionResult interface object length] + expected: FAIL + + [USBPermissionResult interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [USBPermissionResult interface object name] + expected: FAIL + + [USBPermissionResult interface: existence and properties of interface object] + expected: FAIL + + [USBPermissionResult interface: existence and properties of interface prototype object] + expected: FAIL + [idlharness.https.any.sharedworker.html] [WebUSB IDL test] expected: FAIL [idlharness] expected: FAIL
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webxr/xrDevice_isSessionSupported_immersive.https.html.ini @@ -0,0 +1,4 @@ +[xrDevice_isSessionSupported_immersive.https.html] + [isSessionSupported resolves to true when immersive options supported] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webxr/xrDevice_isSessionSupported_immersive_unsupported.https.html.ini @@ -0,0 +1,4 @@ +[xrDevice_isSessionSupported_immersive_unsupported.https.html] + [isSessionSupported resolves to false when options not supported] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webxr/xrDevice_isSessionSupported_inline.https.html.ini @@ -0,0 +1,4 @@ +[xrDevice_isSessionSupported_inline.https.html] + [isSessionSupported resolves to true when inline options supported] + expected: FAIL +
new file mode 100644 --- /dev/null +++ b/testing/web-platform/meta/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini @@ -0,0 +1,5 @@ +[xrReferenceSpace_originOffset_viewer.https.html] + expected: ERROR + [Creating XRReferenceSpace origin offset off of `viewer` space works.] + expected: FAIL +
deleted file mode 100644 --- a/testing/web-platform/meta/workers/Worker-replace-self.any.js.ini +++ /dev/null @@ -1,8 +0,0 @@ -[Worker-replace-self.any.sharedworker.html] - -[Worker-replace-self.any.worker.html] - -[Worker-replace-self.any.serviceworker.html] - [Worker-replace-self] - expected: FAIL -
--- a/testing/web-platform/tests/.taskcluster.yml +++ b/testing/web-platform/tests/.taskcluster.yml @@ -277,17 +277,16 @@ tasks: pull-request - name: resources/ tests description: >- Tests for testharness.js and other files in resources/ script: >- export TOXENV=py27; ./tools/ci/run_tc.py \ --browser=firefox \ - --channel=experimental \ --xvfb \ resources_unittest \ tools/ci/ci_resources_unittest.sh conditions: pull-request - name: infrastructure/ tests description: >- Smoketests for wptrunner
--- a/testing/web-platform/tests/common/security-features/tools/format_spec_src_json.py +++ b/testing/web-platform/tests/common/security-features/tools/format_spec_src_json.py @@ -1,17 +1,19 @@ import collections import json import os def main(): '''Formats spec.src.json.''' script_directory = os.path.dirname(os.path.abspath(__file__)) - for dir in ['mixed-content', 'referrer-policy']: + for dir in [ + 'mixed-content', 'referrer-policy', 'upgrade-insecure-requests' + ]: filename = os.path.join(script_directory, '..', '..', '..', dir, 'spec.src.json') spec = json.load( open(filename, 'r'), object_pairs_hook=collections.OrderedDict) with open(filename, 'w') as f: f.write(json.dumps(spec, indent=2, separators=(',', ': '))) f.write('\n')
--- a/testing/web-platform/tests/common/security-features/tools/generate.py +++ b/testing/web-platform/tests/common/security-features/tools/generate.py @@ -105,16 +105,28 @@ def handle_deliveries(policy_deliveries) if delivery.delivery_type == 'meta': meta += '<meta http-equiv="Content-Security-Policy" ' + \ 'content="block-all-mixed-content">' elif delivery.delivery_type == 'http-rp': headers['Content-Security-Policy'] = 'block-all-mixed-content' else: raise Exception( 'Invalid delivery_type: %s' % delivery.delivery_type) + elif delivery.key == 'upgradeInsecureRequests': + # https://w3c.github.io/webappsec-upgrade-insecure-requests/#delivery + assert (delivery.value == 'upgrade') + if delivery.delivery_type == 'meta': + meta += '<meta http-equiv="Content-Security-Policy" ' + \ + 'content="upgrade-insecure-requests">' + elif delivery.delivery_type == 'http-rp': + headers[ + 'Content-Security-Policy'] = 'upgrade-insecure-requests' + else: + raise Exception( + 'Invalid delivery_type: %s' % delivery.delivery_type) else: raise Exception('Invalid delivery_key: %s' % delivery.key) return {"meta": meta, "headers": headers} def generate_selection(spec_json, config, selection, spec, test_html_template_basename): test_filename = get_test_filename(config, selection)
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-bad-chunks.any.js @@ -0,0 +1,70 @@ +// META: global=worker + +'use strict'; + +const badChunks = [ + { + name: 'undefined', + value: undefined + }, + { + name: 'null', + value: null + }, + { + name: 'numeric', + value: 3.14 + }, + { + name: 'object, not BufferSource', + value: {} + }, + { + name: 'array', + value: [65] + }, + { + name: 'SharedArrayBuffer', + // Use a getter to postpone construction so that all tests don't fail where + // SharedArrayBuffer is not yet implemented. + get value() { + return new SharedArrayBuffer(); + } + }, + { + name: 'shared Uint8Array', + get value() { + return new Uint8Array(new SharedArrayBuffer()) + } + }, + { + name: 'invalid deflate bytes', + value: new Uint8Array([0, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]) + }, + { + name: 'invalid gzip bytes', + value: new Uint8Array([0, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]) + }, +]; + +for (const chunk of badChunks) { + promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunk.value); + const readPromise = reader.read(); + await promise_rejects(t, new TypeError(), writePromise, 'write should reject'); + await promise_rejects(t, new TypeError(), readPromise, 'read should reject'); + }, `chunk of type ${chunk.name} should error the stream for gzip`); + + promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunk.value); + const readPromise = reader.read(); + await promise_rejects(t, new TypeError(), writePromise, 'write should reject'); + await promise_rejects(t, new TypeError(), readPromise, 'read should reject'); + }, `chunk of type ${chunk.name} should error the stream for deflate`); +}
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-constructor-error.any.js @@ -0,0 +1,15 @@ +// META: global=worker + +'use strict'; + +test(t => { + assert_throws(new TypeError(), () => new DecompressionStream('a'), 'constructor should throw'); +}, '"a" should cause the constructor to throw'); + +test(t => { + assert_throws(new TypeError(), () => new DecompressionStream(), 'constructor should throw'); +}, 'no input should cause the constructor to throw'); + +test(t => { + assert_throws(new Error(), () => new DecompressionStream({ toString() { throw Error(); } }), 'constructor should throw'); +}, 'non-string input should cause the constructor to throw');
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-correct-input.any.js @@ -0,0 +1,26 @@ +// META: global=worker + +'use strict'; + +const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); +const trueChunkValue = new TextEncoder().encode('expected output'); + +promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateChunkValue); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), trueChunkValue, "value should match"); +}, 'decompressing deflated input should work'); + + +promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(gzipChunkValue); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), trueChunkValue, "value should match"); +}, 'decompressing gzip input should work');
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-empty-input.any.js @@ -0,0 +1,30 @@ +// META: global=worker + +'use strict'; + +const gzipEmptyValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]); +const deflateEmptyValue = new Uint8Array([120, 156, 3, 0, 0, 0, 0, 1]); + +promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(gzipEmptyValue); + writer.close(); + const { value, done } = await reader.read(); + assert_true(done, "read() should set done"); + assert_equals(value, undefined, "value should be undefined"); + await writePromise; +}, 'decompressing gzip empty input should work'); + +promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateEmptyValue); + writer.close(); + const { value, done } = await reader.read(); + assert_true(done, "read() should set done"); + assert_equals(value, undefined, "value should be undefined"); + await writePromise; +}, 'decompressing deflate empty input should work');
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-split-chunk.any.js @@ -0,0 +1,44 @@ +// META: global=worker + +'use strict'; + +const compressedBytesWithDeflate = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const compressedBytesWithGzip = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); +const expectedChunkValue = new TextEncoder().encode('expected output'); + +async function decompressArrayBuffer(input, format, chunkSize) { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + for (let beginning = 0; beginning < input.length; beginning += chunkSize) { + writer.write(input.slice(beginning, beginning + chunkSize)); + } + writer.close(); + const out = []; + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) break; + out.push(value); + totalSize += value.byteLength; + } + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +for (let chunkSize = 1; chunkSize < 16; ++chunkSize) { + promise_test(async t => { + const decompressedData = await decompressArrayBuffer(compressedBytesWithDeflate, 'deflate', chunkSize); + assert_array_equals(decompressedData, expectedChunkValue, "value should match"); + }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in deflate`); + + promise_test(async t => { + const decompressedData = await decompressArrayBuffer(compressedBytesWithGzip, 'gzip', chunkSize); + assert_array_equals(decompressedData, expectedChunkValue, "value should match"); + }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in gzip`); +}
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-uint8array-output.any.js @@ -0,0 +1,26 @@ +// META: global=worker + +'use strict'; + +const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); + +promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateChunkValue); + const { value } = await reader.read(); + assert_equals(value.constructor, Uint8Array, "type should match"); + await writePromise; +}, 'decompressing deflated output should give Uint8Array chunks'); + +promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(gzipChunkValue); + const { value } = await reader.read(); + assert_equals(value.constructor, Uint8Array, "type should match"); + await writePromise; +}, 'decompressing gzip output should give Uint8Array chunks');
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/content-security-policy/frame-ancestors/frame-ancestors-from-serviceworker.https.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> +</head> +<body> + <script> + var t = async_test("A 'frame-ancestors' CSP directive set from a serviceworker response with a value 'none' should block rendering."); + + // Register service worker. + var worker = 'support/service-worker.js'; + var scope = 'support/service-worker/'; + service_worker_unregister_and_register(t, worker, scope) + .then(registration => wait_for_state(t, registration.installing, 'activated')) + .then(() => { + // Load iframe. + var iframe = document.createElement("iframe"); + function iframeLoaded(ev) { + var failed = false; + try { + ev.target.contentWindow.location.href; + failed = true; + } catch (ex) {} + t.step_func_done(() => assert_false(failed, "The IFrame should have been blocked. It wasn't."))(); + }; + iframe.addEventListener("load", iframeLoaded); + iframe.addEventListener("error", iframeLoaded); + iframe.src = "/content-security-policy/frame-ancestors/support/service-worker/frame-ancestors-none.html"; + document.body.appendChild(iframe); + }); + </script> +</body> +</html> +
--- a/testing/web-platform/tests/content-security-policy/frame-ancestors/report-blocked-frame.sub.html +++ b/testing/web-platform/tests/content-security-policy/frame-ancestors/report-blocked-frame.sub.html @@ -1,10 +1,11 @@ <!DOCTYPE html> <html> +<meta name="timeout" content="long"> <head> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <title>Blocked frames are reported correctly</title> </head> <body> <iframe src="support/content-security-policy.sub.html?policy=report-uri%20../../support/report.py%3Fop=put%26reportID={{$id:uuid()}}%3B%20frame-ancestors%20'none'"></iframe> <script async defer src="../support/checkReport.sub.js?reportField=violated-directive&reportValue=frame-ancestors%20'none'&reportID={{$id}}"></script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/content-security-policy/frame-ancestors/support/service-worker.js @@ -0,0 +1,10 @@ +self.onfetch = e => { + e.respondWith(function() { + return new Promise((resolve) => { + var headers = new Headers; + headers.append("Content-Security-Policy", "frame-ancestors 'none'"); + var response = new Response("", { "headers" : headers, "status": 200, "statusText" : "OK" }); + resolve(response); + }); + }()); +};
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/cookies/samesite/about-blank-subresource.https.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/cookies/resources/cookie-helper.sub.js"></script> +</head> +<body onload="doTests()"> + <script> + function doTests() { + promise_test(async function(t) { + var child = window.open(""); + child.onmessage = (ev) => { + child.opener.postMessage(ev.data, '*'); + }; + var grandKid = child.document.createElement("iframe"); + child.document.body.appendChild(grandKid); + var value = "" + Math.random(); + await resetSameSiteCookies(SECURE_ORIGIN, value); + + // Load at what cookies a subresource below an about:blank iframe + // inheritting this origin gets. + grandKid.src = SECURE_ORIGIN + "/cookies/samesite/resources/iframe-subresource-report.html" + var e = await wait_for_message("COOKIES", SECURE_ORIGIN); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_unspecified", value, true); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_lax", value, true); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_strict", value, true); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_none", value, true); + }, "SameSite cookies on subresource of top-level about:blank window"); + } + </script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/cookies/samesite/about-blank-toplevel.https.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/cookies/resources/cookie-helper.sub.js"></script> +</head> +<body onload="doTests()"> + <script> + function doTests() { + promise_test(async function(t) { + var child = window.open(""); + child.onmessage = (ev) => { + child.opener.postMessage(ev.data, '*'); + }; + var grandKid = child.document.createElement("iframe"); + child.document.body.appendChild(grandKid); + var value = "" + Math.random(); + await resetSameSiteCookies(SECURE_ORIGIN, value); + + // Using postToParent.py here to see cookies used when navigating the page. + grandKid.src = SECURE_ORIGIN + "/cookies/resources/postToParent.py" + var e = await wait_for_message("COOKIES", SECURE_ORIGIN); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_unspecified", value, true); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_lax", value, true); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_strict", value, true); + assert_cookie(SECURE_ORIGIN, e.data, "samesite_none", value, true); + }, "SameSite cookies with top-level about:blank window"); + } + </script> +</body>
--- a/testing/web-platform/tests/cookies/samesite/resources/iframe-subresource-report.html +++ b/testing/web-platform/tests/cookies/samesite/resources/iframe-subresource-report.html @@ -1,13 +1,14 @@ <!DOCTYPE html> <head> <script src="/cookies/resources/cookie-helper.sub.js"></script> <script> function reportSubresourceCookies() { credFetch(SECURE_ORIGIN + "/cookies/resources/list.py") .then(r => r.json()) .then(cookies => { cookies.type = "COOKIES"; - window.parent.postMessage(cookies, "*");}); + target = window.opener ? window.opener : window.parent; + target.postMessage(cookies, "*");}); } </script> </head> <body onload="reportSubresourceCookies()">
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-animations/parsing/animation-computed.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Animations: getComputedStyle().animation</title> +<link rel="help" href="https://drafts.csswg.org/css-animations/#propdef-animation"> +<meta name="assert" content="animation computed value is as specified."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<div id="target"></div> +<script> +// <single-animation> = <time> || <easing-function> || <time> || +// <single-animation-iteration-count> || <single-animation-direction> || +// <single-animation-fill-mode> || <single-animation-play-state> || +// [ none | <keyframes-name> ] +test_computed_value("animation", "1s", "1s ease 0s 1 normal none running none"); +test_computed_value("animation", "cubic-bezier(0, -2, 1, 3)", "0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none"); +test_computed_value("animation", "1s -3s", "1s ease -3s 1 normal none running none"); +test_computed_value("animation", "4", "0s ease 0s 4 normal none running none"); +test_computed_value("animation", "reverse", "0s ease 0s 1 reverse none running none"); +test_computed_value("animation", "both", "0s ease 0s 1 normal both running none"); +test_computed_value("animation", "paused", "0s ease 0s 1 normal none paused none"); +test_computed_value("animation", "none", "0s ease 0s 1 normal none running none"); +test_computed_value("animation", "anim", "0s ease 0s 1 normal none running anim"); + +test_computed_value("animation", "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)", + "1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim"); + +test_computed_value("animation", "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)", + "0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none"); + +// TODO: Add test with a single timing-function keyword. +</script> +</body> +</html>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-box/animation/margin-interpolation.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>margin interpolation</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties"> +<meta name="assert" content="margin supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + margin: 10px; + border: solid; + display: inline-block; +} + +.target { + width: 40px; + height: 40px; + background-color: black; + display: inline-block; + margin: 30px; + opacity: 0.5; +} + +.expected { + background-color: green; +} +</style> + +<body> +<template id="target-template"> + <div> + <div class="target"></div> + </div> +</template> + +<script> +test_interpolation({ + property: 'margin', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.3, expect: '33px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_interpolation({ + property: 'margin', + from: 'initial', + to: '20px', +}, [ + {at: -0.3, expect: '-6px'}, + {at: 0, expect: '0px'}, + {at: 0.3, expect: '6px'}, + {at: 0.6, expect: '12px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '30px'}, +]); + +test_interpolation({ + property: 'margin', + from: 'inherit', + to: '20px', +}, [ + {at: -0.3, expect: '7px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_interpolation({ + property: 'margin', + from: 'unset', + to: '20px', +}, [ + {at: -0.3, expect: '-6px'}, + {at: 0, expect: '0px'}, + {at: 0.3, expect: '6px'}, + {at: 0.6, expect: '12px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '30px'}, +]); + +test_interpolation({ + property: 'margin', + from: '0px', + to: '10px' +}, [ + {at: -0.3, expect: '-3px'}, + {at: 0, expect: '0px'}, + {at: 0.3, expect: '3px'}, + {at: 0.6, expect: '6px'}, + {at: 1, expect: '10px'}, + {at: 1.5, expect: '15px'} +]); + +test_interpolation({ + property: 'margin', + from: '20px 40px 60px 80px', + to: '30px 50px 70px 90px' +}, [ + {at: -0.3, expect: '17px 37px 57px 77px'}, + {at: 0, expect: '20px 40px 60px 80px'}, + {at: 0.3, expect: '23px 43px 63px 83px'}, + {at: 0.6, expect: '26px 46px 66px 86px'}, + {at: 1, expect: '30px 50px 70px 90px'}, + {at: 1.5, expect: '35px 55px 75px 95px'} +]); +</script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-color/animation/opacity-interpolation.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>opacity interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-color-3/#opacity"> +<meta name="assert" content="opacity supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + opacity: 0.8; +} + +.target { + width: 100px; + height: 100px; + background-color: black; + display: inline-block; + opacity: 0.1; +} + +.expected { + background-color: green; +} +</style> + +<body> +<script> +test_interpolation({ + property: 'opacity', + from: neutralKeyframe, + to: '0.2', +}, [ + {at: -0.3, expect: '0.07'}, + {at: 0, expect: '0.1'}, + {at: 0.3, expect: '0.13'}, + {at: 0.6, expect: '0.16'}, + {at: 1, expect: '0.2'}, + {at: 1.5, expect: '0.25'}, +]); + +test_interpolation({ + property: 'opacity', + from: 'initial', + to: '0.2', +}, [ + {at: -0.3, expect: '1'}, + {at: 0, expect: '1'}, + {at: 0.3, expect: '0.76'}, + {at: 0.6, expect: '0.52'}, + {at: 1, expect: '0.2'}, + {at: 1.5, expect: '0'}, +]); + +test_interpolation({ + property: 'opacity', + from: 'inherit', + to: '0.2', +}, [ + {at: -0.3, expect: '0.98'}, + {at: 0, expect: '0.8'}, + {at: 0.3, expect: '0.62'}, + {at: 0.6, expect: '0.44'}, + {at: 1, expect: '0.2'}, + {at: 1.5, expect: '0'}, +]); + +test_interpolation({ + property: 'opacity', + from: 'unset', + to: '0.2', +}, [ + {at: -0.3, expect: '1'}, + {at: 0, expect: '1'}, + {at: 0.3, expect: '0.76'}, + {at: 0.6, expect: '0.52'}, + {at: 1, expect: '0.2'}, + {at: 1.5, expect: '0'}, +]); + +test_interpolation({ + property: 'opacity', + from: '0', + to: '1' +}, [ + {at: -0.3, expect: '0'}, // CSS opacity is [0-1]. + {at: 0, expect: '0'}, + {at: 0.3, expect: '0.3'}, + {at: 0.6, expect: '0.6'}, + {at: 1, expect: '1'}, + {at: 1.5, expect: '1'} +]); +</script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-flexbox/animation/order-interpolation.html @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>order interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property"> +<meta name="assert" content="order supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + order: 30; +} + +.target { + order: 10; +} +</style> +<body> +<script> +test_interpolation({ + property: 'order', + from: neutralKeyframe, + to: '20', +}, [ + {at: -3, expect: '-20'}, + {at: -0.5, expect: '5'}, + {at: 0, expect: '10'}, + {at: 0.3, expect: '13'}, + {at: 0.6, expect: '16'}, + {at: 1, expect: '20'}, + {at: 1.5, expect: '25'}, +]); + +test_interpolation({ + property: 'order', + from: 'initial', + to: '20', +}, [ + {at: -3, expect: '-60'}, + {at: -0.5, expect: '-10'}, + {at: 0, expect: '0'}, + {at: 0.3, expect: '6'}, + {at: 0.6, expect: '12'}, + {at: 1, expect: '20'}, + {at: 1.5, expect: '30'}, +]); + +test_interpolation({ + property: 'order', + from: 'inherit', + to: '20', +}, [ + {at: -3, expect: '60'}, + {at: -0.5, expect: '35'}, + {at: 0, expect: '30'}, + {at: 0.3, expect: '27'}, + {at: 0.6, expect: '24'}, + {at: 1, expect: '20'}, + {at: 1.5, expect: '15'}, +]); + +test_interpolation({ + property: 'order', + from: 'unset', + to: '20', +}, [ + {at: -3, expect: '-60'}, + {at: -0.5, expect: '-10'}, + {at: 0, expect: '0'}, + {at: 0.3, expect: '6'}, + {at: 0.6, expect: '12'}, + {at: 1, expect: '20'}, + {at: 1.5, expect: '30'}, +]); + +test_interpolation({ + property: 'order', + from: '10', + to: '20' +}, [ + {at: -3.0, expect: '-20'}, + {at: -0.5, expect: '5'}, + {at: 0, expect: '10'}, + {at: 0.3, expect: '13'}, + {at: 0.6, expect: '16'}, + {at: 1, expect: '20'}, + {at: 1.5, expect: '25'} +]); + +test_interpolation({ + property: 'order', + from: '2', + to: '4' +}, [ + {at: -3.0, expect: '-4'}, + {at: -0.5, expect: '1'}, + {at: 0, expect: '2'}, + {at: 0.3, expect: '3'}, + {at: 0.6, expect: '3'}, + {at: 1, expect: '4'}, + {at: 1.5, expect: '5'} +]); +</script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-fonts/parsing/font-variant-invalid.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Fonts Module Level 4: parsing font-variant with invalid values</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variant"> +<meta name="assert" content="font-variant supports only the grammar 'normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby || [ sub | super ] ]'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value('font-variant', 'normal none'); + +// <common-lig-values> +test_invalid_value('font-variant', 'common-ligatures no-common-ligatures'); + +// <discretionary-lig-values> +test_invalid_value('font-variant', 'discretionary-ligatures no-discretionary-ligatures'); + +// <historical-lig-values> +test_invalid_value('font-variant', 'historical-ligatures no-historical-ligatures'); + +// <contextual-alt-values> +test_invalid_value('font-variant', 'contextual no-contextual'); + +// [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] +test_invalid_value('font-variant', 'small-caps all-small-caps'); + +// [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] +test_invalid_value('font-variant', 'stylistic(flowing) stylistic(flowing)'); + +// <numeric-figure-values> +test_invalid_value('font-variant', 'lining-nums oldstyle-nums'); + +// <numeric-spacing-values> +test_invalid_value('font-variant', 'proportional-nums tabular-nums'); + +// <numeric-fraction-values> +test_invalid_value('font-variant', 'diagonal-fractions stacked-fractions'); + +// ordinal +test_invalid_value('font-variant', 'ordinal slashed-zero ordinal'); + +// slashed-zero +test_invalid_value('font-variant', 'slashed-zero jis78 slashed-zero'); + +// <east-asian-variant-values> +test_invalid_value('font-variant', 'jis78 jis83'); + +// <east-asian-width-values> +test_invalid_value('font-variant', 'full-width proportional-width'); + +// ruby +test_invalid_value('font-variant', 'ruby sub ruby'); + +// [ sub | super ] +test_invalid_value('font-variant', 'sub super'); +</script> +</body> +</html>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-fonts/parsing/font-variant-valid.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Fonts Module Level 4: parsing font-variant with valid values</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variant"> +<meta name="assert" content="font-variant supports the full grammar 'normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby || [ sub | super ] ]'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value('font-variant', 'normal'); +test_valid_value('font-variant', 'none'); + +// <common-lig-values> +test_valid_value('font-variant', 'common-ligatures'); +test_valid_value('font-variant', 'no-common-ligatures'); + +// <discretionary-lig-values> +test_valid_value('font-variant', 'discretionary-ligatures'); +test_valid_value('font-variant', 'no-discretionary-ligatures'); + +// <historical-lig-values> +test_valid_value('font-variant', 'historical-ligatures'); +test_valid_value('font-variant', 'no-historical-ligatures'); + +// <contextual-alt-values> +test_valid_value('font-variant', 'contextual'); +test_valid_value('font-variant', 'no-contextual'); + +// [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] +test_valid_value('font-variant', 'small-caps'); +test_valid_value('font-variant', 'all-small-caps'); +test_valid_value('font-variant', 'petite-caps'); +test_valid_value('font-variant', 'all-petite-caps'); +test_valid_value('font-variant', 'unicase'); +test_valid_value('font-variant', 'titling-caps'); + +// [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] +test_valid_value('font-variant', 'stylistic(flowing)'); +test_valid_value('font-variant', 'historical-forms'); +test_valid_value('font-variant', 'styleset(flowing)'); +test_valid_value('font-variant', 'character-variant(flowing)'); +test_valid_value('font-variant', 'swash(flowing)'); +test_valid_value('font-variant', 'ornaments(flowing)'); +test_valid_value('font-variant', 'annotation(flowing)'); + +test_valid_value('font-variant', 'stylistic(flowing) historical-forms styleset(flowing) character-variant(flowing) swash(flowing) ornaments(flowing) annotation(flowing)'); + +test_valid_value('font-variant', 'annotation(flowing) ornaments(flowing) swash(flowing) character-variant(flowing) styleset(flowing) historical-forms stylistic(flowing)', 'stylistic(flowing) historical-forms styleset(flowing) character-variant(flowing) swash(flowing) ornaments(flowing) annotation(flowing)'); + +// <numeric-figure-values> +test_valid_value('font-variant', 'lining-nums'); +test_valid_value('font-variant', 'oldstyle-nums'); + +// <numeric-spacing-values> +test_valid_value('font-variant', 'proportional-nums'); +test_valid_value('font-variant', 'tabular-nums'); + +// <numeric-fraction-values> +test_valid_value('font-variant', 'diagonal-fractions'); +test_valid_value('font-variant', 'stacked-fractions'); + +// ordinal +test_valid_value('font-variant', 'ordinal'); + +// slashed-zero +test_valid_value('font-variant', 'slashed-zero'); + +// <east-asian-variant-values> +test_valid_value('font-variant', 'jis78'); +test_valid_value('font-variant', 'jis83'); +test_valid_value('font-variant', 'jis90'); +test_valid_value('font-variant', 'jis04'); +test_valid_value('font-variant', 'simplified'); +test_valid_value('font-variant', 'traditional'); + +// <east-asian-width-values> +test_valid_value('font-variant', 'full-width'); +test_valid_value('font-variant', 'proportional-width'); + +// ruby +test_valid_value('font-variant', 'ruby'); + +// [ sub | super ] +test_valid_value('font-variant', 'sub'); +test_valid_value('font-variant', 'super'); + + +test_valid_value('font-variant', + 'common-ligatures discretionary-ligatures historical-ligatures contextual' + + ' small-caps stylistic(flowing) lining-nums proportional-nums diagonal-fractions' + + ' ordinal slashed-zero jis78 full-width ruby sub'); + +test_valid_value('font-variant', + 'super proportional-width jis83 stacked-fractions' + + ' tabular-nums oldstyle-nums historical-forms all-small-caps no-contextual' + + ' no-historical-ligatures no-discretionary-ligatures no-common-ligatures', + 'no-common-ligatures no-discretionary-ligatures no-historical-ligatures' + + ' no-contextual all-small-caps historical-forms oldstyle-nums tabular-nums' + + ' stacked-fractions jis83 proportional-width super'); +</script> +</body> +</html>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-masking/animations/clip-path-interpolation.html @@ -0,0 +1,141 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>clip-path interpolation</title> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> +<meta name="assert" content="clip-path supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + clip-path: circle(80% at 30% 10%); +} + +.target { + clip-path: circle(60% at 10% 30%); +} +</style> +<body> +<script> +test_interpolation({ + property: 'clip-path', + from: neutralKeyframe, + to: 'circle(40% at 20% 20%)', +}, [ + {at: -0.3, expect: 'circle(66% at 7% 33%)'}, + {at: 0, expect: 'circle(60% at 10% 30%)'}, + {at: 0.3, expect: 'circle(54% at 13% 27%)'}, + {at: 0.6, expect: 'circle(48% at 16% 24%)'}, + {at: 1, expect: 'circle(40% at 20% 20%)'}, + {at: 1.5, expect: 'circle(30% at 25% 15%)'}, +]); + +test_no_interpolation({ + property: 'clip-path', + from: 'initial', + to: 'circle(40% at 20% 20%)', +}); + +test_interpolation({ + property: 'clip-path', + from: 'inherit', + to: 'circle(40% at 20% 20%)', +}, [ + {at: -0.3, expect: 'circle(92% at 33% 7%)'}, + {at: 0, expect: 'circle(80% at 30% 10%)'}, + {at: 0.3, expect: 'circle(68% at 27% 13%)'}, + {at: 0.6, expect: 'circle(56% at 24% 16%)'}, + {at: 1, expect: 'circle(40% at 20% 20%)'}, + {at: 1.5, expect: 'circle(20% at 15% 25%)'}, +]); + +test_no_interpolation({ + property: 'clip-path', + from: 'unset', + to: 'circle(40% at 20% 20%)', +}); + +test_interpolation({ + property: 'clip-path', + from: 'circle(100% at 0% 0%)', + to: 'circle(50% at 25% 25%)', +}, [ + {at: -0.3, expect: 'circle(115% at -7.5% -7.5%)'}, + {at: 0, expect: 'circle(100% at 0% 0%)'}, + {at: 0.3, expect: 'circle(85% at 7.5% 7.5%)'}, + {at: 0.6, expect: 'circle(70% at 15% 15%)'}, + {at: 1, expect: 'circle(50% at 25% 25%)'}, + {at: 1.5, expect: 'circle(25% at 37.5% 37.5%)'} +]); + +test_interpolation({ + property: 'clip-path', + from: 'ellipse(100% 100% at 0% 0%)', + to: 'ellipse(50% 50% at 25% 25%)', +}, [ + {at: -0.3, expect: 'ellipse(115% 115% at -7.5% -7.5%)'}, + {at: 0, expect: 'ellipse(100% 100% at 0% 0%)'}, + {at: 0.3, expect: 'ellipse(85% 85% at 7.5% 7.5%)'}, + {at: 0.6, expect: 'ellipse(70% 70% at 15% 15%)'}, + {at: 1, expect: 'ellipse(50% 50% at 25% 25%)'}, + {at: 1.5, expect: 'ellipse(25% 25% at 37.5% 37.5%)'} +]); + +test_interpolation({ + property: 'clip-path', + from: 'polygon(nonzero, 0px 0px, 25px 25px, 50px 50px)', + to: 'polygon(nonzero, 25px 25px, 50px 50px, 75px 75px)', +}, [ + {at: -0.3, expect: 'polygon(nonzero, -7.5px -7.5px, 17.5px 17.5px, 42.5px 42.5px)'}, + {at: 0, expect: 'polygon(nonzero, 0px 0px, 25px 25px, 50px 50px)'}, + {at: 0.3, expect: 'polygon(nonzero, 7.5px 7.5px, 32.5px 32.5px, 57.5px 57.5px)'}, + {at: 0.6, expect: 'polygon(nonzero, 15px 15px, 40px 40px, 65px 65px)'}, + {at: 1, expect: 'polygon(nonzero, 25px 25px, 50px 50px, 75px 75px)'}, + {at: 1.5, expect: 'polygon(nonzero, 37.5px 37.5px, 62.5px 62.5px, 87.5px 87.5px)'} +]); + +test_no_interpolation({ + property: 'clip-path', + from: 'polygon(evenodd, 0px 0px, 25px 25px, 50px 50px)', + to: 'polygon(nonzero, 25px 25px, 50px 50px, 75px 75px)', +}); + +test_interpolation({ + property: 'clip-path', + from: 'inset(100%)', + to: 'inset(120%)', +}, [ + {at: -0.3, expect: 'inset(94%)'}, + {at: 0, expect: 'inset(100%)'}, + {at: 0.3, expect: 'inset(106%)'}, + {at: 0.6, expect: 'inset(112%)'}, + {at: 1, expect: 'inset(120%)'}, + {at: 1.5, expect: 'inset(130%)'}, +]); + +test_no_interpolation({ + property: 'clip-path', + from: 'none', + to: 'ellipse(100% 100% at 0% 0%)', +}); + +test_interpolation({ + property: 'clip-path', + from: 'circle(25% at right 5% bottom 15px)', + to: 'circle(45% at right 25% bottom 35px)', +}, [ + {at: 0.25, expect: 'circle(30% at 90% calc(-20px + 100%))'}, + {at: 0.5, expect: 'circle(35% at 85% calc(-25px + 100%))'}, + {at: 0.75, expect: 'circle(40% at 80% calc(-30px + 100%))'}, +]); + +test_no_interpolation({ + property: 'clip-path', + from: 'url("/clip-source")', + to: 'ellipse(100% 100% at 0% 0%)', +}); + +</script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-overflow/overflow-codependent-scrollbars.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<link rel="author" href="mailto:atotic@google.com"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#scrollable"> +<meta name="assert" content="What happens when appearance of one scrollbar triggers the other one?"> +<style> +.container { + width: 100px; + height: 100px; + overflow: auto; + background: #DDD; + --too-big: 120px; + --slightly-smaller: 95px; +} +.target { + width: 120px; + height: 95px; + background: rgba(0,255,0,0.3); +} +</style> +<!-- --> +<div class="container"> + <div class="target" style="width:var(--too-big);height:var(--slightly-smaller)" ></div> +</div> +<div class="container"> + <div class="target" style="height:var(--too-big);width:var(--slightly-smaller)" ></div> +</div> + +<script> +test(() => { + Array.from(document.querySelectorAll(".container")).forEach( el => { + let verticalScrollbar = el.offsetWidth - el.clientWidth; + let horizontalScrollbar = el.offsetHeight - el.clientHeight; + assert_equals(verticalScrollbar, horizontalScrollbar, "both scrollbars are visible."); + }); +}, 'appearance of one scrollbar caused the other scrollbar to appear.'); +</script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-tables/animations/border-spacing-interpolation.html @@ -0,0 +1,116 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>boder-spacing interpolation</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/tables.html#separated-borders"> +<meta name="assert" content="border-spacing supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + border-spacing: 30px; +} + +.target { + width: 50px; + height: 50px; + background-color: black; + display: inline-block; + margin: 18px; + border-collapse: separate; + border-spacing: 10px; +} + +.target td { + background-color: white; + border: 1px solid orange; + width: 10px; + height: 10px; +} + +.expected { + background-color: green; +} +</style> + +<body> +<template id="target-template"> + <table> + <tbody> + <tr> + <td></td> + <td></td> + </tr> + </tbody> + </table> +</template> + +<script> +test_interpolation({ + property: 'border-spacing', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.3, expect: '7px 7px'}, + {at: 0, expect: '10px 10px'}, + {at: 0.3, expect: '13px 13px'}, + {at: 0.6, expect: '16px 16px'}, + {at: 1, expect: '20px 20px'}, + {at: 1.5, expect: '25px 25px'}, +]); + +test_interpolation({ + property: 'border-spacing', + from: 'initial', + to: '20px', +}, [ + {at: -0.3, expect: '0px 0px'}, + {at: 0, expect: '0px 0px'}, + {at: 0.3, expect: '6px 6px'}, + {at: 0.6, expect: '12px 12px'}, + {at: 1, expect: '20px 20px'}, + {at: 1.5, expect: '30px 30px'}, +]); + +test_interpolation({ + property: 'border-spacing', + from: 'inherit', + to: '20px', +}, [ + {at: -0.3, expect: '33px 33px'}, + {at: 0, expect: '30px 30px'}, + {at: 0.3, expect: '27px 27px'}, + {at: 0.6, expect: '24px 24px'}, + {at: 1, expect: '20px 20px'}, + {at: 1.5, expect: '15px 15px'}, +]); + +test_interpolation({ + property: 'border-spacing', + from: 'unset', + to: '20px', +}, [ + {at: -0.3, expect: '33px 33px'}, + {at: 0, expect: '30px 30px'}, + {at: 0.3, expect: '27px 27px'}, + {at: 0.6, expect: '24px 24px'}, + {at: 1, expect: '20px 20px'}, + {at: 1.5, expect: '15px 15px'}, +]); + +test_interpolation({ + property: 'border-spacing', + from: '0px', + to: '10px' +}, [ + {at: -0.3, expect: '0px 0px'}, // Can't be negative. + {at: 0, expect: '0px 0px'}, + {at: 0.3, expect: '3px 3px'}, + {at: 0.6, expect: '6px 6px'}, + {at: 1, expect: '10px 10px'}, + {at: 1.5, expect: '15px 15px'} +]); +</script> +</body>
--- a/testing/web-platform/tests/css/css-transforms/animation/rotate-interpolation.html +++ b/testing/web-platform/tests/css/css-transforms/animation/rotate-interpolation.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>rotate interpolation</title> - <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate"> <meta name="assert" content="rotate supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/animation/scale-interpolation.html +++ b/testing/web-platform/tests/css/css-transforms/animation/scale-interpolation.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>scale interpolation</title> - <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale"> <meta name="assert" content="scale supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> <style> .parent { scale: 0.5 1 2
--- a/testing/web-platform/tests/css/css-transforms/animation/translate-interpolation.html +++ b/testing/web-platform/tests/css/css-transforms/animation/translate-interpolation.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>translate interpolation</title> - <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate"> <meta name="assert" content="translate supports <length> and <percentage> animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> <style> body { width: 500px;
--- a/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing perspective-origin with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property"> <meta name="assert" content="perspective-origin supports only the '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing perspective-origin with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property"> <meta name="assert" content="perspective-origin supports the full '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing rotate with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate"> <meta name="assert" content="rotate supports only the grammar 'none | <number>{3}? <angle>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing rotate with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate"> <meta name="assert" content="rotate supports the full grammar 'none | <number>{3}? <angle>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing scale with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale"> <meta name="assert" content="scale supports only the grammar 'none | <number>{1,3}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing scale with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale"> <meta name="assert" content="scale supports the full grammar 'none | <number>{1,3}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-box-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-box-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 1: parsing transform-box with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-box-property"> <meta name="assert" content="transform-box supports only the grammar 'content-box | border-box | fill-box | stroke-box | view-box'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-box-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-box-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 1: parsing transform-box with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-box-property"> <meta name="assert" content="transform-box supports the full grammar 'content-box | border-box | fill-box | stroke-box | view-box'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing transform with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-property"> <meta name="assert" content="transform supports only the grammar 'none | <transform-list>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-computed.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-computed.html @@ -1,14 +1,14 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: getComputedStyle().transformOrigin</title> -<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-origin-property"> +<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property"> <meta name="assert" content="transform-origin computed value is two or three absolute lengths"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/computed-testcommon.js"></script> <style> #target { width: 200px; height: 300px;
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 1: parsing transform-origin with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property"> <meta name="assert" content="transform-origin supports only the grammar from spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 1: parsing transform-origin with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property"> <meta name="assert" content="transform-origin supports the full grammar from spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing transform with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-property"> <meta name="assert" content="transform supports the full grammar 'none | <transform-list>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-invalid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-invalid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing translate with invalid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate"> <meta name="assert" content="translate supports only the grammar 'none | <length-percentage> [ <length-percentage> <length>? ]?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-valid.html +++ b/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-valid.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: parsing translate with valid values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate"> <meta name="assert" content="translate supports the full grammar 'none | <length-percentage> [ <length-percentage> <length>? ]?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
--- a/testing/web-platform/tests/css/css-transforms/transforms-support-calc.html +++ b/testing/web-platform/tests/css/css-transforms/transforms-support-calc.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: calc values</title> -<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/"> <link rel="help" href="https://drafts.csswg.org/css-values-3/#calc-notation"> <meta name="assert" content="calc values are supported in css-transforms properties."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <style> #container { width: 600px;
--- a/testing/web-platform/tests/css/css-transforms/translate-getComputedStyle.html +++ b/testing/web-platform/tests/css/css-transforms/translate-getComputedStyle.html @@ -1,14 +1,13 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CSS Transform Module Level 2: translate getComputedStyle</title> - <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate"> <meta name="assert" content="translate computed style does not resolve percentages."> <style type="text/css"> #container { transform-style: preserve-3d;; } #first { font-size: 10px;
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-computed.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Transitions: getComputedStyle().transition</title> +<link rel="help" href="https://drafts.csswg.org/css-transitions/#transition-shorthand-property"> +<meta name="assert" content="transition computed value is as specified."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<div id="target"></div> +<script> +// <single-transition> = [ none | <single-transition-property> ] || +// <time> || <easing-function> || <time> +test_computed_value("transition", "1s", "all 1s ease 0s"); +test_computed_value("transition", "cubic-bezier(0, -2, 1, 3)", "all 0s cubic-bezier(0, -2, 1, 3) 0s"); +test_computed_value("transition", "1s -3s", "all 1s ease -3s"); +test_computed_value("transition", "none", "none 0s ease 0s"); +test_computed_value("transition", "top", "top 0s ease 0s"); + +test_computed_value("transition", "1s -3s cubic-bezier(0, -2, 1, 3) top", "top 1s cubic-bezier(0, -2, 1, 3) -3s"); +test_computed_value("transition", "1s -3s, cubic-bezier(0, -2, 1, 3) top", "all 1s ease -3s, top 0s cubic-bezier(0, -2, 1, 3) 0s"); + +// TODO: Add test with a single timing-function keyword. +</script> +</body> +</html>
--- a/testing/web-platform/tests/fetch/api/resources/preflight.py +++ b/testing/web-platform/tests/fetch/api/resources/preflight.py @@ -21,17 +21,16 @@ def main(request, response): if "credentials" in request.GET: headers.append(("Access-Control-Allow-Credentials", "true")) if request.method == "OPTIONS": if not "Access-Control-Request-Method" in request.headers: response.set_error(400, "No Access-Control-Request-Method header") return "ERROR: No access-control-request-method in preflight!" - # https://github.com/whatwg/fetch/issues/922 if request.headers.get("Accept", "") != "*/*": response.set_error(400, "Request does not have 'Accept: */*' header") return "ERROR: Invalid access in preflight!" if "control_request_headers" in request.GET: stashed_data['control_request_headers'] = request.headers.get("Access-Control-Request-Headers", None) if "max_age" in request.GET:
--- a/testing/web-platform/tests/fonts/Ahem.ttf.headers +++ b/testing/web-platform/tests/fonts/Ahem.ttf.headers @@ -1,1 +1,2 @@ Access-Control-Allow-Origin: * +Cache-Control: max-age=3600
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/fonts/CanvasTest.ttf.headers @@ -0,0 +1,1 @@ +Cache-Control: max-age=3600
deleted file mode 100644 --- a/testing/web-platform/tests/fonts/CanvasTest.ttf.sub.headers +++ /dev/null @@ -1,1 +0,0 @@ -Cache-Control: max-age=1000
--- a/testing/web-platform/tests/fonts/ahem.css +++ b/testing/web-platform/tests/fonts/ahem.css @@ -1,5 +1,6 @@ @font-face { font-family: 'Ahem'; - src: url('/fonts/Ahem.ttf'); + src: local('Ahem'), + url('/fonts/Ahem.ttf'); }
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/fonts/ahem.css.headers @@ -0,0 +1,2 @@ +Content-Type: text/css;charset=utf-8 +Cache-Control: max-age=3600
--- a/testing/web-platform/tests/generic-sensor/resources/generic-sensor-helpers.js +++ b/testing/web-platform/tests/generic-sensor/resources/generic-sensor-helpers.js @@ -56,18 +56,21 @@ function sensor_test(func, name, propert await func(t, sensorTest.getSensorProvider()); } finally { await sensorTest.reset(); }; }, name, properties); } function verifySensorReading(pattern, values, timestamp, isNull) { + // If |val| cannot be converted to a float, we return the original value. + // This can happen when a value in |pattern| is not a number. function round(val) { - return Number.parseFloat(val).toPrecision(6); + const res = Number.parseFloat(val).toPrecision(6); + return res === "NaN" ? val : res; } if (isNull) { return (values === null || values.every(r => r === null)) && timestamp === null; } return values.every((r, i) => round(r) === round(pattern[i])) && @@ -87,16 +90,20 @@ function verifyAlsSensorReading(pattern, } function verifyGeoSensorReading(pattern, {latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed, timestamp}, isNull) { return verifySensorReading(pattern, [latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed], timestamp, isNull); } +function verifyProximitySensorReading(pattern, {distance, max, near, timestamp}, isNull) { + return verifySensorReading(pattern, [distance, max, near], timestamp, isNull); +} + // A "sliding window" that iterates over |data| and returns one item at a // time, advancing and wrapping around as needed. |data| must be an array of // arrays. class RingBuffer { constructor(data) { this.bufferPosition_ = 0; // Validate |data|'s format and deep-copy every element. this.data_ = Array.from(data, element => {
--- a/testing/web-platform/tests/interfaces/accelerometer.idl +++ b/testing/web-platform/tests/interfaces/accelerometer.idl @@ -1,35 +1,35 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into reffy-reports // (https://github.com/tidoust/reffy-reports) // Source: Accelerometer (https://w3c.github.io/accelerometer/) -[Constructor(optional AccelerometerSensorOptions options = {}), SecureContext, - Exposed=Window] +[SecureContext, Exposed=Window] interface Accelerometer : Sensor { + constructor(optional AccelerometerSensorOptions options = {}); readonly attribute double? x; readonly attribute double? y; readonly attribute double? z; }; enum AccelerometerLocalCoordinateSystem { "device", "screen" }; dictionary AccelerometerSensorOptions : SensorOptions { AccelerometerLocalCoordinateSystem referenceFrame = "device"; }; -[Constructor(optional AccelerometerSensorOptions options = {}), SecureContext, - Exposed=Window] +[SecureContext, Exposed=Window] interface LinearAccelerationSensor : Accelerometer { + constructor(optional AccelerometerSensorOptions options = {}); }; -[Constructor(optional AccelerometerSensorOptions options = {}), SecureContext, - Exposed=Window] +[SecureContext, Exposed=Window] interface GravitySensor : Accelerometer { + constructor(optional AccelerometerSensorOptions options = {}); }; dictionary AccelerometerReadingValues { required double? x; required double? y; required double? z; };
--- a/testing/web-platform/tests/interfaces/css-animation-worklet.idl +++ b/testing/web-platform/tests/interfaces/css-animation-worklet.idl @@ -17,21 +17,21 @@ callback AnimatorInstanceConstructor = a [ Exposed=AnimationWorklet ] interface WorkletAnimationEffect { EffectTiming getTiming(); ComputedEffectTiming getComputedTiming(); attribute double? localTime; }; -[Exposed=Window, - Constructor (DOMString animatorName, +[Exposed=Window] +interface WorkletAnimation : Animation { + constructor(DOMString animatorName, optional (AnimationEffect or sequence<AnimationEffect>)? effects = null, optional AnimationTimeline? timeline, - optional any options)] -interface WorkletAnimation : Animation { + optional any options); readonly attribute DOMString animatorName; }; [Exposed=AnimationWorklet] interface WorkletGroupEffect { sequence<WorkletAnimationEffect> getChildren(); };
--- a/testing/web-platform/tests/interfaces/encoding.idl +++ b/testing/web-platform/tests/interfaces/encoding.idl @@ -13,50 +13,52 @@ dictionary TextDecoderOptions { boolean fatal = false; boolean ignoreBOM = false; }; dictionary TextDecodeOptions { boolean stream = false; }; -[Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {}), - Exposed=(Window,Worker)] +[Exposed=(Window,Worker)] interface TextDecoder { + constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {}); + USVString decode(optional BufferSource input, optional TextDecodeOptions options = {}); }; TextDecoder includes TextDecoderCommon; interface mixin TextEncoderCommon { readonly attribute DOMString encoding; }; dictionary TextEncoderEncodeIntoResult { unsigned long long read; unsigned long long written; }; -[Constructor, - Exposed=(Window,Worker)] +[Exposed=(Window,Worker)] interface TextEncoder { + constructor(); + [NewObject] Uint8Array encode(optional USVString input = ""); TextEncoderEncodeIntoResult encodeInto(USVString source, Uint8Array destination); }; TextEncoder includes TextEncoderCommon; interface mixin GenericTransformStream { readonly attribute ReadableStream readable; readonly attribute WritableStream writable; }; -[Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options), - Exposed=(Window,Worker)] +[Exposed=(Window,Worker)] interface TextDecoderStream { + constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {}); }; TextDecoderStream includes TextDecoderCommon; TextDecoderStream includes GenericTransformStream; -[Constructor, - Exposed=(Window,Worker)] +[Exposed=(Window,Worker)] interface TextEncoderStream { + constructor(); }; TextEncoderStream includes TextEncoderCommon; TextEncoderStream includes GenericTransformStream;
--- a/testing/web-platform/tests/interfaces/entries-api.idl +++ b/testing/web-platform/tests/interfaces/entries-api.idl @@ -13,27 +13,29 @@ partial interface HTMLInputElement { }; partial interface DataTransferItem { FileSystemEntry? webkitGetAsEntry(); }; callback ErrorCallback = void (DOMException err); +[Exposed=Window] interface FileSystemEntry { readonly attribute boolean isFile; readonly attribute boolean isDirectory; readonly attribute USVString name; readonly attribute USVString fullPath; readonly attribute FileSystem filesystem; void getParent(optional FileSystemEntryCallback successCallback, optional ErrorCallback errorCallback); }; +[Exposed=Window] interface FileSystemDirectoryEntry : FileSystemEntry { FileSystemDirectoryReader createReader(); void getFile(optional USVString? path, optional FileSystemFlags options = {}, optional FileSystemEntryCallback successCallback, optional ErrorCallback errorCallback); void getDirectory(optional USVString? path, optional FileSystemFlags options = {}, @@ -43,24 +45,27 @@ interface FileSystemDirectoryEntry : Fil dictionary FileSystemFlags { boolean create = false; boolean exclusive = false; }; callback FileSystemEntryCallback = void (FileSystemEntry entry); +[Exposed=Window] interface FileSystemDirectoryReader { void readEntries(FileSystemEntriesCallback successCallback, optional ErrorCallback errorCallback); }; callback FileSystemEntriesCallback = void (sequence<FileSystemEntry> entries); +[Exposed=Window] interface FileSystemFileEntry : FileSystemEntry { void file(FileCallback successCallback, optional ErrorCallback errorCallback); }; callback FileCallback = void (File file); +[Exposed=Window] interface FileSystem { readonly attribute USVString name; readonly attribute FileSystemDirectoryEntry root; };
--- a/testing/web-platform/tests/interfaces/gyroscope.idl +++ b/testing/web-platform/tests/interfaces/gyroscope.idl @@ -1,15 +1,16 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into reffy-reports // (https://github.com/tidoust/reffy-reports) // Source: Gyroscope (https://w3c.github.io/gyroscope/) -[Constructor(optional GyroscopeSensorOptions sensorOptions), SecureContext, Exposed=Window] +[SecureContext, Exposed=Window] interface Gyroscope : Sensor { + constructor(optional GyroscopeSensorOptions sensorOptions = {}); readonly attribute double? x; readonly attribute double? y; readonly attribute double? z; }; enum GyroscopeLocalCoordinateSystem { "device", "screen" }; dictionary GyroscopeSensorOptions : SensorOptions {
--- a/testing/web-platform/tests/interfaces/mediasession.idl +++ b/testing/web-platform/tests/interfaces/mediasession.idl @@ -72,10 +72,10 @@ dictionary MediaSessionActionDetails { }; dictionary MediaSessionSeekActionDetails : MediaSessionActionDetails { double? seekOffset; }; dictionary MediaSessionSeekToActionDetails : MediaSessionActionDetails { required double seekTime; - bool? fastSeek; + boolean? fastSeek; };
--- a/testing/web-platform/tests/interfaces/presentation-api.idl +++ b/testing/web-platform/tests/interfaces/presentation-api.idl @@ -43,17 +43,16 @@ interface PresentationConnectionAvailabl [SameObject] readonly attribute PresentationConnection connection; }; dictionary PresentationConnectionAvailableEventInit : EventInit { required PresentationConnection connection; }; enum PresentationConnectionState { "connecting", "connected", "closed", "terminated" }; -enum BinaryType { "blob", "arraybuffer" }; [SecureContext, Exposed=Window] interface PresentationConnection : EventTarget { readonly attribute USVString id; readonly attribute USVString url; readonly attribute PresentationConnectionState state; void close(); void terminate();
--- a/testing/web-platform/tests/interfaces/shape-detection-api.idl +++ b/testing/web-platform/tests/interfaces/shape-detection-api.idl @@ -1,17 +1,17 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into reffy-reports // (https://github.com/tidoust/reffy-reports) // Source: Accelerated Shape Detection in Images (https://wicg.github.io/shape-detection-api/) [Exposed=(Window,Worker), - SecureContext, - Constructor(optional FaceDetectorOptions faceDetectorOptions = {})] + SecureContext] interface FaceDetector { + constructor(optional FaceDetectorOptions faceDetectorOptions = {}); Promise<sequence<DetectedFace>> detect(ImageBitmapSource image); }; dictionary FaceDetectorOptions { unsigned short maxDetectedFaces; boolean fastMode; }; @@ -30,19 +30,19 @@ dictionary Landmark { enum LandmarkType { "mouth", "eye", "nose" }; [Exposed=(Window,Worker), - SecureContext, - Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions = {})] + SecureContext] interface BarcodeDetector { + constructor(optional BarcodeDetectorOptions barcodeDetectorOptions = {}); static Promise<sequence<BarcodeFormat>> getSupportedFormats(); Promise<sequence<DetectedBarcode>> detect(ImageBitmapSource image); }; dictionary BarcodeDetectorOptions { sequence<BarcodeFormat> formats; };
--- a/testing/web-platform/tests/interfaces/user-timing.idl +++ b/testing/web-platform/tests/interfaces/user-timing.idl @@ -17,18 +17,18 @@ dictionary PerformanceMeasureOptions { partial interface Performance { PerformanceMark mark(DOMString markName, optional PerformanceMarkOptions markOptions = {}); void clearMarks(optional DOMString markName); PerformanceMeasure measure(DOMString measureName, optional (DOMString or PerformanceMeasureOptions) startOrMeasureOptions = {}, optional DOMString endMark); void clearMeasures(optional DOMString measureName); }; -[Exposed=(Window,Worker), - Constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {})] +[Exposed=(Window,Worker)] interface PerformanceMark : PerformanceEntry { + constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {}); readonly attribute any detail; }; [Exposed=(Window,Worker)] interface PerformanceMeasure : PerformanceEntry { readonly attribute any detail; };
--- a/testing/web-platform/tests/interfaces/web-bluetooth.idl +++ b/testing/web-platform/tests/interfaces/web-bluetooth.idl @@ -55,20 +55,20 @@ dictionary BluetoothPermissionData { [Exposed=Window] interface BluetoothPermissionResult : PermissionStatus { attribute FrozenArray<BluetoothDevice> devices; }; [ Exposed=Window, - Constructor(DOMString type, optional ValueEventInit initDict = {}), SecureContext ] interface ValueEvent : Event { + constructor(DOMString type, optional ValueEventInit initDict = {}); readonly attribute any value; }; dictionary ValueEventInit : EventInit { any value = null; }; [Exposed=Window, SecureContext] @@ -90,20 +90,20 @@ interface BluetoothManufacturerDataMap { readonly maplike<unsigned short, DataView>; }; [Exposed=Window, SecureContext] interface BluetoothServiceDataMap { readonly maplike<UUID, DataView>; }; [ Exposed=Window, - Constructor(DOMString type, BluetoothAdvertisingEventInit init), SecureContext ] interface BluetoothAdvertisingEvent : Event { + constructor(DOMString type, BluetoothAdvertisingEventInit init); [SameObject] readonly attribute BluetoothDevice device; readonly attribute FrozenArray<UUID> uuids; readonly attribute DOMString? name; readonly attribute unsigned short? appearance; readonly attribute byte? txPower; readonly attribute byte? rssi; [SameObject]
--- a/testing/web-platform/tests/interfaces/webaudio.idl +++ b/testing/web-platform/tests/interfaces/webaudio.idl @@ -33,17 +33,17 @@ interface BaseAudioContext : EventTarget ConstantSourceNode createConstantSource (); ConvolverNode createConvolver (); DelayNode createDelay (optional double maxDelayTime = 1.0); DynamicsCompressorNode createDynamicsCompressor (); GainNode createGain (); IIRFilterNode createIIRFilter (sequence<double> feedforward, sequence<double> feedback); OscillatorNode createOscillator (); PannerNode createPanner (); - PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints); + PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints = {}); ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0, optional unsigned long numberOfInputChannels = 2, optional unsigned long numberOfOutputChannels = 2); StereoPannerNode createStereoPanner (); WaveShaperNode createWaveShaper (); Promise<AudioBuffer> decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback? successCallback, @@ -51,71 +51,71 @@ interface BaseAudioContext : EventTarget }; enum AudioContextLatencyCategory { "balanced", "interactive", "playback" }; -[Exposed=Window, - Constructor (optional AudioContextOptions contextOptions)] +[Exposed=Window] interface AudioContext : BaseAudioContext { - readonly attribute double baseLatency; - readonly attribute double outputLatency; - AudioTimestamp getOutputTimestamp (); - Promise<void> resume (); - Promise<void> suspend (); - Promise<void> close (); - MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement); - MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream); - MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack); - MediaStreamAudioDestinationNode createMediaStreamDestination (); + constructor (optional AudioContextOptions contextOptions = {}); + readonly attribute double baseLatency; + readonly attribute double outputLatency; + AudioTimestamp getOutputTimestamp (); + Promise<void> resume (); + Promise<void> suspend (); + Promise<void> close (); + MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement); + MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream); + MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack); + MediaStreamAudioDestinationNode createMediaStreamDestination (); }; dictionary AudioContextOptions { (AudioContextLatencyCategory or double) latencyHint = "interactive"; float sampleRate; }; dictionary AudioTimestamp { double contextTime; DOMHighResTimeStamp performanceTime; }; -[Exposed=Window, - Constructor (OfflineAudioContextOptions contextOptions), - Constructor (unsigned long numberOfChannels, unsigned long length, float sampleRate)] +[Exposed=Window] interface OfflineAudioContext : BaseAudioContext { + constructor(OfflineAudioContextOptions contextOptions); + constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); Promise<AudioBuffer> startRendering(); Promise<void> resume(); Promise<void> suspend(double suspendTime); readonly attribute unsigned long length; attribute EventHandler oncomplete; }; dictionary OfflineAudioContextOptions { unsigned long numberOfChannels = 1; required unsigned long length; required float sampleRate; }; -[Exposed=Window, - Constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict)] +[Exposed=Window] interface OfflineAudioCompletionEvent : Event { + constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict); readonly attribute AudioBuffer renderedBuffer; }; dictionary OfflineAudioCompletionEventInit : EventInit { required AudioBuffer renderedBuffer; }; -[Exposed=Window, - Constructor (AudioBufferOptions options)] +[Exposed=Window] interface AudioBuffer { + constructor (AudioBufferOptions options); readonly attribute float sampleRate; readonly attribute unsigned long length; readonly attribute double duration; readonly attribute unsigned long numberOfChannels; Float32Array getChannelData (unsigned long channel); void copyFromChannel (Float32Array destination, unsigned long channelNumber, optional unsigned long bufferOffset = 0); void copyToChannel (Float32Array source, unsigned long channelNumber, optional unsigned long bufferOffset = 0); }; @@ -187,19 +187,19 @@ interface AudioParam { [Exposed=Window] interface AudioScheduledSourceNode : AudioNode { attribute EventHandler onended; void start(optional double when = 0); void stop(optional double when = 0); }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional AnalyserOptions options = {})] +[Exposed=Window] interface AnalyserNode : AudioNode { + constructor (BaseAudioContext context, optional AnalyserOptions options = {}); void getFloatFrequencyData (Float32Array array); void getByteFrequencyData (Uint8Array array); void getFloatTimeDomainData (Float32Array array); void getByteTimeDomainData (Uint8Array array); attribute unsigned long fftSize; readonly attribute unsigned long frequencyBinCount; attribute double minDecibels; attribute double maxDecibels; @@ -208,19 +208,19 @@ interface AnalyserNode : AudioNode { dictionary AnalyserOptions : AudioNodeOptions { unsigned long fftSize = 2048; double maxDecibels = -30; double minDecibels = -100; double smoothingTimeConstant = 0.8; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {})] +[Exposed=Window] interface AudioBufferSourceNode : AudioScheduledSourceNode { + constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {}); attribute AudioBuffer? buffer; readonly attribute AudioParam playbackRate; readonly attribute AudioParam detune; attribute boolean loop; attribute double loopStart; attribute double loopEnd; void start (optional double when = 0, optional double offset, @@ -251,19 +251,19 @@ interface AudioListener { readonly attribute AudioParam forwardZ; readonly attribute AudioParam upX; readonly attribute AudioParam upY; readonly attribute AudioParam upZ; void setPosition (float x, float y, float z); void setOrientation (float x, float y, float z, float xUp, float yUp, float zUp); }; -[Exposed=Window, - Constructor (DOMString type, AudioProcessingEventInit eventInitDict)] +[Exposed=Window] interface AudioProcessingEvent : Event { + constructor (DOMString type, AudioProcessingEventInit eventInitDict); readonly attribute double playbackTime; readonly attribute AudioBuffer inputBuffer; readonly attribute AudioBuffer outputBuffer; }; dictionary AudioProcessingEventInit : EventInit { required double playbackTime; required AudioBuffer inputBuffer; @@ -276,172 +276,172 @@ enum BiquadFilterType { "bandpass", "lowshelf", "highshelf", "peaking", "notch", "allpass" }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional BiquadFilterOptions options = {})] +[Exposed=Window] interface BiquadFilterNode : AudioNode { + constructor (BaseAudioContext context, optional BiquadFilterOptions options = {}); attribute BiquadFilterType type; readonly attribute AudioParam frequency; readonly attribute AudioParam detune; readonly attribute AudioParam Q; readonly attribute AudioParam gain; void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse); }; dictionary BiquadFilterOptions : AudioNodeOptions { BiquadFilterType type = "lowpass"; float Q = 1; float detune = 0; float frequency = 350; float gain = 0; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional ChannelMergerOptions options = {})] +[Exposed=Window] interface ChannelMergerNode : AudioNode { + constructor (BaseAudioContext context, optional ChannelMergerOptions options = {}); }; dictionary ChannelMergerOptions : AudioNodeOptions { unsigned long numberOfInputs = 6; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {})] +[Exposed=Window] interface ChannelSplitterNode : AudioNode { + constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {}); }; dictionary ChannelSplitterOptions : AudioNodeOptions { unsigned long numberOfOutputs = 6; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional ConstantSourceOptions options = {})] +[Exposed=Window] interface ConstantSourceNode : AudioScheduledSourceNode { + constructor (BaseAudioContext context, optional ConstantSourceOptions options = {}); readonly attribute AudioParam offset; }; dictionary ConstantSourceOptions { float offset = 1; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional ConvolverOptions options = {})] +[Exposed=Window] interface ConvolverNode : AudioNode { + constructor (BaseAudioContext context, optional ConvolverOptions options = {}); attribute AudioBuffer? buffer; attribute boolean normalize; }; dictionary ConvolverOptions : AudioNodeOptions { AudioBuffer? buffer; boolean disableNormalization = false; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional DelayOptions options = {})] +[Exposed=Window] interface DelayNode : AudioNode { + constructor (BaseAudioContext context, optional DelayOptions options = {}); readonly attribute AudioParam delayTime; }; dictionary DelayOptions : AudioNodeOptions { double maxDelayTime = 1; double delayTime = 0; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {})] +[Exposed=Window] interface DynamicsCompressorNode : AudioNode { + constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {}); readonly attribute AudioParam threshold; readonly attribute AudioParam knee; readonly attribute AudioParam ratio; readonly attribute float reduction; readonly attribute AudioParam attack; readonly attribute AudioParam release; }; dictionary DynamicsCompressorOptions : AudioNodeOptions { float attack = 0.003; float knee = 30; float ratio = 12; float release = 0.25; float threshold = -24; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional GainOptions options = {})] +[Exposed=Window] interface GainNode : AudioNode { + constructor (BaseAudioContext context, optional GainOptions options = {}); readonly attribute AudioParam gain; }; dictionary GainOptions : AudioNodeOptions { float gain = 1.0; }; -[Exposed=Window, - Constructor (BaseAudioContext context, IIRFilterOptions options)] +[Exposed=Window] interface IIRFilterNode : AudioNode { + constructor (BaseAudioContext context, IIRFilterOptions options); void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse); }; dictionary IIRFilterOptions : AudioNodeOptions { required sequence<double> feedforward; required sequence<double> feedback; }; -[Exposed=Window, - Constructor (AudioContext context, MediaElementAudioSourceOptions options)] +[Exposed=Window] interface MediaElementAudioSourceNode : AudioNode { + constructor (AudioContext context, MediaElementAudioSourceOptions options); [SameObject] readonly attribute HTMLMediaElement mediaElement; }; dictionary MediaElementAudioSourceOptions { required HTMLMediaElement mediaElement; }; -[Exposed=Window, - Constructor (AudioContext context, optional AudioNodeOptions options = {})] +[Exposed=Window] interface MediaStreamAudioDestinationNode : AudioNode { + constructor (AudioContext context, optional AudioNodeOptions options = {}); readonly attribute MediaStream stream; }; -[Exposed=Window, - Constructor (AudioContext context, MediaStreamAudioSourceOptions options)] +[Exposed=Window] interface MediaStreamAudioSourceNode : AudioNode { + constructor (AudioContext context, MediaStreamAudioSourceOptions options); [SameObject] readonly attribute MediaStream mediaStream; }; dictionary MediaStreamAudioSourceOptions { required MediaStream mediaStream; }; -[Exposed=Window, - Constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options)] +[Exposed=Window] interface MediaStreamTrackAudioSourceNode : AudioNode { + constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options); }; dictionary MediaStreamTrackAudioSourceOptions { required MediaStreamTrack mediaStreamTrack; }; enum OscillatorType { "sine", "square", "sawtooth", "triangle", "custom" }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional OscillatorOptions options = {})] +[Exposed=Window] interface OscillatorNode : AudioScheduledSourceNode { + constructor (BaseAudioContext context, optional OscillatorOptions options = {}); attribute OscillatorType type; readonly attribute AudioParam frequency; readonly attribute AudioParam detune; void setPeriodicWave (PeriodicWave periodicWave); }; dictionary OscillatorOptions : AudioNodeOptions { OscillatorType type = "sine"; @@ -456,19 +456,19 @@ enum PanningModelType { }; enum DistanceModelType { "linear", "inverse", "exponential" }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional PannerOptions options = {})] +[Exposed=Window] interface PannerNode : AudioNode { + constructor (BaseAudioContext context, optional PannerOptions options = {}); attribute PanningModelType panningModel; readonly attribute AudioParam positionX; readonly attribute AudioParam positionY; readonly attribute AudioParam positionZ; readonly attribute AudioParam orientationX; readonly attribute AudioParam orientationY; readonly attribute AudioParam orientationZ; attribute DistanceModelType distanceModel; @@ -494,19 +494,19 @@ dictionary PannerOptions : AudioNodeOpti double refDistance = 1; double maxDistance = 10000; double rolloffFactor = 1; double coneInnerAngle = 360; double coneOuterAngle = 360; double coneOuterGain = 0; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {})] +[Exposed=Window] interface PeriodicWave { + constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {}); }; dictionary PeriodicWaveConstraints { boolean disableNormalization = false; }; dictionary PeriodicWaveOptions : PeriodicWaveConstraints { sequence<float> real; @@ -514,35 +514,35 @@ dictionary PeriodicWaveOptions : Periodi }; [Exposed=Window] interface ScriptProcessorNode : AudioNode { attribute EventHandler onaudioprocess; readonly attribute long bufferSize; }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional StereoPannerOptions options = {})] +[Exposed=Window] interface StereoPannerNode : AudioNode { + constructor (BaseAudioContext context, optional StereoPannerOptions options = {}); readonly attribute AudioParam pan; }; dictionary StereoPannerOptions : AudioNodeOptions { float pan = 0; }; enum OverSampleType { "none", "2x", "4x" }; -[Exposed=Window, - Constructor (BaseAudioContext context, optional WaveShaperOptions options = {})] +[Exposed=Window] interface WaveShaperNode : AudioNode { + constructor (BaseAudioContext context, optional WaveShaperOptions options = {}); attribute Float32Array? curve; attribute OverSampleType oversample; }; dictionary WaveShaperOptions : AudioNodeOptions { sequence<float> curve; OverSampleType oversample = "none"; }; @@ -561,37 +561,36 @@ interface AudioWorkletGlobalScope : Work readonly attribute float sampleRate; }; [Exposed=Window] interface AudioParamMap { readonly maplike<DOMString, AudioParam>; }; -[Exposed=Window, - SecureContext, - Constructor (BaseAudioContext context, DOMString name, - optional AudioWorkletNodeOptions options = {})] +[Exposed=Window, SecureContext] interface AudioWorkletNode : AudioNode { + constructor (BaseAudioContext context, DOMString name, + optional AudioWorkletNodeOptions options = {}); readonly attribute AudioParamMap parameters; readonly attribute MessagePort port; attribute EventHandler onprocessorerror; }; dictionary AudioWorkletNodeOptions : AudioNodeOptions { unsigned long numberOfInputs = 1; unsigned long numberOfOutputs = 1; sequence<unsigned long> outputChannelCount; record<DOMString, double> parameterData; object processorOptions; }; -[Exposed=AudioWorklet, -Constructor (optional AudioWorkletNodeOptions options = {})] +[Exposed=AudioWorklet] interface AudioWorkletProcessor { + constructor (optional AudioWorkletNodeOptions options = {}); readonly attribute MessagePort port; }; dictionary AudioParamDescriptor { required DOMString name; float defaultValue = 0; float minValue = -3.4028235e38; float maxValue = 3.4028235e38;
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/interfaces/webrtc-identity.idl @@ -0,0 +1,67 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into reffy-reports +// (https://github.com/tidoust/reffy-reports) +// Source: Identity for WebRTC 1.0 (https://w3c.github.io/webrtc-identity/identity.html) + +[Global, Exposed=RTCIdentityProviderGlobalScope] +interface RTCIdentityProviderGlobalScope : WorkerGlobalScope { + readonly attribute RTCIdentityProviderRegistrar rtcIdentityProvider; +}; + +[Exposed=RTCIdentityProviderGlobalScope] +interface RTCIdentityProviderRegistrar { + void register(RTCIdentityProvider idp); +}; + +dictionary RTCIdentityProvider { + required GenerateAssertionCallback generateAssertion; + required ValidateAssertionCallback validateAssertion; +}; + +callback GenerateAssertionCallback = Promise<RTCIdentityAssertionResult> (DOMString contents, DOMString origin, RTCIdentityProviderOptions options); + +callback ValidateAssertionCallback = Promise<RTCIdentityValidationResult> (DOMString assertion, DOMString origin); + +dictionary RTCIdentityAssertionResult { + required RTCIdentityProviderDetails idp; + required DOMString assertion; +}; + +dictionary RTCIdentityProviderDetails { + required DOMString domain; + DOMString protocol = "default"; +}; + +dictionary RTCIdentityValidationResult { + required DOMString identity; + required DOMString contents; +}; + +partial interface RTCPeerConnection { + void setIdentityProvider(DOMString provider, optional RTCIdentityProviderOptions options); + Promise<DOMString> getIdentityAssertion(); + readonly attribute Promise<RTCIdentityAssertion> peerIdentity; + readonly attribute DOMString? idpLoginUrl; + readonly attribute DOMString? idpErrorInfo; +}; + +dictionary RTCIdentityProviderOptions { + DOMString protocol = "default"; + DOMString usernameHint; + DOMString peerIdentity; +}; + +[Constructor(DOMString idp, DOMString name), Exposed=Window] +interface RTCIdentityAssertion { + attribute DOMString idp; + attribute DOMString name; +}; + +partial dictionary MediaStreamConstraints { + DOMString peerIdentity; +}; + +partial interface MediaStreamTrack { + readonly attribute boolean isolated; + attribute EventHandler onisolationchange; +};
--- a/testing/web-platform/tests/interfaces/webrtc.idl +++ b/testing/web-platform/tests/interfaces/webrtc.idl @@ -86,29 +86,30 @@ enum RTCIceConnectionState { "failed", "disconnected", "new", "checking", "completed", "connected" }; -[Exposed=Window, Constructor(optional RTCConfiguration configuration)] -interface RTCPeerConnection : EventTarget { - Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options); - Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options); - Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description); +[Exposed=Window] +interface RTCPeerConnection : EventTarget { + constructor(optional RTCConfiguration configuration = {}); + Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options = {}); + Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options = {}); + Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description = {}); readonly attribute RTCSessionDescription? localDescription; readonly attribute RTCSessionDescription? currentLocalDescription; readonly attribute RTCSessionDescription? pendingLocalDescription; - Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description); + Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description = {}); readonly attribute RTCSessionDescription? remoteDescription; readonly attribute RTCSessionDescription? currentRemoteDescription; readonly attribute RTCSessionDescription? pendingRemoteDescription; - Promise<void> addIceCandidate(optional RTCIceCandidateInit candidate); + Promise<void> addIceCandidate(optional RTCIceCandidateInit candidate = {}); readonly attribute RTCSignalingState signalingState; readonly attribute RTCIceGatheringState iceGatheringState; readonly attribute RTCIceConnectionState iceConnectionState; readonly attribute RTCPeerConnectionState connectionState; readonly attribute boolean? canTrickleIceCandidates; void restartIce(); static sequence<RTCIceServer> getDefaultIceServers(); RTCConfiguration getConfiguration(); @@ -116,28 +117,31 @@ interface RTCPeerConnection : EventTarge void close(); attribute EventHandler onnegotiationneeded; attribute EventHandler onicecandidate; attribute EventHandler onicecandidateerror; attribute EventHandler onsignalingstatechange; attribute EventHandler oniceconnectionstatechange; attribute EventHandler onicegatheringstatechange; attribute EventHandler onconnectionstatechange; -}; -partial interface RTCPeerConnection { + // Legacy Interface Extensions + // Supporting the methods in this section is optional. + // If these methods are supported + // they must be implemented as defined + // in section "Legacy Interface Extensions" Promise<void> createOffer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback, - optional RTCOfferOptions options); - Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description, + optional RTCOfferOptions options = {}); + Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description = {}, VoidFunction successCallback, RTCPeerConnectionErrorCallback failureCallback); Promise<void> createAnswer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback); - Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description, + Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description = {}, VoidFunction successCallback, RTCPeerConnectionErrorCallback failureCallback); Promise<void> addIceCandidate(RTCIceCandidateInit candidate, VoidFunction successCallback, RTCPeerConnectionErrorCallback failureCallback); }; callback RTCPeerConnectionErrorCallback = void (DOMException error); @@ -151,30 +155,32 @@ partial dictionary RTCOfferOptions { enum RTCSdpType { "offer", "pranswer", "answer", "rollback" }; -[Exposed=Window, Constructor(optional RTCSessionDescriptionInit descriptionInitDict)] +[Exposed=Window] interface RTCSessionDescription { + constructor(optional RTCSessionDescriptionInit descriptionInitDict = {}); readonly attribute RTCSdpType type; readonly attribute DOMString sdp; [Default] object toJSON(); }; dictionary RTCSessionDescriptionInit { RTCSdpType type; DOMString sdp = ""; }; -[Exposed=Window, Constructor(optional RTCIceCandidateInit candidateInitDict)] +[Exposed=Window] interface RTCIceCandidate { + constructor(optional RTCIceCandidateInit candidateInitDict = {}); readonly attribute DOMString candidate; readonly attribute DOMString? sdpMid; readonly attribute unsigned short? sdpMLineIndex; readonly attribute DOMString? foundation; readonly attribute RTCIceComponent? component; readonly attribute unsigned long? priority; readonly attribute DOMString? address; readonly attribute RTCIceProtocol? protocol; @@ -207,31 +213,31 @@ enum RTCIceTcpCandidateType { enum RTCIceCandidateType { "host", "srflx", "prflx", "relay" }; -[Exposed=Window, - Constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict)] +[Exposed=Window] interface RTCPeerConnectionIceEvent : Event { + constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict = {}); readonly attribute RTCIceCandidate? candidate; readonly attribute DOMString? url; }; dictionary RTCPeerConnectionIceEventInit : EventInit { RTCIceCandidate? candidate; DOMString? url; }; -[Exposed=Window, - Constructor(DOMString type, RTCPeerConnectionIceErrorEventInit eventInitDict)] +[Exposed=Window] interface RTCPeerConnectionIceErrorEvent : Event { + constructor(DOMString type, RTCPeerConnectionIceErrorEventInit eventInitDict); readonly attribute DOMString hostCandidate; readonly attribute DOMString url; readonly attribute unsigned short errorCode; readonly attribute USVString errorText; }; dictionary RTCPeerConnectionIceErrorEventInit : EventInit { DOMString hostCandidate; @@ -243,17 +249,18 @@ dictionary RTCPeerConnectionIceErrorEven enum RTCPriorityType { "very-low", "low", "medium", "high" }; partial interface RTCPeerConnection { - static Promise<RTCCertificate> generateCertificate(AlgorithmIdentifier keygenAlgorithm); + static Promise<RTCCertificate> + generateCertificate(AlgorithmIdentifier keygenAlgorithm); }; dictionary RTCCertificateExpiration { [EnforceRange] DOMTimeStamp expires; }; [Exposed=Window, Serializable] interface RTCCertificate { @@ -264,17 +271,17 @@ interface RTCCertificate { partial interface RTCPeerConnection { sequence<RTCRtpSender> getSenders(); sequence<RTCRtpReceiver> getReceivers(); sequence<RTCRtpTransceiver> getTransceivers(); RTCRtpSender addTrack(MediaStreamTrack track, MediaStream... streams); void removeTrack(RTCRtpSender sender); RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind, - optional RTCRtpTransceiverInit init); + optional RTCRtpTransceiverInit init = {}); attribute EventHandler ontrack; }; dictionary RTCRtpTransceiverInit { RTCRtpTransceiverDirection direction = "sendrecv"; sequence<MediaStream> streams = []; sequence<RTCRtpEncodingParameters> sendEncodings = []; }; @@ -483,35 +490,36 @@ enum RTCIceRole { "controlled" }; enum RTCIceComponent { "rtp", "rtcp" }; -[Exposed=Window, Constructor(DOMString type, RTCTrackEventInit eventInitDict)] +[Exposed=Window] interface RTCTrackEvent : Event { + constructor(DOMString type, RTCTrackEventInit eventInitDict); readonly attribute RTCRtpReceiver receiver; readonly attribute MediaStreamTrack track; [SameObject] readonly attribute FrozenArray<MediaStream> streams; readonly attribute RTCRtpTransceiver transceiver; }; dictionary RTCTrackEventInit : EventInit { required RTCRtpReceiver receiver; required MediaStreamTrack track; sequence<MediaStream> streams = []; required RTCRtpTransceiver transceiver; }; partial interface RTCPeerConnection { readonly attribute RTCSctpTransport? sctp; RTCDataChannel createDataChannel(USVString label, - optional RTCDataChannelInit dataChannelDict); + optional RTCDataChannelInit dataChannelDict = {}); attribute EventHandler ondatachannel; }; [Exposed=Window] interface RTCSctpTransport : EventTarget { readonly attribute RTCDtlsTransport transport; readonly attribute RTCSctpTransportState state; readonly attribute unrestricted double maxMessageSize; @@ -564,18 +572,19 @@ dictionary RTCDataChannelInit { enum RTCDataChannelState { "connecting", "open", "closing", "closed" }; -[Exposed=Window, Constructor(DOMString type, RTCDataChannelEventInit eventInitDict)] +[Exposed=Window] interface RTCDataChannelEvent : Event { + constructor(DOMString type, RTCDataChannelEventInit eventInitDict); readonly attribute RTCDataChannel channel; }; dictionary RTCDataChannelEventInit : EventInit { required RTCDataChannel channel; }; partial interface RTCRtpSender { @@ -585,19 +594,19 @@ partial interface RTCRtpSender { [Exposed=Window] interface RTCDTMFSender : EventTarget { void insertDTMF(DOMString tones, optional unsigned long duration = 100, optional unsigned long interToneGap = 70); attribute EventHandler ontonechange; readonly attribute boolean canInsertDTMF; readonly attribute DOMString toneBuffer; }; -[Exposed=Window, - Constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict)] +[Exposed=Window] interface RTCDTMFToneChangeEvent : Event { + constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict); readonly attribute DOMString tone; }; dictionary RTCDTMFToneChangeEventInit : EventInit { required DOMString tone; }; partial interface RTCPeerConnection { @@ -611,28 +620,29 @@ interface RTCStatsReport { }; dictionary RTCStats { required DOMHighResTimeStamp timestamp; required RTCStatsType type; required DOMString id; }; -[Exposed=Window, - Constructor(DOMString type, RTCStatsEventInit eventInitDict)] +[Exposed=Window] interface RTCStatsEvent : Event { + constructor(DOMString type, RTCStatsEventInit eventInitDict); readonly attribute RTCStatsReport report; }; dictionary RTCStatsEventInit : EventInit { required RTCStatsReport report; }; -[Exposed=Window, Constructor(RTCErrorInit init, optional DOMString message = "")] +[Exposed=Window] interface RTCError : DOMException { + constructor(RTCErrorInit init, optional DOMString message = ""); readonly attribute RTCErrorDetailType errorDetail; readonly attribute long? sdpLineNumber; readonly attribute long? httpRequestStatusCode; readonly attribute long? sctpCauseCode; readonly attribute unsigned long? receivedAlert; readonly attribute unsigned long? sentAlert; }; @@ -658,17 +668,17 @@ enum RTCErrorDetailType { "idp-token-expired", "idp-token-invalid", "sctp-failure", "sdp-syntax-error", "hardware-encoder-not-available", "hardware-encoder-error" }; -[Exposed=Window, - Constructor(DOMString type, RTCErrorEventInit eventInitDict)] +[Exposed=Window] interface RTCErrorEvent : Event { + constructor(DOMString type, RTCErrorEventInit eventInitDict); [SameObject] readonly attribute RTCError error; }; dictionary RTCErrorEventInit : EventInit { required RTCError error; };
--- a/testing/web-platform/tests/interfaces/webusb.idl +++ b/testing/web-platform/tests/interfaces/webusb.idl @@ -34,21 +34,21 @@ partial interface WorkerNavigator { [SameObject] readonly attribute USB usb; }; dictionary USBConnectionEventInit : EventInit { required USBDevice device; }; [ - Constructor(DOMString type, USBConnectionEventInit eventInitDict), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBConnectionEvent : Event { + constructor(DOMString type, USBConnectionEventInit eventInitDict); [SameObject] readonly attribute USBDevice device; }; [Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext] interface USBDevice { readonly attribute octet usbVersionMajor; readonly attribute octet usbVersionMinor; readonly attribute octet usbVersionSubminor; @@ -105,103 +105,103 @@ dictionary USBControlTransferParameters required USBRequestType requestType; required USBRecipient recipient; required octet request; required unsigned short value; required unsigned short index; }; [ - Constructor(USBTransferStatus status, optional DataView? data), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBInTransferResult { + constructor(USBTransferStatus status, optional DataView? data); readonly attribute DataView? data; readonly attribute USBTransferStatus status; }; [ - Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBOutTransferResult { + constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0); readonly attribute unsigned long bytesWritten; readonly attribute USBTransferStatus status; }; [ - Constructor(USBTransferStatus status, optional DataView? data), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBIsochronousInTransferPacket { + constructor(USBTransferStatus status, optional DataView? data); readonly attribute DataView? data; readonly attribute USBTransferStatus status; }; [ - Constructor(sequence<USBIsochronousInTransferPacket> packets, optional DataView? data), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBIsochronousInTransferResult { + constructor(sequence<USBIsochronousInTransferPacket> packets, optional DataView? data); readonly attribute DataView? data; readonly attribute FrozenArray<USBIsochronousInTransferPacket> packets; }; [ - Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBIsochronousOutTransferPacket { + constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0); readonly attribute unsigned long bytesWritten; readonly attribute USBTransferStatus status; }; [ - Constructor(sequence<USBIsochronousOutTransferPacket> packets), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBIsochronousOutTransferResult { + constructor(sequence<USBIsochronousOutTransferPacket> packets); readonly attribute FrozenArray<USBIsochronousOutTransferPacket> packets; }; [ - Constructor(USBDevice device, octet configurationValue), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBConfiguration { + constructor(USBDevice device, octet configurationValue); readonly attribute octet configurationValue; readonly attribute DOMString? configurationName; readonly attribute FrozenArray<USBInterface> interfaces; }; [ - Constructor(USBConfiguration configuration, octet interfaceNumber), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBInterface { + constructor(USBConfiguration configuration, octet interfaceNumber); readonly attribute octet interfaceNumber; readonly attribute USBAlternateInterface alternate; readonly attribute FrozenArray<USBAlternateInterface> alternates; readonly attribute boolean claimed; }; [ - Constructor(USBInterface deviceInterface, octet alternateSetting), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBAlternateInterface { + constructor(USBInterface deviceInterface, octet alternateSetting); readonly attribute octet alternateSetting; readonly attribute octet interfaceClass; readonly attribute octet interfaceSubclass; readonly attribute octet interfaceProtocol; readonly attribute DOMString? interfaceName; readonly attribute FrozenArray<USBEndpoint> endpoints; }; @@ -212,21 +212,21 @@ enum USBDirection { enum USBEndpointType { "bulk", "interrupt", "isochronous" }; [ - Constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction), Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext ] interface USBEndpoint { + constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction); readonly attribute octet endpointNumber; readonly attribute USBDirection direction; readonly attribute USBEndpointType type; readonly attribute unsigned long packetSize; }; dictionary USBPermissionDescriptor : PermissionDescriptor { sequence<USBDeviceFilter> filters; @@ -237,11 +237,12 @@ dictionary AllowedUSBDevice { required octet productId; DOMString serialNumber; }; dictionary USBPermissionStorage { sequence<AllowedUSBDevice> allowedDevices = []; }; +[Exposed=(DedicatedWorker,SharedWorker,Window)] interface USBPermissionResult : PermissionStatus { attribute FrozenArray<USBDevice> devices; };
--- a/testing/web-platform/tests/layout-instability/observe-layout-shift.html +++ b/testing/web-platform/tests/layout-instability/observe-layout-shift.html @@ -1,14 +1,19 @@ <!DOCTYPE HTML> <meta charset=utf-8> <title>Layout Instability: observe layout shift value via PerformanceObserver</title> <body> <style> #myDiv { position: relative; width: 300px; height: 100px; } + +/* Disable the button's focus ring, which otherwise expands its visual rect by + * 1px on all sides, triggering a layout shift event. + */ +#button { outline: none; } </style> <div id='myDiv'></div> <button id='button'>Generate a 'click' event</button> <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> let timeAfterClick;
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/payment-handler/app-change-shipping-address.js @@ -0,0 +1,44 @@ +self.addEventListener('canmakepayment', (event) => { + event.respondWith(true); +}); + +async function responder(event) { + const methodName = event.methodData[0].supportedMethods; + const shippingOption = event.shippingOptions[0].id; + const shippingAddress = { + addressLine: [ + '1875 Explorer St #1000', + ], + city: 'Reston', + country: 'US', + dependentLocality: '', + organization: 'Google', + phone: '+15555555555', + postalCode: '20190', + recipient: 'John Smith', + region: 'VA', + sortingCode: '', + }; + if (!event.changeShippingAddress) { + return { + methodName, + details: { + changeShippingAddressReturned: + 'The changeShippingAddress() method is not implemented.', + }, + }; + } + let changeShippingAddressReturned; + try { + const response = await event.changeShippingAddress(shippingAddress); + changeShippingAddressReturned = response; + } catch (err) { + changeShippingAddressReturned = err.message; + } + return {methodName, details: {changeShippingAddressReturned}, shippingAddress, + shippingOption}; +} + +self.addEventListener('paymentrequest', (event) => { + event.respondWith(responder(event)); +});
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/payment-handler/app-change-shipping-option.js @@ -0,0 +1,44 @@ +self.addEventListener('canmakepayment', (event) => { + event.respondWith(true); +}); + +async function responder(event) { + const methodName = event.methodData[0].supportedMethods; + const shippingOption = event.shippingOptions[0].id; + const shippingAddress = { + addressLine: [ + '1875 Explorer St #1000', + ], + city: 'Reston', + country: 'US', + dependentLocality: '', + organization: 'Google', + phone: '+15555555555', + postalCode: '20190', + recipient: 'John Smith', + region: 'VA', + sortingCode: '', + }; + if (!event.changeShippingOption) { + return { + methodName, + details: { + changeShippingOptionReturned: + 'The changeShippingOption() method is not implemented.', + }, + }; + } + let changeShippingOptionReturned; + try { + const response = await event.changeShippingOption(shippingOption); + changeShippingOptionReturned = response; + } catch (err) { + changeShippingOptionReturned = err.message; + } + return {methodName, details: {changeShippingOptionReturned}, shippingAddress, + shippingOption}; +} + +self.addEventListener('paymentrequest', (event) => { + event.respondWith(responder(event)); +});
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/payment-handler/change-shipping-address-manual.https.html @@ -0,0 +1,161 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Tests for PaymentRequestEvent.changeShippingAddress()</title> + +<link rel="manifest" href="/payment-handler/basic-card.json" /> +<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="register-and-activate-service-worker.js"></script> +<p>If the payment sheet is shown, please authorize the mock payment.</p> +<script> + const methodName = window.location.origin + '/payment-handler/payment-app/'; + function createRequest() { + return new PaymentRequest([{supportedMethods: methodName}], { + total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}}, + shippingOptions: [{ + id: 'freeShippingOption', + label: 'Free global shipping', + amount: { + currency: 'USD', + value: '0', + }, + selected: false, + }], + }, {requestShipping: true}); + } + + async function completeAppSetUp(registration) { + await registration.paymentManager.instruments.clear(); + await registration.paymentManager.instruments.set('instrument-key', { + name: 'Instrument Name', + method: methodName, + }); + await navigator.serviceWorker.ready; + await registration.paymentManager.enableDelegations(['shippingAddress']); + } + + async function runTests(registration) { + await completeAppSetUp(registration); + promise_test(async (t) => { + const request = createRequest(); + // Intentionally do not respond to the 'shippingaddresschange' event. + const response = await test_driver.bless('showing a payment sheet', () => + request.show() + ); + const complete_promise = response.complete('success'); + + assert_equals(response.details.changeShippingAddressReturned, null); + + return complete_promise; + }, 'If updateWith(details) is not run, changeShippingAddress() returns null.'); + + promise_test(async (t) => { + const request = createRequest(); + request.addEventListener('shippingaddresschange', (event) => { + assert_equals(request.shippingAddress.organization, '', 'organization should be redacted'); + assert_equals(request.shippingAddress.phone, '', 'phone should be redacted'); + assert_equals(request.shippingAddress.recipient, '', 'recipient should be redacted'); + assert_equals(request.shippingAddress.addressLine.length, 0, 'addressLine should be redacted'); + assert_equals(request.shippingAddress.city, 'Reston'); + assert_equals(request.shippingAddress.country, 'US'); + assert_equals(request.shippingAddress.postalCode, '20190'); + assert_equals(request.shippingAddress.region, 'VA'); + event.updateWith({ + total: {label: 'Total', amount: {currency: 'GBP', value: '0.02'}}, + error: 'Error for test', + modifiers: [ + { + supportedMethods: methodName, + data: {soup: 'potato'}, + total: { + label: 'Modified total', + amount: {currency: 'EUR', value: '0.03'}, + }, + additionalDisplayItems: [ + { + label: 'Modified display item', + amount: {currency: 'INR', value: '0.06'}, + }, + ], + }, + { + supportedMethods: methodName + '2', + data: {soup: 'tomato'}, + total: { + label: 'Modified total #2', + amount: {currency: 'CHF', value: '0.07'}, + }, + additionalDisplayItems: [ + { + label: 'Modified display item #2', + amount: {currency: 'CAD', value: '0.08'}, + }, + ], + }, + ], + displayItems: [ + { + label: 'Display item', + amount: {currency: 'CNY', value: '0.04'}, + }, + ], + shippingOptions: [ + { + id: 'freeShippingOption', + label: 'express global shipping', + amount: { + currency: 'USD', + value: '0', + }, + selected: true, + } + ], + shippingAddressErrors: { + country: 'US only shipping', + } + }); + }); + const response = await test_driver.bless('showing a payment sheet', () => + request.show() + ); + const complete_promise = response.complete('success'); + const changeShippingAddressReturned = + response.details.changeShippingAddressReturned; + + assert_equals(changeShippingAddressReturned.total.currency, 'GBP'); + assert_equals(changeShippingAddressReturned.total.value, '0.02'); + assert_equals(changeShippingAddressReturned.total.label, undefined); + assert_equals(changeShippingAddressReturned.error, 'Error for test'); + assert_equals(changeShippingAddressReturned.modifiers.length, 1); + assert_equals(changeShippingAddressReturned.displayItems, undefined); + assert_equals(changeShippingAddressReturned.shippingOptions.length, 1); + assert_equals(changeShippingAddressReturned.paymentMethodErrors, undefined); + assert_equals(changeShippingAddressReturned.shippingAddressErrors.country, 'US only shipping'); + + const shipping_option = changeShippingAddressReturned.shippingOptions[0]; + assert_equals(shipping_option.id, 'freeShippingOption' ); + assert_equals(shipping_option.label, 'express global shipping'); + assert_equals(shipping_option.amount.currency, 'USD'); + assert_equals(shipping_option.amount.value, '0'); + assert_true(shipping_option.selected); + + const modifier = changeShippingAddressReturned.modifiers[0]; + assert_equals(modifier.supportedMethods, methodName); + assert_equals(modifier.data.soup, 'potato'); + assert_equals(modifier.total.label, ''); + assert_equals(modifier.total.amount.currency, 'EUR'); + assert_equals(modifier.total.amount.value, '0.03'); + assert_equals(modifier.additionalDisplayItems, undefined); + + return complete_promise; + }, 'The changeShippingAddress() returns some details from the "shippingaddresschange" event\'s updateWith(details) call.'); + } + + registerAndActiveServiceWorker( + 'app-change-shipping-address.js', + 'payment-app/', + runTests + ); +</script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/payment-handler/change-shipping-option-manual.https.html @@ -0,0 +1,160 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Tests for PaymentRequestEvent.changeShippingOption()</title> + +<link rel="manifest" href="/payment-handler/basic-card.json" /> +<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="register-and-activate-service-worker.js"></script> +<p>If the payment sheet is shown, please authorize the mock payment.</p> +<script> + const methodName = window.location.origin + '/payment-handler/payment-app/'; + function createRequest() { + return new PaymentRequest([{supportedMethods: methodName}], { + total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}}, + shippingOptions: [{ + id: 'freeShippingOption', + label: 'Free global shipping', + amount: { + currency: 'USD', + value: '0', + }, + selected: false, + }, + { + id: 'expressShippingOption', + label: 'express global shipping', + amount: { + currency: 'USD', + value: '0', + }, + selected: true, + }], + }, {requestShipping: true}); + } + + async function completeAppSetUp(registration) { + await registration.paymentManager.instruments.clear(); + await registration.paymentManager.instruments.set('instrument-key', { + name: 'Instrument Name', + method: methodName, + }); + await navigator.serviceWorker.ready; + await registration.paymentManager.enableDelegations(['shippingAddress']); + } + + async function runTests(registration) { + await completeAppSetUp(registration); + promise_test(async (t) => { + const request = createRequest(); + // Intentionally do not respond to the 'shippingoptionchange' event. + const response = await test_driver.bless('showing a payment sheet', () => + request.show() + ); + const complete_promise = response.complete('success'); + + assert_equals(response.details.changeShippingOptionReturned, null); + + return complete_promise; + }, 'If updateWith(details) is not run, changeShippingOption() returns null.'); + + promise_test(async (t) => { + const request = createRequest(); + request.addEventListener('shippingoptionchange', (event) => { + assert_equals(request.shippingOption, 'freeShippingOption'); + event.updateWith({ + total: {label: 'Total', amount: {currency: 'GBP', value: '0.02'}}, + error: 'Error for test', + modifiers: [ + { + supportedMethods: methodName, + data: {soup: 'potato'}, + total: { + label: 'Modified total', + amount: {currency: 'EUR', value: '0.03'}, + }, + additionalDisplayItems: [ + { + label: 'Modified display item', + amount: {currency: 'INR', value: '0.06'}, + }, + ], + }, + { + supportedMethods: methodName + '2', + data: {soup: 'tomato'}, + total: { + label: 'Modified total #2', + amount: {currency: 'CHF', value: '0.07'}, + }, + additionalDisplayItems: [ + { + label: 'Modified display item #2', + amount: {currency: 'CAD', value: '0.08'}, + }, + ], + }, + ], + displayItems: [ + { + label: 'Display item', + amount: {currency: 'CNY', value: '0.04'}, + }, + ], + shippingOptions: [ + { + id: 'freeShippingOption', + label: 'express global shipping', + amount: { + currency: 'USD', + value: '0', + }, + selected: true, + } + ], + }); + }); + const response = await test_driver.bless('showing a payment sheet', () => + request.show() + ); + const complete_promise = response.complete('success'); + const changeShippingOptionReturned = + response.details.changeShippingOptionReturned; + + assert_equals(changeShippingOptionReturned.total.currency, 'GBP'); + assert_equals(changeShippingOptionReturned.total.value, '0.02'); + assert_equals(changeShippingOptionReturned.total.label, undefined); + assert_equals(changeShippingOptionReturned.error, 'Error for test'); + assert_equals(changeShippingOptionReturned.modifiers.length, 1); + assert_equals(changeShippingOptionReturned.displayItems, undefined); + assert_equals(changeShippingOptionReturned.shippingOptions.length, 1); + assert_equals(changeShippingOptionReturned.paymentMethodErrors, undefined); + assert_equals(changeShippingOptionReturned.shippingAddressErrors, undefined); + + const shipping_option = changeShippingOptionReturned.shippingOptions[0]; + assert_equals(shipping_option.id, 'freeShippingOption' ); + assert_equals(shipping_option.label, 'express global shipping'); + assert_equals(shipping_option.amount.currency, 'USD'); + assert_equals(shipping_option.amount.value, '0'); + assert_true(shipping_option.selected); + + const modifier = changeShippingOptionReturned.modifiers[0]; + assert_equals(modifier.supportedMethods, methodName); + assert_equals(modifier.data.soup, 'potato'); + assert_equals(modifier.total.label, ''); + assert_equals(modifier.total.amount.currency, 'EUR'); + assert_equals(modifier.total.amount.value, '0.03'); + assert_equals(modifier.additionalDisplayItems, undefined); + + return complete_promise; + }, 'The changeShippingOption() returns some details from the "shippingoptionchange" event\'s updateWith(details) call.'); + } + + registerAndActiveServiceWorker( + 'app-change-shipping-option.js', + 'payment-app/', + runTests + ); +</script>
--- a/testing/web-platform/tests/proximity/ProximitySensor-iframe-access.https.html +++ b/testing/web-platform/tests/proximity/ProximitySensor-iframe-access.https.html @@ -1,14 +1,14 @@ <!DOCTYPE html> <meta charset="utf-8"> <title>ProximitySensor iframe test</title> <link rel="author" title="Intel" href="http://www.intel.com"> <link rel="help" href="https://w3c.github.io/proximity/"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/generic-sensor/generic-sensor-tests.js"></script> +<script src="/generic-sensor/resources/generic-sensor-helpers.js"></script> <script src="/generic-sensor/generic-sensor-iframe-tests.sub.js"></script> <script src="/generic-sensor/generic-sensor-feature-policy-test.sub.js"></script> <div id="log"></div> <script> run_generic_sensor_iframe_tests('ProximitySensor'); </script>
--- a/testing/web-platform/tests/proximity/ProximitySensor.https.html +++ b/testing/web-platform/tests/proximity/ProximitySensor.https.html @@ -1,14 +1,32 @@ <!DOCTYPE html> <meta charset="utf-8"> <title>ProximitySensor Test</title> <link rel="author" title="Intel" href="http://www.intel.com"> <link rel="help" href="https://w3c.github.io/proximity/"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/generic-sensor/resources/generic-sensor-helpers.js"></script> <script src="/generic-sensor/generic-sensor-tests.js"></script> -<div id="log"></div> + <script> -runGenericSensorTests('ProximitySensor'); +'use strict'; + +// near: 0 stands for false, 1 stands for true, which will be convert to boolean +// in mock sensor +const kReadings = { + readings: [ + [1.12345, 2.12345, 1] + ], + expectedReadings: [ + [1.12345, 2.12345, true] + ] +}; + +runGenericSensorTests( + 'ProximitySensor', + kReadings, + verifyProximitySensorReading, + ['proximity']); </script>
deleted file mode 100644 --- a/testing/web-platform/tests/proximity/ProximitySensor_onerror-manual.https.html +++ /dev/null @@ -1,20 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>ProximitySensor Test: onerror</title> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://w3c.github.io/proximity/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/generic-sensor/generic-sensor-tests.js"></script> -<div id="log"></div> -<h2>Precondition</h2> -<ol> - <li> - Disable the Proximity Sensor or run test on a device without Proximity Sensor. - </li> -</ol> -<script> - -runGenericSensorOnerror('ProximitySensor'); - -</script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/resource-timing/resource_hash.htm @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8" /> +<title>Resource Timing: image with a hash</title> +<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webperftestharness.js"></script> +<script src="resources/webperftestharnessextension.js"></script> +<script> +setup({explicit_done: true}); + +// explicitly test the namespace before we start testing +test_namespace("getEntriesByType"); + +function onload_test() { + if (window.performance.getEntriesByType === undefined) { + done(); + return; + } + + const url = "resources/fake_responses.py?tag=" + Math.random() + '#hash=1'; + const image = new Image(); + image.onload = image.onerror = () => { + const entries = window.performance.getEntriesByType('resource').filter(r => r.initiatorType === 'img'); + test_equals(entries.length, 1, "There should be one entry"); + if (entries.length === 1) { + test_true(entries[0].name.indexOf('#hash=1') > -1, "There should be a hash in the resource name"); + } + done(); + + } + image.src = url; +} +window.onload = onload_test; +</script> +</head> +<body> +<h1>Description</h1> +<p>This test validates that a hash in an image URL is preserved in resource timing API results.</p> +<div id="log"></div> +</body> +</html>
--- a/testing/web-platform/tests/resources/chromium/generic_sensor_mocks.js +++ b/testing/web-platform/tests/resources/chromium/generic_sensor_mocks.js @@ -145,17 +145,18 @@ var GenericSensorTest = (() => { ['Magnetometer', device.mojom.SensorType.MAGNETOMETER], ['AbsoluteOrientationSensor', device.mojom.SensorType.ABSOLUTE_ORIENTATION_QUATERNION], ['AbsoluteOrientationEulerAngles', device.mojom.SensorType.ABSOLUTE_ORIENTATION_EULER_ANGLES], ['RelativeOrientationSensor', device.mojom.SensorType.RELATIVE_ORIENTATION_QUATERNION], ['RelativeOrientationEulerAngles', - device.mojom.SensorType.RELATIVE_ORIENTATION_EULER_ANGLES] + device.mojom.SensorType.RELATIVE_ORIENTATION_EULER_ANGLES], + ['ProximitySensor', device.mojom.SensorType.PROXIMITY] ]); this.binding_ = new mojo.Binding(device.mojom.SensorProvider, this); this.interceptor_ = new MojoInterfaceInterceptor( device.mojom.SensorProvider.name, "context", true); this.interceptor_.oninterfacerequest = e => { this.bindToPipe(e.handle); };
--- a/testing/web-platform/tests/resources/chromium/mock-barcodedetection.js +++ b/testing/web-platform/tests/resources/chromium/mock-barcodedetection.js @@ -4,17 +4,17 @@ var BarcodeDetectionTest = (() => { // Class that mocks BarcodeDetectionProvider interface defined in // https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/barcodedetection_provider.mojom class MockBarcodeDetectionProvider { constructor() { this.bindingSet_ = new mojo.BindingSet( shapeDetection.mojom.BarcodeDetectionProvider); this.interceptor_ = new MojoInterfaceInterceptor( - shapeDetection.mojom.BarcodeDetectionProvider.name); + shapeDetection.mojom.BarcodeDetectionProvider.name, "context", true); this.interceptor_.oninterfacerequest = e => this.bindingSet_.addBinding(this, e.handle); this.interceptor_.start(); } createBarcodeDetection(request, options) { this.mockService_ = new MockBarcodeDetection(request, options); }
--- a/testing/web-platform/tests/resources/chromium/mock-facedetection.js +++ b/testing/web-platform/tests/resources/chromium/mock-facedetection.js @@ -4,17 +4,17 @@ var FaceDetectionTest = (() => { // Class that mocks FaceDetectionProvider interface defined in // https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/facedetection_provider.mojom class MockFaceDetectionProvider { constructor() { this.bindingSet_ = new mojo.BindingSet( shapeDetection.mojom.FaceDetectionProvider); this.interceptor_ = new MojoInterfaceInterceptor( - shapeDetection.mojom.FaceDetectionProvider.name); + shapeDetection.mojom.FaceDetectionProvider.name, "context", true); this.interceptor_.oninterfacerequest = e => this.bindingSet_.addBinding(this, e.handle); this.interceptor_.start(); } createFaceDetection(request, options) { this.mockService_ = new MockFaceDetection(request, options); }
--- a/testing/web-platform/tests/tools/wpt/tests/test_wpt.py +++ b/testing/web-platform/tests/tools/wpt/tests/test_wpt.py @@ -341,17 +341,17 @@ def test_tests_affected(capsys, manifest @pytest.mark.skipif(sys.platform == "win32", reason="https://github.com/web-platform-tests/wpt/issues/12934") def test_tests_affected_idlharness(capsys, manifest_dir): commit = "47cea8c38b88c0ddd3854e4edec0c5b6f2697e62" with pytest.raises(SystemExit) as excinfo: wpt.main(argv=["tests-affected", "--metadata", manifest_dir, "%s~..%s" % (commit, commit)]) assert excinfo.value.code == 0 out, err = capsys.readouterr() - assert "webrtc-stats/idlharness.window.js\nwebrtc/idlharness.https.window.js\n" == out + assert "webrtc-identity/idlharness.https.window.js\nwebrtc-stats/idlharness.window.js\nwebrtc/idlharness.https.window.js\n" == out @pytest.mark.slow # this updates the manifest @pytest.mark.xfail(sys.platform == "win32", reason="Tests currently don't work on Windows for path reasons") @pytest.mark.skipif(sys.platform == "win32", reason="https://github.com/web-platform-tests/wpt/issues/12934") def test_tests_affected_null(capsys, manifest_dir):
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -34,16 +34,17 @@ def executor_kwargs(test_type, server_co **kwargs): executor_kwargs = base_executor_kwargs(test_type, server_config, cache_manager, run_info_data, **kwargs) executor_kwargs["close_after_done"] = True executor_kwargs["supports_eager_pageload"] = False capabilities = { + "acceptInsecureCerts": True, "goog:chromeOptions": { "prefs": { "profile": { "default_content_setting_values": { "popups": 1 } } },
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/metadata.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/metadata.py @@ -697,18 +697,17 @@ class TestFileData(object): subtest_id = subtest_id.decode("utf8") item_expected = test_expected.get_subtest(subtest_id) if prop == "status": status, known_intermittent = unpack_result(value) value = Result(status, known_intermittent, default_expected_by_type[self.item_type, - subtest_id is not None], - ) + subtest_id is not None]) item_expected.set_result(run_info, value) elif prop == "asserts": item_expected.set_asserts(run_info, value) expected.update(full_update=full_update, disable_intermittent=disable_intermittent) for test in expected.iterchildren(): for subtest in test.iterchildren():
--- a/testing/web-platform/tests/trusted-types/trusted-types-reporting.tentative.https.html +++ b/testing/web-platform/tests/trusted-types/trusted-types-reporting.tentative.https.html @@ -63,17 +63,17 @@ function expect_sample(s) { return e => { assert_true(e.sample.includes(s), `expected "${e.sample}" to include "${s}".`); return e; } } function expect_blocked_uri(s) { return e => { assert_true(e.blockedURI === s, - `expected "${e.blockedUri}" to be "${s}".`); + `expected "${e.blockedURI}" to be "${s}".`); return e; } } // A sample policy we use to test TrustedTypes.createPolicy behaviour. const id = x => x; const a_policy = { createHTML: id, createScriptURL: id, @@ -149,55 +149,60 @@ document.getElementById("div").innerHTML = policy_one.createHTML("abc"); flush(); return p; }, "Trusted Type violation report: assign trusted HTML to html; no report"); promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types two")) + .then(expect_blocked_uri("trusted-types-sink")) .then(expect_sample("Element.innerHTML")) .then(expect_sample("abc")); expect_throws(_ => { document.getElementById("div").innerHTML = "abc" }); return p; }, "Trusted Type violation report: sample for .innerHTML assignment"); promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types two")) + .then(expect_blocked_uri("trusted-types-sink")) .then(expect_sample("HTMLAnchorElement.href")); expect_throws(_ => { document.getElementById("anchor").href = "" }); return p; }, "Trusted Type violation report: sample for .href assignment"); promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types two")) + .then(expect_blocked_uri("trusted-types-sink")) .then(expect_sample("HTMLElement.innerText")) .then(expect_sample("2+2;")); expect_throws(_ => document.getElementById("script").innerText = "2+2;"); return p; }, "Trusted Type violation report: sample for script innerText assignment"); promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types one")) + .then(expect_blocked_uri("trusted-types-sink")) .then(expect_sample("eval")) .then(expect_sample("2+2")) .then(promise_flush()); expect_throws(_ => eval("2+2")); flush(); return p; }, "Trusted Type violation report: sample for eval"); promise_test(t => { // We expect the sample string to always contain the name, and at least the // start of the value, but it should not be excessively long. let p = Promise.resolve() .then(promise_violation("trusted-types two")) + .then(expect_blocked_uri("trusted-types-sink")) .then(expect_sample("HTMLElement.innerText")) .then(expect_sample("abbb")) .then(e => assert_less_than(e.sample.length, 150)); const value = "a" + "b".repeat(50000); expect_throws(_ => document.getElementById("script").innerText = value); return p; }, "Trusted Type violation report: large values should be handled sanely."); @@ -206,16 +211,17 @@ // "mask" the underlying DOM mechanism (for reporting). if (customElements) { class CustomLink extends HTMLAnchorElement {}; customElements.define("custom-link", CustomLink, { extends: "a" }); promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types one")) + .then(expect_blocked_uri("trusted-types-sink")) .then(expect_sample("HTMLAnchorElement.href")) .then(expect_sample("abc")); expect_throws(_ => document.getElementById("customlink").href = "abc"); return p; }, "Trusted Type violation report: sample for custom element assignment"); } </script>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/upgrade-insecure-requests/generic/test-case.sub.js @@ -0,0 +1,37 @@ +// TODO(hiroshige): Document the type of `scenario`. +function TestCase(scenario, description) { + const urls = getRequestURLs(scenario.subresource, + scenario.origin, + scenario.redirection); + const checkResult = _ => { + // Send request to check if the key has been torn down. + return xhrRequest(urls.assertUrl) + .then(assertResult => { + // Now check if the value has been torn down. If it's still there, + // we have blocked the request to mixed-content. + assert_equals(assertResult.status, scenario.expectation, + "The resource request should be '" + scenario.expectation + "'."); + }); + }; + + function runTest() { + /** @type {Subresource} */ + const subresource = { + subresourceType: scenario.subresource, + url: urls.testUrl, + policyDeliveries: scenario.subresource_policy_deliveries, + }; + + promise_test(() => { + return xhrRequest(urls.announceUrl) + // Send out the real resource request. + // This should tear down the key if it's not blocked. + .then(_ => invokeRequest(subresource, scenario.source_context_list)) + // We check the key state, regardless of whether the main request + // succeeded or failed. + .then(checkResult, checkResult); + }, description); + } // runTest + + return {start: runTest}; +}
new file mode 100755 --- /dev/null +++ b/testing/web-platform/tests/upgrade-insecure-requests/generic/tools/generate.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import os +import sys + +sys.path.insert( + 0, + os.path.join( + os.path.dirname(os.path.abspath(__file__)), '..', '..', '..', 'common', + 'security-features', 'tools')) +import generate + + +class UpgradeInsecureRequestsConfig(object): + def __init__(self): + self.selection_pattern = \ + '%(source_context_list)s.%(delivery_type)s/' + \ + '%(delivery_value)s/' + \ + '%(subresource)s/' + \ + '%(origin)s.%(redirection)s.%(source_scheme)s' + + self.test_file_path_pattern = 'gen/' + self.selection_pattern + '.html' + + self.test_description_template = 'Upgrade-Insecure-Requests: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.' + + self.test_page_title_template = 'Upgrade-Insecure-Requests: %s' + + self.helper_js = '/upgrade-insecure-requests/generic/test-case.sub.js' + + # For debug target only. + self.sanity_checker_js = '/upgrade-insecure-requests/generic/sanity-checker.js' + self.spec_json_js = '/upgrade-insecure-requests/spec_json.js' + + self.test_case_name = 'TestCase' + + script_directory = os.path.dirname(os.path.abspath(__file__)) + self.spec_directory = os.path.abspath( + os.path.join(script_directory, '..', '..')) + + +if __name__ == '__main__': + generate.main(UpgradeInsecureRequestsConfig())
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/upgrade-insecure-requests/spec.src.json @@ -0,0 +1,376 @@ +{ + "specification": [ + { + "name": "No upgrade-insecure-request", + "title": "No upgrade-insecure-request", + "description": "No upgrade-insecure-request", + "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/", + "test_expansion": [ + { + "name": "Without upgrade-insecure-request, all requests are blocked ...", + "expansion": "default", + "source_scheme": "https", + "source_context_list": "*", + "delivery_type": "meta", + "delivery_value": null, + "redirection": "*", + "subresource": "*", + "origin": "*", + "expectation": "blocked" + }, + { + "name": "... except for the secure requests listed here", + "expansion": "override", + "source_scheme": "https", + "source_context_list": "*", + "delivery_type": "meta", + "delivery_value": null, + "redirection": "no-redirect", + "subresource": "*", + "origin": [ + "same-https", + "cross-https", + "same-wss", + "cross-wss" + ], + "expectation": "allowed" + } + ] + }, + { + "name": "With upgrade-insecure-request", + "title": "With upgrade-insecure-request", + "description": "With upgrade-insecure-request", + "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/", + "test_expansion": [ + { + "name": "With upgrade-insecure-request, all insecure requests are upgraded and allowed.", + "expansion": "default", + "source_scheme": "https", + "source_context_list": "*", + "delivery_type": "*", + "delivery_value": "upgrade", + "redirection": "*", + "subresource": "*", + "origin": "*", + "expectation": "allowed" + } + ] + } + ], + "delivery_key": "upgradeInsecureRequests", + "excluded_tests": [ + { + "name": "Omit secure requests", + "expansion": "*", + "source_scheme": "*", + "source_context_list": "*", + "delivery_type": "*", + "delivery_value": "*", + "redirection": "no-redirect", + "subresource": "*", + "origin": [ + "same-https", + "cross-https", + "same-wss", + "cross-wss" + ], + "expectation": "allowed" + }, + { + "name": "For inheriting tests skip http-rp because we already have <meta> tests", + "expansion": "*", + "source_scheme": "*", + "source_context_list": [ + "srcdoc-inherit", + "iframe-blank-inherit", + "worker-classic-data" + ], + "delivery_type": "http-rp", + "delivery_value": "*", + "redirection": "*", + "subresource": "*", + "origin": "*", + "expectation": "*" + }, + { + "name": "Workers are same-origin only", + "expansion": "*", + "source_scheme": "*", + "source_context_list": "*", + "delivery_type": "*", + "delivery_value": "*", + "redirection": "*", + "subresource": [ + "worker-classic", + "worker-module", + "sharedworker-classic" + ], + "origin": [ + "cross-https", + "cross-http-downgrade", + "cross-wss", + "cross-ws-downgrade" + ], + "expectation": "*" + }, + { + "name": "Websockets are ws/wss-only", + "expansion": "*", + "source_scheme": "*", + "source_context_list": "*", + "delivery_type": "*", + "delivery_value": "*", + "redirection": "*", + "subresource": "websocket", + "origin": [ + "same-https", + "same-http-downgrade", + "cross-https", + "cross-http-downgrade" + ], + "expectation": "*" + }, + { + "name": "Websockets is no-redirect only", + "expansion": "*", + "source_scheme": "*", + "source_context_list": "*", + "delivery_type": "*", + "delivery_value": "*", + "redirection": [ + "downgrade" + ], + "subresource": "websocket", + "origin": "*", + "expectation": "*" + }, + { + "name": "ws/wss are websocket-only", + "expansion": "*", + "source_scheme": "*", + "source_context_list": "*", + "delivery_type": "*", + "delivery_value": "*", + "redirection": "*", + "subresource": [ + "iframe-tag", + "img-tag", + "xhr", + "fetch", + "worker-classic", + "worker-module", + "worker-import-data", + "sharedworker-classic", + "worklet-animation", + "worklet-audio", + "worklet-layout", + "worklet-paint", + "worklet-animation-import-data", + "worklet-audio-import-data", + "worklet-layout-import-data", + "worklet-paint-import-data" + ], + "origin": [ + "same-wss", + "same-ws-downgrade", + "cross-wss", + "cross-ws-downgrade" + ], + "expectation": "*" + } + ], + "source_context_schema": { + "supported_delivery_type": { + "top": [ + "http-rp", + "meta" + ], + "iframe": [ + "http-rp", + "meta" + ], + "iframe-blank": [ + "meta" + ], + "srcdoc": [ + "meta" + ], + "worker-classic": [ + "http-rp" + ], + "worker-module": [ + "http-rp" + ], + "worker-classic-data": [], + "worker-module-data": [] + }, + "supported_subresource": { + "top": "*", + "iframe": "*", + "iframe-blank": "*", + "srcdoc": "*", + "worker-classic": [ + "xhr", + "fetch", + "websocket" + ], + "worker-module": [ + "xhr", + "fetch", + "websocket" + ], + "worker-classic-data": [ + "xhr", + "fetch", + "websocket" + ], + "worker-module-data": [ + "xhr", + "fetch", + "websocket" + ] + } + }, + "subresource_schema": { + "supported_delivery_type": { + "xhr": [], + "worker-classic": [], + "worker-module": [], + "worker-import-data": [], + "sharedworker-classic": [], + "worklet-animation": [], + "worklet-audio": [], + "worklet-layout": [], + "worklet-paint": [], + "worklet-animation-import-data": [], + "worklet-audio-import-data": [], + "worklet-layout-import-data": [], + "worklet-paint-import-data": [], + "fetch": [], + "websocket": [], + "img-tag": [], + "iframe-tag": [] + } + }, + "source_context_list_schema": { + "top": { + "description": "CSP set by the top-level Document", + "sourceContextList": [ + { + "sourceContextType": "top", + "policyDeliveries": [ + "policy" + ] + } + ], + "subresourcePolicyDeliveries": [] + }, + "srcdoc-inherit": { + "description": "srcdoc iframe should inherit parent Document's policy", + "sourceContextList": [ + { + "sourceContextType": "top", + "policyDeliveries": [ + "policy" + ] + }, + { + "sourceContextType": "srcdoc" + } + ], + "subresourcePolicyDeliveries": [] + }, + "iframe-blank-inherit": { + "description": "blank iframe should inherit parent Document's policy", + "sourceContextList": [ + { + "sourceContextType": "top", + "policyDeliveries": [ + "policy" + ] + }, + { + "sourceContextType": "iframe-blank" + } + ], + "subresourcePolicyDeliveries": [] + }, + "worker-classic-data": { + "description": "CSP set by the top-level Document is inherited to dedicated workers", + "sourceContextList": [ + { + "sourceContextType": "top", + "policyDeliveries": [ + "policy" + ] + }, + { + "sourceContextType": "worker-classic-data", + "policyDeliveries": [] + } + ], + "subresourcePolicyDeliveries": [] + } + }, + "test_expansion_schema": { + "expansion": [ + "default", + "override" + ], + "source_scheme": [ + "https" + ], + "delivery_type": [ + "http-rp", + "meta" + ], + "delivery_value": [ + null, + "upgrade" + ], + "source_context_list": [ + "top", + "srcdoc-inherit", + "iframe-blank-inherit", + "worker-classic-data" + ], + "redirection": [ + "no-redirect", + "downgrade" + ], + "origin": [ + "same-https", + "same-http-downgrade", + "cross-https", + "cross-http-downgrade", + "same-wss", + "same-ws-downgrade", + "cross-wss", + "cross-ws-downgrade" + ], + "subresource": [ + "iframe-tag", + "img-tag", + "xhr", + "fetch", + "websocket", + "worker-classic", + "worker-module", + "worker-import-data", + "sharedworker-classic", + "worklet-animation", + "worklet-audio", + "worklet-layout", + "worklet-paint", + "worklet-animation-import-data", + "worklet-audio-import-data", + "worklet-layout-import-data", + "worklet-paint-import-data" + ], + "expectation": [ + "allowed", + "blocked" + ] + } +}
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/upgrade-insecure-requests/spec_json.js @@ -0,0 +1,1 @@ +var SPEC_JSON = {"subresource_schema": {"supported_delivery_type": {"worklet-layout": [], "worklet-paint": [], "worker-module": [], "sharedworker-classic": [], "worklet-paint-import-data": [], "worklet-animation-import-data": [], "fetch": [], "xhr": [], "worker-classic": [], "worklet-layout-import-data": [], "worklet-audio-import-data": [], "worklet-animation": [], "worker-import-data": [], "websocket": [], "worklet-audio": [], "iframe-tag": [], "img-tag": []}}, "excluded_tests": [{"delivery_value": "*", "origin": ["same-https", "cross-https", "same-wss", "cross-wss"], "delivery_type": "*", "name": "Omit secure requests", "expectation": "allowed", "expansion": "*", "redirection": "no-redirect", "source_context_list": "*", "source_scheme": "*", "subresource": "*"}, {"delivery_value": "*", "origin": "*", "delivery_type": "http-rp", "name": "For inheriting tests skip http-rp because we already have <meta> tests", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": ["srcdoc-inherit", "iframe-blank-inherit", "worker-classic-data"], "source_scheme": "*", "subresource": "*"}, {"delivery_value": "*", "origin": ["cross-https", "cross-http-downgrade", "cross-wss", "cross-ws-downgrade"], "delivery_type": "*", "name": "Workers are same-origin only", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": "*", "source_scheme": "*", "subresource": ["worker-classic", "worker-module", "sharedworker-classic"]}, {"delivery_value": "*", "origin": ["same-https", "same-http-downgrade", "cross-https", "cross-http-downgrade"], "delivery_type": "*", "name": "Websockets are ws/wss-only", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": "*", "source_scheme": "*", "subresource": "websocket"}, {"delivery_value": "*", "origin": "*", "delivery_type": "*", "name": "Websockets is no-redirect only", "expectation": "*", "expansion": "*", "redirection": ["downgrade"], "source_context_list": "*", "source_scheme": "*", "subresource": "websocket"}, {"delivery_value": "*", "origin": ["same-wss", "same-ws-downgrade", "cross-wss", "cross-ws-downgrade"], "delivery_type": "*", "name": "ws/wss are websocket-only", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": "*", "source_scheme": "*", "subresource": ["iframe-tag", "img-tag", "xhr", "fetch", "worker-classic", "worker-module", "worker-import-data", "sharedworker-classic", "worklet-animation", "worklet-audio", "worklet-layout", "worklet-paint", "worklet-animation-import-data", "worklet-audio-import-data", "worklet-layout-import-data", "worklet-paint-import-data"]}], "specification": [{"test_expansion": [{"delivery_value": null, "origin": "*", "delivery_type": "meta", "name": "Without upgrade-insecure-request, all requests are blocked ...", "expectation": "blocked", "expansion": "default", "redirection": "*", "source_context_list": "*", "source_scheme": "https", "subresource": "*"}, {"delivery_value": null, "origin": ["same-https", "cross-https", "same-wss", "cross-wss"], "delivery_type": "meta", "name": "... except for the secure requests listed here", "expectation": "allowed", "expansion": "override", "redirection": "no-redirect", "source_context_list": "*", "source_scheme": "https", "subresource": "*"}], "description": "No upgrade-insecure-request", "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/", "name": "No upgrade-insecure-request", "title": "No upgrade-insecure-request"}, {"test_expansion": [{"delivery_value": "upgrade", "origin": "*", "delivery_type": "*", "name": "With upgrade-insecure-request, all insecure requests are upgraded and allowed.", "expectation": "allowed", "expansion": "default", "redirection": "*", "source_context_list": "*", "source_scheme": "https", "subresource": "*"}], "description": "With upgrade-insecure-request", "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/", "name": "With upgrade-insecure-request", "title": "With upgrade-insecure-request"}], "test_expansion_schema": {"delivery_value": [null, "upgrade"], "origin": ["same-https", "same-http-downgrade", "cross-https", "cross-http-downgrade", "same-wss", "same-ws-downgrade", "cross-wss", "cross-ws-downgrade"], "delivery_type": ["http-rp", "meta"], "subresource": ["iframe-tag", "img-tag", "xhr", "fetch", "websocket", "worker-classic", "worker-module", "worker-import-data", "sharedworker-classic", "worklet-animation", "worklet-audio", "worklet-layout", "worklet-paint", "worklet-animation-import-data", "worklet-audio-import-data", "worklet-layout-import-data", "worklet-paint-import-data"], "expectation": ["allowed", "blocked"], "expansion": ["default", "override"], "redirection": ["no-redirect", "downgrade"], "source_context_list": ["top", "srcdoc-inherit", "iframe-blank-inherit", "worker-classic-data"], "source_scheme": ["https"]}, "source_context_list_schema": {"worker-classic-data": {"subresourcePolicyDeliveries": [], "description": "CSP set by the top-level Document is inherited to dedicated workers", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}, {"sourceContextType": "worker-classic-data", "policyDeliveries": []}]}, "top": {"subresourcePolicyDeliveries": [], "description": "CSP set by the top-level Document", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}]}, "srcdoc-inherit": {"subresourcePolicyDeliveries": [], "description": "srcdoc iframe should inherit parent Document's policy", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}, {"sourceContextType": "srcdoc"}]}, "iframe-blank-inherit": {"subresourcePolicyDeliveries": [], "description": "blank iframe should inherit parent Document's policy", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}, {"sourceContextType": "iframe-blank"}]}}, "delivery_key": "upgradeInsecureRequests", "source_context_schema": {"supported_delivery_type": {"iframe": ["http-rp", "meta"], "worker-module-data": [], "worker-classic-data": [], "top": ["http-rp", "meta"], "worker-classic": ["http-rp"], "iframe-blank": ["meta"], "worker-module": ["http-rp"], "srcdoc": ["meta"]}, "supported_subresource": {"iframe": "*", "worker-module-data": ["xhr", "fetch", "websocket"], "worker-classic-data": ["xhr", "fetch", "websocket"], "top": "*", "worker-classic": ["xhr", "fetch", "websocket"], "iframe-blank": "*", "worker-module": ["xhr", "fetch", "websocket"], "srcdoc": "*"}}};
deleted file mode 100644 --- a/testing/web-platform/tests/upgrade-insecure-requests/support/generate.py +++ /dev/null @@ -1,64 +0,0 @@ -# Usage: execute -# $ python support/generate.py -# at wpt/upgrade-insecure-requests/. -# -# Note: Some tests (link-upgrade.sub.https.html and -# websocket-upgrade.https.html) are not covered by this generator script. - -template = '''<!DOCTYPE html> -<html> -<head> -<!-- Generated by wpt/upgrade-insecure-requests/support/generate.py -->%(additionalMeta)s -<title>Upgrade Insecure Requests: %(name)s.</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="./support/testharness-helper.sub.js"></script> -<script src="/common/security-features/resources/common.sub.js"></script> - -<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> -</head> -<body> -<script> -const tests = %(generatorName)s(ResourceType.%(resourceType)s, %(sameOriginOnly)s); -tests.forEach(test => testMap['%(name)s'](test)); -</script> -</body> -</html> -''' - -def getLong(file): - testsThatNeedMoreTime = [ "worker-subresource-fetch-redirect-upgrade.https.html" ] - if any(file in item for item in testsThatNeedMoreTime ): - return '\n<meta name="timeout" content="long">' - return "" - -# resourceType is |ResourceType| in testharness-helper.sub.js. -for name, resourceType in [ - ('image', 'IMAGE'), ('iframe', 'FRAME'), - ('animation-worklet', 'WORKLET'), ('audio-worklet', 'WORKLET'), - ('layout-worklet', 'WORKLET'), ('paint-worklet', 'WORKLET'), - ('worker', 'WORKER'), - ('module-worker', 'WORKER'), - ('worker-subresource-xhr', 'FETCH'), - ('worker-subresource-fetch', 'FETCH'), - ('shared-worker', 'SHARED_WORKER')]: - # TODO(https://crbug.com/989399): Add tests for subresource requests on shared - # workers, and main/subresource requests on service workers. - - sameOriginOnly = 'false' - if resourceType == 'WORKER' or resourceType == 'SHARED_WORKER': - sameOriginOnly = 'true' - - types = [('', 'generateTests'), ('-redirect', 'generateRedirectTests')] - if name == 'module-worker' or resourceType == 'WORKLET': - types.append(('-import', 'generateModuleImportTests')) - - for typeName, generatorName in types: - filename = '%s%s-upgrade.https.html' % (name, typeName) - with open(filename, 'w') as html_file: - html_file.write(template % { - 'name': name, - 'additionalMeta': getLong(filename), - 'resourceType': resourceType, - 'generatorName': generatorName, - 'sameOriginOnly': sameOriginOnly})
--- a/testing/web-platform/tests/webdriver/tests/take_element_screenshot/user_prompts.py +++ b/testing/web-platform/tests/webdriver/tests/take_element_screenshot/user_prompts.py @@ -1,70 +1,122 @@ # META: timeout=long import pytest -from tests.support.asserts import assert_png, assert_success +from tests.support.asserts import assert_dialog_handled, assert_error, assert_png, assert_success from tests.support.inline import inline def take_element_screenshot(session, element_id): return session.transport.send( "GET", "session/{session_id}/element/{element_id}/screenshot".format( session_id=session.session_id, element_id=element_id, ) ) @pytest.fixture -def check_user_prompt_not_closed_without_exception(session, create_dialog): - def check_user_prompt_not_closed_without_exception(dialog_type): +def check_user_prompt_closed_without_exception(session, create_dialog): + def check_user_prompt_closed_without_exception(dialog_type, retval): session.url = inline("<input/>") element = session.find.css("input", all=False) create_dialog(dialog_type, text=dialog_type) response = take_element_screenshot(session, element.id) value = assert_success(response) + assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) + assert_png(value) + return check_user_prompt_closed_without_exception + + +@pytest.fixture +def check_user_prompt_closed_with_exception(session, create_dialog): + def check_user_prompt_closed_with_exception(dialog_type, retval): + session.url = inline("<input/>") + element = session.find.css("input", all=False) + + create_dialog(dialog_type, text=dialog_type) + + response = take_element_screenshot(session, element.id) + assert_error(response, "unexpected alert open") + + assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) + + return check_user_prompt_closed_with_exception + + +@pytest.fixture +def check_user_prompt_not_closed_but_exception(session, create_dialog): + def check_user_prompt_not_closed_but_exception(dialog_type): + session.url = inline("<input/>") + element = session.find.css("input", all=False) + + create_dialog(dialog_type, text=dialog_type) + + response = take_element_screenshot(session, element.id) + assert_error(response, "unexpected alert open") + assert session.alert.text == dialog_type session.alert.dismiss() - return check_user_prompt_not_closed_without_exception + return check_user_prompt_not_closed_but_exception @pytest.mark.capabilities({"unhandledPromptBehavior": "accept"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_accept(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", True), + ("prompt", ""), +]) +def test_accept(check_user_prompt_closed_without_exception, dialog_type, retval): + check_user_prompt_closed_without_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_accept_and_notify(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", True), + ("prompt", ""), +]) +def test_accept_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval): + check_user_prompt_closed_with_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_dismiss(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", False), + ("prompt", None), +]) +def test_dismiss(check_user_prompt_closed_without_exception, dialog_type, retval): + check_user_prompt_closed_without_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_dismiss_and_notify(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", False), + ("prompt", None), +]) +def test_dismiss_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval): + check_user_prompt_closed_with_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"}) @pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_ignore(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +def test_ignore(check_user_prompt_not_closed_but_exception, dialog_type): + check_user_prompt_not_closed_but_exception(dialog_type) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_default(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", False), + ("prompt", None), +]) +def test_default(check_user_prompt_closed_with_exception, dialog_type, retval): + check_user_prompt_closed_with_exception(dialog_type, retval)
--- a/testing/web-platform/tests/webdriver/tests/take_screenshot/user_prompts.py +++ b/testing/web-platform/tests/webdriver/tests/take_screenshot/user_prompts.py @@ -1,64 +1,114 @@ # META: timeout=long import pytest -from tests.support.asserts import assert_png, assert_success +from tests.support.asserts import assert_dialog_handled, assert_error, assert_png, assert_success from tests.support.inline import inline def take_screenshot(session): return session.transport.send( "GET", "session/{session_id}/screenshot".format(**vars(session))) @pytest.fixture -def check_user_prompt_not_closed_without_exception(session, create_dialog): - def check_user_prompt_not_closed_without_exception(dialog_type): +def check_user_prompt_closed_without_exception(session, create_dialog): + def check_user_prompt_closed_without_exception(dialog_type, retval): session.url = inline("<input/>") create_dialog(dialog_type, text=dialog_type) response = take_screenshot(session) value = assert_success(response) + assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) + assert_png(value) + return check_user_prompt_closed_without_exception + + +@pytest.fixture +def check_user_prompt_closed_with_exception(session, create_dialog): + def check_user_prompt_closed_with_exception(dialog_type, retval): + session.url = inline("<input/>") + + create_dialog(dialog_type, text=dialog_type) + + response = take_screenshot(session) + assert_error(response, "unexpected alert open") + + assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) + + return check_user_prompt_closed_with_exception + + +@pytest.fixture +def check_user_prompt_not_closed_but_exception(session, create_dialog): + def check_user_prompt_not_closed_but_exception(dialog_type): + session.url = inline("<input/>") + + create_dialog(dialog_type, text=dialog_type) + + response = take_screenshot(session) + assert_error(response, "unexpected alert open") + assert session.alert.text == dialog_type session.alert.dismiss() - return check_user_prompt_not_closed_without_exception + return check_user_prompt_not_closed_but_exception @pytest.mark.capabilities({"unhandledPromptBehavior": "accept"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_accept(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", True), + ("prompt", ""), +]) +def test_accept(check_user_prompt_closed_without_exception, dialog_type, retval): + check_user_prompt_closed_without_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_accept_and_notify(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", True), + ("prompt", ""), +]) +def test_accept_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval): + check_user_prompt_closed_with_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_dismiss(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", False), + ("prompt", None), +]) +def test_dismiss(check_user_prompt_closed_without_exception, dialog_type, retval): + check_user_prompt_closed_without_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"}) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_dismiss_and_notify(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", False), + ("prompt", None), +]) +def test_dismiss_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval): + check_user_prompt_closed_with_exception(dialog_type, retval) @pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"}) @pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_ignore(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +def test_ignore(check_user_prompt_not_closed_but_exception, dialog_type): + check_user_prompt_not_closed_but_exception(dialog_type) -@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) -def test_default(check_user_prompt_not_closed_without_exception, dialog_type): - check_user_prompt_not_closed_without_exception(dialog_type) +@pytest.mark.parametrize("dialog_type, retval", [ + ("alert", None), + ("confirm", False), + ("prompt", None), +]) +def test_default(check_user_prompt_closed_with_exception, dialog_type, retval): + check_user_prompt_closed_with_exception(dialog_type, retval)
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/webrtc-identity/idlharness.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +idl_test( + ['webrtc-identity'], + ['webrtc', 'mediacapture-streams', 'html', 'dom'], + async idlArray => { + idlArray.add_objects({ + RTCPeerConnection: [`new RTCPeerConnection()`], + RTCIdentityAssertion: [`new RTCIdentityAssertion('idp', 'name')`], + MediaStreamTrack: ['track'], + // TODO: RTCIdentityProviderGlobalScope + // TODO: RTCIdentityProviderRegistrar + }); + + try { + self.track = await navigator.mediaDevices + .getUserMedia({audio: true}) + .then(m => m.getTracks()[0]); + } catch (e) {} + } +);
--- a/testing/web-platform/tests/webxr/resources/webxr_test_asserts.js +++ b/testing/web-platform/tests/webxr/resources/webxr_test_asserts.js @@ -25,16 +25,41 @@ let assert_point_approx_equals = functio let error_message = prefix + ' Point comparison failed.\n'; error_message += ` p1: {x: ${p1.x}, y: ${p1.y}, z: ${p1.z}, w: ${p1.w}}\n`; error_message += ` p2: {x: ${p2.x}, y: ${p2.y}, z: ${p2.z}, w: ${p2.w}}\n`; error_message += ` Difference in component ${mismatched_component} exceeded the given epsilon.\n`; assert_approx_equals(p2[mismatched_component], p1[mismatched_component], epsilon, error_message); } }; +// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers +// |epsilon| - float specifying precision +// |prefix| - string used as a prefix for logging +let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") { + + assert_not_equals(p1, null, prefix + "p1 must be non-null"); + assert_not_equals(p2, null, prefix + "p2 must be non-null"); + + let mismatched_component = null; + for (const v of ['x', 'y', 'z', 'w']) { + if (Math.abs(p1[v] - p2[v]) > epsilon) { + mismatched_component = v; + break; + } + } + + if (mismatched_component === null) { + let error_message = prefix + ' Point comparison failed.\n'; + error_message += ` p1: {x: ${p1.x}, y: ${p1.y}, z: ${p1.z}, w: ${p1.w}}\n`; + error_message += ` p2: {x: ${p2.x}, y: ${p2.y}, z: ${p2.z}, w: ${p2.w}}\n`; + error_message += ` Difference in components did not exceeded the given epsilon.\n`; + assert_unreached(error_message); + } +}; + // |m1|, |m2| - arrays of floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") { if (m1 == null && m2 == null) { return; }
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/webxr/xrDevice_isSessionSupported_immersive.https.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src="resources/webxr_util.js"></script> + <script src="resources/webxr_test_constants.js"></script> + <script> + xr_promise_test( + "isSessionSupported resolves to true when immersive options supported", + (t) => { + return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE) + .then( (controller) => { + return navigator.xr.isSessionSupported('immersive-vr').then((supported) => { + t.step(() => { + assert_true(supported); + }); + }); + }); + }); + </script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/webxr/xrDevice_isSessionSupported_immersive_unsupported.https.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src="resources/webxr_util.js"></script> + <script src="resources/webxr_test_constants.js"></script> + <script> + xr_promise_test( + "isSessionSupported resolves to false when options not supported", + (t) => { + return navigator.xr.test.simulateDeviceConnection(VALID_NON_IMMERSIVE_DEVICE) + .then( (controller) => { + return navigator.xr.isSessionSupported('immersive-vr').then((supported) => { + t.step(() => { + assert_false(supported); + }); + }); + }); + }); + </script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/webxr/xrDevice_isSessionSupported_inline.https.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src="resources/webxr_util.js"></script> + <script src="resources/webxr_test_constants.js"></script> + <script> + xr_promise_test( + "isSessionSupported resolves to true when inline options supported", + (t) => { + return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE) + .then( (controller) => { + // Inline sessions should be supported. + return navigator.xr.isSessionSupported('inline').then((supported) => { + t.step(() => { + assert_true(supported); + }); + }); + }); + }); + </script> +</body>
new file mode 100644 --- /dev/null +++ b/testing/web-platform/tests/webxr/xrReferenceSpace_originOffset_viewer.https.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<script src="resources/webxr_test_asserts.js"></script> +<canvas id="webgl-canvas"></canvas> + +<script> +let testName = "Creating XRReferenceSpace origin offset off of `viewer` space works."; + +let fakeDeviceInitParams = { + supportsImmersive: true, + viewerOrigin: VALID_POSE_TRANSFORM, + views: VALID_VIEWS, + supportedFeatures: ALL_FEATURES +}; + +let originOffsetPosition = new DOMPointReadOnly(0, 0, 1); + +let testFunction = + (session, fakeDeviceController, t) => new Promise((resolve) => { + + session.requestReferenceSpace('local').then( (localSpace) => { + session.requestReferenceSpace('viewer').then( (viewerSpace) => { + + let offsetSpace = viewerSpace.getOffsetReferenceSpace( + new XRRigidTransform(originOffsetPosition)); + + function OnFrame(time, frame) { + let viewerPose = frame.getPose(viewerSpace, localSpace); + let offsetPose = frame.getPose(offsetSpace, localSpace); + + let viewerPose2 = frame.getPose(localSpace ,viewerSpace); + let offsetPose2 = frame.getPose(localSpace, offsetSpace); + + t.step(() => { + assert_point_significantly_not_equals(viewerPose.transform.position, offsetPose.transform.position); + assert_point_significantly_not_equals(viewerPose2.transform.position, offsetPose2.transform.position); + }); + + resolve(); + } + + // Can only request input poses in an xr frame. + session.requestAnimationFrame(OnFrame); + }); + }); + }); + +xr_session_promise_test( + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); + +</script>