mirror of
https://github.com/servo/servo.git
synced 2025-07-24 07:40:27 +01:00
Auto merge of #27317 - servo-wpt-sync:wpt_update_18-07-2020, r=servo-wpt-sync
Sync WPT with upstream (18-07-2020) Automated downstream sync of changes from upstream as of 18-07-2020. [no-wpt-sync] r? @servo-wpt-sync
This commit is contained in:
commit
ccff00742f
67 changed files with 656 additions and 278 deletions
|
@ -4,7 +4,7 @@
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Opening a blob URL in a new window immediately before revoking it works.]
|
[Opening a blob URL in a new window immediately before revoking it works.]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Fetching a blob URL immediately before revoking it works in an iframe.]
|
[Fetching a blob URL immediately before revoking it works in an iframe.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-005.html]
|
|
||||||
[Miss clipped float]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -2,6 +2,3 @@
|
||||||
[listeners are called when <iframe> is resized]
|
[listeners are called when <iframe> is resized]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[listeners are called correct number of times]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[elementFromPoint-001.html]
|
||||||
|
[CSSOM View - 5 - extensions to the Document interface]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -17,3 +17,6 @@
|
||||||
[test the top of layer]
|
[test the top of layer]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[test some point of the element: top left corner]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -312,24 +312,21 @@
|
||||||
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: */* text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html */*]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -53,3 +53,6 @@
|
||||||
[combined text/javascript ]
|
[combined text/javascript ]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[separate text/javascript x/x]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
[javascript-url-return-value-handling-dynamic.html]
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 7]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 6]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 5]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 4]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 9]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 8]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_5.html]
|
|
||||||
[Multiple history traversals, last would be aborted]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -14,6 +14,3 @@
|
||||||
[Host element with delegatesFocus should support autofocus]
|
[Host element with delegatesFocus should support autofocus]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Non-HTMLElement should not support autofocus]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-2.html]
|
[iframe_sandbox_popups_escaping-2.html]
|
||||||
expected: CRASH
|
expected: TIMEOUT
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_nonescaping-2.html]
|
[iframe_sandbox_popups_nonescaping-2.html]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[module-static-import-delayed.html]
|
||||||
|
[document.write in an imported module]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[realtimeanalyser-fft-scaling.html]
|
[realtimeanalyser-fft-scaling.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
[017.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[origin of the script that invoked the method, about:blank]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
[018.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[origin of the script that invoked the method, javascript:]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[Worker-constructor.html]
|
|
||||||
expected: ERROR
|
|
|
@ -7,7 +7,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Opening a blob URL in a new window immediately before revoking it works.]
|
[Opening a blob URL in a new window immediately before revoking it works.]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
|
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
|
@ -161005,6 +161005,71 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"position-relative-001.html": [
|
||||||
|
"7ec9e4f767b4548e52e92b358b59e51376dea389",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"position-relative-002.html": [
|
||||||
|
"7e176be987e7d6cb52bfa79ef58ec1ee93634375",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"position-relative-003.html": [
|
||||||
|
"7a0040c40b534da6367fcc0d0a94ac3f7650bc50",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"position-relative-004.html": [
|
||||||
|
"aac4520f728bb833b2ecaaf5c1a03e904e333040",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"position-relative-005.html": [
|
||||||
|
"f1ad0846741704285603dff9d719790676f9e9fe",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"position-relative-table-tbody-left-absolute-child.html": [
|
"position-relative-table-tbody-left-absolute-child.html": [
|
||||||
"98e759a8c0a83817b3d691503e807ed5ed549936",
|
"98e759a8c0a83817b3d691503e807ed5ed549936",
|
||||||
[
|
[
|
||||||
|
@ -324728,7 +324793,7 @@
|
||||||
],
|
],
|
||||||
"resources": {
|
"resources": {
|
||||||
"cache.py": [
|
"cache.py": [
|
||||||
"10122f6439615c840e33d52314bdc14bfb443420",
|
"ca0bd644b4f798c4fa64d1041b628a3740bc0bac",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"hello.txt": [
|
"hello.txt": [
|
||||||
|
@ -324743,7 +324808,7 @@
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
"authentication.py": [
|
"authentication.py": [
|
||||||
"b65047d765703b8e4400396a306b026316fc6d09",
|
"8b6b00b0873b38e57e579f3d7f2651fb97917b81",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"bad-chunk-encoding.py": [
|
"bad-chunk-encoding.py": [
|
||||||
|
@ -324755,11 +324820,11 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"cache.py": [
|
"cache.py": [
|
||||||
"899638716a100a66c06cebbf92c31de7c705498b",
|
"4de751e30bfc6a5f6a8b02cd3ed47aa666d193e6",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"clean-stash.py": [
|
"clean-stash.py": [
|
||||||
"3ae731052692e048a07d65a6e015fe5a76362098",
|
"ee8c69ac446ea979f63c0f82afd3061610b4b523",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"cors-top.txt": [
|
"cors-top.txt": [
|
||||||
|
@ -324787,7 +324852,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"inspect-headers.py": [
|
"inspect-headers.py": [
|
||||||
"10a12eb883a17c701d909cde650799f21ec898c1",
|
"9ed566e607b0e07d70ac6a183c0a9a025bcade5f",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"keepalive-iframe.html": [
|
"keepalive-iframe.html": [
|
||||||
|
@ -324795,11 +324860,11 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"method.py": [
|
"method.py": [
|
||||||
"795ad1ff11d085d82cb010b969753b94cbe06b53",
|
"c1a111b4cdf98dc6d8db702b0cc20d43825779bd",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"preflight.py": [
|
"preflight.py": [
|
||||||
"a2552c2565ad9be6d17dea1cb6a90ff9eb211190",
|
"f983ef952272a75a6706d3cdfabb08aced7efc7b",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"redirect-empty-location.py": [
|
"redirect-empty-location.py": [
|
||||||
|
@ -324839,7 +324904,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"trickle.py": [
|
"trickle.py": [
|
||||||
"9b3aa37b25c9c99fe1fc6a988cd79ea6c793c287",
|
"5091a2b3fddce7e9a44cf6ef94e922f79d913693",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"utils.js": [
|
"utils.js": [
|
||||||
|
@ -324873,7 +324938,7 @@
|
||||||
"content-encoding": {
|
"content-encoding": {
|
||||||
"resources": {
|
"resources": {
|
||||||
"bad-gzip-body.py": [
|
"bad-gzip-body.py": [
|
||||||
"b2f8cfefd7e491260648e33adfe9fbd3f8f72fe6",
|
"a79b94ed041d0e0852e71bdd5cdba57897a1f198",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -325274,7 +325339,7 @@
|
||||||
},
|
},
|
||||||
"redirect-navigate": {
|
"redirect-navigate": {
|
||||||
"302-found-post-handler.py": [
|
"302-found-post-handler.py": [
|
||||||
"23bf4b2c522b7c00ab6bd0fc3eb99f0737d512ec",
|
"40a224f6565bae3e2c4b32f77e2bf4fd5d5451ee",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"resources": {
|
"resources": {
|
||||||
|
@ -329293,7 +329358,7 @@
|
||||||
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
|
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"reporting-popup-unafe-none-report-to.https.html.sub.headers": [
|
"reporting-popup-unsafe-none-report-to.https.html.sub.headers": [
|
||||||
"a0d12c549fac7d4e7b06d2741085b4ef712bae13",
|
"a0d12c549fac7d4e7b06d2741085b4ef712bae13",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
|
@ -334614,7 +334679,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pitch-detector.js": [
|
"pitch-detector.js": [
|
||||||
"595bde3120c7307244c1f4b70eeca3adceac1dd7",
|
"78f22ccd85760255056f1114cfb9ba1c25fcc60e",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"track": {
|
"track": {
|
||||||
|
@ -338829,7 +338894,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"appmanifest.idl": [
|
"appmanifest.idl": [
|
||||||
"0d24849b9f7657aed65b8d1dd147cf7001e26599",
|
"926a4fc2022e71c28aa4a2ae3d1adc12104ee1ab",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"audio-output.idl": [
|
"audio-output.idl": [
|
||||||
|
@ -339305,7 +339370,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"service-workers.idl": [
|
"service-workers.idl": [
|
||||||
"c01fcab7f2d92491899907bc3c0505e8a4d4ba63",
|
"3d5e63a81204baa3099a2415be3a73d369aa31e3",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"shape-detection-api.idl": [
|
"shape-detection-api.idl": [
|
||||||
|
@ -339337,7 +339402,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"trusted-types.tentative.idl": [
|
"trusted-types.tentative.idl": [
|
||||||
"f2318d685676291a5ec85a1a0c3c408fa1a7f079",
|
"4e469c19b823bf3d452f480e086474e49741964a",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"ua-client-hints.idl": [
|
"ua-client-hints.idl": [
|
||||||
|
@ -344725,7 +344790,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"idlharness.js": [
|
"idlharness.js": [
|
||||||
"25c193b55e5b76fff6dc180268357a11a27abc08",
|
"9a23e3a1da203309150e80ac820aa3df294ae3c3",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"idlharness.js.headers": [
|
"idlharness.js.headers": [
|
||||||
|
@ -359563,7 +359628,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"RTCPeerConnection-helper.js": [
|
"RTCPeerConnection-helper.js": [
|
||||||
"07626bd0ccc39e93034beaf1f745bbc49a9438c1",
|
"cf31d2f0008c95ac1566f3c7e21fbeda0992d7e3",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"RTCRtpCapabilities-helper.js": [
|
"RTCRtpCapabilities-helper.js": [
|
||||||
|
@ -390574,6 +390639,13 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"contain-flexbox-outline.html": [
|
||||||
|
"39cf81688e0a294d542cf18a72ec1e808d7bc546",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"contain-size-grid-003.html": [
|
"contain-size-grid-003.html": [
|
||||||
"44b736b1d6b62ec5c4fc0e6fb3314095df6a27f4",
|
"44b736b1d6b62ec5c4fc0e6fb3314095df6a27f4",
|
||||||
[
|
[
|
||||||
|
@ -408443,7 +408515,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"appearance-cssom-001.html": [
|
"appearance-cssom-001.html": [
|
||||||
"49769b359a53cf54bf232e42d567f88513abf853",
|
"2f0644093ea7b7d99581f2fae13d2203b961adf0",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{}
|
{}
|
||||||
|
@ -436498,6 +436570,13 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"javascript-url-return-value-handling-dynamic.html": [
|
||||||
|
"0441d174cee07f278ef6df8d616c4d9ec212a857",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"javascript-url-return-value-handling.html": [
|
"javascript-url-return-value-handling.html": [
|
||||||
"621a8cbaecc787f4549cb54a7ac223cf79eb0b74",
|
"621a8cbaecc787f4549cb54a7ac223cf79eb0b74",
|
||||||
[
|
[
|
||||||
|
@ -456645,7 +456724,7 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"reporting-popup-unafe-none-report-to.https.html": [
|
"reporting-popup-unsafe-none-report-to.https.html": [
|
||||||
"7ad6ec9ce7ab26b5f1bcca6ee6bbe6d6ad3a20f0",
|
"7ad6ec9ce7ab26b5f1bcca6ee6bbe6d6ad3a20f0",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
|
@ -461252,7 +461331,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"preserves-pitch.html": [
|
"preserves-pitch.html": [
|
||||||
"9a86cbc210b296a131d60f26cb7288b870cf096b",
|
"1cf6c7639036edbc53c70ee71dc99edc6e224d58",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
|
@ -478255,7 +478334,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"MediaStreamTrack-getCapabilities.html": [
|
"MediaStreamTrack-getCapabilities.html": [
|
||||||
"c569283c34ef09541977938825abd1f01f6b386b",
|
"4e0c933bc1ceae2e98ec702c4044cdde056790e4",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
|
@ -478278,7 +478357,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"MediaStreamTrack-getSettings.html": [
|
"MediaStreamTrack-getSettings.html": [
|
||||||
"8fc2c82319517e4b9f60daa2866584505040ad2f",
|
"747eff8937d923b25c72e2ecd3c18967905f71a1",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
|
@ -511887,6 +511966,13 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"TrustedTypePolicyFactory-blocking.html": [
|
||||||
|
"6ae71b69880a0313a549b586a04fa38b4be466e2",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"TrustedTypePolicyFactory-constants.tentative.html": [
|
"TrustedTypePolicyFactory-constants.tentative.html": [
|
||||||
"551084ca4b6e001ce49213a3d12491a4aedaf8f4",
|
"551084ca4b6e001ce49213a3d12491a4aedaf8f4",
|
||||||
[
|
[
|
||||||
|
@ -523521,7 +523607,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"RTCPeerConnection-setRemoteDescription-offer.html": [
|
"RTCPeerConnection-setRemoteDescription-offer.html": [
|
||||||
"b4702446613255daec7db5325f64089a917fdee9",
|
"a50e969637294aec8eeafe682da5d258e2a90de5",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{}
|
{}
|
||||||
|
@ -523905,7 +523991,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"candidate-exchange.https.html": [
|
"candidate-exchange.https.html": [
|
||||||
"532bc4d0d13d72170f9e521cbeda7d2e656e317f",
|
"82178953b6bbe3faccfd949817cf59e8d1dfa1ab",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-005.html]
|
|
||||||
[Miss clipped float]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -2,6 +2,3 @@
|
||||||
[listeners are called when <iframe> is resized]
|
[listeners are called when <iframe> is resized]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[listeners are called correct number of times]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[elementFromPoint-001.html]
|
||||||
|
[CSSOM View - 5 - extensions to the Document interface]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -21,3 +21,6 @@
|
||||||
[test the top of layer]
|
[test the top of layer]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[test some point of the element: top left corner]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -312,24 +312,21 @@
|
||||||
[fetch(): separate response Content-Type: text/plain ]
|
[fetch(): separate response Content-Type: text/plain ]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: */* text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html */*]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -53,3 +53,6 @@
|
||||||
[combined text/javascript ]
|
[combined text/javascript ]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[separate text/javascript x/x]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
[javascript-url-return-value-handling-dynamic.html]
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 7]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 6]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 5]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 4]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 9]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Test javascript URL string return values in direct and indirect (target) frame contexts. 8]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_5.html]
|
|
||||||
[Multiple history traversals, last would be aborted]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -14,6 +14,3 @@
|
||||||
[Host element with delegatesFocus should support autofocus]
|
[Host element with delegatesFocus should support autofocus]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Non-HTMLElement should not support autofocus]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-2.html]
|
[iframe_sandbox_popups_escaping-2.html]
|
||||||
expected: CRASH
|
expected: TIMEOUT
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[iframe_sandbox_popups_nonescaping-2.html]
|
[iframe_sandbox_popups_nonescaping-2.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[module-static-import-delayed.html]
|
||||||
|
[document.write in an imported module]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[realtimeanalyser-fft-scaling.html]
|
[realtimeanalyser-fft-scaling.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
5
tests/wpt/metadata/webmessaging/with-ports/017.html.ini
Normal file
5
tests/wpt/metadata/webmessaging/with-ports/017.html.ini
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[017.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[origin of the script that invoked the method, about:blank]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
[018.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[origin of the script that invoked the method, javascript:]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[Worker-constructor.html]
|
|
||||||
expected: ERROR
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
<!doctype html>
|
||||||
|
<title>Test `contain: strict` to Flexbox does not crash</title>
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-contain-1/#contain-property">
|
||||||
|
<link rel="author" href="mailto:kojii@chromium.org">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
contain: strict;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
outline: 1px auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<div id="target"></div>
|
||||||
|
<div id="log"></div>
|
||||||
|
<script>
|
||||||
|
test(() => {
|
||||||
|
document.body.offsetTop;
|
||||||
|
target.style.width = '100px';
|
||||||
|
document.body.offsetTop;
|
||||||
|
}, "Pass if no crash");
|
||||||
|
</script>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="help" href="https://crbug.com/1058690">
|
||||||
|
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||||
|
<meta name="assert" content="A percent inset resolves against the available size.">
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div style="width: 100px; height: 100px; background: red;">
|
||||||
|
<span style="position: relative; top: 100%; left: 100%;">
|
||||||
|
<div style="width: 100px; height: 100px; background: green; position: relative; top: -100px; left: -100px;"></div>
|
||||||
|
</span>
|
||||||
|
</div>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="help" href="https://crbug.com/1058690">
|
||||||
|
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||||
|
<meta name="assert" content="A percent inset resolves against the available size.">
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div style="width: 100px; height: 100px; background: red;">
|
||||||
|
<span style="position: relative; top: 100px; left: 100px;">
|
||||||
|
<div style="width: 100px; height: 100px; background: green; position: relative; top: -100%; left: -100%;"></div>
|
||||||
|
</span>
|
||||||
|
</div>
|
|
@ -0,0 +1,12 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="help" href="https://crbug.com/1058690">
|
||||||
|
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||||
|
<meta name="assert" content="A percent inset resolves against the available size.">
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div style="width: 100px; height: 100px; background: red;">
|
||||||
|
<span style="position: relative; top: 100%; left: 100%;">
|
||||||
|
<span style="position: relative; top: -100px; left: -100px;">
|
||||||
|
<div style="width: 100px; height: 100px; background: green; position: fixed;"></div>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="help" href="https://crbug.com/1058690">
|
||||||
|
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||||
|
<meta name="assert" content="A percent inset resolves against the available size when it dynamically changes.">
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div id="target" style="contain: paint; width: 100px; background: red; line-height: 0;">
|
||||||
|
<span style="position: relative; top: -100%;">
|
||||||
|
<span style="position: relative; top: 100px;">
|
||||||
|
<div style="position: fixed; width: 100px; height: 100px; background: green;"></div>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
document.body.offsetTop;
|
||||||
|
document.getElementById('target').style.height = '100px';
|
||||||
|
</script>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="help" href="https://crbug.com/1058690">
|
||||||
|
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||||
|
<meta name="assert" content="A percent inset resolves against the available size when it dynamically changes.">
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div id="target" style="width: 100px; background: red; line-height: 0;">
|
||||||
|
<span style="position: relative; top: -100%;">
|
||||||
|
<span style="position: relative; top: 100px;">
|
||||||
|
<div style="position: absolute; width: 100px; height: 100px; background: green;"></div>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
document.body.offsetTop;
|
||||||
|
document.getElementById('target').style.height = '100px';
|
||||||
|
</script>
|
|
@ -24,6 +24,7 @@
|
||||||
"textarea",
|
"textarea",
|
||||||
"textfield",
|
"textfield",
|
||||||
];
|
];
|
||||||
|
const initial_appearance = getComputedStyle(button).appearance;
|
||||||
function assert_style_for_prop(style, prop, value) {
|
function assert_style_for_prop(style, prop, value) {
|
||||||
if (prop === '-webkit-appearance') {
|
if (prop === '-webkit-appearance') {
|
||||||
assert_equals(style.WebkitAppearance, value, 'style.WebkitAppearance (uppercase W)');
|
assert_equals(style.WebkitAppearance, value, 'style.WebkitAppearance (uppercase W)');
|
||||||
|
@ -198,7 +199,7 @@
|
||||||
button.style.setProperty(prop, invalidValue);
|
button.style.setProperty(prop, invalidValue);
|
||||||
assert_style_for_prop(button.style, prop, "");
|
assert_style_for_prop(button.style, prop, "");
|
||||||
const style = getComputedStyle(button);
|
const style = getComputedStyle(button);
|
||||||
assert_style_for_prop(style, prop, "button");
|
assert_style_for_prop(style, prop, initial_appearance);
|
||||||
}, `${prop}: ${invalidValue} (invalid)`);
|
}, `${prop}: ${invalidValue} (invalid)`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,26 @@
|
||||||
|
from wptserve.utils import isomorphic_decode
|
||||||
|
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
token = request.GET.first("token", None)
|
token = request.GET.first(b"token", None)
|
||||||
if "querystate" in request.GET:
|
if b"querystate" in request.GET:
|
||||||
from json import JSONEncoder
|
from json import JSONEncoder
|
||||||
response.headers.set("Content-Type", "text/plain")
|
response.headers.set(b"Content-Type", b"text/plain")
|
||||||
return JSONEncoder().encode(request.server.stash.take(token))
|
return JSONEncoder().encode(request.server.stash.take(token))
|
||||||
content = request.GET.first("content", None)
|
content = request.GET.first(b"content", None)
|
||||||
tag = request.GET.first("tag", None)
|
tag = request.GET.first(b"tag", None)
|
||||||
date = request.GET.first("date", None)
|
date = request.GET.first(b"date", None)
|
||||||
expires = request.GET.first("expires", None)
|
expires = request.GET.first(b"expires", None)
|
||||||
vary = request.GET.first("vary", None)
|
vary = request.GET.first(b"vary", None)
|
||||||
cc = request.GET.first("cache_control", None)
|
cc = request.GET.first(b"cache_control", None)
|
||||||
redirect = request.GET.first("redirect", None)
|
redirect = request.GET.first(b"redirect", None)
|
||||||
inm = request.headers.get("If-None-Match", None)
|
inm = request.headers.get(b"If-None-Match", None)
|
||||||
ims = request.headers.get("If-Modified-Since", None)
|
ims = request.headers.get(b"If-Modified-Since", None)
|
||||||
pragma = request.headers.get("Pragma", None)
|
pragma = request.headers.get(b"Pragma", None)
|
||||||
cache_control = request.headers.get("Cache-Control", None)
|
cache_control = request.headers.get(b"Cache-Control", None)
|
||||||
ignore = "ignore" in request.GET
|
ignore = b"ignore" in request.GET
|
||||||
|
|
||||||
if tag:
|
if tag:
|
||||||
tag = '"%s"' % tag
|
tag = b'"%s"' % tag
|
||||||
|
|
||||||
server_state = request.server.stash.take(token)
|
server_state = request.server.stash.take(token)
|
||||||
if not server_state:
|
if not server_state:
|
||||||
|
@ -26,40 +28,40 @@ def main(request, response):
|
||||||
state = dict()
|
state = dict()
|
||||||
if not ignore:
|
if not ignore:
|
||||||
if inm:
|
if inm:
|
||||||
state["If-None-Match"] = inm
|
state[u"If-None-Match"] = isomorphic_decode(inm)
|
||||||
if ims:
|
if ims:
|
||||||
state["If-Modified-Since"] = ims
|
state[u"If-Modified-Since"] = isomorphic_decode(ims)
|
||||||
if pragma:
|
if pragma:
|
||||||
state["Pragma"] = pragma
|
state[u"Pragma"] = isomorphic_decode(pragma)
|
||||||
if cache_control:
|
if cache_control:
|
||||||
state["Cache-Control"] = cache_control
|
state[u"Cache-Control"] = isomorphic_decode(cache_control)
|
||||||
server_state.append(state)
|
server_state.append(state)
|
||||||
request.server.stash.put(token, server_state)
|
request.server.stash.put(token, server_state)
|
||||||
|
|
||||||
if tag:
|
if tag:
|
||||||
response.headers.set("ETag", '%s' % tag)
|
response.headers.set(b"ETag", b'%s' % tag)
|
||||||
elif date:
|
elif date:
|
||||||
response.headers.set("Last-Modified", date)
|
response.headers.set(b"Last-Modified", date)
|
||||||
if expires:
|
if expires:
|
||||||
response.headers.set("Expires", expires)
|
response.headers.set(b"Expires", expires)
|
||||||
if vary:
|
if vary:
|
||||||
response.headers.set("Vary", vary)
|
response.headers.set(b"Vary", vary)
|
||||||
if cc:
|
if cc:
|
||||||
response.headers.set("Cache-Control", cc)
|
response.headers.set(b"Cache-Control", cc)
|
||||||
|
|
||||||
# The only-if-cached redirect tests wants CORS to be okay, the other tests
|
# The only-if-cached redirect tests wants CORS to be okay, the other tests
|
||||||
# are all same-origin anyways and don't care.
|
# are all same-origin anyways and don't care.
|
||||||
response.headers.set("Access-Control-Allow-Origin", "*")
|
response.headers.set(b"Access-Control-Allow-Origin", b"*")
|
||||||
|
|
||||||
if redirect:
|
if redirect:
|
||||||
response.headers.set("Location", redirect)
|
response.headers.set(b"Location", redirect)
|
||||||
response.status = (302, "Redirect")
|
response.status = (302, b"Redirect")
|
||||||
return ""
|
return b""
|
||||||
elif ((inm is not None and inm == tag) or
|
elif ((inm is not None and inm == tag) or
|
||||||
(ims is not None and ims == date)):
|
(ims is not None and ims == date)):
|
||||||
response.status = (304, "Not Modified")
|
response.status = (304, b"Not Modified")
|
||||||
return ""
|
return b""
|
||||||
else:
|
else:
|
||||||
response.status = (200, "OK")
|
response.status = (200, b"OK")
|
||||||
response.headers.set("Content-Type", "text/plain")
|
response.headers.set(b"Content-Type", b"text/plain")
|
||||||
return content
|
return content
|
||||||
|
|
|
@ -2,13 +2,13 @@ def main(request, response):
|
||||||
user = request.auth.username
|
user = request.auth.username
|
||||||
password = request.auth.password
|
password = request.auth.password
|
||||||
|
|
||||||
if user == "user" and password == "password":
|
if user == b"user" and password == b"password":
|
||||||
return "Authentication done"
|
return b"Authentication done"
|
||||||
|
|
||||||
realm = "test"
|
realm = b"test"
|
||||||
if "realm" in request.GET:
|
if b"realm" in request.GET:
|
||||||
realm = request.GET.first("realm")
|
realm = request.GET.first(b"realm")
|
||||||
|
|
||||||
return ((401, "Unauthorized"),
|
return ((401, b"Unauthorized"),
|
||||||
[("WWW-Authenticate", 'Basic realm="' + realm + '"')],
|
[(b"WWW-Authenticate", b'Basic realm="' + realm + b'"')],
|
||||||
"Please login with credentials 'user' and 'password'")
|
b"Please login with credentials 'user' and 'password'")
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
ETAG = '"123abc"'
|
ETAG = b'"123abc"'
|
||||||
CONTENT_TYPE = "text/plain"
|
CONTENT_TYPE = b"text/plain"
|
||||||
CONTENT = "lorem ipsum dolor sit amet"
|
CONTENT = b"lorem ipsum dolor sit amet"
|
||||||
|
|
||||||
|
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
# let caching kick in if possible (conditional GET)
|
# let caching kick in if possible (conditional GET)
|
||||||
etag = request.headers.get("If-None-Match", None)
|
etag = request.headers.get(b"If-None-Match", None)
|
||||||
if etag == ETAG:
|
if etag == ETAG:
|
||||||
response.headers.set("X-HTTP-STATUS", 304)
|
response.headers.set(b"X-HTTP-STATUS", 304)
|
||||||
response.status = (304, "Not Modified")
|
response.status = (304, b"Not Modified")
|
||||||
return ""
|
return b""
|
||||||
|
|
||||||
# cache miss, so respond with the actual content
|
# cache miss, so respond with the actual content
|
||||||
response.status = (200, "OK")
|
response.status = (200, b"OK")
|
||||||
response.headers.set("ETag", ETAG)
|
response.headers.set(b"ETag", ETAG)
|
||||||
response.headers.set("Content-Type", CONTENT_TYPE)
|
response.headers.set(b"Content-Type", CONTENT_TYPE)
|
||||||
return CONTENT
|
return CONTENT
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
token = request.GET.first("token")
|
token = request.GET.first(b"token")
|
||||||
if request.server.stash.take(token) is not None:
|
if request.server.stash.take(token) is not None:
|
||||||
return "1"
|
return b"1"
|
||||||
else:
|
else:
|
||||||
return "0"
|
return b"0"
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
headers = []
|
headers = []
|
||||||
if "headers" in request.GET:
|
if b"headers" in request.GET:
|
||||||
checked_headers = request.GET.first("headers").split("|")
|
checked_headers = request.GET.first(b"headers").split(b"|")
|
||||||
for header in checked_headers:
|
for header in checked_headers:
|
||||||
if header in request.headers:
|
if header in request.headers:
|
||||||
headers.append(("x-request-" + header, request.headers.get(header, "")))
|
headers.append((b"x-request-" + header, request.headers.get(header, b"")))
|
||||||
|
|
||||||
if "cors" in request.GET:
|
if b"cors" in request.GET:
|
||||||
if "Origin" in request.headers:
|
if b"Origin" in request.headers:
|
||||||
headers.append(("Access-Control-Allow-Origin", request.headers.get("Origin", "")))
|
headers.append((b"Access-Control-Allow-Origin", request.headers.get(b"Origin", b"")))
|
||||||
else:
|
else:
|
||||||
headers.append(("Access-Control-Allow-Origin", "*"))
|
headers.append((b"Access-Control-Allow-Origin", b"*"))
|
||||||
headers.append(("Access-Control-Allow-Credentials", "true"))
|
headers.append((b"Access-Control-Allow-Credentials", b"true"))
|
||||||
headers.append(("Access-Control-Allow-Methods", "GET, POST, HEAD"))
|
headers.append((b"Access-Control-Allow-Methods", b"GET, POST, HEAD"))
|
||||||
exposed_headers = ["x-request-" + header for header in checked_headers]
|
exposed_headers = [b"x-request-" + header for header in checked_headers]
|
||||||
headers.append(("Access-Control-Expose-Headers", ", ".join(exposed_headers)))
|
headers.append((b"Access-Control-Expose-Headers", b", ".join(exposed_headers)))
|
||||||
if "allow_headers" in request.GET:
|
if b"allow_headers" in request.GET:
|
||||||
headers.append(("Access-Control-Allow-Headers", request.GET['allow_headers']))
|
headers.append((b"Access-Control-Allow-Headers", request.GET[b'allow_headers']))
|
||||||
else:
|
else:
|
||||||
headers.append(("Access-Control-Allow-Headers", ", ".join(request.headers)))
|
headers.append((b"Access-Control-Allow-Headers", b", ".join(request.headers)))
|
||||||
|
|
||||||
headers.append(("content-type", "text/plain"))
|
headers.append((b"content-type", b"text/plain"))
|
||||||
return headers, ""
|
return headers, b""
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
|
from wptserve.utils import isomorphic_encode
|
||||||
|
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
headers = []
|
headers = []
|
||||||
if "cors" in request.GET:
|
if b"cors" in request.GET:
|
||||||
headers.append(("Access-Control-Allow-Origin", "*"))
|
headers.append((b"Access-Control-Allow-Origin", b"*"))
|
||||||
headers.append(("Access-Control-Allow-Credentials", "true"))
|
headers.append((b"Access-Control-Allow-Credentials", b"true"))
|
||||||
headers.append(("Access-Control-Allow-Methods", "GET, POST, PUT, FOO"))
|
headers.append((b"Access-Control-Allow-Methods", b"GET, POST, PUT, FOO"))
|
||||||
headers.append(("Access-Control-Allow-Headers", "x-test, x-foo"))
|
headers.append((b"Access-Control-Allow-Headers", b"x-test, x-foo"))
|
||||||
headers.append(("Access-Control-Expose-Headers", "x-request-method"))
|
headers.append((b"Access-Control-Expose-Headers", b"x-request-method"))
|
||||||
|
|
||||||
headers.append(("x-request-method", request.method))
|
headers.append((b"x-request-method", isomorphic_encode(request.method)))
|
||||||
headers.append(("x-request-content-type", request.headers.get("Content-Type", "NO")))
|
headers.append((b"x-request-content-type", request.headers.get(b"Content-Type", b"NO")))
|
||||||
headers.append(("x-request-content-length", request.headers.get("Content-Length", "NO")))
|
headers.append((b"x-request-content-length", request.headers.get(b"Content-Length", b"NO")))
|
||||||
headers.append(("x-request-content-encoding", request.headers.get("Content-Encoding", "NO")))
|
headers.append((b"x-request-content-encoding", request.headers.get(b"Content-Encoding", b"NO")))
|
||||||
headers.append(("x-request-content-language", request.headers.get("Content-Language", "NO")))
|
headers.append((b"x-request-content-language", request.headers.get(b"Content-Language", b"NO")))
|
||||||
headers.append(("x-request-content-location", request.headers.get("Content-Location", "NO")))
|
headers.append((b"x-request-content-location", request.headers.get(b"Content-Location", b"NO")))
|
||||||
return headers, request.body
|
return headers, request.body
|
||||||
|
|
|
@ -1,58 +1,58 @@
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
headers = [("Content-Type", "text/plain")]
|
headers = [(b"Content-Type", b"text/plain")]
|
||||||
stashed_data = {'control_request_headers': "", 'preflight': "0", 'preflight_referrer': ""}
|
stashed_data = {b'control_request_headers': b"", b'preflight': b"0", b'preflight_referrer': b""}
|
||||||
|
|
||||||
token = None
|
token = None
|
||||||
if "token" in request.GET:
|
if b"token" in request.GET:
|
||||||
token = request.GET.first("token")
|
token = request.GET.first(b"token")
|
||||||
|
|
||||||
if "origin" in request.GET:
|
if b"origin" in request.GET:
|
||||||
for origin in request.GET['origin'].split(", "):
|
for origin in request.GET[b'origin'].split(b", "):
|
||||||
headers.append(("Access-Control-Allow-Origin", origin))
|
headers.append((b"Access-Control-Allow-Origin", origin))
|
||||||
else:
|
else:
|
||||||
headers.append(("Access-Control-Allow-Origin", "*"))
|
headers.append((b"Access-Control-Allow-Origin", b"*"))
|
||||||
|
|
||||||
if "clear-stash" in request.GET:
|
if b"clear-stash" in request.GET:
|
||||||
if request.server.stash.take(token) is not None:
|
if request.server.stash.take(token) is not None:
|
||||||
return headers, "1"
|
return headers, b"1"
|
||||||
else:
|
else:
|
||||||
return headers, "0"
|
return headers, b"0"
|
||||||
|
|
||||||
if "credentials" in request.GET:
|
if b"credentials" in request.GET:
|
||||||
headers.append(("Access-Control-Allow-Credentials", "true"))
|
headers.append((b"Access-Control-Allow-Credentials", b"true"))
|
||||||
|
|
||||||
if request.method == "OPTIONS":
|
if request.method == u"OPTIONS":
|
||||||
if not "Access-Control-Request-Method" in request.headers:
|
if not b"Access-Control-Request-Method" in request.headers:
|
||||||
response.set_error(400, "No Access-Control-Request-Method header")
|
response.set_error(400, u"No Access-Control-Request-Method header")
|
||||||
return "ERROR: No access-control-request-method in preflight!"
|
return b"ERROR: No access-control-request-method in preflight!"
|
||||||
|
|
||||||
if request.headers.get("Accept", "") != "*/*":
|
if request.headers.get(b"Accept", b"") != b"*/*":
|
||||||
response.set_error(400, "Request does not have 'Accept: */*' header")
|
response.set_error(400, u"Request does not have 'Accept: */*' header")
|
||||||
return "ERROR: Invalid access in preflight!"
|
return b"ERROR: Invalid access in preflight!"
|
||||||
|
|
||||||
if "control_request_headers" in request.GET:
|
if b"control_request_headers" in request.GET:
|
||||||
stashed_data['control_request_headers'] = request.headers.get("Access-Control-Request-Headers", None)
|
stashed_data[b'control_request_headers'] = request.headers.get(b"Access-Control-Request-Headers", None)
|
||||||
|
|
||||||
if "max_age" in request.GET:
|
if b"max_age" in request.GET:
|
||||||
headers.append(("Access-Control-Max-Age", request.GET['max_age']))
|
headers.append((b"Access-Control-Max-Age", request.GET[b'max_age']))
|
||||||
|
|
||||||
if "allow_headers" in request.GET:
|
if b"allow_headers" in request.GET:
|
||||||
headers.append(("Access-Control-Allow-Headers", request.GET['allow_headers']))
|
headers.append((b"Access-Control-Allow-Headers", request.GET[b'allow_headers']))
|
||||||
|
|
||||||
if "allow_methods" in request.GET:
|
if b"allow_methods" in request.GET:
|
||||||
headers.append(("Access-Control-Allow-Methods", request.GET['allow_methods']))
|
headers.append((b"Access-Control-Allow-Methods", request.GET[b'allow_methods']))
|
||||||
|
|
||||||
preflight_status = 200
|
preflight_status = 200
|
||||||
if "preflight_status" in request.GET:
|
if b"preflight_status" in request.GET:
|
||||||
preflight_status = int(request.GET.first("preflight_status"))
|
preflight_status = int(request.GET.first(b"preflight_status"))
|
||||||
|
|
||||||
stashed_data['preflight'] = "1"
|
stashed_data[b'preflight'] = b"1"
|
||||||
stashed_data['preflight_referrer'] = request.headers.get("Referer", "")
|
stashed_data[b'preflight_referrer'] = request.headers.get(b"Referer", b"")
|
||||||
stashed_data['preflight_user_agent'] = request.headers.get("User-Agent", "")
|
stashed_data[b'preflight_user_agent'] = request.headers.get(b"User-Agent", b"")
|
||||||
if token:
|
if token:
|
||||||
request.server.stash.put(token, stashed_data)
|
request.server.stash.put(token, stashed_data)
|
||||||
|
|
||||||
return preflight_status, headers, ""
|
return preflight_status, headers, b""
|
||||||
|
|
||||||
|
|
||||||
if token:
|
if token:
|
||||||
|
@ -60,19 +60,19 @@ def main(request, response):
|
||||||
if data:
|
if data:
|
||||||
stashed_data = data
|
stashed_data = data
|
||||||
|
|
||||||
if "checkUserAgentHeaderInPreflight" in request.GET and request.headers.get("User-Agent") != stashed_data['preflight_user_agent']:
|
if b"checkUserAgentHeaderInPreflight" in request.GET and request.headers.get(b"User-Agent") != stashed_data[b'preflight_user_agent']:
|
||||||
return 400, headers, "ERROR: No user-agent header in preflight"
|
return 400, headers, b"ERROR: No user-agent header in preflight"
|
||||||
|
|
||||||
#use x-* headers for returning value to bodyless responses
|
#use x-* headers for returning value to bodyless responses
|
||||||
headers.append(("Access-Control-Expose-Headers", "x-did-preflight, x-control-request-headers, x-referrer, x-preflight-referrer, x-origin"))
|
headers.append((b"Access-Control-Expose-Headers", b"x-did-preflight, x-control-request-headers, x-referrer, x-preflight-referrer, x-origin"))
|
||||||
headers.append(("x-did-preflight", stashed_data['preflight']))
|
headers.append((b"x-did-preflight", stashed_data[b'preflight']))
|
||||||
if stashed_data['control_request_headers'] != None:
|
if stashed_data[b'control_request_headers'] != None:
|
||||||
headers.append(("x-control-request-headers", stashed_data['control_request_headers']))
|
headers.append((b"x-control-request-headers", stashed_data[b'control_request_headers']))
|
||||||
headers.append(("x-preflight-referrer", stashed_data['preflight_referrer']))
|
headers.append((b"x-preflight-referrer", stashed_data[b'preflight_referrer']))
|
||||||
headers.append(("x-referrer", request.headers.get("Referer", "")))
|
headers.append((b"x-referrer", request.headers.get(b"Referer", b"")))
|
||||||
headers.append(("x-origin", request.headers.get("Origin", "")))
|
headers.append((b"x-origin", request.headers.get(b"Origin", b"")))
|
||||||
|
|
||||||
if token:
|
if token:
|
||||||
request.server.stash.put(token, stashed_data)
|
request.server.stash.put(token, stashed_data)
|
||||||
|
|
||||||
return headers, ""
|
return headers, b""
|
||||||
|
|
|
@ -12,5 +12,5 @@ def main(request, response):
|
||||||
response.write_status_headers()
|
response.write_status_headers()
|
||||||
time.sleep(delay)
|
time.sleep(delay)
|
||||||
for i in xrange(count):
|
for i in xrange(count):
|
||||||
response.writer.write_content(u"TEST_TRICKLE\n")
|
response.writer.write_content(b"TEST_TRICKLE\n")
|
||||||
time.sleep(delay)
|
time.sleep(delay)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
headers = [("Content-Encoding", "gzip")]
|
headers = [(b"Content-Encoding", b"gzip")]
|
||||||
return headers, "not actually gzip"
|
return headers, b"not actually gzip"
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
|
from wptserve.utils import isomorphic_encode
|
||||||
|
|
||||||
def main(request, response):
|
def main(request, response):
|
||||||
if request.method == "POST":
|
if request.method == u"POST":
|
||||||
response.add_required_headers = False
|
response.add_required_headers = False
|
||||||
response.writer.write_status(302)
|
response.writer.write_status(302)
|
||||||
response.writer.write_header("Location", request.url)
|
response.writer.write_header(b"Location", isomorphic_encode(request.url))
|
||||||
response.writer.end_headers()
|
response.writer.end_headers()
|
||||||
response.writer.write("")
|
response.writer.write(b"")
|
||||||
elif request.method == "GET":
|
elif request.method == u"GET":
|
||||||
return ([("Content-Type", "text/plain")],
|
return ([(b"Content-Type", b"text/plain")],
|
||||||
"OK")
|
b"OK")
|
||||||
else:
|
else:
|
||||||
return ([("Content-Type", "text/plain")],
|
return ([(b"Content-Type", b"text/plain")],
|
||||||
"FAIL")
|
b"FAIL")
|
|
@ -0,0 +1,51 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset=UTF-8>
|
||||||
|
<title>Test javascript URL string return values in direct and indirect (target) frame contexts.</title>
|
||||||
|
<script src=/resources/testharness.js></script>
|
||||||
|
<script src=/resources/testharnessreport.js></script>
|
||||||
|
<div id=log></div>
|
||||||
|
<script>
|
||||||
|
const testInputs = [
|
||||||
|
[0x41],
|
||||||
|
[0x80,0xFF],
|
||||||
|
[0x80,0xFF,0x100],
|
||||||
|
[0xD83D,0xDE0D],
|
||||||
|
[0xDE0D,0x41]
|
||||||
|
];
|
||||||
|
testInputs.forEach(input => {
|
||||||
|
const javascriptURL = "javascript:[" + input + "].map(b => String.fromCharCode(b)).join('')",
|
||||||
|
output = input.map(b => String.fromCharCode(b)).join("");
|
||||||
|
async_test(t => {
|
||||||
|
const frame = document.createElement("iframe");
|
||||||
|
t.add_cleanup(() => frame.remove());
|
||||||
|
frame.src = javascriptURL;
|
||||||
|
t.step_timeout(() => {
|
||||||
|
assert_equals(frame.contentDocument.body.textContent, output);
|
||||||
|
assert_equals(frame.contentDocument.charset, document.charset);
|
||||||
|
t.done();
|
||||||
|
}, 200);
|
||||||
|
document.body.appendChild(frame);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
testInputs.forEach(input => {
|
||||||
|
const javascriptURL = "javascript:[" + input + "].map(b => String.fromCharCode(b)).join('')",
|
||||||
|
output = input.map(b => String.fromCharCode(b)).join("");
|
||||||
|
async_test(t => {
|
||||||
|
const frame = document.createElement("iframe"),
|
||||||
|
href = document.createElement("a");
|
||||||
|
t.add_cleanup(() => { frame.remove(); href.remove(); });
|
||||||
|
frame.name = "hi" + input;
|
||||||
|
href.target = "hi" + input;
|
||||||
|
href.href = javascriptURL;
|
||||||
|
t.step_timeout(() => {
|
||||||
|
assert_equals(frame.contentDocument.body.textContent, output);
|
||||||
|
assert_equals(frame.contentDocument.charset, document.charset);
|
||||||
|
t.done();
|
||||||
|
}, 200)
|
||||||
|
document.body.appendChild(frame);
|
||||||
|
document.body.appendChild(href);
|
||||||
|
href.click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -4,11 +4,14 @@ window.AudioContext = window.AudioContext || window.webkitAudioContext;
|
||||||
|
|
||||||
var FFT_SIZE = 2048;
|
var FFT_SIZE = 2048;
|
||||||
|
|
||||||
function getPitchDetector(media, t) {
|
var audioContext;
|
||||||
var audioContext = new AudioContext();
|
var sourceNode;
|
||||||
t.add_cleanup(() => audioContext.close());
|
|
||||||
|
|
||||||
var sourceNode = audioContext.createMediaElementSource(media);
|
function getPitchDetector(media) {
|
||||||
|
if(!audioContext) {
|
||||||
|
audioContext = new AudioContext();
|
||||||
|
sourceNode = audioContext.createMediaElementSource(media);
|
||||||
|
}
|
||||||
|
|
||||||
var analyser = audioContext.createAnalyser();
|
var analyser = audioContext.createAnalyser();
|
||||||
analyser.fftSize = FFT_SIZE;
|
analyser.fftSize = FFT_SIZE;
|
||||||
|
@ -16,13 +19,20 @@ function getPitchDetector(media, t) {
|
||||||
sourceNode.connect(analyser);
|
sourceNode.connect(analyser);
|
||||||
analyser.connect(audioContext.destination);
|
analyser.connect(audioContext.destination);
|
||||||
|
|
||||||
return () => getPitch(analyser);
|
return {
|
||||||
|
ensureStart() { return audioContext.resume(); },
|
||||||
|
detect() { return getPitch(analyser); },
|
||||||
|
cleanup() {
|
||||||
|
sourceNode.disconnect();
|
||||||
|
analyser.disconnect();
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPitch(analyser) {
|
function getPitch(analyser) {
|
||||||
// Returns the frequency value for the nth FFT bin.
|
// Returns the frequency value for the nth FFT bin.
|
||||||
var binConverter = (bin) =>
|
var binConverter = (bin) =>
|
||||||
(analyser.context.sampleRate/2)*((bin)/(analyser.frequencyBinCount-1));
|
(audioContext.sampleRate/2)*((bin)/(analyser.frequencyBinCount-1));
|
||||||
|
|
||||||
var buf = new Uint8Array(analyser.frequencyBinCount);
|
var buf = new Uint8Array(analyser.frequencyBinCount);
|
||||||
analyser.getByteFrequencyData(buf);
|
analyser.getByteFrequencyData(buf);
|
||||||
|
|
|
@ -15,8 +15,8 @@ function getPreservesPitch(audio) {
|
||||||
if ("mozPreservesPitch" in HTMLAudioElement.prototype) {
|
if ("mozPreservesPitch" in HTMLAudioElement.prototype) {
|
||||||
return audio.mozPreservesPitch;
|
return audio.mozPreservesPitch;
|
||||||
}
|
}
|
||||||
if ("wekbitPreservesPitch" in HTMLAudioElement.prototype) {
|
if ("webkitPreservesPitch" in HTMLAudioElement.prototype) {
|
||||||
return audio.wekbitPreservesPitch;
|
return audio.webkitPreservesPitch;
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,8 @@ function setPreservesPitch(audio, value) {
|
||||||
audio.preservesPitch = value;
|
audio.preservesPitch = value;
|
||||||
} else if ("mozPreservesPitch" in HTMLAudioElement.prototype) {
|
} else if ("mozPreservesPitch" in HTMLAudioElement.prototype) {
|
||||||
audio.mozPreservesPitch = value;
|
audio.mozPreservesPitch = value;
|
||||||
} else if ("wekbitPreservesPitch" in HTMLAudioElement.prototype) {
|
} else if ("webkitPreservesPitch" in HTMLAudioElement.prototype) {
|
||||||
audio.wekbitPreservesPitch = value;
|
audio.webkitPreservesPitch = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,21 +37,28 @@ test(function(t) {
|
||||||
}, "Test that preservesPitch is present and unprefixed.");
|
}, "Test that preservesPitch is present and unprefixed.");
|
||||||
|
|
||||||
test(function(t) {
|
test(function(t) {
|
||||||
let audio = document.createElement('audio');
|
let defaultAudio = document.createElement('audio');
|
||||||
assert_true(getPreservesPitch(audio));
|
assert_true(getPreservesPitch(defaultAudio));
|
||||||
|
|
||||||
setPreservesPitch(audio, false);
|
setPreservesPitch(defaultAudio, false);
|
||||||
assert_false(getPreservesPitch(audio));
|
assert_false(getPreservesPitch(defaultAudio));
|
||||||
}, "Test that presevesPitch is on by default");
|
}, "Test that preservesPitch is on by default");
|
||||||
|
|
||||||
|
|
||||||
|
var audio;
|
||||||
|
|
||||||
|
function addTestCleanups(t, detector) {
|
||||||
|
t.add_cleanup(() => {
|
||||||
|
audio.pause();
|
||||||
|
audio.currentTime = 0;
|
||||||
|
});
|
||||||
|
t.add_cleanup(() => detector.cleanup());
|
||||||
|
}
|
||||||
|
|
||||||
function testPreservesPitch(preservesPitch, playbackRate, expectedPitch, description) {
|
function testPreservesPitch(preservesPitch, playbackRate, expectedPitch, description) {
|
||||||
promise_test(async t => {
|
promise_test(async t => {
|
||||||
let audio = document.createElement('audio');
|
let detector = getPitchDetector(audio);
|
||||||
|
addTestCleanups(t, detector);
|
||||||
var detector = getPitchDetector(audio, t);
|
|
||||||
|
|
||||||
// This file contains 5 seconds of a 440hz sine wave.
|
|
||||||
audio.src = "/media/sine440.mp3";
|
|
||||||
|
|
||||||
audio.playbackRate = playbackRate;
|
audio.playbackRate = playbackRate;
|
||||||
setPreservesPitch(audio, preservesPitch);
|
setPreservesPitch(audio, preservesPitch);
|
||||||
|
@ -66,13 +73,12 @@ function testPreservesPitch(preservesPitch, playbackRate, expectedPitch, descrip
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
await test_driver.bless("Play audio element", () => audio.play() )
|
// Wait until we have played some audio. Otherwise, the detector
|
||||||
|
// might return a pitch of 0Hz.
|
||||||
|
audio.play();
|
||||||
|
await waitUntil(0.25);
|
||||||
|
|
||||||
// Wait until we have at least played some audio. Otherwise, the
|
var pitch = detector.detect();
|
||||||
// detector might return a pitch of 0Hz.
|
|
||||||
await waitUntil(0.5);
|
|
||||||
|
|
||||||
var pitch = detector();
|
|
||||||
|
|
||||||
// 25Hz is larger than the margin we get from 48kHz and 44.1kHz
|
// 25Hz is larger than the margin we get from 48kHz and 44.1kHz
|
||||||
// audio being analyzed by a FFT of size 2048. If we get something
|
// audio being analyzed by a FFT of size 2048. If we get something
|
||||||
|
@ -89,6 +95,24 @@ function testPreservesPitch(preservesPitch, playbackRate, expectedPitch, descrip
|
||||||
|
|
||||||
var REFERENCE_PITCH = 440;
|
var REFERENCE_PITCH = 440;
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
// Create the audio element only once, in order to lower the chances of
|
||||||
|
// tests timing out.
|
||||||
|
audio = document.createElement('audio');
|
||||||
|
|
||||||
|
// This file contains 5 seconds of a 440hz sine wave.
|
||||||
|
audio.src = "/media/sine440.mp3";
|
||||||
|
|
||||||
|
let detector = getPitchDetector(audio);
|
||||||
|
addTestCleanups(t, detector);
|
||||||
|
|
||||||
|
// The first time we run the test, we need to interact with the
|
||||||
|
// AudioContext and Audio element via user gestures.
|
||||||
|
await test_driver.bless("Play audio element", () => {
|
||||||
|
return Promise.all([audio.play(), detector.ensureStart()]);
|
||||||
|
});
|
||||||
|
}, "Setup Audio element and AudioContext")
|
||||||
|
|
||||||
testPreservesPitch(true, 1.0, REFERENCE_PITCH,
|
testPreservesPitch(true, 1.0, REFERENCE_PITCH,
|
||||||
"The default playbackRate should not affect pitch")
|
"The default playbackRate should not affect pitch")
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,11 @@ dictionary WebAppManifest {
|
||||||
DOMString lang;
|
DOMString lang;
|
||||||
USVString name;
|
USVString name;
|
||||||
USVString short_name;
|
USVString short_name;
|
||||||
|
USVString description;
|
||||||
sequence<ManifestImageResource> icons;
|
sequence<ManifestImageResource> icons;
|
||||||
|
sequence<ManifestImageResource> screenshots;
|
||||||
|
sequence<USVString> categories;
|
||||||
|
DOMString iarc_rating_id;
|
||||||
USVString start_url;
|
USVString start_url;
|
||||||
DisplayModeType display = "browser";
|
DisplayModeType display = "browser";
|
||||||
OrientationLockType orientation;
|
OrientationLockType orientation;
|
||||||
|
|
|
@ -173,6 +173,7 @@ interface FetchEvent : ExtendableEvent {
|
||||||
readonly attribute DOMString clientId;
|
readonly attribute DOMString clientId;
|
||||||
readonly attribute DOMString resultingClientId;
|
readonly attribute DOMString resultingClientId;
|
||||||
readonly attribute DOMString replacesClientId;
|
readonly attribute DOMString replacesClientId;
|
||||||
|
readonly attribute Promise<void> handled;
|
||||||
|
|
||||||
void respondWith(Promise<Response> r);
|
void respondWith(Promise<Response> r);
|
||||||
};
|
};
|
||||||
|
@ -183,6 +184,7 @@ dictionary FetchEventInit : ExtendableEventInit {
|
||||||
DOMString clientId = "";
|
DOMString clientId = "";
|
||||||
DOMString resultingClientId = "";
|
DOMString resultingClientId = "";
|
||||||
DOMString replacesClientId = "";
|
DOMString replacesClientId = "";
|
||||||
|
Promise<void> handled;
|
||||||
};
|
};
|
||||||
|
|
||||||
[Exposed=ServiceWorker]
|
[Exposed=ServiceWorker]
|
||||||
|
|
|
@ -28,7 +28,7 @@ typedef [StringContext=TrustedScriptURL] USVString ScriptURLString;
|
||||||
[
|
[
|
||||||
Exposed=(Window, Worker),
|
Exposed=(Window, Worker),
|
||||||
SecureContext
|
SecureContext
|
||||||
] interface TrustedTypePolicyFactory {
|
] interface TrustedTypePolicyFactory : EventTarget {
|
||||||
TrustedTypePolicy createPolicy(DOMString policyName, optional TrustedTypePolicyOptions policyOptions = {});
|
TrustedTypePolicy createPolicy(DOMString policyName, optional TrustedTypePolicyOptions policyOptions = {});
|
||||||
// All the policy object names that have been created
|
// All the policy object names that have been created
|
||||||
};
|
};
|
||||||
|
|
|
@ -159,14 +159,16 @@ function makeImageCaptureTest(hasPanTiltZoomPermissionGranted) {
|
||||||
assert_equals(capabilities.tilt.max, mockCapabilities.tilt.max);
|
assert_equals(capabilities.tilt.max, mockCapabilities.tilt.max);
|
||||||
assert_equals(capabilities.tilt.min, mockCapabilities.tilt.min);
|
assert_equals(capabilities.tilt.min, mockCapabilities.tilt.min);
|
||||||
assert_equals(capabilities.tilt.step, mockCapabilities.tilt.step);
|
assert_equals(capabilities.tilt.step, mockCapabilities.tilt.step);
|
||||||
|
|
||||||
|
assert_true(capabilities.zoom instanceof MediaSettingsRange);
|
||||||
|
assert_equals(capabilities.zoom.max, mockCapabilities.zoom.max);
|
||||||
|
assert_equals(capabilities.zoom.min, mockCapabilities.zoom.min);
|
||||||
|
assert_equals(capabilities.zoom.step, mockCapabilities.zoom.step);
|
||||||
} else if (ptzPermission === 'denied') {
|
} else if (ptzPermission === 'denied') {
|
||||||
assert_false('pan' in capabilities);
|
assert_false('pan' in capabilities);
|
||||||
assert_false('tilt' in capabilities);
|
assert_false('tilt' in capabilities);
|
||||||
|
assert_false('zoom' in capabilities);
|
||||||
}
|
}
|
||||||
assert_true(capabilities.zoom instanceof MediaSettingsRange);
|
|
||||||
assert_equals(capabilities.zoom.max, mockCapabilities.zoom.max);
|
|
||||||
assert_equals(capabilities.zoom.min, mockCapabilities.zoom.min);
|
|
||||||
assert_equals(capabilities.zoom.step, mockCapabilities.zoom.step);
|
|
||||||
|
|
||||||
assert_equals(capabilities.torch, mockCapabilities.supportsTorch,
|
assert_equals(capabilities.torch, mockCapabilities.supportsTorch,
|
||||||
'torch');
|
'torch');
|
||||||
|
|
|
@ -73,11 +73,12 @@ function makeImageCaptureTest(hasPanTiltZoomPermissionGranted) {
|
||||||
if (ptzPermission === 'granted') {
|
if (ptzPermission === 'granted') {
|
||||||
assert_equals(settings.pan, mockSettings.pan.current);
|
assert_equals(settings.pan, mockSettings.pan.current);
|
||||||
assert_equals(settings.tilt, mockSettings.tilt.current);
|
assert_equals(settings.tilt, mockSettings.tilt.current);
|
||||||
|
assert_equals(settings.zoom, mockSettings.zoom.current);
|
||||||
} else if (ptzPermission === 'denied') {
|
} else if (ptzPermission === 'denied') {
|
||||||
assert_false('pan' in settings);
|
assert_false('pan' in settings);
|
||||||
assert_false('tilt' in settings);
|
assert_false('tilt' in settings);
|
||||||
|
assert_false('zoom' in settings);
|
||||||
}
|
}
|
||||||
assert_equals(settings.zoom, mockSettings.zoom.current);
|
|
||||||
|
|
||||||
assert_equals(settings.torch, mockSettings.torch, 'torch');
|
assert_equals(settings.torch, mockSettings.torch, 'torch');
|
||||||
});
|
});
|
||||||
|
|
|
@ -2534,6 +2534,10 @@ IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject
|
||||||
memberHolderObject[member.name].length,
|
memberHolderObject[member.name].length,
|
||||||
minOverloadLength(ctors),
|
minOverloadLength(ctors),
|
||||||
"property has wrong .length");
|
"property has wrong .length");
|
||||||
|
assert_equals(
|
||||||
|
memberHolderObject[member.name].name,
|
||||||
|
member.name,
|
||||||
|
"property has wrong .name");
|
||||||
|
|
||||||
// Make some suitable arguments
|
// Make some suitable arguments
|
||||||
var args = member.arguments.map(function(arg) {
|
var args = member.arguments.map(function(arg) {
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="support/helper.sub.js"></script>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="trusted-types *">
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
test(t => {
|
||||||
|
event_listener = (e) => {
|
||||||
|
assert_equals(e.policyName, "default");
|
||||||
|
e.preventDefault(); // don't let this policy be created.
|
||||||
|
};
|
||||||
|
trustedTypes.addEventListener('beforecreatepolicy', event_listener, {once:true});
|
||||||
|
assert_throws_dom("NotAllowedError", () => trustedTypes.createPolicy("default", {}));
|
||||||
|
}, 'Block Trusted Type policy creation by event listener.');
|
||||||
|
|
||||||
|
test(t => {
|
||||||
|
let flag = false;
|
||||||
|
event_listener = (e) => {
|
||||||
|
assert_equals(e.policyName, "myPolicy");
|
||||||
|
flag = true;
|
||||||
|
};
|
||||||
|
trustedTypes.addEventListener('beforecreatepolicy', event_listener, {once:true});
|
||||||
|
trustedTypes.createPolicy("myPolicy", {});
|
||||||
|
assert_equals(flag, true);
|
||||||
|
}, 'Trusted Type policy creation.');
|
||||||
|
|
||||||
|
test(t => {
|
||||||
|
event_listener = (e) => {
|
||||||
|
if (e.policyName === "default")
|
||||||
|
e.preventDefault();
|
||||||
|
};
|
||||||
|
trustedTypes.addEventListener('beforecreatepolicy', event_listener, {once:true});
|
||||||
|
assert_throws_dom("NotAllowedError", () => trustedTypes.createPolicy("default", {}));
|
||||||
|
trustedTypes.createPolicy("newPolicy", {});
|
||||||
|
}, 'Block only default Trusted Type policy creation.');
|
||||||
|
|
||||||
|
test(t => {
|
||||||
|
event_listener = (e) => {
|
||||||
|
assert_unreached();
|
||||||
|
};
|
||||||
|
trustedTypes.createPolicy("test", {});
|
||||||
|
trustedTypes.addEventListener('beforecreatepolicy', event_listener, {once:true});
|
||||||
|
}, 'Policy creation called before addEventListener function will not reached the listener.');
|
||||||
|
|
||||||
|
</script>
|
|
@ -232,6 +232,12 @@ async function waitForConnectionStateChange(pc, wantedStates) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function waitForIceGatheringState(pc, wantedStates) {
|
||||||
|
while (!wantedStates.includes(pc.iceGatheringState)) {
|
||||||
|
await waitUntilEvent(pc, 'icegatheringstatechange');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Resolves when RTP packets have been received.
|
// Resolves when RTP packets have been received.
|
||||||
async function listenForSSRCs(t, receiver) {
|
async function listenForSSRCs(t, receiver) {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
@ -325,4 +325,16 @@
|
||||||
await pc1.setRemoteDescription(answer);
|
await pc1.setRemoteDescription(answer);
|
||||||
}, 'repeated sRD(offer) works');
|
}, 'repeated sRD(offer) works');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const pc1 = new RTCPeerConnection();
|
||||||
|
t.add_cleanup(() => pc1.close());
|
||||||
|
const pc2 = new RTCPeerConnection();
|
||||||
|
t.add_cleanup(() => pc2.close());
|
||||||
|
pc1.addTransceiver('video');
|
||||||
|
await exchangeOfferAnswer(pc1, pc2);
|
||||||
|
await waitForIceGatheringState(pc1, ['complete']);
|
||||||
|
await exchangeOfferAnswer(pc1, pc2);
|
||||||
|
await waitForIceStateChange(pc2, ['connected', 'completed']);
|
||||||
|
}, 'sRD(reoffer) with candidates and without trickle works');
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -10,23 +10,6 @@
|
||||||
<body>
|
<body>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
function iceGatheringCompleteWaiter(pc) {
|
|
||||||
const waiter = new Promise((resolve) => {
|
|
||||||
const eventHandler = () => {
|
|
||||||
if (pc.iceGatheringState == 'complete') {
|
|
||||||
pc.removeEventListener('icegatheringstatechange', eventHandler, false);
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (pc.iceGatheringState == 'complete') {
|
|
||||||
resolve();
|
|
||||||
} else {
|
|
||||||
pc.addEventListener('icegatheringstatechange', eventHandler, false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return waiter;
|
|
||||||
}
|
|
||||||
|
|
||||||
class StateLogger {
|
class StateLogger {
|
||||||
constructor(source, eventname, field) {
|
constructor(source, eventname, field) {
|
||||||
source.addEventListener(eventname, event => {
|
source.addEventListener(eventname, event => {
|
||||||
|
@ -74,7 +57,7 @@ promise_test(async t => {
|
||||||
// Candidates from PC2 are not delivered to pc1, so pc1 will use
|
// Candidates from PC2 are not delivered to pc1, so pc1 will use
|
||||||
// peer-reflexive candidates.
|
// peer-reflexive candidates.
|
||||||
await exchangeOfferAnswer(pc1, pc2);
|
await exchangeOfferAnswer(pc1, pc2);
|
||||||
const waiter = iceGatheringCompleteWaiter(pc1);
|
const waiter = waitForIceGatheringState(pc1, ['complete']);
|
||||||
await waiter;
|
await waiter;
|
||||||
for (const candidate of candidates) {
|
for (const candidate of candidates) {
|
||||||
if (candidate) {
|
if (candidate) {
|
||||||
|
@ -105,7 +88,7 @@ promise_test(async t => {
|
||||||
// Candidates from pc1 are not delivered to pc2. so pc2 will use
|
// Candidates from pc1 are not delivered to pc2. so pc2 will use
|
||||||
// peer-reflexive candidates.
|
// peer-reflexive candidates.
|
||||||
await exchangeOfferAnswer(pc1, pc2);
|
await exchangeOfferAnswer(pc1, pc2);
|
||||||
const waiter = iceGatheringCompleteWaiter(pc2);
|
const waiter = waitForIceGatheringState(pc2, ['complete']);
|
||||||
await waiter;
|
await waiter;
|
||||||
for (const candidate of candidates) {
|
for (const candidate of candidates) {
|
||||||
if (candidate) {
|
if (candidate) {
|
||||||
|
@ -174,7 +157,7 @@ promise_test(async t => {
|
||||||
await Promise.all([pc1.setLocalDescription(offer),
|
await Promise.all([pc1.setLocalDescription(offer),
|
||||||
pc2.setRemoteDescription(offer)]);
|
pc2.setRemoteDescription(offer)]);
|
||||||
const answer = await pc2.createAnswer();
|
const answer = await pc2.createAnswer();
|
||||||
await iceGatheringCompleteWaiter(pc1);
|
await waitForIceGatheringState(pc1, ['complete']);
|
||||||
await pc2.setLocalDescription(answer).then(() => {
|
await pc2.setLocalDescription(answer).then(() => {
|
||||||
for (const candidate of pc1ToPc2Candidates) {
|
for (const candidate of pc1ToPc2Candidates) {
|
||||||
if (candidate) {
|
if (candidate) {
|
||||||
|
@ -182,7 +165,7 @@ promise_test(async t => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await iceGatheringCompleteWaiter(pc2);
|
await waitForIceGatheringState(pc2, ['complete']);
|
||||||
pc1.setRemoteDescription(answer).then(async () => {
|
pc1.setRemoteDescription(answer).then(async () => {
|
||||||
for (const candidate of pc2ToPc1Candidates) {
|
for (const candidate of pc2ToPc1Candidates) {
|
||||||
if (candidate) {
|
if (candidate) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue