Auto merge of #24625 - servo-wpt-sync:wpt_update_03-11-2019, r=servo-wpt-sync

Sync WPT with upstream (03-11-2019)

Automated downstream sync of changes from upstream as of 03-11-2019.
[no-wpt-sync]
r? @servo-wpt-sync
This commit is contained in:
bors-servo 2019-11-03 10:57:09 -05:00 committed by GitHub
commit 84f13342f6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
93 changed files with 1641 additions and 291 deletions

View file

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

View file

@ -130339,6 +130339,30 @@
{}
]
],
"css/css-lists/list-style-type-string-001a.html": [
[
"css/css-lists/list-style-type-string-001a.html",
[
[
"/css/css-lists/list-style-type-string-001-ref.html",
"=="
]
],
{}
]
],
"css/css-lists/list-style-type-string-001b.html": [
[
"css/css-lists/list-style-type-string-001b.html",
[
[
"/css/css-lists/list-style-type-string-001-ref.html",
"=="
]
],
{}
]
],
"css/css-lists/list-style-type-string-002.html": [
[
"css/css-lists/list-style-type-string-002.html",
@ -190757,30 +190781,6 @@
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html": [
[
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html": [
[
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html",
[
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html",
"=="
]
],
{}
]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/masking/clip-path-borderBox-1a.html": [
[
"css/vendor-imports/mozilla/mozilla-central-reftests/masking/clip-path-borderBox-1a.html",
@ -251688,6 +251688,9 @@
"css/css-lists/list-marker-with-lineheight-and-overflow-hidden-001-ref.html": [
[]
],
"css/css-lists/list-style-type-string-001-ref.html": [
[]
],
"css/css-lists/list-style-type-string-002-ref.html": [
[]
],
@ -263268,12 +263271,6 @@
"css/vendor-imports/mozilla/mozilla-central-reftests/images3/support/template-object-position-test.html": [
[]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html": [
[]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/reftest.list": [
[]
],
"css/vendor-imports/mozilla/mozilla-central-reftests/masking/blank.html": [
[]
],
@ -287766,6 +287763,9 @@
"visual-viewport/helper-resize-event-on-load-overflowing-page.html": [
[]
],
"visual-viewport/viewport-no-resize-event-on-overflow-recalc.html.ini": [
[]
],
"visual-viewport/viewport_support.js": [
[]
],
@ -320878,6 +320878,12 @@
{}
]
],
"css/css-images/animations/object-position-interpolation.html": [
[
"css/css-images/animations/object-position-interpolation.html",
{}
]
],
"css/css-images/gradient/color-stops-parsing.html": [
[
"css/css-images/gradient/color-stops-parsing.html",
@ -322984,6 +322990,12 @@
{}
]
],
"css/css-pseudo/parsing/marker-supported-properties.html": [
[
"css/css-pseudo/parsing/marker-supported-properties.html",
{}
]
],
"css/css-pseudo/parsing/tree-abiding-pseudo-elements.html": [
[
"css/css-pseudo/parsing/tree-abiding-pseudo-elements.html",
@ -324550,6 +324562,12 @@
{}
]
],
"css/css-size-adjust/animations/text-size-adjust-interpolation.html": [
[
"css/css-size-adjust/animations/text-size-adjust-interpolation.html",
{}
]
],
"css/css-size-adjust/inheritance.html": [
[
"css/css-size-adjust/inheritance.html",
@ -327886,6 +327904,12 @@
{}
]
],
"css/css-transitions/animations/text-shadow-interpolation.html": [
[
"css/css-transitions/animations/text-shadow-interpolation.html",
{}
]
],
"css/css-transitions/before-load-001.html": [
[
"css/css-transitions/before-load-001.html",
@ -354792,7 +354816,9 @@
"html/cross-origin-opener-policy/popup-redirect-cache.https.html": [
[
"html/cross-origin-opener-policy/popup-redirect-cache.https.html",
{}
{
"timeout": "long"
}
]
],
"html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html": [
@ -360530,6 +360556,12 @@
{}
]
],
"html/semantics/forms/form-submission-0/SubmitEvent.window.js": [
[
"html/semantics/forms/form-submission-0/SubmitEvent.window.html",
{}
]
],
"html/semantics/forms/form-submission-0/constructing-form-data-set.html": [
[
"html/semantics/forms/form-submission-0/constructing-form-data-set.html",
@ -360578,6 +360610,14 @@
{}
]
],
"html/semantics/forms/form-submission-0/implicit-submission.optional.html": [
[
"html/semantics/forms/form-submission-0/implicit-submission.optional.html",
{
"testdriver": true
}
]
],
"html/semantics/forms/form-submission-0/submission-checks.window.js": [
[
"html/semantics/forms/form-submission-0/submission-checks.window.html",
@ -360796,6 +360836,12 @@
{}
]
],
"html/semantics/forms/the-button-element/button-submit-children.html": [
[
"html/semantics/forms/the-button-element/button-submit-children.html",
{}
]
],
"html/semantics/forms/the-button-element/button-type.html": [
[
"html/semantics/forms/the-button-element/button-type.html",
@ -369042,6 +369088,12 @@
{}
]
],
"loading/lazyload/image-loading-lazy-multicol-tentative.html": [
[
"loading/lazyload/image-loading-lazy-multicol-tentative.html",
{}
]
],
"loading/lazyload/image-loading-lazy.tentative.html": [
[
"loading/lazyload/image-loading-lazy.tentative.html",
@ -411912,6 +411964,12 @@
{}
]
],
"svg/animations/pruning-first-interval.html": [
[
"svg/animations/pruning-first-interval.html",
{}
]
],
"svg/animations/remove-animation-element-while-animation-is-running.html": [
[
"svg/animations/remove-animation-element-while-animation-is-running.html",
@ -425537,6 +425595,12 @@
{}
]
],
"webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html": [
[
"webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html",
{}
]
],
"webrtc/RTCPeerConnection-setLocalDescription-pranswer.html": [
[
"webrtc/RTCPeerConnection-setLocalDescription-pranswer.html",
@ -457048,7 +457112,7 @@
"support"
],
".taskcluster.yml": [
"27479fb57e072114e7898494468740b239c7ae92",
"6de1e280cecdece123b42950a4c0a35cf85f4a5c",
"support"
],
".well-known/README.md": [
@ -463356,27 +463420,27 @@
"support"
],
"WebCryptoAPI/derive_bits_keys/ecdh_bits.https.any.js": [
"c69249047bf2bfceef5001ffb5ee8fbcf9859a6c",
"37e3eb4324200c85cb65ee9f077ea7433bff7783",
"testharness"
],
"WebCryptoAPI/derive_bits_keys/ecdh_bits.js": [
"fe82ffe5712e39aef2638ccf57a9695fb0197e2b",
"5cc7193aebd7942d2636d369328917b7acc3e16a",
"support"
],
"WebCryptoAPI/derive_bits_keys/ecdh_keys.https.any.js": [
"b212b92c74b0c318e8c32cb22735a1e29aa610eb",
"d8235fce5a74122591ee8b9462a1a66ac5da097c",
"testharness"
],
"WebCryptoAPI/derive_bits_keys/ecdh_keys.js": [
"b1a0bcd485d92ef46be7908396c083b75aaf9204",
"99008e0cbbe09eab687c62b8935e85a3369e5ba0",
"support"
],
"WebCryptoAPI/derive_bits_keys/hkdf.https.any.js": [
"d0d545a7d27222fede323a459fdee81e051f7106",
"02492c3741c7d1bb6f300bba51e08b911a1295bd",
"testharness"
],
"WebCryptoAPI/derive_bits_keys/hkdf.js": [
"95889676c15960796a5e6d2b242d308b9c1f5afc",
"c18a433d7f9036d94fcc649b0294a68e7750e853",
"support"
],
"WebCryptoAPI/derive_bits_keys/hkdf_vectors.js": [
@ -463384,11 +463448,11 @@
"support"
],
"WebCryptoAPI/derive_bits_keys/pbkdf2.https.any.js": [
"539f390c8afc8bd9894f3dea35dcb94a4217489f",
"2efbe523f8cd7d5daeb4dce42b893369467f9bfe",
"testharness"
],
"WebCryptoAPI/derive_bits_keys/pbkdf2.js": [
"7edc7ea5a2654ec39800cbe33b9a678bc8ee31fa",
"0403f382e1479c7c5018e91aba2ceb31b89998dc",
"support"
],
"WebCryptoAPI/derive_bits_keys/pbkdf2_vectors.js": [
@ -577067,6 +577131,10 @@
"8d3b9472b2c9a2ee88dc97f907f9d16eb4fa3755",
"support"
],
"css/css-images/animations/object-position-interpolation.html": [
"055cbc8421b6af58e636729268f7323e1710458c",
"testharness"
],
"css/css-images/css-image-fallbacks-and-annotations-ref.html": [
"f3193036766e428bf946e81b7df72bfc7f4901db",
"support"
@ -578459,6 +578527,18 @@
"422be2304c891fbd0c4f256bc3b87514d935fc81",
"visual"
],
"css/css-lists/list-style-type-string-001-ref.html": [
"0d1b1362873483fa1b900e2da3efe603648f791e",
"support"
],
"css/css-lists/list-style-type-string-001a.html": [
"f7ed6e3b342d6cd259b3df61a5445f83ab39b0f9",
"reftest"
],
"css/css-lists/list-style-type-string-001b.html": [
"f02bf13a73cd0ee025bf3e3d6ae9215feadb12b4",
"reftest"
],
"css/css-lists/list-style-type-string-002-ref.html": [
"8694b5f54424c9a6e96209950a5585352a836403",
"support"
@ -584436,7 +584516,7 @@
"support"
],
"css/css-pseudo/marker-font-properties.html": [
"a108792fa207b22110a2a70a5d3ebf635033dd5d",
"4dd780679845a34699f31febd927dc3b774a5ffd",
"reftest"
],
"css/css-pseudo/marker-inherit-line-height-ref.html": [
@ -584471,6 +584551,10 @@
"94d0c42eca8cffbd5637a1039028925c19e1f851",
"reftest"
],
"css/css-pseudo/parsing/marker-supported-properties.html": [
"451aac149dbda8eb605dadc377bfa4186a871a50",
"testharness"
],
"css/css-pseudo/parsing/tree-abiding-pseudo-elements.html": [
"05c23a3bc143ce2a005b3686af2eae2cb60cb7ba",
"testharness"
@ -587396,11 +587480,11 @@
"reftest"
],
"css/css-scroll-snap/scroll-target-align-002.html": [
"7e82f030e4c3a47e84475ad440a80b907ffbe99f",
"01db026dff29c62dbbe27a4e262bb2ed715ba5ef",
"reftest"
],
"css/css-scroll-snap/scroll-target-align-003.html": [
"1d6fbebbcd7f652746ece943a240ba2540a10710",
"d13efa0abb5d1a13dbb43d78301730b322322ccb",
"reftest"
],
"css/css-scroll-snap/scroll-target-margin-001.html": [
@ -587408,11 +587492,11 @@
"reftest"
],
"css/css-scroll-snap/scroll-target-margin-002.html": [
"a02cf7db17517cb9bcfd56173c4b6f94cb5f1283",
"51cf553b3603f237226fa6b7d0ca33089f801a0e",
"reftest"
],
"css/css-scroll-snap/scroll-target-margin-003.html": [
"d0434db515a68bb7b280edaebe8428dd705d4fc3",
"2ea8eff67c3d17b38031ca5534c8091cfa854409",
"reftest"
],
"css/css-scroll-snap/scroll-target-padding-001.html": [
@ -587420,11 +587504,11 @@
"reftest"
],
"css/css-scroll-snap/scroll-target-padding-002.html": [
"3a0ca3b8519e8dc73ed9a3b19c7af0312c5d69a6",
"fbed1e132ecf3805784436c4b13889f61ff8c7ba",
"reftest"
],
"css/css-scroll-snap/scroll-target-padding-003.html": [
"1e92e9be72fa17d718a6e121c5e18edf8bbcae3d",
"ccbe7b0ec97c9ba14d2ac11df1a24b032e185fe0",
"reftest"
],
"css/css-scroll-snap/scroll-target-snap-001.html": [
@ -587432,11 +587516,11 @@
"reftest"
],
"css/css-scroll-snap/scroll-target-snap-002.html": [
"89df44cba28443c015032301df4c0088ed9fe228",
"28f3c124525c68fa3b108019aa6f30b0d878a0bf",
"reftest"
],
"css/css-scroll-snap/scroll-target-snap-003.html": [
"3e90347a4dc9ee07e04350a6436309c673a13569",
"6fe3901e51c10b9d3d687d7b421b67e1ae6e5896",
"reftest"
],
"css/css-scroll-snap/scrollTo-scrollBy-snaps.html": [
@ -587480,19 +587564,19 @@
"testharness"
],
"css/css-scroll-snap/support/scroll-target-align-001-iframe.html": [
"20922ea18ea104bd613a27fcce58a1f0e9ba70ad",
"d86a5e86d01b5806c55123f07254f71d8891dfc0",
"support"
],
"css/css-scroll-snap/support/scroll-target-margin-001-iframe.html": [
"8eb5b9c863853a29eeaefa33caa89ae237278071",
"2b2c1d2d8c11228fadf4a85ac2c627f4bc3b17c5",
"support"
],
"css/css-scroll-snap/support/scroll-target-padding-001-iframe.html": [
"b9467e4347fe3dd005123f7c76e6cda1596e79d8",
"9260c81b1c3c5787d7b284601ab2ca350c282e5b",
"support"
],
"css/css-scroll-snap/support/scroll-target-snap-001-iframe.html": [
"1a598fa72384b40ee0331c6a3aaeaaa0fac3ae02",
"3146a3bf8824d625b1e49032343d1956f496fdf7",
"support"
],
"css/css-scroll-snap/unreachable-snap-positions.html": [
@ -588963,6 +589047,10 @@
"ed3590ceef222740139a4b9d3017478c8728bb30",
"support"
],
"css/css-size-adjust/animations/text-size-adjust-interpolation.html": [
"1d7e54b734158eb234a4d653b239f9de04187aac",
"testharness"
],
"css/css-size-adjust/inheritance.html": [
"730bcfe2b59534534c2ddec225ceb70fbb7700a3",
"testharness"
@ -602775,6 +602863,10 @@
"f11374e47b1876d06231854907c3082b5d4774ab",
"support"
],
"css/css-transitions/animations/text-shadow-interpolation.html": [
"c007816ecb04236421ff0aea8861da19c244338a",
"testharness"
],
"css/css-transitions/before-load-001.html": [
"009260eea430721971053f6d98330f9a9ed56d6d",
"testharness"
@ -620940,7 +621032,7 @@
"support"
],
"css/support/computed-testcommon.js": [
"1e87f2a518cb1c7845a99d6a13330e7a13436eca",
"c7c7e073203a67844ebcdf029f5c323964a41c99",
"support"
],
"css/support/green.ico": [
@ -626219,22 +626311,6 @@
"fb4b3ad3c7aeab61f44c394926735a97a8767d3c",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html": [
"0d1b1362873483fa1b900e2da3efe603648f791e",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html": [
"f7ed6e3b342d6cd259b3df61a5445f83ab39b0f9",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html": [
"f02bf13a73cd0ee025bf3e3d6ae9215feadb12b4",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/reftest.list": [
"f914145ab8f075cbbf03968e84d5487047dc0008",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/masking/blank.html": [
"abb1b5472843b7bcf63c946897cd66da456033e7",
"support"
@ -626872,7 +626948,7 @@
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/reftest.list": [
"2d9b459fa8e62ee70bb79567c5727650008f0c41",
"97621fe19fe42c95103d8bbd100fece50d0f51be",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/ruby/nested-ruby-pairing-001-ref.html": [
@ -631100,7 +631176,7 @@
"support"
],
"docs/running-tests/from-local-system.md": [
"5a9a776a285ad488509f6c494f43ebbdc8ec108f",
"0f337176c47d7c38bcaebd85fd86628e1870dfae",
"support"
],
"docs/running-tests/from-web.md": [
@ -643516,7 +643592,7 @@
"testharness"
],
"html/cross-origin-opener-policy/popup-redirect-cache.https.html": [
"519f710596005b5c460e03cfd398fafbb585ce40",
"0524878a03a8d3764c63b77b5c8c4f1453c5a288",
"testharness"
],
"html/cross-origin-opener-policy/popup-redirect-cache.https.html.headers": [
@ -654415,6 +654491,10 @@
"145b5dd3727f995fba56407f07e158d1fb80ba5a",
"testharness"
],
"html/semantics/forms/form-submission-0/SubmitEvent.window.js": [
"93dbabb866beeba9e04d0d4f99dde78f448e8dff",
"testharness"
],
"html/semantics/forms/form-submission-0/constructing-form-data-set.html": [
"8dad6cdd01a43fa17694c67939e8e5a05ab529e2",
"testharness"
@ -654448,13 +654528,17 @@
"support"
],
"html/semantics/forms/form-submission-0/form-submission-algorithm.html": [
"8f61cbc18c95133561e4dd8cbffd3cdb682420e4",
"df39b57353c67ebb02014865f28d739bbf24c690",
"testharness"
],
"html/semantics/forms/form-submission-0/getactionurl.html": [
"83de220267e7c37374bcd4d4490f27e4488e1126",
"testharness"
],
"html/semantics/forms/form-submission-0/implicit-submission.optional.html": [
"109d3b901a53537e9ae2fb17f84d25d4a764b2e2",
"testharness"
],
"html/semantics/forms/form-submission-0/resources/file-submission.py": [
"5fc67faa880ffa9300a093aa0ef1f67c3a76eb0c",
"support"
@ -654464,7 +654548,7 @@
"support"
],
"html/semantics/forms/form-submission-0/resources/targetted-form.js": [
"6b6685291d2bd3d7dc64f97e2d9e460394d2eb3c",
"291251b7e8037ce5c9053d7c4b63142a5783b877",
"support"
],
"html/semantics/forms/form-submission-0/submission-checks.window.js": [
@ -654631,6 +654715,10 @@
"1747bd727aa2fb4deb8f2a81601523776a51a355",
"testharness"
],
"html/semantics/forms/the-button-element/button-submit-children.html": [
"06218f4fc9e99efe2d87a9eb85582d3dc84434a1",
"testharness"
],
"html/semantics/forms/the-button-element/button-type.html": [
"6cfd6687c707479600534de03156afa698daa314",
"testharness"
@ -661944,7 +662032,7 @@
"support"
],
"interfaces/media-capabilities.idl": [
"71bc46d24109f49d616e05e804bcda01dcd45afb",
"6fe43d87a80bb7229d5cebc5fbd4cac08f44fa39",
"support"
],
"interfaces/media-playback-quality.idl": [
@ -662168,7 +662256,7 @@
"support"
],
"interfaces/web-nfc.idl": [
"d2ec623e864141152f9ca2ac79b5252b246257bf",
"117812a1f276d0bb84de94c2357485d7670ad314",
"support"
],
"interfaces/web-share.idl": [
@ -662212,7 +662300,7 @@
"support"
],
"interfaces/webrtc.idl": [
"2989db5453f5333c8e04e6d237f4142aa9fa85f8",
"5a5eb7b10631f14245b158cc6b06a2a178ce1d20",
"support"
],
"interfaces/webusb.idl": [
@ -662943,6 +663031,10 @@
"76eef3a8f45c131bdbf90028f8bcad75be0e5f32",
"testharness"
],
"loading/lazyload/image-loading-lazy-multicol-tentative.html": [
"eb69d6810d60a198ae5861211423acb7f76245f9",
"testharness"
],
"loading/lazyload/image-loading-lazy.tentative.html": [
"5920eb1882df0a69e0d23c26433bf1b28b9275e9",
"testharness"
@ -668292,7 +668384,7 @@
"support"
],
"native-file-system/script-tests/FileSystemFileHandle-getFile.js": [
"88e5593ebad613dc30cbdb838fe481e5353bce69",
"6b7d9f9a3171c96aaa2e1312451b3a9cac6c2e9b",
"support"
],
"native-file-system/script-tests/FileSystemWriter.js": [
@ -677124,11 +677216,11 @@
"testharness"
],
"preload/preload-csp.sub.html": [
"62d0c71039b7c06a4299ac71e055ff3786de5c41",
"a11214e9ec8e41a518f9fdb6b3db1b96b6e55df9",
"testharness"
],
"preload/preload-default-csp.sub.html": [
"9fc11945866834c70c9ad270fb11d37a443ac3d0",
"c649a53f874d854c1ed6052b06a7adad01b816e5",
"testharness"
],
"preload/preload-strict-dynamic.html": [
@ -690736,7 +690828,7 @@
"support"
],
"resources/chromium/nfc-mock.js": [
"811c0aeafceed8e16148ae4c678b55733fc6c8b8",
"aff72bbad028ecd6b8c6a8023841e08f072adfac",
"support"
],
"resources/chromium/sensor.mojom.js": [
@ -690796,7 +690888,7 @@
"support"
],
"resources/chromium/webxr-test.js": [
"94031657b4b6d2698739eddf0bd4028e0aa8fdea",
"d87b3420a85177ad5ef1c5c36cc5c4d785133eba",
"support"
],
"resources/chromium/webxr-test.js.headers": [
@ -697043,6 +697135,10 @@
"e974e38177526e2e4bd8344712c37b00dc2e2bda",
"testharness"
],
"svg/animations/pruning-first-interval.html": [
"5a1d1463beaec5b8c3e86406de6138960de8e5ab",
"testharness"
],
"svg/animations/remove-animation-element-while-animation-is-running.html": [
"764d25b69f158e028d8ec9fe14e1c43840d00925",
"testharness"
@ -701588,7 +701684,7 @@
"support"
],
"tools/ci/azure/cleanup_win10.yml": [
"76852b58cd39f057ae4441b26fd423714b07f445",
"f495a0c554537f1161981e19c12c597ba41ef2b2",
"support"
],
"tools/ci/azure/com.apple.Safari.plist": [
@ -701688,7 +701784,7 @@
"support"
],
"tools/ci/run_tc.py": [
"e6d8cd878aacc58f535be562a85ba511e18676f2",
"be7dbe082a1709493b62316d15668ea10ae93607",
"support"
],
"tools/ci/taskcluster-run.py": [
@ -701696,7 +701792,7 @@
"support"
],
"tools/ci/tcdownload.py": [
"6e4d960da900c670701807455bd67b247e37f34b",
"256726da7b568f32115dfeaa6bc1407490c0d076",
"support"
],
"tools/ci/tests/test_jobs.py": [
@ -706472,7 +706568,7 @@
"support"
],
"tools/wpt/browser.py": [
"bed8c59bf0729ed2327d499f7ec19817055379a6",
"fb10d75631305bd66044f033d3ac8f5e8ffb4a0b",
"support"
],
"tools/wpt/commands.json": [
@ -711503,6 +711599,10 @@
"dcb9432da83cb21b6f0403080d3c7b3b5df1659e",
"testharness"
],
"visual-viewport/viewport-no-resize-event-on-overflow-recalc.html.ini": [
"75e29ae4c427efbaeb9e08ec4824b90c30c2aead",
"support"
],
"visual-viewport/viewport-offset-manual.html": [
"c216e405a3e78765b95c815c45809f152dd97e41",
"manual"
@ -713456,7 +713556,7 @@
"manual"
],
"web-nfc/NDEFReader_options.https.html": [
"ab55e2c160bd39710a62238fce795ff63f03c995",
"389fff9e041e284358a87e5cc133046d4a579b84",
"testharness"
],
"web-nfc/NDEFReader_scan.https.html": [
@ -713472,7 +713572,7 @@
"testharness"
],
"web-nfc/NDEFRecord_constructor.https.html": [
"cea517d37aa17bf94c3d96c9abd19db5f1fa184c",
"1206afb4713dc7e4b48dcc837b3dd708382a9ce2",
"testharness"
],
"web-nfc/NDEFWriter-document-hidden-manual.https.html": [
@ -713480,7 +713580,7 @@
"manual"
],
"web-nfc/NDEFWriter_push.https.html": [
"fbebac946dfbf77a49c11c0472da900ca26759be",
"2be655fbbf93cfb0c0c8813f86dc3e98450af720",
"testharness"
],
"web-nfc/README.md": [
@ -713496,7 +713596,7 @@
"testharness"
],
"web-nfc/resources/nfc-helpers.js": [
"80f0882f9f8deff30b0c8c60ecb1bfc7c6df168c",
"cf9b510f30424e79412cc35098f63f5afd05707b",
"support"
],
"web-nfc/resources/support-iframe.html": [
@ -716859,6 +716959,10 @@
"80faf85f15e1acff67205efef90bbf5fd491bbc8",
"testharness"
],
"webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html": [
"0cce78bfbca161016721c4e2b122382c4be868f7",
"testharness"
],
"webrtc/RTCPeerConnection-setLocalDescription-pranswer.html": [
"1fbb30923f3d1e9abef6940a931a6d426ed01915",
"testharness"

View file

@ -2,8 +2,14 @@
[WebCryptoAPI: deriveBits() Using ECDH]
expected: FAIL
[setup - define tests]
expected: FAIL
[ecdh_bits.https.any.html]
[WebCryptoAPI: deriveBits() Using ECDH]
expected: FAIL
[setup - define tests]
expected: FAIL

View file

@ -2,8 +2,14 @@
[WebCryptoAPI: deriveKey() Using ECDH]
expected: FAIL
[setup - define tests]
expected: FAIL
[ecdh_keys.https.any.worker.html]
[WebCryptoAPI: deriveKey() Using ECDH]
expected: FAIL
[setup - define tests]
expected: FAIL

View file

@ -2,38 +2,62 @@
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.worker.html?1001-2000]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.html?2001-3000]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.worker.html?2001-3000]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.html?1001-2000]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.html?1-1000]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.worker.html?3001-last]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL
[hkdf.https.any.html?3001-last]
[WebCryptoAPI: deriveBits() and deriveKey() Using HKDF]
expected: FAIL
[setup - define tests]
expected: FAIL

View file

@ -2,88 +2,142 @@
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?1-1000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?1001-2000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?3001-4000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?1001-2000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?3001-4000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?8001-last]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?1-1000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?5001-6000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?7001-8000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?4001-5000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?7001-8000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?2001-3000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?6001-7000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?8001-last]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?4001-5000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.worker.html?5001-6000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL
[pbkdf2.https.any.html?6001-7000]
[WebCryptoAPI: deriveBits() and deriveKey() Using PBKDF2]
expected: FAIL
[setup - define tests]
expected: FAIL

View file

@ -5,9 +5,9 @@
[[data-expected-height\] 7]
expected: FAIL
[[data-expected-height\] 1]
[[data-expected-height\] 3]
expected: FAIL
[[data-expected-height\] 2]
[[data-expected-height\] 4]
expected: FAIL

View file

@ -1,2 +1,2 @@
[abspos-float-with-inline-container.html]
expected: FAIL
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[object-position-interpolation.html]
[object-position-interpolation]
expected: FAIL

View file

@ -0,0 +1,4 @@
[text-shadow-interpolation.html]
[text-shadow interpolation]
expected: FAIL

View file

@ -9,3 +9,6 @@
[throws if handleEvent is thruthy and not callable]
expected: NOTRUN
[doesn't look up handleEvent method on callable event listeners]
expected: FAIL

View file

@ -2,6 +2,6 @@
[listeners are called when <iframe> is resized]
expected: FAIL
[listeners are called correct number of times]
[listener that was added twice is called only once]
expected: FAIL

View file

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

View file

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

View file

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

View file

@ -11,6 +11,3 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
[X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff]
expected: FAIL

View file

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

View file

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

View file

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

View file

@ -1,6 +1,5 @@
[iframe_sandbox_popups_escaping-3.html]
type: testharness
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
expected: FAIL

View file

@ -0,0 +1,16 @@
[SubmitEvent.window.html]
[Successful SubmitEvent constructor]
expected: FAIL
[Failing SubmitEvent constructor]
expected: FAIL
[Successful SubmitEvent constructor; empty dictionary]
expected: FAIL
[Successful SubmitEvent constructor; null submitter]
expected: FAIL
[Successful SubmitEvent constructor; missing dictionary]
expected: FAIL

View file

@ -1,5 +1,5 @@
[form-double-submit-2.html]
expected: ERROR
[preventDefault should allow onclick submit() to succeed]
expected: FAIL
expected: TIMEOUT

View file

@ -1,5 +1,5 @@
[form-double-submit-3.html]
expected: ERROR
[<button> should have the same double-submit protection as <input type=submit>]
expected: FAIL
expected: TIMEOUT

View file

@ -1,5 +1,5 @@
[form-double-submit.html]
expected: ERROR
[default submit action should supersede onclick submit()]
expected: FAIL
expected: TIMEOUT

View file

@ -1,7 +1,23 @@
[form-submission-algorithm.html]
expected: TIMEOUT
[If form's firing submission events is true, then return; 'submit' event]
expected: FAIL
[If form's firing submission events is true, then return; 'invalid' event]
expected: FAIL
[firing an event named submit; form.requestSubmit(submitter)]
expected: FAIL
[firing an event named submit; clicking a submit button]
expected: FAIL
[Cannot navigate (after constructing the entry list)]
expected: TIMEOUT
[firing an event named submit; form.requestSubmit(null)]
expected: FAIL
[firing an event named submit; form.requestSubmit()]
expected: FAIL

View file

@ -0,0 +1,7 @@
[toggleEvent.html]
[Calling open twice on 'details' fires only one toggle event]
expected: FAIL
[Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
expected: FAIL

View file

@ -1,4 +0,0 @@
[DOMContentLoaded-defer.html]
[The end: DOMContentLoaded and defer scripts]
expected: FAIL

View file

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

View file

@ -1,5 +0,0 @@
[017.html]
expected: TIMEOUT
[origin of the script that invoked the method, about:blank]
expected: TIMEOUT

View file

@ -0,0 +1,5 @@
[018.html]
expected: TIMEOUT
[origin of the script that invoked the method, javascript:]
expected: TIMEOUT

View file

@ -1,4 +1,5 @@
[sharedworker-in-worker.html]
expected: ERROR
[Base URL in workers: new SharedWorker()]
expected: FAIL

View file

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

View file

@ -4,6 +4,19 @@ policy:
tasks:
$let:
event_str: {$json: {$eval: event}}
provisionerId:
$if: 'taskcluster_root_url == "https://taskcluster.net"'
then: aws-provisioner-v1
else: proj-wpt
workerType:
$if: 'taskcluster_root_url == "https://taskcluster.net"'
then:
$if: event.repository.full_name == 'web-platform-tests/wpt'
then:
wpt-docker-worker
else:
github-worker
else: ci
in:
$flattenDeep:
- $if: tasks_for == "github-push"
@ -52,13 +65,8 @@ tasks:
taskGroupId: {$eval: 'as_slugid("task group")'}
created: {$fromNow: ''}
deadline: {$fromNow: '24 hours'}
provisionerId: aws-provisioner-v1
workerType:
$if: event.repository.full_name == 'web-platform-tests/wpt'
then:
wpt-docker-worker
else:
github-worker
provisionerId: ${provisionerId}
workerType: ${workerType}
metadata:
name: wpt-${browser.name}-${browser.channel}-${chunk[0]}-${chunk[1]}
description: >-
@ -155,13 +163,8 @@ tasks:
taskGroupId: {$eval: 'as_slugid("task group")'}
created: {$fromNow: ''}
deadline: {$fromNow: '24 hours'}
provisionerId: aws-provisioner-v1
workerType:
$if: event.repository.full_name == 'web-platform-tests/wpt'
then:
wpt-docker-worker
else:
github-worker
provisionerId: ${provisionerId}
workerType: ${workerType}
metadata:
name: ${operation.name}
description: ${operation.description}
@ -321,13 +324,8 @@ tasks:
taskGroupId: {$eval: 'as_slugid("task group")'}
created: {$fromNow: ''}
deadline: {$fromNow: '24 hours'}
provisionerId: aws-provisioner-v1
workerType:
$if: event.repository.full_name == 'web-platform-tests/wpt'
then:
wpt-docker-worker
else:
github-worker
provisionerId: ${provisionerId}
workerType: ${workerType}
metadata:
name: ${operation.name}
description: ${operation.description}

View file

@ -1,3 +1,9 @@
// META: title=WebCryptoAPI: deriveBits() Using ECDH
// META: script=ecdh_bits.js
run_test();
// Define subtests from a `promise_test` to ensure the harness does not
// complete before the subtests are available. `explicit_done` cannot be used
// for this purpose because the global `done` function is automatically invoked
// by the WPT infrastructure in dedicated worker tests defined using the
// "multi-global" pattern.
promise_test(define_tests, 'setup - define tests');

View file

@ -1,5 +1,5 @@
function run_test() {
function define_tests() {
// May want to test prefixed implementations.
var subtle = self.crypto.subtle;
@ -27,7 +27,7 @@ function run_test() {
"P-384": new Uint8Array([224, 189, 107, 206, 10, 239, 140, 164, 136, 56, 166, 226, 252, 197, 126, 103, 185, 197, 232, 134, 12, 95, 11, 233, 218, 190, 197, 62, 69, 78, 24, 160, 161, 116, 196, 136, 136, 162, 100, 136, 17, 91, 45, 201, 241, 223, 165, 45])
};
importKeys(pkcs8, spki, sizes)
return importKeys(pkcs8, spki, sizes)
.then(function(results) {
publicKeys = results.publicKeys;
privateKeys = results.privateKeys;
@ -184,7 +184,6 @@ function run_test() {
});
}, namedCurve + " asking for too many bits");
});
done()
});
function importKeys(pkcs8, spki, sizes) {

View file

@ -1,3 +1,9 @@
// META: title=WebCryptoAPI: deriveKey() Using ECDH
// META: script=ecdh_keys.js
run_test();
// Define subtests from a `promise_test` to ensure the harness does not
// complete before the subtests are available. `explicit_done` cannot be used
// for this purpose because the global `done` function is automatically invoked
// by the WPT infrastructure in dedicated worker tests defined using the
// "multi-global" pattern.
promise_test(define_tests, 'setup - define tests');

View file

@ -1,5 +1,5 @@
function run_test() {
function define_tests() {
// May want to test prefixed implementations.
var subtle = self.crypto.subtle;
@ -27,7 +27,7 @@ function run_test() {
"P-384": new Uint8Array([224, 189, 107, 206, 10, 239, 140, 164, 136, 56, 166, 226, 252, 197, 126, 103, 185, 197, 232, 134, 12, 95, 11, 233, 218, 190, 197, 62, 69, 78, 24, 160, 161, 116, 196, 136, 136, 162, 100, 136, 17, 91, 45, 201, 241, 223, 165, 45])
};
importKeys(pkcs8, spki, sizes)
return importKeys(pkcs8, spki, sizes)
.then(function(results) {
publicKeys = results.publicKeys;
privateKeys = results.privateKeys;
@ -153,7 +153,6 @@ function run_test() {
});
}, namedCurve + " public property value is a secret key");
});
done();
});
function importKeys(pkcs8, spki, sizes) {

View file

@ -6,4 +6,10 @@
// META: script=/common/subset-tests.js
// META: script=hkdf_vectors.js
// META: script=hkdf.js
run_test();
// Define subtests from a `promise_test` to ensure the harness does not
// complete before the subtests are available. `explicit_done` cannot be used
// for this purpose because the global `done` function is automatically invoked
// by the WPT infrastructure in dedicated worker tests defined using the
// "multi-global" pattern.
promise_test(define_tests, 'setup - define tests');

View file

@ -1,5 +1,5 @@
function run_test() {
function define_tests() {
// May want to test prefixed implementations.
var subtle = self.crypto.subtle;
@ -14,7 +14,7 @@ function run_test() {
// What kinds of keys can be created with deriveKey? The following:
var derivedKeyTypes = testData.derivedKeyTypes;
setUpBaseKeys(derivedKeys)
return setUpBaseKeys(derivedKeys)
.then(function(allKeys) {
// We get several kinds of base keys. Normal ones that can be used for
// derivation operations, ones that lack the deriveBits usage, ones
@ -232,13 +232,6 @@ function run_test() {
});
});
done();
}, function(err) {
subsetTest(test, function(test) {
assert_unreached("setUpBaseKeys failed with error '" + err.message + "'");
}, "setUpBaseKeys");
done();
});
// Deriving bits and keys requires starting with a base key, which is created

View file

@ -12,4 +12,10 @@
// META: script=/common/subset-tests.js
// META: script=pbkdf2_vectors.js
// META: script=pbkdf2.js
run_test();
// Define subtests from a `promise_test` to ensure the harness does not
// complete before the subtests are available. `explicit_done` cannot be used
// for this purpose because the global `done` function is automatically invoked
// by the WPT infrastructure in dedicated worker tests defined using the
// "multi-global" pattern.
promise_test(define_tests, 'setup - define tests');

View file

@ -1,4 +1,4 @@
function run_test() {
function define_tests() {
// May want to test prefixed implementations.
var subtle = self.crypto.subtle;
@ -12,7 +12,7 @@ function run_test() {
// What kinds of keys can be created with deriveKey? The following:
var derivedKeyTypes = testData.derivedKeyTypes;
setUpBaseKeys(passwords)
return setUpBaseKeys(passwords)
.then(function(allKeys) {
// We get several kinds of base keys. Normal ones that can be used for
// derivation operations, ones that lack the deriveBits usage, ones
@ -229,13 +229,6 @@ function run_test() {
});
});
done();
}, function(err) {
subsetTest(test, function(test) {
assert_unreached("setUpBaseKeys failed with error '" + err.message + "'");
}, "setUpBaseKeys");
done();
});
// Deriving bits and keys requires starting with a base key, which is created

View file

@ -0,0 +1,158 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<title>object-position-interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-images-3/#the-object-position">
<meta name="assert" content="object-position supports animation by computation">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
.parent {
object-position: 30px 10px;
}
.target {
position: relative;
width: 100px;
height: 100px;
background-color: black;
display: inline-block;
margin: 20px 0px 20px 0px;
object-fit: fill;
object-position: 10px 30px;
}
.expected {
background-color: green;
}
</style>
<body>
</body>
<script>
test_interpolation({
property: 'object-position',
from: neutralKeyframe,
to: '20px 20px',
}, [
{at: -0.3, expect: '7px 33px'},
{at: 0, expect: '10px 30px'},
{at: 0.5, expect: '15px 25px'},
{at: 1, expect: '20px 20px'},
{at: 1.5, expect: '25px 15px'},
]);
test_interpolation({
property: 'object-position',
from: 'initial',
to: '20px 20px',
}, [
{at: -0.3, expect: 'calc(-6px + 65%) calc(-6px + 65%)'},
{at: 0, expect: '50% 50%'},
{at: 0.5, expect: 'calc(10px + 25%) calc(10px + 25%)'},
{at: 1, expect: 'calc(20px + 0%) calc(20px + 0%)'},
{at: 1.5, expect: 'calc(30px + -25%) calc(30px + -25%)'},
]);
test_interpolation({
property: 'object-position',
from: 'inherit',
to: '20px 20px',
}, [
{at: -0.3, expect: '33px 7px'},
{at: 0, expect: '30px 10px'},
{at: 0.5, expect: '25px 15px'},
{at: 1, expect: '20px 20px'},
{at: 1.5, expect: '15px 25px'},
]);
test_interpolation({
property: 'object-position',
from: 'unset',
to: '20px 20px',
}, [
{at: -0.3, expect: 'calc(-6px + 65%) calc(-6px + 65%)'},
{at: 0, expect: '50% 50%'},
{at: 0.5, expect: 'calc(10px + 25%) calc(10px + 25%)'},
{at: 1, expect: 'calc(20px + 0%) calc(20px + 0%)'},
{at: 1.5, expect: 'calc(30px + -25%) calc(30px + -25%)'},
]);
test_interpolation({
property: 'object-position',
from: '50% 50%',
to: '100% 100%'
}, [
{at: -0.3, expect: '35% 35%'},
{at: 0, expect: '50% 50%'},
{at: 0.5, expect: '75% 75%'},
{at: 1, expect: '100% 100%'},
{at: 1.5, expect: '125% 125%'}
]);
test_interpolation({
property: 'object-position',
from: '100px 200px',
to: '0px 0px'
}, [
{at: -0.3, expect: '130px 260px'},
{at: 0, expect: '100px 200px'},
{at: 0.5, expect: '50px 100px'},
{at: 1, expect: '0px 0px'},
{at: 1.5, expect: '-50px -100px'}
]);
// Zero seem to be a special case in the old implementation
test_interpolation({
property: 'object-position',
from: '50% 100%',
to: '0px 0px'
}, [
{at: -0.3, expect: '65% 130%'},
{at: 0, expect: '50% 100%'},
{at: 0.5, expect: '25% 50%'},
{at: 1, expect: '0px 0px'},
{at: 1.5, expect: '-25% -50%'}
]);
test_interpolation({
property: 'object-position',
from: '50% 100%',
to: '50px 100px'
}, [
{at: -0.3, expect: 'calc(65% + -15px) calc(130% + -30px)'},
{at: 0, expect: '50% 100%'},
{at: 0.5, expect: 'calc(25% + 25px) calc(50% + 50px)'},
{at: 1, expect: 'calc(0% + 50px) calc(0% + 100px)'},
{at: 1.5, expect: 'calc(-25% + 75px) calc(-50% + 150px)'}
]);
test_interpolation({
property: 'object-position',
from: 'center',
to: 'top right'
}, [
{at: -0.3, expect: '35% 65%'},
{at: 0, expect: '50% 50%'},
{at: 0.5, expect: '75% 25%'},
{at: 1, expect: '100% 0%'},
{at: 1.5, expect: '125% -25%'}
]);
test_interpolation({
property: 'object-position',
from: 'center',
to: 'right 0% bottom 50%',
}, [
{at: -0.5, expect: '25% 50%'},
{at: 0, expect: 'center'},
{at: 0.3, expect: '65% 50%'},
{at: 0.5, expect: '75% 50%'},
{at: 0.9, expect: '95% 50%'},
{at: 1, expect: '100% 50%'},
{at: 1.5, expect: '125% 50%'},
{at: 2, expect: '150% 50%'},
]);
</script>

View file

@ -16,7 +16,7 @@ li {
list-style-type: lower-alpha;
}
li::marker {
li::marker, span {
font-family: sans-serif;
font-size: 24px;
font-style: italic;
@ -27,7 +27,7 @@ li::marker {
</head>
<body>
<ol>
<li><span style="font-size: 24px"><!-- FIXME: Needed to ensure consistent baseline position with expected result in WebKit (why?). --></span></li>
<li><span><!-- FIXME: Needed to ensure consistent baseline position with expected result in Chromium and WebKit (why?). --></span></li>
</ol>
</body>
</html>

View file

@ -0,0 +1,60 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Pseudo-Elements Test: Supported properties in ::marker</title>
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
<meta name="assert" content="This test checks that only certain properties apply to ::marker pseudo-elements." />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
<div id="log"></div>
<ul>
<li id="target">target</li>
</ul>
<script>
// ::marker supports all font properties.
test_pseudo_computed_value("::marker", "font", "italic small-caps 900 expanded 25px / 50px Ahem",
["italic small-caps 900 expanded 25px Ahem", "italic small-caps 900 expanded 25px/normal Ahem"]);
test_pseudo_computed_value("::marker", "font-family", "Ahem");
test_pseudo_computed_value("::marker", "font-feature-settings", "\"smcp\"");
test_pseudo_computed_value("::marker", "font-kerning", "none");
test_pseudo_computed_value("::marker", "font-size", "25px");
test_pseudo_computed_value("::marker", "font-size-adjust", "1");
test_pseudo_computed_value("::marker", "font-stretch", "expanded", ["expanded", "125%"]);
test_pseudo_computed_value("::marker", "font-style", "italic");
test_pseudo_computed_value("::marker", "font-synthesis", "none");
test_pseudo_computed_value("::marker", "font-variant", "small-caps");
test_pseudo_computed_value("::marker", "font-variant-caps", "small-caps");
test_pseudo_computed_value("::marker", "font-variant-east-asian", "full-width");
test_pseudo_computed_value("::marker", "font-variant-ligatures", "historical-ligatures");
test_pseudo_computed_value("::marker", "font-variant-numeric", "slashed-zero");
test_pseudo_computed_value("::marker", "font-variant-position", "sub");
test_pseudo_computed_value("::marker", "font-weight", "900");
// ::marker supports `color`
test_pseudo_computed_value("::marker", "color", "rgb(0, 100, 200)");
// ::marker supports `text-combine-upright`, `unicode-bidi` and `direction`
test_pseudo_computed_value("::marker", "text-combine-upright", "none");
test_pseudo_computed_value("::marker", "unicode-bidi", "plaintext");
test_pseudo_computed_value("::marker", "direction", "rtl");
// ::marker supports `content`
test_pseudo_computed_value("::marker", "content", "\"foo\"");
// ::marker does NOT support layout properties
test_pseudo_computed_value("::marker", "display", "none", ["block", "inline"]);
test_pseudo_computed_value("::marker", "position", "absolute", "static");
test_pseudo_computed_value("::marker", "float", "right", "none");
// ::marker does NOT support list properties despite being affected by them,
// they apply to the list item instead.
test_pseudo_computed_value("::marker", "list-style", "inside url('foo') decimal", "outside none disc");
test_pseudo_computed_value("::marker", "list-style-image", "url('foo')", "none");
test_pseudo_computed_value("::marker", "list-style-position", "inside", "outside");
test_pseudo_computed_value("::marker", "list-style-type", "decimal", "disc");
// ::marker does NOT support `line-height` because, despite being a
// longhand of `font`, it's not a font property.
test_pseudo_computed_value("::marker", "line-height", "50px", "normal");
</script>

View file

@ -31,6 +31,9 @@
scroll-snap-align: center; }
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -32,6 +32,9 @@
scroll-snap-align: center; }
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -28,6 +28,9 @@
#target { scroll-margin: 2em 0 1em; } /* snap area is exact fit for snapport */
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -30,6 +30,9 @@
#target { scroll-margin: 2em 0 1em; } /* snap area is exact fit for snapport */
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -27,6 +27,9 @@
.container { scroll-padding: 2em 0 1em; } /* snap area is exact fit for snapport */
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -29,6 +29,9 @@
.container { scroll-padding: 2em 0 1em; } /* snap area is exact fit for snapport */
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -33,6 +33,8 @@
/* Try to foil the UA */
.foilup { margin-bottom: -1em; scroll-snap-align: start; }
.foildn { margin-top: -1em; scroll-snap-align: end; }
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -35,6 +35,9 @@
/* Try to foil the UA */
.foilup { margin-bottom: -1em; scroll-snap-align: start; }
.foildn { margin-top: -1em; scroll-snap-align: end; }
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div id='instructions'>Test passes if there is a green stripe across the second quarter of the box below and no red.</div>

View file

@ -19,7 +19,9 @@
scroll-snap-align: center; }
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
}
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div></div>

View file

@ -17,7 +17,9 @@
#target { scroll-margin: 2em 0 1em; } /* snap area is exact fit for snapport */
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
}
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div></div>

View file

@ -17,7 +17,9 @@
html { scroll-padding: 2em 0 1em; } /* snap area is exact fit for snapport */
#stripe { background: green; } /* color part of the snap area */
.fail { color: red; } /* make failing more obvious */
}
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div></div>

View file

@ -25,6 +25,9 @@
/* Try to foil the UA */
.foilup { margin-bottom: -1em; scroll-snap-align: start; }
.foildn { margin-top: -1em; scroll-snap-align: end; }
/* emulate `scrollbar-width: none` for browsers that don't support it yet */
::-webkit-scrollbar { display: none; }
</style>
<div></div>

View file

@ -0,0 +1,104 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<title>text-size-adjust-interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-size-adjust/#adjustment-control">
<meta name="assert" content="text-size-adjust supports animation">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style type="text/css">
.container {
display: inline-block;
}
.parent {
text-size-adjust: 70%;
}
.target {
text-size-adjust: 60%;
}
.expected {
color: green;
margin-right: 30px;
}
</style>
<body></body>
<template id="target-template">
<span class="container">
<div class="target">x</span>
</div>
</template>
<script>
test_interpolation({
property: 'text-size-adjust',
from: neutralKeyframe,
to: '50%',
}, [
{at: -2, expect: '80%'},
{at: -0.3, expect: '63%'},
{at: 0, expect: '60%'},
{at: 0.3, expect: '57%'},
{at: 0.6, expect: '54%'},
{at: 1, expect: '50%'},
{at: 1.5, expect: '45%'},
]);
test_no_interpolation({
property: 'text-size-adjust',
from: 'initial',
to: '70%',
});
test_interpolation({
property: 'text-size-adjust',
from: 'inherit', // 70%
to: '50%',
}, [
{at: -2, expect: '110%'},
{at: -0.3, expect: '76%'},
{at: 0, expect: '70%'},
{at: 0.3, expect: '64%'},
{at: 0.6, expect: '58%'},
{at: 1, expect: '50%'},
{at: 1.5, expect: '40%'},
]);
test_interpolation({
property: 'text-size-adjust',
from: 'unset',
to: '50%',
}, [
{at: -2, expect: '110%'},
{at: -0.3, expect: '76%'},
{at: 0, expect: '70%'},
{at: 0.3, expect: '64%'},
{at: 0.6, expect: '58%'},
{at: 1, expect: '50%'},
{at: 1.5, expect: '40%'},
]);
test_interpolation({
property: 'text-size-adjust',
from: '10%',
to: '0%'
}, [
{at: -2, expect: '30%'},
{at: -0.3, expect: '13%'},
{at: 0, expect: '10%'},
{at: 0.3, expect: '7%'},
{at: 0.6, expect: '4%'},
{at: 1, expect: '0%'},
{at: 1.5, expect: '0%'}, // text-size-adjust can't be negative
]);
test_no_interpolation({
property: 'text-size-adjust',
from: 'none',
to: '100%'
});
</script>

View file

@ -0,0 +1,110 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<title>text-shadow interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property">
<meta name="assert" content="text-shadow supports animation">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
.parent {
text-shadow: 30px 10px 30px orange;
}
.target {
display: inline-block;
font-size: 60pt;
margin-right: 20px;
margin-bottom: 30px;
color: green;
text-shadow: 10px 30px 10px orange;
}
.expected {
margin-right: 40px;
}
</style>
<body>
<template id="target-template">T</template>
<script>
test_interpolation({
property: 'text-shadow',
from: neutralKeyframe,
to: 'green 20px 20px 20px',
}, [
{at: -0.3, expect: 'rgb(255, 176, 0) 7px 33px 7px'},
{at: 0, expect: 'rgb(255, 165, 0) 10px 30px 10px'},
{at: 0.3, expect: 'rgb(179, 154, 0) 13px 27px 13px'},
{at: 0.6, expect: 'rgb(102, 143, 0) 16px 24px 16px'},
{at: 1, expect: 'rgb(0, 128, 0) 20px 20px 20px'},
{at: 1.5, expect: 'rgb(0, 110, 0) 25px 15px 25px'},
]);
test_interpolation({
property: 'text-shadow',
from: 'initial',
to: 'green 20px 20px 20px',
}, [
{at: -0.3, expect: 'rgba(0, 0, 0, 0) -6px -6px 0px'},
{at: 0, expect: 'rgba(0, 0, 0, 0) 0px 0px 0px'},
{at: 0.3, expect: 'rgba(0, 128, 0, 0.3) 6px 6px 6px'},
{at: 0.6, expect: 'rgba(0, 128, 0, 0.6) 12px 12px 12px'},
{at: 1, expect: 'rgb(0, 128, 0) 20px 20px 20px'},
{at: 1.5, expect: 'rgb(0, 192, 0) 30px 30px 30px'},
]);
test_interpolation({
property: 'text-shadow',
from: 'inherit',
to: 'green 20px 20px 20px',
}, [
{at: -0.3, expect: 'rgb(255, 176, 0) 33px 7px 33px'},
{at: 0, expect: 'rgb(255, 165, 0) 30px 10px 30px'},
{at: 0.3, expect: 'rgb(179, 154, 0) 27px 13px 27px'},
{at: 0.6, expect: 'rgb(102, 143, 0) 24px 16px 24px'},
{at: 1, expect: 'rgb(0, 128, 0) 20px 20px 20px'},
{at: 1.5, expect: 'rgb(0, 110, 0) 15px 25px 15px'},
]);
test_interpolation({
property: 'text-shadow',
from: 'unset',
to: 'green 20px 20px 20px',
}, [
{at: -0.3, expect: 'rgb(255, 176, 0) 33px 7px 33px'},
{at: 0, expect: 'rgb(255, 165, 0) 30px 10px 30px'},
{at: 0.3, expect: 'rgb(179, 154, 0) 27px 13px 27px'},
{at: 0.6, expect: 'rgb(102, 143, 0) 24px 16px 24px'},
{at: 1, expect: 'rgb(0, 128, 0) 20px 20px 20px'},
{at: 1.5, expect: 'rgb(0, 110, 0) 15px 25px 15px'},
]);
test_interpolation({
property: 'text-shadow',
from: 'black 15px 10px 5px',
to: 'orange -15px -10px 25px',
}, [
{at: -0.3, expect: 'rgb(0, 0, 0) 24px 16px 0px'},
{at: 0, expect: 'rgb(0, 0, 0) 15px 10px 5px'},
{at: 0.3, expect: 'rgb(77, 50, 0) 6px 4px 11px'},
{at: 0.6, expect: 'rgb(153, 99, 0) -3px -2px 17px'},
{at: 1, expect: 'rgb(255, 165, 0) -15px -10px 25px'},
{at: 1.5, expect: 'rgb(255, 248, 0) -30px -20px 35px'},
]);
test_interpolation({
property: 'text-shadow',
from: 'black 10px 10px 10px',
to: 'currentColor 10px 10px 10px',
}, [
{at: -0.3, expect: 'rgb(0, 0, 0) 10px 10px 10px'},
{at: 0, expect: 'rgb(0, 0, 0) 10px 10px 10px'},
{at: 0.3, expect: 'rgb(0, 38, 0) 10px 10px 10px'},
{at: 0.6, expect: 'rgb(0, 77, 0) 10px 10px 10px'},
{at: 1, expect: 'rgb(0, 128, 0) 10px 10px 10px'},
{at: 1.5, expect: 'rgb(0, 192, 0) 10px 10px 10px'},
]);
</script>
</body>

View file

@ -40,3 +40,44 @@ function test_computed_value(property, specified, computed) {
}, "Property " + property + " value '" + specified + "' computes to " +
computedDesc);
}
function test_pseudo_computed_value(pseudo, property, specified, computed) {
if (!computed)
computed = specified;
let computedDesc = "'" + computed + "'";
if (Array.isArray(computed))
computedDesc = '[' + computed.map(e => "'" + e + "'").join(' or ') + ']';
test(() => {
assert_true(/^::\w+$/.test(pseudo), pseudo + " doesn't seem to be a pseudo-element");
const styleElement = document.createElement("style");
document.documentElement.appendChild(styleElement);
try {
const {sheet} = styleElement;
sheet.insertRule("#target" + pseudo + "{}");
const {style} = sheet.cssRules[0];
const target = document.getElementById('target');
assert_true(property in getComputedStyle(target, pseudo), property + " doesn't seem to be supported in the computed style");
assert_true(CSS.supports(property, specified), "'" + specified + "' is a supported value for " + property + ".");
style[property] = specified;
let readValue = getComputedStyle(target, pseudo)[property];
if (Array.isArray(computed)) {
assert_in_array(readValue, computed);
} else {
assert_equals(readValue, computed);
}
if (readValue !== specified) {
style[property] = '';
style[property] = readValue;
assert_equals(getComputedStyle(target, pseudo)[property], readValue,
'computed value should round-trip');
}
} finally {
document.documentElement.removeChild(styleElement);
}
}, "Property " + property + " value '" + specified + "' computes to " +
computedDesc + " in " + pseudo);
}

View file

@ -1,3 +0,0 @@
# Tests for list-style-type
== list-style-type-string-001a.html list-style-type-string-001-ref.html
== list-style-type-string-001b.html list-style-type-string-001-ref.html

View file

@ -46,9 +46,6 @@ include ib-split/reftest.list
# Image Values and Replaced Content Level 3
include images3/reftest.list
# Lists and Counters Level 3
include lists-3/reftest.list
# Masking Level 1
include masking/reftest.list

View file

@ -4,36 +4,71 @@ The tests are designed to be run from your local computer.
## System Setup
The test environment requires [Python 2.7+](http://www.python.org/downloads)
(but not Python 3.x).
Running the tests requires `python`, `pip` and `virtualenv`, as well as updating
the system `hosts` file.
On Windows, be sure to add the Python directory (`c:\python2x`, by default) to
your `%Path%` [Environment Variable](http://www.computerhope.com/issues/ch000549.htm),
and read the [Windows Notes](#windows-notes) section below.
Note that Python 2.7 is required. Using Python 3 is not supported.
<!--
There does not appear to be a cross-platform means of installing `pip`.
https://github.com/web-platform-tests/wpt/pull/16670
-->
The required setup is different depending on your operating system.
Install `pip`. On many systems, this can be achieved with the command `python
-m ensurepip`. If this is not possible, use your system's package manager to
install the `python-pip` package.
### Linux Setup
Next, install `virtualenv` using the following command:
If not already present, use the system package manager to install `python`,
`pip` and `virtualenv`.
On Debian or Ubuntu:
```bash
sudo apt-get install python python-pip virtualenv
```
### macOS Setup
The system-provided Python can be used, while `pip` and `virtualenv` can be
installed for the user only:
```bash
python -m ensurepip --user
export PATH="$PATH:$HOME/Library/Python/2.7/bin"
pip install --user virtualenv
```
To make the `PATH` change persistent, add it to your `~/.bash_profile` file or
wherever you currently set your PATH.
See also [additional setup required to run Safari](safari).
### Windows Setup
**Note:** In general, Windows Subsystem for Linux will provide the smoothest
user experience for running web-platform-tests on Windows, where installation
and usage are similar to Linux.
Download and install [Python 2.7](https://www.python.org/downloads). The
installer includes `pip` by default.
Add `C:\Python27` and `C:\Python27\Scripts` to your `%Path%`
[environment variable](http://www.computerhope.com/issues/ch000549.htm).
Finally, install `virtualenv`:
```bash
pip install virtualenv
```
The standard Windows shell requires that all `wpt` commands are prefixed
by the Python binary i.e. assuming `python` is on your path the server is
started using:
```bash
python wpt serve
```
### `hosts` File Setup
To get the tests running, you need to set up the test domains in your
[`hosts` file](http://en.wikipedia.org/wiki/Hosts_%28file%29%23Location_in_the_file_system).
The necessary content can be generated with `./wpt make-hosts-file`; on
Windows, you will need to preceed the prior command with `python` or
the path to the Python binary (`python wpt make-hosts-file`).
For example, on most UNIX-like systems, you can setup the hosts file with:
On Linux, macOS or other UNIX-like system:
```bash
./wpt make-hosts-file | sudo tee -a /etc/hosts
@ -48,26 +83,6 @@ python wpt make-hosts-file | Out-File %SystemRoot%\System32\drivers\etc\hosts -E
If you are behind a proxy, you also need to make sure the domains above are
excluded from your proxy lookups.
[The Ahem font](../writing-tests/ahem) is used to test precise rendering
behavior. This font should be loaded as a web font in tests, using the
`/fonts/ahem.css` stylesheet, as follows:
```
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
```
### Windows Notes
Generally Windows Subsystem for Linux will provide the smoothest user
experience for running web-platform-tests on Windows.
The standard Windows shell requires that all `wpt` commands are prefixed
by the Python binary i.e. assuming `python` is on your path the server is
started using:
`python wpt serve`
## Via the browser
The test environment can then be started using

View file

@ -1,10 +1,10 @@
<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/common.js"></script>
<script src="/common/utils.js"></script> <!-- Use token() to allow running tests in parallel -->
<div id=log></div>
<script>
@ -44,27 +44,29 @@ function coop_redirect_cache_test(t, hostA, hostB, coop, coep, redirectCache, de
function run_redirect_cache_tests(documentCOOPValueTitle, testArray) {
for (const test of tests) {
async_test(t => {
coop_redirect_cache_test(t, test[0], test[1], "same-origin", "require-corp", test[2], test[3], test[4], test[5]);
// Use a consistent channel name for deterministic failure output
let channelName = `${test[0].name}_${test[1].name}${test[2] ? "" : "_not"}_cache_redirect${test[3] ? "" : "_not"}_cache_destination`;
coop_redirect_cache_test(t, test[0], test[1], "same-origin", "require-corp", test[2], test[3], channelName, test[4]);
}, `${documentCOOPValueTitle} document opening popup redirect from ${test[0].origin} to ${test[1].origin} with redirectCache ${test[2]} and destCache ${test[3]}`);
}
}
let tests = [
// popup Origin, final Origin, isCacheRedirect, isCacheDestination, channelName, hasOpener
// popup Origin, final Origin, isCacheRedirect, isCacheDestination, hasOpener
// Origin A->A->B
[SAME_ORIGIN, CROSS_ORIGIN, true, false, token(), false],
[SAME_ORIGIN, CROSS_ORIGIN, false, true, token(), false],
[SAME_ORIGIN, CROSS_ORIGIN, true, true, token(), false],
[SAME_ORIGIN, CROSS_ORIGIN, true, false, false],
[SAME_ORIGIN, CROSS_ORIGIN, false, true, false],
[SAME_ORIGIN, CROSS_ORIGIN, true, true, false],
// Origin A->B->B
[CROSS_ORIGIN, SAME_ORIGIN, true, false, token(), false],
[CROSS_ORIGIN, SAME_ORIGIN, false, true, token(), false],
[CROSS_ORIGIN, SAME_ORIGIN, true, true, token(), false],
[CROSS_ORIGIN, SAME_ORIGIN, true, false, false],
[CROSS_ORIGIN, SAME_ORIGIN, false, true, false],
[CROSS_ORIGIN, SAME_ORIGIN, true, true, false],
// Origin A->B->C
[SAME_SITE, CROSS_ORIGIN, true, false, token(), false],
[SAME_SITE, CROSS_ORIGIN, false, true, token(), false],
[SAME_SITE, CROSS_ORIGIN, true, true, token(), false],
[SAME_SITE, CROSS_ORIGIN, true, false, false],
[SAME_SITE, CROSS_ORIGIN, false, true, false],
[SAME_SITE, CROSS_ORIGIN, true, true, false],
];
run_redirect_cache_tests("same-origin", tests);

View file

@ -0,0 +1,36 @@
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-submitevent-interface
test(() => {
let button = document.createElement('button');
let typeError = new TypeError();
assert_throws(typeError, () => { new SubmitEvent() }, '0 arguments');
assert_throws(typeError, () => { new SubmitEvent('bar', button) }, '1 invalid arguments');
assert_throws(typeError, () => { new SubmitEvent(button, button) }, '2 invalid arguments');
assert_throws(typeError, () => { new SubmitEvent('foo', null) }, 'Null dictionary');
assert_throws(typeError, () => { new SubmitEvent('foo', undefined) }, 'Undefined dictionary');
assert_throws(typeError, () => { new SubmitEvent('foo', { submitter: null }) }, 'Null submitter');
assert_throws(typeError, () => { new SubmitEvent('foo', { submitter: undefined }) }, 'Undefined submitter');
assert_throws(typeError, () => { new SubmitEvent('foo', { submitter: 'bar' }) }, 'Wrong type of submitter');
}, 'Failing SubmitEvent constructor');
test(() => {
let button = document.createElement('button');
let event = new SubmitEvent('bar', { submitter: button, bubbles: true });
assert_equals(event.submitter, button);
assert_true(event.bubbles);
}, 'Successful SubmitEvent constructor');
test(() => {
let event = new SubmitEvent('bar', { submitter: null});
assert_equals(event.submitter, null);
}, 'Successful SubmitEvent constructor; null submitter');
test(() => {
let event = new SubmitEvent('baz', {});
assert_equals(event.submitter, null);
}, 'Successful SubmitEvent constructor; empty dictionary');
test(() => {
let event = new SubmitEvent('baz');
assert_equals(event.submitter, null);
}, 'Successful SubmitEvent constructor; missing dictionary');

View file

@ -50,6 +50,60 @@ async_test(t => {
});
}, "If form's firing submission events is true, then return; 'submit' event");
promise_test(async () => {
let form = populateForm('<button type=submit></button><input name=n1 value=submit type=submit>');
let iframe = form.previousSibling;
let submitter = form.querySelector('input[type=submit]');
let event;
form.addEventListener('submit', e => { event = e; });
submitter.click();
await loadPromise(iframe);
assert_true(event.bubbles);
assert_true(event.cancelable);
assert_equals(event.submitter, submitter);
assert_true(event instanceof SubmitEvent);
}, 'firing an event named submit; clicking a submit button');
promise_test(async () => {
let form = populateForm('');
let iframe = form.previousSibling;
let event;
form.addEventListener('submit', e => { event = e; });
form.requestSubmit();
await loadPromise(iframe);
assert_true(event.bubbles);
assert_true(event.cancelable);
assert_equals(event.submitter, null);
assert_true(event instanceof SubmitEvent);
}, 'firing an event named submit; form.requestSubmit()');
promise_test(async () => {
let form = populateForm('');
let iframe = form.previousSibling;
let event;
form.addEventListener('submit', e => { event = e; });
form.requestSubmit(null);
await loadPromise(iframe);
assert_true(event.bubbles);
assert_true(event.cancelable);
assert_equals(event.submitter, null);
assert_true(event instanceof SubmitEvent);
}, 'firing an event named submit; form.requestSubmit(null)');
promise_test(async () => {
let form = populateForm('<input type=submit><button type=submit></button>');
let iframe = form.previousSibling;
let submitter = form.querySelector('button');
let event;
form.addEventListener('submit', e => { event = e; });
form.requestSubmit(submitter);
await loadPromise(iframe);
assert_true(event.bubbles);
assert_true(event.cancelable);
assert_equals(event.submitter, submitter);
assert_true(event instanceof SubmitEvent);
}, 'firing an event named submit; form.requestSubmit(submitter)');
async_test(t => {
let form = populateForm('<input name=n1 value=v1>');
form.onformdata = (e) => { e.target.remove(); };

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<link rel="help" href="https://html.spec.whatwg.org/C/#implicit-submission">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="./resources/targetted-form.js"></script>
<body>
<script>
// This test file is "optional" because triggering implicit submission by
// "Enter" key is not standardized.
const ENTER = '\uE007';
promise_test(async () => {
let form = populateForm('<input name=text value=abc><input name=submiButton type=submit>');
let event;
form.text.focus();
form.addEventListener('submit', e => { event = e; });
await test_driver.send_keys(form.text, ENTER);
assert_true(event.bubbles);
assert_true(event.cancelable);
assert_equals(event.submitter, form.submitButton);
assert_true(event instanceof SubmitEvent);
}, 'Submit event with a submit button');
promise_test(async () => {
let form = populateForm('<input name=text value=abc>');
let event;
form.text.focus();
form.addEventListener('submit', e => { event = e; });
await test_driver.send_keys(form.text, ENTER);
assert_true(event.bubbles);
assert_true(event.cancelable);
assert_equals(event.submitter, null);
assert_true(event instanceof SubmitEvent);
}, 'Submit event with no submit button');
</script>
</body>

View file

@ -19,3 +19,10 @@ function submitPromise(form, iframe) {
form.submit();
});
}
function loadPromise(iframe) {
return new Promise((resolve, reject) => {
iframe.onload = resolve;
iframe.onerror = () => reject(new Error('iframe onerror fired'));
});
}

View file

@ -0,0 +1,34 @@
<!DOCTYPE html>
<meta charset="utf-8">
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<iframe name=frame1 id=frame1></iframe>
<form id=form1 target=frame1 action="does_not_exist.html">
<button id=submitbutton type=submit>
<div id=buttonchilddiv>
button child div text
</div>
</button>
</form>
<script>
async_test(t => {
window.addEventListener('load', () => {
const frame1 = document.getElementById('frame1');
frame1.addEventListener('load', t.step_func_done(() => {}));
const submitButton = document.getElementById('submitbutton');
submitButton.addEventListener('click', event => {
event.preventDefault();
const form = document.getElementById('form1');
form.submit();
});
const buttonChildDiv = document.getElementById('buttonchilddiv');
buttonChildDiv.click();
});
}, 'This test will pass if a form navigation successfully occurs when clicking a child element of a <button type=submit> element with a onclick event handler which prevents the default form submission and manually calls form.submit() instead.');
</script>

View file

@ -68,18 +68,21 @@ dictionary AudioConfiguration {
dictionary MediaCapabilitiesKeySystemConfiguration {
required DOMString keySystem;
DOMString initDataType = "";
DOMString audioRobustness = "";
DOMString videoRobustness = "";
MediaKeysRequirement distinctiveIdentifier = "optional";
MediaKeysRequirement persistentState = "optional";
sequence<DOMString> sessionTypes;
KeySystemTrackConfiguration audio;
KeySystemTrackConfiguration video;
};
dictionary KeySystemTrackConfiguration {
DOMString robustness = "";
};
dictionary MediaCapabilitiesInfo {
required boolean supported;
required boolean smooth;
required boolean powerEfficient;
};
dictionary MediaCapabilitiesDecodingInfo : MediaCapabilitiesInfo {

View file

@ -72,7 +72,6 @@ dictionary NDEFReadingEventInit : EventInit {
dictionary NDEFPushOptions {
NDEFPushTarget target = "any";
unrestricted double timeout = Infinity;
boolean ignoreRead = true;
boolean overwrite = true;
AbortSignal? signal;

View file

@ -612,7 +612,6 @@ dictionary RTCDTMFToneChangeEventInit : EventInit {
partial interface RTCPeerConnection {
Promise<RTCStatsReport> getStats(optional MediaStreamTrack? selector = null);
attribute EventHandler onstatsended;
};
[Exposed=Window]
@ -626,16 +625,6 @@ dictionary RTCStats {
required DOMString id;
};
[Exposed=Window]
interface RTCStatsEvent : Event {
constructor(DOMString type, RTCStatsEventInit eventInitDict);
readonly attribute RTCStatsReport report;
};
dictionary RTCStatsEventInit : EventInit {
required RTCStatsReport report;
};
[Exposed=Window]
interface RTCError : DOMException {
constructor(RTCErrorInit init, optional DOMString message = "");

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<head>
<title>Images with loading='lazy' load when in the viewport</title>
<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
<link rel="help" href="https://github.com/scott-little/lazyload">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<!--
Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
-->
<script>
const t = async_test("Test that images with loading='lazy' under multicol load once they enter the viewport.");
let has_in_viewport_loaded = false;
let has_window_loaded = false;
const in_viewport_img_onload = t.step_func(function() {
assert_false(has_in_viewport_loaded, "The in_viewport element should load only once.");
has_in_viewport_loaded = true;
});
window.addEventListener("load", t.step_func_done(function() {
assert_true(has_in_viewport_loaded, "The in_viewport element should have loaded before window.load().");
assert_false(has_window_loaded, "The window.load() event should only fire once.");
has_window_loaded = true;
}));
</script>
<div class=texty style="column-count: 2; height: 300px">
<div style="border: 1px solid black">
<h2 style="column-span: all"></h2>
<img loading="lazy" src="resources/image.png?first" width="160" height="120"
onload="in_viewport_img_onload()">
</div>
</div>
<!--
This async script loads very slowly in order to ensure that, if the
below_viewport element has started loading, it has a chance to finish
loading before window.load() happens, so that the test will dependably fail
in that case instead of potentially passing depending on how long different
resource fetches take.
-->
<script async src="/common/slow.py"></script>

View file

@ -6,3 +6,35 @@ directory_test(async (t, root) => {
let actualContents = await slice.text();
assert_equals(actualContents, fileContents.slice(1, fileContents.length));
}, 'getFile() provides a file that can be sliced');
directory_test(async (t, root) => {
const handle = await createEmptyFile(t, 'mtime.txt', root);
let file = await handle.getFile();
const first_mtime = file.lastModified;
// We wait for 2s here to ensure that the files do not have the
// same modification time. Some filesystems have low resolutions
// for modification timestamps.
let timeout = new Promise(resolve => {
t.step_timeout(resolve, 2000);
});
await timeout;
const writer = await handle.createWriter({keepExistingData: false});
await writer.write(0, new Blob(['foo']));
await writer.close();
file = await handle.getFile();
const second_mtime = file.lastModified;
// We wait for 5 ms here to ensure that `lastModified`
// from the File objects is stable between getFile invocations.
timeout = new Promise(resolve => {
t.step_timeout(resolve, 5);
});
await timeout;
let fileReplica = await handle.getFile();
assert_equals(second_mtime, fileReplica.lastModified);
assert_less_than(first_mtime, second_mtime);
}, 'getFile() returns last modified time');

View file

@ -15,7 +15,7 @@
<link rel=preload href="resources/dummy.xml">
<body>
<script>
setup({explicit_done: true});
setup({single_test: true});
var iterations = 0;

View file

@ -15,7 +15,7 @@
<link rel=preload href="resources/dummy.xml">
<body>
<script>
setup({explicit_done: true});
setup({single_test: true});
var iterations = 0;

View file

@ -31,14 +31,16 @@ function toMojoNDEFRecord(record) {
return nfcRecord;
}
// Converts JS objects to byte array.
function toByteArray(data) {
// Converts JS objects to byte array.
if (data instanceof ArrayBuffer)
return new Uint8Array(data);
else if (ArrayBuffer.isView(data))
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
let byteArray = new Uint8Array(0);
let tmpData = data;
if (tmpData instanceof ArrayBuffer)
byteArray = new Uint8Array(tmpData);
else if (typeof tmpData === 'object' || typeof tmpData === 'number')
if (typeof tmpData === 'object' || typeof tmpData === 'number')
tmpData = JSON.stringify(tmpData);
if (typeof tmpData === 'string')

View file

@ -643,7 +643,7 @@ class MockXRInputSource {
this.primary_input_clicked_ = fakeInputSourceInit.selectionClicked;
}
this.grip_ = null;
this.mojo_from_input_ = null;
if (fakeInputSourceInit.gripOrigin != null) {
this.setGripOrigin(fakeInputSourceInit.gripOrigin);
}
@ -676,22 +676,22 @@ class MockXRInputSource {
}
setGripOrigin(transform, emulatedPosition = false) {
this.grip_ = new gfx.mojom.Transform();
this.grip_.matrix = getMatrixFromTransform(transform);
this.mojo_from_input_ = new gfx.mojom.Transform();
this.mojo_from_input_.matrix = getMatrixFromTransform(transform);
this.emulated_position_ = emulatedPosition;
}
clearGripOrigin() {
if (this.grip_ != null) {
this.grip_ = null;
if (this.mojo_from_input_ != null) {
this.mojo_from_input_ = null;
this.emulated_position_ = false;
}
}
setPointerOrigin(transform, emulatedPosition = false) {
this.desc_dirty_ = true;
this.pointer_offset_ = new gfx.mojom.Transform();
this.pointer_offset_.matrix = getMatrixFromTransform(transform);
this.input_from_pointer_ = new gfx.mojom.Transform();
this.input_from_pointer_.matrix = getMatrixFromTransform(transform);
this.emulated_position_ = emulatedPosition;
}
@ -810,7 +810,7 @@ class MockXRInputSource {
input_state.primaryInputPressed = this.primary_input_pressed_;
input_state.primaryInputClicked = this.primary_input_clicked_;
input_state.grip = this.grip_;
input_state.mojoFromInput = this.mojo_from_input_;
input_state.gamepad = this.gamepad_;
@ -840,7 +840,7 @@ class MockXRInputSource {
break;
}
input_desc.pointerOffset = this.pointer_offset_;
input_desc.inputFromPointer = this.input_from_pointer_;
input_desc.profiles = this.profiles_;

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<title>Timed element not active after first interval active duration changes to unresolved</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<svg>
<rect width="100" height="100" fill="green">
<set attributeName="fill" to="red" fill="freeze"
begin="click" end="click" dur="100ms" repeatCount="indefinite"/>
</rect>
</svg>
<script>
async_test(function(t) {
let set = document.querySelector('set');
window.onload = t.step_func(function() {
t.step_timeout(function() {
set.setAttribute('begin', '-100ms');
set.setAttribute('begin', 'click');
set.parentNode.appendChild(set);
set.setAttribute('end', '-100ms');
set.setAttribute('end', 'click');
window.requestAnimationFrame(t.step_func_done(function() {
let target = set.targetElement;
assert_equals(getComputedStyle(target).fill, 'rgb(0, 128, 0)');
}));
}, 0);
});
});
</script>

View file

@ -95,3 +95,25 @@ steps:
condition: always()
errorActionPreference: silentlyContinue
ignoreLASTEXITCODE: true
- powershell: |
($webdriverFiles = Get-ChildItem -PATH "$env:systemdrive\*msedgedriver.exe" -Recurse) >$null 2>$null
Write-Host "Found $($webdriverFiles.Count) msedgedriver binaries"
foreach ($file in $webdriverFiles) {
Write-Host "Deleting $file"
Remove-Item -Path $file.FullName -Force -ErrorAction SilentlyContinue
}
($driverNotesFolder = Get-ChildItem -PATH "$env:systemdrive\*Driver_Notes" -Recurse) >$null 2>$null
foreach ($file in $driverNotesFolder) {
Write-Host "Deleting $file folder"
Remove-Item -Path $file.FullName -Recurse -Force -ErrorAction SilentlyContinue
}
($zipFile = Get-ChildItem -PATH "$env:systemdrive\*edgedriver_*.zip" -Recurse) >$null 2>$null
foreach ($file in $zipFile) {
Write-Host "Deleting $file file"
Remove-Item -Path $file.FullName -Force -ErrorAction SilentlyContinue
}
displayName: 'Cleanup Edge driver binaries'
condition: always()
errorActionPreference: silentlyContinue
ignoreLASTEXITCODE: true

View file

@ -51,9 +51,6 @@ except ImportError:
from urllib.request import urlopen
QUEUE_BASE = "https://queue.taskcluster.net/v1/task"
root = os.path.abspath(
os.path.join(os.path.dirname(__file__),
os.pardir,
@ -127,12 +124,8 @@ def checkout_revision(rev):
def install_chrome(channel):
deb_prefix = "https://dl.google.com/linux/direct/"
if channel in ("experimental", "dev", "nightly"):
# Pinned to 78 as 79 consistently fails reftests. TODO(foolip).
# See https://github.com/web-platform-tests/wpt/issues/19297.
deb_archive = "google-chrome-unstable_78.0.3904.17-1_amd64.deb"
deb_prefix = "https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-unstable/"
deb_archive = "google-chrome-unstable_current_amd64.deb"
elif channel == "beta":
deb_archive = "google-chrome-beta_current_amd64.deb"
elif channel == "stable":
@ -141,7 +134,7 @@ def install_chrome(channel):
raise ValueError("Unrecognized release channel: %s" % channel)
dest = os.path.join("/tmp", deb_archive)
resp = urlopen(deb_prefix + deb_archive)
resp = urlopen("https://dl.google.com/linux/direct/%s" % deb_archive)
with open(dest, "w") as f:
f.write(resp.read())
@ -329,7 +322,14 @@ def fetch_event_data():
# For example under local testing
return None
resp = urlopen("%s/%s" % (QUEUE_BASE, task_id))
root_url = os.environ['TASKCLUSTER_ROOT_URL']
if root_url == 'https://taskcluster.net':
queue_base = "https://queue.taskcluster.net/v1/task"
else:
queue_base = root_url + "/api/queue/v1/task"
resp = urlopen("%s/%s" % (queue_base, task_id))
task_data = json.load(resp)
event_data = task_data.get("extra", {}).get("github_event")

View file

@ -10,6 +10,10 @@ import github
logging.basicConfig()
logger = logging.getLogger("tc-download")
# The root URL of the Taskcluster deployment from which to download wpt reports
# (after https://bugzilla.mozilla.org/show_bug.cgi?id=1574668 lands, this will
# be https://community-tc.services.mozilla.com)
TASKCLUSTER_ROOT_URL = 'https://taskcluster.net'
def get_parser():
parser = argparse.ArgumentParser()
@ -74,8 +78,13 @@ def run(*args, **kwargs):
return 1
for taskgroup in taskgroups:
taskgroup_url = "https://queue.taskcluster.net/v1/task-group/%s/list"
artifacts_list_url = "https://queue.taskcluster.net/v1/task/%s/artifacts"
if TASKCLUSTER_ROOT_URL == 'https://taskcluster.net':
# NOTE: this condition can be removed after November 9, 2019
taskgroup_url = "https://queue.taskcluster.net/v1/task-group/%s/list"
artifacts_list_url = "https://queue.taskcluster.net/v1/task/%s/artifacts"
else:
taskgroup_url = TASKCLUSTER_ROOT_URL + "/api/queue/v1/task-group/%s/list"
artifacts_list_url = TASKCLUSTER_ROOT_URL + "/api/queue/v1/task/%s/artifacts"
tasks = get_json(taskgroup_url % taskgroup, "tasks")
for task in tasks:
task_id = task["status"]["taskId"]

View file

@ -17,6 +17,10 @@ from utils import call, get, untar, unzip
uname = platform.uname()
# the rootUrl for the firefox-ci deployment of Taskcluster
# (after November 9, https://firefox-ci-tc.services.mozilla.com/)
FIREFOX_CI_ROOT_URL = 'https://taskcluster.net'
def _get_fileversion(binary, logger=None):
command = "(Get-Item '%s').VersionInfo.FileVersion" % binary.replace("'", "''")
@ -423,8 +427,13 @@ class FirefoxAndroid(Browser):
if dest is None:
dest = os.pwd
TC_QUEUE_BASE = "https://queue.taskcluster.net/v1/"
TC_INDEX_BASE = "https://index.taskcluster.net/v1/"
if FIREFOX_CI_ROOT_URL == 'https://taskcluster.net':
# NOTE: this condition can be removed after November 9, 2019
TC_QUEUE_BASE = "https://queue.taskcluster.net/v1/"
TC_INDEX_BASE = "https://index.taskcluster.net/v1/"
else:
TC_QUEUE_BASE = FIREFOX_CI_ROOT_URL + "/api/queue/v1/"
TC_INDEX_BASE = FIREFOX_CI_ROOT_URL + "/api/index/v1/"
resp = requests.get(TC_INDEX_BASE +
@ -874,10 +883,12 @@ class EdgeChromium(Browser):
if os.path.isfile(edgedriver_path):
# remove read-only attribute
os.chmod(edgedriver_path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) # 0777
print("Delete %s file" % edgedriver_path)
os.remove(edgedriver_path)
driver_notes_path = os.path.join(dest, "Driver_notes")
if os.path.isdir(driver_notes_path):
shutil.rmtree(driver_notes_path, ignore_errors=False, onerror=handle_remove_readonly)
driver_notes_path = os.path.join(dest, "Driver_notes")
if os.path.isdir(driver_notes_path):
print("Delete %s folder" % driver_notes_path)
shutil.rmtree(driver_notes_path, ignore_errors=False, onerror=handle_remove_readonly)
self.logger.info("Downloading MSEdgeDriver from %s" % url)
unzip(get(url).raw, dest)

View file

@ -0,0 +1,4 @@
[viewport-no-resize-event-on-overflow-recalc.html]
expected: TIMEOUT
[Resize event not fired at window.visualViewport when content is added]
expected: NOTRUN

View file

@ -33,6 +33,13 @@ const NDEFReaderOptionTests =
unmatchedScanOptions: {recordType: "json"},
message: createMessage([createOpaqueRecord(test_buffer_data)])
},
{
desc: "Test that reading data succeed when NDEFScanOptions'" +
" recordType is set to 'unknown'.",
scanOptions: {recordType: "unknown"},
unmatchedScanOptions: {recordType: "json"},
message: createMessage([createUnknownRecord(test_buffer_data)])
},
{
desc: "Test that reading data succeed when NDEFScanOptions'" +
" recordType is set to 'text'.",
@ -102,6 +109,13 @@ const ReadMultiMessagesTests =
message: createMessage([createOpaqueRecord(test_buffer_data)]),
unmatchedMessage: createMessage([createJsonRecord(test_json_data)])
},
{
desc: "Test that filtering 'unknown' record from different messages" +
" correctly with NDEFScanOptions' recordType is set to 'unknown'.",
scanOptions: {recordType: "unknown"},
message: createMessage([createUnknownRecord(test_buffer_data)]),
unmatchedMessage: createMessage([createUrlRecord(test_url_data)])
},
{
desc: "Test that filtering 'text' record from different messages" +
" correctly with NDEFScanOptions' recordType is set to 'text'.",

View file

@ -161,6 +161,30 @@
'json() has the same content with the original dictionary');
}, 'NDEFRecord constructor with JSON record type');
test(() => {
assert_throws(new TypeError, () => new NDEFRecord(
createUnknownRecord("A string is not a BufferSource")),
'Only BufferSource is allowed to be the record data.');
let buffer = new ArrayBuffer(4);
new Uint8Array(buffer).set([1, 2, 3, 4]);
// Feed ArrayBuffer.
{
const record = new NDEFRecord(createUnknownRecord(buffer));
assert_equals(record.recordType, 'unknown', 'recordType');
assert_array_equals(new Uint8Array(record.data.buffer), [1, 2, 3, 4],
'data has the same content with the original buffer');
}
// Feed ArrayBufferView.
{
let buffer_view = new Uint8Array(buffer, 1);
const record = new NDEFRecord(createUnknownRecord(buffer_view));
assert_equals(record.recordType, 'unknown', 'recordType');
assert_array_equals(new Uint8Array(record.data.buffer), [2, 3, 4],
'data has the same content with the original buffer view');
}
}, 'NDEFRecord constructor with unknown record type');
test(() => {
let buffer = new ArrayBuffer(4);
let buffer_view = new Uint8Array(buffer);

View file

@ -70,6 +70,14 @@ const invalid_type_messages =
createMessage([createOpaqueRecord(test_number_data)]),
createMessage([createOpaqueRecord(test_json_data)]),
// NDEFRecord must have data.
createMessage([createUnknownRecord()]),
// NDEFRecord.data for 'unknown' record must be BufferSource.
createMessage([createUnknownRecord(test_text_data)]),
createMessage([createUnknownRecord(test_number_data)]),
createMessage([createUnknownRecord(test_json_data)]),
// https://w3c.github.io/web-nfc/#dfn-map-external-data-to-ndef
// NDEFRecord must have data.
createMessage([createRecord('w3.org:xyz', '', undefined)]),
@ -301,13 +309,14 @@ nfc_test(async (t, mockNFC) => {
createJsonRecord(test_json_data),
createJsonRecord(test_number_data),
createOpaqueRecord(test_buffer_data),
createUnknownRecord(test_buffer_data),
createUrlRecord(test_url_data),
createUrlRecord(test_url_data, true),
createRecord('w3.org:xyz', '', test_buffer_data)],
test_message_origin);
await writer.push(message);
assertNDEFMessagesEqual(message, mockNFC.pushedMessage());
}, "NDEFWriter.push NDEFMessage containing text, json, opaque, url, absolute-url \
}, "NDEFWriter.push NDEFMessage containing text, json, opaque, unknown, url, absolute-url \
and external records with default NDEFPushOptions.");
nfc_test(async (t, mockNFC) => {
@ -322,6 +331,13 @@ nfc_test(async (t, mockNFC) => {
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
}, "Test that NDEFWriter.push succeeds when message is ArrayBuffer.");
nfc_test(async (t, mockNFC) => {
let buffer_view = new Uint8Array(test_buffer_data, 2, 5);
const writer = new NDEFWriter();
await writer.push(buffer_view);
assertNDEFMessagesEqual(buffer_view, mockNFC.pushedMessage());
}, "Test that NDEFWriter.push succeeds when message is ArrayBufferView.");
nfc_test(async () => {
const writer = new NDEFWriter();
await writer.push(createMessage([createRecord('empty')]));

View file

@ -64,8 +64,8 @@ const test_json_data = {level: 1, score: 100, label: 'Game'};
const test_url_data = 'https://w3c.github.io/web-nfc/';
const test_message_origin = 'https://127.0.0.1:8443';
const test_buffer_data = new ArrayBuffer(test_text_byte_array.length);
const test_buffer_view =
new Uint8Array(test_buffer_data).set(test_text_byte_array);
const test_buffer_view = new Uint8Array(test_buffer_data);
test_buffer_view.set(test_text_byte_array);
const fake_tag_serial_number = 'c0:45:00:02';
const NFCHWStatus = {};
@ -111,6 +111,10 @@ function createOpaqueRecord(buffer) {
return createRecord('opaque', 'application/octet-stream', buffer);
}
function createUnknownRecord(buffer) {
return createRecord('unknown', '', buffer);
}
function createUrlRecord(url, isAbsUrl) {
if (isAbsUrl) {
return createRecord('absolute-url', 'text/plain', url);
@ -126,11 +130,12 @@ function createNDEFPushOptions(target, timeout, ignoreRead) {
// (e.g. NDEFWriter.push), and NDEFMessage that was received by the
// mock NFC service.
function assertNDEFMessagesEqual(providedMessage, receivedMessage) {
// If simple data type is passed, e.g. String or ArrayBuffer, convert it
// to NDEFMessage before comparing.
// If simple data type is passed, e.g. String or ArrayBuffer or
// ArrayBufferView, convert it to NDEFMessage before comparing.
// https://w3c.github.io/web-nfc/#dom-ndefmessagesource
let provided = providedMessage;
if (providedMessage instanceof ArrayBuffer)
if (providedMessage instanceof ArrayBuffer ||
ArrayBuffer.isView(providedMessage))
provided = createMessage([createOpaqueRecord(providedMessage)]);
else if (typeof providedMessage === 'string')
provided = createMessage([createTextRecord(providedMessage)]);

View file

@ -0,0 +1,142 @@
<!doctype html>
<meta charset=utf-8>
<title></title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
"use strict";
const kSmallTimeoutMs = 10;
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const signalingStateChangeEvent
= new EventWatcher(t, offerer, 'signalingstatechange')
.wait_for('signalingstatechange');
await offerer.setLocalDescription();
await signalingStateChangeEvent;
assert_equals(offerer.signalingState, 'have-local-offer');
}, "Parameterless SLD() in 'stable' goes to 'have-local-offer'");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
await offerer.setLocalDescription();
assert_not_equals(offerer.pendingLocalDescription, null);
}, "Parameterless SLD() in 'stable' sets pendingLocalDescription");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const transceiver = offerer.addTransceiver('audio');
await offerer.setLocalDescription();
assert_not_equals(transceiver.mid, null);
}, "Parameterless SLD() in 'stable' assigns transceiver.mid");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const answerer = new RTCPeerConnection();
t.add_cleanup(() => answerer.close());
await answerer.setRemoteDescription(await offerer.createOffer());
const signalingStateChangeEvent
= new EventWatcher(t, answerer, 'signalingstatechange')
.wait_for('signalingstatechange');
await answerer.setLocalDescription();
await signalingStateChangeEvent;
assert_equals(answerer.signalingState, 'stable');
}, "Parameterless SLD() in 'have-remote-offer' goes to 'stable'");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const answerer = new RTCPeerConnection();
t.add_cleanup(() => answerer.close());
await answerer.setRemoteDescription(await offerer.createOffer());
await answerer.setLocalDescription();
assert_not_equals(answerer.currentLocalDescription, null);
}, "Parameterless SLD() in 'have-remote-offer' sets currentLocalDescription");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const answerer = new RTCPeerConnection();
t.add_cleanup(() => answerer.close());
offerer.addTransceiver('audio');
const onTransceiverPromise = new Promise(resolve =>
answerer.ontrack = e => resolve(e.transceiver));
await answerer.setRemoteDescription(await offerer.createOffer());
const transceiver = await onTransceiverPromise;
await answerer.setLocalDescription();
assert_equals(transceiver.currentDirection, 'recvonly');
}, "Parameterless SLD() in 'have-remote-offer' sets " +
"transceiver.currentDirection");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const offer = await offerer.createOffer();
await offerer.setLocalDescription();
// assert_true() is used rather than assert_equals() so that if the assertion
// fails, the -expected.txt file is not different on each run.
assert_true(offerer.pendingLocalDescription.sdp == offer.sdp,
"offerer.pendingLocalDescription.sdp == offer.sdp");
}, "Parameterless SLD() uses [[LastCreatedOffer]] if it is still valid");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const answerer = new RTCPeerConnection();
t.add_cleanup(() => answerer.close());
await answerer.setRemoteDescription(await offerer.createOffer());
const answer = await answerer.createAnswer();
await answerer.setLocalDescription();
// assert_true() is used rather than assert_equals() so that if the assertion
// fails, the -expected.txt file is not different on each run.
assert_true(answerer.currentLocalDescription.sdp == answer.sdp,
"answerer.currentLocalDescription.sdp == answer.sdp");
}, "Parameterless SLD() uses [[LastCreatedAnswer]] if it is still valid");
promise_test(async t => {
const offerer = new RTCPeerConnection();
offerer.close();
offerer.setLocalDescription().then(t.step_func(() => assert_not_reached()));
await new Promise(resolve => t.step_timeout(resolve, kSmallTimeoutMs));
}, "Parameterless SLD() never resolves if already closed");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
offerer.setLocalDescription().then(t.step_func(() => assert_not_reached()));
offerer.close();
await new Promise(resolve => t.step_timeout(resolve, kSmallTimeoutMs));
}, "Parameterless SLD() never resolves if closed while pending");
promise_test(async t => {
const offerer = new RTCPeerConnection();
t.add_cleanup(() => offerer.close());
const answerer = new RTCPeerConnection();
t.add_cleanup(() => answerer.close());
// Implicitly create an offer.
await offerer.setLocalDescription();
await answerer.setRemoteDescription(offerer.pendingLocalDescription);
// Implicitly create an answer.
await answerer.setLocalDescription();
await offerer.setRemoteDescription(answerer.currentLocalDescription);
}, "Parameterless SLD() in a full O/A exchange succeeds");
</script>

View file

@ -7,3 +7,75 @@
[WebGL test #1: context does not exist]
expected: FAIL
[WebGL test #9: Canvas should be red]
expected: FAIL
[WebGL test #17: Canvas should be red]
expected: FAIL
[WebGL test #23: Canvas should be red]
expected: FAIL
[WebGL test #8: Canvas should be red]
expected: FAIL
[WebGL test #13: Canvas should be red]
expected: FAIL
[WebGL test #18: Canvas should be red]
expected: FAIL
[WebGL test #5: Canvas should be red]
expected: FAIL
[WebGL test #14: Canvas should be red]
expected: FAIL
[WebGL test #22: Canvas should be red]
expected: FAIL
[WebGL test #20: Canvas should be red]
expected: FAIL
[WebGL test #3: Canvas should be red]
expected: FAIL
[WebGL test #24: Canvas should be red]
expected: FAIL
[WebGL test #7: Canvas should be red]
expected: FAIL
[WebGL test #11: Canvas should be red]
expected: FAIL
[WebGL test #2: Canvas should be red]
expected: FAIL
[WebGL test #4: Canvas should be red]
expected: FAIL
[WebGL test #1: Canvas should be red]
expected: FAIL
[WebGL test #21: Canvas should be red]
expected: FAIL
[WebGL test #6: Canvas should be red]
expected: FAIL
[WebGL test #19: Canvas should be red]
expected: FAIL
[WebGL test #12: Canvas should be red]
expected: FAIL
[WebGL test #16: Canvas should be red]
expected: FAIL
[WebGL test #10: Canvas should be red]
expected: FAIL
[WebGL test #15: Canvas should be red]
expected: FAIL

View file

@ -1,5 +1,4 @@
[canvas-resizing-with-pbo-bound.html]
expected: TIMEOUT
[WebGL test #0: Unable to fetch WebGL rendering context for Canvas]
expected: FAIL