Auto merge of #26954 - servo-wpt-sync:wpt_update_17-06-2020, r=servo-wpt-sync

Sync WPT with upstream (17-06-2020)

Automated downstream sync of changes from upstream as of 17-06-2020.
[no-wpt-sync]
r? @servo-wpt-sync
This commit is contained in:
bors-servo 2020-06-17 19:30:33 -04:00 committed by GitHub
commit f93c87fb5d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
93 changed files with 1056 additions and 202 deletions

View file

@ -1,4 +0,0 @@
[hit-test-floats-002.html]
[Hit test float]
expected: FAIL

View file

@ -0,0 +1,4 @@
[hit-test-floats-004.html]
[Miss float below something else]
expected: FAIL

View file

@ -11,3 +11,18 @@
[e.style['text-decoration'\] = "overline dotted green" should not set unrelated longhands]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-style]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-line]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-color]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should not set unrelated longhands]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-thickness]
expected: FAIL

View file

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

View file

@ -53,9 +53,6 @@
[combined text/javascript ]
expected: FAIL
[separate text/javascript x/x]
expected: FAIL
[separate text/javascript ]
[separate text/javascript error]
expected: FAIL

View file

@ -11,6 +11,9 @@
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
expected: FAIL
[X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff]
[X-Content-Type-Options%3A%20%22nosniFF%22]
expected: FAIL
[Content-Type-Options%3A%20nosniff]
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_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

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

View file

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

View file

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

View file

@ -0,0 +1,4 @@
[077.html]
[ adding several types of scripts through the DOM and removing some of them confuses scheduler ]
expected: FAIL

View file

@ -0,0 +1,4 @@
[load-event-after-location-set-during-write.window.html]
[Setting location from document.write() call should not trigger load event until that load completes]
expected: FAIL

View file

@ -3,6 +3,3 @@
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: TIMEOUT
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: FAIL

View file

@ -0,0 +1,7 @@
[audioworkletprocessor-process-frozen-array.https.html]
[Executing "transfer-frozen-array"]
expected: FAIL
[Executing "check-frozen-array"]
expected: FAIL

View file

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

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

View file

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

View file

@ -1,4 +1,5 @@
[003.html]
expected: ERROR
[shared]
expected: FAIL

View file

@ -1,7 +1,8 @@
[shared-worker-in-data-url-context.window.html]
expected: TIMEOUT
[Create a shared worker in a data url frame]
expected: FAIL
expected: TIMEOUT
[Create a data url shared worker in a data url frame]
expected: FAIL
expected: NOTRUN

View file

@ -586,6 +586,13 @@
"semantics": {
"embedded-content": {
"the-audio-element": {
"audio-appendChild-to-inactive-document-crash.html": [
"33d52ca89946298d02349877164e5439626232df",
[
null,
{}
]
],
"audio-play-in-inactive-document-crash.html": [
"ade40797b97ec4661e82a62fc601c3b27ad44d2d",
[
@ -2183,6 +2190,44 @@
]
]
},
"appmanifest": {
"link-relationship": {
"link-tree-order-manual.html": [
"a8bf882fbd1c264bd6f68ff5e84d67c37d716789",
[
null,
{}
]
]
},
"name-member": {
"name-member-manual.html": [
"8ba4110bd07a82e3a19e3c82d76ba543832a0cf1",
[
null,
{}
]
]
},
"short_name-member": {
"short_name-member-manual.html": [
"7d959ad78fa08d91993db13c3819e4d3a6d916ac",
[
null,
{}
]
]
},
"theme_color-member": {
"theme_color-member-red-manual.html": [
"07c6dfee3e3118fa7d824d5e0961ae8dbad87c36",
[
null,
{}
]
]
}
},
"audio-output": {
"setSinkId-manual.https.html": [
"a083cdf09232110039d3bb825e207c678b336114",
@ -180888,6 +180933,19 @@
{}
]
],
"backface-visibility-001.html": [
"c5ee9cc0f12f6012c105758cc14afbc6f2feb9dc",
[
null,
[
[
"/css/css-transforms/backface-visibility-001.ref.html",
"=="
]
],
{}
]
],
"backface-visibility-hidden-001.html": [
"e9a463fc0b0b7e893d3c801c6a78aa5368ef3e60",
[
@ -233973,6 +234031,19 @@
{}
]
],
"input-image-inline-alt.html": [
"e05ad84191373836d5fd8b64a45ce69bab197fb2",
[
null,
[
[
"/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/input-image-inline-alt-ref.html",
"=="
]
],
{}
]
],
"input-type-change-from-image-1.html": [
"00747a5fbf69f64802a4a05680186d1bc0d9f894",
[
@ -237307,6 +237378,19 @@
],
{}
]
],
"mrow-painting-order.html": [
"b221ec8ffda0b53a4fdf8af9db82e8aa7e1c4c9e",
[
null,
[
[
"/mathml/presentation-markup/mrow/mrow-painting-order-ref.html",
"=="
]
],
{}
]
]
},
"operators": {
@ -247305,10 +247389,48 @@
},
"appmanifest": {
"META.yml": [
"0b9c714df2a45545212397d7e391655f3e1091cf",
"bef14c3c795aa5a8befd4d95aeb8573f4af07ad7",
[]
],
"name-member": {
"name-member-fail.webmanifest": [
"2fbf8809696490911cfe7eff8d83f620bc218a7a",
[]
],
"name-member-fail.webmanifest.headers": [
"23f36ea27ced7bba400a60e8e618757e5701cd88",
[]
],
"name-member.webmanifest": [
"c51d155a24cfb94322640e761803bb06ad19c9d4",
[]
],
"name-member.webmanifest.headers": [
"23f36ea27ced7bba400a60e8e618757e5701cd88",
[]
]
},
"short_name-member": {
"short_name-member.webmanifest": [
"66f357e294cb810a90e6b39f9d87a7a45ab8029d",
[]
],
"short_name-member.webmanifest.headers": [
"23f36ea27ced7bba400a60e8e618757e5701cd88",
[]
]
},
"theme_color-member": {
"theme_color-member-red.webmanifest": [
"87324a70f3b34bddeee7b2d57e8125444ece4ad3",
[]
],
"theme_color-member-red.webmanifest.headers": [
"2bab061d43ab9e533b0160ca506231939886cd89",
[]
]
}
},
"audio-output": {
"META.yml": [
"b6a7d4d06259117af8fb843f6a8d252bac01a8f3",
@ -318622,7 +318744,7 @@
[]
],
"general-guidelines.md": [
"45e8769ae1edf1f327047ca4c094c772bd661966",
"b8b8e49af510652f26848408361e3023ce031d3f",
[]
],
"github-intro.md": [
@ -318642,7 +318764,7 @@
[]
],
"lint-tool.md": [
"551a9c1b605f51e2adbf00ef2f33d80e0d7db25b",
"ba11169e020c8c74a2a4dab04c316d3e391321a1",
[]
],
"making-a-testing-plan.md": [
@ -330971,6 +331093,10 @@
"55f06ef96bbdf287f84f90abd4eafc90afaa4304",
[]
],
"input-image-inline-alt-ref.html": [
"b3fdc14ef1707fcaad2b584b98e5c8f6d0be1e17",
[]
],
"input-type-change-from-image-1-ref.html": [
"7768379e9153b02bb90859cfa0583296df78e9dd",
[]
@ -331132,7 +331258,7 @@
"document-metadata": {
"interactions-of-styling-and-scripting": {
"stylesheet.py": [
"9befce9e60cbaea39cd279eeeeec87dabb2dade5",
"d5ae5b9ccad74cfe9233c9d296f991e637749268",
[]
]
},
@ -331193,7 +331319,7 @@
[]
],
"css.py": [
"eb981373a3e2b1694a295d58b4d5baf4c3c5a034",
"1a11c1d5b35a80b4efb29c93ffb3060d896af0b8",
[]
],
"empty-href.css": [
@ -331250,7 +331376,7 @@
[]
],
"stylesheet.py": [
"a312e9e87cac22c19c6a24e083060ac616cf4681",
"1a4dec2724438e1df66aa8fb286e74979847df02",
[]
]
},
@ -331275,7 +331401,7 @@
[]
],
"refresh.py": [
"f68e274c901700a00c743c54385e8212633d1f5f",
"797c7b9412d3425a38a0b1714a98953fd7e420a1",
[]
],
"refresh.sub.html": [
@ -331364,7 +331490,7 @@
"loading-the-media-resource": {
"resources": {
"delayed-broken-video.py": [
"88e5027947cf3cde1a9b3d2b5bfc1dfa177d0b10",
"4eae3261f765cc36ae60f99e25a6c52dbed62d86",
[]
]
}
@ -332002,7 +332128,7 @@
[]
],
"stash.py": [
"0b8693a901152cc7a7f21de1fbdd191dce6078c3",
"231eeb492fcfdd7f4c4ba8ed8a91924bf780b1b6",
[]
],
"support": {
@ -332015,7 +332141,7 @@
[]
],
"download_stash.py": [
"24e1dfd58f760e1fa99846e0fac063a32a258e58",
"95256a2457aeb40dea30f5d43e713bca09f45c1f",
[]
],
"iframe-that-checks-contentDocument.html": [
@ -332291,7 +332417,7 @@
[]
],
"referrer-checker-img.py": [
"0597268d8391b339c80d3274a52265db168e676a",
"bb2071cb9769e7d2358344fe1782295b8a63e023",
[]
]
},
@ -336383,12 +336509,6 @@
[]
]
},
"manifest": {
"META.yml": [
"013fc58a29fa7f83e5e6a034d3a343bc87ab629d",
[]
]
},
"mathml": {
"META.yml": [
"5aea9088d744bfa835ca91217c9a6d9f60253e3e",
@ -336545,6 +336665,10 @@
"legacy-mrow-like-elements-002-ref.html": [
"0c26780c10f06cde8f7815a84f5fe22217907dfd",
[]
],
"mrow-painting-order-ref.html": [
"72694959a86f1917cbd3db13b7f1a8b71714b711",
[]
]
},
"operators": {
@ -352901,11 +353025,11 @@
[]
],
"testloader.py": [
"3a26efc554211a5248a790909d99893afe9ff674",
"0340294dcaa9c07d9c58bf609fb4f572d1dd1055",
[]
],
"testrunner.py": [
"49a3525e883d15a059022a54911eecf531d836ff",
"4c9468a0eba4b3c38821446aba65dec58137b229",
[]
],
"tests": {
@ -353007,7 +353131,7 @@
[]
],
"wptcommandline.py": [
"96227bb46905e168d691e350946dbfba68098271",
"8087947670456b5e72c467222df9000e54f75b56",
[]
],
"wptlogging.py": [
@ -353077,7 +353201,7 @@
}
},
"wptrunner.py": [
"d0cc19481dbdedc45edfee9608d82deb4a196571",
"86cc36d3af53ad4c7b04ef25d23eb38caa3601ab",
[]
],
"wpttest.py": [
@ -354589,6 +354713,10 @@
"d05056bd8491d8b5f290b28910fcb657c6ac4e83",
[]
],
"array-check-processor.js": [
"d6eeff3d15515e7ad534be90c25c1a13b3be927f",
[]
],
"channel-count-processor.js": [
"556459f46b3074f03578c53ba7b967387bab071b",
[]
@ -371738,6 +371866,17 @@
]
]
},
"appmanifest": {
"link-relationship": {
"link-rel-manifest.html": [
"8eb39703a082daedc921b156287b014eaf836665",
[
null,
{}
]
]
}
},
"audio-output": {
"idlharness.https.window.js": [
"c13b167296d8059b96bfa4704714051e341ee987",
@ -394845,7 +394984,7 @@
]
],
"line-spacing.html": [
"b3874ab42022984006696588bc7f81eb27e41bb4",
"9d3c6f23e7df297804470f048955e546feab67e7",
[
null,
{}
@ -400274,7 +400413,7 @@
]
],
"text-decoration-computed.html": [
"af577b17416596d630e982b47dfca42ad5669893",
"5371c42249c77c52da09e01ae75c1414da52db83",
[
null,
{}
@ -400309,7 +400448,7 @@
]
],
"text-decoration-shorthand.html": [
"904313f0528de50541d88b3db89902bdbf721cfe",
"40d881690076c171e0529536eb05ab76527b49d9",
[
null,
{}
@ -400358,7 +400497,7 @@
]
],
"text-decoration-valid.html": [
"fd12ab4dc31d5de8e1212f26fa18adb0d0e7166c",
"ad82dd203cdfafc5ee5960837a23bf14cd661cf3",
[
null,
{}
@ -454749,7 +454888,7 @@
]
],
"img-no-alt-replaced.html": [
"896c7363113ca8872208059bbac51f7616b05f3f",
"5f3503ae3b2ebefdd5d4a13a24cbc58a6f59ead4",
[
null,
{}
@ -454762,6 +454901,13 @@
{}
]
],
"img-title-only-w-sizing.html": [
"c290d9d6b127509277130de017f5ee73740f7c6e",
[
null,
{}
]
],
"video-aspect-ratio.html": [
"2b4937046d2f20e0dafddf07b1470adec5e7b050",
[
@ -471373,15 +471519,6 @@
]
]
},
"manifest": {
"link-rel-manifest.html": [
"8eb39703a082daedc921b156287b014eaf836665",
[
null,
{}
]
]
},
"mathml": {
"presentation-markup": {
"direction": {
@ -514832,6 +514969,13 @@
{}
]
],
"audioworkletprocessor-process-frozen-array.https.html": [
"33627204a6f538eba77bd8346952404814e4affa",
[
null,
{}
]
],
"audioworkletprocessor-promises.https.html": [
"8f83aac4baa1f40ff5a1cc3982855776d4a5b119",
[
@ -515237,7 +515381,7 @@
]
],
"no-dezippering.html": [
"7857cf16aa0574bf1974186d327fd7dd9fb99403",
"3f8360417dd9818ffa77b4da286b5d32694b27d2",
[
null,
{}
@ -551321,6 +551465,13 @@
]
},
"css-transforms": {
"backface-visibility-001.ref.html": [
"c4660f1cd0c0275604e61617a62e6263c30259d2",
[
null,
{}
]
],
"css-transform-inherit-rotate.html": [
"20267434f68d10cd14a9fb9590ab4f772578dfa3",
[

View file

@ -1,4 +0,0 @@
[hit-test-floats-002.html]
[Hit test float]
expected: FAIL

View file

@ -0,0 +1,4 @@
[hit-test-floats-004.html]
[Miss float below something else]
expected: FAIL

View file

@ -11,3 +11,18 @@
[e.style['text-decoration'\] = "overline dotted green" should not set unrelated longhands]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-style]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-line]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-color]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should not set unrelated longhands]
expected: FAIL
[e.style['text-decoration'\] = "overline from-font dotted green" should set text-decoration-thickness]
expected: FAIL

View file

@ -312,27 +312,21 @@
[fetch(): separate response Content-Type: text/plain ]
expected: NOTRUN
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
[<iframe>: separate response Content-Type: text/plain */*]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL

View file

@ -53,9 +53,6 @@
[combined text/javascript ]
expected: FAIL
[separate text/javascript x/x]
expected: FAIL
[separate text/javascript ]
[separate text/javascript error]
expected: FAIL

View file

@ -11,6 +11,9 @@
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
expected: FAIL
[X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff]
[X-Content-Type-Options%3A%20%22nosniFF%22]
expected: FAIL
[Content-Type-Options%3A%20nosniff]
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_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -0,0 +1,2 @@
[input-image-inline-alt.html]
expected: FAIL

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,4 @@
[077.html]
[ adding several types of scripts through the DOM and removing some of them confuses scheduler ]
expected: FAIL

View file

@ -0,0 +1,4 @@
[load-event-after-location-set-during-write.window.html]
[Setting location from document.write() call should not trigger load event until that load completes]
expected: FAIL

View file

@ -4,6 +4,3 @@
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: TIMEOUT
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: FAIL

View file

@ -0,0 +1,7 @@
[audioworkletprocessor-process-frozen-array.https.html]
[Executing "transfer-frozen-array"]
expected: FAIL
[Executing "check-frozen-array"]
expected: FAIL

View file

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

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

View file

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

View file

@ -1,5 +1,6 @@
[003.html]
type: testharness
expected: ERROR
[shared]
expected: FAIL

View file

@ -1,7 +1,8 @@
[shared-worker-in-data-url-context.window.html]
expected: TIMEOUT
[Create a shared worker in a data url frame]
expected: FAIL
expected: TIMEOUT
[Create a data url shared worker in a data url frame]
expected: FAIL
expected: NOTRUN

View file

@ -1,19 +1,4 @@
[promise.html]
[Resolve callback gets argument]
expected: FAIL
[Native promise from async callback can be resolved]
expected: FAIL
[Native reject callback gets argument]
expected: FAIL
[Native code rejects with exception]
expected: FAIL
[Reject callback gets argument]
expected: FAIL
[Native resolve callback gets argument]
expected: FAIL

View file

@ -1,3 +1,6 @@
[promise.html]
type: testharness
prefs: [dom.testbinding.enabled:true]
[Native promise from async callback can be resolved]
expected: FAIL

View file

@ -1,7 +1,6 @@
spec: https://w3c.github.io/manifest/
suggested_reviewers:
- anssiko
- kenchris
- marcoscaceres
- mgiuca
- mounirlamouri
- christianliebel

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<title>Test that name member is supported</title>
<link rel="help" href="https://w3c.github.io/manifest" />
<link rel="manifesto" href="../name-member/name-member-fail.webmanifest" />
<link
rel="hello manifest another-relationship"
href="../name-member/name-member.webmanifest"
/>
<link rel="manifest" href="../name-member/name-member-fail.webmanifest" />
<link rel="hello manifest" href="../name-member/name-member-fail.webmanifest" />
<p>
If when installing the name is "pass" then the test has passed.
</p>

View file

@ -0,0 +1,3 @@
{
"name": "fail"
}

View file

@ -0,0 +1 @@
Content-Type: application/manifest+json; charset=utf-8

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<title>Test that name member is supported</title>
<link rel="help" href="https://w3c.github.io/manifest" />
<link rel="manifest" href="name-member.webmanifest" />
<h1>Testing support for name member</h1>
<p>
To pass, the application name must be "pass".
</p>

View file

@ -0,0 +1,3 @@
{
"name": "pass"
}

View file

@ -0,0 +1 @@
Content-Type: application/manifest+json; charset=utf-8

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<title>Test that short_name member is supported</title>
<link rel="help" href="https://w3c.github.io/manifest" />
<link rel="manifest" href="short_name-member.webmanifest" />
<h1>Testing support for short_name member</h1>
<p>
To pass, the application name must be "pass".
</p>

View file

@ -0,0 +1,3 @@
{
"short_name": "pass"
}

View file

@ -0,0 +1 @@
Content-Type: application/manifest+json; charset=utf-8

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<title>Test that theme_color member is supported</title>
<link rel="help" href="https://w3c.github.io/manifest#theme_color-member" />
<link rel="manifest" href="theme_color-member-red.webmanifest" />
<h1>Testing support for theme_name member</h1>
<p>
To pass, the theme_color should be red.
</p>

View file

@ -0,0 +1,3 @@
{
"theme_color": "red"
}

View file

@ -0,0 +1 @@
Content-Type: application/manifest+json; charset=utf-8

View file

@ -5,9 +5,24 @@
body {
font: 16px/1 Ahem;
}
body > div {
border: 1px solid lime;
}
.over_emp {
-webkit-text-emphasis: 'x';
-webkit-text-emphasis-position: over left;
text-emphasis: 'x';
text-emphasis-position: over left;
}
.under_emp {
-webkit-text-emphasis: 'x';
-webkit-text-emphasis-position: under left;
text-emphasis: 'x';
text-emphasis-position: under left;
}
</style>
<body>
<script src="/resources/testharness.js"></script>
@ -61,6 +76,15 @@ test(() => {
assert_true(rt.bottom > ruby.bottom);
}, 'Under ruby + vertical-align doesn\'t overflow the block');
test(() => {
const {container, ruby, rt} = renderRuby(
'<div><ruby style="ruby-position:under">base<rt>annotation</rt></ruby>' +
'<div>n</div></div>');
const nextBlockBox = container.querySelector('div').getBoundingClientRect();
const rtBox = rt.getBoundingClientRect();
assert_greater_than_equal(nextBlockBox.top, rtBox.bottom);
}, 'Under ruby doesn\'t overwrap with the next block');
test(() => {
const {container, ruby, rt} = renderRuby(
'<div><span>before</span><br><ruby>base<rt style="font-size:16px"' +
@ -68,5 +92,62 @@ test(() => {
const firstLine = container.querySelector('span').getBoundingClientRect();
assert_true(ruby.getBoundingClientRect().top - firstLine.bottom > 1);
}, 'Expand inter-lines spacing');
test(() => {
const {container, ruby, rt} = renderRuby(
'<div style="line-height:1.5;">' +
'<span>First line</span><br>' +
'<span>Second line</span><br>' +
'<ruby>base<rt style="font-size:50%">' +
'annotation</rt></ruby></div>');
const firstLine = container.querySelector('span').getBoundingClientRect();
const secondLine = container.querySelectorAll('span')[1].getBoundingClientRect();
const rubyLine = ruby.getBoundingClientRect();
assert_approx_equals(secondLine.top - firstLine.top, rubyLine.top - secondLine.top, 1);
}, 'Consume half-leading of the previous line');
test(() => {
const {container, ruby, rt} = renderRuby(
'<div style="line-height:1.5;">' +
'<span>First line</span><br>' +
'<span class="under_emp">Second line</span><br>' +
'<ruby>base<rt style="font-size:50%">' +
'annotation</rt></ruby></div>');
const firstLine = container.querySelector('span').getBoundingClientRect();
const secondLine = container.querySelectorAll('span')[1].getBoundingClientRect();
const rubyLine = ruby.getBoundingClientRect();
const RUBY_EMPHASIS_SIZE = 8;
assert_greater_than_equal(rubyLine.top - secondLine.top,
secondLine.top - firstLine.top + RUBY_EMPHASIS_SIZE);
}, 'Don\'t Consume half-leading of the previous line with text-emphasis');
test(() => {
const {container, ruby, rt} = renderRuby(
'<div style="line-height:1.5;">' +
'<span>First line</span><br>' +
'<ruby style="ruby-position:under">base<rt style="font-size:50%">' +
'annotation</rt></ruby><br>' +
'<span>Third line</span></div>');
const firstLine = container.querySelector('span').getBoundingClientRect();
const rubyLine = ruby.getBoundingClientRect();
const thirdLine = container.querySelectorAll('span')[1].getBoundingClientRect();
assert_approx_equals(rubyLine.top - firstLine.top, thirdLine.top - rubyLine.top, 1);
}, 'Consume half-leading of the next line');
test(() => {
const {container, ruby, rt} = renderRuby(
'<div style="line-height:1.5;">' +
'<span>First line</span><br>' +
'<ruby style="ruby-position:under">base<rt style="font-size:50%">' +
'annotation</rt></ruby><br>' +
'<span class="over_emp">Third line</span>' +
'</div>');
const firstLine = container.querySelector('span').getBoundingClientRect();
const rubyLine = ruby.getBoundingClientRect();
const thirdLine = container.querySelectorAll('span')[1].getBoundingClientRect();
const RUBY_EMPHASIS_SIZE = 8;
assert_greater_than_equal(thirdLine.top - rubyLine.top,
rubyLine.top - firstLine.top + RUBY_EMPHASIS_SIZE);
}, 'Don\'t Consume half-leading of the next line with text-emphasis');
</script>
</body>

View file

@ -32,7 +32,7 @@ test_computed_value("text-decoration", "underline dashed rgb(0, 255, 0)");
// Add text-decoration-thickness in [css-text-decor-4].
test_computed_value("text-decoration", "auto", currentColor);
test_computed_value("text-decoration", "from-font", currentColor + " from-font");
test_computed_value("text-decoration", "10px", currentColor + " 10px");
test_computed_value("text-decoration", "underline red from-font", "underline rgb(255, 0, 0) from-font");
test_computed_value("text-decoration", "from-font", "from-font " + currentColor);
test_computed_value("text-decoration", "10px", "10px " + currentColor);
test_computed_value("text-decoration", "underline red from-font", "underline from-font rgb(255, 0, 0)");
</script>

View file

@ -11,8 +11,9 @@
</head>
<body>
<script>
test_shorthand_value('text-decoration', 'overline dotted green', {
test_shorthand_value('text-decoration', 'overline from-font dotted green', {
'text-decoration-line': 'overline',
'text-decoration-thickness': 'from-font',
'text-decoration-style': 'dotted',
'text-decoration-color': 'green'
});

View file

@ -2,7 +2,8 @@
<meta charset="utf-8">
<title>CSS Text Decoration Test: Parsing text-decoration with valid values</title>
<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#propdef-text-decoration">
<meta name="assert" content="text-decoration supports the full grammar '<text-decoration-line> || <text-decoration-style> || <text-decoration-color>'.">
<meta name="assert" content="text-decoration supports the full grammar '<text-decoration-line> ||
<'text-decoration-thickness'> || <text-decoration-style> || <text-decoration-color>'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
@ -18,7 +19,7 @@ test_valid_value("text-decoration", "10px");
test_valid_value("text-decoration", "double overline underline", "underline overline double");
test_valid_value("text-decoration", "underline overline line-through red");
test_valid_value("text-decoration", "rgba(10, 20, 30, 0.4) dotted", "dotted rgba(10, 20, 30, 0.4)");
test_valid_value("text-decoration", "overline green from-font");
test_valid_value("text-decoration", "overline green from-font", "overline from-font green");
test_valid_value("text-decoration", "underline dashed green");
test_valid_value("text-decoration", "underline auto", "underline");
test_valid_value("text-decoration", "line-through 20px");

View file

@ -0,0 +1,17 @@
<!DOCTYPE HTML>
<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@google.com">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#transform-property">
<link rel="help" href="http://www.w3.org/TR/css-transforms-2/#propdef-backface-visibility">
<link rel="match" href="backface-visibility-001.ref.html">
<meta name="assert" content="backface-visibility should have no effect when no transforms are present">
<style>
.box {
border: 1px solid black;
width: 200px;
height: 200px;
backface-visibility: hidden;
}
</style>
<div class="box">
This text should be visible
</div>

View file

@ -0,0 +1,15 @@
<!DOCTYPE HTML>
<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@google.com">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#transform-property">
<link rel="help" href="http://www.w3.org/TR/css-transforms-2/#propdef-backface-visibility">
<meta name="assert" content="backface-visibility should have no effect when no transforms are present">
<style>
.box {
border: 1px solid black;
width: 200px;
height: 200px;
}
</style>
<div class="box">
This text should be visible
</div>

View file

@ -175,7 +175,7 @@ see the [lint-tool documentation][lint-tool].
But in the unusual case of error reports for things essential to a certain
test or that for other exceptional reasons shouldn't prevent a merge of a
test, update and commit the `lint.ignorelist` file in the web-platform-tests
test, update and commit the `lint.ignore` file in the web-platform-tests
root directory to suppress the error reports. For details on doing that,
see the [lint-tool documentation][lint-tool].

View file

@ -11,14 +11,14 @@ web-platform-tests working directory like this:
The lint tool is also run automatically for every submitted pull request,
and reviewers will not merge branches with tests that have lint errors, so
you must either [fix all lint errors](#fixing-lint-errors), or you must
[add an exception](#updating-the-ignorelist) to suppress the errors.
[add an exception](#updating-the-ignored-files) to suppress the errors.
## Fixing lint errors
You must fix any errors the lint tool reports, unless an error is for something
essential to a certain test or that for some other exceptional reason shouldn't
prevent the test from being merged; in those cases you can [add an
exception](#updating-the-ignorelist) to suppress the errors. In all other
exception](#updating-the-ignored-files) to suppress the errors. In all other
cases, follow the instructions below to fix all errors reported.
<!--
@ -30,12 +30,12 @@ cases, follow the instructions below to fix all errors reported.
.. wpt-lint-rules:: tools.lint.rules
```
## Updating the ignorelist
## Updating the ignored files
Normally you must [fix all lint errors](#fixing-lint-errors). But in the
unusual case of error reports for things essential to certain tests or that
for other exceptional reasons shouldn't prevent a merge of a test, you can
update and commit the `lint.ignorelist` file in the web-platform-tests root
update and commit the `lint.ignore` file in the web-platform-tests root
directory to suppress errors the lint tool would report for a test file.
To add a test file or directory to the list, use the following format:
@ -45,7 +45,7 @@ ERROR TYPE:file/name/pattern
```
For example, to ignore all `TRAILING WHITESPACE` errors in the file
`example/file.html`, add the following line to the `lint.ignorelist` file:
`example/file.html`, add the following line to the `lint.ignore` file:
```
TRAILING WHITESPACE:example/file.html
@ -53,7 +53,7 @@ TRAILING WHITESPACE:example/file.html
To ignore errors for an entire directory rather than just one file, use the `*`
wildcard. For example, to ignore all `TRAILING WHITESPACE` errors in the
`example` directory, add the following line to the `lint.ignorelist` file:
`example` directory, add the following line to the `lint.ignore` file:
```
TRAILING WHITESPACE:example/*
@ -71,7 +71,7 @@ ERROR TYPE:file/name/pattern:line_number
```
For example, to ignore the `TRAILING WHITESPACE` error for just line 128 of the
file `example/file.html`, add the following to the `lint.ignorelist` file:
file `example/file.html`, add the following to the `lint.ignore` file:
```
TRAILING WHITESPACE:example/file.html:128

View file

@ -3,8 +3,11 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
<link rel="author" href="mailto:yuzhehan@chromium.org" title="Yu Han">
<link rel="author" href="https://mozilla.org" title="Mozilla">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1196668">
<link rel="help" href="https://crbug.com/753868">
<link ref="help" href="https://html.spec.whatwg.org/multipage/rendering.html#images-3">
<style>
img {
width: 100px;
@ -14,6 +17,8 @@
<img>
<img src="broken">
<img alt="">
<img alt>
<img src="broken" alt="">
<script>
const t = async_test("Images without alt attribute or with an empty alt attribute render as replaced elements regardless of src");
onload = t.step_func_done(function() {

View file

@ -0,0 +1,25 @@
<!doctype html>
<title>Images with only title should be treated as a replaced element</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="author" href="mailto:yuzhehan@chromium.org" title="Yu Han">
<link rel="help" href="https://crbug.com/958250">
<link ref="help" href="https://html.spec.whatwg.org/multipage/rendering.html#images-3">
<style>
.title-only {
width: 100px;
height: 150px;
}
</style>
<img class="title-only" title="title">
<img width="100" height="150px" title="title">
<script>
async_test(t => {
onload = t.step_func_done(function() {
for (const img of document.querySelectorAll("img")) {
assert_equals(img.offsetWidth, 100, `width: ${img.outerHTML}`);
assert_equals(img.offsetHeight, 150, `height: ${img.outerHTML}`);
}
});
});
</script>

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<title>Input image type fallback content should respect display property.</title>
<meta name="author" title="Yu Han" href="mailto:yuzhehan@chromium.org">
<style>
div {
border:1px dashed blue;
line-height: 1em;
height: 100px;
width: 150px;
}
input {
font: 1em monospace;
line-height: 1em;
}
</style>
<div>
<input alt="This is a long ALT text which takes up few lines to display. And additional text to be inlined." type="image">
</div>

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<title>Input image type fallback content should respect display property.</title>
<meta name="author" title="Yu Han" href="mailto:yuzhehan@chromium.org">
<link rel="match" href="input-image-inline-alt-ref.html">
<link ref="help" href="https://html.spec.whatwg.org/multipage/rendering.html#images-3:represents-5">
<style>
div {
border:1px dashed blue;
font: 1em monospace;
line-height: 1em;
height: 100px;
width: 150px;
}
input {
display: inline;
font: 1em monospace;
line-height: 1em;
}
</style>
<div>
<input alt="This is a long ALT text which takes up few lines to display." type="image">
And additional text to be inlined.
</div>

View file

@ -1,10 +1,10 @@
from time import sleep
def main(request, response):
if "delay" in request.GET:
delay = int(request.GET["delay"])
if b"delay" in request.GET:
delay = int(request.GET[b"delay"])
sleep(delay)
if "stylesNotMatchingEnvironment" in request.GET:
return 'h1 {color: brown;}'
if b"stylesNotMatchingEnvironment" in request.GET:
return u'h1 {color: brown;}'
else:
return 'h1 {color: purple;}'
return u'h1 {color: purple;}'

View file

@ -1,7 +1,7 @@
def main(request, response):
response.add_required_headers = False
if "content_type" in request.GET:
response.writer.write_header("Content-Type", request.GET.first("content_type"))
if "nosniff" in request.GET:
response.writer.write_header("x-content-type-options", "nosniff")
response.writer.write_content("body { background:red }")
if b"content_type" in request.GET:
response.writer.write_header(b"Content-Type", request.GET.first(b"content_type"))
if b"nosniff" in request.GET:
response.writer.write_header(b"x-content-type-options", b"nosniff")
response.writer.write_content(u"body { background:red }")

View file

@ -1,9 +1,9 @@
def main(request, response):
try:
count = int(request.server.stash.take(request.GET["id"]))
count = int(request.server.stash.take(request.GET[b"id"]))
except:
count = 0
if "count" in request.GET:
if b"count" in request.GET:
return str(count)
request.server.stash.put(request.GET["id"], str(count + 1))
return 'body { color: red }'
request.server.stash.put(request.GET[b"id"], str(count + 1))
return u'body { color: red }'

View file

@ -1,4 +1,4 @@
def main(request, response):
response.headers.set("Content-Type", "text/html")
response.headers.set("Refresh", request.GET.first("input"))
response.content = "<!doctype html>refresh.py\n"
response.headers.set(b"Content-Type", b"text/html")
response.headers.set(b"Refresh", request.GET.first(b"input"))
response.content = u"<!doctype html>refresh.py\n"

View file

@ -2,4 +2,4 @@ import time
def main(request, response):
time.sleep(0.1)
return [("Content-Type", "text/plain")], "FAIL"
return [(b"Content-Type", b"text/plain")], u"FAIL"

View file

@ -0,0 +1,6 @@
<iframe id=i></iframe>
<script>
var doc = i.contentDocument.cloneNode();
i.remove();
doc.appendChild(document.createElement("audio"));
</script>

View file

@ -4,7 +4,7 @@
def main(request, response):
if request.method == 'POST':
request.server.stash.put(request.GET["id"], request.body)
return ''
return request.server.stash.take(request.GET["id"])
if request.method == u'POST':
request.server.stash.put(request.GET[b"id"], request.body)
return u''
return request.server.stash.take(request.GET[b"id"])

View file

@ -1,28 +1,28 @@
import time
def main(request, response):
token = request.GET["token"]
token = request.GET[b"token"]
response.status = 200
response.headers.append("Content-Type", "text/html")
if "verify-token" in request.GET:
response.headers.append(b"Content-Type", b"text/html")
if b"verify-token" in request.GET:
if request.server.stash.take(token):
return 'TOKEN_SET'
return 'TOKEN_NOT_SET'
return u'TOKEN_SET'
return u'TOKEN_NOT_SET'
if "finish-delay" not in request.GET:
if b"finish-delay" not in request.GET:
# <a download>
request.server.stash.put(token, True)
return
# navigation to download
response.headers.append("Content-Disposition", "attachment")
response.headers.append(b"Content-Disposition", b"attachment")
response.write_status_headers()
finish_delay = float(request.GET["finish-delay"]) / 1E3
finish_delay = float(request.GET[b"finish-delay"]) / 1E3
count = 10
single_delay = finish_delay / count
for i in range(count): # pylint: disable=unused-variable
time.sleep(single_delay)
response.writer.write_content("\n")
response.writer.write_content(u"\n")
if not response.writer.flush():
return
request.server.stash.put(token, True)

View file

@ -1,12 +1,14 @@
import os
from wptserve.utils import isomorphic_decode
# Returns a valid image response when request's |referrer| matches
# |expected_referrer|.
def main(request, response):
referrer = request.headers.get("referer", "")
expected_referrer = request.GET.first("expected_referrer", "")
response_headers = [("Content-Type", "image/png")]
referrer = request.headers.get(b"referer", b"")
expected_referrer = request.GET.first(b"expected_referrer", b"")
response_headers = [(b"Content-Type", b"image/png")]
if referrer == expected_referrer:
image_path = os.path.join(os.path.dirname(__file__), "image.png")
image_path = os.path.join(os.path.dirname(isomorphic_decode(__file__)), u"image.png")
return (200, response_headers, open(image_path, mode='rb').read())
return (404, response_headers, "Not found")
return (404, response_headers, u"Not found")

View file

@ -1,5 +0,0 @@
spec: https://w3c.github.io/manifest/
suggested_reviewers:
- marcoscaceres
- mgiuca
- kenchris

View file

@ -0,0 +1,83 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>mrow painting order (reference)</title>
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
.container {
position: absolute;
left: 2em;
top: 10em;
}
math {
font: 50px/1 Ahem;
}
.hidden {
visibility: hidden;
}
</style>
</head>
<body>
<p>This test passes if there is no red and content is stacked such that</p>
<ul>
<li>foreground (dark colors) is above background (light colors)</li>
<li>yellow foreground is above green foreground which is itself above blue foreground</li>
<li>yellow background is above green background which is itself above blue background</li>
</ul>
<!-- Paint lightblue background -->
<div class="container">
<math>
<mrow>
<mrow style="background: lightblue"><mn class="hidden">XXÉ</mn></mrow>
</mrow>
</math>
</div>
<!-- Paint lightgreen background -->
<div class="container">
<math>
<mrow>
<mn class="hidden">XXÉX</mn>
<mrow style="background: lightgreen; margin-inline-start: -3em"><mn style="visibility: hidden">p&#xA0;XXÉ</mn></mrow>
</mrow>
</math>
</div>
<!-- Paint lightyellow background -->
<div class="container">
<math>
<mrow>
<mn class="hidden">XXÉX</mn>
<mn class="hidden" style="margin-inline-start: -3em">p&#xA0;XXÉX</mn>
<mrow style="background: lightyellow; margin-inline-start: -3em"><mn style="visibility: hidden">p&#xA0;X</mn></mrow>
</mrow>
</math>
</div>
<!-- Paint blue foreground -->
<div class="container">
<math>
<mrow>
<mn style="color: blue;">XXÉ</mn>
</mrow>
</math>
</div>
<!-- Paint green foreground -->
<div class="container">
<math>
<mrow>
<mn class="hidden">XXÉX</mn>
<mn style="color: green; margin-inline-start: -3em">p&#xA0;XXÉ</mn>
</mrow>
</math>
</div>
<!-- Paint yellow foreground -->
<div class="container">
<math>
<mrow>
<mn class="hidden">XXÉX</mn>
<mn class="hidden" style="margin-inline-start: -3em">p&#xA0;XXÉX</mn>
<mn style="color: yellow; margin-inline-start: -3em">p&#xA0;X</mn>
</mrow>
</math>
</div>
</body>
</html>

View file

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>mrow painting order</title>
<link rel="help" href="https://www.w3.org/TR/MathML3/chapter3.html#presm.mfenced">
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#stacking-contexts">
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#horizontally-group-sub-expressions-mrow">
<meta name="assert" content="Verify in which order the children paint">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<link rel="match" href="mrow-painting-order-ref.html">
<style>
.container {
position: absolute;
left: 2em;
top: 10em;
}
math {
font: 50px/1 Ahem;
}
</style>
</head>
<body>
<p>This test passes if there is no red and content is stacked such that</p>
<ul>
<li>foreground (dark colors) is above background (light colors)</li>
<li>yellow foreground is above green foreground which is itself above blue foreground</li>
<li>yellow background is above green background which is itself above blue background</li>
</ul>
<div class="container">
<math>
<mrow>
<mn style="color: blue; background: lightblue">XXÉ</mn>
<mn style="color: red">X</mn>
<mn style="color: green; background: lightgreen; margin-inline-start: -3em">p&#xA0;XXÉ</mn>
<mn style="color: red">X</mn>
<mn style="color: yellow; background: lightyellow; margin-inline-start: -3em">p&#xA0;X</mn>
</mrow>
</math>
</div>
</body>
</html>

View file

@ -1,4 +1,5 @@
import hashlib
import json
import os
from six.moves.urllib.parse import urlsplit
from abc import ABCMeta, abstractmethod
@ -26,6 +27,45 @@ def do_delayed_imports():
from manifest.download import download_from_github
class TestGroupsFile(object):
"""
Mapping object representing {group name: [test ids]}
"""
def __init__(self, logger, path):
try:
with open(path) as f:
self._data = json.load(f)
except ValueError:
logger.critical("test groups file %s not valid json" % path)
raise
self.group_by_test = {}
for group, test_ids in iteritems(self._data):
for test_id in test_ids:
self.group_by_test[test_id] = group
def __contains__(self, key):
return key in self._data
def __getitem__(self, key):
return self._data[key]
def update_include_for_groups(test_groups, include):
if include is None:
# We're just running everything
return
new_include = []
for item in include:
if item in test_groups:
new_include.extend(test_groups[item])
else:
new_include.append(item)
return new_include
class TestChunker(object):
def __init__(self, total_chunks, chunk_number, **kwargs):
self.total_chunks = total_chunks
@ -292,6 +332,23 @@ class TestLoader(object):
return groups
def get_test_src(**kwargs):
test_source_kwargs = {"processes": kwargs["processes"],
"logger": kwargs["logger"]}
chunker_kwargs = {}
if kwargs["run_by_dir"] is not False:
# A value of None indicates infinite depth
test_source_cls = PathGroupedSource
test_source_kwargs["depth"] = kwargs["run_by_dir"]
chunker_kwargs["depth"] = kwargs["run_by_dir"]
elif kwargs["test_groups"]:
test_source_cls = GroupFileTestSource
test_source_kwargs["test_groups"] = kwargs["test_groups"]
else:
test_source_cls = SingleTestSource
return test_source_cls, test_source_kwargs, chunker_kwargs
class TestSource(object):
__metaclass__ = ABCMeta
@ -397,3 +454,39 @@ class PathGroupedSource(GroupedSource):
@classmethod
def group_metadata(cls, state):
return {"scope": "/%s" % "/".join(state["prev_path"])}
class GroupFileTestSource(TestSource):
@classmethod
def make_queue(cls, tests, **kwargs):
tests_by_group = cls.tests_by_group(tests, **kwargs)
test_queue = Queue()
for group_name, tests in iteritems(tests_by_group):
group_metadata = {"scope": group_name}
group = deque()
for test in tests:
group.append(test)
test.update_metadata(group_metadata)
test_queue.put((group, group_metadata))
return test_queue
@classmethod
def tests_by_group(cls, tests, **kwargs):
logger = kwargs["logger"]
test_groups = kwargs["test_groups"]
tests_by_group = defaultdict(list)
for test in tests:
try:
group = test_groups.group_by_test[test.id]
except KeyError:
logger.error("%s is missing from test groups file" % test.id)
raise
tests_by_group[group].append(test)
return tests_by_group

View file

@ -700,8 +700,9 @@ class TestRunnerManager(threading.Thread):
test, test_group, group_metadata = self.get_next_test()
if test is None:
return RunnerManagerState.stop()
if test_group != self.state.test_group:
if test_group is not self.state.test_group:
# We are starting a new group of tests, so force a restart
self.logger.info("Restarting browser for new test group")
restart = True
else:
test_group = self.state.test_group

View file

@ -135,6 +135,8 @@ scheme host and port.""")
help="URL prefix to exclude")
test_selection_group.add_argument("--include-manifest", type=abs_path,
help="Path to manifest listing tests to include")
test_selection_group.add_argument("--test-groups", dest="test_groups_file", type=abs_path,
help="Path to json file containing a mapping {group_name: [test_ids]}")
test_selection_group.add_argument("--skip-timeout", action="store_true",
help="Skip tests that are expected to time out")
test_selection_group.add_argument("--skip-implementation-status",
@ -504,6 +506,14 @@ def check_args(kwargs):
else:
kwargs["chunk_type"] = "none"
if kwargs["test_groups_file"] is not None:
if kwargs["run_by_dir"] is not False:
print("Can't pass --test-groups and --run-by-dir")
sys.exit(1)
if not os.path.exists(kwargs["test_groups_file"]):
print("--test-groups file %s not found" % kwargs["test_groups_file"])
sys.exit(1)
if kwargs["processes"] is None:
kwargs["processes"] = 1

View file

@ -45,7 +45,8 @@ def setup_logging(*args, **kwargs):
return logger
def get_loader(test_paths, product, debug=None, run_info_extras=None, chunker_kwargs=None, **kwargs):
def get_loader(test_paths, product, debug=None, run_info_extras=None, chunker_kwargs=None,
test_groups=None, **kwargs):
if run_info_extras is None:
run_info_extras = {}
@ -62,8 +63,12 @@ def get_loader(test_paths, product, debug=None, run_info_extras=None, chunker_kw
manifest_filters = []
if kwargs["include"] or kwargs["exclude"] or kwargs["include_manifest"] or kwargs["default_exclude"]:
manifest_filters.append(testloader.TestFilter(include=kwargs["include"],
include = kwargs["include"]
if test_groups:
include = testloader.update_include_for_groups(test_groups, include)
if include or kwargs["exclude"] or kwargs["include_manifest"] or kwargs["default_exclude"]:
manifest_filters.append(testloader.TestFilter(include=include,
exclude=kwargs["exclude"],
manifest_path=kwargs["include_manifest"],
test_manifests=test_manifests,
@ -166,23 +171,21 @@ def run_tests(config, test_paths, product, **kwargs):
recording.set(["startup", "load_tests"])
test_source_kwargs = {"processes": kwargs["processes"]}
chunker_kwargs = {}
if kwargs["run_by_dir"] is False:
test_source_cls = testloader.SingleTestSource
else:
# A value of None indicates infinite depth
test_source_cls = testloader.PathGroupedSource
test_source_kwargs["depth"] = kwargs["run_by_dir"]
chunker_kwargs["depth"] = kwargs["run_by_dir"]
test_groups = (testloader.TestGroupsFile(logger, kwargs["test_groups_file"])
if kwargs["test_groups_file"] else None)
(test_source_cls,
test_source_kwargs,
chunker_kwargs) = testloader.get_test_src(logger=logger,
test_groups=test_groups,
**kwargs)
run_info, test_loader = get_loader(test_paths,
product.name,
run_info_extras=product.run_info_extras(**kwargs),
chunker_kwargs=chunker_kwargs,
test_groups=test_groups,
**kwargs)
logger.info("Using %i client processes" % kwargs["processes"])
skipped_tests = 0
@ -203,7 +206,9 @@ def run_tests(config, test_paths, product, **kwargs):
"host_cert_path": kwargs["host_cert_path"],
"ca_cert_path": kwargs["ca_cert_path"]}}
testharness_timeout_multipler = product.get_timeout_multiplier("testharness", run_info, **kwargs)
testharness_timeout_multipler = product.get_timeout_multiplier("testharness",
run_info,
**kwargs)
recording.set(["startup", "start_environment"])
with env.TestEnvironment(test_paths,
@ -241,7 +246,13 @@ def run_tests(config, test_paths, product, **kwargs):
for test_type in test_loader.test_types:
tests.extend(test_loader.tests[test_type])
logger.suite_start(test_source_cls.tests_by_group(tests, **test_source_kwargs),
try:
test_groups = test_source_cls.tests_by_group(tests, **test_source_kwargs)
except Exception:
logger.critical("Loading tests failed")
return False
logger.suite_start(test_groups,
name='web-platform-test',
run_info=run_info,
extra={"run_by_dir": kwargs["run_by_dir"]})

View file

@ -0,0 +1,53 @@
<!doctype html>
<html>
<head>
<title>
Test given arrays within AudioWorkletProcessor.process() method
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script>
const audit = Audit.createTaskRunner();
const filePath = 'processors/array-check-processor.js';
const context = new AudioContext();
// Test if the incoming arrays are frozen as expected.
audit.define('check-frozen-array', (task, should) => {
context.audioWorklet.addModule(filePath).then(() => {
const workletNode =
new AudioWorkletNode(context, 'array-frozen-processor');
workletNode.port.onmessage = (message) => {
const actual = message.data;
should(actual.isInputFrozen, '|inputs| is frozen').beTrue();
should(actual.isOutputFrozen, '|outputs| is frozen').beTrue();
task.done();
};
});
});
// The incoming arrays should not be transferred, but the associated
// ArrayBuffers can be transferred. See the `array-transfer-processor`
// definition for the details.
audit.define('transfer-frozen-array', (task, should) => {
const sourceNode = new ConstantSourceNode(context);
const workletNode =
new AudioWorkletNode(context, 'array-transfer-processor');
workletNode.port.onmessage = (message) => {
const actual = message.data;
if (actual.type === 'assertion')
should(actual.success, actual.message).beTrue();
if (actual.done)
task.done();
};
sourceNode.connect(workletNode);
sourceNode.start();
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,94 @@
/**
* @class ArrayFrozenProcessor
* @extends AudioWorkletProcessor
*/
class ArrayFrozenProcessor extends AudioWorkletProcessor {
constructor() {
super();
this._messageSent = false;
}
process(inputs, outputs, parameters) {
const input = inputs[0];
const output = outputs[0];
if (!this._messageSent) {
this.port.postMessage({
inputLength: input.length,
isInputFrozen: Object.isFrozen(inputs) && Object.isFrozen(input),
outputLength: output.length,
isOutputFrozen: Object.isFrozen(outputs) && Object.isFrozen(output)
});
this._messageSent = true;
}
return false;
}
}
/**
* @class ArrayTransferProcessor
* @extends AudioWorkletProcessor
*/
class ArrayTransferProcessor extends AudioWorkletProcessor {
constructor() {
super();
this._messageSent = false;
}
process(inputs, outputs, parameters) {
const input = inputs[0];
const output = outputs[0];
if (!this._messageSent) {
try {
// Transferring Array objects should NOT work.
this.port.postMessage({
inputs, input, inputChannel: input[0],
outputs, output, outputChannel: output[0]
}, [inputs, input, inputs[0], outputs, output, output[0]]);
// Hence, the following must NOT be reached.
this.port.postMessage({
type: 'assertion',
success: false,
message: 'Transferring inputs/outputs, an individual input/output ' +
'array, or a channel Float32Array MUST fail, but succeeded.'
});
} catch (error) {
this.port.postMessage({
type: 'assertion',
success: true,
message: 'Transferring inputs/outputs, an individual input/output ' +
'array, or a channel Float32Array is not allowed as expected.'
});
}
try {
// Transferring ArrayBuffers should work.
this.port.postMessage(
{inputChannel: input[0], outputChannel: output[0]},
[input[0].buffer, output[0].buffer]);
this.port.postMessage({
type: 'assertion',
success: true,
message: 'Transferring ArrayBuffers was successful as expected.'
});
} catch (error) {
// This must NOT be reached.
this.port.postMessage({
type: 'assertion',
success: false,
message: 'Transferring ArrayBuffers unexpectedly failed.'
});
}
this.port.postMessage({done: true});
this._messageSent = true;
}
return false;
}
}
registerProcessor('array-frozen-processor', ArrayFrozenProcessor);
registerProcessor('array-transfer-processor', ArrayTransferProcessor);

View file

@ -93,7 +93,8 @@
audit.define(
{label: 'test1', description: 'Test value setter and setValueAtTime'},
(task, should) => {
testWithAutomation(should, {prefix: ''}).then(() => task.done());
testWithAutomation(should, {prefix: '', threshold: 5.9605e-8})
.then(() => task.done());
});
audit.define(
@ -168,7 +169,8 @@
let expected = renderedBuffer.getChannelData(1);
let match = should(actual, prefix + '.value setter output')
.beEqualToArray(expected);
.beCloseToArray(
expected, {absoluteThreshold: options.threshold});
should(
match,
prefix + '.value setter output matches setValueAtTime output')
@ -177,7 +179,6 @@
}
audit.run();
</script>
</body>
</html>