Update web-platform-tests to revision cd44958a002b1ad494168e0290554644de84526e

This commit is contained in:
WPT Sync Bot 2018-11-07 21:06:07 -05:00
parent 2ed23ce4c9
commit 4443426308
103 changed files with 1740 additions and 1138 deletions

View file

@ -182949,78 +182949,6 @@
{} {}
] ]
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-1.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-1.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-1-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2a.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2a.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2b.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2b.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2c.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2c.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2d.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2d.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2e.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2e.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-containing-block-dynamic-1a.html": [ "css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-containing-block-dynamic-1a.html": [
[ [
"/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-containing-block-dynamic-1a.html", "/css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-containing-block-dynamic-1a.html",
@ -190669,6 +190597,18 @@
{} {}
] ]
], ],
"quirks/vertical-align-in-quirks.html": [
[
"/quirks/vertical-align-in-quirks.html",
[
[
"/quirks/reference/vertical-align-in-quirks-ref.html",
"=="
]
],
{}
]
],
"service-workers/service-worker/svg-target-reftest.https.html": [ "service-workers/service-worker/svg-target-reftest.https.html": [
[ [
"/service-workers/service-worker/svg-target-reftest.https.html", "/service-workers/service-worker/svg-target-reftest.https.html",
@ -280254,16 +280194,6 @@
{} {}
] ]
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-1-ref.html": [
[
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html": [
[
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-untransformable-no-stacking-context-ref.html": [ "css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-untransformable-no-stacking-context-ref.html": [
[ [
{} {}
@ -299649,6 +299579,11 @@
{} {}
] ]
], ],
"quirks/reference/vertical-align-in-quirks-ref.html": [
[
{}
]
],
"quirks/support/test-ref-iframe.js": [ "quirks/support/test-ref-iframe.js": [
[ [
{} {}
@ -307279,6 +307214,11 @@
{} {}
] ]
], ],
"streams/piping/abort.js": [
[
{}
]
],
"streams/piping/close-propagation-backward.js": [ "streams/piping/close-propagation-backward.js": [
[ [
{} {}
@ -346788,6 +346728,24 @@
{} {}
] ]
], ],
"css/filter-effects/parsing/backdrop-filter-computed.html": [
[
"/css/filter-effects/parsing/backdrop-filter-computed.html",
{}
]
],
"css/filter-effects/parsing/backdrop-filter-parsing-invalid.html": [
[
"/css/filter-effects/parsing/backdrop-filter-parsing-invalid.html",
{}
]
],
"css/filter-effects/parsing/backdrop-filter-parsing-valid.html": [
[
"/css/filter-effects/parsing/backdrop-filter-parsing-valid.html",
{}
]
],
"css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html": [ "css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html": [
[ [
"/css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html", "/css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html",
@ -359623,25 +359581,33 @@
"feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html": [ "feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html": [
[ [
"/feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html", "/feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html",
{} {
"timeout": "long"
}
] ]
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html": [ "feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html": [
[ [
"/feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html", "/feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html",
{} {
"timeout": "long"
}
] ]
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html": [ "feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html": [
[ [
"/feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html", "/feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html",
{} {
"timeout": "long"
}
] ]
], ],
"feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html": [ "feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html": [
[ [
"/feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html", "/feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html",
{} {
"timeout": "long"
}
] ]
], ],
"feature-policy/feature-policy-header-policy-allowed-for-all.https.sub.html": [ "feature-policy/feature-policy-header-policy-allowed-for-all.https.sub.html": [
@ -376654,6 +376620,12 @@
{} {}
] ]
], ],
"mediacapture-streams/MediaDevices-SecureContext.html": [
[
"/mediacapture-streams/MediaDevices-SecureContext.html",
{}
]
],
"mediacapture-streams/MediaDevices-enumerateDevices.https.html": [ "mediacapture-streams/MediaDevices-enumerateDevices.https.html": [
[ [
"/mediacapture-streams/MediaDevices-enumerateDevices.https.html", "/mediacapture-streams/MediaDevices-enumerateDevices.https.html",
@ -402614,6 +402586,30 @@
{} {}
] ]
], ],
"streams/piping/abort.dedicatedworker.html": [
[
"/streams/piping/abort.dedicatedworker.html",
{}
]
],
"streams/piping/abort.html": [
[
"/streams/piping/abort.html",
{}
]
],
"streams/piping/abort.serviceworker.https.html": [
[
"/streams/piping/abort.serviceworker.https.html",
{}
]
],
"streams/piping/abort.sharedworker.html": [
[
"/streams/piping/abort.sharedworker.html",
{}
]
],
"streams/piping/close-propagation-backward.dedicatedworker.html": [ "streams/piping/close-propagation-backward.dedicatedworker.html": [
[ [
"/streams/piping/close-propagation-backward.dedicatedworker.html", "/streams/piping/close-propagation-backward.dedicatedworker.html",
@ -404048,6 +404044,24 @@
{} {}
] ]
], ],
"svg/interact/inheritance.svg": [
[
"/svg/interact/inheritance.svg",
{}
]
],
"svg/interact/parsing/pointer-events-invalid.svg": [
[
"/svg/interact/parsing/pointer-events-invalid.svg",
{}
]
],
"svg/interact/parsing/pointer-events-valid.svg": [
[
"/svg/interact/parsing/pointer-events-valid.svg",
{}
]
],
"svg/linking/scripted/a-download-click.svg": [ "svg/linking/scripted/a-download-click.svg": [
[ [
"/svg/linking/scripted/a-download-click.svg", "/svg/linking/scripted/a-download-click.svg",
@ -409264,15 +409278,15 @@
{} {}
] ]
], ],
"webrtc/RTCRtpTransceiver-setCodecPreferences.html": [ "webrtc/RTCRtpTransceiver-direction.html": [
[ [
"/webrtc/RTCRtpTransceiver-setCodecPreferences.html", "/webrtc/RTCRtpTransceiver-direction.html",
{} {}
] ]
], ],
"webrtc/RTCRtpTransceiver-setDirection.html": [ "webrtc/RTCRtpTransceiver-setCodecPreferences.html": [
[ [
"/webrtc/RTCRtpTransceiver-setDirection.html", "/webrtc/RTCRtpTransceiver-setCodecPreferences.html",
{} {}
] ]
], ],
@ -436918,7 +436932,7 @@
}, },
"paths": { "paths": {
".azure-pipelines.yml": [ ".azure-pipelines.yml": [
"f2a7b84f358e87013755bc27cc64f3f01c92bab1", "e5d247af94e87fc5bba0363d794ab9f060e14d82",
"support" "support"
], ],
".codecov.yml": [ ".codecov.yml": [
@ -436938,7 +436952,7 @@
"support" "support"
], ],
".taskcluster.yml": [ ".taskcluster.yml": [
"d29e686785234b1a5cc1c490ba7ea8efcb62674b", "bcac7f5abbc4b32be599475a5506df9e2e135abd",
"support" "support"
], ],
".travis.yml": [ ".travis.yml": [
@ -446938,7 +446952,7 @@
"support" "support"
], ],
"background-fetch/service_workers/sw-update-ui.js": [ "background-fetch/service_workers/sw-update-ui.js": [
"5dec087cd155b486b974f3a26c149fcd113380c3", "3848dc4402b71bed79b5f9662405acd03cf30f1e",
"support" "support"
], ],
"background-fetch/service_workers/sw.js": [ "background-fetch/service_workers/sw.js": [
@ -446946,7 +446960,7 @@
"support" "support"
], ],
"background-fetch/update-ui.https.window.js": [ "background-fetch/update-ui.https.window.js": [
"aed0bb86d26398aabc3688c6fee90c0cfc7d4206", "90d3c2e7ed423db877ff91693546cafc85bd9e65",
"testharness" "testharness"
], ],
"battery-status/META.yml": [ "battery-status/META.yml": [
@ -531146,7 +531160,7 @@
"testharness" "testharness"
], ],
"css/css-animations/KeyframeEffect-getKeyframes.tentative.html": [ "css/css-animations/KeyframeEffect-getKeyframes.tentative.html": [
"280f32a4852abaeb847092032fa49c9a6cb9797d", "81b0d18946440a34ed80e064ba9c9dd322d10f69",
"testharness" "testharness"
], ],
"css/css-animations/KeyframeEffect-target.tentative.html": [ "css/css-animations/KeyframeEffect-target.tentative.html": [
@ -532126,7 +532140,7 @@
"reftest" "reftest"
], ],
"css/css-backgrounds/background-size-001.html": [ "css/css-backgrounds/background-size-001.html": [
"b5cf0c84c6aa8af885ba21a2a5517a11caa74413", "3c9b9d5e55d320ed9a372fd43ed7723260288cf9",
"testharness" "testharness"
], ],
"css/css-backgrounds/background-size-002.html": [ "css/css-backgrounds/background-size-002.html": [
@ -585753,6 +585767,18 @@
"e7de16e8d62904986610a484b046a4caf0f161e3", "e7de16e8d62904986610a484b046a4caf0f161e3",
"testharness" "testharness"
], ],
"css/filter-effects/parsing/backdrop-filter-computed.html": [
"96de7b941bafda4e87c185148f6f11169e1d80a7",
"testharness"
],
"css/filter-effects/parsing/backdrop-filter-parsing-invalid.html": [
"4e6b74682c5d48583f221f03c10a99a52964afe3",
"testharness"
],
"css/filter-effects/parsing/backdrop-filter-parsing-valid.html": [
"2531b09a3283037c85e5fc377bc5517396191eb0",
"testharness"
],
"css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html": [ "css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html": [
"6fdf647a43d0deed2da93239e4e4b0fc3b66a16a", "6fdf647a43d0deed2da93239e4e4b0fc3b66a16a",
"testharness" "testharness"
@ -588422,11 +588448,11 @@
"support" "support"
], ],
"css/support/inheritance-testcommon.js": [ "css/support/inheritance-testcommon.js": [
"9f59cbbb6de304857175f7471bbbc253f21c4fa6", "9229f1268ea8e8ec8d83fca77665b17602aebf56",
"support" "support"
], ],
"css/support/parsing-testcommon.js": [ "css/support/parsing-testcommon.js": [
"b075882f89aae49b419220b234534241cde5fd42", "7ecd588aaf5160f121b9eb240f58d2739135c829",
"support" "support"
], ],
"css/support/pattern-grg-rgr-grg.png": [ "css/support/pattern-grg-rgr-grg.png": [
@ -594406,7 +594432,7 @@
"reftest" "reftest"
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/reftest.list": [ "css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/reftest.list": [
"75a318005ebe2eb9675a58e446e8a25659ac8039", "9a6799e9dcc2722fb99832f9955dbd1e0270cae0",
"support" "support"
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-001-ref.html": [ "css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-001-ref.html": [
@ -596293,38 +596319,6 @@
"34b66abdb143f3566cadba64d3fd8f66511528f3", "34b66abdb143f3566cadba64d3fd8f66511528f3",
"support" "support"
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-1-ref.html": [
"8a568d25d927a4bf768521b511c8507bc19f889e",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-1.html": [
"4f83e2eac47f5265b4b28ab7d66977f47f57ed1c",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2-ref.html": [
"ee956aa301f7afef1e863d60bc6edf949dd31038",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2a.html": [
"3f6c97386bae62103d66b208bdf0660f4f58b0f7",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2b.html": [
"94dac2f10ffc59cfc1d9c218d8b21991b627d52c",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2c.html": [
"f84ae2280650adc941464c3dec258674c89cdaa6",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2d.html": [
"5b5694f544e25bba345d03cbc2f44c00a8dd50ba",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/individual-transform-2e.html": [
"0350137bedefbf1491faf54a75115be08a858703",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-containing-block-dynamic-1a.html": [ "css/vendor-imports/mozilla/mozilla-central-reftests/transforms/perspective-containing-block-dynamic-1a.html": [
"51e76745b5a41320058aa3669499afa85ec41e72", "51e76745b5a41320058aa3669499afa85ec41e72",
"reftest" "reftest"
@ -596358,7 +596352,7 @@
"support" "support"
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/reftest.list": [ "css/vendor-imports/mozilla/mozilla-central-reftests/transforms/reftest.list": [
"33773a4c09f23797212a1e9077c155e2731d668f", "e4777148d4ba3ab83c4db9b2ae99a27db54b3041",
"support" "support"
], ],
"css/vendor-imports/mozilla/mozilla-central-reftests/transforms/transform-containing-block-dynamic-1a.html": [ "css/vendor-imports/mozilla/mozilla-central-reftests/transforms/transform-containing-block-dynamic-1a.html": [
@ -598146,7 +598140,7 @@
"support" "support"
], ],
"docs/_running-tests/safari.md": [ "docs/_running-tests/safari.md": [
"1fb5cb02359a9e5ee3e07485b547221ccb7faa1c", "ca73fd6073d6378ccd734598497c5c14dde90d40",
"support" "support"
], ],
"docs/_writing-tests/ahem.md": [ "docs/_writing-tests/ahem.md": [
@ -603150,7 +603144,7 @@
"manual" "manual"
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html": [ "feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html": [
"f3082c4200e41e9343728f7ae691a715b88099c8", "aede7e7876b197417d4fb6f156fda3285ac7e9a4",
"testharness" "testharness"
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html.sub.headers": [ "feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html.sub.headers": [
@ -603158,7 +603152,7 @@
"support" "support"
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html": [ "feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html": [
"d2d0d1301aacdd1088f179360c155c76f0f4a485", "b2b668256ff745bf41c26443b0703b76eab736cf",
"testharness" "testharness"
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html.sub.headers": [ "feature-policy/feature-policy-frame-policy-allowed-for-self.https.sub.html.sub.headers": [
@ -603166,7 +603160,7 @@
"support" "support"
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html": [ "feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html": [
"c777b2f769873f0f04f3ac8afad505f3b52ad7da", "9a020f9e6b5d513adaf2d36b25bd62b239789e50",
"testharness" "testharness"
], ],
"feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html.sub.headers": [ "feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html.sub.headers": [
@ -603174,7 +603168,7 @@
"support" "support"
], ],
"feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html": [ "feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html": [
"33fcb4bb29d65c7477076d139a8824d84e0c43af", "7ac821d88562295bef234974172e9d83c03d9e03",
"testharness" "testharness"
], ],
"feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html.sub.headers": [ "feature-policy/feature-policy-frame-policy-disallowed-for-all.https.sub.html.sub.headers": [
@ -608346,7 +608340,7 @@
"support" "support"
], ],
"html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/resources/message-opener.html": [ "html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/resources/message-opener.html": [
"12836f536f05766f628e65c57f835481c65264f9", "07662c63cd01337e3b6a53ce6001d187b719fbe7",
"support" "support"
], ],
"html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_1-1.html": [ "html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_1-1.html": [
@ -627621,6 +627615,10 @@
"1ed650e97c451ef1266fd8435e2260d6bf617b67", "1ed650e97c451ef1266fd8435e2260d6bf617b67",
"support" "support"
], ],
"mediacapture-streams/MediaDevices-SecureContext.html": [
"d0fc70ca0e84d4f02970b1fa81d649b96116c1c4",
"testharness"
],
"mediacapture-streams/MediaDevices-enumerateDevices.https.html": [ "mediacapture-streams/MediaDevices-enumerateDevices.https.html": [
"c66251a03f30f2100670d07508fcb449f8609510", "c66251a03f30f2100670d07508fcb449f8609510",
"testharness" "testharness"
@ -639165,6 +639163,10 @@
"987cc245ca220bd92108b6babe17d35733fd0697", "987cc245ca220bd92108b6babe17d35733fd0697",
"testharness" "testharness"
], ],
"quirks/reference/vertical-align-in-quirks-ref.html": [
"2395923cd2c5d391f386bb9483178fa0e35f8d79",
"support"
],
"quirks/support/test-ref-iframe.js": [ "quirks/support/test-ref-iframe.js": [
"e5df41d4249bc93b7458774524bf90f0a6f36be7", "e5df41d4249bc93b7458774524bf90f0a6f36be7",
"support" "support"
@ -639221,6 +639223,10 @@
"f2f7eab4e33858b571344940c67de9b50e18e119", "f2f7eab4e33858b571344940c67de9b50e18e119",
"support" "support"
], ],
"quirks/vertical-align-in-quirks.html": [
"1826d0152fb73c48238fb58ea6989fc270064296",
"reftest"
],
"referrer-policy/META.yml": [ "referrer-policy/META.yml": [
"a622289c0562dbac99de0a9dbd3b9a70e0783923", "a622289c0562dbac99de0a9dbd3b9a70e0783923",
"support" "support"
@ -650510,7 +650516,7 @@
"testharness" "testharness"
], ],
"service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [ "service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [
"d3b5a966d330412562fc6cbc614e4995f3d1260b", "9f34e5709eb3cb607dcd1b91ec80b51c3706dca6",
"testharness" "testharness"
], ],
"service-workers/service-worker/clients-matchall-on-evaluation.https.html": [ "service-workers/service-worker/clients-matchall-on-evaluation.https.html": [
@ -653425,6 +653431,26 @@
"22e5c786bbc4d755805f35eb0bdc957dad1c90db", "22e5c786bbc4d755805f35eb0bdc957dad1c90db",
"support" "support"
], ],
"streams/piping/abort.dedicatedworker.html": [
"231c3543d52892c3bb6352793e5865a80398afc8",
"testharness"
],
"streams/piping/abort.html": [
"d55e6f7074e3d216572e8b76e6bd7a921a5f672c",
"testharness"
],
"streams/piping/abort.js": [
"bb20ee30b396c99f050b400557e4883a5d373475",
"support"
],
"streams/piping/abort.serviceworker.https.html": [
"5c0809f0d0c1deba87a7675a6b3c2112d1d29e9f",
"testharness"
],
"streams/piping/abort.sharedworker.html": [
"8cdf8512c8112db0c9cdaa7fded5472841a65c5a",
"testharness"
],
"streams/piping/close-propagation-backward.dedicatedworker.html": [ "streams/piping/close-propagation-backward.dedicatedworker.html": [
"07f3875b2b0285411a7009fb87947989eab4c250", "07f3875b2b0285411a7009fb87947989eab4c250",
"testharness" "testharness"
@ -657049,6 +657075,18 @@
"288fdf8052ee47ec946ff2679c384d4aa56e0f60", "288fdf8052ee47ec946ff2679c384d4aa56e0f60",
"support" "support"
], ],
"svg/interact/inheritance.svg": [
"e67f19ed43529af5e34683b6853ae870435be014",
"testharness"
],
"svg/interact/parsing/pointer-events-invalid.svg": [
"1c09010f694d89fc7128617de2e3b3ec385d2145",
"testharness"
],
"svg/interact/parsing/pointer-events-valid.svg": [
"643ddba1664fd5d2155aec05af8518188fdc354c",
"testharness"
],
"svg/linking/reftests/href-a-element-attr-change.html": [ "svg/linking/reftests/href-a-element-attr-change.html": [
"c74b2e015613a09d1cecb5a0c3136d26f07e2a5b", "c74b2e015613a09d1cecb5a0c3136d26f07e2a5b",
"reftest" "reftest"
@ -658138,7 +658176,7 @@
"support" "support"
], ],
"tools/ci/tcdownload.py": [ "tools/ci/tcdownload.py": [
"8813dccc888881ac8e96a05b22b113d887de0463", "91c763a7acdd3416d7eff55407bf8f73b840d96a",
"support" "support"
], ],
"tools/ci/tests/test_jobs.py": [ "tools/ci/tests/test_jobs.py": [
@ -658414,11 +658452,11 @@
"support" "support"
], ],
"tools/py27-flake8.ini": [ "tools/py27-flake8.ini": [
"1a5ce431ca808eb1683cd3d1eaa70fd5fdf6524f", "99324b2aad14d921f469f52934f7ff9374a1d9ee",
"support" "support"
], ],
"tools/py36-flake8.ini": [ "tools/py36-flake8.ini": [
"9b01f22a3cdd25fc02d1334e5da99e71fa35bcb0", "4ad34105b917670c78255d72d6a39b052b779339",
"support" "support"
], ],
"tools/pytest.ini": [ "tools/pytest.ini": [
@ -658810,7 +658848,7 @@
"support" "support"
], ],
"tools/requirements_flake8.txt": [ "tools/requirements_flake8.txt": [
"6d6ee4d885a480addf06d4df057cd4e4e6a8575f", "d2e7dd64232ad76a71d00368d163957922aeedcb",
"support" "support"
], ],
"tools/runner/css/bootstrap-theme.min.css": [ "tools/runner/css/bootstrap-theme.min.css": [
@ -663166,7 +663204,7 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/fennec.py": [ "tools/wptrunner/wptrunner/browsers/fennec.py": [
"c783006cfa49857e236658ee17d1da3cf8c5bae4", "15396fba22c2a39a9ccfce439cf7e477dc5e1378",
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/firefox.py": [ "tools/wptrunner/wptrunner/browsers/firefox.py": [
@ -663210,7 +663248,7 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/browsers/webkit.py": [ "tools/wptrunner/wptrunner/browsers/webkit.py": [
"b09114a9a5444717157edb37c24add6ba99cf421", "19527a132c7d8c8c158f8b960560b3f1966b59d3",
"support" "support"
], ],
"tools/wptrunner/wptrunner/config.py": [ "tools/wptrunner/wptrunner/config.py": [
@ -663326,7 +663364,7 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/formatters.py": [ "tools/wptrunner/wptrunner/formatters.py": [
"1ea09dbe553713c799b40c1e40d98f8ee2d4d81a", "70cbef8c10b964a8b50590d39487c7543f87c3e4",
"support" "support"
], ],
"tools/wptrunner/wptrunner/manifestexpected.py": [ "tools/wptrunner/wptrunner/manifestexpected.py": [
@ -663406,7 +663444,7 @@
"support" "support"
], ],
"tools/wptrunner/wptrunner/tests/test_formatters.py": [ "tools/wptrunner/wptrunner/tests/test_formatters.py": [
"fc2ce5bc11161057a0fa110e6aa64a21cc0e8aad", "9e354f09db38d51804e50dde357cb2fc18e9caef",
"support" "support"
], ],
"tools/wptrunner/wptrunner/tests/test_products.py": [ "tools/wptrunner/wptrunner/tests/test_products.py": [
@ -663778,7 +663816,7 @@
"support" "support"
], ],
"tools/wptserve/wptserve/handlers.py": [ "tools/wptserve/wptserve/handlers.py": [
"7fbe4234ea0a252aaed07182fd3bed741c147285", "2dd01e29338115c1c4c6e4a35973835fe0193137",
"support" "support"
], ],
"tools/wptserve/wptserve/logger.py": [ "tools/wptserve/wptserve/logger.py": [
@ -663810,7 +663848,7 @@
"support" "support"
], ],
"tools/wptserve/wptserve/server.py": [ "tools/wptserve/wptserve/server.py": [
"53f093b8e3da07839b54361216d649a4f870e30d", "802ae9ca9a98feddcb68077985cf4be536d72f78",
"support" "support"
], ],
"tools/wptserve/wptserve/sslutils/__init__.py": [ "tools/wptserve/wptserve/sslutils/__init__.py": [
@ -666390,7 +666428,7 @@
"testharness" "testharness"
], ],
"web-animations/animation-model/animation-types/property-list.js": [ "web-animations/animation-model/animation-types/property-list.js": [
"0f84c376721d125afd8ec64a5689069273c68a68", "6ad90a356e483cbfbd94c2cb147e68417f75357e",
"support" "support"
], ],
"web-animations/animation-model/animation-types/property-types.js": [ "web-animations/animation-model/animation-types/property-types.js": [
@ -668366,15 +668404,15 @@
"wdspec" "wdspec"
], ],
"webdriver/tests/get_element_rect/__init__.py": [ "webdriver/tests/get_element_rect/__init__.py": [
"abf1a91367517107b3b690466a4b570c0a3b7cab", "8b137891791fe96927ad78e64b0aad7bded08bdc",
"support" "support"
], ],
"webdriver/tests/get_element_rect/get.py": [ "webdriver/tests/get_element_rect/get.py": [
"433e2f6bf8b428136a36b81138386e62eb257daf", "e3744c4bce574b5c673b767a031b3a46185e4843",
"wdspec" "wdspec"
], ],
"webdriver/tests/get_element_rect/user_prompts.py": [ "webdriver/tests/get_element_rect/user_prompts.py": [
"ec1047bd3893d51f4b2be9597d87ba4a63b6a353", "c51866cb8758ad03554413aecafd42c13c1bc194",
"wdspec" "wdspec"
], ],
"webdriver/tests/get_element_tag_name/__init__.py": [ "webdriver/tests/get_element_tag_name/__init__.py": [
@ -668770,7 +668808,7 @@
"support" "support"
], ],
"webdriver/tests/support/asserts.py": [ "webdriver/tests/support/asserts.py": [
"1dea6ce68779269b005061a391f7553a6741157f", "67711987d4b7cf683ff4e6d1ace3ad0189b7ec91",
"support" "support"
], ],
"webdriver/tests/support/defaults.py": [ "webdriver/tests/support/defaults.py": [
@ -668778,11 +668816,11 @@
"support" "support"
], ],
"webdriver/tests/support/fixtures.py": [ "webdriver/tests/support/fixtures.py": [
"d16883256aca4f600400f060719d0a7ac8d16dfd", "f662040e4066f14afa6a5f8c40778db23ccab29a",
"support" "support"
], ],
"webdriver/tests/support/helpers.py": [ "webdriver/tests/support/helpers.py": [
"dd733809fd5a1169a433ba9bd0c2f4dd17b927a3", "6c62d756259b6677bd5e77fc6b6a48def4b3b46b",
"support" "support"
], ],
"webdriver/tests/support/http_request.py": [ "webdriver/tests/support/http_request.py": [
@ -668790,7 +668828,7 @@
"support" "support"
], ],
"webdriver/tests/support/image.py": [ "webdriver/tests/support/image.py": [
"1eb3a187a43b86ffe752d4d73f6e639bdd9e96da", "81dd933943f78b4bad69967c26729b70b992acb6",
"support" "support"
], ],
"webdriver/tests/support/inline.py": [ "webdriver/tests/support/inline.py": [
@ -668830,27 +668868,27 @@
"wdspec" "wdspec"
], ],
"webdriver/tests/take_element_screenshot/__init__.py": [ "webdriver/tests/take_element_screenshot/__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "d289ee3b912001e63cf3a34331098ce7b7258aa6",
"support" "support"
], ],
"webdriver/tests/take_element_screenshot/screenshot.py": [ "webdriver/tests/take_element_screenshot/screenshot.py": [
"e4d2869af4f3a50aa4da87b499d84b75254967a7", "35a1ffe75f042b6e2a995cf980ecaa19e97590e3",
"wdspec" "wdspec"
], ],
"webdriver/tests/take_element_screenshot/user_prompts.py": [ "webdriver/tests/take_element_screenshot/user_prompts.py": [
"fa239999e4f3479526423498f5718a455ffde53f", "221eaa9363528d3fa102f9506d81bca89546e9f5",
"wdspec" "wdspec"
], ],
"webdriver/tests/take_screenshot/__init__.py": [ "webdriver/tests/take_screenshot/__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "d38c8a0f79f81d5977d0a8dfa1a9f63e236988fb",
"support" "support"
], ],
"webdriver/tests/take_screenshot/screenshot.py": [ "webdriver/tests/take_screenshot/screenshot.py": [
"d3153710f7b108f167a4ff82b9ef288bcfa9440c", "07879530120dfbf8203fe8c4827d2bf36fb3eedb",
"wdspec" "wdspec"
], ],
"webdriver/tests/take_screenshot/user_prompts.py": [ "webdriver/tests/take_screenshot/user_prompts.py": [
"4d4840f08ba6f57f3e22bda72a0071128bea9be0", "902463f22c8165628ce5fccffafdc70481300f20",
"wdspec" "wdspec"
], ],
"webgl/META.yml": [ "webgl/META.yml": [
@ -669482,7 +669520,7 @@
"testharness" "testharness"
], ],
"webrtc/RTCDTMFSender-ontonechange.https.html": [ "webrtc/RTCDTMFSender-ontonechange.https.html": [
"ff6d117b3c75dde71cc52b4087f223477ad08bb4", "49e23abe2f4aa631e39eb66dd0b619d28e7de1a7",
"testharness" "testharness"
], ],
"webrtc/RTCDataChannel-bufferedAmount.html": [ "webrtc/RTCDataChannel-bufferedAmount.html": [
@ -669646,7 +669684,7 @@
"testharness" "testharness"
], ],
"webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html": [ "webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html": [
"6c98eae52cd4ce78765671ccbea9ebe523bde17f", "4bdcddec5115c3d9c953859950854b3ec97fbbef",
"testharness" "testharness"
], ],
"webrtc/RTCPeerConnection-setRemoteDescription-rollback.html": [ "webrtc/RTCPeerConnection-setRemoteDescription-rollback.html": [
@ -669753,16 +669791,16 @@
"1278737414c418a2b1604eae32590c0999e0d645", "1278737414c418a2b1604eae32590c0999e0d645",
"testharness" "testharness"
], ],
"webrtc/RTCRtpTransceiver-direction.html": [
"e76bc1fbb7740f7a575f0acba397284aa5d5db94",
"testharness"
],
"webrtc/RTCRtpTransceiver-setCodecPreferences.html": [ "webrtc/RTCRtpTransceiver-setCodecPreferences.html": [
"a1f7854e1a2f18036040f882889ff6758e9968c0", "a1f7854e1a2f18036040f882889ff6758e9968c0",
"testharness" "testharness"
], ],
"webrtc/RTCRtpTransceiver-setDirection.html": [
"32cbff5d98586840ab9c37a1e1e05f262560848e",
"testharness"
],
"webrtc/RTCRtpTransceiver.https.html": [ "webrtc/RTCRtpTransceiver.https.html": [
"2de9fb9f6ee4dbc555bf30ba46f21df30385dd5c", "7d16deaa8c7633928b39e1ed638f26e820e1e8d8",
"testharness" "testharness"
], ],
"webrtc/RTCSctpTransport-constructor.html": [ "webrtc/RTCSctpTransport-constructor.html": [
@ -669806,7 +669844,7 @@
"testharness" "testharness"
], ],
"webrtc/historical.html": [ "webrtc/historical.html": [
"d49503e16d6c5de6f7ea991120e7fb2b53bbcfd5", "ffa28be5bca307e6662b2d3720f97367f8c47cde",
"testharness" "testharness"
], ],
"webrtc/idlharness.https.window.js": [ "webrtc/idlharness.https.window.js": [
@ -672466,7 +672504,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/basic.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/basic.html": [
"4ffed9193b9abedd04b76c8f4848c4d0d93f1fab", "d799c8fa88a7218756c6c0b77ba0b0a13d55ade3",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent-ref.html": [
@ -672474,7 +672512,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent.html": [
"b9ef28212a4f80e67378247c75afc30c70228281", "7a1c0711624cfbbc0bf4fa1a53b44265dba32cac",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent-ref.html": [
@ -672482,7 +672520,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent.html": [
"5067d12e6f40b40e7bcc75f809c1afb5000fbf2d", "98b5fc540c635da9679de2ebaac7f1d16ad1ea94",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/scroll_up-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/scroll_up-ref.html": [
@ -672490,7 +672528,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/scroll_up.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/scroll_up.html": [
"e1619af932a5bef76c5fb72ef7a97e11c8851bcc", "93fa0e0ec039c1044abaaf9b136b38cc12dda150",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/single_line_top_left-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/single_line_top_left-ref.html": [
@ -672498,7 +672536,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/single_line_top_left.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/single_line_top_left.html": [
"c2edcb9f626a0096f8cd5d95408caa8a3da0c201", "3ed340b4bf4096da1cbcd44c80ab1a9e574d2a56",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/support/basic.vtt": [ "webvtt/rendering/cues-with-video/processing-model/regions/support/basic.vtt": [
@ -672538,7 +672576,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_x_50_percent.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_x_50_percent.html": [
"85e699a262b8e03fc8592a22e6acc6dabf73b29a", "69e71bf83c0bfea4457d0ef31319e187c8c11c5e",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_y_50_percent-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_y_50_percent-ref.html": [
@ -672546,7 +672584,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_y_50_percent.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_y_50_percent.html": [
"0641b176e6f617359b8f93912dfe88eff56d1032", "58f1362892d163cc8a787f01b5bab4b8d68836f4",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent-ref.html": [
@ -672554,7 +672592,7 @@
"support" "support"
], ],
"webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent.html": [ "webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent.html": [
"4377e9b4c03b224d60d1fcd029804118346daf47", "2d23d1641afaa1a7ba08e711ac5f782f6c94fc83",
"reftest" "reftest"
], ],
"webvtt/rendering/cues-with-video/processing-model/repaint-ref.html": [ "webvtt/rendering/cues-with-video/processing-model/repaint-ref.html": [
@ -675074,7 +675112,7 @@
"testharness" "testharness"
], ],
"workers/modules/dedicated-worker-import-failure.html": [ "workers/modules/dedicated-worker-import-failure.html": [
"81d93322c77dd0d223ade30fed5c6b43ab8f05e0", "439bea888b2bac65f5de50d47c12639fd49168a4",
"testharness" "testharness"
], ],
"workers/modules/dedicated-worker-import-meta.html": [ "workers/modules/dedicated-worker-import-meta.html": [
@ -675190,7 +675228,7 @@
"support" "support"
], ],
"workers/modules/resources/new-worker-window.html": [ "workers/modules/resources/new-worker-window.html": [
"5ae150725eb973ce1c2c7b54eb45669e057e8875", "a7bd2eedef6ab6d639f28e063ccd50aefbbb0528",
"support" "support"
], ],
"workers/modules/resources/post-message-on-load-worker.js": [ "workers/modules/resources/post-message-on-load-worker.js": [

View file

@ -1,49 +0,0 @@
[inheritance.html]
[Property animation-name has initial value none]
expected: FAIL
[Property animation-name does not inherit]
expected: FAIL
[Property animation-direction has initial value normal]
expected: FAIL
[Property animation-duration does not inherit]
expected: FAIL
[Property animation-play-state has initial value running]
expected: FAIL
[Property animation-fill-mode has initial value none]
expected: FAIL
[Property animation-delay has initial value 0s]
expected: FAIL
[Property animation-timing-function does not inherit]
expected: FAIL
[Property animation-direction does not inherit]
expected: FAIL
[Property animation-duration has initial value 0s]
expected: FAIL
[Property animation-delay does not inherit]
expected: FAIL
[Property animation-iteration-count does not inherit]
expected: FAIL
[Property animation-fill-mode does not inherit]
expected: FAIL
[Property animation-timing-function has initial value ease]
expected: FAIL
[Property animation-play-state does not inherit]
expected: FAIL
[Property animation-iteration-count has initial value 1]
expected: FAIL

View file

@ -27,3 +27,6 @@
[background-size_percentage_max] [background-size_percentage_max]
expected: FAIL expected: FAIL
[background-size_auto_auto]
expected: FAIL

View file

@ -323,3 +323,15 @@
[Matching font-style: 'italic' should prefer 'oblique 5deg 10deg' over 'oblique 5deg'] [Matching font-style: 'italic' should prefer 'oblique 5deg 10deg' over 'oblique 5deg']
expected: FAIL expected: FAIL
[Matching font-style: 'italic' should prefer 'oblique 5deg' over 'normal']
expected: FAIL
[Matching font-weight: '400' should prefer '400' over '450 460']
expected: FAIL
[Matching font-weight: '501' should prefer '390 410' over '300 350']
expected: FAIL
[Matching font-weight: '430' should prefer '420 440' over '450 460']
expected: FAIL

View file

@ -1,49 +0,0 @@
[inheritance.html]
[Property text-emphasis-style inherits]
expected: FAIL
[Property text-emphasis-style has initial value none]
expected: FAIL
[Property text-decoration-style has initial value solid]
expected: FAIL
[Property text-underline-position has initial value auto]
expected: FAIL
[Property text-decoration-line has initial value none]
expected: FAIL
[Property text-emphasis-color has initial value rgba(2, 3, 4, 0.5)]
expected: FAIL
[Property text-shadow has initial value none]
expected: FAIL
[Property text-decoration-color has initial value rgba(2, 3, 4, 0.5)]
expected: FAIL
[Property text-decoration-line does not inherit]
expected: FAIL
[Property text-underline-position inherits]
expected: FAIL
[Property text-emphasis-position inherits]
expected: FAIL
[Property text-decoration-color does not inherit]
expected: FAIL
[Property text-emphasis-position has initial value over right]
expected: FAIL
[Property text-decoration-style does not inherit]
expected: FAIL
[Property text-shadow inherits]
expected: FAIL
[Property text-emphasis-color inherits]
expected: FAIL

View file

@ -1,91 +1,7 @@
[inheritance.html] [inheritance.html]
[Property white-space has initial value normal]
expected: FAIL
[Property overflow-wrap has initial value normal]
expected: FAIL
[Property text-align-all has initial value start]
expected: FAIL
[Property word-break has initial value normal]
expected: FAIL
[Property text-indent inherits]
expected: FAIL
[Property overflow-wrap inherits]
expected: FAIL
[Property word-wrap has initial value normal]
expected: FAIL
[Property text-justify has initial value auto]
expected: FAIL
[Property hanging-punctuation inherits]
expected: FAIL
[Property text-transform inherits]
expected: FAIL
[Property tab-size inherits]
expected: FAIL
[Property letter-spacing inherits]
expected: FAIL
[Property text-justify inherits] [Property text-justify inherits]
expected: FAIL expected: FAIL
[Property word-spacing has initial value 0px] [Property word-spacing has initial value 0px]
expected: FAIL expected: FAIL
[Property text-indent has initial value 0px]
expected: FAIL
[Property line-break inherits]
expected: FAIL
[Property word-break inherits]
expected: FAIL
[Property hyphens inherits]
expected: FAIL
[Property text-align-last inherits]
expected: FAIL
[Property letter-spacing has initial value normal]
expected: FAIL
[Property word-wrap inherits]
expected: FAIL
[Property white-space inherits]
expected: FAIL
[Property hyphens has initial value manual]
expected: FAIL
[Property hanging-punctuation has initial value none]
expected: FAIL
[Property tab-size has initial value 8]
expected: FAIL
[Property text-align-all inherits]
expected: FAIL
[Property text-align-last has initial value auto]
expected: FAIL
[Property line-break has initial value auto]
expected: FAIL
[Property text-transform has initial value none]
expected: FAIL
[Property word-spacing inherits]
expected: FAIL

View file

@ -1,61 +1,10 @@
[inheritance.html] [inheritance.html]
[Property rotate does not inherit]
expected: FAIL
[Property scale has initial value none]
expected: FAIL
[Property scale does not inherit]
expected: FAIL
[Property transform-origin has initial value 30px 20px] [Property transform-origin has initial value 30px 20px]
expected: FAIL expected: FAIL
[Property backface-visibility does not inherit]
expected: FAIL
[Property transform has initial value none]
expected: FAIL
[Property perspective-origin has initial value 30px 20px] [Property perspective-origin has initial value 30px 20px]
expected: FAIL expected: FAIL
[Property transform-box has initial value view-box]
expected: FAIL
[Property transform does not inherit]
expected: FAIL
[Property transform-style does not inherit]
expected: FAIL
[Property translate does not inherit]
expected: FAIL
[Property translate has initial value none]
expected: FAIL
[Property backface-visibility has initial value visible]
expected: FAIL
[Property perspective-origin does not inherit]
expected: FAIL
[Property transform-style has initial value auto]
expected: FAIL
[Property transform-box does not inherit]
expected: FAIL
[Property transform-origin does not inherit] [Property transform-origin does not inherit]
expected: FAIL expected: FAIL
[Property perspective does not inherit]
expected: FAIL
[Property rotate has initial value none]
expected: FAIL
[Property perspective has initial value none]
expected: FAIL

View file

@ -1,25 +0,0 @@
[inheritance.html]
[Property transition-delay does not inherit]
expected: FAIL
[Property transition-property has initial value all]
expected: FAIL
[Property transition-timing-function has initial value ease]
expected: FAIL
[Property transition-duration has initial value 0s]
expected: FAIL
[Property transition-duration does not inherit]
expected: FAIL
[Property transition-delay has initial value 0s]
expected: FAIL
[Property transition-timing-function does not inherit]
expected: FAIL
[Property transition-property does not inherit]
expected: FAIL

View file

@ -1055,3 +1055,27 @@
[min-width length(ex) / values] [min-width length(ex) / values]
expected: FAIL expected: FAIL
[text-indent length(ex) / values]
expected: FAIL
[text-indent length(px) / values]
expected: FAIL
[text-indent length(mm) / values]
expected: FAIL
[text-indent length(cm) / values]
expected: FAIL
[text-shadow shadow(shadow) / values]
expected: FAIL
[text-indent length(in) / values]
expected: FAIL
[text-indent length(em) / values]
expected: FAIL
[text-indent percentage(%) / values]
expected: FAIL

View file

@ -74,6 +74,3 @@
[opacity end] [opacity end]
expected: FAIL expected: FAIL
[outline-width end]
expected: FAIL

View file

@ -1,7 +0,0 @@
[inheritance.html]
[Property scroll-behavior has initial value auto]
expected: FAIL
[Property scroll-behavior does not inherit]
expected: FAIL

View file

@ -1,31 +0,0 @@
[inheritance.html]
[Property color-interpolation-filters has initial value linearrgb]
expected: FAIL
[Property flood-color does not inherit]
expected: FAIL
[Property lighting-color does not inherit]
expected: FAIL
[Property color-interpolation-filters inherits]
expected: FAIL
[Property lighting-color has initial value rgb(255, 255, 255)]
expected: FAIL
[Property flood-opacity does not inherit]
expected: FAIL
[Property flood-opacity has initial value 1]
expected: FAIL
[Property filter does not inherit]
expected: FAIL
[Property filter has initial value none]
expected: FAIL
[Property flood-color has initial value rgb(0, 0, 0)]
expected: FAIL

View file

@ -0,0 +1,85 @@
[backdrop-filter-computed.html]
[Property backdrop-filter value 'blur(10px) url("https://www.example.com/picture.svg#f") contrast(20) brightness(30)' computes to 'blur(10px) url("https://www.example.com/picture.svg#f") contrast(20) brightness(30)']
expected: FAIL
[Property backdrop-filter value 'contrast()' computes to 'contrast(1)']
expected: FAIL
[Property backdrop-filter value 'grayscale(50%)' computes to 'grayscale(0.5)']
expected: FAIL
[Property backdrop-filter value 'opacity(100%)' computes to 'opacity(1)']
expected: FAIL
[Property backdrop-filter value 'invert()' computes to 'invert(0)']
expected: FAIL
[Property backdrop-filter value 'saturate(0)' computes to 'saturate(0)']
expected: FAIL
[Property backdrop-filter value 'invert(0)' computes to 'invert(0)']
expected: FAIL
[Property backdrop-filter value 'hue-rotate()' computes to 'hue-rotate(0deg)']
expected: FAIL
[Property backdrop-filter value 'drop-shadow(1px 2px)' computes to 'drop-shadow(rgb(0, 255, 0) 1px 2px 0px)']
expected: FAIL
[Property backdrop-filter value 'brightness(0)' computes to 'brightness(0)']
expected: FAIL
[Property backdrop-filter value 'opacity()' computes to 'opacity(1)']
expected: FAIL
[Property backdrop-filter value 'brightness(300%)' computes to 'brightness(3)']
expected: FAIL
[Property backdrop-filter value 'blur()' computes to 'blur(0px)']
expected: FAIL
[Property backdrop-filter value 'sepia()' computes to 'sepia(1)']
expected: FAIL
[Property backdrop-filter value 'grayscale()' computes to 'grayscale(1)']
expected: FAIL
[Property backdrop-filter value 'sepia(100%)' computes to 'sepia(1)']
expected: FAIL
[Property backdrop-filter value 'sepia(0)' computes to 'sepia(0)']
expected: FAIL
[Property backdrop-filter value 'brightness()' computes to 'brightness(0)']
expected: FAIL
[Property backdrop-filter value 'invert(100%)' computes to 'invert(1)']
expected: FAIL
[Property backdrop-filter value 'saturate(300%)' computes to 'saturate(3)']
expected: FAIL
[Property backdrop-filter value 'hue-rotate(90deg)' computes to 'hue-rotate(90deg)']
expected: FAIL
[Property backdrop-filter value 'contrast(0)' computes to 'contrast(0)']
expected: FAIL
[Property backdrop-filter value 'none' computes to 'none']
expected: FAIL
[Property backdrop-filter value 'contrast(300%)' computes to 'contrast(3)']
expected: FAIL
[Property backdrop-filter value 'drop-shadow(rgb(4, 5, 6) 1px 2px 0px)' computes to 'drop-shadow(rgb(4, 5, 6) 1px 2px 0px)']
expected: FAIL
[Property backdrop-filter value 'opacity(0)' computes to 'opacity(0)']
expected: FAIL
[Property backdrop-filter value 'saturate()' computes to 'saturate(1)']
expected: FAIL
[Property backdrop-filter value 'blur(100px)' computes to 'blur(100px)']
expected: FAIL

View file

@ -0,0 +1,112 @@
[backdrop-filter-parsing-valid.html]
[e.style['backdrop-filter'\] = "sepia()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "hue-rotate(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "brightness(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "grayscale()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "saturate()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "invert(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "opacity(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "sepia(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "url(\\"picture.svg#f\\")" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "opacity()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "opacity(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "none" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "drop-shadow(0 0 0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "blur()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "contrast(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "blur(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "invert(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "brightness(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "drop-shadow(1px 2px 3px)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "hue-rotate(90deg)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "drop-shadow(rgba(4, 5, 6, 0.75) 1px 2px 3px)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "drop-shadow(1px 2px rgb(4, 5, 6))" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "sepia(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "grayscale(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "drop-shadow(rgb(4, 5, 6) 1px 2px)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "blur(10px) url(\\"picture.svg#f\\") contrast(20) brightness(30)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "drop-shadow(1px 2px)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "url(\\"https://www.example.com/picture.svg#f\\")" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "saturate(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "grayscale(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "saturate(300%)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "invert()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "brightness()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "contrast()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "hue-rotate()" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "contrast(0)" should set the property value]
expected: FAIL
[e.style['backdrop-filter'\] = "blur(100px)" should set the property value]
expected: FAIL

View file

@ -509,7 +509,7 @@
[single-byte-decoder.html?XMLHttpRequest] [single-byte-decoder.html?XMLHttpRequest]
expected: CRASH expected: TIMEOUT
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
expected: FAIL expected: FAIL
@ -540,9 +540,6 @@
[windows-1258: cp1258 (XMLHttpRequest)] [windows-1258: cp1258 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
[windows-1253: x-cp1253 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1256: cp1256 (XMLHttpRequest)] [windows-1256: cp1256 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
@ -579,21 +576,9 @@
[windows-1257: x-cp1257 (XMLHttpRequest)] [windows-1257: x-cp1257 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
[windows-1254: cp1254 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1254: iso8859-9 (XMLHttpRequest)] [windows-1254: iso8859-9 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
[windows-1253: windows-1253 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1253: cp1253 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1254: l5 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1254: x-cp1254 (XMLHttpRequest)] [windows-1254: x-cp1254 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT

View file

@ -1,4 +0,0 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_4.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -2,10 +2,10 @@
type: testharness type: testharness
expected: TIMEOUT expected: TIMEOUT
[picture: source (max-width:500px) broken image, img valid image, resize to wide] [picture: source (max-width:500px) broken image, img valid image, resize to wide]
expected: FAIL expected: TIMEOUT
[picture: source (max-width:500px) valid image, img valid image, resize to wide] [picture: source (max-width:500px) valid image, img valid image, resize to wide]
expected: FAIL expected: TIMEOUT
[picture: source (max-width:500px) valid image, img broken image, resize to narrow] [picture: source (max-width:500px) valid image, img broken image, resize to narrow]
expected: TIMEOUT expected: TIMEOUT

View file

@ -1,7 +0,0 @@
[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

@ -9,3 +9,6 @@
[document.open should throw an InvalidStateError with XML document even when the ignore-opens-during-unload counter is greater than 0 (during pagehide event)] [document.open should throw an InvalidStateError with XML document even when the ignore-opens-during-unload counter is greater than 0 (during pagehide event)]
expected: FAIL expected: FAIL
[document.open should throw an InvalidStateError with XML document even when there is an active parser executing script]
expected: FAIL

View file

@ -12,3 +12,6 @@
[Verifies the resolution of entry.startTime is at least 5 microseconds.] [Verifies the resolution of entry.startTime is at least 5 microseconds.]
expected: TIMEOUT expected: TIMEOUT
[Verifies the resolution of performance.now() is at least 5 microseconds.]
expected: FAIL

View file

@ -1,4 +1,4 @@
[no-quirks.html] [quirks.html]
[top: -\\31 .5] [top: -\\31 .5]
expected: FAIL expected: FAIL

View file

@ -1,5 +1,5 @@
[dedicated-worker-import-csp.html] [dedicated-worker-import-csp.html]
expected: ERROR expected: CRASH
[DedicatedWorker: CSP for ES Modules] [DedicatedWorker: CSP for ES Modules]
expected: FAIL expected: FAIL

View file

@ -1,6 +1,5 @@
[dedicated-worker-import-failure.html] [dedicated-worker-import-failure.html]
type: testharness type: testharness
expected: ERROR
[DedicatedWorker: import failure] [DedicatedWorker: import failure]
expected: FAIL expected: FAIL

View file

@ -1,5 +1,6 @@
[005.html] [005.html]
type: testharness type: testharness
expected: ERROR
[dedicated worker in shared worker in dedicated worker] [dedicated worker in shared worker in dedicated worker]
expected: FAIL expected: FAIL

View file

@ -2,6 +2,10 @@
# macOS. Documentation to help understand this setup: # macOS. Documentation to help understand this setup:
# https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema # https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema
# https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables # https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables
#
# In addition to this configuration file, the "Build pull requests from forks
# of this repository" setting must also be enabled in the Azure DevOps project:
# https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/github#validate-contributions-from-forks
trigger: none # disable builds for branches trigger: none # disable builds for branches

View file

@ -125,7 +125,7 @@ tasks:
owner: ${event.pull_request.user.login}@users.noreply.github.com owner: ${event.pull_request.user.login}@users.noreply.github.com
source: ${event.repository.url} source: ${event.repository.url}
payload: payload:
image: jugglinmike/web-platform-tests:0.21 image: harjgam/web-platform-tests:0.22
maxRunTime: 7200 maxRunTime: 7200
artifacts: artifacts:
public/results: public/results:

View file

@ -1,3 +1,4 @@
importScripts('/resources/testharness.js');
importScripts('sw-helpers.js'); importScripts('sw-helpers.js');
async function updateUI(event) { async function updateUI(event) {
@ -13,10 +14,20 @@ async function updateUI(event) {
return Promise.all(updateParams.map(param => event.updateUI(param))) return Promise.all(updateParams.map(param => event.updateUI(param)))
.then(() => 'update success') .then(() => 'update success')
.catch(e => e.message); .catch(e => e.name);
} }
self.addEventListener('backgroundfetchsuccess', event => { self.addEventListener('backgroundfetchsuccess', event => {
if (event.registration.id === 'update-inactive') {
// Post an async task before calling updateUI from the inactive event.
// Any async behaviour outside `waitUntil` should mark the event as
// inactive, and subsequent calls to `updateUI` should fail.
new Promise(r => step_timeout(r, 0))
.then(() => event.updateUI({ title: 'New title' }))
.catch(e => sendMessageToDocument({ update: e.name }));
return;
}
event.waitUntil(updateUI(event) event.waitUntil(updateUI(event)
.then(update => sendMessageToDocument({ type: event.type, update }))) .then(update => sendMessageToDocument({ update })));
}); });

View file

@ -27,6 +27,17 @@ backgroundFetchTest(async (test, backgroundFetch) => {
assert_equals(registration.id, registrationId); assert_equals(registration.id, registrationId);
const message = await getMessageFromServiceWorker(); const message = await getMessageFromServiceWorker();
assert_equals(message.update, 'updateUI may only be called once.'); assert_equals(message.update, 'InvalidStateError');
}, 'Background Fetch updateUI called twice fails', swName); }, 'Background Fetch updateUI called twice fails', swName);
backgroundFetchTest(async (test, backgroundFetch) => {
const registrationId = 'update-inactive';
const registration =
await backgroundFetch.fetch(registrationId, 'resources/feature-name.txt');
assert_equals(registration.id, registrationId);
const message = await getMessageFromServiceWorker();
assert_equals(message.update, 'InvalidStateError');
}, 'Background Fetch updateUI fails when event is not active', swName);

View file

@ -645,7 +645,7 @@ test(t => {
const expected = [ const expected = [
{ offset: 0, computedOffset: 0, easing: "ease", composite: "auto", { offset: 0, computedOffset: 0, easing: "ease", composite: "auto",
backgroundSize: "auto auto" }, backgroundSize: "auto" },
{ offset: 1, computedOffset: 1, easing: "ease", composite: "auto", { offset: 1, computedOffset: 1, easing: "ease", composite: "auto",
backgroundSize: "50% auto, 6px auto, contain" }, backgroundSize: "50% auto, 6px auto, contain" },
]; ];
@ -657,7 +657,7 @@ test(t => {
// Test inheriting a background-size value // Test inheriting a background-size value
expected[0].backgroundSize = div.style.backgroundSize = expected[0].backgroundSize = div.style.backgroundSize =
"30px auto, 40% auto, auto auto"; "30px auto, 40% auto, auto";
frames = getKeyframes(div); frames = getKeyframes(div);
for (let i = 0; i < frames.length; i++) { for (let i = 0; i < frames.length; i++) {

View file

@ -81,7 +81,7 @@
document.getElementById("test").style.backgroundSize = "auto auto"; document.getElementById("test").style.backgroundSize = "auto auto";
test(function() { test(function() {
assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"),
"auto auto", "background-size supporting value"); "auto", "background-size supporting value");
}, "background-size_auto_auto"); }, "background-size_auto_auto");
document.getElementById("test").style.backgroundSize = "auto 15px"; document.getElementById("test").style.backgroundSize = "auto 15px";

View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Filter Effects Module Level 2: getComputedValue().backdropFilter</title>
<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
<meta name="assert" content="backdrop-filter supports omitted arguments'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
</head>
<body>
<style>
#target {
color: lime;
}
</style>
<div id="target"></div>
<script>
test_computed_value("backdrop-filter", "none");
test_computed_value("backdrop-filter", "blur(100px)");
test_computed_value("backdrop-filter", "blur()", "blur(0px)");
test_computed_value("backdrop-filter", "brightness(0)");
test_computed_value("backdrop-filter", "brightness(300%)", "brightness(3)");
test_computed_value("backdrop-filter", "brightness()", "brightness(0)");
test_computed_value("backdrop-filter", "contrast(0)");
test_computed_value("backdrop-filter", "contrast(300%)", "contrast(3)");
test_computed_value("backdrop-filter", "contrast()", "contrast(1)");
test_computed_value("backdrop-filter", "drop-shadow(1px 2px)", "drop-shadow(rgb(0, 255, 0) 1px 2px 0px)");
test_computed_value("backdrop-filter", "drop-shadow(rgb(4, 5, 6) 1px 2px 0px)");
test_computed_value("backdrop-filter", "grayscale(50%)", "grayscale(0.5)");
test_computed_value("backdrop-filter", "grayscale()", "grayscale(1)");
test_computed_value("backdrop-filter", "hue-rotate(90deg)");
test_computed_value("backdrop-filter", "hue-rotate()", "hue-rotate(0deg)");
test_computed_value("backdrop-filter", "invert(0)");
test_computed_value("backdrop-filter", "invert(100%)", "invert(1)");
test_computed_value("backdrop-filter", "invert()", "invert(0)");
test_computed_value("backdrop-filter", "opacity(0)");
test_computed_value("backdrop-filter", "opacity(100%)", "opacity(1)");
test_computed_value("backdrop-filter", "opacity()", "opacity(1)");
test_computed_value("backdrop-filter", "saturate(0)");
test_computed_value("backdrop-filter", "saturate(300%)", "saturate(3)");
test_computed_value("backdrop-filter", "saturate()", "saturate(1)");
test_computed_value("backdrop-filter", "sepia(0)");
test_computed_value("backdrop-filter", "sepia(100%)", "sepia(1)");
test_computed_value("backdrop-filter", "sepia()", "sepia(1)");
test_computed_value("backdrop-filter", 'blur(10px) url("https://www.example.com/picture.svg#f") contrast(20) brightness(30)');
</script>
</body>
</html>

View file

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Filter Effects Module Level 2: parsing backdrop-filter with invalid values</title>
<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
<meta name="assert" content="backdrop-filter supports only the grammar 'none | <backdrop-filter-function-list>'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
// Edge fails: expected "" but got "none"
test_invalid_value("backdrop-filter", "auto");
test_invalid_value("backdrop-filter", "none hue-rotate(0deg)");
test_invalid_value("backdrop-filter", "blur(10)");
test_invalid_value("backdrop-filter", "blur(-100px)");
test_invalid_value("backdrop-filter", "brightness(-20)");
test_invalid_value("backdrop-filter", "brightness(30px)");
test_invalid_value("backdrop-filter", "contrast(-20)");
test_invalid_value("backdrop-filter", "contrast(30px)");
test_invalid_value("backdrop-filter", "drop-shadow(10 20)");
test_invalid_value("backdrop-filter", "drop-shadow(10% 20%)");
test_invalid_value("backdrop-filter", "drop-shadow(1px)");
test_invalid_value("backdrop-filter", "drop-shadow(1px 2px 3px 4px)");
test_invalid_value("backdrop-filter", "drop-shadow(rgb(4, 5, 6))");
test_invalid_value("backdrop-filter", "drop-shadow()");
test_invalid_value("backdrop-filter", "grayscale(-20)");
test_invalid_value("backdrop-filter", "grayscale(30px)");
test_invalid_value("backdrop-filter", "hue-rotate(90)");
test_invalid_value("backdrop-filter", "invert(-20)");
test_invalid_value("backdrop-filter", "invert(30px)");
test_invalid_value("backdrop-filter", "opacity(-20)");
test_invalid_value("backdrop-filter", "opacity(30px)");
test_invalid_value("backdrop-filter", "saturate(-20)");
test_invalid_value("backdrop-filter", "saturate(30px)");
test_invalid_value("backdrop-filter", "sepia(-20)");
test_invalid_value("backdrop-filter", "sepia(30px)");
</script>
</body>
</html>

View file

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Filter Effects Module Level 2: parsing backdrop-filter with valid values</title>
<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
<meta name="assert" content="backdrop-filter supports the full grammar 'none | <backdrop-filter-function-list>'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_valid_value("backdrop-filter", "none");
test_valid_value("backdrop-filter", "blur(100px)");
test_valid_value("backdrop-filter", "blur(0)", "blur(0px)");
test_valid_value("backdrop-filter", "blur()");
test_valid_value("backdrop-filter", "brightness(0)");
test_valid_value("backdrop-filter", "brightness(300%)");
test_valid_value("backdrop-filter", "brightness()");
test_valid_value("backdrop-filter", "contrast(0)");
test_valid_value("backdrop-filter", "contrast(300%)");
test_valid_value("backdrop-filter", "contrast()");
test_valid_value("backdrop-filter", "drop-shadow(1px 2px)");
test_valid_value("backdrop-filter", "drop-shadow(1px 2px 3px)");
test_valid_value("backdrop-filter", "drop-shadow(0 0 0)", "drop-shadow(0px 0px 0px)");
test_valid_value("backdrop-filter", "drop-shadow(rgb(4, 5, 6) 1px 2px)");
test_valid_value("backdrop-filter", "drop-shadow(1px 2px rgb(4, 5, 6))", "drop-shadow(rgb(4, 5, 6) 1px 2px)");
test_valid_value("backdrop-filter", "drop-shadow(rgba(4, 5, 6, 0.75) 1px 2px 3px)");
test_valid_value("backdrop-filter", "grayscale(0)");
test_valid_value("backdrop-filter", "grayscale(300%)", "grayscale(100%)");
test_valid_value("backdrop-filter", "grayscale()");
test_valid_value("backdrop-filter", "hue-rotate(90deg)");
test_valid_value("backdrop-filter", "hue-rotate(0)", "hue-rotate(0deg)");
test_valid_value("backdrop-filter", "hue-rotate()");
test_valid_value("backdrop-filter", "invert(0)");
test_valid_value("backdrop-filter", "invert(300%)", "invert(100%)");
test_valid_value("backdrop-filter", "invert()");
test_valid_value("backdrop-filter", "opacity(0)");
test_valid_value("backdrop-filter", "opacity(300%)", "opacity(100%)");
test_valid_value("backdrop-filter", "opacity()");
test_valid_value("backdrop-filter", "saturate(0)");
test_valid_value("backdrop-filter", "saturate(300%)");
test_valid_value("backdrop-filter", "saturate()");
test_valid_value("backdrop-filter", "sepia(0)");
test_valid_value("backdrop-filter", "sepia(300%)", "sepia(100%)");
test_valid_value("backdrop-filter", "sepia()");
test_valid_value("backdrop-filter", 'url("picture.svg#f")');
test_valid_value("backdrop-filter", 'url("https://www.example.com/picture.svg#f")');
test_valid_value("backdrop-filter", 'blur(10px) url("picture.svg#f") contrast(20) brightness(30)');
</script>
</body>
</html>

View file

@ -1,7 +1,10 @@
'use strict'; 'use strict';
(function() {
function assert_initial(property, initial) { function assert_initial(property, initial) {
test(() => { test(() => {
const target = document.getElementById('target');
if (!getComputedStyle(target)[property]) if (!getComputedStyle(target)[property])
return; return;
target.style[property] = 'initial'; target.style[property] = 'initial';
@ -13,6 +16,8 @@ function assert_initial(property, initial) {
/** /**
* Create tests that a CSS property inherits and has the given initial value. * Create tests that a CSS property inherits and has the given initial value.
* *
* The current document must have an element #target within element #container.
*
* @param {string} property The name of the CSS property being tested. * @param {string} property The name of the CSS property being tested.
* @param {string} initial The computed value for 'initial'. * @param {string} initial The computed value for 'initial'.
* @param {string} other An arbitrary value for the property that round * @param {string} other An arbitrary value for the property that round
@ -22,6 +27,8 @@ function assert_inherited(property, initial, other) {
assert_initial(property, initial); assert_initial(property, initial);
test(() => { test(() => {
const container = document.getElementById('container');
const target = document.getElementById('target');
if (!getComputedStyle(target)[property]) if (!getComputedStyle(target)[property])
return; return;
container.style[property] = 'initial'; container.style[property] = 'initial';
@ -45,6 +52,8 @@ function assert_inherited(property, initial, other) {
* Create tests that a CSS property does not inherit, and that it has the * Create tests that a CSS property does not inherit, and that it has the
* given initial value. * given initial value.
* *
* The current document must have an element #target within element #container.
*
* @param {string} property The name of the CSS property being tested. * @param {string} property The name of the CSS property being tested.
* @param {string} initial The computed value for 'initial'. * @param {string} initial The computed value for 'initial'.
* @param {string} other An arbitrary value for the property that round * @param {string} other An arbitrary value for the property that round
@ -54,6 +63,8 @@ function assert_not_inherited(property, initial, other) {
assert_initial(property, initial); assert_initial(property, initial);
test(() => { test(() => {
const container = document.getElementById('container');
const target = document.getElementById('target');
if (!getComputedStyle(target)[property]) if (!getComputedStyle(target)[property])
return; return;
container.style[property] = 'initial'; container.style[property] = 'initial';
@ -69,3 +80,7 @@ function assert_not_inherited(property, initial, other) {
target.style[property] = ''; target.style[property] = '';
}, 'Property ' + property + ' does not inherit'); }, 'Property ' + property + ' does not inherit');
} }
window.assert_inherited = assert_inherited;
window.assert_not_inherited = assert_not_inherited;
})();

View file

@ -10,14 +10,12 @@ function test_valid_value(property, value, serializedValue) {
var stringifiedValue = JSON.stringify(value); var stringifiedValue = JSON.stringify(value);
test(function(){ test(function(){
var div = document.createElement('div'); var div = document.getElementById('target') || document.createElement('div');
div.style[property] = value; div.style[property] = "";
assert_not_equals(div.style.getPropertyValue(property), "", "property should be set");
var div = document.createElement('div');
div.style[property] = value; div.style[property] = value;
var readValue = div.style.getPropertyValue(property); var readValue = div.style.getPropertyValue(property);
if (serializedValue instanceof Array) assert_not_equals(readValue, "", "property should be set");
if (Array.isArray(serializedValue))
assert_in_array(readValue, serializedValue, "serialization should be sound"); assert_in_array(readValue, serializedValue, "serialization should be sound");
else else
assert_equals(readValue, serializedValue, "serialization should be canonical"); assert_equals(readValue, serializedValue, "serialization should be canonical");
@ -32,7 +30,8 @@ function test_invalid_value(property, value) {
var stringifiedValue = JSON.stringify(value); var stringifiedValue = JSON.stringify(value);
test(function(){ test(function(){
var div = document.createElement('div'); var div = document.getElementById('target') || document.createElement('div');
div.style[property] = "";
div.style[property] = value; div.style[property] = value;
assert_equals(div.style.getPropertyValue(property), ""); assert_equals(div.style.getPropertyValue(property), "");
}, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value");

View file

@ -1,4 +1,3 @@
# <shape-box> only # <shape-box> only
== shape-outside-margin-box-001.html shape-outside-margin-box-001-ref.html == shape-outside-margin-box-001.html shape-outside-margin-box-001-ref.html
== shape-outside-margin-box-002.html shape-outside-margin-box-002-ref.html == shape-outside-margin-box-002.html shape-outside-margin-box-002-ref.html

View file

@ -1,90 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: compare individual transform with transform functions</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<meta name="assert" content="Tests whether individaul transform works correctlyi by compare the rendering result with transfrom functions of the 'transform' property."/>
<style>
div {
position: fixed;
width: 100px;
height: 100px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
}
.row_1 {
top: 100px;
}
.scale_1{
left: 100px;
width: 50px;
height: 100px;
transform: scaleX(2);
}
.translate_1 {
left: 150px;
transform: translateX(150px);
}
.rotate_1 {
left: 450px;
transform-origin: 50% 50%;
transform: rotate(90deg);
}
.row_2 {
top: 250px;
}
.scale_2{
left: 100px;
width: 50px;
height: 50px;
transform: scale(2, 2);
}
.translate_2 {
left: 150px;
top: 200px;
transform: translate(150px, 50px);
}
.rotate_2 {
left: 450px;
transform-origin: 50% 50%;
transform: rotate3d(0, 0, 1, 90deg);
}
.row_3 {
transform: perspective(500px);
top: 400px;
}
.scale_3{
left: 100px;
width: 50px;
height: 50px;
transform: scale3d(2, 2, 2);
}
.translate_3 {
left: 150px;
transform: translate3d(150px, 10px, 10px);
}
.rotate_3 {
left: 450px;
transform-origin: 50% 50%;
transform: rotate3d(0, 1, 0, 45deg);
}
</style>
</head>
<body>
<div class="scale_1 row_1"></div>
<div class="translate_1 row_1"></div>
<div class="rotate_1 row_1"></div>
<div class="scale_2 row_2"></div>
<div class="translate_2 row_2"></div>
<div class="rotate_2 row_2"></div>
<div class="scale_3 row_3"></div>
<div class="translate_3 row_3"></div>
<div class="rotate_3 row_3"></div>
</body>
</html>

View file

@ -1,100 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: compare individual transform with transform functions</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<meta name="assert" content="Tests whether individaul transform works correctlyi by compare the rendering result with transfrom functions of the 'transform' property."/>
<link rel="match" href="individual-transform-1-ref.html">
<style>
div {
position: fixed;
width: 100px;
height: 100px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
}
.row_1 {
top: 100px;
}
.scale_1{
left: 100px;
width: 50px;
height: 100px;
/* test 'scale: <number>' */
scale: 2;
}
.translate_1 {
left: 150px;
/* test 'translate: <length-percentage>' */
translate: 150px;
}
.rotate_1 {
left: 450px;
transform-origin: 50% 50%;
/* test 'rota: te<angle>' */
rotate: 90deg;
}
.row_2 {
top: 250px;
}
.scale_2{
left: 100px;
width: 50px;
height: 50px;
/* test 'scale: <number>{2}'' */
scale: 2 2;
}
.translate_2 {
left: 150px;
top: 200px;
/* test 'translate: <length-percentage><length-percentage>' */
translate: 150px 50px;
}
.rotate_2 {
left: 450px;
transform-origin: 50% 50%;
/* test 'rotate: <number>{3}<angle>'*/
rotate: 0 0 1 90deg;
}
.row_3 {
transform: perspective(500px);
top: 400px;
}
.scale_3{
left: 100px;
width: 50px;
height: 50px;
/* test 'scale: <number>{3}'' */
scale: 2 2 2;
}
.translate_3 {
left: 150px;
/* test 'translate: <length-percentage><length>' */
translate: 150px 10px 10px;
}
.rotate_3 {
left: 450px;
transform-origin: 50% 50%;
/* test 'rotate: <number>{3}<angle>'*/
rotate: 0 1 0 45deg;
}
</style>
</head>
<body>
<div class="scale_1 row_1"></div>
<div class="translate_1 row_1"></div>
<div class="rotate_1 row_1"></div>
<div class="scale_2 row_2"></div>
<div class="translate_2 row_2"></div>
<div class="rotate_2 row_2"></div>
<div class="scale_3 row_3"></div>
<div class="translate_3 row_3"></div>
<div class="rotate_3 row_3"></div>
</body>
</html>

View file

@ -1,30 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: combine individual transform properties</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<meta name="assert" content="Tests that we combine transforms in the correct order."/>
<style>
div {
position: fixed;
width: 100px;
height: 100px;
top: 200px;
left: 200px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
transform: translate(50px, 50px) rotate(45deg) scale(2, 2);
}
</style>
</head>
<body>
<div></div>
</body>
</html>

View file

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: combine individual transform properties</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<meta name="assert" content="Tests that we combine transforms in the correct order."/>
<link rel="match" href="individual-transform-2-ref.html">
<style>
div {
position: fixed;
width: 100px;
height: 100px;
top: 200px;
left: 200px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
translate: 50px 50px;
rotate: 45deg;
scale: 2 2;
}
</style>
</head>
<body>
<div></div>
</body>
</html>

View file

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: combine individual transform properties</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<meta name="assert" content="Tests that we combine transforms in the correct order."/>
<link rel="match" href="individual-transform-2-ref.html">
<style>
div {
position: fixed;
width: 100px;
height: 100px;
top: 200px;
left: 200px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
rotate: 45deg;
scale: 2 2;
translate: 50px 50px;
}
</style>
</head>
<body>
<div></div>
</body>
</html>

View file

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: combine individual transform properties</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<meta name="assert" content="Tests that we combine transforms in the correct order."/>
<link rel="match" href="individual-transform-2-ref.html">
<style>
div {
position: fixed;
width: 100px;
height: 100px;
top: 200px;
left: 200px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
translate: 50px 50px;
rotate: 45deg;
transform: scale(2, 2);
}
</style>
</head>
<body>
<div></div>
</body>
</html>

View file

@ -1,31 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: combine individual transform properties</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<meta name="assert" content="Tests that we combine transforms in the correct order."/>
<link rel="match" href="individual-transform-2-ref.html">
<style>
div {
position: fixed;
width: 100px;
height: 100px;
top: 200px;
left: 200px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
translate: 50px 50px;
transform: rotate(45deg) scale(2, 2);
}
</style>
</head>
<body>
<div></div>
</body>
</html>

View file

@ -1,31 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Individual transform: combine individual transform properties</title>
<link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<meta name="assert" content="Tests that we combine transforms in the correct order."/>
<link rel="match" href="individual-transform-2-ref.html">
<style>
div {
position: fixed;
width: 100px;
height: 100px;
top: 200px;
left: 200px;
transform-origin: 0 0;
border-style: solid;
border-width: 10px 0px 10px 0px;
border-color: lime;
translate: 0px 50px;
transform: translateX(50px) rotate(45deg) scale(2, 2);
}
</style>
</head>
<body>
<div></div>
</body>
</html>

View file

@ -5,10 +5,3 @@
== perspective-zero.html reference/green.html == perspective-zero.html reference/green.html
== perspective-zero-2.html perspective-zero-2-ref.html == perspective-zero-2.html perspective-zero-2-ref.html
== perspective-untransformable-no-stacking-context.html perspective-untransformable-no-stacking-context-ref.html == perspective-untransformable-no-stacking-context.html perspective-untransformable-no-stacking-context-ref.html
== individual-transform-1.html individual-transform-1-ref.html
== individual-transform-2a.html individual-transform-2-ref.html
== individual-transform-2b.html individual-transform-2-ref.html
== individual-transform-2c.html individual-transform-2-ref.html
== individual-transform-2d.html individual-transform-2-ref.html
== individual-transform-2e.html individual-transform-2-ref.html

View file

@ -9,6 +9,12 @@ To run Safari on macOS, some manual setup is required:
* Allow pop-up windows: * Allow pop-up windows:
`defaults write com.apple.Safari WebKitJavaScriptCanOpenWindowsAutomatically 1` `defaults write com.apple.Safari WebKitJavaScriptCanOpenWindowsAutomatically 1`
* Turn on experimental features that are "off" by default:
* `defaults write com.apple.Safari ExperimentalServerTimingEnabled -bool true`
[//]: # (TODO\(cvazac\) Remove this if/when Server-Timing is enabled by default in Safari)
* Trust the certificate: * Trust the certificate:
`security add-trusted-cert -k "$(security default-keychain | cut -d\" -f2)" tools/certs/cacert.pem` `security add-trusted-cert -k "$(security default-keychain | cut -d\" -f2)" tools/certs/cacert.pem`

View file

@ -1,7 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<body> <html>
<head>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script> <script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script> <script src=/resources/testharnessreport.js></script>
</head>
<body>
<script src=/feature-policy/resources/featurepolicy.js></script> <script src=/feature-policy/resources/featurepolicy.js></script>
<!-- Feature-Policy: fullscreen *; --> <!-- Feature-Policy: fullscreen *; -->
<script> <script>
@ -143,3 +147,4 @@
} }
</script> </script>
</body> </body>
</html>

View file

@ -1,7 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<body> <html>
<head>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script> <script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script> <script src=/resources/testharnessreport.js></script>
</head>
<body>
<script src=/feature-policy/resources/featurepolicy.js></script> <script src=/feature-policy/resources/featurepolicy.js></script>
<!-- Feature-Policy: fullscreen 'self'; --> <!-- Feature-Policy: fullscreen 'self'; -->
<script> <script>
@ -177,3 +181,4 @@
} }
</script> </script>
</body> </body>
</html>

View file

@ -1,7 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<body> <html>
<head>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script> <script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script> <script src=/resources/testharnessreport.js></script>
</head>
<body>
<script src=/feature-policy/resources/featurepolicy.js></script> <script src=/feature-policy/resources/featurepolicy.js></script>
<!-- Feature-Policy: fullscreen 'self' cross_origin https://www.example.com; --> <!-- Feature-Policy: fullscreen 'self' cross_origin https://www.example.com; -->
<script> <script>
@ -184,3 +188,4 @@
} }
</script> </script>
</body> </body>
</html>

View file

@ -1,7 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<body> <html>
<head>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script> <script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script> <script src=/resources/testharnessreport.js></script>
</head>
<body>
<script src=/feature-policy/resources/featurepolicy.js></script> <script src=/feature-policy/resources/featurepolicy.js></script>
<!-- Feature-Policy: fullscreen 'none'; --> <!-- Feature-Policy: fullscreen 'none'; -->
<script> <script>
@ -143,3 +147,4 @@
} }
</script> </script>
</body> </body>
</html>

View file

@ -1,12 +1,12 @@
<script src="/common/PrefixedPostMessage.js"></script> <script src="/common/PrefixedPostMessage.js"></script>
<script> <script>
var prefixedMessage = new PrefixedMessageResource(); var prefixedMessage = new PrefixedMessageResource();
var max = 50, attempts = 0; var max = 150, attempts = 0;
function sendCoordinates() { function sendCoordinates() {
// Certain windowing systems position windows asynchronously. // Certain windowing systems position windows asynchronously.
// As a result, the window may not be positioned yet when the // As a result, the window may not be positioned yet when the
// load event fires. To accommodate this, allow waiting up to // load event fires. To accommodate this, allow waiting up to
// 5 seconds for positioning to take place. // 15 seconds for positioning to take place.
if (!window.screenX && !window.screenY && ++attempts < max) { if (!window.screenX && !window.screenY && ++attempts < max) {
setTimeout(sendCoordinates, 100); setTimeout(sendCoordinates, 100);
return; return;

View file

@ -0,0 +1,19 @@
<!doctype html>
<html>
<head>
<title>MediaDevices and SecureContext</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
</head>
<body>
<script>
assert_false(window.isSecureContext, "This test must be run in a non secure context");
assert_false('MediaDevices' in window, "MediaDevices is not exposed");
assert_false('getUserMedia' in navigator, "getUserMedia is not exposed");
assert_false('mediaDevices' in navigator, "mediaDevices is not exposed");
done();
</script>
</body>
</html>

View file

@ -0,0 +1,52 @@
<!DOCTYPE html>
<style>
div {
font-size: 10px;
line-height: 50px;
border: 1px solid blue;
}
img {
width: 1em;
height: 2em;
background: orange;
border: 1px solid black;
}
.text-top {
vertical-align: text-top;
}
.text-bottom {
vertical-align: text-bottom;
}
.top {
vertical-align: top;
}
.bottom {
vertical-align: bottom;
}
</style>
<body>
<div>
<img class="text-top" src="../../css/support/60x60-red.png">Y
</div>
<div>
<img class="text-bottom" src="../../css/support/60x60-red.png">Y
</div>
<div>
<img class="top" src="../../css/support/60x60-red.png">Y
</div>
<div>
<img class="bottom" src="../../css/support/60x60-red.png">Y
</div>
<div>
<img class="text-top" src="../../css/support/60x60-red.png"><span>Y</span>
</div>
<div>
<img class="text-bottom" src="../../css/support/60x60-red.png"><span>Y</span>
</div>
<div>
<img class="top" src="../../css/support/60x60-red.png"><span>Y</span>
</div>
<div>
<img class="bottom" src="../../css/support/60x60-red.png"><span>Y</span>
</div>
</body>

View file

@ -0,0 +1,56 @@
<meta charset="utf-8">
<title>CSS Text level 3 Test: letter spacing after bidi</title>
<link rel="author" href="kojii@chromium.org">
<link rel="match" href="reference/vertical-align-in-quirks-ref.html">
<meta name="assert" content="Tests some vertical-align values match in quirks and standard modes.">
<style>
div {
font-size: 10px;
line-height: 50px;
border: 1px solid blue;
}
img {
width: 1em;
height: 2em;
background: orange;
border: 1px solid black;
}
.text-top {
vertical-align: text-top;
}
.text-bottom {
vertical-align: text-bottom;
}
.top {
vertical-align: top;
}
.bottom {
vertical-align: bottom;
}
</style>
<body>
<div>
<img class="text-top" src="../css/support/60x60-red.png">Y
</div>
<div>
<img class="text-bottom" src="../css/support/60x60-red.png">Y
</div>
<div>
<img class="top" src="../css/support/60x60-red.png">Y
</div>
<div>
<img class="bottom" src="../css/support/60x60-red.png">Y
</div>
<div>
<img class="text-top" src="../css/support/60x60-red.png"><span>Y</span>
</div>
<div>
<img class="text-bottom" src="../css/support/60x60-red.png"><span>Y</span>
</div>
<div>
<img class="top" src="../css/support/60x60-red.png"><span>Y</span>
</div>
<div>
<img class="bottom" src="../css/support/60x60-red.png"><span>Y</span>
</div>
</body>

View file

@ -4,46 +4,13 @@
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script> <script src="resources/test-helpers.sub.js"></script>
<script> <script>
const base_url = 'resources/blank.html'; // This is out-of-scope. function test_matchall(service_worker, expected, query_options) {
const scope = base_url + '?clients-matchAll-includeUncontrolled';
let frames = [];
// Creates 3 iframes, 2 for in-scope and 1 for out-of-scope. Returns the frame
// opened for scope + '#2'.
async function create_iframes(scope) {
frames.push(await with_iframe(base_url));
frames.push(await with_iframe(scope + '#1'));
frames.push(await with_iframe(scope + '#2'));
return frames[2];
}
const expected_without_include_uncontrolled = [
// visibilityState, focused, url, type, frameType
['visible', false, new URL(scope + '#1', location).toString(), 'window', 'nested'],
['visible', true, new URL(scope + '#2', location).toString(), 'window', 'nested']
];
const expected_with_include_uncontrolled = [
// visibilityState, focused, url, type, frameType
['visible', true, location.href, 'window', 'top-level'],
['visible', false, new URL(scope + '#1', location).toString(), 'window', 'nested'],
['visible', true, new URL(scope + '#2', location).toString(), 'window', 'nested'],
['visible', false, new URL(base_url, location).toString(), 'window', 'nested']
];
function test_matchall(frame, expected, query_options) {
// Make sure we have focus for '#2' frame and its parent window.
frame.focus();
frame.contentWindow.focus();
expected.sort((a, b) => a[2] > b[2] ? 1 : -1); expected.sort((a, b) => a[2] > b[2] ? 1 : -1);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const channel = new MessageChannel(); const channel = new MessageChannel();
channel.port1.onmessage = e => { channel.port1.onmessage = e => {
// Ignore hidden clients which may be coming from background tabs, or
// clients unrelated to this test.
const data = e.data.filter(info => { const data = e.data.filter(info => {
return info[0] == 'visible' && return info[2].indexOf('clients-matchall') > -1;
info[2].indexOf('service-worker') > -1;
}); });
data.sort((a, b) => a[2] > b[2] ? 1 : -1); data.sort((a, b) => a[2] > b[2] ? 1 : -1);
assert_equals(data.length, expected.length); assert_equals(data.length, expected.length);
@ -51,9 +18,8 @@ function test_matchall(frame, expected, query_options) {
assert_array_equals(data[i], expected[i]); assert_array_equals(data[i], expected[i]);
resolve(); resolve();
}; };
frame.contentWindow.navigator.serviceWorker.controller.postMessage( service_worker.postMessage({port:channel.port2, options:query_options},
{port:channel.port2, options:query_options}, [channel.port2]);
[channel.port2]);
}); });
} }
@ -61,14 +27,91 @@ function test_matchall(frame, expected, query_options) {
// (We want to run the two tests sequentially in the same promise_test // (We want to run the two tests sequentially in the same promise_test
// so that we can use the same set of iframes without intefering each other. // so that we can use the same set of iframes without intefering each other.
promise_test(async t => { promise_test(async t => {
// |base_url| is out-of-scope.
const base_url = 'resources/blank.html?clients-matchall';
const scope = base_url + '-includeUncontrolled';
const registration = const registration =
await service_worker_unregister_and_register( await service_worker_unregister_and_register(
t, 'resources/clients-matchall-worker.js', scope); t, 'resources/clients-matchall-worker.js', scope);
t.add_cleanup(() => service_worker_unregister(t, scope)); t.add_cleanup(() => service_worker_unregister(t, scope));
await wait_for_state(t, registration.installing, 'activated'); const service_worker = registration.installing;
const frame = await create_iframes(scope); await wait_for_state(t, service_worker, 'activated');
await test_matchall(frame, expected_without_include_uncontrolled);
await test_matchall(frame, expected_with_include_uncontrolled, // Creates 3 iframes, 2 for in-scope and 1 for out-of-scope.
{includeUncontrolled:true}); let frames = [];
}, 'Verify matchAll() respect includeUncontrolled'); frames.push(await with_iframe(base_url));
frames.push(await with_iframe(scope + '#1'));
frames.push(await with_iframe(scope + '#2'));
// Make sure we have focus for '#2' frame and its parent window.
frames[2].focus();
frames[2].contentWindow.focus();
const expected_without_include_uncontrolled = [
// visibilityState, focused, url, type, frameType
['visible', false, new URL(scope + '#1', location).toString(), 'window', 'nested'],
['visible', true, new URL(scope + '#2', location).toString(), 'window', 'nested']
];
const expected_with_include_uncontrolled = [
// visibilityState, focused, url, type, frameType
['visible', true, location.href, 'window', 'top-level'],
['visible', false, new URL(scope + '#1', location).toString(), 'window', 'nested'],
['visible', true, new URL(scope + '#2', location).toString(), 'window', 'nested'],
['visible', false, new URL(base_url, location).toString(), 'window', 'nested']
];
await test_matchall(service_worker, expected_without_include_uncontrolled);
await test_matchall(service_worker, expected_with_include_uncontrolled,
{ includeUncontrolled: true });
}, 'Verify matchAll() with windows respect includeUncontrolled');
// TODO: Add tests for clients.matchAll for dedicated workers.
async function create_shared_worker(script_url) {
const shared_worker = new SharedWorker(script_url);
const msgEvent = await new Promise(r => shared_worker.port.onmessage = r);
assert_equals(msgEvent.data, 'started');
return shared_worker;
}
// Run clients.matchAll for shared workers without and with
// includeUncontrolled=true.
promise_test(async t => {
const script_url = 'resources/clients-matchall-client-types-shared-worker.js';
const uncontrolled_script_url =
new URL(script_url + '?uncontrolled', location).toString();
const controlled_script_url =
new URL(script_url + '?controlled', location).toString();
// Start a shared worker that is not controlled by a service worker.
const uncontrolled_shared_worker =
await create_shared_worker(uncontrolled_script_url);
// Register a service worker.
const registration =
await service_worker_unregister_and_register(
t, 'resources/clients-matchall-worker.js', script_url);
t.add_cleanup(() => service_worker_unregister(t, script_url));
const service_worker = registration.installing;
await wait_for_state(t, service_worker, 'activated');
// Start another shared worker controlled by the service worker.
await create_shared_worker(controlled_script_url);
const expected_without_include_uncontrolled = [
// visibilityState, focused, url, type, frameType
[undefined, undefined, controlled_script_url, 'sharedworker', 'none'],
];
const expected_with_include_uncontrolled = [
// visibilityState, focused, url, type, frameType
[undefined, undefined, controlled_script_url, 'sharedworker', 'none'],
[undefined, undefined, uncontrolled_script_url, 'sharedworker', 'none'],
];
await test_matchall(service_worker, expected_without_include_uncontrolled,
{ type: 'sharedworker' });
await test_matchall(service_worker, expected_with_include_uncontrolled,
{ includeUncontrolled: true, type: 'sharedworker' });
}, 'Verify matchAll() with shared workers respect includeUncontrolled');
</script> </script>

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>abort.js dedicated worker wrapper file</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
fetch_tests_from_worker(new Worker('abort.js'));
</script>

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>abort.js browser context wrapper file</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/recording-streams.js"></script>
<script src="../resources/test-utils.js"></script>
<script src="abort.js"></script>

View file

@ -0,0 +1,365 @@
'use strict';
// Tests for the use of pipeTo with AbortSignal.
// There is some extra complexity to avoid timeouts in environments where abort is not implemented.
if (self.importScripts) {
self.importScripts('/resources/testharness.js');
self.importScripts('../resources/recording-streams.js');
self.importScripts('../resources/test-utils.js');
}
const error1 = new Error('error1');
error1.name = 'error1';
const error2 = new Error('error2');
error2.name = 'error2';
const errorOnPull = {
pull(controller) {
// This will cause the test to error if pipeTo abort is not implemented.
controller.error('failed to abort');
}
};
// To stop pull() being called immediately when the stream is created, we need to set highWaterMark to 0.
const hwm0 = { highWaterMark: 0 };
for (const invalidSignal of [null, 'AbortSignal', true, -1, Object.create(AbortSignal.prototype)]) {
promise_test(t => {
const rs = recordingReadableStream(errorOnPull, hwm0);
const ws = recordingWritableStream();
return promise_rejects(t, new TypeError(), rs.pipeTo(ws, { signal: invalidSignal }), 'pipeTo should reject')
.then(() => {
assert_equals(rs.events.length, 0, 'no ReadableStream methods should have been called');
assert_equals(ws.events.length, 0, 'no WritableStream methods should have been called');
});
}, `a signal argument '${invalidSignal}' should cause pipeTo() to reject`);
}
promise_test(t => {
const rs = recordingReadableStream(errorOnPull, hwm0);
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal }), 'pipeTo should reject')
.then(() => Promise.all([
rs.getReader().closed,
promise_rejects(t, 'AbortError', ws.getWriter().closed, 'writer.closed should reject')
]))
.then(() => {
assert_equals(rs.events.length, 2, 'cancel should have been called');
assert_equals(rs.events[0], 'cancel', 'first event should be cancel');
assert_equals(rs.events[1].name, 'AbortError', 'the argument to cancel should be an AbortError');
assert_equals(rs.events[1].constructor.name, 'DOMException',
'the argument to cancel should be a DOMException');
});
}, 'an aborted signal should cause the writable stream to reject with an AbortError');
promise_test(() => {
let error;
const rs = recordingReadableStream(errorOnPull, hwm0);
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return rs.pipeTo(ws, { signal })
.catch(e => {
error = e;
})
.then(() => Promise.all([
rs.getReader().closed,
ws.getWriter().closed.catch(e => {
assert_equals(e, error, 'the writable should be errored with the same object');
})
]))
.then(() => {
assert_equals(rs.events.length, 2, 'cancel should have been called');
assert_equals(rs.events[0], 'cancel', 'first event should be cancel');
assert_equals(rs.events[1], error, 'the readable should be canceled with the same object');
});
}, 'all the AbortError objects should be the same object');
promise_test(t => {
const rs = recordingReadableStream(errorOnPull, hwm0);
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal, preventCancel: true }), 'pipeTo should reject')
.then(() => assert_equals(rs.events.length, 0, 'cancel should not be called'));
}, 'preventCancel should prevent canceling the readable');
promise_test(t => {
const rs = new ReadableStream(errorOnPull, hwm0);
const ws = recordingWritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal, preventAbort: true }), 'pipeTo should reject')
.then(() => {
assert_equals(ws.events.length, 0, 'writable should not have been aborted');
return ws.getWriter().ready;
});
}, 'preventAbort should prevent aborting the readable');
promise_test(t => {
const rs = new ReadableStream({
start(controller) {
controller.enqueue('a');
controller.enqueue('b');
controller.close();
}
});
const abortController = new AbortController();
const signal = abortController.signal;
const ws = recordingWritableStream({
write() {
abortController.abort();
}
});
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal }), 'pipeTo should reject')
.then(() => {
assert_equals(ws.events.length, 4, 'only chunk "a" should have been written');
assert_array_equals(ws.events.slice(0, 3), ['write', 'a', 'abort'], 'events should match');
assert_equals(ws.events[3].name, 'AbortError', 'abort reason should be an AbortError');
});
}, 'abort should prevent further reads');
promise_test(t => {
let readController;
const rs = new ReadableStream({
start(c) {
readController = c;
c.enqueue('a');
c.enqueue('b');
}
});
const abortController = new AbortController();
const signal = abortController.signal;
let resolveWrite;
const writePromise = new Promise(resolve => {
resolveWrite = resolve;
});
const ws = recordingWritableStream({
write() {
return writePromise;
}
}, new CountQueuingStrategy({ highWaterMark: Infinity }));
const pipeToPromise = rs.pipeTo(ws, { signal });
return delay(0).then(() => {
abortController.abort();
readController.close(); // Make sure the test terminates when signal is not implemented.
resolveWrite();
return promise_rejects(t, 'AbortError', pipeToPromise, 'pipeTo should reject');
}).then(() => {
assert_equals(ws.events.length, 6, 'chunks "a" and "b" should have been written');
assert_array_equals(ws.events.slice(0, 5), ['write', 'a', 'write', 'b', 'abort'], 'events should match');
assert_equals(ws.events[5].name, 'AbortError', 'abort reason should be an AbortError');
});
}, 'all pending writes should complete on abort');
promise_test(t => {
const rs = new ReadableStream({
pull(controller) {
controller.error('failed to abort');
},
cancel() {
return Promise.reject(error1);
}
}, hwm0);
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, error1, rs.pipeTo(ws, { signal }), 'pipeTo should reject');
}, 'a rejection from underlyingSource.cancel() should be returned by pipeTo()');
promise_test(t => {
const rs = new ReadableStream(errorOnPull, hwm0);
const ws = new WritableStream({
abort() {
return Promise.reject(error1);
}
});
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, error1, rs.pipeTo(ws, { signal }), 'pipeTo should reject');
}, 'a rejection from underlyingSink.abort() should be returned by pipeTo()');
promise_test(t => {
const events = [];
const rs = new ReadableStream({
pull(controller) {
controller.error('failed to abort');
},
cancel() {
events.push('cancel');
return Promise.reject(error1);
}
}, hwm0);
const ws = new WritableStream({
abort() {
events.push('abort');
return Promise.reject(error2);
}
});
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, error2, rs.pipeTo(ws, { signal }), 'pipeTo should reject')
.then(() => assert_array_equals(events, ['abort', 'cancel'], 'abort() should be called before cancel()'));
}, 'a rejection from underlyingSink.abort() should be preferred to one from underlyingSource.cancel()');
promise_test(t => {
const rs = new ReadableStream({
start(controller) {
controller.close();
}
});
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal }), 'pipeTo should reject');
}, 'abort signal takes priority over closed readable');
promise_test(t => {
const rs = new ReadableStream({
start(controller) {
controller.error(error1);
}
});
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal }), 'pipeTo should reject');
}, 'abort signal takes priority over errored readable');
promise_test(t => {
const rs = new ReadableStream({
pull(controller) {
controller.error('failed to abort');
}
}, hwm0);
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
const writer = ws.getWriter();
return writer.close().then(() => {
writer.releaseLock();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal }), 'pipeTo should reject');
});
}, 'abort signal takes priority over closed writable');
promise_test(t => {
const rs = new ReadableStream({
pull(controller) {
controller.error('failed to abort');
}
}, hwm0);
const ws = new WritableStream({
start(controller) {
controller.error(error1);
}
});
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal }), 'pipeTo should reject');
}, 'abort signal takes priority over errored writable');
promise_test(() => {
let readController;
const rs = new ReadableStream({
start(c) {
readController = c;
}
});
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
const pipeToPromise = rs.pipeTo(ws, { signal, preventClose: true });
readController.close();
return Promise.resolve().then(() => {
abortController.abort();
return pipeToPromise;
}).then(() => ws.getWriter().write('this should succeed'));
}, 'abort should do nothing after the readable is closed');
promise_test(t => {
let readController;
const rs = new ReadableStream({
start(c) {
readController = c;
}
});
const ws = new WritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
const pipeToPromise = rs.pipeTo(ws, { signal, preventAbort: true });
readController.error(error1);
return Promise.resolve().then(() => {
abortController.abort();
return promise_rejects(t, error1, pipeToPromise, 'pipeTo should reject');
}).then(() => ws.getWriter().write('this should succeed'));
}, 'abort should do nothing after the readable is errored');
promise_test(t => {
let readController;
const rs = new ReadableStream({
start(c) {
readController = c;
}
});
let resolveWrite;
const writePromise = new Promise(resolve => {
resolveWrite = resolve;
});
const ws = new WritableStream({
write() {
readController.error(error1);
return writePromise;
}
});
const abortController = new AbortController();
const signal = abortController.signal;
const pipeToPromise = rs.pipeTo(ws, { signal, preventAbort: true });
readController.enqueue('a');
return delay(0).then(() => {
abortController.abort();
resolveWrite();
return promise_rejects(t, error1, pipeToPromise, 'pipeTo should reject');
}).then(() => ws.getWriter().write('this should succeed'));
}, 'abort should do nothing after the readable is errored, even with pending writes');
promise_test(t => {
const rs = recordingReadableStream({
pull(controller) {
return delay(0).then(() => controller.close());
}
});
let writeController;
const ws = new WritableStream({
start(c) {
writeController = c;
}
});
const abortController = new AbortController();
const signal = abortController.signal;
const pipeToPromise = rs.pipeTo(ws, { signal, preventCancel: true });
return Promise.resolve().then(() => {
writeController.error(error1);
return Promise.resolve();
}).then(() => {
abortController.abort();
return promise_rejects(t, error1, pipeToPromise, 'pipeTo should reject');
}).then(() => {
assert_array_equals(rs.events, ['pull'], 'cancel should not have been called');
});
}, 'abort should do nothing after the writable is errored');
done();

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>abort.js service worker wrapper file</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<script>
'use strict';
service_worker_test('abort.js', 'Service worker test setup');
</script>

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>abort.js shared worker wrapper file</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
fetch_tests_from_worker(new SharedWorker('abort.js'));
</script>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:h="http://www.w3.org/1999/xhtml"
width="800px" height="8000px">
<title>Inheritance of pointer-events</title>
<metadata>
<h:link rel="help" href="https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"/>
<h:meta name="assert" content="pointer-events inherits according to the spec."/>
<h:meta name="assert" content="pointer-events has initial value auto."/>
</metadata>
<g id="container">
<g id="target"></g>
</g>
<h:script src="/resources/testharness.js"/>
<h:script src="/resources/testharnessreport.js"/>
<h:script src="/css/support/inheritance-testcommon.js"/>
<script><![CDATA[
assert_inherited('pointer-events', 'auto', 'none');
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 799 B

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:h="http://www.w3.org/1999/xhtml"
width="800px" height="8000px">
<title>SVG Scripting and Interactivity: parsing pointer-events with invalid values</title>
<metadata>
<h:link rel="help" href="https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"/>
<h:meta name="assert" content="pointer-events supports only the grammar 'auto | bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none'."/>
</metadata>
<g id="target"></g>
<h:script src="/resources/testharness.js"/>
<h:script src="/resources/testharnessreport.js"/>
<h:script src="/css/support/parsing-testcommon.js"/>
<script><![CDATA[
test_invalid_value("pointer-events", "markers");
test_invalid_value("pointer-events", "0");
test_invalid_value("pointer-events", "visiblePainted visibleFill");
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 953 B

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:h="http://www.w3.org/1999/xhtml"
width="800px" height="8000px">
<title>SVG Scripting and Interactivity: parsing pointer-events with valid values</title>
<metadata>
<h:link rel="help" href="https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"/>
<h:meta name="assert" content="pointer-events supports the full grammar 'auto | bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none'."/>
</metadata>
<g id="target"></g>
<h:script src="/resources/testharness.js"/>
<h:script src="/resources/testharnessreport.js"/>
<h:script src="/css/support/parsing-testcommon.js"/>
<script><![CDATA[
test_valid_value("pointer-events", "auto");
test_valid_value("pointer-events", "bounding-box");
test_valid_value("pointer-events", "visiblePainted");
test_valid_value("pointer-events", "visibleFill");
test_valid_value("pointer-events", "visibleStroke");
test_valid_value("pointer-events", "visible");
test_valid_value("pointer-events", "painted");
test_valid_value("pointer-events", "fill");
test_valid_value("pointer-events", "stroke");
test_valid_value("pointer-events", "all");
test_valid_value("pointer-events", "none");
]]></script>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -89,7 +89,11 @@ def run(*args, **kwargs):
logger.info(path) logger.info(path)
def __main__(): def main():
kwargs = get_parser().parse_args() kwargs = get_parser().parse_args()
run(None, vars(kwargs)) run(None, vars(kwargs))
if __name__ == "__main__":
main()

View file

@ -11,10 +11,14 @@ select = E,W,F,N
# E305: expected 2 blank lines after end of function or class # E305: expected 2 blank lines after end of function or class
# E402: module level import not at top of file # E402: module level import not at top of file
# E731: do not assign a lambda expression, use a def # E731: do not assign a lambda expression, use a def
# W504: line break after binary operator
# W601: .has_key() is deprecated, use in # W601: .has_key() is deprecated, use in
# W605: invalid escape sequence
# W606: 'async' and 'await' are reserved keywords starting with Python 3.7
# N801: class names should use CapWords convention # N801: class names should use CapWords convention
# N802: function name should be lowercase # N802: function name should be lowercase
ignore = E128,E129,E226,E231,E251,E265,E302,E303,E305,E402,E731,W601,N801,N802 # N806: variable in function should be lowercase
ignore = E128,E129,E226,E231,E251,E265,E302,E303,E305,E402,E731,W504,W601,W605,W606,N801,N802,N806
exclude = exclude =
.tox, .tox,
pywebsocket, pywebsocket,

View file

@ -11,9 +11,11 @@ select = E,W,F,N
# E305: expected 2 blank lines after end of function or class # E305: expected 2 blank lines after end of function or class
# E402: module level import not at top of file # E402: module level import not at top of file
# E731: do not assign a lambda expression, use a def # E731: do not assign a lambda expression, use a def
# W504: line break after binary operator
# W605: invalid escape sequence
# N801: class names should use CapWords convention # N801: class names should use CapWords convention
# N802: function name should be lowercase # N802: function name should be lowercase
ignore = E128,E129,E226,E231,E251,E265,E302,E303,E305,E402,E731,N801,N802 ignore = E128,E129,E226,E231,E251,E265,E302,E303,E305,E402,E731,W504,W605,N801,N802
exclude = exclude =
.tox, .tox,
pywebsocket, pywebsocket,

View file

@ -1,4 +1,4 @@
flake8==3.5.0 flake8==3.6.0
pycodestyle==2.3.1 pycodestyle==2.4.0
pyflakes==1.6.0 pyflakes==2.0.0
pep8-naming==0.4.1 pep8-naming==0.7.0

View file

@ -210,7 +210,7 @@ class FennecBrowser(FirefoxBrowser):
process_class=ProcessHandler, process_class=ProcessHandler,
process_args={"processOutputLine": [self.on_output]}) process_args={"processOutputLine": [self.on_output]})
self.logger.debug("Starting Fennec") self.logger.debug("Starting %s" % self.package_name)
# connect to a running emulator # connect to a running emulator
self.runner.device.connect() self.runner.device.connect()
@ -222,7 +222,7 @@ class FennecBrowser(FirefoxBrowser):
local="tcp:{}".format(self.marionette_port), local="tcp:{}".format(self.marionette_port),
remote="tcp:{}".format(self.marionette_port)) remote="tcp:{}".format(self.marionette_port))
self.logger.debug("Fennec Started") self.logger.debug("%s Started" % self.package_name)
def stop(self, force=False): def stop(self, force=False):
if self.runner is not None: if self.runner is not None:

View file

@ -15,7 +15,8 @@ __wptrunner__ = {"product": "webkit",
"wdspec": "WebKitDriverWdspecExecutor"}, "wdspec": "WebKitDriverWdspecExecutor"},
"executor_kwargs": "executor_kwargs", "executor_kwargs": "executor_kwargs",
"env_extras": "env_extras", "env_extras": "env_extras",
"env_options": "env_options"} "env_options": "env_options",
"run_info_extras": "run_info_extras"}
def check_args(**kwargs): def check_args(**kwargs):
@ -31,22 +32,22 @@ def browser_kwargs(test_type, run_info_data, config, **kwargs):
def capabilities_for_port(server_config, **kwargs): def capabilities_for_port(server_config, **kwargs):
if kwargs["webkit_port"] == "gtk": port_name = kwargs["webkit_port"]
capabilities = { if port_name in ["gtk", "wpe"]:
port_key_map = {"gtk": "webkitgtk"}
browser_options_port = port_key_map.get(port_name, port_name)
browser_options_key = "%s:browserOptions" % browser_options_port
return {
"browserName": "MiniBrowser", "browserName": "MiniBrowser",
"browserVersion": "2.20", "browserVersion": "2.20",
"platformName": "ANY", "platformName": "ANY",
"webkitgtk:browserOptions": { browser_options_key: {
"binary": kwargs["binary"], "binary": kwargs["binary"],
"args": kwargs.get("binary_args", []), "args": kwargs.get("binary_args", []),
"certificates": [ "certificates": [
{"host": server_config["browser_host"], {"host": server_config["browser_host"],
"certificateFile": kwargs["host_cert_path"]} "certificateFile": kwargs["host_cert_path"]}]}}
]
}
}
return capabilities
return {} return {}
@ -69,6 +70,10 @@ def env_options():
return {} return {}
def run_info_extras(**kwargs):
return {"webkit_port": kwargs["webkit_port"]}
class WebKitBrowser(Browser): class WebKitBrowser(Browser):
"""Generic WebKit browser is backed by WebKit's WebDriver implementation, """Generic WebKit browser is backed by WebKit's WebDriver implementation,
which is supplied through ``wptrunner.webdriver.WebKitDriverServer``. which is supplied through ``wptrunner.webdriver.WebKitDriverServer``.

View file

@ -1,8 +1,55 @@
import json import json
import re
import sys
from mozlog.structured.formatters.base import BaseFormatter from mozlog.structured.formatters.base import BaseFormatter
LONE_SURROGATE_RE = re.compile(u"[\uD800-\uDFFF]")
def surrogate_replacement_ucs4(match):
return "U+" + hex(ord(match.group()))[2:]
class SurrogateReplacementUcs2(object):
def __init__(self):
self.skip = False
def __call__(self, match):
char = match.group()
if self.skip:
self.skip = False
return char
is_low = 0xD800 <= ord(char) <= 0xDBFF
escape = True
if is_low:
next_idx = match.end()
if next_idx < len(match.string):
next_char = match.string[next_idx]
if 0xDC00 <= ord(next_char) <= 0xDFFF:
escape = False
if not escape:
self.skip = True
return char
return "U+" + hex(ord(match.group()))[2:]
if sys.maxunicode == 0x10FFFF:
surrogate_replacement = surrogate_replacement_ucs4
else:
surrogate_replacement = SurrogateReplacementUcs2()
def replace_lone_surrogate(data):
return LONE_SURROGATE_RE.subn(surrogate_replacement, data)[0]
class WptreportFormatter(BaseFormatter): class WptreportFormatter(BaseFormatter):
"""Formatter that produces results in the format that wpreport expects.""" """Formatter that produces results in the format that wpreport expects."""
@ -40,7 +87,7 @@ class WptreportFormatter(BaseFormatter):
def create_subtest(self, data): def create_subtest(self, data):
test = self.find_or_create_test(data) test = self.find_or_create_test(data)
subtest_name = data["subtest"] subtest_name = replace_lone_surrogate(data["subtest"])
subtest = { subtest = {
"name": subtest_name, "name": subtest_name,
@ -57,7 +104,7 @@ class WptreportFormatter(BaseFormatter):
if "expected" in data: if "expected" in data:
subtest["expected"] = data["expected"] subtest["expected"] = data["expected"]
if "message" in data: if "message" in data:
subtest["message"] = data["message"] subtest["message"] = replace_lone_surrogate(data["message"])
def test_end(self, data): def test_end(self, data):
test = self.find_or_create_test(data) test = self.find_or_create_test(data)
@ -67,7 +114,7 @@ class WptreportFormatter(BaseFormatter):
if "expected" in data: if "expected" in data:
test["expected"] = data["expected"] test["expected"] = data["expected"]
if "message" in data: if "message" in data:
test["message"] = data["message"] test["message"] = replace_lone_surrogate(data["message"])
def assertion_count(self, data): def assertion_count(self, data):
test = self.find_or_create_test(data) test = self.find_or_create_test(data)

View file

@ -4,10 +4,13 @@ import time
from os.path import dirname, join from os.path import dirname, join
from StringIO import StringIO from StringIO import StringIO
import mock
from mozlog import handlers, structuredlog from mozlog import handlers, structuredlog
sys.path.insert(0, join(dirname(__file__), "..", "..")) sys.path.insert(0, join(dirname(__file__), "..", ".."))
from wptrunner import formatters
from wptrunner.formatters import WptreportFormatter from wptrunner.formatters import WptreportFormatter
@ -62,3 +65,73 @@ def test_wptreport_run_info_optional(capfd):
output.seek(0) output.seek(0)
output_obj = json.load(output) output_obj = json.load(output)
assert "run_info" not in output_obj or output_obj["run_info"] == {} assert "run_info" not in output_obj or output_obj["run_info"] == {}
def test_wptreport_lone_surrogate(capfd):
output = StringIO()
logger = structuredlog.StructuredLogger("test_a")
logger.add_handler(handlers.StreamHandler(output, WptreportFormatter()))
# output a bunch of stuff
logger.suite_start(["test-id-1"]) # no run_info arg!
logger.test_start("test-id-1")
logger.test_status("test-id-1",
subtest=u"Name with surrogate\uD800",
status="FAIL",
message=u"\U0001F601 \uDE0A\uD83D")
logger.test_end("test-id-1",
status="PASS",
message=u"\uDE0A\uD83D \U0001F601")
logger.suite_end()
# check nothing got output to stdout/stderr
# (note that mozlog outputs exceptions during handling to stderr!)
captured = capfd.readouterr()
assert captured.out == ""
assert captured.err == ""
# check the actual output of the formatter
output.seek(0)
output_obj = json.load(output)
test = output_obj["results"][0]
assert test["message"] == u"U+de0aU+d83d \U0001F601"
subtest = test["subtests"][0]
assert subtest["name"] == u"Name with surrogateU+d800"
assert subtest["message"] == u"\U0001F601 U+de0aU+d83d"
def test_wptreport_lone_surrogate_ucs2(capfd):
# Since UCS4 is a superset of UCS2 we can meaningfully test the UCS2 code on a
# UCS4 build, but not the reverse. However UCS2 is harder to handle and UCS4 is
# the commonest (and sensible) configuration, so that's OK.
output = StringIO()
logger = structuredlog.StructuredLogger("test_a")
logger.add_handler(handlers.StreamHandler(output, WptreportFormatter()))
with mock.patch.object(formatters, 'surrogate_replacement', formatters.SurrogateReplacementUcs2()):
# output a bunch of stuff
logger.suite_start(["test-id-1"]) # no run_info arg!
logger.test_start("test-id-1")
logger.test_status("test-id-1",
subtest=u"Name with surrogate\uD800",
status="FAIL",
message=u"\U0001F601 \uDE0A\uD83D \uD83D\uDE0A")
logger.test_end("test-id-1",
status="PASS",
message=u"\uDE0A\uD83D \uD83D\uDE0A \U0001F601")
logger.suite_end()
# check nothing got output to stdout/stderr
# (note that mozlog outputs exceptions during handling to stderr!)
captured = capfd.readouterr()
assert captured.out == ""
assert captured.err == ""
# check the actual output of the formatter
output.seek(0)
output_obj = json.load(output)
test = output_obj["results"][0]
assert test["message"] == u"U+de0aU+d83d \U0001f60a \U0001F601"
subtest = test["subtests"][0]
assert subtest["name"] == u"Name with surrogateU+d800"
assert subtest["message"] == u"\U0001F601 U+de0aU+d83d \U0001f60a"

View file

@ -7,8 +7,6 @@ import traceback
from six.moves.urllib.parse import parse_qs, quote, unquote, urljoin from six.moves.urllib.parse import parse_qs, quote, unquote, urljoin
from six import iteritems from six import iteritems
from h2.events import RequestReceived, DataReceived
from .constants import content_types from .constants import content_types
from .pipes import Pipeline, template from .pipes import Pipeline, template
from .ranges import RangeParser from .ranges import RangeParser
@ -79,7 +77,7 @@ class DirectoryHandler(object):
%(items)s %(items)s
</ul> </ul>
""" % {"path": cgi.escape(url_path), """ % {"path": cgi.escape(url_path),
"items": "\n".join(self.list_items(url_path, path))} # flake8: noqa "items": "\n".join(self.list_items(url_path, path))} # noqa: E122
def list_items(self, base_path, path): def list_items(self, base_path, path):
assert base_path.endswith("/") assert base_path.endswith("/")

View file

@ -548,7 +548,7 @@ class Http1WebTestRequestHandler(BaseWebTestRequestHandler):
self.close_connection = True self.close_connection = True
return return
except Exception as e: except Exception:
err = traceback.format_exc() err = traceback.format_exc()
if response: if response:
response.set_error(500, err) response.set_error(500, err)

View file

@ -196,7 +196,7 @@ const gCSSProperties = {
'border-image-repeat': { 'border-image-repeat': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-repeat // https://drafts.csswg.org/css-backgrounds-3/#border-image-repeat
types: [ types: [
{ type: 'discrete', options: [ [ 'stretch stretch', 'repeat repeat' ] ] } { type: 'discrete', options: [ [ 'stretch repeat', 'round space' ] ] }
] ]
}, },
'border-image-slice': { 'border-image-slice': {

View file

@ -1,10 +1 @@
def retrieve_element_rect(session, element):
return session.execute_script("""
let rect = arguments[0].getBoundingClientRect();
return {
x: rect.left + window.pageXOffset,
y: rect.top + window.pageYOffset,
width: rect.width,
height: rect.height,
};
""", args=(element,))

View file

@ -1,8 +1,7 @@
from tests.support.asserts import assert_error, assert_success from tests.support.asserts import assert_error, assert_success
from tests.support.helpers import element_rect
from tests.support.inline import inline from tests.support.inline import inline
from . import retrieve_element_rect
def get_element_rect(session, element_id): def get_element_rect(session, element_id):
return session.transport.send( return session.transport.send(
@ -38,4 +37,4 @@ def test_basic(session):
element = session.find.css("input", all=False) element = session.find.css("input", all=False)
result = get_element_rect(session, element.id) result = get_element_rect(session, element.id)
assert_success(result, retrieve_element_rect(session, element)) assert_success(result, element_rect(session, element))

View file

@ -3,10 +3,9 @@
import pytest import pytest
from tests.support.asserts import assert_error, assert_success, assert_dialog_handled from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
from tests.support.helpers import element_rect
from tests.support.inline import inline from tests.support.inline import inline
from . import retrieve_element_rect
def get_element_rect(session, element_id): def get_element_rect(session, element_id):
return session.transport.send( return session.transport.send(
@ -27,7 +26,7 @@ def check_user_prompt_closed_without_exception(session, create_dialog):
create_dialog(dialog_type, text=dialog_type) create_dialog(dialog_type, text=dialog_type)
response = get_element_rect(session, element.id) response = get_element_rect(session, element.id)
assert_success(response, retrieve_element_rect(session, element)) assert_success(response, element_rect(session, element))
assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval)

View file

@ -1,5 +1,6 @@
import base64 import base64
import imghdr import imghdr
import struct
from webdriver import Element, NoSuchAlertException, WebDriverException from webdriver import Element, NoSuchAlertException, WebDriverException

View file

@ -231,4 +231,3 @@ def closed_window(session, create_window):
yield new_handle yield new_handle
session.window_handle = original_handle session.window_handle = original_handle

View file

@ -105,6 +105,34 @@ def clear_all_cookies(session):
session.transport.send("DELETE", "session/%s/cookie" % session.session_id) session.transport.send("DELETE", "session/%s/cookie" % session.session_id)
def document_dimensions(session):
return tuple(session.execute_script("""
let {width, height} = document.documentElement.getBoundingClientRect();
return [width, height];
"""))
def document_hidden(session):
"""Polls for the document to become hidden."""
def hidden(session):
return session.execute_script("return document.hidden")
return Poll(session, timeout=3, raises=None).until(hidden)
def element_rect(session, element):
return session.execute_script("""
let element = arguments[0];
let {height, left, top, width} = element.getBoundingClientRect();
return {
x: left + window.pageXOffset,
y: top + window.pageYOffset,
width: width,
height: height,
};
""", args=(element,))
def is_element_in_viewport(session, element): def is_element_in_viewport(session, element):
"""Check if element is outside of the viewport""" """Check if element is outside of the viewport"""
return session.execute_script(""" return session.execute_script("""
@ -121,13 +149,6 @@ def is_element_in_viewport(session, element):
""", args=(element,)) """, args=(element,))
def document_hidden(session):
"""Polls for the document to become hidden."""
def hidden(session):
return session.execute_script("return document.hidden")
return Poll(session, timeout=3, raises=None).until(hidden)
def is_fullscreen(session): def is_fullscreen(session):
# At the time of writing, WebKit does not conform to the # At the time of writing, WebKit does not conform to the
# Fullscreen API specification. # Fullscreen API specification.
@ -137,11 +158,3 @@ def is_fullscreen(session):
return session.execute_script(""" return session.execute_script("""
return !!(window.fullScreen || document.webkitIsFullScreen) return !!(window.fullScreen || document.webkitIsFullScreen)
""") """)
def document_dimensions(session):
return tuple(session.execute_script("""
let {devicePixelRatio} = window;
let {width, height} = document.documentElement.getBoundingClientRect();
return [width * devicePixelRatio, height * devicePixelRatio];
"""))

View file

@ -1,4 +1,5 @@
import base64 import base64
import math
import struct import struct
from tests.support.asserts import assert_png from tests.support.asserts import assert_png

View file

@ -0,0 +1,12 @@
def element_rect(session, element):
return session.execute_script("""
let {devicePixelRatio} = window;
let rect = arguments[0].getBoundingClientRect();
return {
x: Math.floor((rect.left + window.pageXOffset) * devicePixelRatio),
y: Math.floor((rect.top + window.pageYOffset) * devicePixelRatio),
width: Math.floor(rect.width * devicePixelRatio),
height: Math.floor(rect.height * devicePixelRatio),
};
""", args=(element,))

View file

@ -1,9 +1,9 @@
import base64 from tests.support.asserts import assert_error, assert_png, assert_success
import imghdr from tests.support.image import png_dimensions
from tests.support.asserts import assert_error, assert_success
from tests.support.inline import inline from tests.support.inline import inline
from . import element_rect
def take_element_screenshot(session, element_id): def take_element_screenshot(session, element_id):
return session.transport.send( return session.transport.send(
@ -20,17 +20,6 @@ def test_no_browsing_context(session, closed_window):
assert_error(response, "no such window") assert_error(response, "no such window")
def test_screenshot(session):
session.url = inline("<input>")
element = session.find.css("input", all=False)
response = take_element_screenshot(session, element.id)
value = assert_success(response)
image = base64.decodestring(value)
assert imghdr.what("", image) == "png"
def test_stale(session): def test_stale(session):
session.url = inline("<input>") session.url = inline("<input>")
element = session.find.css("input", all=False) element = session.find.css("input", all=False)
@ -38,3 +27,15 @@ def test_stale(session):
result = take_element_screenshot(session, element.id) result = take_element_screenshot(session, element.id)
assert_error(result, "stale element reference") assert_error(result, "stale element reference")
def test_format_and_dimensions(session):
session.url = inline("<input>")
element = session.find.css("input", all=False)
rect = element_rect(session, element)
response = take_element_screenshot(session, element.id)
value = assert_success(response)
assert_png(value)
assert png_dimensions(value) == (rect["width"], rect["height"])

View file

@ -1,11 +1,8 @@
# META: timeout=long # META: timeout=long
import base64
import imghdr
import pytest import pytest
from tests.support.asserts import assert_success from tests.support.asserts import assert_png, assert_success
from tests.support.inline import inline from tests.support.inline import inline
@ -30,8 +27,7 @@ def check_user_prompt_not_closed_without_exception(session, create_dialog):
response = take_element_screenshot(session, element.id) response = take_element_screenshot(session, element.id)
value = assert_success(response) value = assert_success(response)
image = base64.decodestring(value) assert_png(value)
assert imghdr.what("", image) == "png"
assert session.alert.text == dialog_type assert session.alert.text == dialog_type
session.alert.dismiss() session.alert.dismiss()

View file

@ -0,0 +1,6 @@
def document_dimensions(session):
return tuple(session.execute_script("""
let {devicePixelRatio} = window;
let {width, height} = document.documentElement.getBoundingClientRect();
return [Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio)];
"""))

View file

@ -1,9 +1,9 @@
import base64 from tests.support.asserts import assert_error, assert_png, assert_success
import imghdr from tests.support.image import png_dimensions
from tests.support.asserts import assert_error, assert_success
from tests.support.inline import inline from tests.support.inline import inline
from . import document_dimensions
def take_screenshot(session): def take_screenshot(session):
return session.transport.send( return session.transport.send(
@ -15,11 +15,11 @@ def test_no_browsing_context(session, closed_window):
assert_error(response, "no such window") assert_error(response, "no such window")
def test_screenshot(session): def test_format_and_dimensions(session):
session.url = inline("<input>") session.url = inline("<input>")
response = take_screenshot(session) response = take_screenshot(session)
value = assert_success(response) value = assert_success(response)
image = base64.decodestring(value) assert_png(value)
assert imghdr.what("", image) == "png" assert png_dimensions(value) == document_dimensions(session)

View file

@ -1,11 +1,8 @@
# META: timeout=long # META: timeout=long
import base64
import imghdr
import pytest import pytest
from tests.support.asserts import assert_success from tests.support.asserts import assert_png, assert_success
from tests.support.inline import inline from tests.support.inline import inline
@ -24,8 +21,7 @@ def check_user_prompt_not_closed_without_exception(session, create_dialog):
response = take_screenshot(session) response = take_screenshot(session)
value = assert_success(response) value = assert_success(response)
image = base64.decodestring(value) assert_png(value)
assert imghdr.what("", image) == "png"
assert session.alert.text == dialog_type assert session.alert.text == dialog_type
session.alert.dismiss() session.alert.dismiss()

View file

@ -247,7 +247,7 @@
// tonechange event, to make sure that tonechange is triggered // tonechange event, to make sure that tonechange is triggered
// then stopped // then stopped
if(tone === 'A') { if(tone === 'A') {
transceiver.setDirection('recvonly'); transceiver.direction = 'recvonly';
pc.createOffer() pc.createOffer()
.then(offer => .then(offer =>

View file

@ -85,57 +85,27 @@
})); }));
}, 'replaceTrack() rejects when the peer connection is closed.'); }, 'replaceTrack() rejects when the peer connection is closed.');
async_test(t => { promise_test(async t => {
const expectedException = 'InvalidModificationError';
const caller = new RTCPeerConnection(); const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close()); t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2) const [tracks, streams] = await getUserMediaTracksAndStreams(2);
.then(t.step_func(([tracks, streams]) => { const sender = caller.addTrack(tracks[0], streams[0]);
const sender = caller.addTrack(tracks[0], streams[0]); caller.removeTrack(sender);
caller.removeTrack(sender); await sender.replaceTrack(tracks[1]);
// replaceTrack() should fail because the sender should be inactive after assert_equals(sender.track, tracks[1], "Make sure track gets updated");
// removeTrack(). }, 'replaceTrack() does not reject when invoked after removeTrack().');
return sender.replaceTrack(tracks[1])
.then(t.step_func(() => {
assert_unreached('Expected replaceTrack() to be rejected with ' +
expectedException + ' but the promise was resolved.');
}),
t.step_func(e => {
assert_equals(e.name, expectedException);
t.done();
}));
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
}, 'replaceTrack() rejects when invoked after removeTrack().');
async_test(t => {
const expectedException = 'InvalidModificationError'; promise_test(async t => {
const caller = new RTCPeerConnection(); const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close()); t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2) const [tracks, streams] = await getUserMediaTracksAndStreams(2);
.then(t.step_func(([tracks, streams]) => { const sender = caller.addTrack(tracks[0], streams[0]);
const sender = caller.addTrack(tracks[0], streams[0]); let p = sender.replaceTrack(tracks[1])
let p = sender.replaceTrack(tracks[1]) caller.removeTrack(sender);
caller.removeTrack(sender); await p;
// replaceTrack() should fail because it executes steps in parallel and assert_equals(sender.track, tracks[1], "Make sure track gets updated");
// queues a task to execute after removeTrack() has occurred. The sender }, 'replaceTrack() does not reject after a subsequent removeTrack().');
// should be inactive. If this can be racy, update or remove the test.
// https://github.com/w3c/webrtc-pc/issues/1728
return p.then(t.step_func(() => {
assert_unreached('Expected replaceTrack() to be rejected with ' +
expectedException + ' but the promise was resolved.');
}),
t.step_func(e => {
assert_equals(e.name, expectedException);
t.done();
}));
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
}, 'replaceTrack() rejects after a subsequent removeTrack().');
// TODO(hbos): Verify that replaceTrack() changes what media is received on // TODO(hbos): Verify that replaceTrack() changes what media is received on
// the remote end of two connected peer connections. For video tracks, this // the remote end of two connected peer connections. For video tracks, this

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<meta charset=utf-8> <meta charset=utf-8>
<title>RTCRtpTransceiver.prototype.setDirection</title> <title>RTCRtpTransceiver.prototype.direction</title>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script> <script src="RTCPeerConnection-helper.js"></script>
@ -8,7 +8,7 @@
'use strict'; 'use strict';
// Test is based on the following editor draft: // Test is based on the following editor draft:
// https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html // https://rawgit.com/w3c/webrtc-pc/8495678808d126d8bc764bf944996f32981fa6fd/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js: // The following helper functions are called from RTCPeerConnection-helper.js:
// generateAnswer // generateAnswer
@ -16,16 +16,15 @@
/* /*
5.4. RTCRtpTransceiver Interface 5.4. RTCRtpTransceiver Interface
interface RTCRtpTransceiver { interface RTCRtpTransceiver {
readonly attribute RTCRtpTransceiverDirection direction; attribute RTCRtpTransceiverDirection direction;
readonly attribute RTCRtpTransceiverDirection? currentDirection; readonly attribute RTCRtpTransceiverDirection? currentDirection;
void setDirection(RTCRtpTransceiverDirection direction);
... ...
}; };
*/ */
/* /*
5.4. setDirection 5.4. direction
4. Set transceiver's [[Direction]] slot to newDirection. 7. Set transceiver's [[Direction]] slot to newDirection.
*/ */
test(t => { test(t => {
const pc = new RTCPeerConnection(); const pc = new RTCPeerConnection();
@ -33,15 +32,15 @@
assert_equals(transceiver.direction, 'sendrecv'); assert_equals(transceiver.direction, 'sendrecv');
assert_equals(transceiver.currentDirection, null); assert_equals(transceiver.currentDirection, null);
transceiver.setDirection('recvonly'); transceiver.direction = 'recvonly';
assert_equals(transceiver.direction, 'recvonly'); assert_equals(transceiver.direction, 'recvonly');
assert_equals(transceiver.currentDirection, null, assert_equals(transceiver.currentDirection, null,
'Expect transceiver.currentDirection to not change'); 'Expect transceiver.currentDirection to not change');
}, 'setDirection should change transceiver.direction'); }, 'setting direction should change transceiver.direction');
/* /*
5.4. setDirection 5.4. direction
3. If newDirection is equal to transceiver's [[Direction]] slot, abort 3. If newDirection is equal to transceiver's [[Direction]] slot, abort
these steps. these steps.
*/ */
@ -49,10 +48,10 @@
const pc = new RTCPeerConnection(); const pc = new RTCPeerConnection();
const transceiver = pc.addTransceiver('audio', { direction: 'sendonly' }); const transceiver = pc.addTransceiver('audio', { direction: 'sendonly' });
assert_equals(transceiver.direction, 'sendonly'); assert_equals(transceiver.direction, 'sendonly');
transceiver.setDirection('sendonly'); transceiver.direction = 'sendonly';
assert_equals(transceiver.direction, 'sendonly'); assert_equals(transceiver.direction, 'sendonly');
}, 'setDirection with same direction should have no effect'); }, 'setting direction with same direction should have no effect');
promise_test(t => { promise_test(t => {
const pc = new RTCPeerConnection(); const pc = new RTCPeerConnection();
@ -67,22 +66,22 @@
.then(() => generateAnswer(offer))) .then(() => generateAnswer(offer)))
.then(answer => pc.setRemoteDescription(answer)) .then(answer => pc.setRemoteDescription(answer))
.then(() => { .then(() => {
assert_equals(transceiver.currentDirection, 'recvonly'); assert_equals(transceiver.currentDirection, 'inactive');
transceiver.setDirection('sendrecv'); transceiver.direction = 'sendrecv';
assert_equals(transceiver.direction, 'sendrecv'); assert_equals(transceiver.direction, 'sendrecv');
assert_equals(transceiver.currentDirection, 'recvonly'); assert_equals(transceiver.currentDirection, 'inactive');
}); });
}, 'setDirection should change transceiver.direction independent of transceiver.currentDirection'); }, 'setting direction should change transceiver.direction independent of transceiver.currentDirection');
/* /*
TODO TODO
Calls to setDirection() do not take effect immediately. Instead, future calls An update of directionality does not take effect immediately. Instead, future calls
to createOffer and createAnswer mark the corresponding media description as to createOffer and createAnswer mark the corresponding media description as
sendrecv, sendonly, recvonly or inactive as defined in [JSEP] (section 5.2.2. sendrecv, sendonly, recvonly or inactive as defined in [JSEP] (section 5.2.2.
and section 5.3.2.). and section 5.3.2.).
Tested in RTCPeerConnection-onnegotiationneeded.html Tested in RTCPeerConnection-onnegotiationneeded.html
5.4. setDirection 5.4. direction
6. Update the negotiation-needed flag for connection. 6. Update the negotiation-needed flag for connection.
Coverage Report Coverage Report

View file

@ -1181,7 +1181,7 @@
"InvalidStateError", "replaceTrack on stopped transceiver"); "InvalidStateError", "replaceTrack on stopped transceiver");
checkThrows(() => transceiver.direction = "sendrecv", checkThrows(() => transceiver.direction = "sendrecv",
"InvalidStateError", "setDirection on stopped transceiver"); "InvalidStateError", "set direction on stopped transceiver");
checkThrows(() => transceiver.sender.dtmf.insertDTMF("111"), checkThrows(() => transceiver.sender.dtmf.insertDTMF("111"),
"InvalidStateError", "insertDTMF on stopped transceiver"); "InvalidStateError", "insertDTMF on stopped transceiver");
@ -1775,7 +1775,7 @@
await pc2.setRemoteDescription({type: "rollback"}); await pc2.setRemoteDescription({type: "rollback"});
// Transceiver should be _gone_, again. replaceTrack doesn't prevent this, // Transceiver should be _gone_, again. replaceTrack doesn't prevent this,
// nor does setDirection. // nor does setting direction.
hasProps(pc2.getTransceivers(), []); hasProps(pc2.getTransceivers(), []);
// Setting the same offer for a _third_ time should do the same thing // Setting the same offer for a _third_ time should do the same thing

View file

@ -24,6 +24,14 @@ test(function() {
}, "RTCPeerConnection member " + name + " should not exist"); }, "RTCPeerConnection member " + name + " should not exist");
}); });
[
"setDirection",
].forEach(function(name) {
test(function() {
assert_false(name in RTCRtpTransceiver.prototype);
}, "RTCRtpTransceiver member " + name + " should not exist");
});
[ [
"DataChannel", "DataChannel",
"mozRTCIceCandidate", "mozRTCIceCandidate",

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/basic.vtt"> <track src="support/basic.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/regionanchor_x_50_percent.vtt"> <track src="support/regionanchor_x_50_percent.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/regionanchor_y_50_percent.vtt"> <track src="support/regionanchor_y_50_percent.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshotDelayed(3000);"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshotDelayed(3000);">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/scroll_up.vtt"> <track src="support/scroll_up.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/single_line_top_left.vtt"> <track src="support/single_line_top_left.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/viewportanchor_x_50_percent.vtt"> <track src="support/viewportanchor_x_50_percent.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

View file

@ -12,8 +12,8 @@ body { margin:0 }
</style> </style>
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>
<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> <video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
<source src="../media/white.webm" type="video/webm"> <source src="/media/white.webm" type="video/webm">
<source src="../media/white.mp4" type="video/mp4"> <source src="/media/white.mp4" type="video/mp4">
<track src="support/viewportanchor_y_50_percent.vtt"> <track src="support/viewportanchor_y_50_percent.vtt">
<script> <script>
document.getElementsByTagName('track')[0].track.mode = 'showing'; document.getElementsByTagName('track')[0].track.mode = 'showing';

Some files were not shown because too many files have changed in this diff Show more