Update web-platform-tests to revision daac9dc806e9571ea856253fcc35a94e73d4f711

This commit is contained in:
WPT Sync Bot 2019-10-06 10:58:10 +00:00
parent 1318ea9d02
commit 393fa37c0b
67 changed files with 1485 additions and 146 deletions

View file

@ -7,7 +7,7 @@
expected: FAIL expected: FAIL
[Opening a blob URL in a new window immediately before revoking it works.] [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.] [Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: FAIL expected: FAIL

View file

@ -14,6 +14,9 @@
[Revoke blob URL after creating Request, will fetch] [Revoke blob URL after creating Request, will fetch]
expected: FAIL expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL
[url-with-fetch.any.html] [url-with-fetch.any.html]
[Untitled] [Untitled]
@ -34,3 +37,6 @@
[Revoke blob URL after creating Request, will fetch] [Revoke blob URL after creating Request, will fetch]
expected: FAIL expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL

View file

@ -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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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/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": [ "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-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": [ "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-004-ref.html": [
[] []
], ],
"css/css-paint-api/geometry-border-image-005-ref.html": [
[]
],
"css/css-paint-api/geometry-with-float-size-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-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": [ "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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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": [
[ [
"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" "support"
], ],
".taskcluster.yml": [ ".taskcluster.yml": [
"b23cc93e633021686192b5cc1acbb7d8b6b3fe96", "adb81d6c0271ac5d8061782eac1b3e181984eb68",
"support" "support"
], ],
".well-known/README.md": [ ".well-known/README.md": [
@ -449393,6 +449546,10 @@
"9f19f6ae66b58f93c23ba8aeb095838d9a6cc5c9", "9f19f6ae66b58f93c23ba8aeb095838d9a6cc5c9",
"testharness" "testharness"
], ],
"2dcontext/imagebitmap/createImageBitmap-serializable.html": [
"44e7a40351080d47675edb426f78cec4fa795920",
"testharness"
],
"2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [ "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [
"f58825cc371f04bf186ba23fa869391f3d2d3f6c", "f58825cc371f04bf186ba23fa869391f3d2d3f6c",
"testharness" "testharness"
@ -458602,7 +458759,7 @@
"support" "support"
], ],
"common/security-features/resources/common.sub.js": [ "common/security-features/resources/common.sub.js": [
"12776b1a4b55dc76415ea63abc4a93dab2fedd2a", "c974e83b9604d5770ffb849a1b77f963d3f7955b",
"support" "support"
], ],
"common/security-features/resources/common.sub.js.headers": [ "common/security-features/resources/common.sub.js.headers": [
@ -458825,6 +458982,10 @@
"06e728342cdb63a72b420423b40b6e32ae3e2162", "06e728342cdb63a72b420423b40b6e32ae3e2162",
"reftest" "reftest"
], ],
"compat/webkit-box-removing-triggering-anonymous-merge.html": [
"8506425548b6ff97491e388dc1a1f3830aa790fc",
"testharness"
],
"compat/webkit-gradient-comma.html": [ "compat/webkit-gradient-comma.html": [
"b288a9a43fe8eba26a4ef37bd5439cbe75047885", "b288a9a43fe8eba26a4ef37bd5439cbe75047885",
"testharness" "testharness"
@ -476510,7 +476671,7 @@
"testharness" "testharness"
], ],
"contacts/contacts-select.https.window.js": [ "contacts/contacts-select.https.window.js": [
"8d1fdfbfdff539e7dd17da4b0e28ef01ae47a2d5", "5503ea6968a8d2bd89e49a67bf0def695738d68d",
"testharness" "testharness"
], ],
"contacts/resources/helpers.js": [ "contacts/resources/helpers.js": [
@ -501105,6 +501266,10 @@
"59843ae54b64f6ce4f7e616d4be491c911ea84cf", "59843ae54b64f6ce4f7e616d4be491c911ea84cf",
"support" "support"
], ],
"css/CSS2/floats/adjoining-floats-dynamic.html": [
"3446d972d72ec8832ab8ac320a84dff609676ae3",
"reftest"
],
"css/CSS2/floats/computed-float-position-absolute.html": [ "css/CSS2/floats/computed-float-position-absolute.html": [
"ad9220b3a06085c458f7100c896100fb32f562e8", "ad9220b3a06085c458f7100c896100fb32f562e8",
"testharness" "testharness"
@ -531953,6 +532118,22 @@
"ad267c450014629fbd309ed6825d94379d2fe882", "ad267c450014629fbd309ed6825d94379d2fe882",
"visual" "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": [ "css/CSS2/text/bidi-text-decoration-underline-001.xht": [
"e3efb521f2208113ad3278a261348bc5997240f5", "e3efb521f2208113ad3278a261348bc5997240f5",
"visual" "visual"
@ -568461,6 +568642,10 @@
"7f92755b092845d3d550568e0572453801451f3d", "7f92755b092845d3d550568e0572453801451f3d",
"support" "support"
], ],
"css/css-masking/animations/clip-interpolation.html": [
"322ebd724e8524e85d8afe369b6bafaabbec8c79",
"testharness"
],
"css/css-masking/animations/clip-path-interpolation.html": [ "css/css-masking/animations/clip-path-interpolation.html": [
"21c34f1f2b75ec7345a97b00db62a49b038cf026", "21c34f1f2b75ec7345a97b00db62a49b038cf026",
"testharness" "testharness"
@ -569481,6 +569666,10 @@
"d60802b897fedab122fb4661f312bd5358785570", "d60802b897fedab122fb4661f312bd5358785570",
"testharness" "testharness"
], ],
"css/css-masking/parsing/mask-invalid.html": [
"367049cf19ffc2390316470dec3d789fbbee36a8",
"testharness"
],
"css/css-masking/parsing/mask-position-invalid.html": [ "css/css-masking/parsing/mask-position-invalid.html": [
"c246a1e795eea6a9e31fe1155d55ceb8532d6032", "c246a1e795eea6a9e31fe1155d55ceb8532d6032",
"testharness" "testharness"
@ -569501,6 +569690,10 @@
"31a528381af7d0bb3b4d1a30e1b3f20a0f2787ce", "31a528381af7d0bb3b4d1a30e1b3f20a0f2787ce",
"testharness" "testharness"
], ],
"css/css-masking/parsing/mask-valid.sub.html": [
"63aed3e33c46bdbf2c1bf8c8b8758daff7ab0bee",
"testharness"
],
"css/css-masking/test-mask-ref.html": [ "css/css-masking/test-mask-ref.html": [
"938235acbd36309fb969c55f161239bcd5ab969e", "938235acbd36309fb969c55f161239bcd5ab969e",
"support" "support"
@ -570638,11 +570831,11 @@
"reftest" "reftest"
], ],
"css/css-multicol/multicol-span-all-children-height-006-ref.html": [ "css/css-multicol/multicol-span-all-children-height-006-ref.html": [
"85dfa522c7de9152020342ddb67484b7f1e6977b", "261ff480c38c70e5bf99b9886919088647fbef9e",
"support" "support"
], ],
"css/css-multicol/multicol-span-all-children-height-006.html": [ "css/css-multicol/multicol-span-all-children-height-006.html": [
"479fb2d0ced056f24b39126fa29574a6a811f8e6", "5c1e634c2b2c25684eb55d58a5e4c8b7ca9de7ae",
"reftest" "reftest"
], ],
"css/css-multicol/multicol-span-all-children-height-007-ref.html": [ "css/css-multicol/multicol-span-all-children-height-007-ref.html": [
@ -570653,6 +570846,14 @@
"80f34b45ded8af29c0600a6fa78584cb22b342fc", "80f34b45ded8af29c0600a6fa78584cb22b342fc",
"reftest" "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": [ "css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [
"9f76ea15a0daa7753e76ad9b9a99948988c702d3", "9f76ea15a0daa7753e76ad9b9a99948988c702d3",
"support" "support"
@ -571501,6 +571702,10 @@
"b9ba7acd150e5022de5c5208cd7f5f7d4dde93c3", "b9ba7acd150e5022de5c5208cd7f5f7d4dde93c3",
"support" "support"
], ],
"css/css-overflow/float-with-relpos-and-transform.html": [
"6024b7261750e0c5dc4a681dccee2ab72b83abca",
"reftest"
],
"css/css-overflow/inheritance.html": [ "css/css-overflow/inheritance.html": [
"976406be413b9bdc8cef4acab0a0cd29df2dd43d", "976406be413b9bdc8cef4acab0a0cd29df2dd43d",
"testharness" "testharness"
@ -572253,6 +572458,14 @@
"0f483cd5d19acf4923e60a9f59f55b2bd1e2d0d0", "0f483cd5d19acf4923e60a9f59f55b2bd1e2d0d0",
"reftest" "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": [ "css/css-paint-api/geometry-with-float-size-ref.html": [
"c24a9d7bc0d9dd251186faec68d5bacb15db8c77", "c24a9d7bc0d9dd251186faec68d5bacb15db8c77",
"support" "support"
@ -573018,7 +573231,7 @@
"testharness" "testharness"
], ],
"css/css-position/position-absolute-replaced-minmax.html": [ "css/css-position/position-absolute-replaced-minmax.html": [
"a5c0d516472b9a2a1be4d391f38cac412e6aa7d1", "00780d650fae639b37f4e82eabcd77794eb1aae2",
"testharness" "testharness"
], ],
"css/css-position/position-fixed-at-bottom-right-on-viewport.html": [ "css/css-position/position-fixed-at-bottom-right-on-viewport.html": [
@ -620310,7 +620523,7 @@
"support" "support"
], ],
"docs/running-tests/webkitgtk_minibrowser.md": [ "docs/running-tests/webkitgtk_minibrowser.md": [
"b12859bcca9e6e90998735c97932c42d60aecba4", "7aac81e5fce660db84969f9c0a7cae429a257207",
"support" "support"
], ],
"docs/test-suite-design.md": [ "docs/test-suite-design.md": [
@ -633606,7 +633819,7 @@
"testharness" "testharness"
], ],
"html/dom/idlharness.https.html": [ "html/dom/idlharness.https.html": [
"0d3f1160d2819601afb2168bc15bfeeaddfed6f1", "33ad5c6f6169a7e376aaadeba1b8df4dd6815f7c",
"testharness" "testharness"
], ],
"html/dom/idlharness.worker.js": [ "html/dom/idlharness.worker.js": [
@ -650642,7 +650855,7 @@
"support" "support"
], ],
"interfaces/feature-policy.idl": [ "interfaces/feature-policy.idl": [
"85601321a17f3d0a46d2246642d59ef44d916398", "6f0d69fc378d91a1ededf21b273216061099c278",
"support" "support"
], ],
"interfaces/fetch.idl": [ "interfaces/fetch.idl": [
@ -650998,7 +651211,7 @@
"support" "support"
], ],
"interfaces/webrtc-stats.idl": [ "interfaces/webrtc-stats.idl": [
"e41d7357b1a20328cd543c118005f2d9f77f0773", "2b823047ff1e37a13e9d2e71711360944019fcb5",
"support" "support"
], ],
"interfaces/webrtc.idl": [ "interfaces/webrtc.idl": [
@ -652178,11 +652391,11 @@
"reftest" "reftest"
], ],
"mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html": [ "mathml/presentation-markup/menclose/legacy-menclose-radical-notation-ref.html": [
"f0b5bdd9f04e795400f2741b47ebb82d0d3a61cb", "c67ac03f5dcc90d24b15ae89c269c99bb75e2c48",
"support" "support"
], ],
"mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html": [ "mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html": [
"d7f0627059ad9e400480d574b5e83cff9113b107", "9b71389e74dd1125135aa69fc3c8a47122d7a4a8",
"reftest" "reftest"
], ],
"mathml/presentation-markup/mrow/inferred-mrow-baseline.html": [ "mathml/presentation-markup/mrow/inferred-mrow-baseline.html": [
@ -652998,7 +653211,7 @@
"reftest" "reftest"
], ],
"mathml/relations/html5-tree/tabindex-001.html": [ "mathml/relations/html5-tree/tabindex-001.html": [
"aaf82f77caa87cadd4dfa4706a2bc15192006a6a", "8f8536881416584656277eeaaed4604b7f6def4d",
"testharness" "testharness"
], ],
"mathml/relations/html5-tree/tabindex-002.html": [ "mathml/relations/html5-tree/tabindex-002.html": [
@ -653937,8 +654150,12 @@
"d59e5e30845eaef12bab6419e348a01779313c56", "d59e5e30845eaef12bab6419e348a01779313c56",
"support" "support"
], ],
"mediacapture-record/MediaRecorder-bitrate.https.html": [
"472c0661cb7b5981b2de671458e2da3592516d0c",
"testharness"
],
"mediacapture-record/MediaRecorder-creation.https.html": [ "mediacapture-record/MediaRecorder-creation.https.html": [
"419211c9dcf63241b63cd11d671a0800b3998d83", "b724ca14503a87ab06eb5e12c469fccd3dd3fde9",
"testharness" "testharness"
], ],
"mediacapture-record/MediaRecorder-destroy-script-execution.html": [ "mediacapture-record/MediaRecorder-destroy-script-execution.html": [
@ -653958,11 +654175,15 @@
"testharness" "testharness"
], ],
"mediacapture-record/MediaRecorder-events-and-exceptions.html": [ "mediacapture-record/MediaRecorder-events-and-exceptions.html": [
"58b9c08ecab0ff8872748f5215743379876ea5ef", "cddc07e5079481e0ac7b44d1c223d88bea9e64fe",
"testharness"
],
"mediacapture-record/MediaRecorder-mimetype.html": [
"ddc56e9cb750c59753e238c8ec39c6e1f128790b",
"testharness" "testharness"
], ],
"mediacapture-record/MediaRecorder-pause-resume.html": [ "mediacapture-record/MediaRecorder-pause-resume.html": [
"39a8883664550af1a48ae965d4789a0d6df97d28", "33dfd8560c04d9e9de335b13cfcb33428a6b7e24",
"testharness" "testharness"
], ],
"mediacapture-record/MediaRecorder-stop.html": [ "mediacapture-record/MediaRecorder-stop.html": [
@ -653970,7 +654191,7 @@
"testharness" "testharness"
], ],
"mediacapture-record/idlharness.window.js": [ "mediacapture-record/idlharness.window.js": [
"86f5a158822156b54e776639fb9c7504f0ff7498", "2e304b0a0e6ece247614c5c692ef0e368f5ad216",
"testharness" "testharness"
], ],
"mediacapture-record/support/MediaRecorder-iframe.html": [ "mediacapture-record/support/MediaRecorder-iframe.html": [
@ -677394,7 +677615,7 @@
"support" "support"
], ],
"resources/chromium/webxr-test.js": [ "resources/chromium/webxr-test.js": [
"df91abf6d7f2c2cb10dfd5798f27a7d96a6ad339", "94031657b4b6d2698739eddf0bd4028e0aa8fdea",
"support" "support"
], ],
"resources/chromium/webxr-test.js.headers": [ "resources/chromium/webxr-test.js.headers": [
@ -679513,6 +679734,10 @@
"4f176220d6100c4efb1bfda817b84cf5f53a4f3d", "4f176220d6100c4efb1bfda817b84cf5f53a4f3d",
"testharness" "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": [ "service-workers/service-worker/fetch-event-after-navigation-within-page.https.html": [
"4812d8a91551edae84b5e2805804fc9d8899f3e9", "4812d8a91551edae84b5e2805804fc9d8899f3e9",
"testharness" "testharness"
@ -679678,7 +679903,7 @@
"testharness" "testharness"
], ],
"service-workers/service-worker/global-serviceworker.https.any.js": [ "service-workers/service-worker/global-serviceworker.https.any.js": [
"489b37f83e1c21809e9b0b63d0f0e59db23d197c", "2335f635b2e6ad50b2d1bf4117eb08b19d3ac3b1",
"testharness" "testharness"
], ],
"service-workers/service-worker/http-to-https-redirect-and-register.https.html": [ "service-workers/service-worker/http-to-https-redirect-and-register.https.html": [
@ -680349,6 +680574,10 @@
"300efe049b5de8810f7c44863e11c280ca2926f3", "300efe049b5de8810f7c44863e11c280ca2926f3",
"support" "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": [ "service-workers/service-worker/resources/fetch-event-after-navigation-within-page-iframe.html": [
"bf8a6d5ce51facdd65f30ce5750417c7fcf2ef02", "bf8a6d5ce51facdd65f30ce5750417c7fcf2ef02",
"support" "support"
@ -688198,7 +688427,7 @@
"support" "support"
], ],
"tools/ci/run_tc.py": [ "tools/ci/run_tc.py": [
"b2826bf075e9b1e82ee3d021003134930231f556", "3201ff3a9d309719da2fe038c73d1b144ffdb5d2",
"support" "support"
], ],
"tools/ci/taskcluster-run.py": [ "tools/ci/taskcluster-run.py": [
@ -688234,11 +688463,11 @@
"support" "support"
], ],
"tools/docker/Dockerfile.webkitgtk": [ "tools/docker/Dockerfile.webkitgtk": [
"8d792b36a473059c41d9e68789bab7ba8a7c2855", "58080def60ff4f26277c96015a8c2968254907f3",
"support" "support"
], ],
"tools/docker/README.md": [ "tools/docker/README.md": [
"c444e4a957fd0ba55e0d51a0e87b9562550e0add", "6bcc47c7744e4cc8be96b1c9590878955080da27",
"support" "support"
], ],
"tools/docker/__init__.py": [ "tools/docker/__init__.py": [
@ -693310,7 +693539,7 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/base.py": [ "tools/wptrunner/wptrunner/browsers/base.py": [
"08b5880a1b7e903fb2ca937d7f3aef43fc44b2f6", "d17229da4686548e05c228a7345194e0d8f4d8dd",
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/chrome.py": [ "tools/wptrunner/wptrunner/browsers/chrome.py": [
@ -693338,11 +693567,11 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/epiphany.py": [ "tools/wptrunner/wptrunner/browsers/epiphany.py": [
"599ec9f3110f89f5d64effe98130ede930f1fb7c", "37e2f21421ae54e0c2a6b11cb0763d65b5f3ea72",
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/firefox.py": [ "tools/wptrunner/wptrunner/browsers/firefox.py": [
"290fcff5ab22bd5ca19cedb4d3f38f5b8197768f", "1763ff44b4e55c14c8f5d753defb3ba39e017262",
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/firefox_android.py": [ "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
@ -693386,7 +693615,7 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py": [ "tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py": [
"65f78125ad7a89d43c08b6986bf41145cc71d04c", "3c4947335bf32fd64c5c539dc08b851106c2f254",
"support" "support"
], ],
"tools/wptrunner/wptrunner/config.py": [ "tools/wptrunner/wptrunner/config.py": [
@ -697405,6 +697634,18 @@
"2778493e3b6c12d4c00c77bd975e845063621522", "2778493e3b6c12d4c00c77bd975e845063621522",
"support" "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": [ "webaudio/the-audio-api/the-analysernode-interface/.gitkeep": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"support" "support"

View file

@ -0,0 +1,2 @@
[mix-blend-mode-animation.html]
expected: FAIL

View file

@ -1,5 +1,4 @@
[perspective-interpolation.html] [perspective-interpolation.html]
expected: CRASH
[ perspective interpolation] [ perspective interpolation]
expected: FAIL expected: FAIL

View file

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

View file

@ -312,15 +312,9 @@
[<iframe>: separate response Content-Type: */* text/html] [<iframe>: separate response Content-Type: */* text/html]
expected: FAIL expected: FAIL
[<iframe>: combined response Content-Type: text/html */*] [<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL expected: FAIL
[<iframe>: separate response Content-Type: text/html */*;charset=gbk] [<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL expected: FAIL

View file

@ -56,9 +56,9 @@
[separate text/javascript x/x] [separate text/javascript x/x]
expected: FAIL expected: FAIL
[separate text/javascript;charset=windows-1252 error text/javascript] [separate text/javascript error]
expected: FAIL expected: FAIL
[separate text/javascript;charset=windows-1252 text/javascript] [separate text/javascript ]
expected: FAIL expected: FAIL

View file

@ -11,9 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C] [X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL expected: FAIL
[X-Content-Type-Options%3A%20'NosniFF'] [X-Content-Type-Options%3A%20%2Cnosniff]
expected: FAIL
[X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff]
expected: FAIL expected: FAIL

View file

@ -764,9 +764,6 @@
[OffscreenCanvasRenderingContext2D interface: attribute miterLimit] [OffscreenCanvasRenderingContext2D interface: attribute miterLimit]
expected: FAIL 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] [Path2D interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL expected: FAIL
@ -1585,9 +1582,6 @@
[Window interface: operation prompt(DOMString, DOMString)] [Window interface: operation prompt(DOMString, DOMString)]
expected: FAIL 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] [Document interface: documentWithHandlers must inherit property "dir" with the proper type]
expected: FAIL expected: FAIL
@ -1660,9 +1654,6 @@
[Window interface: window must inherit property "onauxclick" with the proper type] [Window interface: window must inherit property "onauxclick" with the proper type]
expected: FAIL 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] [Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError]
expected: FAIL expected: FAIL
@ -1672,9 +1663,6 @@
[Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type] [Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL 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] [Window interface: window must inherit property "onformdata" with the proper type]
expected: FAIL expected: FAIL
@ -1747,9 +1735,6 @@
[Document interface: new Document() must inherit property "alinkColor" with the proper type] [Document interface: new Document() must inherit property "alinkColor" with the proper type]
expected: FAIL 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] [Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL expected: FAIL

View file

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

View file

@ -1,8 +1,4 @@
[skip-document-with-fragment.html] [skip-document-with-fragment.html]
expected: TIMEOUT
[Autofocus elements in iframed documents with URL fragments should be skipped.] [Autofocus elements in iframed documents with URL fragments should be skipped.]
expected: FAIL expected: FAIL
[Autofocus elements in top-level browsing context's documents with URI fragments should be skipped.]
expected: TIMEOUT

View file

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

View file

@ -1,5 +1,5 @@
[nested-context-navigations-iframe.html] [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] [Test that iframe navigations are not observable by the parent, even after history navigations by the parent]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,4 @@
[delay-time-clamping.html]
[Test that a DelayNode allows a feedback loop of a single rendering quantum]
expected: FAIL

View file

@ -0,0 +1,4 @@
[feedback-delay-time.html]
[Test that a DelayNode allows a feedback loop of a single rendering quantum]
expected: FAIL

View file

@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html] [realtimeanalyser-fft-scaling.html]
expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.] [X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL expected: FAIL

View file

@ -1,2 +0,0 @@
[Worker-constructor.html]
expected: ERROR

View file

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

View file

@ -12,15 +12,16 @@ tasks:
$flatten: $flatten:
$match: { $match: {
event.ref == "refs/heads/master": [{name: firefox, channel: nightly}, {name: chrome, channel: dev}], 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/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_stable": [{name: chrome, channel: stable}],
event.ref == "refs/heads/triggers/chrome_beta": [{name: chrome, channel: beta}], 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/chrome_dev": [{name: chrome, channel: dev}],
event.ref == "refs/heads/triggers/firefox_stable": [{name: firefox, channel: stable}], 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_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): each(browser):
$map: $map:
- [testharness, 1, 15] - [testharness, 1, 15]
@ -70,7 +71,12 @@ tasks:
owner: ${event.pusher.email} owner: ${event.pusher.email}
source: ${event.repository.url} source: ${event.repository.url}
payload: 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 maxRunTime: 7200
artifacts: artifacts:
public/results: public/results:

View file

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

View file

@ -1225,7 +1225,7 @@ function invokeFromIframe(subresource, sourceContextList) {
promise = fetch(frameUrl) promise = fetch(frameUrl)
.then(r => r.text()) .then(r => r.text())
.then(t => { .then(t => {
frameContnent = t; frameContent = t;
iframe = createElement("iframe", {}, document.body, true); iframe = createElement("iframe", {}, document.body, true);
return iframe.eventPromise; return iframe.eventPromise;
}) })

View file

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

View file

@ -47,6 +47,17 @@ contactsTestWithUserActivation(async (test, setSelectedContacts) => {
}, 'The Contact API can fail when the selector cannot be opened'); }, '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) => { contactsTestWithUserActivation(async (test, setSelectedContacts) => {
// Returns two contacts with all information available. // Returns two contacts with all information available.
setSelectedContacts([ setSelectedContacts([

View file

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

View file

@ -0,0 +1,9 @@
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<div>אבג</div>
<div>אבג</div>
<div>אבג</div>
<div>אבג</div>
<div>אבג</div>
</body>

View file

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

View file

@ -0,0 +1,2 @@
<!DOCTYPE html>
<body>()</body>

View file

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

View file

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

View file

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

View file

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

View file

@ -35,7 +35,7 @@
</article> </article>
<div class="column-span">column-span1</div> <div class="column-span">column-span1</div>
<article> <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 class="block">block2</div>
</div> </div>
</article> </article>

View file

@ -19,6 +19,7 @@
background-color: pink; background-color: pink;
border: 20px solid purple; border: 20px solid purple;
margin-top: 1em; margin-top: 1em;
margin-bottom: 1em;
} }
div.block { div.block {
width: 100px; width: 100px;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -261,7 +261,14 @@
<!-- Just viewbox. Has aspect_ratio, but no intrinsic size <!-- Just viewbox. Has aspect_ratio, but no intrinsic size
inline_width is constrained by left/right, height computed proportionally --> inline_width is constrained by left/right, height computed proportionally -->
<div class="container"> <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" data-expected-width="188" data-expected-height="47" data-offset-y="146" data-offset-x="109"
> >
</div> </div>

View file

@ -18,15 +18,3 @@ to run it manually you can find it on any of this paths:
inside: inside:
`/usr/lib/${TRIPLET}/webkit2gtk-4.0/MiniBrowser` `/usr/lib/${TRIPLET}/webkit2gtk-4.0/MiniBrowser`
where `TRIPLET=$(gcc -dumpmachine)` 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
```

View file

@ -47,6 +47,7 @@ idl_test(
documentWithHandlers[callback.name] = handler; documentWithHandlers[callback.name] = handler;
} }
} }
idlArray.add_untested_idls('typedef Window WindowProxy;');
idlArray.add_objects({ idlArray.add_objects({
NodeList: ['document.getElementsByName("name")'], NodeList: ['document.getElementsByName("name")'],

View file

@ -3,7 +3,6 @@
// (https://github.com/tidoust/reffy-reports) // (https://github.com/tidoust/reffy-reports)
// Source: Feature Policy (https://w3c.github.io/webappsec-feature-policy/) // Source: Feature Policy (https://w3c.github.io/webappsec-feature-policy/)
[NoInterfaceObject]
interface FeaturePolicy { interface FeaturePolicy {
boolean allowsFeature(DOMString feature, optional DOMString origin); boolean allowsFeature(DOMString feature, optional DOMString origin);
sequence<DOMString> features(); sequence<DOMString> features();

View file

@ -81,6 +81,7 @@ dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats {
boolean voiceActivityFlag; boolean voiceActivityFlag;
DOMHighResTimeStamp lastPacketReceivedTimestamp; DOMHighResTimeStamp lastPacketReceivedTimestamp;
double averageRtcpInterval; double averageRtcpInterval;
unsigned long long headerBytesReceived;
unsigned long long fecPacketsReceived; unsigned long long fecPacketsReceived;
unsigned long long fecPacketsDiscarded; unsigned long long fecPacketsDiscarded;
unsigned long long bytesReceived; unsigned long long bytesReceived;
@ -130,6 +131,7 @@ dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats {
DOMString remoteId; DOMString remoteId;
DOMString rid; DOMString rid;
DOMHighResTimeStamp lastPacketSentTimestamp; DOMHighResTimeStamp lastPacketSentTimestamp;
unsigned long long headerBytesSent;
unsigned long packetsDiscardedOnSend; unsigned long packetsDiscardedOnSend;
unsigned long long bytesDiscardedOnSend; unsigned long long bytesDiscardedOnSend;
unsigned long fecPacketsSent; unsigned long fecPacketsSent;

View file

@ -12,7 +12,10 @@
</head> </head>
<body> <body>
<math> <math>
<menclose> <menclose notation="">
<mn>123</mn>
</menclose>
<menclose notation="box">
<mn>123</mn> <mn>123</mn>
</menclose> </menclose>
</math> </math>

View file

@ -5,7 +5,7 @@
<title>Legacy menclose radical notation</title> <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://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"> <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="match" href="legacy-menclose-radical-notation-ref.html">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style> <style>
@ -19,6 +19,9 @@
<menclose notation="radical"> <menclose notation="radical">
<mn>123</mn> <mn>123</mn>
</menclose> </menclose>
<menclose notation="box radical">
<mn>123</mn>
</menclose>
</math> </math>
<script src="/mathml/support/feature-detection.js"></script> <script src="/mathml/support/feature-detection.js"></script>

View file

@ -14,16 +14,20 @@
const mrow = document.getElementById('mrow'); const mrow = document.getElementById('mrow');
assert_equals(mrow.tabIndex, -1, "no attribute"); assert_equals(mrow.tabIndex, -1, "no attribute");
mrow.setAttribute("tabindex", "invalid"); mrow.setAttribute("tabindex", "invalid");
assert_equals(mrow.getAttribute("tabindex"), "invalid");
assert_equals(mrow.tabIndex, -1, "invalid"); assert_equals(mrow.tabIndex, -1, "invalid");
mrow.setAttribute("tabindex", "9999999999"); mrow.setAttribute("tabindex", "9999999999");
assert_equals(mrow.getAttribute("tabindex"), "9999999999");
assert_equals(mrow.tabIndex, -1, "too large integer"); assert_equals(mrow.tabIndex, -1, "too large integer");
}, "default and invalid values on mrow"); }, "default and invalid values on mrow");
test(() => { test(() => {
const mrowLink = document.getElementById('mrow-link'); const mrowLink = document.getElementById('mrow-link');
assert_equals(mrow.tabIndex, 0, "no attribute"); assert_equals(mrow.tabIndex, 0, "no attribute");
mrow.setAttribute("tabindex", "invalid"); mrow.setAttribute("tabindex", "invalid");
assert_equals(mrow.getAttribute("tabindex"), "invalid");
assert_equals(mrow.tabIndex, 0, "invalid"); assert_equals(mrow.tabIndex, 0, "invalid");
mrow.setAttribute("tabindex", "9999999999"); mrow.setAttribute("tabindex", "9999999999");
assert_equals(mrow.getAttribute("tabindex"), "9999999999");
assert_equals(mrow.tabIndex, 0, "too large integer"); assert_equals(mrow.tabIndex, 0, "too large integer");
}, "default and invalid values on MathML link"); }, "default and invalid values on MathML link");
}); });

View file

@ -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 recorders
* [[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>

View file

@ -20,8 +20,8 @@
var recorder = new MediaRecorder(stream); var recorder = new MediaRecorder(stream);
assert_equals(recorder.state, "inactive"); assert_equals(recorder.state, "inactive");
assert_equals(recorder.videoBitsPerSecond, 0); assert_not_equals(recorder.videoBitsPerSecond, 0);
assert_equals(recorder.audioBitsPerSecond, 0); assert_not_equals(recorder.audioBitsPerSecond, 0);
test.done(); test.done();
}); });

View file

@ -36,23 +36,21 @@
}); });
recorderOnDataAvailable = test.step_func(event => { 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(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() { recorderOnStop = test.step_func(function() {
assert_equals(recorder.state, "inactive"); assert_equals(recorder.state, "inactive");
assert_throws("InvalidStateError", function() { recorder.stop() }, recorder.onstop = recorderOnUnexpectedEvent;
"recorder cannot be stop()ped in |inactive| state"); recorder.stop();
assert_equals(recorder.state, "inactive", "stop() is idempotent");
assert_throws("InvalidStateError", function() { recorder.pause() }, assert_throws("InvalidStateError", function() { recorder.pause() },
"recorder cannot be pause()ed in |inactive| state"); "recorder cannot be pause()ed in |inactive| state");
assert_throws("InvalidStateError", function() { recorder.resume() }, assert_throws("InvalidStateError", function() { recorder.resume() },
"recorder cannot be resume()d in |inactive| state"); "recorder cannot be resume()d in |inactive| state");
assert_throws("InvalidStateError", function() { recorder.requestData() }, assert_throws("InvalidStateError", function() { recorder.requestData() },
"cannot requestData() if recorder is in |inactive| state"); "cannot requestData() if recorder is in |inactive| state");
recorder.onstop = recorderOnUnexpectedEvent;
test.done(); test.done();
}); });
@ -84,15 +82,15 @@
assert_throws("NotSupportedError", assert_throws("NotSupportedError",
function() { function() {
recorder = recorder = new MediaRecorder(
new MediaRecorder(stream, {mimeType : "video/invalid"}); new MediaStream(), {mimeType : "video/invalid"});
}, },
"recorder should throw() with unsupported mimeType"); "recorder should throw() with unsupported mimeType");
let recorder = new MediaRecorder(stream); let recorder = new MediaRecorder(new MediaStream());
assert_equals(recorder.state, "inactive"); assert_equals(recorder.state, "inactive");
assert_throws("InvalidStateError", function(){recorder.stop()}, recorder.stop();
"recorder cannot be stop()ped in |inactive| state"); assert_equals(recorder.state, "inactive", "stop() is idempotent");
assert_throws("InvalidStateError", function(){recorder.pause()}, assert_throws("InvalidStateError", function(){recorder.pause()},
"recorder cannot be pause()ed in |inactive| state"); "recorder cannot be pause()ed in |inactive| state");
assert_throws("InvalidStateError", function(){recorder.resume()}, assert_throws("InvalidStateError", function(){recorder.resume()},
@ -100,6 +98,14 @@
assert_throws("InvalidStateError", function(){recorder.requestData()}, assert_throws("InvalidStateError", function(){recorder.requestData()},
"cannot requestData() if recorder is in |inactive| state"); "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(); drawSomethingOnCanvas();
recorder.onstop = recorderOnUnexpectedEvent; recorder.onstop = recorderOnUnexpectedEvent;

View file

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

View file

@ -11,8 +11,10 @@
</canvas> </canvas>
<script> <script>
function createVideoStream() { function createVideoStream() {
let canvas = document.getElementById("canvas"); const canvas = document.getElementById("canvas");
canvas.getContext('2d'); const ctx = canvas.getContext('2d');
ctx.fillStyle = 'green';
ctx.fillRect(0, 0, canvas.width, canvas.height);
return canvas.captureStream(); return canvas.captureStream();
} }
@ -32,6 +34,7 @@
recorder.start(); recorder.start();
assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully"); assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully");
await new Promise(r => recorder.onstart = r);
recorder.pause(); recorder.pause();
assert_equals(recorder.state, "paused", "MediaRecorder should be paused immediately following pause()"); assert_equals(recorder.state, "paused", "MediaRecorder should be paused immediately following pause()");

View file

@ -7,7 +7,7 @@
idl_test( idl_test(
['mediastream-recording'], ['mediastream-recording'],
['mediacapture-streams', 'FileAPI', 'html', 'dom'], ['mediacapture-streams', 'FileAPI', 'html', 'dom', 'WebIDL'],
idl_array => { idl_array => {
// Ignored errors will be surfaced in idlharness.js's test_object below. // Ignored errors will be surfaced in idlharness.js's test_object below.
let recorder, blob, error; let recorder, blob, error;
@ -31,7 +31,9 @@ idl_test(
idl_array.add_objects({ BlobEvent: [blob] }); idl_array.add_objects({ BlobEvent: [blob] });
try { try {
error = new MediaRecorderErrorEvent("type", {}); error = new MediaRecorderErrorEvent("type", {
error: new DOMException,
});
} catch(e) {} } catch(e) {}
idl_array.add_objects({ MediaRecorderErrorEvent: [error] }); idl_array.add_objects({ MediaRecorderErrorEvent: [error] });
} }

View file

@ -89,7 +89,7 @@ class MockVRService {
this.runtimes_ = []; this.runtimes_ = [];
this.interceptor_ = this.interceptor_ =
new MojoInterfaceInterceptor(device.mojom.VRService.name); new MojoInterfaceInterceptor(device.mojom.VRService.name, "context", true);
this.interceptor_.oninterfacerequest = e => this.interceptor_.oninterfacerequest = e =>
this.bindingSet_.addBinding(this, e.handle); this.bindingSet_.addBinding(this, e.handle);
this.interceptor_.start(); this.interceptor_.start();
@ -187,6 +187,15 @@ class MockVRService {
// Implements XRFrameDataProvider and XRPresentationProvider. Maintains a mock // Implements XRFrameDataProvider and XRPresentationProvider. Maintains a mock
// for XRPresentationProvider. // for XRPresentationProvider.
class MockRuntime { 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) { constructor(fakeDeviceInit, service) {
this.sessionClient_ = new device.mojom.XRSessionClientPtr(); this.sessionClient_ = new device.mojom.XRSessionClientPtr();
this.presentation_provider_ = new MockXRPresentationProvider(); this.presentation_provider_ = new MockXRPresentationProvider();
@ -456,19 +465,10 @@ class MockRuntime {
setFeatures(supportedFeatures) { setFeatures(supportedFeatures) {
function convertFeatureToMojom(feature) { function convertFeatureToMojom(feature) {
switch (feature) { if (feature in MockRuntime.featureToMojoMap) {
case "viewer": return MockRuntime.featureToMojoMap[feature];
return device.mojom.XRSessionFeature.REF_SPACE_VIEWER; } else {
case "local": return device.mojom.XRSessionFeature.INVALID;
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;
} }
} }

View file

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

View file

@ -17,7 +17,7 @@ async_test((t) => {
assert_true('serviceWorker' in self, 'self.serviceWorker exists'); assert_true('serviceWorker' in self, 'self.serviceWorker exists');
serviceWorker.postMessage({ messageTest: true }); 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) => { addEventListener('message', t.step_func((event) => {
// Ignore unrelated messages. // Ignore unrelated messages.
if (!event.data.messageTest) return; if (!event.data.messageTest) return;

View file

@ -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');

View file

@ -145,6 +145,28 @@ def install_chrome(channel):
run(["sudo", "apt-get", "-qqy", "update"]) run(["sudo", "apt-get", "-qqy", "update"])
run(["sudo", "gdebi", "-qn", "/tmp/%s" % deb_archive]) 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(): def start_xvfb():
start(["sudo", "Xvfb", os.environ["DISPLAY"], "-screen", "0", start(["sudo", "Xvfb", os.environ["DISPLAY"], "-screen", "0",
@ -217,6 +239,9 @@ def setup_environment(args):
if "chrome" in args.browser: if "chrome" in args.browser:
assert args.channel is not None assert args.channel is not None
install_chrome(args.channel) install_chrome(args.channel)
elif "webkitgtk_minibrowser" in args.browser:
assert args.channel is not None
install_webkitgtk(args.channel)
if args.xvfb: if args.xvfb:
start_xvfb() start_xvfb()

View file

@ -7,9 +7,13 @@ FROM debian:10
ENV DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND=noninteractive \
DEBCONF_NONINTERACTIVE_SEEN=true DEBCONF_NONINTERACTIVE_SEEN=true
# Install general requirements not in the base image
# Update and upgrade.
RUN apt-get -qqy update \ 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 \ bzip2 \
ca-certificates \ ca-certificates \
dbus-x11 \ dbus-x11 \
@ -29,19 +33,10 @@ RUN apt-get -qqy update \
xvfb \ xvfb \
git-core 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 # To speed up testers, cache in the image most of WebKitGTK dependencies
RUN apt-get update \ # but don't install them (that will be done at test time)
&& apt-get -y upgrade RUN apt-get install -qqy --download-only webkit2gtk-driver
# Install webkit packages from https://webkitgtk.org/debian
RUN apt-get install -y -t buster-wpt-webkit-updates webkit2gtk-driver
# Set the timezone # Set the timezone
ENV TZ "UTC" ENV TZ "UTC"

View file

@ -15,5 +15,3 @@ To update the image used for WebKitGTK:
docker build -f Dockerfile.webkitgtk -t <tag> . docker build -f Dockerfile.webkitgtk -t <tag> .
docker push <tag> docker push <tag>
``` ```
(This image is not yet used in .taskcluster.yml.)

View file

@ -36,6 +36,20 @@ def cmd_arg(name, value=None):
return rv 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(): def get_free_port():
"""Get a random unbound port""" """Get a random unbound port"""
while True: while True:

View file

@ -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 .webkit import WebKitBrowser
from ..executors import executor_kwargs as base_executor_kwargs from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 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): 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"], return {"binary": kwargs["binary"],
"webdriver_binary": kwargs["webdriver_binary"], "webdriver_binary": kwargs["webdriver_binary"],
"webdriver_args": kwargs.get("webdriver_args")} "webdriver_args": webdriver_args}
def capabilities(server_config, **kwargs): def capabilities(server_config, **kwargs):

View file

@ -181,7 +181,7 @@ def run_info_browser_version(binary):
def update_properties(): def update_properties():
return (["os", "debug", "webrender", "e10s", "sw-e10s", "processor"], return (["os", "debug", "webrender", "fisson", "e10s", "sw-e10s", "processor"],
{"os": ["version"], "processor": ["bits"]}) {"os": ["version"], "processor": ["bits"]})

View file

@ -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 .webkit import WebKitBrowser
from ..executors import executor_kwargs as base_executor_kwargs from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 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): 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"], return {"binary": kwargs["binary"],
"webdriver_binary": kwargs["webdriver_binary"], "webdriver_binary": kwargs["webdriver_binary"],
"webdriver_args": kwargs.get("webdriver_args")} "webdriver_args": webdriver_args}
def capabilities(server_config, **kwargs): 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", []) args = kwargs.get("binary_args", [])
if "--automation" not in args: args = maybe_add_args(browser_required_args, args)
args.append("--automation")
return { return {
"browserName": "MiniBrowser", "browserName": "MiniBrowser",
"webkitgtk:browserOptions": { "webkitgtk:browserOptions": {

View file

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

View file

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

View file

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