diff options
author | WPT Sync Bot <josh+wptsync@joshmatthews.net> | 2019-10-06 10:58:10 +0000 |
---|---|---|
committer | WPT Sync Bot <josh+wptsync@joshmatthews.net> | 2019-10-06 14:35:02 +0000 |
commit | 393fa37c0ba9fa9c134e56cb54601d17534dd34f (patch) | |
tree | 06efe7399bd6596b37f956f209dd45dc61370d84 | |
parent | 1318ea9d0245b7a768d61be6727122cf93b3a834 (diff) | |
download | servo-393fa37c0ba9fa9c134e56cb54601d17534dd34f.tar.gz servo-393fa37c0ba9fa9c134e56cb54601d17534dd34f.zip |
Update web-platform-tests to revision daac9dc806e9571ea856253fcc35a94e73d4f711
67 files changed, 1485 insertions, 146 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index a9e46713244..76b398963ae 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -7,7 +7,7 @@ expected: FAIL [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Opening a blob URL in a noopener about:blank window immediately before revoking it works.] expected: FAIL diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini index 947e223fb28..3a3d15b8406 100644 --- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini @@ -14,6 +14,9 @@ [Revoke blob URL after creating Request, will fetch] expected: FAIL + [Revoke blob URL after calling fetch, fetch should succeed] + expected: FAIL + [url-with-fetch.any.html] [Untitled] @@ -34,3 +37,6 @@ [Revoke blob URL after creating Request, will fetch] expected: FAIL + [Revoke blob URL after calling fetch, fetch should succeed] + expected: FAIL + diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 30fa6ef6cc5..39d79ea92bf 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -48803,6 +48803,18 @@ {} ] ], + "css/CSS2/floats/adjoining-floats-dynamic.html": [ + [ + "css/CSS2/floats/adjoining-floats-dynamic.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/CSS2/floats/float-no-content-beside-001.html": [ [ "css/CSS2/floats/float-no-content-beside-001.html", @@ -95263,6 +95275,30 @@ {} ] ], + "css/CSS2/text/bidi-span-001.html": [ + [ + "css/CSS2/text/bidi-span-001.html", + [ + [ + "/css/CSS2/text/bidi-span-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/text/bidi-span-002.html": [ + [ + "css/CSS2/text/bidi-span-002.html", + [ + [ + "/css/CSS2/text/bidi-span-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/CSS2/text/letter-spacing-004.xht": [ [ "css/CSS2/text/letter-spacing-004.xht", @@ -134173,6 +134209,18 @@ {} ] ], + "css/css-multicol/multicol-span-all-children-height-008.html": [ + [ + "css/css-multicol/multicol-span-all-children-height-008.html", + [ + [ + "/css/css-multicol/multicol-span-all-children-height-008-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-multicol/multicol-span-all-dynamic-add-001.html": [ [ "css/css-multicol/multicol-span-all-dynamic-add-001.html", @@ -135169,6 +135217,18 @@ {} ] ], + "css/css-overflow/float-with-relpos-and-transform.html": [ + [ + "css/css-overflow/float-with-relpos-and-transform.html", + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "css/css-overflow/input-scrollable-region-001.html": [ [ "css/css-overflow/input-scrollable-region-001.html", @@ -135805,6 +135865,18 @@ {} ] ], + "css/css-paint-api/geometry-border-image-005.https.html": [ + [ + "css/css-paint-api/geometry-border-image-005.https.html", + [ + [ + "/css/css-paint-api/geometry-border-image-005-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-paint-api/geometry-with-float-size.https.html": [ [ "css/css-paint-api/geometry-with-float-size.https.html", @@ -239595,6 +239667,12 @@ "css/CSS2/tables/table-vertical-align-baseline-001-ref.xht": [ [] ], + "css/CSS2/text/bidi-span-001-ref.html": [ + [] + ], + "css/CSS2/text/bidi-span-002-ref.html": [ + [] + ], "css/CSS2/text/letter-spacing-004-ref.xht": [ [] ], @@ -251436,6 +251514,9 @@ "css/css-multicol/multicol-span-all-children-height-007-ref.html": [ [] ], + "css/css-multicol/multicol-span-all-children-height-008-ref.html": [ + [] + ], "css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [ [] ], @@ -251991,6 +252072,9 @@ "css/css-paint-api/geometry-border-image-004-ref.html": [ [] ], + "css/css-paint-api/geometry-border-image-005-ref.html": [ + [] + ], "css/css-paint-api/geometry-with-float-size-ref.html": [ [] ], @@ -280056,6 +280140,9 @@ "service-workers/service-worker/resources/fetch-csp-iframe.html.sub.headers": [ [] ], + "service-workers/service-worker/resources/fetch-event-add-async-worker.js": [ + [] + ], "service-workers/service-worker/resources/fetch-event-after-navigation-within-page-iframe.html": [ [] ], @@ -292772,6 +292859,12 @@ {} ] ], + "2dcontext/imagebitmap/createImageBitmap-serializable.html": [ + [ + "2dcontext/imagebitmap/createImageBitmap-serializable.html", + {} + ] + ], "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [ [ "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html", @@ -308579,6 +308672,12 @@ } ] ], + "compat/webkit-box-removing-triggering-anonymous-merge.html": [ + [ + "compat/webkit-box-removing-triggering-anonymous-merge.html", + {} + ] + ], "compat/webkit-gradient-comma.html": [ [ "compat/webkit-gradient-comma.html", @@ -319597,6 +319696,12 @@ {} ] ], + "css/css-masking/animations/clip-interpolation.html": [ + [ + "css/css-masking/animations/clip-interpolation.html", + {} + ] + ], "css/css-masking/animations/clip-path-interpolation.html": [ [ "css/css-masking/animations/clip-path-interpolation.html", @@ -319699,6 +319804,12 @@ {} ] ], + "css/css-masking/parsing/mask-invalid.html": [ + [ + "css/css-masking/parsing/mask-invalid.html", + {} + ] + ], "css/css-masking/parsing/mask-position-invalid.html": [ [ "css/css-masking/parsing/mask-position-invalid.html", @@ -319729,6 +319840,12 @@ {} ] ], + "css/css-masking/parsing/mask-valid.sub.html": [ + [ + "css/css-masking/parsing/mask-valid.sub.html", + {} + ] + ], "css/css-multicol/abspos-in-multicol-with-spanner-crash.html": [ [ "css/css-multicol/abspos-in-multicol-with-spanner-crash.html", @@ -367623,6 +367740,12 @@ {} ] ], + "mediacapture-record/MediaRecorder-bitrate.https.html": [ + [ + "mediacapture-record/MediaRecorder-bitrate.https.html", + {} + ] + ], "mediacapture-record/MediaRecorder-creation.https.html": [ [ "mediacapture-record/MediaRecorder-creation.https.html", @@ -367659,6 +367782,12 @@ {} ] ], + "mediacapture-record/MediaRecorder-mimetype.html": [ + [ + "mediacapture-record/MediaRecorder-mimetype.html", + {} + ] + ], "mediacapture-record/MediaRecorder-pause-resume.html": [ [ "mediacapture-record/MediaRecorder-pause-resume.html", @@ -397429,6 +397558,12 @@ {} ] ], + "service-workers/service-worker/fetch-event-add-async.https.html": [ + [ + "service-workers/service-worker/fetch-event-add-async.https.html", + {} + ] + ], "service-workers/service-worker/fetch-event-after-navigation-within-page.https.html": [ [ "service-workers/service-worker/fetch-event-after-navigation-within-page.https.html", @@ -412852,6 +412987,24 @@ } ] ], + "webaudio/the-audio-api/processing-model/cycle-witout-delay.html": [ + [ + "webaudio/the-audio-api/processing-model/cycle-witout-delay.html", + {} + ] + ], + "webaudio/the-audio-api/processing-model/delay-time-clamping.html": [ + [ + "webaudio/the-audio-api/processing-model/delay-time-clamping.html", + {} + ] + ], + "webaudio/the-audio-api/processing-model/feedback-delay-time.html": [ + [ + "webaudio/the-audio-api/processing-model/feedback-delay-time.html", + {} + ] + ], "webaudio/the-audio-api/the-analysernode-interface/ctor-analyser.html": [ [ "webaudio/the-audio-api/the-analysernode-interface/ctor-analyser.html", @@ -446890,7 +447043,7 @@ "support" ], ".taskcluster.yml": [ - "b23cc93e633021686192b5cc1acbb7d8b6b3fe96", + "adb81d6c0271ac5d8061782eac1b3e181984eb68", "support" ], ".well-known/README.md": [ @@ -449393,6 +449546,10 @@ "9f19f6ae66b58f93c23ba8aeb095838d9a6cc5c9", "testharness" ], + "2dcontext/imagebitmap/createImageBitmap-serializable.html": [ + "44e7a40351080d47675edb426f78cec4fa795920", + "testharness" + ], "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [ "f58825cc371f04bf186ba23fa869391f3d2d3f6c", "testharness" @@ -458602,7 +458759,7 @@ "support" ], "common/security-features/resources/common.sub.js": [ - "12776b1a4b55dc76415ea63abc4a93dab2fedd2a", + "c974e83b9604d5770ffb849a1b77f963d3f7955b", "support" ], "common/security-features/resources/common.sub.js.headers": [ @@ -458825,6 +458982,10 @@ "06e728342cdb63a72b420423b40b6e32ae3e2162", "reftest" ], + "compat/webkit-box-removing-triggering-anonymous-merge.html": [ + "8506425548b6ff97491e388dc1a1f3830aa790fc", + "testharness" + ], "compat/webkit-gradient-comma.html": [ "b288a9a43fe8eba26a4ef37bd5439cbe75047885", "testharness" @@ -476510,7 +476671,7 @@ "testharness" ], "contacts/contacts-select.https.window.js": [ - "8d1fdfbfdff539e7dd17da4b0e28ef01ae47a2d5", + "5503ea6968a8d2bd89e49a67bf0def695738d68d", "testharness" ], "contacts/resources/helpers.js": [ @@ -501105,6 +501266,10 @@ "59843ae54b64f6ce4f7e616d4be491c911ea84cf", "support" ], + "css/CSS2/floats/adjoining-floats-dynamic.html": [ + "3446d972d72ec8832ab8ac320a84dff609676ae3", + "reftest" + ], "css/CSS2/floats/computed-float-position-absolute.html": [ "ad9220b3a06085c458f7100c896100fb32f562e8", "testharness" @@ -531953,6 +532118,22 @@ "ad267c450014629fbd309ed6825d94379d2fe882", "visual" ], + "css/CSS2/text/bidi-span-001-ref.html": [ + "594847b128522adae1b7b49dbe739b00012feb9b", + "support" + ], + "css/CSS2/text/bidi-span-001.html": [ + "b645a2b548c46b064b1a5f3012240a3947c772b9", + "reftest" + ], + "css/CSS2/text/bidi-span-002-ref.html": [ + "6cc72c208a994a9e6ee99aac23689d3567e3a465", + "support" + ], + "css/CSS2/text/bidi-span-002.html": [ + "d4fc6de070d23ebe8817e9a299c44e48cad256a9", + "reftest" + ], "css/CSS2/text/bidi-text-decoration-underline-001.xht": [ "e3efb521f2208113ad3278a261348bc5997240f5", "visual" @@ -568461,6 +568642,10 @@ "7f92755b092845d3d550568e0572453801451f3d", "support" ], + "css/css-masking/animations/clip-interpolation.html": [ + "322ebd724e8524e85d8afe369b6bafaabbec8c79", + "testharness" + ], "css/css-masking/animations/clip-path-interpolation.html": [ "21c34f1f2b75ec7345a97b00db62a49b038cf026", "testharness" @@ -569481,6 +569666,10 @@ "d60802b897fedab122fb4661f312bd5358785570", "testharness" ], + "css/css-masking/parsing/mask-invalid.html": [ + "367049cf19ffc2390316470dec3d789fbbee36a8", + "testharness" + ], "css/css-masking/parsing/mask-position-invalid.html": [ "c246a1e795eea6a9e31fe1155d55ceb8532d6032", "testharness" @@ -569501,6 +569690,10 @@ "31a528381af7d0bb3b4d1a30e1b3f20a0f2787ce", "testharness" ], + "css/css-masking/parsing/mask-valid.sub.html": [ + "63aed3e33c46bdbf2c1bf8c8b8758daff7ab0bee", + "testharness" + ], "css/css-masking/test-mask-ref.html": [ "938235acbd36309fb969c55f161239bcd5ab969e", "support" @@ -570638,11 +570831,11 @@ "reftest" ], "css/css-multicol/multicol-span-all-children-height-006-ref.html": [ - "85dfa522c7de9152020342ddb67484b7f1e6977b", + "261ff480c38c70e5bf99b9886919088647fbef9e", "support" ], "css/css-multicol/multicol-span-all-children-height-006.html": [ - "479fb2d0ced056f24b39126fa29574a6a811f8e6", + "5c1e634c2b2c25684eb55d58a5e4c8b7ca9de7ae", "reftest" ], "css/css-multicol/multicol-span-all-children-height-007-ref.html": [ @@ -570653,6 +570846,14 @@ "80f34b45ded8af29c0600a6fa78584cb22b342fc", "reftest" ], + "css/css-multicol/multicol-span-all-children-height-008-ref.html": [ + "80d783283fb7a6b02bac081cf9fcfe0017e9550b", + "support" + ], + "css/css-multicol/multicol-span-all-children-height-008.html": [ + "0d7bd183841d5d4e55380d157461c9a8b9378a62", + "reftest" + ], "css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [ "9f76ea15a0daa7753e76ad9b9a99948988c702d3", "support" @@ -571501,6 +571702,10 @@ "b9ba7acd150e5022de5c5208cd7f5f7d4dde93c3", "support" ], + "css/css-overflow/float-with-relpos-and-transform.html": [ + "6024b7261750e0c5dc4a681dccee2ab72b83abca", + "reftest" + ], "css/css-overflow/inheritance.html": [ "976406be413b9bdc8cef4acab0a0cd29df2dd43d", "testharness" @@ -572253,6 +572458,14 @@ "0f483cd5d19acf4923e60a9f59f55b2bd1e2d0d0", "reftest" ], + "css/css-paint-api/geometry-border-image-005-ref.html": [ + "16d230411349ff25e2064fdc2eadd8992769dfa7", + "support" + ], + "css/css-paint-api/geometry-border-image-005.https.html": [ + "efdd7fdf1b9673657b8a60bfa5851ff694489d87", + "reftest" + ], "css/css-paint-api/geometry-with-float-size-ref.html": [ "c24a9d7bc0d9dd251186faec68d5bacb15db8c77", "support" @@ -573018,7 +573231,7 @@ "testharness" ], "css/css-position/position-absolute-replaced-minmax.html": [ - "a5c0d516472b9a2a1be4d391f38cac412e6aa7d1", + "00780d650fae639b37f4e82eabcd77794eb1aae2", "testharness" ], "css/css-position/position-fixed-at-bottom-right-on-viewport.html": [ @@ -620310,7 +620523,7 @@ "support" ], "docs/running-tests/webkitgtk_minibrowser.md": [ - "b12859bcca9e6e90998735c97932c42d60aecba4", + "7aac81e5fce660db84969f9c0a7cae429a257207", "support" ], "docs/test-suite-design.md": [ @@ -633606,7 +633819,7 @@ "testharness" ], "html/dom/idlharness.https.html": [ - "0d3f1160d2819601afb2168bc15bfeeaddfed6f1", + "33ad5c6f6169a7e376aaadeba1b8df4dd6815f7c", "testharness" ], "html/dom/idlharness.worker.js": [ @@ -650642,7 +650855,7 @@ "support" ], "interfaces/feature-policy.idl": [ - "85601321a17f3d0a46d2246642d59ef44d916398", + "6f0d69fc378d91a1ededf21b273216061099c278", "support" ], "interfaces/fetch.idl": [ @@ -650998,7 +651211,7 @@ "support" ], "interfaces/webrtc-stats.idl": [ - "e41d7357b1a20328cd543c118005f2d9f77f0773", + "2b823047ff1e37a13e9d2e71711360944019fcb5", "support" ], "interfaces/webrtc.idl": [ @@ -652178,11 +652391,11 @@ "reftest" ], "mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html": [ - "f0b5bdd9f04e795400f2741b47ebb82d0d3a61cb", + "c67ac03f5dcc90d24b15ae89c269c99bb75e2c48", "support" ], "mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html": [ - "d7f0627059ad9e400480d574b5e83cff9113b107", + "9b71389e74dd1125135aa69fc3c8a47122d7a4a8", "reftest" ], "mathml/presentation-markup/mrow/inferred-mrow-baseline.html": [ @@ -652998,7 +653211,7 @@ "reftest" ], "mathml/relations/html5-tree/tabindex-001.html": [ - "aaf82f77caa87cadd4dfa4706a2bc15192006a6a", + "8f8536881416584656277eeaaed4604b7f6def4d", "testharness" ], "mathml/relations/html5-tree/tabindex-002.html": [ @@ -653937,8 +654150,12 @@ "d59e5e30845eaef12bab6419e348a01779313c56", "support" ], + "mediacapture-record/MediaRecorder-bitrate.https.html": [ + "472c0661cb7b5981b2de671458e2da3592516d0c", + "testharness" + ], "mediacapture-record/MediaRecorder-creation.https.html": [ - "419211c9dcf63241b63cd11d671a0800b3998d83", + "b724ca14503a87ab06eb5e12c469fccd3dd3fde9", "testharness" ], "mediacapture-record/MediaRecorder-destroy-script-execution.html": [ @@ -653958,11 +654175,15 @@ "testharness" ], "mediacapture-record/MediaRecorder-events-and-exceptions.html": [ - "58b9c08ecab0ff8872748f5215743379876ea5ef", + "cddc07e5079481e0ac7b44d1c223d88bea9e64fe", + "testharness" + ], + "mediacapture-record/MediaRecorder-mimetype.html": [ + "ddc56e9cb750c59753e238c8ec39c6e1f128790b", "testharness" ], "mediacapture-record/MediaRecorder-pause-resume.html": [ - "39a8883664550af1a48ae965d4789a0d6df97d28", + "33dfd8560c04d9e9de335b13cfcb33428a6b7e24", "testharness" ], "mediacapture-record/MediaRecorder-stop.html": [ @@ -653970,7 +654191,7 @@ "testharness" ], "mediacapture-record/idlharness.window.js": [ - "86f5a158822156b54e776639fb9c7504f0ff7498", + "2e304b0a0e6ece247614c5c692ef0e368f5ad216", "testharness" ], "mediacapture-record/support/MediaRecorder-iframe.html": [ @@ -677394,7 +677615,7 @@ "support" ], "resources/chromium/webxr-test.js": [ - "df91abf6d7f2c2cb10dfd5798f27a7d96a6ad339", + "94031657b4b6d2698739eddf0bd4028e0aa8fdea", "support" ], "resources/chromium/webxr-test.js.headers": [ @@ -679513,6 +679734,10 @@ "4f176220d6100c4efb1bfda817b84cf5f53a4f3d", "testharness" ], + "service-workers/service-worker/fetch-event-add-async.https.html": [ + "ac13e4f41675c22669862751b9209835d7210231", + "testharness" + ], "service-workers/service-worker/fetch-event-after-navigation-within-page.https.html": [ "4812d8a91551edae84b5e2805804fc9d8899f3e9", "testharness" @@ -679678,7 +679903,7 @@ "testharness" ], "service-workers/service-worker/global-serviceworker.https.any.js": [ - "489b37f83e1c21809e9b0b63d0f0e59db23d197c", + "2335f635b2e6ad50b2d1bf4117eb08b19d3ac3b1", "testharness" ], "service-workers/service-worker/http-to-https-redirect-and-register.https.html": [ @@ -680349,6 +680574,10 @@ "300efe049b5de8810f7c44863e11c280ca2926f3", "support" ], + "service-workers/service-worker/resources/fetch-event-add-async-worker.js": [ + "a5a44a57c99cb3a289f0015168609852729d50a5", + "support" + ], "service-workers/service-worker/resources/fetch-event-after-navigation-within-page-iframe.html": [ "bf8a6d5ce51facdd65f30ce5750417c7fcf2ef02", "support" @@ -688198,7 +688427,7 @@ "support" ], "tools/ci/run_tc.py": [ - "b2826bf075e9b1e82ee3d021003134930231f556", + "3201ff3a9d309719da2fe038c73d1b144ffdb5d2", "support" ], "tools/ci/taskcluster-run.py": [ @@ -688234,11 +688463,11 @@ "support" ], "tools/docker/Dockerfile.webkitgtk": [ - "8d792b36a473059c41d9e68789bab7ba8a7c2855", + "58080def60ff4f26277c96015a8c2968254907f3", "support" ], "tools/docker/README.md": [ - "c444e4a957fd0ba55e0d51a0e87b9562550e0add", + "6bcc47c7744e4cc8be96b1c9590878955080da27", "support" ], "tools/docker/__init__.py": [ @@ -693310,7 +693539,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/base.py": [ - "08b5880a1b7e903fb2ca937d7f3aef43fc44b2f6", + "d17229da4686548e05c228a7345194e0d8f4d8dd", "support" ], "tools/wptrunner/wptrunner/browsers/chrome.py": [ @@ -693338,11 +693567,11 @@ "support" ], "tools/wptrunner/wptrunner/browsers/epiphany.py": [ - "599ec9f3110f89f5d64effe98130ede930f1fb7c", + "37e2f21421ae54e0c2a6b11cb0763d65b5f3ea72", "support" ], "tools/wptrunner/wptrunner/browsers/firefox.py": [ - "290fcff5ab22bd5ca19cedb4d3f38f5b8197768f", + "1763ff44b4e55c14c8f5d753defb3ba39e017262", "support" ], "tools/wptrunner/wptrunner/browsers/firefox_android.py": [ @@ -693386,7 +693615,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py": [ - "65f78125ad7a89d43c08b6986bf41145cc71d04c", + "3c4947335bf32fd64c5c539dc08b851106c2f254", "support" ], "tools/wptrunner/wptrunner/config.py": [ @@ -697405,6 +697634,18 @@ "2778493e3b6c12d4c00c77bd975e845063621522", "support" ], + "webaudio/the-audio-api/processing-model/cycle-witout-delay.html": [ + "ed26ad2ced2c226d3388f1941653f921f6d93656", + "testharness" + ], + "webaudio/the-audio-api/processing-model/delay-time-clamping.html": [ + "3f8ed24429a7c4532610c7a42e366dc3aff0c7d6", + "testharness" + ], + "webaudio/the-audio-api/processing-model/feedback-delay-time.html": [ + "50c8e455b908af3bcb42b4fcfda157d54b9f9abe", + "testharness" + ], "webaudio/the-audio-api/the-analysernode-interface/.gitkeep": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "support" diff --git a/tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini b/tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini new file mode 100644 index 00000000000..5496474410b --- /dev/null +++ b/tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini @@ -0,0 +1,2 @@ +[mix-blend-mode-animation.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/animation/perspective-interpolation.html.ini b/tests/wpt/metadata/css/css-transforms/animation/perspective-interpolation.html.ini index 03f2f3fe9d1..c511d92d674 100644 --- a/tests/wpt/metadata/css/css-transforms/animation/perspective-interpolation.html.ini +++ b/tests/wpt/metadata/css/css-transforms/animation/perspective-interpolation.html.ini @@ -1,5 +1,4 @@ [perspective-interpolation.html] - expected: CRASH [ perspective interpolation] expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_txt.html.ini b/tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_txt.html.ini deleted file mode 100644 index c3916f8555d..00000000000 --- a/tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_txt.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[contenttype_txt.html] - expected: CRASH diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index 9aa8d1390da..6960c088389 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -312,15 +312,9 @@ [<iframe>: separate response Content-Type: */* text/html] expected: FAIL - [<iframe>: combined response Content-Type: text/html */*] + [<iframe>: separate response Content-Type: text/html;" text/plain] expected: FAIL - [<iframe>: separate response Content-Type: text/html */*;charset=gbk] - expected: FAIL - - [<iframe>: separate response Content-Type: text/html;" \\" text/plain] - expected: FAIL - - [<iframe>: combined response Content-Type: text/html */*;charset=gbk] + [<iframe>: combined response Content-Type: text/html;x=" text/plain] expected: FAIL diff --git a/tests/wpt/metadata/fetch/content-type/script.window.js.ini b/tests/wpt/metadata/fetch/content-type/script.window.js.ini index c7413d589dc..c0374f76e40 100644 --- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini @@ -56,9 +56,9 @@ [separate text/javascript x/x] expected: FAIL - [separate text/javascript;charset=windows-1252 error text/javascript] + [separate text/javascript error] expected: FAIL - [separate text/javascript;charset=windows-1252 text/javascript] + [separate text/javascript ] expected: FAIL diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini index b2cd43ef76c..536384f36e1 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,9 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%0C] expected: FAIL - [X-Content-Type-Options%3A%20'NosniFF'] - expected: FAIL - - [X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff] + [X-Content-Type-Options%3A%20%2Cnosniff] expected: FAIL diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index 76078aa9780..a9257cabc65 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -764,9 +764,6 @@ [OffscreenCanvasRenderingContext2D interface: attribute miterLimit] expected: FAIL - [MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type] - expected: FAIL - [Path2D interface: existence and properties of interface prototype object's @@unscopables property] expected: FAIL @@ -1585,9 +1582,6 @@ [Window interface: operation prompt(DOMString, DOMString)] expected: FAIL - [Window interface: window must inherit property "self" with the proper type] - expected: FAIL - [Document interface: documentWithHandlers must inherit property "dir" with the proper type] expected: FAIL @@ -1660,9 +1654,6 @@ [Window interface: window must inherit property "onauxclick" with the proper type] expected: FAIL - [Window interface: window must inherit property "parent" with the proper type] - expected: FAIL - [Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError] expected: FAIL @@ -1672,9 +1663,6 @@ [Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type] expected: FAIL - [Window interface: window must inherit property "frames" with the proper type] - expected: FAIL - [Window interface: window must inherit property "onformdata" with the proper type] expected: FAIL @@ -1747,9 +1735,6 @@ [Document interface: new Document() must inherit property "alinkColor" with the proper type] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type] - expected: FAIL - [Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index e440b1e38c6..dc856a3d5a3 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,6 +1,5 @@ [iframe_sandbox_popups_nonescaping-3.html] type: testharness - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/forms/autofocus/skip-document-with-fragment.html.ini b/tests/wpt/metadata/html/semantics/forms/autofocus/skip-document-with-fragment.html.ini index 6852d7663de..c12c0f8ae48 100644 --- a/tests/wpt/metadata/html/semantics/forms/autofocus/skip-document-with-fragment.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/autofocus/skip-document-with-fragment.html.ini @@ -1,8 +1,4 @@ [skip-document-with-fragment.html] - expected: TIMEOUT [Autofocus elements in iframed documents with URL fragments should be skipped.] expected: FAIL - [Autofocus elements in top-level browsing context's documents with URI fragments should be skipped.] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini new file mode 100644 index 00000000000..9e522297c94 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini @@ -0,0 +1,7 @@ +[toggleEvent.html] + [Calling open twice on 'details' fires only one toggle event] + expected: FAIL + + [Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element] + expected: FAIL + diff --git a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini index ec371a1bf72..8594361ff44 100644 --- a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini +++ b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini @@ -1,5 +1,5 @@ [nested-context-navigations-iframe.html] - expected: TIMEOUT + expected: CRASH [Test that iframe navigations are not observable by the parent, even after history navigations by the parent] expected: FAIL diff --git a/tests/wpt/metadata/webaudio/the-audio-api/processing-model/delay-time-clamping.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/processing-model/delay-time-clamping.html.ini new file mode 100644 index 00000000000..34175cfb5a9 --- /dev/null +++ b/tests/wpt/metadata/webaudio/the-audio-api/processing-model/delay-time-clamping.html.ini @@ -0,0 +1,4 @@ +[delay-time-clamping.html] + [Test that a DelayNode allows a feedback loop of a single rendering quantum] + expected: FAIL + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/processing-model/feedback-delay-time.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/processing-model/feedback-delay-time.html.ini new file mode 100644 index 00000000000..18a7cd2f6b4 --- /dev/null +++ b/tests/wpt/metadata/webaudio/the-audio-api/processing-model/feedback-delay-time.html.ini @@ -0,0 +1,4 @@ +[feedback-delay-time.html] + [Test that a DelayNode allows a feedback loop of a single rendering quantum] + expected: FAIL + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini index 66bd350083b..a56bad443a2 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini @@ -1,4 +1,5 @@ [realtimeanalyser-fft-scaling.html] + expected: TIMEOUT [X 2048-point FFT peak position is not equal to 64. Got 0.] expected: FAIL diff --git a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini deleted file mode 100644 index 80f9a4f15b8..00000000000 --- a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Worker-constructor.html] - expected: ERROR diff --git a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini new file mode 100644 index 00000000000..dbea4f293ad --- /dev/null +++ b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini @@ -0,0 +1,2 @@ +[transition_calc_implicit.html] + expected: TIMEOUT diff --git a/tests/wpt/web-platform-tests/.taskcluster.yml b/tests/wpt/web-platform-tests/.taskcluster.yml index b23cc93e633..adb81d6c027 100644 --- a/tests/wpt/web-platform-tests/.taskcluster.yml +++ b/tests/wpt/web-platform-tests/.taskcluster.yml @@ -12,15 +12,16 @@ tasks: $flatten: $match: { event.ref == "refs/heads/master": [{name: firefox, channel: nightly}, {name: chrome, channel: dev}], - event.ref == "refs/heads/epochs/daily": [{name: firefox, channel: stable}, {name: chrome, channel: stable}], + event.ref == "refs/heads/epochs/daily": [{name: firefox, channel: stable}, {name: chrome, channel: stable}, {name: webkitgtk_minibrowser, channel: stable}], event.ref == "refs/heads/epochs/weekly": [{name: firefox, channel: beta}, {name: chrome, channel: beta}], event.ref == "refs/heads/triggers/chrome_stable": [{name: chrome, channel: stable}], event.ref == "refs/heads/triggers/chrome_beta": [{name: chrome, channel: beta}], event.ref == "refs/heads/triggers/chrome_dev": [{name: chrome, channel: dev}], event.ref == "refs/heads/triggers/firefox_stable": [{name: firefox, channel: stable}], event.ref == "refs/heads/triggers/firefox_beta": [{name: firefox, channel: beta}], - event.ref == "refs/heads/triggers/firefox_nightly": [{name: firefox, channel: nightly}] - } + event.ref == "refs/heads/triggers/firefox_nightly": [{name: firefox, channel: nightly}], + event.ref == "refs/heads/triggers/webkitgtk_minibrowser_stable": [{name: webkitgtk_minibrowser, channel: stable}] + } each(browser): $map: - [testharness, 1, 15] @@ -70,7 +71,12 @@ tasks: owner: ${event.pusher.email} source: ${event.repository.url} payload: - image: harjgam/web-platform-tests:0.33 + image: + $if: browser.name == 'webkitgtk_minibrowser' + then: + cl0p3z/web-platform-tests:0.1 + else: + harjgam/web-platform-tests:0.33 maxRunTime: 7200 artifacts: public/results: diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-serializable.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-serializable.html new file mode 100644 index 00000000000..44e7a403510 --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-serializable.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>createImageBitmap serialize test</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/namespaces.js"></script> +<script src="common.sub.js"></script> +<div id=log></div> +<script> +let worker, continuations = {}; +setup(function() { + worker = new Worker("transfer-worker.js"); + worker.addEventListener("message", function(event) { + let { name, bitmap } = event.data; + if (continuations.hasOwnProperty(name)) { + continuations[name](bitmap); + } + }); +}); + +for (let { name, factory } of imageSourceTypes) { + promise_test(function(t) { + return factory().then(createImageBitmap).then(function(bitmap) { + assert_equals(bitmap.width, 20); + assert_equals(bitmap.height, 20); + + worker.postMessage({ name: t.name, bitmap: bitmap }); + + assert_equals(bitmap.width, 20); + assert_equals(bitmap.height, 20); + + return new Promise(function(resolve) { + continuations[t.name] = resolve; + }); + }).then(function(bitmap) { + assert_class_string(bitmap, "ImageBitmap"); + assert_equals(bitmap.width, 20); + assert_equals(bitmap.height, 20); + }); + }, `Serialize ImageBitmap created from ${name}`); +} +</script> diff --git a/tests/wpt/web-platform-tests/common/security-features/resources/common.sub.js b/tests/wpt/web-platform-tests/common/security-features/resources/common.sub.js index 12776b1a4b5..c974e83b960 100644 --- a/tests/wpt/web-platform-tests/common/security-features/resources/common.sub.js +++ b/tests/wpt/web-platform-tests/common/security-features/resources/common.sub.js @@ -1225,7 +1225,7 @@ function invokeFromIframe(subresource, sourceContextList) { promise = fetch(frameUrl) .then(r => r.text()) .then(t => { - frameContnent = t; + frameContent = t; iframe = createElement("iframe", {}, document.body, true); return iframe.eventPromise; }) diff --git a/tests/wpt/web-platform-tests/compat/webkit-box-removing-triggering-anonymous-merge.html b/tests/wpt/web-platform-tests/compat/webkit-box-removing-triggering-anonymous-merge.html new file mode 100644 index 00000000000..8506425548b --- /dev/null +++ b/tests/wpt/web-platform-tests/compat/webkit-box-removing-triggering-anonymous-merge.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div style="display: -webkit-box"> + <span><div></div></span> + <div id="target"></div> + text +</div> +<script> +// Force a layout before removing. +document.body.offsetTop; +document.getElementById('target').remove(); +done(); +</script> diff --git a/tests/wpt/web-platform-tests/contacts/contacts-select.https.window.js b/tests/wpt/web-platform-tests/contacts/contacts-select.https.window.js index 8d1fdfbfdff..5503ea6968a 100644 --- a/tests/wpt/web-platform-tests/contacts/contacts-select.https.window.js +++ b/tests/wpt/web-platform-tests/contacts/contacts-select.https.window.js @@ -48,6 +48,17 @@ contactsTestWithUserActivation(async (test, setSelectedContacts) => { }, 'The Contact API can fail when the selector cannot be opened'); contactsTestWithUserActivation(async (test, setSelectedContacts) => { + setSelectedContacts([]); + + const properties = await navigator.contacts.getProperties(); + assert_true(properties.length > 0); + + // Requesting the available properties should not fail. + await navigator.contacts.select(properties); + +}, 'Supported contact properties are exposed.'); + +contactsTestWithUserActivation(async (test, setSelectedContacts) => { // Returns two contacts with all information available. setSelectedContacts([ { name: ['Dwight Schrute'], email: ['dwight@schrutefarmsbnb.com'], tel: ['000-0000'] }, diff --git a/tests/wpt/web-platform-tests/css/CSS2/floats/adjoining-floats-dynamic.html b/tests/wpt/web-platform-tests/css/CSS2/floats/adjoining-floats-dynamic.html new file mode 100644 index 00000000000..3446d972d72 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/floats/adjoining-floats-dynamic.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1003558"> +<style> +#target { + height: 50px; + width: 0; + background: green; + float: right; +} + +span { + float: left; + width: 50px; + height: 50px; + background: green; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="display: flow-root; width: 100px; background: red;"> + <div id="target"></div> + <div style="position: absolute; width: 50px; height: 50px; background: green;"></div> + <div> + <div style="clear: both; height: 10px;"> + <div> + <span></span> + <span></span> + </div> + </div> + </div> +</div> +<script> +document.body.offsetTop; +document.getElementById('target').style.width = '50px'; +</script> diff --git a/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-001-ref.html b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-001-ref.html new file mode 100644 index 00000000000..594847b1285 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-001-ref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<body> + <div>אבג</div> + <div>אבג</div> + <div>אבג</div> + <div>אבג</div> + <div>אבג</div> +</body> diff --git a/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-001.html b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-001.html new file mode 100644 index 00000000000..b645a2b548c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-001.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: Inline boxes should not affect bidi reordering</title> +<link rel="match" href="bidi-span-001-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#direction"> +<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org"> +<body> + <div>א<span></span>בג</div> + <div>א<span style="background: white"></span>בג</div> + <div>א<span>ב</span>ג</div> + <div>א<span style="background: white">ב</span>ג</div> + <div>אבג</div> +</body> diff --git a/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-002-ref.html b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-002-ref.html new file mode 100644 index 00000000000..6cc72c208a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-002-ref.html @@ -0,0 +1,2 @@ +<!DOCTYPE html> +<body>()</body> diff --git a/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-002.html b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-002.html new file mode 100644 index 00000000000..d4fc6de070d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/text/bidi-span-002.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<title>CSS Test: Inline boxes should not affect bidi reordering</title> +<link rel="match" href="bidi-span-002-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#direction"> +<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org"> +<style> +body { + text-align: left; + direction: rtl; +} + +.c1:before { + content: '('; +} + +.c1:after { + content: ')'; +} + +.c2:after { + content: ''; +} +</style> +<body><span class="c1"><span class="c2"></span></span></body> diff --git a/tests/wpt/web-platform-tests/css/css-masking/animations/clip-interpolation.html b/tests/wpt/web-platform-tests/css/css-masking/animations/clip-interpolation.html new file mode 100644 index 00000000000..322ebd724e8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-masking/animations/clip-interpolation.html @@ -0,0 +1,117 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>clip interpolation</title> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#clip-property"> +<meta name="assert" content="clip supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.container { + width: 80px; + height: 80px; + background: black; + display: inline-block; + padding: 5px; +} + +.container:nth-child(2n) { + background: green; +} + +.parent { + clip: rect(100px, 0px, 100px, 0px); +} + +.target { + width: 80px; + height: 80px; + display: inline-block; + position: absolute; + background: white; + clip: rect(0px, 100px, 0px, 100px); +} +</style> + +<body> +<template id="target-template"> +<div class="container"><div class="target"></div></div> +</template> +<script> +test_interpolation({ + property: 'clip', + from: neutralKeyframe, + to: 'rect(20px, 20px, 20px, 20px)', +}, [ + {at: -1, expect: 'rect(-20px 180px -20px 180px)'}, + {at: 0, expect: 'rect(0px 100px 0px 100px)'}, + {at: 0.25, expect: 'rect(5px 80px 5px 80px)'}, + {at: 0.75, expect: 'rect(15px 40px 15px 40px)'}, + {at: 1, expect: 'rect(20px 20px 20px 20px)'}, + {at: 2, expect: 'rect(40px -60px 40px -60px)'}, +]); + +test_no_interpolation({ + property: 'clip', + from: 'initial', + to: 'rect(20px, 20px, 20px, 20px)', +}); + +test_interpolation({ + property: 'clip', + from: 'inherit', + to: 'rect(20px, 20px, 20px, 20px)', +}, [ + {at: -1, expect: 'rect(180px -20px 180px -20px)'}, + {at: 0, expect: 'rect(100px 0px 100px 0px)'}, + {at: 0.25, expect: 'rect(80px 5px 80px 5px)'}, + {at: 0.75, expect: 'rect(40px 15px 40px 15px)'}, + {at: 1, expect: 'rect(20px 20px 20px 20px)'}, + {at: 2, expect: 'rect(-60px 40px -60px 40px)'}, +]); + +test_no_interpolation({ + property: 'clip', + from: 'unset', + to: 'rect(20px, 20px, 20px, 20px)', +}); + +test_interpolation({ + property: 'clip', + from: 'rect(0px, 75px, 80px, 10px)', + to: 'rect(0px, 100px, 90px, 5px)' +}, [ + {at: -1, expect: 'rect(0px, 50px, 70px, 15px)'}, + {at: 0, expect: 'rect(0px, 75px, 80px, 10px)'}, + {at: 0.25, expect: 'rect(0px, 81.25px, 82.5px, 8.75px)'}, + {at: 0.75, expect: 'rect(0px, 93.75px, 87.5px, 6.25px)'}, + {at: 1, expect: 'rect(0px, 100px, 90px, 5px)'}, + {at: 2, expect: 'rect(0px, 125px, 100px, 0px)'}, +]); + +test_no_interpolation({ + property: 'clip', + from: 'rect(auto, auto, auto, 10px)', + to: 'rect(20px, 50px, 50px, auto)' +}); + +test_no_interpolation({ + property: 'clip', + from: 'rect(auto, 0px, auto, 10px)', + to: 'rect(auto, 50px, 50px, auto)' +}); + +test_no_interpolation({ + property: 'clip', + from: 'auto', + to: 'rect(0px, 50px, 50px, 0px)' +}); + +test_no_interpolation({ + property: 'clip', + from: 'rect(0px, 50px, 50px, 0px)', + to: 'auto' +}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/mask-invalid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/mask-invalid.html new file mode 100644 index 00000000000..367049cf19f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/mask-invalid.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Masking Module Level 1: parsing mask with invalid values</title> +<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-mask"> +<meta name="assert" content="mask supports only the '<mask-layer>#' grammar."> +<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('mask', 'none linear-gradient(to 0% 0%, rgb(0, 0, 0), rgb(0, 0, 255))'); +test_invalid_value('mask', 'none alpha luminance'); +test_invalid_value('mask', 'linear-gradient(to 0% 0%, rgb(0, 0, 0), rgb(0, 0, 255)) url("https://example.com/")'); + +test_invalid_value('mask', '1px 2px 3px'); +test_invalid_value('mask', '1px 2px 3px 4px'); +test_invalid_value('mask', '1px 2px / contain / cover'); + +test_invalid_value('mask', 'repeat-y repeat-x'); + +test_invalid_value('mask', 'stroke-box no-clip view-box'); + +test_invalid_value('mask', 'border-box view-box padding-box'); + +test_invalid_value('mask', 'no-clip border-box content-box'); + +test_invalid_value('mask', 'content-box stroke-box no-clip'); + +test_invalid_value('mask', 'add intersect'); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/mask-valid.sub.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/mask-valid.sub.html new file mode 100644 index 00000000000..63aed3e33c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/mask-valid.sub.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Masking Module Level 1: parsing mask with valid values</title> +<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-mask"> +<meta name="assert" content="mask supports the full '<mask-layer>#' grammar."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// <mask-layer> = <mask-reference> <masking-mode>? || <position> [ / <bg-size> ]? || +// <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> + +// <mask-reference> <masking-mode>? +// <mask-reference> = none | <image> | <mask-source> +// <masking-mode> = alpha | luminance | auto +test_valid_value('mask', 'none'); +test_valid_value('mask', 'none alpha'); +test_valid_value('mask', 'linear-gradient(to left bottom, red, blue)'); +test_valid_value('mask', 'linear-gradient(to left bottom, red, blue) luminance'); +test_valid_value('mask', 'url("https://{{host}}/")'); +test_valid_value('mask', 'url("https://{{host}}/") alpha'); + +// <position> [ / <bg-size> ]? +test_valid_value('mask', 'linear-gradient(to left bottom, red, blue) 1px 2px'); +test_valid_value('mask', 'url("https://{{host}}/") 1px 2px / contain'); + +// <repeat-style> = repeat-x | repeat-y | [repeat | space | round | no-repeat]{1,2} +test_valid_value('mask', 'none repeat-y'); + +// <geometry-box> = <shape-box> | fill-box | stroke-box | view-box +// <shape-box> = <box> | margin-box +// <box> = border-box | padding-box | content-box +test_valid_value('mask', 'none border-box', 'none'); +test_valid_value('mask', 'linear-gradient(to left bottom, red, blue) padding-box'); +test_valid_value('mask', 'none content-box'); +test_valid_value('mask', 'none margin-box'); +test_valid_value('mask', 'url("https://{{host}}/") fill-box'); +test_valid_value('mask', 'linear-gradient(to left bottom, red, blue) stroke-box'); +test_valid_value('mask', 'none view-box'); + +// [ <geometry-box> | no-clip ] +test_valid_value('mask', 'none no-clip', 'none border-box no-clip'); + +// <compositing-operator> = add | subtract | intersect | exclude +test_valid_value('mask', 'url("https://{{host}}/") add', 'url("https://{{host}}/")'); +test_valid_value('mask', 'none subtract'); +test_valid_value('mask', 'url("https://{{host}}/") intersect'); +test_valid_value('mask', 'linear-gradient(to left bottom, red, blue) exclude'); + + +// <mask-layer> = <mask-reference> <masking-mode>? || <position> [ / <bg-size> ]? || +// <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> +test_valid_value('mask', 'intersect no-clip space round 1px 2px / contain stroke-box linear-gradient(to left bottom, red, blue) luminance', 'linear-gradient(to left bottom, red, blue) luminance 1px 2px / contain space round stroke-box no-clip intersect'); + +test_valid_value('mask', 'intersect no-clip space round 1px 2px / contain view-box, stroke-box linear-gradient(to left bottom, red, blue) luminance', 'none 1px 2px / contain space round view-box no-clip intersect, linear-gradient(to left bottom, red, blue) luminance stroke-box'); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html index 85dfa522c7d..261ff480c38 100644 --- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html @@ -35,7 +35,7 @@ </article> <div class="column-span">column-span1</div> <article> - <div class="container" style="border-top: none; height: 50px;"> + <div class="container" style="border-top: none; height: 50px; margin-bottom: 1em;"> <div class="block">block2</div> </div> </article> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html index 479fb2d0ced..5c1e634c2b2 100644 --- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html @@ -19,6 +19,7 @@ background-color: pink; border: 20px solid purple; margin-top: 1em; + margin-bottom: 1em; } div.block { width: 100px; diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-008-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-008-ref.html new file mode 100644 index 00000000000..80d783283fb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-008-ref.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Test the borders drawing for a block split by column-span</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="https://www.mozilla.org/"> + + <style> + article { + column-count: 1; + column-fill: auto; + width: 200px; + background-color: lightgreen; + } + div.container { + height: auto; + background-color: pink; + border: 20px solid purple; + } + div.block { + width: 100px; + height: 100px; + background-color: yellow; + } + div.column-span { + width: 200px; + height: 50px; + background-color: lightblue; + } + </style> + + <article> + <div class="container" style="border-bottom: 0;"> + <div class="block">block1</div> + </div> + </article> + <div class="column-span">column-span1</div> + <article> + <div class="container" style="border-top: 0; border-bottom: 0;"> + <div class="block">block2</div> + </div> + </article> + <div class="column-span">column-span2</div> + <article> + <div class="container" style="border-top: 0;"> + <div class="block">block3</div> + </div> + </article> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-008.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-008.html new file mode 100644 index 00000000000..0d7bd183841 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-008.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Test the borders drawing for a block split by column-span</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="https://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-children-height-008-ref.html"> + <meta name="assert" content="This test verifies that the borders of block container with an auto block-size, split by column-span, are skipped on the sides adjacent to column-span."> + + <!-- This test is adapted from multicol-span-all-children-height-005. --> + + <style> + article { + column-count: 1; + column-fill: auto; + width: 200px; + background-color: lightgreen; + } + div.container { + height: auto; + border: 20px solid purple; + background-color: pink; + } + div.block { + width: 100px; + height: 100px; + background-color: yellow; + } + div.column-span { + column-span: all; + height: 50px; + background-color: lightblue; + } + </style> + + <article> + <div class="container"> + <div class="block">block1</div> + <div class="column-span">column-span1</div> + <div class="block">block2</div> + <div class="column-span">column-span2</div> + <div class="block">block3</div> + </div> + </article> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-overflow/float-with-relpos-and-transform.html b/tests/wpt/web-platform-tests/css/css-overflow/float-with-relpos-and-transform.html new file mode 100644 index 00000000000..6024b726175 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-overflow/float-with-relpos-and-transform.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<link rel="help" href="https://drafts.csswg.org/css-overflow/#scrollable"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<style> +.container { + background: green; + width: 100px; + height: 100px; + overflow: auto; +} +.float { + float: left; + position: relative; + width: 50px; + height: 50px; + top: calc(50% - 100vh); + transform: translateY(-50%) translateY(100vh); +} +</style> +<p>Test passes if there is a filled green square.</p> +<div class="container"> + <div class="float"></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-005-ref.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-005-ref.html new file mode 100644 index 00000000000..16d23041134 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-005-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<style> +html, body { margin: 0; padding: 0; } +</style> +<body> +<canvas id ="canvas" width="308" height="308"></canvas> +<script> +var canvas = document.getElementById('canvas'); +var context = canvas.getContext("2d"); +context.fillStyle = "green"; +context.fillRect(0, 0, 290, 18); +context.fillRect(0, 0, 18, 290); +context.fillRect(0, 254, 290, 36); +context.fillRect(254, 0, 36, 290); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-005.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-005.https.html new file mode 100644 index 00000000000..efdd7fdf1b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-005.https.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/"> +<link rel="match" href="geometry-border-image-005-ref.html"> +<style> +html, body { margin: 0; padding: 0; } +.container { + width: 200px; + height: 200px; + border: 36px solid orange; + border-image: paint(foo) /* source */ + 1 / /* slice */ + 36px 36px 36px 36px / /* width */ + 18px 18px 18px 18px /* outset */ + round; +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> +<body> +<div id="target" class="container"></div> + +<script id="code" type="text/worklet"> +registerPaint('foo', class { + paint(ctx, geom) { + // Both geom.width and height are 200 + 36 *3 = 308px; + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, geom.width, geom.height); + } +}); +</script> + +<script> + importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-position/position-absolute-replaced-minmax.html b/tests/wpt/web-platform-tests/css/css-position/position-absolute-replaced-minmax.html index a5c0d516472..00780d650fa 100644 --- a/tests/wpt/web-platform-tests/css/css-position/position-absolute-replaced-minmax.html +++ b/tests/wpt/web-platform-tests/css/css-position/position-absolute-replaced-minmax.html @@ -261,7 +261,14 @@ <!-- Just viewbox. Has aspect_ratio, but no intrinsic size inline_width is constrained by left/right, height computed proportionally --> <div class="container"> - <img class="target" style="left:100px;right:100px" src="data:image/svg+xml,%3Csvg viewBox='0 0 100 10' xmlns='http://www.w3.org/2000/svg' %3E%3Crect width='100%' height='100%' style='fill:rgb(0,255,0);'/%3E%3C/svg%3E" + <img class="target" style="left:100px;right:100px;" src="data:image/svg+xml,%3Csvg viewBox='0 0 100 10' xmlns='http://www.w3.org/2000/svg' %3E%3Crect width='100%' height='100%' style='fill:rgb(0,255,0);'/%3E%3C/svg%3E" + data-expected-width="188" data-expected-height="47" data-offset-y="146" data-offset-x="109" + > +</div> +<!-- Same as previous test, but with max-width:fit-content. crbug.com/1010798 + --> +<div class="container"> + <img class="target" style="left:100px;right:100px;max-width:fit-content" src="data:image/svg+xml,%3Csvg viewBox='0 0 100 10' xmlns='http://www.w3.org/2000/svg' %3E%3Crect width='100%' height='100%' style='fill:rgb(0,255,0);'/%3E%3C/svg%3E" data-expected-width="188" data-expected-height="47" data-offset-y="146" data-offset-x="109" > </div> diff --git a/tests/wpt/web-platform-tests/docs/running-tests/webkitgtk_minibrowser.md b/tests/wpt/web-platform-tests/docs/running-tests/webkitgtk_minibrowser.md index b12859bcca9..7aac81e5fce 100644 --- a/tests/wpt/web-platform-tests/docs/running-tests/webkitgtk_minibrowser.md +++ b/tests/wpt/web-platform-tests/docs/running-tests/webkitgtk_minibrowser.md @@ -18,15 +18,3 @@ to run it manually you can find it on any of this paths: inside: `/usr/lib/${TRIPLET}/webkit2gtk-4.0/MiniBrowser` where `TRIPLET=$(gcc -dumpmachine)` - - -Known issues: - -* On a docker container WebKitWebDriver fails to listen on localhost, -because the docker container doesn't provide an IPv6 localhost address. -To workaround this issue, manually tell it to only listen on IPv4 localhost -by passing this parameter to wpt run: `--webdriver-arg=--host=127.0.0.1` -Example: -```bash -./wpt run --webdriver-arg=--host=127.0.0.1 webkitgtk_minibrowser TESTS -``` diff --git a/tests/wpt/web-platform-tests/html/dom/idlharness.https.html b/tests/wpt/web-platform-tests/html/dom/idlharness.https.html index 0d3f1160d28..33ad5c6f616 100644 --- a/tests/wpt/web-platform-tests/html/dom/idlharness.https.html +++ b/tests/wpt/web-platform-tests/html/dom/idlharness.https.html @@ -47,6 +47,7 @@ idl_test( documentWithHandlers[callback.name] = handler; } } + idlArray.add_untested_idls('typedef Window WindowProxy;'); idlArray.add_objects({ NodeList: ['document.getElementsByName("name")'], diff --git a/tests/wpt/web-platform-tests/interfaces/feature-policy.idl b/tests/wpt/web-platform-tests/interfaces/feature-policy.idl index 85601321a17..6f0d69fc378 100644 --- a/tests/wpt/web-platform-tests/interfaces/feature-policy.idl +++ b/tests/wpt/web-platform-tests/interfaces/feature-policy.idl @@ -3,7 +3,6 @@ // (https://github.com/tidoust/reffy-reports) // Source: Feature Policy (https://w3c.github.io/webappsec-feature-policy/) -[NoInterfaceObject] interface FeaturePolicy { boolean allowsFeature(DOMString feature, optional DOMString origin); sequence<DOMString> features(); diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl index e41d7357b1a..2b823047ff1 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl @@ -81,6 +81,7 @@ dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats { boolean voiceActivityFlag; DOMHighResTimeStamp lastPacketReceivedTimestamp; double averageRtcpInterval; + unsigned long long headerBytesReceived; unsigned long long fecPacketsReceived; unsigned long long fecPacketsDiscarded; unsigned long long bytesReceived; @@ -130,6 +131,7 @@ dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats { DOMString remoteId; DOMString rid; DOMHighResTimeStamp lastPacketSentTimestamp; + unsigned long long headerBytesSent; unsigned long packetsDiscardedOnSend; unsigned long long bytesDiscardedOnSend; unsigned long fecPacketsSent; diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html index f0b5bdd9f04..c67ac03f5dc 100644 --- a/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html +++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html @@ -12,7 +12,10 @@ </head> <body> <math> - <menclose> + <menclose notation=""> + <mn>123</mn> + </menclose> + <menclose notation="box"> <mn>123</mn> </menclose> </math> diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html index d7f0627059a..9b71389e74d 100644 --- a/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html +++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html @@ -5,7 +5,7 @@ <title>Legacy menclose radical notation</title> <link rel="help" href="https://www.w3.org/TR/MathML3/chapter3.html#presm.menclose"> <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#enclose-expression-inside-notation-menclose"> - <meta name="assert" content="Verify that the legacy menclose radical notation is not supported."> + <meta name="assert" content="Verify that the legacy menclose radical notation is ignored."> <link rel="match" href="legacy-menclose-radical-notation-ref.html"> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> @@ -19,6 +19,9 @@ <menclose notation="radical"> <mn>123</mn> </menclose> + <menclose notation="box radical"> + <mn>123</mn> + </menclose> </math> <script src="/mathml/support/feature-detection.js"></script> diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/tabindex-001.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/tabindex-001.html index aaf82f77caa..8f853688141 100644 --- a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/tabindex-001.html +++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/tabindex-001.html @@ -14,16 +14,20 @@ const mrow = document.getElementById('mrow'); assert_equals(mrow.tabIndex, -1, "no attribute"); mrow.setAttribute("tabindex", "invalid"); + assert_equals(mrow.getAttribute("tabindex"), "invalid"); assert_equals(mrow.tabIndex, -1, "invalid"); mrow.setAttribute("tabindex", "9999999999"); + assert_equals(mrow.getAttribute("tabindex"), "9999999999"); assert_equals(mrow.tabIndex, -1, "too large integer"); }, "default and invalid values on mrow"); test(() => { const mrowLink = document.getElementById('mrow-link'); assert_equals(mrow.tabIndex, 0, "no attribute"); mrow.setAttribute("tabindex", "invalid"); + assert_equals(mrow.getAttribute("tabindex"), "invalid"); assert_equals(mrow.tabIndex, 0, "invalid"); mrow.setAttribute("tabindex", "9999999999"); + assert_equals(mrow.getAttribute("tabindex"), "9999999999"); assert_equals(mrow.tabIndex, 0, "too large integer"); }, "default and invalid values on MathML link"); }); diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-bitrate.https.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-bitrate.https.html new file mode 100644 index 00000000000..472c0661cb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-bitrate.https.html @@ -0,0 +1,226 @@ +<!doctype html> +<html> +<head> +<title>MediaRecorder {audio|video}bitsPerSecond attributes</title> +<link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<script> + +/* + * The bitrate handling is difficult to test, given that the spec uses text such + * as: "values the User Agent deems reasonable" and "such that the sum of + * videoBitsPerSecond and audioBitsPerSecond is close to the value of recorder’s + * [[ConstrainedBitsPerSecond]] slot". For cases like that this test tries to + * use values that are reasonable for the tested track types. Should a UA vendor + * see a need to update this to fit their definition of reasonable, they should + * feel free to do so, doing their best to avoid regressing existing compliant + * implementations. + */ + +async function getStream(t, constraints) { + const stream = await navigator.mediaDevices.getUserMedia(constraints); + const tracks = stream.getTracks(); + t.add_cleanup(() => tracks.forEach(tr => tr.stop())); + return stream; +} + +function getAudioStream(t) { + return getStream(t, {audio: true}); +} + +function getVideoStream(t) { + return getStream(t, {video: true}); +} + +function getAudioVideoStream(t) { + return getStream(t, {audio: true, video: true}); +} + +const AUDIO_BITRATE = 1e5; // 100kbps +const VIDEO_BITRATE = 1e6; // 1Mbps +const LOW_TOTAL_BITRATE = 5e5; // 500kbps +const HIGH_TOTAL_BITRATE = 2e6; // 2Mbps +const BITRATE_EPSILON = 1e5; // 100kbps + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t)); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); +}, "Passing no bitrate config results in defaults"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + bitsPerSecond: 0, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); + assert_approx_equals(rec.audioBitsPerSecond + rec.videoBitsPerSecond, 0, + BITRATE_EPSILON); +}, "Passing bitsPerSecond:0 results in targets close to 0"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + audioBitsPerSecond: 0, + }); + assert_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); +}, "Passing only audioBitsPerSecond:0 results in 0 for audio, default for video"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + videoBitsPerSecond: 0, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_equals(rec.videoBitsPerSecond, 0); +}, "Passing only videoBitsPerSecond:0 results in 0 for video, default for audio"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + bitsPerSecond: 0, + audioBitsPerSecond: AUDIO_BITRATE, + videoBitsPerSecond: VIDEO_BITRATE, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); + assert_approx_equals(rec.audioBitsPerSecond + rec.videoBitsPerSecond, 0, + BITRATE_EPSILON); +}, "Passing bitsPerSecond:0 overrides audio/video-specific values"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + bitsPerSecond: HIGH_TOTAL_BITRATE, + audioBitsPerSecond: 0, + videoBitsPerSecond: 0, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); + assert_approx_equals(rec.audioBitsPerSecond + rec.videoBitsPerSecond, + HIGH_TOTAL_BITRATE, BITRATE_EPSILON); +}, "Passing bitsPerSecond overrides audio/video zero values"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + bitsPerSecond: HIGH_TOTAL_BITRATE, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); + assert_approx_equals(rec.audioBitsPerSecond + rec.videoBitsPerSecond, + HIGH_TOTAL_BITRATE, BITRATE_EPSILON); +}, "Passing bitsPerSecond sets audio/video bitrate values"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + audioBitsPerSecond: AUDIO_BITRATE, + }); + assert_equals(rec.audioBitsPerSecond, AUDIO_BITRATE); + assert_not_equals(rec.videoBitsPerSecond, 0); +}, "Passing only audioBitsPerSecond results in default for video"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + videoBitsPerSecond: VIDEO_BITRATE, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_equals(rec.videoBitsPerSecond, VIDEO_BITRATE); +}, "Passing only videoBitsPerSecond results in default for audio"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioStream(t), { + videoBitsPerSecond: VIDEO_BITRATE, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_equals(rec.videoBitsPerSecond, VIDEO_BITRATE); +}, "Passing videoBitsPerSecond for audio-only stream still results in something for video"); + +promise_test(async t => { + const rec = new MediaRecorder(await getVideoStream(t), { + audioBitsPerSecond: AUDIO_BITRATE, + }); + assert_equals(rec.audioBitsPerSecond, AUDIO_BITRATE); + assert_not_equals(rec.videoBitsPerSecond, 0); +}, "Passing audioBitsPerSecond for video-only stream still results in something for audio"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioStream(t), { + bitsPerSecond: HIGH_TOTAL_BITRATE, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); +}, "Passing bitsPerSecond for audio-only stream still results in something for video"); + +promise_test(async t => { + const rec = new MediaRecorder(await getVideoStream(t), { + bitsPerSecond: HIGH_TOTAL_BITRATE, + }); + assert_not_equals(rec.audioBitsPerSecond, 0); + assert_not_equals(rec.videoBitsPerSecond, 0); +}, "Passing bitsPerSecond for video-only stream still results in something for audio"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t)); + t.add_cleanup(() => rec.stop()); + const abps = rec.audioBitsPerSecond; + const vbps = rec.videoBitsPerSecond; + rec.start(); + assert_equals(rec.audioBitsPerSecond, abps); + assert_equals(rec.videoBitsPerSecond, vbps); +}, "Selected default track bitrates are not changed by start()"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + audioBitsPerSecond: AUDIO_BITRATE, + videoBitsPerSecond: VIDEO_BITRATE, + }); + t.add_cleanup(() => rec.stop()); + const abps = rec.audioBitsPerSecond; + const vbps = rec.videoBitsPerSecond; + rec.start(); + assert_equals(rec.audioBitsPerSecond, abps); + assert_equals(rec.videoBitsPerSecond, vbps); +}, "Passed-in track bitrates are not changed by start()"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioVideoStream(t), { + bitsPerSecond: HIGH_TOTAL_BITRATE, + }); + t.add_cleanup(() => rec.stop()); + const abps = rec.audioBitsPerSecond; + const vbps = rec.videoBitsPerSecond; + rec.start(); + assert_equals(rec.audioBitsPerSecond, abps); + assert_equals(rec.videoBitsPerSecond, vbps); +}, "Passing bitsPerSecond for audio/video stream does not change track bitrates in start()"); + +promise_test(async t => { + const rec = new MediaRecorder(await getAudioStream(t), { + bitsPerSecond: LOW_TOTAL_BITRATE, + }); + t.add_cleanup(() => rec.stop()); + const abps = rec.audioBitsPerSecond; + const vbps = rec.videoBitsPerSecond; + rec.start(); + assert_approx_equals(rec.audioBitsPerSecond, LOW_TOTAL_BITRATE, + BITRATE_EPSILON); + assert_equals(rec.videoBitsPerSecond, 0); + assert_not_equals(rec.audioBitsPerSecond, abps); + assert_not_equals(rec.videoBitsPerSecond, vbps); +}, "Passing bitsPerSecond for audio stream sets video track bitrate to 0 in start()"); + +promise_test(async t => { + const rec = new MediaRecorder(await getVideoStream(t), { + bitsPerSecond: HIGH_TOTAL_BITRATE, + }); + t.add_cleanup(() => rec.stop()); + const abps = rec.audioBitsPerSecond; + const vbps = rec.videoBitsPerSecond; + rec.start(); + assert_equals(rec.audioBitsPerSecond, 0); + assert_approx_equals(rec.videoBitsPerSecond, HIGH_TOTAL_BITRATE, + BITRATE_EPSILON); + assert_not_equals(rec.audioBitsPerSecond, abps); + assert_not_equals(rec.videoBitsPerSecond, vbps); +}, "Passing bitsPerSecond for video stream sets audio track bitrate to 0 in start()"); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-creation.https.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-creation.https.html index 419211c9dcf..b724ca14503 100644 --- a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-creation.https.html +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-creation.https.html @@ -20,8 +20,8 @@ var recorder = new MediaRecorder(stream); assert_equals(recorder.state, "inactive"); - assert_equals(recorder.videoBitsPerSecond, 0); - assert_equals(recorder.audioBitsPerSecond, 0); + assert_not_equals(recorder.videoBitsPerSecond, 0); + assert_not_equals(recorder.audioBitsPerSecond, 0); test.done(); }); diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-events-and-exceptions.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-events-and-exceptions.html index 58b9c08ecab..cddc07e5079 100644 --- a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-events-and-exceptions.html +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-events-and-exceptions.html @@ -36,23 +36,21 @@ }); recorderOnDataAvailable = test.step_func(event => { - // TODO(mcasas): ondataavailable might never be pinged with an empty Blob - // data on recorder.stop(), see http://crbug.com/54428 assert_equals(recorder.state, "inactive"); - assert_equals(event.data.size, 0, 'We should have gotten an empty Blob'); + assert_not_equals(event.data.size, 0, 'We should get a Blob with data'); }); recorderOnStop = test.step_func(function() { assert_equals(recorder.state, "inactive"); - assert_throws("InvalidStateError", function() { recorder.stop() }, - "recorder cannot be stop()ped in |inactive| state"); + recorder.onstop = recorderOnUnexpectedEvent; + recorder.stop(); + assert_equals(recorder.state, "inactive", "stop() is idempotent"); assert_throws("InvalidStateError", function() { recorder.pause() }, "recorder cannot be pause()ed in |inactive| state"); assert_throws("InvalidStateError", function() { recorder.resume() }, "recorder cannot be resume()d in |inactive| state"); assert_throws("InvalidStateError", function() { recorder.requestData() }, "cannot requestData() if recorder is in |inactive| state"); - recorder.onstop = recorderOnUnexpectedEvent; test.done(); }); @@ -84,15 +82,15 @@ assert_throws("NotSupportedError", function() { - recorder = - new MediaRecorder(stream, {mimeType : "video/invalid"}); + recorder = new MediaRecorder( + new MediaStream(), {mimeType : "video/invalid"}); }, "recorder should throw() with unsupported mimeType"); - let recorder = new MediaRecorder(stream); + let recorder = new MediaRecorder(new MediaStream()); assert_equals(recorder.state, "inactive"); - assert_throws("InvalidStateError", function(){recorder.stop()}, - "recorder cannot be stop()ped in |inactive| state"); + recorder.stop(); + assert_equals(recorder.state, "inactive", "stop() is idempotent"); assert_throws("InvalidStateError", function(){recorder.pause()}, "recorder cannot be pause()ed in |inactive| state"); assert_throws("InvalidStateError", function(){recorder.resume()}, @@ -100,6 +98,14 @@ assert_throws("InvalidStateError", function(){recorder.requestData()}, "cannot requestData() if recorder is in |inactive| state"); + assert_throws("NotSupportedError", + function() { + recorder.start(); + }, + "recorder should throw() when starting with inactive stream"); + + recorder.stream.addTrack(stream.getTracks()[0]); + drawSomethingOnCanvas(); recorder.onstop = recorderOnUnexpectedEvent; diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-mimetype.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-mimetype.html new file mode 100644 index 00000000000..ddc56e9cb75 --- /dev/null +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-mimetype.html @@ -0,0 +1,147 @@ +<!doctype html> +<html> +<head> + <title>MediaRecorder MIMEType</title> + <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#dom-mediarecorder-mimetype"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> +<canvas id="canvas" width="200" height="200"> +</canvas> +<script> +function createAudioStream(t) { + const ac = new AudioContext(); + const {stream} = ac.createMediaStreamDestination(); + const tracks = stream.getTracks(); + t.add_cleanup(() => tracks.forEach(tr => tr.stop())); + return stream; +} + +function createVideoStream(t) { + const canvas = document.getElementById("canvas"); + canvas.getContext('2d'); + const stream = canvas.captureStream(); + const tracks = stream.getTracks(); + t.add_cleanup(() => tracks.forEach(tr => tr.stop())); + return stream; +} + +function createAudioVideoStream(t) { + return new MediaStream([ + ...createAudioStream(t).getTracks(), + ...createVideoStream(t).getTracks(), + ]); +} + +test(t => { + const recorder = new MediaRecorder(createAudioStream(t)); + assert_equals(recorder.mimeType, "", + "MediaRecorder has no default MIMEtype"); +}, "MediaRecorder sets no default MIMEType in the constructor for audio"); + +test(t => { + const recorder = new MediaRecorder(createVideoStream(t)); + assert_equals(recorder.mimeType, "", + "MediaRecorder has no default MIMEtype"); +}, "MediaRecorder sets no default MIMEType in the constructor for video"); + +test(t => { + const stream = createAudioVideoStream(t); + const recorder = new MediaRecorder(stream); + assert_equals(recorder.mimeType, "", + "MediaRecorder has no default MIMEtype"); +}, "MediaRecorder sets no default MIMEType in the constructor for audio/video"); + +test(t => { + assert_throws("NotSupportedError", + () => new MediaRecorder(new MediaStream(), {mimeType: "audio/banana"})); +}, "MediaRecorder invalid audio MIMEType throws"); + +test(t => { + assert_false(MediaRecorder.isTypeSupported("audio/banana")); +}, "MediaRecorder invalid audio MIMEType is unsupported"); + +test(t => { + assert_throws("NotSupportedError", + () => new MediaRecorder(new MediaStream(), {mimeType: "video/pineapple"})); +}, "MediaRecorder invalid video MIMEType throws"); + +test(t => { + assert_false(MediaRecorder.isTypeSupported("video/pineapple")); +}, "MediaRecorder invalid video MIMEType is unsupported"); + +// New MIME types could be added to this list as needed. +for (const mimeType of [ + 'audio/mp4', + 'video/mp4', + 'audio/ogg', + 'audio/ogg; codecs="vorbis"', + 'audio/ogg; codecs="opus"', + 'audio/webm', + 'audio/webm; codecs="vorbis"', + 'audio/webm; codecs="opus"', + 'video/webm', + 'video/webm; codecs="vp8"', + 'video/webm; codecs="vp8, vorbis"', + 'video/webm; codecs="vp8, opus"', + 'video/webm; codecs="vp9"', + 'video/webm; codecs="vp9, vorbis"', + 'video/webm; codecs="vp9, opus"', + 'video/webm; codecs="av1"', + 'video/webm; codecs="av1, opus"', +]) { + if (MediaRecorder.isTypeSupported(mimeType)) { + test(t => { + const recorder = new MediaRecorder(new MediaStream(), {mimeType}); + assert_equals(recorder.mimeType, mimeType, "Supported MIMEType is set"); + }, `Supported MIMEType ${mimeType} is set immediately after constructing`); + } else { + test(t => { + assert_throws("NotSupportedError", + () => new MediaRecorder(new MediaStream(), {mimeType})); + }, `Unsupported MIMEType ${mimeType} throws`); + } +} + +test(t => { + const recorder = new MediaRecorder(createAudioStream(t)); + recorder.start(); + assert_not_equals(recorder.mimeType, "", + "MediaRecorder has a MIMEtype after start() for audio"); + assert_regexp_match(recorder.mimeType, /^audio\//, + "MIMEtype has an expected media type"); + assert_regexp_match(recorder.mimeType, /^[a-z]+\/[a-z]+/, + "MIMEtype has a container subtype"); + assert_regexp_match(recorder.mimeType, /^[a-z]+\/[a-z]+; codecs=[^,]+$/, + "MIMEtype has one codec"); +}, "MediaRecorder sets a MIMEType after start() for audio"); + +test(t => { + const recorder = new MediaRecorder(createVideoStream(t)); + recorder.start(); + assert_not_equals(recorder.mimeType, "", + "MediaRecorder has a MIMEtype after start() for video"); + assert_regexp_match(recorder.mimeType, /^video\//, + "MIMEtype has an expected media type"); + assert_regexp_match(recorder.mimeType, /^[a-z]+\/[a-z]+/, + "MIMEtype has a container subtype"); + assert_regexp_match(recorder.mimeType, /^[a-z]+\/[a-z]+; codecs=[^,]+$/, + "MIMEtype has one codec"); +}, "MediaRecorder sets a MIMEType after start() for video"); + +test(t => { + const recorder = new MediaRecorder(createAudioVideoStream(t)); + recorder.start(); + assert_not_equals(recorder.mimeType, "", + "MediaRecorder has a MIMEtype after start() for audio/video"); + assert_regexp_match(recorder.mimeType, /^video\//, + "MIMEtype has an expected media type"); + assert_regexp_match(recorder.mimeType, /^[a-z]+\/[a-z]+/, + "MIMEtype has a container subtype"); + assert_regexp_match(recorder.mimeType, /^[a-z]+\/[a-z]+; codecs=[^,]+,[^,]+$/, + "MIMEtype has two codecs"); +}, "MediaRecorder sets a MIMEType after start() for audio/video"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-pause-resume.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-pause-resume.html index 39a88836645..33dfd8560c0 100644 --- a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-pause-resume.html +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-pause-resume.html @@ -11,8 +11,10 @@ </canvas> <script> function createVideoStream() { - let canvas = document.getElementById("canvas"); - canvas.getContext('2d'); + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, canvas.width, canvas.height); return canvas.captureStream(); } @@ -32,6 +34,7 @@ recorder.start(); assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully"); + await new Promise(r => recorder.onstart = r); recorder.pause(); assert_equals(recorder.state, "paused", "MediaRecorder should be paused immediately following pause()"); diff --git a/tests/wpt/web-platform-tests/mediacapture-record/idlharness.window.js b/tests/wpt/web-platform-tests/mediacapture-record/idlharness.window.js index 86f5a158822..2e304b0a0e6 100644 --- a/tests/wpt/web-platform-tests/mediacapture-record/idlharness.window.js +++ b/tests/wpt/web-platform-tests/mediacapture-record/idlharness.window.js @@ -7,7 +7,7 @@ idl_test( ['mediastream-recording'], - ['mediacapture-streams', 'FileAPI', 'html', 'dom'], + ['mediacapture-streams', 'FileAPI', 'html', 'dom', 'WebIDL'], idl_array => { // Ignored errors will be surfaced in idlharness.js's test_object below. let recorder, blob, error; @@ -31,7 +31,9 @@ idl_test( idl_array.add_objects({ BlobEvent: [blob] }); try { - error = new MediaRecorderErrorEvent("type", {}); + error = new MediaRecorderErrorEvent("type", { + error: new DOMException, + }); } catch(e) {} idl_array.add_objects({ MediaRecorderErrorEvent: [error] }); } diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js index df91abf6d7f..94031657b4b 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js +++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js @@ -89,7 +89,7 @@ class MockVRService { this.runtimes_ = []; this.interceptor_ = - new MojoInterfaceInterceptor(device.mojom.VRService.name); + new MojoInterfaceInterceptor(device.mojom.VRService.name, "context", true); this.interceptor_.oninterfacerequest = e => this.bindingSet_.addBinding(this, e.handle); this.interceptor_.start(); @@ -187,6 +187,15 @@ class MockVRService { // Implements XRFrameDataProvider and XRPresentationProvider. Maintains a mock // for XRPresentationProvider. class MockRuntime { + // Mapping from string feature names to the corresponding mojo types. + // This is exposed as a member for extensibility. + static featureToMojoMap = { + "viewer": device.mojom.XRSessionFeature.REF_SPACE_VIEWER, + "local": device.mojom.XRSessionFeature.REF_SPACE_LOCAL, + "local-floor": device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR, + "bounded-floor": device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR, + "unbounded": device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED }; + constructor(fakeDeviceInit, service) { this.sessionClient_ = new device.mojom.XRSessionClientPtr(); this.presentation_provider_ = new MockXRPresentationProvider(); @@ -456,19 +465,10 @@ class MockRuntime { setFeatures(supportedFeatures) { function convertFeatureToMojom(feature) { - switch (feature) { - case "viewer": - return device.mojom.XRSessionFeature.REF_SPACE_VIEWER; - case "local": - return device.mojom.XRSessionFeature.REF_SPACE_LOCAL; - case "local-floor": - return device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR; - case "bounded-floor": - return device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR; - case "unbounded": - return device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED; - default: - return device.mojom.XRSessionFeature.INVALID; + if (feature in MockRuntime.featureToMojoMap) { + return MockRuntime.featureToMojoMap[feature]; + } else { + return device.mojom.XRSessionFeature.INVALID; } } diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-add-async.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-add-async.https.html new file mode 100644 index 00000000000..ac13e4f4167 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-add-async.https.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<title>Service Worker: Fetch event added asynchronously doesn't throw</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/test-helpers.sub.js"></script> +<script> +'use strict'; + +service_worker_test( + 'resources/fetch-event-add-async-worker.js'); +</script> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/global-serviceworker.https.any.js b/tests/wpt/web-platform-tests/service-workers/service-worker/global-serviceworker.https.any.js index 489b37f83e1..2335f635b2e 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/global-serviceworker.https.any.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/global-serviceworker.https.any.js @@ -17,7 +17,7 @@ async_test((t) => { assert_true('serviceWorker' in self, 'self.serviceWorker exists'); serviceWorker.postMessage({ messageTest: true }); - // The rest of the rest runs once we receive the above message. + // The rest of the test runs once this receives the above message. addEventListener('message', t.step_func((event) => { // Ignore unrelated messages. if (!event.data.messageTest) return; diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-add-async-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-add-async-worker.js new file mode 100644 index 00000000000..a5a44a57c99 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-add-async-worker.js @@ -0,0 +1,6 @@ +importScripts('/resources/testharness.js'); + +promise_test(async () => { + await new Promise(handler => { step_timeout(handler, 0); }); + self.addEventListener('fetch', () => {}); +}, 'fetch event added asynchronously does not throw'); diff --git a/tests/wpt/web-platform-tests/tools/ci/run_tc.py b/tests/wpt/web-platform-tests/tools/ci/run_tc.py index b2826bf075e..3201ff3a9d3 100755 --- a/tests/wpt/web-platform-tests/tools/ci/run_tc.py +++ b/tests/wpt/web-platform-tests/tools/ci/run_tc.py @@ -145,6 +145,28 @@ def install_chrome(channel): run(["sudo", "apt-get", "-qqy", "update"]) run(["sudo", "gdebi", "-qn", "/tmp/%s" % deb_archive]) +def install_webkitgtk_from_apt_repository(channel): + # Configure webkitgtk.org/debian repository for $channel and pin it with maximum priority + run(["sudo", "apt-key", "adv", "--fetch-keys", "https://webkitgtk.org/debian/apt.key"]) + with open("/tmp/webkitgtk.list", "w") as f: + f.write("deb [arch=amd64] https://webkitgtk.org/debian buster-wpt-webkit-updates %s\n" % channel) + run(["sudo", "mv", "/tmp/webkitgtk.list", "/etc/apt/sources.list.d/"]) + with open("/tmp/99webkitgtk", "w") as f: + f.write("Package: *\nPin: origin webkitgtk.org\nPin-Priority: 1999\n") + run(["sudo", "mv", "/tmp/99webkitgtk", "/etc/apt/preferences.d/"]) + # Install webkit2gtk from the webkitgtk.org/debian repository for $channel + run(["sudo", "apt-get", "-qqy", "update"]) + run(["sudo", "apt-get", "-qqy", "upgrade"]) + run(["sudo", "apt-get", "-qqy", "-t", "buster-wpt-webkit-updates", "install", "webkit2gtk-driver"]) + + +def install_webkitgtk(channel): + if channel in ("experimental", "dev", "nightly"): + raise NotImplementedError("Still can't install from release channel: %s" % channel) + elif channel in ("beta", "stable"): + install_webkitgtk_from_apt_repository(channel) + else: + raise ValueError("Unrecognized release channel: %s" % channel) def start_xvfb(): start(["sudo", "Xvfb", os.environ["DISPLAY"], "-screen", "0", @@ -217,6 +239,9 @@ def setup_environment(args): if "chrome" in args.browser: assert args.channel is not None install_chrome(args.channel) + elif "webkitgtk_minibrowser" in args.browser: + assert args.channel is not None + install_webkitgtk(args.channel) if args.xvfb: start_xvfb() diff --git a/tests/wpt/web-platform-tests/tools/docker/Dockerfile.webkitgtk b/tests/wpt/web-platform-tests/tools/docker/Dockerfile.webkitgtk index 8d792b36a47..58080def60f 100644 --- a/tests/wpt/web-platform-tests/tools/docker/Dockerfile.webkitgtk +++ b/tests/wpt/web-platform-tests/tools/docker/Dockerfile.webkitgtk @@ -7,9 +7,13 @@ FROM debian:10 ENV DEBIAN_FRONTEND=noninteractive \ DEBCONF_NONINTERACTIVE_SEEN=true -# Install general requirements not in the base image + +# Update and upgrade. RUN apt-get -qqy update \ - && apt-get -qqy install \ + && apt-get -qqy upgrade + +# Install general requirements not in the base image +RUN apt-get -qqy install \ bzip2 \ ca-certificates \ dbus-x11 \ @@ -29,19 +33,10 @@ RUN apt-get -qqy update \ xvfb \ git-core -# Configure buster-wpt-webkit-updates repository -RUN apt-key adv --fetch-keys https://webkitgtk.org/debian/apt.key -RUN printf 'deb [arch=amd64] https://webkitgtk.org/debian buster-wpt-webkit-updates main' \ - > /etc/apt/sources.list.d/webkitgtk.list -RUN printf 'Package: *\nPin: origin webkitgtk.org\nPin-Priority: 1999' \ - > /etc/apt/preferences.d/99webkitgtk - -# Update and upgrade -RUN apt-get update \ - && apt-get -y upgrade -# Install webkit packages from https://webkitgtk.org/debian -RUN apt-get install -y -t buster-wpt-webkit-updates webkit2gtk-driver +# To speed up testers, cache in the image most of WebKitGTK dependencies +# but don't install them (that will be done at test time) +RUN apt-get install -qqy --download-only webkit2gtk-driver # Set the timezone ENV TZ "UTC" diff --git a/tests/wpt/web-platform-tests/tools/docker/README.md b/tests/wpt/web-platform-tests/tools/docker/README.md index c444e4a957f..6bcc47c7744 100644 --- a/tests/wpt/web-platform-tests/tools/docker/README.md +++ b/tests/wpt/web-platform-tests/tools/docker/README.md @@ -15,5 +15,3 @@ To update the image used for WebKitGTK: docker build -f Dockerfile.webkitgtk -t <tag> . docker push <tag> ``` - -(This image is not yet used in .taskcluster.yml.) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py index 08b5880a1b7..d17229da468 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py @@ -36,6 +36,20 @@ def cmd_arg(name, value=None): return rv +def maybe_add_args(required_args, current_args): + for required_arg in required_args: + # If the arg is in the form of "variable=value", only add it if + # no arg with another value for "variable" is already there. + if "=" in required_arg: + required_arg_prefix = "%s=" % required_arg.split("=")[0] + if not any(item.startswith(required_arg_prefix) for item in current_args): + current_args.append(required_arg) + else: + if required_arg not in current_args: + current_args.append(required_arg) + return current_args + + def get_free_port(): """Get a random unbound port""" while True: diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py index 599ec9f3110..37e2f21421a 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py @@ -1,4 +1,4 @@ -from .base import get_timeout_multiplier # noqa: F401 +from .base import get_timeout_multiplier, maybe_add_args # noqa: F401 from .webkit import WebKitBrowser from ..executors import executor_kwargs as base_executor_kwargs from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 @@ -24,9 +24,12 @@ def check_args(**kwargs): def browser_kwargs(test_type, run_info_data, config, **kwargs): + # Workaround for https://gitlab.gnome.org/GNOME/libsoup/issues/172 + webdriver_required_args = ["--host=127.0.0.1"] + webdriver_args = maybe_add_args(webdriver_required_args, kwargs.get("webdriver_args")) return {"binary": kwargs["binary"], "webdriver_binary": kwargs["webdriver_binary"], - "webdriver_args": kwargs.get("webdriver_args")} + "webdriver_args": webdriver_args} def capabilities(server_config, **kwargs): diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py index 290fcff5ab2..1763ff44b4e 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py @@ -181,7 +181,7 @@ def run_info_browser_version(binary): def update_properties(): - return (["os", "debug", "webrender", "e10s", "sw-e10s", "processor"], + return (["os", "debug", "webrender", "fisson", "e10s", "sw-e10s", "processor"], {"os": ["version"], "processor": ["bits"]}) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py index 65f78125ad7..3c4947335bf 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py @@ -1,4 +1,4 @@ -from .base import get_timeout_multiplier # noqa: F401 +from .base import get_timeout_multiplier, maybe_add_args # noqa: F401 from .webkit import WebKitBrowser from ..executors import executor_kwargs as base_executor_kwargs from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 @@ -24,16 +24,25 @@ def check_args(**kwargs): def browser_kwargs(test_type, run_info_data, config, **kwargs): + # Workaround for https://gitlab.gnome.org/GNOME/libsoup/issues/172 + webdriver_required_args = ["--host=127.0.0.1"] + webdriver_args = maybe_add_args(webdriver_required_args, kwargs.get("webdriver_args")) return {"binary": kwargs["binary"], "webdriver_binary": kwargs["webdriver_binary"], - "webdriver_args": kwargs.get("webdriver_args")} + "webdriver_args": webdriver_args} def capabilities(server_config, **kwargs): + browser_required_args = ["--automation", + "--javascript-can-open-windows-automatically=true", + "--enable-xss-auditor=false", + "--enable-media-capabilities=true", + "--enable-encrypted-media=true", + "--enable-media-stream=true", + "--enable-mock-capture-devices=true", + "--enable-webaudio=true"] args = kwargs.get("binary_args", []) - if "--automation" not in args: - args.append("--automation") - + args = maybe_add_args(browser_required_args, args) return { "browserName": "MiniBrowser", "webkitgtk:browserOptions": { diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/cycle-witout-delay.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/cycle-witout-delay.html new file mode 100644 index 00000000000..ed26ad2ced2 --- /dev/null +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/cycle-witout-delay.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html class="a"> + <head> + <title>Cycles without DelayNode in audio node graph</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <script> + const t = async_test( + "Test that cycles that don't contain a DelayNode are muted" + ); + t.step(function() { + var off = new OfflineAudioContext(1, 512, 48000); + var osc = new OscillatorNode(off); + var fb = new GainNode(off); + // zero delay feedback loop + osc.connect(fb).connect(fb).connect(off.destination); + osc.start(0); + off.startRendering().then((b) => { + var samples = b.getChannelData(0); + var silent = true; + for (var i = 0; i < samples.length; i++) { + if (samples[i] != 0.0) { + silent = false; + break; + } + } + assert_true(silent); + t.done(); + }); + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/delay-time-clamping.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/delay-time-clamping.html new file mode 100644 index 00000000000..3f8ed24429a --- /dev/null +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/delay-time-clamping.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class="a"> + <head> + <title>Delay time clamping in cycles</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <script> + const t = async_test( + "Test that a DelayNode allows a feedback loop of a single rendering quantum" + ); + t.step(function() { + var off = new OfflineAudioContext(1, 512, 48000); + var b = off.createBuffer(1, 1, 48000); + b.getChannelData(0)[0] = 1; + var impulse = new AudioBufferSourceNode(off, {buffer: b}); + impulse.start(0); + // This delayTime of 64 samples MUST be clamped to 128 samples when + // in a cycle. + var delay = new DelayNode(off, {delayTime: 64/48000}); + var fb = new GainNode(off); + impulse.connect(fb).connect(delay).connect(fb).connect(off.destination); + off.startRendering().then((b) => { + var samples = b.getChannelData(0); + for (var i = 0; i < samples.length; i++) { + if ((i % 128) != 0) { + assert_equals(samples[i], 0.0, "Non-silent audio found in between delayed impulses"); + } else { + assert_equals(samples[i], 1.0, "Silent audio found instead of a delayed impulse"); + } + } + t.done(); + }); + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/feedback-delay-time.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/feedback-delay-time.html new file mode 100644 index 00000000000..50c8e455b90 --- /dev/null +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/processing-model/feedback-delay-time.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html class="a"> + <head> + <title>Feedback cycle with delay in audio node graph</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <script> + const t = async_test( + "Test that a DelayNode allows a feedback loop of a single rendering quantum" + ); + t.step(function() { + var off = new OfflineAudioContext(1, 512, 48000); + var b = off.createBuffer(1, 1, 48000); + b.getChannelData(0)[0] = 1; + var impulse = new AudioBufferSourceNode(off, {buffer: b}); + impulse.start(0); + var delay = new DelayNode(off, {delayTime: 128/48000}); + var fb = new GainNode(off); + impulse.connect(fb).connect(delay).connect(fb).connect(off.destination); + off.startRendering().then((b) => { + var samples = b.getChannelData(0); + for (var i = 0; i < samples.length; i++) { + if ((i % 128) != 0) { + assert_equals(samples[i], 0.0, "Non-silent audio found in between delayed impulses"); + } else { + assert_equals(samples[i], 1.0, "Silent audio found instead of a delayed impulse"); + } + } + t.done(); + }); + }); + </script> + </body> +</html> |