Auto merge of #24381 - servo-wpt-sync:wpt_update_06-10-2019, r=servo-wpt-sync

Sync WPT with upstream (06-10-2019)

Automated downstream sync of changes from upstream as of 06-10-2019.
[no-wpt-sync]
r? @servo-wpt-sync
This commit is contained in:
bors-servo 2019-10-06 10:35:17 -04:00 committed by GitHub
commit 0b5aaeff5d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
67 changed files with 1485 additions and 146 deletions

View file

@ -7,7 +7,7 @@
expected: FAIL
[Opening a blob URL in a new window immediately before revoking it works.]
expected: TIMEOUT
expected: FAIL
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: FAIL

View file

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

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

View file

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

View file

@ -1,5 +1,4 @@
[perspective-interpolation.html]
expected: CRASH
[ perspective interpolation]
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]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*]
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL

View file

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

View file

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

View file

@ -764,9 +764,6 @@
[OffscreenCanvasRenderingContext2D interface: attribute miterLimit]
expected: FAIL
[MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type]
expected: FAIL
[Path2D interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
@ -1585,9 +1582,6 @@
[Window interface: operation prompt(DOMString, DOMString)]
expected: FAIL
[Window interface: window must inherit property "self" with the proper type]
expected: FAIL
[Document interface: documentWithHandlers must inherit property "dir" with the proper type]
expected: FAIL
@ -1660,9 +1654,6 @@
[Window interface: window must inherit property "onauxclick" with the proper type]
expected: FAIL
[Window interface: window must inherit property "parent" with the proper type]
expected: FAIL
[Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError]
expected: FAIL
@ -1672,9 +1663,6 @@
[Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
[Window interface: window must inherit property "frames" with the proper type]
expected: FAIL
[Window interface: window must inherit property "onformdata" with the proper type]
expected: FAIL
@ -1747,9 +1735,6 @@
[Document interface: new Document() must inherit property "alinkColor" with the proper type]
expected: FAIL
[Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type]
expected: FAIL
[Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL

View file

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

View file

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

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]
expected: TIMEOUT
expected: CRASH
[Test that iframe navigations are not observable by the parent, even after history navigations by the parent]
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]
expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
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:
$match: {
event.ref == "refs/heads/master": [{name: firefox, channel: nightly}, {name: chrome, channel: dev}],
event.ref == "refs/heads/epochs/daily": [{name: firefox, channel: stable}, {name: chrome, channel: stable}],
event.ref == "refs/heads/epochs/daily": [{name: firefox, channel: stable}, {name: chrome, channel: stable}, {name: webkitgtk_minibrowser, channel: stable}],
event.ref == "refs/heads/epochs/weekly": [{name: firefox, channel: beta}, {name: chrome, channel: beta}],
event.ref == "refs/heads/triggers/chrome_stable": [{name: chrome, channel: stable}],
event.ref == "refs/heads/triggers/chrome_beta": [{name: chrome, channel: beta}],
event.ref == "refs/heads/triggers/chrome_dev": [{name: chrome, channel: dev}],
event.ref == "refs/heads/triggers/firefox_stable": [{name: firefox, channel: stable}],
event.ref == "refs/heads/triggers/firefox_beta": [{name: firefox, channel: beta}],
event.ref == "refs/heads/triggers/firefox_nightly": [{name: firefox, channel: nightly}]
}
event.ref == "refs/heads/triggers/firefox_nightly": [{name: firefox, channel: nightly}],
event.ref == "refs/heads/triggers/webkitgtk_minibrowser_stable": [{name: webkitgtk_minibrowser, channel: stable}]
}
each(browser):
$map:
- [testharness, 1, 15]
@ -70,7 +71,12 @@ tasks:
owner: ${event.pusher.email}
source: ${event.repository.url}
payload:
image: harjgam/web-platform-tests:0.33
image:
$if: browser.name == 'webkitgtk_minibrowser'
then:
cl0p3z/web-platform-tests:0.1
else:
harjgam/web-platform-tests:0.33
maxRunTime: 7200
artifacts:
public/results:

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)
.then(r => r.text())
.then(t => {
frameContnent = t;
frameContent = t;
iframe = createElement("iframe", {}, document.body, true);
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');
contactsTestWithUserActivation(async (test, setSelectedContacts) => {
setSelectedContacts([]);
const properties = await navigator.contacts.getProperties();
assert_true(properties.length > 0);
// Requesting the available properties should not fail.
await navigator.contacts.select(properties);
}, 'Supported contact properties are exposed.');
contactsTestWithUserActivation(async (test, setSelectedContacts) => {
// Returns two contacts with all information available.
setSelectedContacts([

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>
<div class="column-span">column-span1</div>
<article>
<div class="container" style="border-top: none; height: 50px;">
<div class="container" style="border-top: none; height: 50px; margin-bottom: 1em;">
<div class="block">block2</div>
</div>
</article>

View file

@ -19,6 +19,7 @@
background-color: pink;
border: 20px solid purple;
margin-top: 1em;
margin-bottom: 1em;
}
div.block {
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
inline_width is constrained by left/right, height computed proportionally -->
<div class="container">
<img class="target" style="left:100px;right:100px" src="data:image/svg+xml,%3Csvg viewBox='0 0 100 10' xmlns='http://www.w3.org/2000/svg' %3E%3Crect width='100%' height='100%' style='fill:rgb(0,255,0);'/%3E%3C/svg%3E"
<img class="target" style="left:100px;right:100px;" src="data:image/svg+xml,%3Csvg viewBox='0 0 100 10' xmlns='http://www.w3.org/2000/svg' %3E%3Crect width='100%' height='100%' style='fill:rgb(0,255,0);'/%3E%3C/svg%3E"
data-expected-width="188" data-expected-height="47" data-offset-y="146" data-offset-x="109"
>
</div>
<!-- Same as previous test, but with max-width:fit-content. crbug.com/1010798
-->
<div class="container">
<img class="target" style="left:100px;right:100px;max-width:fit-content" src="data:image/svg+xml,%3Csvg viewBox='0 0 100 10' xmlns='http://www.w3.org/2000/svg' %3E%3Crect width='100%' height='100%' style='fill:rgb(0,255,0);'/%3E%3C/svg%3E"
data-expected-width="188" data-expected-height="47" data-offset-y="146" data-offset-x="109"
>
</div>

View file

@ -18,15 +18,3 @@ to run it manually you can find it on any of this paths:
inside:
`/usr/lib/${TRIPLET}/webkit2gtk-4.0/MiniBrowser`
where `TRIPLET=$(gcc -dumpmachine)`
Known issues:
* On a docker container WebKitWebDriver fails to listen on localhost,
because the docker container doesn't provide an IPv6 localhost address.
To workaround this issue, manually tell it to only listen on IPv4 localhost
by passing this parameter to wpt run: `--webdriver-arg=--host=127.0.0.1`
Example:
```bash
./wpt run --webdriver-arg=--host=127.0.0.1 webkitgtk_minibrowser TESTS
```

View file

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

View file

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

View file

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

View file

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

View file

@ -5,7 +5,7 @@
<title>Legacy menclose radical notation</title>
<link rel="help" href="https://www.w3.org/TR/MathML3/chapter3.html#presm.menclose">
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#enclose-expression-inside-notation-menclose">
<meta name="assert" content="Verify that the legacy menclose radical notation is not supported.">
<meta name="assert" content="Verify that the legacy menclose radical notation is ignored.">
<link rel="match" href="legacy-menclose-radical-notation-ref.html">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
@ -19,6 +19,9 @@
<menclose notation="radical">
<mn>123</mn>
</menclose>
<menclose notation="box radical">
<mn>123</mn>
</menclose>
</math>
<script src="/mathml/support/feature-detection.js"></script>

View file

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

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);
assert_equals(recorder.state, "inactive");
assert_equals(recorder.videoBitsPerSecond, 0);
assert_equals(recorder.audioBitsPerSecond, 0);
assert_not_equals(recorder.videoBitsPerSecond, 0);
assert_not_equals(recorder.audioBitsPerSecond, 0);
test.done();
});

View file

@ -36,23 +36,21 @@
});
recorderOnDataAvailable = test.step_func(event => {
// TODO(mcasas): ondataavailable might never be pinged with an empty Blob
// data on recorder.stop(), see http://crbug.com/54428
assert_equals(recorder.state, "inactive");
assert_equals(event.data.size, 0, 'We should have gotten an empty Blob');
assert_not_equals(event.data.size, 0, 'We should get a Blob with data');
});
recorderOnStop = test.step_func(function() {
assert_equals(recorder.state, "inactive");
assert_throws("InvalidStateError", function() { recorder.stop() },
"recorder cannot be stop()ped in |inactive| state");
recorder.onstop = recorderOnUnexpectedEvent;
recorder.stop();
assert_equals(recorder.state, "inactive", "stop() is idempotent");
assert_throws("InvalidStateError", function() { recorder.pause() },
"recorder cannot be pause()ed in |inactive| state");
assert_throws("InvalidStateError", function() { recorder.resume() },
"recorder cannot be resume()d in |inactive| state");
assert_throws("InvalidStateError", function() { recorder.requestData() },
"cannot requestData() if recorder is in |inactive| state");
recorder.onstop = recorderOnUnexpectedEvent;
test.done();
});
@ -84,15 +82,15 @@
assert_throws("NotSupportedError",
function() {
recorder =
new MediaRecorder(stream, {mimeType : "video/invalid"});
recorder = new MediaRecorder(
new MediaStream(), {mimeType : "video/invalid"});
},
"recorder should throw() with unsupported mimeType");
let recorder = new MediaRecorder(stream);
let recorder = new MediaRecorder(new MediaStream());
assert_equals(recorder.state, "inactive");
assert_throws("InvalidStateError", function(){recorder.stop()},
"recorder cannot be stop()ped in |inactive| state");
recorder.stop();
assert_equals(recorder.state, "inactive", "stop() is idempotent");
assert_throws("InvalidStateError", function(){recorder.pause()},
"recorder cannot be pause()ed in |inactive| state");
assert_throws("InvalidStateError", function(){recorder.resume()},
@ -100,6 +98,14 @@
assert_throws("InvalidStateError", function(){recorder.requestData()},
"cannot requestData() if recorder is in |inactive| state");
assert_throws("NotSupportedError",
function() {
recorder.start();
},
"recorder should throw() when starting with inactive stream");
recorder.stream.addTrack(stream.getTracks()[0]);
drawSomethingOnCanvas();
recorder.onstop = recorderOnUnexpectedEvent;

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

View file

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

View file

@ -89,7 +89,7 @@ class MockVRService {
this.runtimes_ = [];
this.interceptor_ =
new MojoInterfaceInterceptor(device.mojom.VRService.name);
new MojoInterfaceInterceptor(device.mojom.VRService.name, "context", true);
this.interceptor_.oninterfacerequest = e =>
this.bindingSet_.addBinding(this, e.handle);
this.interceptor_.start();
@ -187,6 +187,15 @@ class MockVRService {
// Implements XRFrameDataProvider and XRPresentationProvider. Maintains a mock
// for XRPresentationProvider.
class MockRuntime {
// Mapping from string feature names to the corresponding mojo types.
// This is exposed as a member for extensibility.
static featureToMojoMap = {
"viewer": device.mojom.XRSessionFeature.REF_SPACE_VIEWER,
"local": device.mojom.XRSessionFeature.REF_SPACE_LOCAL,
"local-floor": device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR,
"bounded-floor": device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR,
"unbounded": device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED };
constructor(fakeDeviceInit, service) {
this.sessionClient_ = new device.mojom.XRSessionClientPtr();
this.presentation_provider_ = new MockXRPresentationProvider();
@ -456,19 +465,10 @@ class MockRuntime {
setFeatures(supportedFeatures) {
function convertFeatureToMojom(feature) {
switch (feature) {
case "viewer":
return device.mojom.XRSessionFeature.REF_SPACE_VIEWER;
case "local":
return device.mojom.XRSessionFeature.REF_SPACE_LOCAL;
case "local-floor":
return device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR;
case "bounded-floor":
return device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR;
case "unbounded":
return device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED;
default:
return device.mojom.XRSessionFeature.INVALID;
if (feature in MockRuntime.featureToMojoMap) {
return MockRuntime.featureToMojoMap[feature];
} else {
return device.mojom.XRSessionFeature.INVALID;
}
}

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');
serviceWorker.postMessage({ messageTest: true });
// The rest of the rest runs once we receive the above message.
// The rest of the test runs once this receives the above message.
addEventListener('message', t.step_func((event) => {
// Ignore unrelated messages.
if (!event.data.messageTest) return;

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", "gdebi", "-qn", "/tmp/%s" % deb_archive])
def install_webkitgtk_from_apt_repository(channel):
# Configure webkitgtk.org/debian repository for $channel and pin it with maximum priority
run(["sudo", "apt-key", "adv", "--fetch-keys", "https://webkitgtk.org/debian/apt.key"])
with open("/tmp/webkitgtk.list", "w") as f:
f.write("deb [arch=amd64] https://webkitgtk.org/debian buster-wpt-webkit-updates %s\n" % channel)
run(["sudo", "mv", "/tmp/webkitgtk.list", "/etc/apt/sources.list.d/"])
with open("/tmp/99webkitgtk", "w") as f:
f.write("Package: *\nPin: origin webkitgtk.org\nPin-Priority: 1999\n")
run(["sudo", "mv", "/tmp/99webkitgtk", "/etc/apt/preferences.d/"])
# Install webkit2gtk from the webkitgtk.org/debian repository for $channel
run(["sudo", "apt-get", "-qqy", "update"])
run(["sudo", "apt-get", "-qqy", "upgrade"])
run(["sudo", "apt-get", "-qqy", "-t", "buster-wpt-webkit-updates", "install", "webkit2gtk-driver"])
def install_webkitgtk(channel):
if channel in ("experimental", "dev", "nightly"):
raise NotImplementedError("Still can't install from release channel: %s" % channel)
elif channel in ("beta", "stable"):
install_webkitgtk_from_apt_repository(channel)
else:
raise ValueError("Unrecognized release channel: %s" % channel)
def start_xvfb():
start(["sudo", "Xvfb", os.environ["DISPLAY"], "-screen", "0",
@ -217,6 +239,9 @@ def setup_environment(args):
if "chrome" in args.browser:
assert args.channel is not None
install_chrome(args.channel)
elif "webkitgtk_minibrowser" in args.browser:
assert args.channel is not None
install_webkitgtk(args.channel)
if args.xvfb:
start_xvfb()

View file

@ -7,9 +7,13 @@ FROM debian:10
ENV DEBIAN_FRONTEND=noninteractive \
DEBCONF_NONINTERACTIVE_SEEN=true
# Install general requirements not in the base image
# Update and upgrade.
RUN apt-get -qqy update \
&& apt-get -qqy install \
&& apt-get -qqy upgrade
# Install general requirements not in the base image
RUN apt-get -qqy install \
bzip2 \
ca-certificates \
dbus-x11 \
@ -29,19 +33,10 @@ RUN apt-get -qqy update \
xvfb \
git-core
# Configure buster-wpt-webkit-updates repository
RUN apt-key adv --fetch-keys https://webkitgtk.org/debian/apt.key
RUN printf 'deb [arch=amd64] https://webkitgtk.org/debian buster-wpt-webkit-updates main' \
> /etc/apt/sources.list.d/webkitgtk.list
RUN printf 'Package: *\nPin: origin webkitgtk.org\nPin-Priority: 1999' \
> /etc/apt/preferences.d/99webkitgtk
# Update and upgrade
RUN apt-get update \
&& apt-get -y upgrade
# Install webkit packages from https://webkitgtk.org/debian
RUN apt-get install -y -t buster-wpt-webkit-updates webkit2gtk-driver
# To speed up testers, cache in the image most of WebKitGTK dependencies
# but don't install them (that will be done at test time)
RUN apt-get install -qqy --download-only webkit2gtk-driver
# Set the timezone
ENV TZ "UTC"

View file

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

View file

@ -36,6 +36,20 @@ def cmd_arg(name, value=None):
return rv
def maybe_add_args(required_args, current_args):
for required_arg in required_args:
# If the arg is in the form of "variable=value", only add it if
# no arg with another value for "variable" is already there.
if "=" in required_arg:
required_arg_prefix = "%s=" % required_arg.split("=")[0]
if not any(item.startswith(required_arg_prefix) for item in current_args):
current_args.append(required_arg)
else:
if required_arg not in current_args:
current_args.append(required_arg)
return current_args
def get_free_port():
"""Get a random unbound port"""
while True:

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 ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
@ -24,9 +24,12 @@ def check_args(**kwargs):
def browser_kwargs(test_type, run_info_data, config, **kwargs):
# Workaround for https://gitlab.gnome.org/GNOME/libsoup/issues/172
webdriver_required_args = ["--host=127.0.0.1"]
webdriver_args = maybe_add_args(webdriver_required_args, kwargs.get("webdriver_args"))
return {"binary": kwargs["binary"],
"webdriver_binary": kwargs["webdriver_binary"],
"webdriver_args": kwargs.get("webdriver_args")}
"webdriver_args": webdriver_args}
def capabilities(server_config, **kwargs):

View file

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

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 ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
@ -24,16 +24,25 @@ def check_args(**kwargs):
def browser_kwargs(test_type, run_info_data, config, **kwargs):
# Workaround for https://gitlab.gnome.org/GNOME/libsoup/issues/172
webdriver_required_args = ["--host=127.0.0.1"]
webdriver_args = maybe_add_args(webdriver_required_args, kwargs.get("webdriver_args"))
return {"binary": kwargs["binary"],
"webdriver_binary": kwargs["webdriver_binary"],
"webdriver_args": kwargs.get("webdriver_args")}
"webdriver_args": webdriver_args}
def capabilities(server_config, **kwargs):
browser_required_args = ["--automation",
"--javascript-can-open-windows-automatically=true",
"--enable-xss-auditor=false",
"--enable-media-capabilities=true",
"--enable-encrypted-media=true",
"--enable-media-stream=true",
"--enable-mock-capture-devices=true",
"--enable-webaudio=true"]
args = kwargs.get("binary_args", [])
if "--automation" not in args:
args.append("--automation")
args = maybe_add_args(browser_required_args, args)
return {
"browserName": "MiniBrowser",
"webkitgtk:browserOptions": {

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>