mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Auto merge of #26545 - servo-wpt-sync:wpt_update_16-05-2020, r=servo-wpt-sync
Sync WPT with upstream (16-05-2020) Automated downstream sync of changes from upstream as of 16-05-2020. [no-wpt-sync] r? @servo-wpt-sync
This commit is contained in:
commit
0a00ea3db3
141 changed files with 2004 additions and 912 deletions
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-003.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -2,3 +2,6 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,3 +2,6 @@
|
|||
[listeners are called when <iframe> is resized]
|
||||
expected: FAIL
|
||||
|
||||
[listeners are called correct number of times]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,6 +2,3 @@
|
|||
[elementsFromPoint on the root document for points in iframe elements]
|
||||
expected: FAIL
|
||||
|
||||
[elementsFromPoint on inner documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -312,27 +312,21 @@
|
|||
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" 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>: separate response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain ]
|
||||
[<iframe>: combined response Content-Type: */* text/html]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,9 +56,3 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 error text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
[traverse_the_history_4.html]
|
||||
[traverse_the_history_2.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_4.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_escaping-2.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_escaping-3.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -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: NOTRUN
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
[image-loading-lazy-relevant-mutations.html]
|
||||
expected: ERROR
|
||||
[Image referrerPolicy mutation does not cause deferred loading=lazy images to be fetched]
|
||||
expected: NOTRUN
|
||||
|
||||
[Image src mutation does not cause deferred loading=lazy images to be fetched]
|
||||
expected: NOTRUN
|
||||
|
||||
[Images are lazyloaded]
|
||||
expected: TIMEOUT
|
||||
|
||||
[Image crossOrigin mutation does not cause deferred loading=lazy images to be fetched]
|
||||
expected: NOTRUN
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
[centering.html]
|
||||
[horizontal-tb (container vertical-rl) (dialog horizontal-tb): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-rl (dialog horizontal-tb): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-rl (container horizontal-tb) (dialog vertical-rl): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-lr (dialog horizontal-tb): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[horizontal-tb (container vertical-rl): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[horizontal-tb: tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-rl (container horizontal-tb): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[horizontal-tb: square viewport]
|
||||
expected: FAIL
|
||||
|
||||
[horizontal-tb: wide viewport]
|
||||
expected: FAIL
|
||||
|
||||
[horizontal-tb: dialog and viewport match]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-lr: dialog bigger than viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-rl: tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[horizontal-tb: dialog bigger than viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-lr: tall viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
[shared-worker-in-data-url-context.window.html]
|
||||
expected: TIMEOUT
|
||||
[Create a shared worker in a data url frame]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
[Create a data url shared worker in a data url frame]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -163489,7 +163489,7 @@
|
|||
]
|
||||
],
|
||||
"block-aspect-ratio-008.tentative.html": [
|
||||
"8575d96c769cc585c186efe634906d8c80285a86",
|
||||
"1e508149d90d811905407c9c1a03ac1dea456434",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -228708,7 +228708,7 @@
|
|||
]
|
||||
},
|
||||
"forced-colors-mode-01.html": [
|
||||
"1f4e3899a8a4d7db6fe0f484671eb69040fc1c2d",
|
||||
"9c0ef0b30939e797101ed3eddd69a4ae999c9288",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -236634,6 +236634,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"set-current-time-before-play.html": [
|
||||
"194de216d38580ec5f1fc187b99c225ca5c95b6d",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/scroll-animations/animation-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"two-animations-attach-to-same-scroll-timeline-cancel-one.html": [
|
||||
"1519e51c67717ae0e7995bc9586e60a5b3a5f126",
|
||||
[
|
||||
|
@ -242560,7 +242573,7 @@
|
|||
},
|
||||
"support": {
|
||||
".azure-pipelines.yml": [
|
||||
"264e5d076d15df90e657ec3fe921dd089a9a6ccf",
|
||||
"9b8676ef43f8803ce437a4a43d29bfc1820f4476",
|
||||
[]
|
||||
],
|
||||
".codecov.yml": [
|
||||
|
@ -245467,13 +245480,29 @@
|
|||
"7dd1c6ddaf795769ce06682ef9abd68eeff1ddc4",
|
||||
[]
|
||||
],
|
||||
"cross-origin-iframe-redirect-with-fp-delegation.https.html.headers": [
|
||||
"b2bc98de5d70328f5930d8baf020be5ccb80dd95",
|
||||
[]
|
||||
],
|
||||
"cross-origin-navigation-redirect.https.html.headers": [
|
||||
"e157e45b79820e59a8ebda26c12d23e7a52c813b",
|
||||
[]
|
||||
],
|
||||
"cross-origin-subresource-redirect-with-fp-delegation.https.html.headers": [
|
||||
"5515b8a591ff6084b3f69826e522a31eac4af36e",
|
||||
[]
|
||||
],
|
||||
"cross-origin-subresource-redirect.https.html.headers": [
|
||||
"e157e45b79820e59a8ebda26c12d23e7a52c813b",
|
||||
[]
|
||||
],
|
||||
"cross-origin-syncxhr-redirect.https.html.headers": [
|
||||
"e157e45b79820e59a8ebda26c12d23e7a52c813b",
|
||||
[]
|
||||
],
|
||||
"resources": {
|
||||
"accept-ch-and-redir-to-do-not-expect.py": [
|
||||
"eaca03fe76d474264226061ce639eb421dd28c94",
|
||||
[]
|
||||
],
|
||||
"accept-ch-and-redir-to-expect.py": [
|
||||
"835ef396b8bae0294088bc0231422c8c0f446a45",
|
||||
"accept-ch-and-redir.py": [
|
||||
"706983c9a06dcf52588394ed851e36503bc647a0",
|
||||
[]
|
||||
],
|
||||
"accept-ch-blank.html": [
|
||||
|
@ -245485,7 +245514,7 @@
|
|||
[]
|
||||
],
|
||||
"accept-ch-test.js": [
|
||||
"879745706c01af6744abf3d0a641380dea4645d5",
|
||||
"a08843699016ef90efa6dee5c2db324b460a16aa",
|
||||
[]
|
||||
],
|
||||
"accept-ch.html": [
|
||||
|
@ -245509,7 +245538,7 @@
|
|||
[]
|
||||
],
|
||||
"do-not-expect-received.py": [
|
||||
"6b0e61af9dbaef571a1373c4d1020105bf38459e",
|
||||
"ba647ede53bceaf88e4ab40b51b87243633e9bc7",
|
||||
[]
|
||||
],
|
||||
"echo-client-hints-received.py": [
|
||||
|
@ -245521,7 +245550,7 @@
|
|||
[]
|
||||
],
|
||||
"expect-received.py": [
|
||||
"5aab578ae3482dc32da85658bac0d7fcb4b0bc87",
|
||||
"bec3bffc2822a602e1f7a7b0c7b9b6e9c145ab95",
|
||||
[]
|
||||
],
|
||||
"feature-policy-with-cross-origin-subresource.html": [
|
||||
|
@ -245548,7 +245577,11 @@
|
|||
"cb762eff806849df46dc758ef7b98b63f27f54c9",
|
||||
[]
|
||||
]
|
||||
}
|
||||
},
|
||||
"same-origin-subresource-redirect-opted-in.https.html.headers": [
|
||||
"e157e45b79820e59a8ebda26c12d23e7a52c813b",
|
||||
[]
|
||||
]
|
||||
},
|
||||
"http-equiv-accept-ch-merge.https.html.headers": [
|
||||
"8759b65606b192b0dcb73cfd465de8529a159ba0",
|
||||
|
@ -316184,7 +316217,7 @@
|
|||
[]
|
||||
],
|
||||
"safari.md": [
|
||||
"fb8b7be2e5275dc7196c559573a73d3685e1f2a0",
|
||||
"0ff8fe5d95e8aed678e3f1d0e357f6518011537b",
|
||||
[]
|
||||
],
|
||||
"webkitgtk_minibrowser.md": [
|
||||
|
@ -318486,7 +318519,7 @@
|
|||
[]
|
||||
],
|
||||
"event-timing-test-utils.js": [
|
||||
"e2a69b5c5b49a17f93ccc22937f7f33b45848c24",
|
||||
"6045a054e7c00395854b29f8aa2a869d6064d83c",
|
||||
[]
|
||||
],
|
||||
"slow-image.py": [
|
||||
|
@ -320667,12 +320700,12 @@
|
|||
[]
|
||||
],
|
||||
"generic-sensor-tests.js": [
|
||||
"1843734a3bb0adf4d9e853af4ba74ae39aa33f41",
|
||||
"22101ccc2731df9c3a8933c8ee7d20375d27b1da",
|
||||
[]
|
||||
],
|
||||
"resources": {
|
||||
"generic-sensor-helpers.js": [
|
||||
"aff6d172d46c960e72b180a1f9784776f9b55521",
|
||||
"c2afb400207d1ebf92c227522acec550e06ac8f3",
|
||||
[]
|
||||
],
|
||||
"iframe_sensor_handler.html": [
|
||||
|
@ -333658,7 +333691,7 @@
|
|||
]
|
||||
},
|
||||
"lint.ignore": [
|
||||
"8cfef1eded28757dc13edda1bd30c002fa6dd80d",
|
||||
"ddb9f9fcc077383dd70e9b5f16d4db21e43ea8bc",
|
||||
[]
|
||||
],
|
||||
"loading": {
|
||||
|
@ -335490,7 +335523,7 @@
|
|||
],
|
||||
"resources": {
|
||||
"orientation-event-helpers.js": [
|
||||
"307c52f00032d913bda5ac40e5bc8b39c9a72f98",
|
||||
"3f81fec5867f7f05ea1dbfafb091c9a0f5da563a",
|
||||
[]
|
||||
]
|
||||
}
|
||||
|
@ -335538,6 +335571,10 @@
|
|||
"b028fcd9a36ff71b0eacd0363121a1fe2774f384",
|
||||
[]
|
||||
],
|
||||
"going-back.sub.https.html.headers": [
|
||||
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
|
||||
[]
|
||||
],
|
||||
"parent-yes-child-no-same.sub.https.html.headers": [
|
||||
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
|
||||
[]
|
||||
|
@ -335574,13 +335611,17 @@
|
|||
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
|
||||
[]
|
||||
],
|
||||
"removing-iframes.sub.https.html.headers": [
|
||||
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
|
||||
[]
|
||||
],
|
||||
"resources": {
|
||||
"helpers.mjs": [
|
||||
"fcef1b7e74f4d99995405d2602cc5e08a3fbddb6",
|
||||
"684785809254f511efe10463a6a701403568a60b",
|
||||
[]
|
||||
],
|
||||
"send-origin-isolation-header.py": [
|
||||
"1a39740f64f83d5e7d7a3f0fc39eb1a01fdc714a",
|
||||
"b0ba30fcd4939ffff6dfe6fc8959a831187c257e",
|
||||
[]
|
||||
]
|
||||
}
|
||||
|
@ -338370,7 +338411,7 @@
|
|||
[]
|
||||
],
|
||||
"generic_sensor_mocks.js": [
|
||||
"3ee748c9730bb99f1c51af4d82d62c4316a2edab",
|
||||
"fe2f70be34ebdeeb74ddac5e5fa4b39684b0e3b5",
|
||||
[]
|
||||
],
|
||||
"generic_sensor_mocks.js.headers": [
|
||||
|
@ -352229,7 +352270,7 @@
|
|||
[]
|
||||
],
|
||||
"RTCDTMFSender-helper.js": [
|
||||
"87f7ae13c7e21cccc11e3810df6cf705e3cee68b",
|
||||
"4316c3804a28f44d1f86af97c86e478570b2437a",
|
||||
[]
|
||||
],
|
||||
"RTCIceTransport-extension-helper.js": [
|
||||
|
@ -352237,7 +352278,7 @@
|
|||
[]
|
||||
],
|
||||
"RTCPeerConnection-helper.js": [
|
||||
"679cb85b12adfa98d3fdbedf6abb6d68a687bb47",
|
||||
"b7ed92a9cd28d88761b71ac476393cafdcbc2130",
|
||||
[]
|
||||
],
|
||||
"RTCRtpCapabilities-helper.js": [
|
||||
|
@ -352312,7 +352353,7 @@
|
|||
},
|
||||
"tools": {
|
||||
".eslintrc.js": [
|
||||
"09f9c60c9835f4ef1f041e5710a4afc12b3f64f3",
|
||||
"321f8e9a25499ea1073f0746578bce0c006eb62d",
|
||||
[]
|
||||
],
|
||||
"README.md": [
|
||||
|
@ -356445,7 +356486,7 @@
|
|||
"testharness": {
|
||||
"BackgroundSync": {
|
||||
"idlharness.https.any.js": [
|
||||
"8d4b9a583f484741f4cd4e4940833a890c612656",
|
||||
"120477a51e61ad32f629e991a12e8bc99c4dbb7e",
|
||||
[
|
||||
"BackgroundSync/idlharness.https.any.html",
|
||||
{
|
||||
|
@ -356457,8 +356498,13 @@
|
|||
[
|
||||
"script",
|
||||
"/resources/idlharness.js"
|
||||
],
|
||||
[
|
||||
"timeout",
|
||||
"long"
|
||||
]
|
||||
]
|
||||
],
|
||||
"timeout": "long"
|
||||
}
|
||||
],
|
||||
[
|
||||
|
@ -356472,8 +356518,13 @@
|
|||
[
|
||||
"script",
|
||||
"/resources/idlharness.js"
|
||||
],
|
||||
[
|
||||
"timeout",
|
||||
"long"
|
||||
]
|
||||
]
|
||||
],
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -367993,10 +368044,12 @@
|
|||
]
|
||||
],
|
||||
"AmbientLightSensor.https.html": [
|
||||
"2383a2de2187f863c0299688a2f6ad80972648b6",
|
||||
"7d23896a6488f3fdfef6809f552a06f03fe427a3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"AmbientLightSensor_insecure_context.html": [
|
||||
|
@ -372429,6 +372482,24 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-iframe-redirect-with-fp-delegation.https.html": [
|
||||
"a2bc66fca1e13232ff77a7511440313d03e0d93b",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-navigation-redirect.https.html": [
|
||||
"14ba51ab5d080085d4f4ffb68b9e51ab8eb84cdd",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-navigation.https.html": [
|
||||
"e05c8e3ef5bf853c04acc396166e0cd5a6a00b60",
|
||||
[
|
||||
|
@ -372438,6 +372509,24 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-subresource-redirect-with-fp-delegation.https.html": [
|
||||
"dd7b9fab9719555a8530f672e165b653bf27b975",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-subresource-redirect.https.html": [
|
||||
"31334543cf261339c237a52fb45111a54283e963",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-subresource-with-feature-policy.https.html": [
|
||||
"3108c23faabfa254e3ebd0c12122e8e44e39e38b",
|
||||
[
|
||||
|
@ -372456,6 +372545,15 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"cross-origin-syncxhr-redirect.https.html": [
|
||||
"1cce664d2c51b4469c4a122c51a648b85aea6536",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"http-equiv-cross-origin-iframe-not-setting-other-origins.https.html": [
|
||||
"226b3116fc173ebb7c217df94addbcadbfacec04",
|
||||
[
|
||||
|
@ -372545,7 +372643,7 @@
|
|||
]
|
||||
],
|
||||
"same-origin-navigation-redirect.https.html": [
|
||||
"2ab128f2d8273841d53dcd301e032879f685693e",
|
||||
"69fc55e8f3752b2eb13fd5645c223010a26eaa81",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -372562,8 +372660,17 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"same-origin-subresource-redirect-opted-in.https.html": [
|
||||
"66c0e57497f62ff2f9734988449998d25f3217c5",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"same-origin-subresource-redirect.https.html": [
|
||||
"4a8233bc3e5a8850680775b930dd57ab9ceec3e3",
|
||||
"8e687b58b1de8ce4e2707a8ccd2dcfae7905cd0d",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -372736,6 +372843,44 @@
|
|||
]
|
||||
]
|
||||
},
|
||||
"permissions": {
|
||||
"readText-denied.https.html": [
|
||||
"7183b1a6eaeb1b34c048ffe68660e5920a4f50a9",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"readText-granted.https.html": [
|
||||
"5a2865db0dbf29db2e888e932582b3e62eab91cc",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"writeText-denied.https.html": [
|
||||
"19df8a398f60eae32d6446615d831cae9560134c",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"writeText-granted.https.html": [
|
||||
"87411fec20c972bfc2e5987030c846ebc68c68c4",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"text-write-read": {
|
||||
"async-write-read.https.html": [
|
||||
"1d170f2fa4a7a4a96c3615d41a3290ab0123fba7",
|
||||
|
@ -384062,7 +384207,7 @@
|
|||
]
|
||||
],
|
||||
"math-script-level-004.tentative.html": [
|
||||
"a938bd4d01194ad90d2ed76bbf849c6b8ffebb4c",
|
||||
"b534b6a7712af62d3184c4a71f48b7a56a1e146b",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -390403,10 +390548,12 @@
|
|||
]
|
||||
],
|
||||
"idlharness.html": [
|
||||
"eb0652e9eeb374ed1d3bb4bf235b0b3cf13fde06",
|
||||
"514d31f6b39ef066df52c113e68232119cb6927d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"marker-animate.html": [
|
||||
|
@ -392646,7 +392793,7 @@
|
|||
]
|
||||
],
|
||||
"quirks-mode-002.tentative.html": [
|
||||
"7c8bcac07ad8fba21ed11f85fd244757dcc0485e",
|
||||
"c4639ab36f8a4ae0c00ed847179afbce766bba34",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -426485,7 +426632,7 @@
|
|||
},
|
||||
"gamepad": {
|
||||
"idlharness.window.js": [
|
||||
"7943520b5b3be1dc3e18bed82cdd4be7fbf1550a",
|
||||
"0bbb0b3c701515743c24ca8ca67a96b5c61fa3cc",
|
||||
[
|
||||
"gamepad/idlharness.window.html",
|
||||
{
|
||||
|
@ -426497,8 +426644,13 @@
|
|||
[
|
||||
"script",
|
||||
"/resources/idlharness.js"
|
||||
],
|
||||
[
|
||||
"timeout",
|
||||
"long"
|
||||
]
|
||||
]
|
||||
],
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -454644,6 +454796,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"image-loading-lazy-relevant-mutations.html": [
|
||||
"cd4b99dd458c4bb0d4ddceef57b879f5e4ea697d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"image-loading-lazy-srcset.html": [
|
||||
"21c11c7233c7b8f845a31b6aa25dda14ca381960",
|
||||
[
|
||||
|
@ -456803,7 +456962,7 @@
|
|||
]
|
||||
],
|
||||
"centering.html": [
|
||||
"8df2d3052320bbfebc8184b3f426405b398dc632",
|
||||
"4c97ea078c51da6e960c90d3c957f000bc9d7e37",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -468258,24 +468417,30 @@
|
|||
]
|
||||
],
|
||||
"MediaStreamTrack-applyConstraints-getSettings.html": [
|
||||
"9d985de66de4a476ddb68802603b212efd7c40b6",
|
||||
"a1695b1113028a3945f0c8aba8ab9a9cff4b502d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"MediaStreamTrack-applyConstraints-reject.html": [
|
||||
"21719636ea870f0cfe8e3b8c8a0c838512c1eb87",
|
||||
"45599c076f0ff6b1ba53e69a423cdf0e5d2ce1bf",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"MediaStreamTrack-applyConstraints.html": [
|
||||
"da3de3ec0f90cbad2563e41c9aa228c1297945e6",
|
||||
"3c5c05aefa05d878b07f927eea600af75598d497",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"MediaStreamTrack-getCapabilities-fast.html": [
|
||||
|
@ -468286,10 +468451,12 @@
|
|||
]
|
||||
],
|
||||
"MediaStreamTrack-getCapabilities.html": [
|
||||
"e7b196f510a0baee4096f58f0fce7d868a977d88",
|
||||
"c569283c34ef09541977938825abd1f01f6b386b",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"MediaStreamTrack-getConstraints-fast.html": [
|
||||
|
@ -468307,10 +468474,12 @@
|
|||
]
|
||||
],
|
||||
"MediaStreamTrack-getSettings.html": [
|
||||
"a1a864c2445d844c5d6fd88dd48e1f6839ae9528",
|
||||
"8fc2c82319517e4b9f60daa2866584505040ad2f",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"detached-HTMLCanvasElement.html": [
|
||||
|
@ -472697,6 +472866,13 @@
|
|||
]
|
||||
},
|
||||
"origin-isolation": {
|
||||
"going-back.sub.https.html": [
|
||||
"781e3640d3b37f373e81fa0b92e4623ed0c462af",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"parent-no-child-yes-same.sub.https.html": [
|
||||
"4239e1644638b04d330ff70f8a27e97f5af88ab0",
|
||||
[
|
||||
|
@ -472794,6 +472970,13 @@
|
|||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"removing-iframes.sub.https.html": [
|
||||
"0d2d97815e2a624cacd8d841e6dd35e38f01250d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"origin-policy": {
|
||||
|
@ -473112,10 +473295,12 @@
|
|||
},
|
||||
"page-lifecycle": {
|
||||
"idlharness.html": [
|
||||
"08b2b054fbad3b41617975a9c2475fe54bc9910d",
|
||||
"55a7cbc2429c81a182c1373780f4bba457060a50",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
|
@ -474970,6 +475155,24 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"pointerevent_mouse-pointer-on-scrollbar.html": [
|
||||
"43d78e147eca1de430e01db07d2b4c88e886ddda",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"pointerevent_mouse-pointer-updown-events.html": [
|
||||
"a5433aab535f075b58844481a44588cb578a6bf0",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"pointerevent_touch-action-verification.html": [
|
||||
"311d24b628e4a7897649205da157683e130dc23a",
|
||||
[
|
||||
|
@ -475174,7 +475377,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_lostpointercapture_is_first.html": [
|
||||
"6ce0f3e59a04db4ecf23d9fd60b57164ceb67f85",
|
||||
"c84961b6c5a2350548d98f17eb964ed66ae6e768",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -475262,7 +475465,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_pointerleave_descendant_over.html": [
|
||||
"ccc5f37477cc8eabc3effa75d45f2f45d7ea31f5",
|
||||
"ae348307b4d4372f8cb1da46a17b39cbb8a80cb7",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -475280,7 +475483,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_pointerleave_does_not_bubble.html": [
|
||||
"b19820ebd3df673846710887f5c13fdf01b60de7",
|
||||
"0dc88ee318feef18a04139230b42a50373384b9b",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -475334,7 +475537,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_pointerout_received_once.html": [
|
||||
"07df04fc2046737997b70b50063825d292af90de",
|
||||
"748306e45c8692c1c1c698674863732507fdfcc6",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -475422,7 +475625,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_setpointercapture_disconnected.html": [
|
||||
"a7cc3e00e23f1544cdb81762025929a194df0f75",
|
||||
"386de407e9dd963b30193f3e55a7f7c345764eb0",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -475440,7 +475643,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_setpointercapture_invalid_pointerid.html": [
|
||||
"7d9f948919f87a69659262bd8aee7778c79b2f23",
|
||||
"70b4f41b34954352cab931b8bf0b4da8d972bbcd",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -475712,7 +475915,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_movementxy.html": [
|
||||
"260ef4829cba212e77ad487f8e82d69d9e9e8e73",
|
||||
"eb944460192cfd3a3ef1e11d6ab1f58efbb8983b",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -476201,17 +476404,21 @@
|
|||
]
|
||||
],
|
||||
"onerror-event.html": [
|
||||
"94c8dc772deefc46be48a4545d6c45f8fd17a933",
|
||||
"fb29956b89a09e19c03792395c2a253e5547cf39",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"onload-event.html": [
|
||||
"8825ffaaa52025484be848b1a6f73d91da210a47",
|
||||
"2e1e8d390071821af99fe209679c56d0f04301d5",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
{
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
"preload-csp.sub.html": [
|
||||
|
@ -488055,7 +488262,7 @@
|
|||
]
|
||||
],
|
||||
"current-time.html": [
|
||||
"18913bb9b042c6d0e5c52fcf168ba25648dea944",
|
||||
"ad489d02811b96b2fa8c9d189712fa53c1cada50",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -488122,7 +488329,7 @@
|
|||
]
|
||||
],
|
||||
"scroll-timeline-phases.tentative.html": [
|
||||
"ec59a12d91a1cb674507b593f537d81ce9653621",
|
||||
"46fe06a0bddc20e3e18d024a4626a26f29681034",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -501569,7 +501776,7 @@
|
|||
]
|
||||
],
|
||||
"trusted-types-svg-script.tentative.html": [
|
||||
"330efc0c0ac8cc316019367c298e14fdc0439af6",
|
||||
"903490e2f3d7f43f017bd843f912b99acba47c8e",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -509102,7 +509309,7 @@
|
|||
]
|
||||
],
|
||||
"idlharness.https.window.js": [
|
||||
"a1eb3386b73a8425dbd85bf1498bcce783a10857",
|
||||
"d9ce83e2a1f9dfa47bdbb0421c7e9b8826b91d66",
|
||||
[
|
||||
"web-nfc/idlharness.https.window.html",
|
||||
{
|
||||
|
@ -509114,8 +509321,13 @@
|
|||
[
|
||||
"script",
|
||||
"/resources/idlharness.js"
|
||||
],
|
||||
[
|
||||
"timeout",
|
||||
"long"
|
||||
]
|
||||
]
|
||||
],
|
||||
"timeout": "long"
|
||||
}
|
||||
]
|
||||
],
|
||||
|
@ -512148,7 +512360,7 @@
|
|||
]
|
||||
],
|
||||
"RTCDTMFSender-ontonechange.https.html": [
|
||||
"1061698d21bd8febcc62ba795b4d3412d0e5a6d5",
|
||||
"08dd6ada327497eecb732781bd126d0dfcf54438",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512166,7 +512378,7 @@
|
|||
]
|
||||
],
|
||||
"RTCDataChannel-close.html": [
|
||||
"b8feea332ad71ff046ceb4b4590ca2becd2919a6",
|
||||
"ea7795719c21e2aa6cfa48435f8d62b7d8c842c0",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512175,7 +512387,7 @@
|
|||
]
|
||||
],
|
||||
"RTCDataChannel-id.html": [
|
||||
"355f6a36eae551e8ea92ff91a8a6b65ed10c776c",
|
||||
"10dc5eacb9ccf2a878d29e8b13eb082271731e65",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512205,14 +512417,14 @@
|
|||
]
|
||||
],
|
||||
"RTCDtlsTransport-getRemoteCertificates.html": [
|
||||
"4735b7574123d65df93820132afd9fb6c3afa638",
|
||||
"8af95a84d574e20f9b0bbff964ed064e4e17e62f",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"RTCDtlsTransport-state.html": [
|
||||
"60a14b151e18940a15f91143641f360ef0da346e",
|
||||
"d0230de0e64d0dcf5b1371cc26f57095053a8fd2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512233,7 +512445,7 @@
|
|||
]
|
||||
],
|
||||
"RTCIceConnectionState-candidate-pair.https.html": [
|
||||
"0752c9aaee65cd4216861e9900c8f863f9d14456",
|
||||
"3b2c253401f67e2c7e3c679d1d7ae5bac41a2f3d",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512298,7 +512510,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-connectionState.https.html": [
|
||||
"9e2f3649aec145f3f8787846c0cd3b9ac74a7a81",
|
||||
"5db8272df307260f9db0c4333c23c7ad4c4432b6",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512319,7 +512531,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-createDataChannel.html": [
|
||||
"67b40c9ed8ea44d9559a318619206531c01b32a7",
|
||||
"dd34561fbc6658d6fb6a146254acd8f36ced210a",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512347,7 +512559,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-getStats.https.html": [
|
||||
"f3c51d26a36d7c654420467e6c28e033f0bedc59",
|
||||
"2ecb21d2f19949fe198e587289430328d5345adf",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512361,7 +512573,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-iceConnectionState-disconnected.https.html": [
|
||||
"ff405f32851037e3880b674b4553896d36d92544",
|
||||
"af55a0c003512f98dc96d11c07e8a5099ed1f5ea",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512370,7 +512582,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-iceConnectionState.https.html": [
|
||||
"a5bf7536ff5fa8dea448010c73dcbee4ad7532ff",
|
||||
"851ce884d6ea12bf60761ef23f78cf197d594372",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512379,14 +512591,14 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-iceGatheringState.html": [
|
||||
"0940738a86f4baeeeb2ce8a4ce73ee5ef69d1e96",
|
||||
"3f0128bb843ddbdd129f8a10b601b21c21ce7de4",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"RTCPeerConnection-mandatory-getStats.https.html": [
|
||||
"fd8c74b918440b72faaa570753a9a6dc88e85dcc",
|
||||
"e48d133f464a9a1e9f2b17b3c6eb5f3c375cae34",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512395,7 +512607,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-ondatachannel.html": [
|
||||
"8ba98414cbb179696523116673d29bc8e436e704",
|
||||
"46fe8e0f51b1b1a855f06d54c819784d6f542508",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512416,7 +512628,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-onsignalingstatechanged.https.html": [
|
||||
"217ea7a1bc845d0a97ee9868e89f4d12cae22a98",
|
||||
"0c8405770b616d1d0f3be226a815780cc1ad0413",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512469,7 +512681,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-restartIce.https.html": [
|
||||
"c069736fa0b37be2bff7174e5ea65aaf91fb5b61",
|
||||
"8f8c661a41dd0a1cb8f56baf80f6d3b797f9e229",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512588,7 +512800,7 @@
|
|||
]
|
||||
],
|
||||
"RTCPeerConnection-track-stats.https.html": [
|
||||
"b56982fda4bc31296b4775bb5187d2a897bf72df",
|
||||
"83c9f1916cd02a5e91031e4e618319628da52ccc",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512678,7 +512890,7 @@
|
|||
]
|
||||
],
|
||||
"RTCRtpReceiver-getStats.https.html": [
|
||||
"7cd598393708b501e0b3dbd49d31eda8230dae88",
|
||||
"20448d8a6c10b20168c4890aad2b37975219b6df",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512701,7 +512913,7 @@
|
|||
]
|
||||
],
|
||||
"RTCRtpSender-getStats.https.html": [
|
||||
"1af8285f4c325f38b322d26aa582f3bed7f70585",
|
||||
"70c633232325bc811db6cc0bca6942b5ffbd7ab2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512789,7 +513001,7 @@
|
|||
]
|
||||
],
|
||||
"RTCSctpTransport-maxChannels.html": [
|
||||
"e62404a21a0834b999a0874afd6345e49342b761",
|
||||
"b173e11c74a56c151c7838bcbe04030c45259cce",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -512919,7 +513131,7 @@
|
|||
]
|
||||
],
|
||||
"candidate-exchange.https.html": [
|
||||
"b741de55eccd870e705324d3c75d2c06305e017a",
|
||||
"532bc4d0d13d72170f9e521cbeda7d2e656e317f",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512928,21 +513140,21 @@
|
|||
]
|
||||
],
|
||||
"crypto-suite.https.html": [
|
||||
"f4e69e40dfd4717b9ed8f2b90b08fed9040313ae",
|
||||
"f1b60561a140d2238f0f0a2d79b0759c71d75480",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"dtls-fingerprint-validation.html": [
|
||||
"9a397785eec1972a3f6833853f386eeeb61de318",
|
||||
"0ddc8488ae57213c9b5810633437bca27e4ee9f3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"ice-state.https.html": [
|
||||
"4a6b4333e16a179e6fffadde0a7018eb91895104",
|
||||
"becce59509b792dd5d63571bff065d93185ca1fa",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -513002,7 +513214,7 @@
|
|||
]
|
||||
],
|
||||
"video-codecs.https.html": [
|
||||
"e728effbeb94de865df9f8860cd45c8de1f601c1",
|
||||
"a4905ae441a912797788d6d0b065a6c861d708b8",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -513130,14 +513342,14 @@
|
|||
},
|
||||
"webrtc-insertable-streams": {
|
||||
"RTCEncodedAudioFrame-serviceworker-failure.https.html": [
|
||||
"fda89f36dcb52668e28d8c017112f6efb1f169a8",
|
||||
"79708e706de06cd94bf2c63f6dd4bca543701481",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"RTCEncodedVideoFrame-serviceworker-failure.https.html": [
|
||||
"93b9a6a0f36098e3d20762adc9e1d30b61fc7b15",
|
||||
"54b3a54b364ed8725c256c6d4b4e5856024099b3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -513169,7 +513381,7 @@
|
|||
]
|
||||
],
|
||||
"RTCQuicTransport.https.html": [
|
||||
"f9d1411aed368bc8d478a232d825444e0975f121",
|
||||
"cdccaac6c866c970d5620b8f70943b69412cb861",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -513178,7 +513390,7 @@
|
|||
},
|
||||
"webrtc-stats": {
|
||||
"getStats-remote-candidate-address.html": [
|
||||
"bf580688591dbce35ef852c511d2c6b2dc01ab8b",
|
||||
"08e2aec90e6836cdcd05b448d2d581eec3bd5535",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-003.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -2,3 +2,6 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,3 +2,6 @@
|
|||
[listeners are called when <iframe> is resized]
|
||||
expected: FAIL
|
||||
|
||||
[listeners are called correct number of times]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,6 +2,3 @@
|
|||
[elementsFromPoint on the root document for points in iframe elements]
|
||||
expected: FAIL
|
||||
|
||||
[elementsFromPoint on inner documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -312,27 +312,21 @@
|
|||
[fetch(): separate response Content-Type: text/plain ]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" 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>: separate response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain ]
|
||||
[<iframe>: combined response Content-Type: */* text/html]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,9 +56,3 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 error text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[traverse_the_history_2.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_escaping-2.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[iframe_sandbox_popups_escaping-3.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -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: NOTRUN
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
[image-loading-lazy-relevant-mutations.html]
|
||||
expected: ERROR
|
||||
[Image referrerPolicy mutation does not cause deferred loading=lazy images to be fetched]
|
||||
expected: NOTRUN
|
||||
|
||||
[Image src mutation does not cause deferred loading=lazy images to be fetched]
|
||||
expected: NOTRUN
|
||||
|
||||
[Images are lazyloaded]
|
||||
expected: TIMEOUT
|
||||
|
||||
[Image crossOrigin mutation does not cause deferred loading=lazy images to be fetched]
|
||||
expected: NOTRUN
|
||||
|
|
@ -39,3 +39,6 @@
|
|||
[vertical-rl (container horizontal-tb) (dialog vertical-rl): tall viewport]
|
||||
expected: FAIL
|
||||
|
||||
[vertical-lr: dialog bigger than viewport]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
[shared-worker-in-data-url-context.window.html]
|
||||
expected: TIMEOUT
|
||||
[Create a shared worker in a data url frame]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
[Create a data url shared worker in a data url frame]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -609,8 +609,8 @@ jobs:
|
|||
channel: stable
|
||||
- template: tools/ci/azure/update_hosts.yml
|
||||
- template: tools/ci/azure/update_manifest.yml
|
||||
# --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/18634 + https://github.com/web-platform-tests/wpt/issues/22175
|
||||
- script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info safari --exclude /inert/inert-retargeting.tentative.html --exclude /inert/inert-retargeting-iframe.tentative.html --exclude /pointerevents/pointerevent_pointercapture-not-lost-in-chorded-buttons.html --exclude /pointerevents/pointerevent_pointercapture_in_frame.html --exclude /web-share/share-sharePromise-internal-slot.https.html
|
||||
# --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/18995 + https://github.com/web-platform-tests/wpt/issues/20887 + https://github.com/web-platform-tests/wpt/issues/22175 + https://github.com/web-platform-tests/wpt/issues/23630
|
||||
- script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info safari --exclude /pointerevents/pointerevent_pointercapture-not-lost-in-chorded-buttons.html --exclude /pointerevents/pointerevent_pointercapture_in_frame.html --exclude /web-share/share-sharePromise-internal-slot.https.html --exclude /webdriver/tests/perform_actions/pointer_tripleclick.py
|
||||
displayName: 'Run tests'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: 'Publish results'
|
||||
|
@ -644,8 +644,8 @@ jobs:
|
|||
- template: tools/ci/azure/install_safari.yml
|
||||
- template: tools/ci/azure/update_hosts.yml
|
||||
- template: tools/ci/azure/update_manifest.yml
|
||||
# --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/18995 + https://github.com/web-platform-tests/wpt/issues/20887
|
||||
- script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel preview safari --exclude /pointerevents/pointerevent_pointercapture_in_frame.html --exclude /web-share/share-sharePromise-internal-slot.https.html
|
||||
# --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/18995 + https://github.com/web-platform-tests/wpt/issues/20887 + https://github.com/web-platform-tests/wpt/issues/23630
|
||||
- script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel preview safari --exclude /pointerevents/pointerevent_pointercapture_in_frame.html --exclude /web-share/share-sharePromise-internal-slot.https.html --exclude /webdriver/tests/perform_actions/pointer_tripleclick.py
|
||||
displayName: 'Run tests'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: 'Publish results'
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// META: script=/resources/WebIDLParser.js
|
||||
// META: script=/resources/idlharness.js
|
||||
// META: timeout=long
|
||||
|
||||
'use strict';
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>AmbientLightSensor Test</title>
|
||||
<meta name="timeout" content="long">
|
||||
<link rel="author" title="Intel" href="http://www.intel.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/ambient-light/">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<!doctype html>
|
||||
<meta name="timeout" content="long">
|
||||
<title>Accept-CH Persistence test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// Make sure that cross origin iframes that gets redirected, and has Feature Policy delegation maintain their Client Hints.
|
||||
const test_name = "Iframe redirect with Feature Policy delegation";
|
||||
verify_iframe_state("resources/accept-ch-and-redir.py?url=" + get_host_info()["HTTPS_REMOTE_ORIGIN"] + "/client-hints/accept-ch-stickiness/resources/expect-received.py", test_name);
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
Accept-CH: DPR, Device-Memory
|
||||
Feature-Policy: ch-dpr *; ch-device-memory *
|
|
@ -0,0 +1,18 @@
|
|||
<!doctype html>
|
||||
<meta name="timeout" content="long">
|
||||
<title>Accept-CH Persistence test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// Make sure a cross origin navigation that gets redirected doesn't keep the initial request's Client Hints.
|
||||
const test_name = "cross-origin redirect on navigation";
|
||||
verify_navigation_state("resources/accept-ch-and-redir.py?url=" + get_host_info()["HTTPS_REMOTE_ORIGIN"] + "/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py", test_name);
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
Accept-CH: DPR, Device-Memory
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta name="timeout" content="long">
|
||||
<title>Accept-CH Persistence test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// Make sure a cross origin subresource that gets redirected with Feature Policy delegation keeps the initial request's Client Hints.
|
||||
const test_name = "cross-origin subresource redirect with Feature Policy delegation";
|
||||
verify_subresource_state("resources/accept-ch-and-redir.py?url=" + get_host_info()["HTTPS_REMOTE_ORIGIN"] + "/client-hints/accept-ch-stickiness/resources/expect-received.py", test_name);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
Accept-CH: DPR, Device-Memory
|
||||
Feature-Policy: ch-dpr *;ch-device-memory *
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta name="timeout" content="long">
|
||||
<title>Accept-CH Persistence test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// Make sure a cross origin subresource that gets redirected doesn't keep the initial request's Client Hints.
|
||||
const test_name = "cross-origin subresource redirect";
|
||||
verify_subresource_state("resources/accept-ch-and-redir.py?url=" + get_host_info()["HTTPS_REMOTE_ORIGIN"] + "/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py", test_name);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
Accept-CH: DPR, Device-Memory
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta name="timeout" content="long">
|
||||
<title>Accept-CH Persistence test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// Make sure a cross origin syn XHR that gets redirected doesn't keep the initial request's Client Hints.
|
||||
const test_name = "cross-origin sync XHR redirect";
|
||||
verify_syncxhr_state("resources/accept-ch-and-redir.py?url=" + get_host_info()["HTTPS_REMOTE_ORIGIN"] + "/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py", test_name);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
Accept-CH: DPR, Device-Memory
|
|
@ -1,2 +0,0 @@
|
|||
def main(request, response):
|
||||
return 301, [('Location', 'do-not-expect-received.py'),('Accept-CH', 'device-memory, DPR')], ''
|
|
@ -1,2 +0,0 @@
|
|||
def main(request, response):
|
||||
return 301, [('Location', 'expect-received.py'),('Accept-CH', 'device-memory, DPR')], ''
|
|
@ -0,0 +1,5 @@
|
|||
def main(request, response):
|
||||
url = ''
|
||||
if 'url' in request.GET:
|
||||
url = request.GET['url']
|
||||
return 301, [('Location', url),('Accept-CH', 'device-memory, DPR')], ''
|
|
@ -21,6 +21,20 @@ function verify_initial_state(initial_url, test_name) {
|
|||
"hints preferences cached");
|
||||
}
|
||||
|
||||
function verify_iframe_state(expect_url, test_name) {
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
window.addEventListener('message', t.step_func(function(e) {
|
||||
assert_equals(e.data, "PASS", "message from opened frame");
|
||||
fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve);
|
||||
}));
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.src = expect_url;
|
||||
document.body.appendChild(iframe);
|
||||
});
|
||||
}, test_name + " got client hints according to expectations.");
|
||||
}
|
||||
|
||||
function verify_navigation_state(expect_url, test_name) {
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
|
@ -40,14 +54,27 @@ function verify_navigation_state(expect_url, test_name) {
|
|||
function verify_subresource_state(expect_url, test_name) {
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
let win;
|
||||
window.addEventListener('message', t.step_func(function(e) {
|
||||
win.close();
|
||||
assert_equals(e.data, "PASS", "message from opened page");
|
||||
fetch(expect_url).then(response => response.text()).then(t.step_func(text => {
|
||||
assert_true(text.includes("PASS"));
|
||||
fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve);
|
||||
}));
|
||||
// Open expect_url as a subresource.
|
||||
fetch(expect_url).then(resolve);
|
||||
});
|
||||
}, test_name + " got client hints according to expectations.");
|
||||
}
|
||||
|
||||
function verify_syncxhr_state(expect_url, test_name) {
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = t.step_func(() => {
|
||||
if (xhr.readyState != XMLHttpRequest.DONE) {
|
||||
return;
|
||||
}
|
||||
assert_true(xhr.responseText.includes("PASS"));
|
||||
fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve);
|
||||
});
|
||||
xhr.open("GET", expect_url, false /* async */);
|
||||
xhr.send();
|
||||
});
|
||||
}, test_name + " got client hints according to expectations.");
|
||||
}
|
||||
|
|
|
@ -15,5 +15,5 @@ def main(request, response):
|
|||
window.opener.postMessage("%s" , "*");
|
||||
</script>
|
||||
''' % (result)
|
||||
headers = [("Content-Type", "text/html")]
|
||||
headers = [("Content-Type", "text/html"), ("Access-Control-Allow-Origin", "*")]
|
||||
return 200, headers, content
|
||||
|
|
|
@ -5,15 +5,16 @@ def main(request, response):
|
|||
verify_navigation_state() in accept-ch-test.js
|
||||
"""
|
||||
|
||||
if "device-memory" in request.headers:
|
||||
if "device-memory" in request.headers and "sec-ch-ua" in request.headers and "sec-ch-ua-mobile" in request.headers:
|
||||
result = "PASS"
|
||||
else:
|
||||
result = "FAIL"
|
||||
|
||||
content = '''
|
||||
<script>
|
||||
window.opener.postMessage("%s" , "*");
|
||||
let messagee = window.opener || window.parent;
|
||||
messagee.postMessage("%s" , "*");
|
||||
</script>
|
||||
''' % (result)
|
||||
headers = [("Content-Type", "text/html")]
|
||||
headers = [("Content-Type", "text/html"), ("Access-Control-Allow-Origin", "*")]
|
||||
return 200, headers, content
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
// header here are a single step, connected via redirect.
|
||||
const test_name = "redirect on navigation";
|
||||
verify_initial_state(echo, test_name);
|
||||
verify_navigation_state("resources/accept-ch-and-redir-to-expect.py", test_name);
|
||||
verify_navigation_state("resources/accept-ch-and-redir.py?url=expect-received.py", test_name);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta name="timeout" content="long">
|
||||
<title>Accept-CH Persistence test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// Make sure a same origin subresource that gets redirected keeps the initial request's Client Hints.
|
||||
const test_name = "same-origin subresource redirect with opt-in";
|
||||
verify_subresource_state("resources/accept-ch-and-redir.py?url=expect-received.py", test_name);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
Accept-CH: DPR, Device-Memory
|
|
@ -8,11 +8,10 @@
|
|||
<script src="resources/accept-ch-test.js"></script>
|
||||
|
||||
<script>
|
||||
// This is similar to accept-ch-test.js tests, except setting and checking
|
||||
// header here are a single step, connected via redirect.
|
||||
const test_name = "redirect on navigation";
|
||||
// Make sure a same origin subresource without an opt-in that gets redirected doesn't contain Client Hints.
|
||||
const test_name = "same-origin subresource redirect with no opt-in";
|
||||
verify_initial_state(echo, test_name);
|
||||
verify_subresource_state("resources/accept-ch-and-redir-to-do-not-expect.py", test_name);
|
||||
verify_subresource_state("resources/accept-ch-and-redir.py?url=do-not-expect-received.py", test_name);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>navigator.clipboard.readText() fails when permission denied</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
promise_test(async t => {
|
||||
test_driver.set_permission({name: 'clipboard-read'}, 'denied');
|
||||
await promise_rejects_dom(t,
|
||||
'NotAllowedError', navigator.clipboard.readText());
|
||||
}, 'navigator.clipboard.readText() fails when permission denied');
|
||||
</script>
|
|
@ -0,0 +1,16 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>navigator.clipboard.readText() succeeds when permission granted</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
promise_test(async () => {
|
||||
test_driver.set_permission({name: 'clipboard-read'}, 'granted');
|
||||
await navigator.clipboard.readText();
|
||||
}, 'navigator.clipboard.readText() succeeds when permission granted');
|
||||
</script>
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>navigator.clipboard.writeText() fails when permission denied</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
promise_test(async t => {
|
||||
test_driver.set_permission({name: 'clipboard-write'}, 'denied');
|
||||
await promise_rejects_dom(t, 'NotAllowedError',
|
||||
navigator.clipboard.writeText('xyz'));
|
||||
}, 'navigator.clipboard.writeText() fails when permission denied');
|
||||
</script>
|
|
@ -0,0 +1,16 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>navigator.clipboard.writeText() succeeds when permission granted</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
promise_test(async () => {
|
||||
test_driver.set_permission({name: 'clipboard-write'}, 'granted');
|
||||
await navigator.clipboard.writeText('xyz');
|
||||
}, 'navigator.clipboard.writeText() succeeds when permission granted');
|
||||
</script>
|
|
@ -49,10 +49,6 @@
|
|||
const big = 3000;
|
||||
const small = 150;
|
||||
setup({ explicit_done: true });
|
||||
window.addEventListener("load", function() {
|
||||
// Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
|
||||
requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
|
||||
});
|
||||
function fontSize(element) {
|
||||
return parseFloat((/(.+)px/).exec(getComputedStyle(element).
|
||||
getPropertyValue("font-size"))[1]);
|
||||
|
@ -66,96 +62,97 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
function runTests() {
|
||||
window.addEventListener("load", function() {
|
||||
document.fonts.ready.then(function() {
|
||||
test(function() {
|
||||
CheckFontSizes("scale80-40-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * .8,
|
||||
"2": big * .71 * .71 * .71 * .4,
|
||||
"3": big * .71 * .71 * .71 * .4 * .71,
|
||||
"5": big * .71 * .71 * .71 * .4 * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("scale80-40-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * (.4 / .8)),
|
||||
"0": small / (.71 * .71 * .71 * .4),
|
||||
"-1": small / (.71 * .71 * .71 * .4 * .71),
|
||||
"-3": small / (.71 * .71 * .71 * .4 * .71 * .71 * .71)
|
||||
});
|
||||
}, "scriptPercentScaleDown=80, scriptScriptPercentScaleDown=40");
|
||||
|
||||
test(function() {
|
||||
CheckFontSizes("scale80-40-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * .8,
|
||||
"2": big * .71 * .71 * .71 * .4,
|
||||
"3": big * .71 * .71 * .71 * .4 * .71,
|
||||
"5": big * .71 * .71 * .71 * .4 * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("scale80-40-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * (.4 / .8)),
|
||||
"0": small / (.71 * .71 * .71 * .4),
|
||||
"-1": small / (.71 * .71 * .71 * .4 * .71),
|
||||
"-3": small / (.71 * .71 * .71 * .4 * .71 * .71 * .71)
|
||||
});
|
||||
}, "scriptPercentScaleDown=80, scriptScriptPercentScaleDown=40");
|
||||
test(function() {
|
||||
var scriptPercentScaleDown = .71;
|
||||
CheckFontSizes("scale0-40-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * scriptPercentScaleDown,
|
||||
"2": big * .71 * .71 * .71 * .4,
|
||||
"3": big * .71 * .71 * .71 * .4 * .71,
|
||||
"5": big * .71 * .71 * .71 * .4 * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("scale0-40-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * (.4 / scriptPercentScaleDown)),
|
||||
"0": small / (.71 * .71 * .71 * .4),
|
||||
"-1": small / (.71 * .71 * .71 * .4 * .71),
|
||||
"-3": small / (.71 * .71 * .71 * .4 * .71 * .71 * .71)
|
||||
});
|
||||
}, "scriptPercentScaleDown=0, scriptScriptPercentScaleDown=40");
|
||||
|
||||
test(function() {
|
||||
var scriptPercentScaleDown = .71;
|
||||
CheckFontSizes("scale0-40-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * scriptPercentScaleDown,
|
||||
"2": big * .71 * .71 * .71 * .4,
|
||||
"3": big * .71 * .71 * .71 * .4 * .71,
|
||||
"5": big * .71 * .71 * .71 * .4 * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("scale0-40-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * (.4 / scriptPercentScaleDown)),
|
||||
"0": small / (.71 * .71 * .71 * .4),
|
||||
"-1": small / (.71 * .71 * .71 * .4 * .71),
|
||||
"-3": small / (.71 * .71 * .71 * .4 * .71 * .71 * .71)
|
||||
});
|
||||
}, "scriptPercentScaleDown=0, scriptScriptPercentScaleDown=40");
|
||||
test(function() {
|
||||
var scriptScriptPercentScaleDown = 0.5041;
|
||||
CheckFontSizes("scale80-0-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * .8,
|
||||
"2": big * .71 * .71 * .71 * scriptScriptPercentScaleDown,
|
||||
"3": big * .71 * .71 * .71 * scriptScriptPercentScaleDown * .71,
|
||||
"5": big * .71 * .71 * .71 * scriptScriptPercentScaleDown * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("scale80-0-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * (scriptScriptPercentScaleDown / .8)),
|
||||
"0": small / (.71 * .71 * .71 * scriptScriptPercentScaleDown),
|
||||
"-1": small / (.71 * .71 * .71 * scriptScriptPercentScaleDown * .71),
|
||||
"-3": small / (.71 * .71 * .71 * scriptScriptPercentScaleDown * .71 * .71 * .71)
|
||||
});
|
||||
}, "scriptPercentScaleDown=80, scriptScriptPercentScaleDown=0");
|
||||
|
||||
test(function() {
|
||||
var scriptScriptPercentScaleDown = 0.5041;
|
||||
CheckFontSizes("scale80-0-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * .8,
|
||||
"2": big * .71 * .71 * .71 * scriptScriptPercentScaleDown,
|
||||
"3": big * .71 * .71 * .71 * scriptScriptPercentScaleDown * .71,
|
||||
"5": big * .71 * .71 * .71 * scriptScriptPercentScaleDown * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("scale80-0-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * (scriptScriptPercentScaleDown / .8)),
|
||||
"0": small / (.71 * .71 * .71 * scriptScriptPercentScaleDown),
|
||||
"-1": small / (.71 * .71 * .71 * scriptScriptPercentScaleDown * .71),
|
||||
"-3": small / (.71 * .71 * .71 * scriptScriptPercentScaleDown * .71 * .71 * .71)
|
||||
});
|
||||
}, "scriptPercentScaleDown=80, scriptScriptPercentScaleDown=0");
|
||||
test(function() {
|
||||
CheckFontSizes("default-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * .71,
|
||||
"2": big * .71 * .71 * .71 * .71 * .71,
|
||||
"3": big * .71 * .71 * .71 * .71 * .71 * .71,
|
||||
"5": big * .71 * .71 * .71 * .71 * .71 * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("default-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * .71),
|
||||
"0": small / (.71 * .71 * .71 * .71 * .71),
|
||||
"-1": small / (.71 * .71 * .71 * .71 * .71 * .71),
|
||||
"-3": small / (.71 * .71 * .71 * .71 * .71 * .71 * .71 * .71)
|
||||
});
|
||||
}, "No MATH table");
|
||||
|
||||
test(function() {
|
||||
CheckFontSizes("default-scaledown", {
|
||||
"-3": big,
|
||||
"-1": big * .71 * .71,
|
||||
"0": big * .71 * .71 * .71,
|
||||
"1": big * .71 * .71 * .71 * .71,
|
||||
"2": big * .71 * .71 * .71 * .71 * .71,
|
||||
"3": big * .71 * .71 * .71 * .71 * .71 * .71,
|
||||
"5": big * .71 * .71 * .71 * .71 * .71 * .71 * .71 * .71
|
||||
});
|
||||
CheckFontSizes("default-scaleup", {
|
||||
"5": small,
|
||||
"3": small / (.71 * .71),
|
||||
"2": small / (.71 * .71 * .71),
|
||||
"1": small / (.71 * .71 * .71 * .71),
|
||||
"0": small / (.71 * .71 * .71 * .71 * .71),
|
||||
"-1": small / (.71 * .71 * .71 * .71 * .71 * .71),
|
||||
"-3": small / (.71 * .71 * .71 * .71 * .71 * .71 * .71 * .71)
|
||||
});
|
||||
}, "No MATH table");
|
||||
|
||||
done();
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<!doctype html>
|
||||
<title>CSS Pseudo Element API IDL tests</title>
|
||||
<meta name="timeout" content="long">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#cssom">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
|
|
@ -2,10 +2,12 @@
|
|||
<title>CSS aspect-ratio: div block size</title>
|
||||
<link rel="author" title="Google LLC" href="https://www.google.com/">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
|
||||
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5060">
|
||||
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
|
||||
<meta name="assert" content="Aspect ratio should only be used if a width was specified.">
|
||||
<meta name="assert" content="Aspect ratio should be used even if width and height are auto.">
|
||||
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
|
||||
<div style="background: red; aspect-ratio: 1/1;"></div>
|
||||
<div style="background: green; width: 100px; height: 100px;"></div>
|
||||
<div style="width: 100px;">
|
||||
<div style="background: green; aspect-ratio: 1/1;"></div>
|
||||
</div>
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<script>
|
||||
onload = function() {
|
||||
test(function() {
|
||||
assert_not_equals(document.body.offsetHeight, document.body.offsetWidth);
|
||||
}, "body height is different from width");
|
||||
assert_equals(document.body.offsetHeight, document.body.offsetWidth);
|
||||
}, "body height equals width");
|
||||
};
|
||||
</script>
|
||||
<body style="aspect-ratio: 1/1;">
|
||||
|
|
|
@ -31,3 +31,14 @@ To run Safari Technology Preview instead, use the `--channel=preview` argument:
|
|||
```
|
||||
./wpt run --channel=preview safari [test_list]
|
||||
```
|
||||
|
||||
## Debugging
|
||||
|
||||
To debug problems with `safaridriver`, add the `--webdriver-arg=--diagnose`
|
||||
argument:
|
||||
```
|
||||
./wpt run --channel=preview --webdriver-arg=--diagnose safari [test_list]
|
||||
```
|
||||
|
||||
The logs will be in `~/Library/Logs/com.apple.WebDriver/`.
|
||||
See `man safaridriver` for more information.
|
||||
|
|
|
@ -28,8 +28,8 @@ function verifyEvent(entry, eventType, targetId, isFirst=false, minDuration=104,
|
|||
assert_equals(entry.entryType, 'event');
|
||||
assert_greater_than_equal(entry.duration, minDuration,
|
||||
"The entry's duration should be greater than or equal to " + minDuration + " ms.");
|
||||
assert_greater_than(entry.processingStart, entry.startTime,
|
||||
"The entry's processingStart should be greater than startTime.");
|
||||
assert_greater_than_equal(entry.processingStart, entry.startTime,
|
||||
"The entry's processingStart should be greater than or equal to startTime.");
|
||||
assert_greater_than_equal(entry.processingEnd, entry.processingStart,
|
||||
"The entry's processingEnd must be at least as large as processingStart.");
|
||||
// |duration| is a number rounded to the nearest 8 ms, so add 4 to get a lower bound
|
||||
|
@ -122,9 +122,9 @@ async function testDuration(t, id, numEntries, dur, fastDur, slowDur) {
|
|||
return Promise.all([observerPromise, clicksPromise]);
|
||||
}
|
||||
|
||||
// Apply events that trigger an event of the given |eventType| to be dispatched to the |target|. Some
|
||||
// of these assume that the target is not on the top left corner of the screen, which means that
|
||||
// (0, 0) of the viewport is outside of the |target|.
|
||||
// Apply events that trigger an event of the given |eventType| to be dispatched to the
|
||||
// |target|. Some of these assume that the target is not on the top left corner of the
|
||||
// screen, which means that (0, 0) of the viewport is outside of the |target|.
|
||||
function applyAction(eventType, target) {
|
||||
const actions = new test_driver.Actions();
|
||||
if (eventType === 'auxclick') {
|
||||
|
@ -167,16 +167,25 @@ function applyAction(eventType, target) {
|
|||
}
|
||||
|
||||
function requiresListener(eventType) {
|
||||
return ['mouseenter', 'mouseleave', 'pointerdown', 'pointerenter', 'pointerleave', 'pointerout', 'pointerover', 'pointerup'].includes(eventType);
|
||||
return ['mouseenter',
|
||||
'mouseleave',
|
||||
'pointerdown',
|
||||
'pointerenter',
|
||||
'pointerleave',
|
||||
'pointerout',
|
||||
'pointerover',
|
||||
'pointerup'
|
||||
].includes(eventType);
|
||||
}
|
||||
|
||||
function notCancelable(eventType) {
|
||||
return ['mouseenter', 'mouseleave', 'pointerenter', 'pointerleave'].includes(eventType);
|
||||
}
|
||||
|
||||
// Tests the given |eventType| by creating events whose target are the element with id 'target'.
|
||||
// The test assumes that such element already exists. |looseCount| is set for events for which
|
||||
// events would occur for other elements besides the target, so the counts will be larger.
|
||||
// Tests the given |eventType| by creating events whose target are the element with id
|
||||
// 'target'. The test assumes that such element already exists. |looseCount| is set for
|
||||
// eventTypes for which events would occur for other elements besides the target, so the
|
||||
// counts will be larger.
|
||||
async function testEventType(t, eventType, looseCount=false) {
|
||||
assert_implements(window.EventCounts, "Event Counts isn't supported");
|
||||
assert_equals(performance.eventCounts.get(eventType), 0);
|
||||
|
@ -192,7 +201,8 @@ async function testEventType(t, eventType, looseCount=false) {
|
|||
assert_greater_than_equal(performance.eventCounts.get(eventType), 2,
|
||||
`Should have at least 2 ${eventType} events`)
|
||||
} else {
|
||||
assert_equals(performance.eventCounts.get(eventType), 2, `Should have 2 ${eventType} events`);
|
||||
assert_equals(performance.eventCounts.get(eventType), 2,
|
||||
`Should have 2 ${eventType} events`);
|
||||
}
|
||||
// The durationThreshold used by the observer. A slow events needs to be slower than that.
|
||||
const durationThreshold = 16;
|
||||
|
@ -211,7 +221,8 @@ async function testEventType(t, eventType, looseCount=false) {
|
|||
entry = eventTypeEntries[0];
|
||||
assert_equals(eventTypeEntries.length, 1);
|
||||
} else {
|
||||
// The other events could also be considered slow. Find the one with the correct target.
|
||||
// The other events could also be considered slow. Find the one with the correct
|
||||
// target.
|
||||
eventTypeEntries.forEach(e => {
|
||||
if (e.target === document.getElementById('target'))
|
||||
entry = e;
|
||||
|
@ -229,7 +240,8 @@ async function testEventType(t, eventType, looseCount=false) {
|
|||
assert_greater_than_equal(performance.eventCounts.get(eventType), 3,
|
||||
`Should have at least 3 ${eventType} events`)
|
||||
} else {
|
||||
assert_equals(performance.eventCounts.get(eventType), 3, `Should have 3 ${eventType} events`);
|
||||
assert_equals(performance.eventCounts.get(eventType), 3,
|
||||
`Should have 3 ${eventType} events`);
|
||||
}
|
||||
resolve();
|
||||
})).observe({type: 'event', durationThreshold: durationThreshold});
|
||||
|
@ -237,4 +249,4 @@ async function testEventType(t, eventType, looseCount=false) {
|
|||
// Cause a slow event.
|
||||
let actionPromise = applyAction(eventType, target);
|
||||
return Promise.all([actionPromise, observerPromise]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,17 +10,17 @@
|
|||
|
||||
td, th {
|
||||
border: 1px solid;
|
||||
border-bottom-color: black;
|
||||
border-left-color: purple;
|
||||
border-right-color: orange;
|
||||
border-top-color: green;
|
||||
border-bottom-color: black !important;
|
||||
border-left-color: purple !important;
|
||||
border-right-color: orange !important;
|
||||
border-top-color: green !important;
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background-color: blue;
|
||||
color: red;
|
||||
background-color: blue !important;
|
||||
color: red !important;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// META: script=/resources/WebIDLParser.js
|
||||
// META: script=/resources/idlharness.js
|
||||
// META: timeout=long
|
||||
|
||||
// https://w3c.github.io/gamepad/
|
||||
|
||||
|
|
|
@ -221,16 +221,18 @@ function runGenericSensorTests(sensorName,
|
|||
sensor_test(async (t, sensorProvider) => {
|
||||
assert_true(sensorName in self);
|
||||
const sensor1 = new sensorType();
|
||||
const sensorWatcher = new EventWatcher(t, sensor1, ["reading", "error"]);
|
||||
const sensorWatcher1 = new EventWatcher(t, sensor1, ["reading", "error"]);
|
||||
sensor1.start();
|
||||
|
||||
const sensor2 = new sensorType();
|
||||
const sensorWatcher2 = new EventWatcher(t, sensor2, ["reading", "error"]);
|
||||
sensor2.start();
|
||||
|
||||
const mockSensor = await sensorProvider.getCreatedSensor(sensorName);
|
||||
await mockSensor.setSensorReading(readings);
|
||||
|
||||
await sensorWatcher.wait_for("reading");
|
||||
await Promise.all([sensorWatcher1.wait_for("reading"),
|
||||
sensorWatcher2.wait_for("reading")]);
|
||||
const expected = new RingBuffer(expectedReadings).next().value;
|
||||
// Reading values are correct for both sensors.
|
||||
assert_true(verificationFunction(expected, sensor1));
|
||||
|
@ -428,41 +430,6 @@ function runGenericSensorTests(sensorName,
|
|||
assert_greater_than(fastCounter, 2, "Fast sensor overtakes the slow one");
|
||||
}, `${sensorName}: frequency hint works.`);
|
||||
|
||||
sensor_test(async (t, sensorProvider) => {
|
||||
assert_true(sensorName in self);
|
||||
// Create a focused editbox inside a cross-origin iframe,
|
||||
// sensor notification must suspend.
|
||||
const iframeSrc = 'data:text/html;charset=utf-8,<html><body>'
|
||||
+ '<input type="text" autofocus></body></html>';
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.src = encodeURI(iframeSrc);
|
||||
|
||||
const sensor = new sensorType();
|
||||
const sensorWatcher = new EventWatcher(t, sensor, ["reading", "error"]);
|
||||
sensor.start();
|
||||
|
||||
const mockSensor = await sensorProvider.getCreatedSensor(sensorName);
|
||||
await mockSensor.setSensorReading(readings);
|
||||
|
||||
await sensorWatcher.wait_for("reading");
|
||||
const expected = new RingBuffer(expectedReadings).next().value;
|
||||
assert_true(verificationFunction(expected, sensor));
|
||||
const cachedTimestamp1 = sensor.timestamp;
|
||||
|
||||
const iframeWatcher = new EventWatcher(t, iframe, "load");
|
||||
document.body.appendChild(iframe);
|
||||
await iframeWatcher.wait_for("load");
|
||||
const cachedTimestamp2 = sensor.timestamp;
|
||||
assert_equals(cachedTimestamp1, cachedTimestamp2);
|
||||
|
||||
iframe.remove();
|
||||
await sensorWatcher.wait_for("reading");
|
||||
assert_greater_than(sensor.timestamp, cachedTimestamp1);
|
||||
|
||||
sensor.stop();
|
||||
}, `${sensorName}: sensor receives suspend / resume notifications when\
|
||||
cross-origin subframe is focused.`);
|
||||
|
||||
// Re-enable after https://github.com/w3c/sensors/issues/361 is fixed.
|
||||
// test(() => {
|
||||
// assert_throws_dom("NotSupportedError",
|
||||
|
@ -501,7 +468,8 @@ function runGenericSensorTests(sensorName,
|
|||
assert_true(sensorName in self);
|
||||
const sensor1 = new sensorType({frequency: 60});
|
||||
const sensor2 = new sensorType({frequency: 60, referenceFrame: "screen"});
|
||||
const sensorWatcher = new EventWatcher(t, sensor1, ["reading", "error"]);
|
||||
const sensorWatcher1 = new EventWatcher(t, sensor1, ["reading", "error"]);
|
||||
const sensorWatcher2 = new EventWatcher(t, sensor1, ["reading", "error"]);
|
||||
|
||||
sensor1.start();
|
||||
sensor2.start();
|
||||
|
@ -509,7 +477,8 @@ function runGenericSensorTests(sensorName,
|
|||
const mockSensor = await sensorProvider.getCreatedSensor(sensorName);
|
||||
await mockSensor.setSensorReading(readings);
|
||||
|
||||
await sensorWatcher.wait_for("reading");
|
||||
await Promise.all([sensorWatcher1.wait_for("reading"),
|
||||
sensorWatcher2.wait_for("reading")]);
|
||||
|
||||
const expected = new RingBuffer(expectedReadings).next().value;
|
||||
const expectedRemapped =
|
||||
|
|
|
@ -53,12 +53,13 @@ async function initialize_generic_sensor_tests() {
|
|||
|
||||
function sensor_test(func, name, properties) {
|
||||
promise_test(async (t) => {
|
||||
t.add_cleanup(() => {
|
||||
if (sensorTest)
|
||||
return sensorTest.reset();
|
||||
});
|
||||
|
||||
let sensorTest = await initialize_generic_sensor_tests();
|
||||
try {
|
||||
await func(t, sensorTest.getSensorProvider());
|
||||
} finally {
|
||||
await sensorTest.reset();
|
||||
};
|
||||
return func(t, sensorTest.getSensorProvider());
|
||||
}, name, properties);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title>Relevant mutations on deferred loading=lazy images should not trigger
|
||||
a request</title>
|
||||
<link rel="author" title="Dom Farolino" href="mailto:dom@chromium.org">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/images.html#updating-the-image-data">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
</head>
|
||||
|
||||
<script>
|
||||
let below_viewport_1_loaded = false,
|
||||
below_viewport_2_loaded = false,
|
||||
below_viewport_3_loaded = false
|
||||
|
||||
// For general lazy loading behavior.
|
||||
promise_test(() => {
|
||||
// When the page loads, start the rest of the tests.
|
||||
return new Promise(resolve => {
|
||||
window.addEventListener("load", e => {
|
||||
const kAssertion = 'image should never load';
|
||||
assert_false(below_viewport_1_loaded, `below-viewport-1 ${kAssertion}`);
|
||||
assert_false(below_viewport_2_loaded, `below-viewport-2 ${kAssertion}`);
|
||||
assert_false(below_viewport_3_loaded, `below-viewport-3 ${kAssertion}`);
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}, "Images are lazyloaded");
|
||||
|
||||
// For `referrerPolicy` attribute mutations.
|
||||
promise_test(t => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const below_viewport_1 = document.querySelector('img#below-viewport-1');
|
||||
below_viewport_1.onload = reject;
|
||||
below_viewport_1.onerror = reject;
|
||||
t.step_timeout(resolve, 1000);
|
||||
|
||||
below_viewport_1.referrerPolicy = 'no-referrer';
|
||||
});
|
||||
}, "Image referrerPolicy mutation does not cause deferred loading=lazy " +
|
||||
"images to be fetched");
|
||||
|
||||
// For `crossOrigin` attribute mutations.
|
||||
promise_test(t => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const below_viewport_2 = document.querySelector('img#below-viewport-2');
|
||||
below_viewport_2.onload = reject;
|
||||
below_viewport_2.onerror = reject;
|
||||
t.step_timeout(resolve, 1000);
|
||||
|
||||
below_viewport_2.crossOrigin = 'anonymous';
|
||||
});
|
||||
}, "Image crossOrigin mutation does not cause deferred loading=lazy " +
|
||||
"images to be fetched");
|
||||
|
||||
// For `src` attribute mutations.
|
||||
promise_test(t => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const below_viewport_3 = document.querySelector('img#below-viewport-3');
|
||||
below_viewport_3.onload = reject;
|
||||
below_viewport_3.onerror = reject;
|
||||
t.step_timeout(resolve, 1000);
|
||||
|
||||
below_viewport_3.src = "resources/image.png?change";
|
||||
});
|
||||
}, "Image src mutation does not cause deferred loading=lazy " +
|
||||
"images to be fetched");
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<div style="height:1000vh;"></div>
|
||||
<img id="below-viewport-1" src="resources/image.png?1" loading="lazy"
|
||||
onload="below_viewport_1_loaded = true"
|
||||
onerror="below_viewport_1_loaded = true">
|
||||
|
||||
<img id="below-viewport-2" src="resources/image.png?2" loading="lazy"
|
||||
onload="below_viewport_2_loaded = true"
|
||||
onerror="below_viewport_2_loaded = true">
|
||||
|
||||
<img id="below-viewport-3" src="resources/image.png?3" loading="lazy"
|
||||
onload="below_viewport_3_loaded = true"
|
||||
onerror="below_viewport_3_loaded = true">
|
||||
</body>
|
|
@ -42,7 +42,19 @@ function testDialogCentering(writingMode, containerWritingMode, dialogWritingMod
|
|||
iframe.height = iframeHeight;
|
||||
iframe.onload = t.step_func_done(() => {
|
||||
const dialog = iframe.contentDocument.querySelector("dialog");
|
||||
assert_equals(iframe.contentWindow.getComputedStyle(dialog)[property], numericValue + "px");
|
||||
const dialogStyle = iframe.contentWindow.getComputedStyle(dialog);
|
||||
assert_equals(dialogStyle[property], numericValue + "px");
|
||||
assert_equals(dialogStyle['inset-inline-start'], "0px");
|
||||
assert_equals(dialogStyle['inset-inline-end'], "0px");
|
||||
|
||||
const dialogWM = dialogWritingMode || containerWritingMode || writingMode || "horizontal-tb";
|
||||
if (dialogWM.startsWith("vertical")) {
|
||||
assert_equals(dialogStyle['top'], "0px");
|
||||
assert_equals(dialogStyle['bottom'], "0px");
|
||||
} else {
|
||||
assert_equals(dialogStyle['left'], "0px");
|
||||
assert_equals(dialogStyle['right'], "0px");
|
||||
}
|
||||
});
|
||||
document.body.appendChild(iframe);
|
||||
}, writingMode + (containerWritingMode ? ` (container ${containerWritingMode})` : "") +
|
||||
|
|
|
@ -262,7 +262,9 @@ GENERATE_TESTS: domparsing/createContextualFragment.html
|
|||
GENERATE_TESTS: domxpath/001.html
|
||||
GENERATE_TESTS: domxpath/002.html
|
||||
GENERATE_TESTS: mediacapture-image/MediaStreamTrack-applyConstraints-reject.html
|
||||
GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getCapabilities.html
|
||||
GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getConstraints-fast.html
|
||||
GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getSettings.html
|
||||
GENERATE_TESTS: mediacapture-image/setOptions-reject.html
|
||||
GENERATE_TESTS: html/semantics/scripting-1/the-template-element/template-element/template-as-a-descendant.html
|
||||
GENERATE_TESTS: html/syntax/parsing/Document.getElementsByTagName-foreign-01.html
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
|
||||
<body>
|
||||
<canvas id='canvas' width=10 height=10/>
|
||||
|
@ -11,6 +13,9 @@
|
|||
// service implementation, are returned by MediaStreamTrack.getSettings().
|
||||
|
||||
image_capture_test(async t => {
|
||||
await test_driver.set_permission({name: 'camera', panTiltZoom: true},
|
||||
'granted', false);
|
||||
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
|
@ -98,6 +103,40 @@ image_capture_test(async t => {
|
|||
|
||||
assert_equals(constraints.advanced[0].torch, settings.torch, 'torch');
|
||||
|
||||
}, 'exercises an applyConstraints() - getSettings() cycle');
|
||||
}, 'exercises an applyConstraints() - getSettings() cycle with PTZ permission granted');
|
||||
|
||||
|
||||
// This test verifies that the PTZ |constraints| configured in the mock Mojo
|
||||
// service implementation can't be applied if PTZ permission is denied.
|
||||
|
||||
image_capture_test(async t => {
|
||||
await test_driver.set_permission({name: 'camera', panTiltZoom: true},
|
||||
'denied', false);
|
||||
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
context.fillRect(0, 0, 10, 10);
|
||||
|
||||
let stream = canvas.captureStream();
|
||||
let videoTrack = stream.getVideoTracks()[0];
|
||||
|
||||
// |videoTrack|'s capabilities gathering, just like the actual capture, is
|
||||
// a process kicked off right after creation, we introduce a small delay
|
||||
// to allow for those to be collected, since they are needed to understand
|
||||
// which constraints are supported in applyConstraints().
|
||||
// TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
|
||||
await new Promise(resolve => step_timeout(resolve, 100));
|
||||
|
||||
const constraints = [{ pan: 8 }, { tilt: 9 }];
|
||||
await Promise.all(constraints.map(async constraint =>
|
||||
promise_rejects_dom(
|
||||
t, 'NotAllowedError',
|
||||
videoTrack.applyConstraints({ advanced: [constraint] }),
|
||||
"applyConstraints should throw a NotAllowedError for " +
|
||||
JSON.stringify(constraint))
|
||||
));
|
||||
|
||||
}, 'exercises an applyConstraints() with PTZ permission denied');
|
||||
|
||||
</script>
|
|
@ -1,6 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
|
||||
<body>
|
||||
<canvas id='canvas' width=10 height=10/>
|
||||
|
@ -16,6 +18,9 @@ context.fillRect(0, 0, 10, 10);
|
|||
// passed constraint is unsupported or outside its allowed range.
|
||||
var makePromiseTest = function(getConstraint) {
|
||||
image_capture_test(async (t, imageCaptureTest) => {
|
||||
await test_driver.set_permission({name: 'camera', panTiltZoom: true},
|
||||
'granted', false);
|
||||
|
||||
imageCaptureTest.mockImageCapture().state().supportsTorch = false;
|
||||
|
||||
let stream = canvas.captureStream();
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
|
||||
<body>
|
||||
<canvas id='canvas' width=10 height=10/>
|
||||
|
@ -13,6 +15,9 @@ const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];
|
|||
// a mock Mojo service implementation.
|
||||
|
||||
image_capture_test(async (t, imageCaptureTest) => {
|
||||
await test_driver.set_permission({name: 'camera', panTiltZoom: true},
|
||||
'granted', false);
|
||||
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
|
@ -113,6 +118,7 @@ image_capture_test(async (t, imageCaptureTest) => {
|
|||
|
||||
assert_equals(constraintsDict.pan, theMock.options().pan, 'pan');
|
||||
assert_equals(constraintsDict.tilt, theMock.options().tilt, 'tilt');
|
||||
assert_equals(constraintsDict.zoom, theMock.options().zoom, 'zoom');
|
||||
|
||||
assert_equals(constraintsDict.torch, theMock.options().torch, 'torch');
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
|
||||
<body>
|
||||
<canvas id='canvas' width=10 height=10/>
|
||||
|
@ -11,154 +13,174 @@ const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];
|
|||
|
||||
// This test verifies that MediaTrackCapabilities are returned upon
|
||||
// MediaStreamTrack.getCapabilities(), with a mock Mojo service implementation.
|
||||
// When PTZ permission is denied though, PTZ capabilities are not available.
|
||||
|
||||
image_capture_test(async (t, imageCaptureTest) => {
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
context.fillRect(0, 0, 10, 10);
|
||||
function makeImageCaptureTest(hasPanTiltZoomPermissionGranted) {
|
||||
image_capture_test(async (t, imageCaptureTest) => {
|
||||
const ptzPermission = hasPanTiltZoomPermissionGranted ? 'granted' : 'denied';
|
||||
await test_driver.set_permission({name: 'camera', panTiltZoom: true},
|
||||
ptzPermission, false);
|
||||
|
||||
let mockCapabilities = imageCaptureTest.mockImageCapture().state();
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
context.fillRect(0, 0, 10, 10);
|
||||
|
||||
// |stream| must be created _after_ |mock| is constructed to give the
|
||||
// latter time to override the bindings.
|
||||
let stream = canvas.captureStream();
|
||||
assert_equals(stream.getAudioTracks().length, 0);
|
||||
assert_equals(stream.getVideoTracks().length, 1);
|
||||
let mockCapabilities = imageCaptureTest.mockImageCapture().state();
|
||||
|
||||
let videoTrack = stream.getVideoTracks()[0];
|
||||
assert_equals(typeof videoTrack.getCapabilities, 'function');
|
||||
// |stream| must be created _after_ |mock| is constructed to give the
|
||||
// latter time to override the bindings.
|
||||
let stream = canvas.captureStream();
|
||||
assert_equals(stream.getAudioTracks().length, 0);
|
||||
assert_equals(stream.getVideoTracks().length, 1);
|
||||
|
||||
// |videoTrack|'s capabilities gathering, just like the actual capture, is
|
||||
// a process kicked off right after creation, we introduce a small delay
|
||||
// to allow for those to be collected.
|
||||
// TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
|
||||
await new Promise(resolve => step_timeout(resolve, 100));
|
||||
let videoTrack = stream.getVideoTracks()[0];
|
||||
assert_equals(typeof videoTrack.getCapabilities, 'function');
|
||||
|
||||
let capabilities = videoTrack.getCapabilities();
|
||||
assert_equals(typeof capabilities, 'object');
|
||||
// |videoTrack|'s capabilities gathering, just like the actual capture, is
|
||||
// a process kicked off right after creation, we introduce a small delay
|
||||
// to allow for those to be collected.
|
||||
// TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
|
||||
await new Promise(resolve => step_timeout(resolve, 100));
|
||||
|
||||
assert_equals(capabilities.whiteBalanceMode.length,
|
||||
mockCapabilities.supportedWhiteBalanceModes.length,
|
||||
'whiteBalanceMode');
|
||||
for (i = 0; i < capabilities.whiteBalanceMode.length; ++i) {
|
||||
assert_equals(
|
||||
capabilities.whiteBalanceMode[i],
|
||||
meteringModeNames[mockCapabilities
|
||||
.supportedWhiteBalanceModes[i]],
|
||||
'whiteBalanceMode');
|
||||
}
|
||||
let capabilities = videoTrack.getCapabilities();
|
||||
assert_equals(typeof capabilities, 'object');
|
||||
|
||||
assert_equals(capabilities.exposureMode.length,
|
||||
mockCapabilities.supportedExposureModes.length,
|
||||
'exposureMode');
|
||||
for (i = 0; i < capabilities.exposureMode.length; ++i) {
|
||||
assert_equals(
|
||||
capabilities.exposureMode[i],
|
||||
meteringModeNames[mockCapabilities.supportedExposureModes[i]],
|
||||
'exposureMode');
|
||||
}
|
||||
assert_equals(capabilities.whiteBalanceMode.length,
|
||||
mockCapabilities.supportedWhiteBalanceModes.length,
|
||||
'whiteBalanceMode');
|
||||
for (i = 0; i < capabilities.whiteBalanceMode.length; ++i) {
|
||||
assert_equals(
|
||||
capabilities.whiteBalanceMode[i],
|
||||
meteringModeNames[mockCapabilities
|
||||
.supportedWhiteBalanceModes[i]],
|
||||
'whiteBalanceMode');
|
||||
}
|
||||
|
||||
assert_equals(capabilities.focusMode.length,
|
||||
mockCapabilities.supportedFocusModes.length,
|
||||
'focusMode');
|
||||
for (i = 0; i < capabilities.focusMode.length; ++i) {
|
||||
assert_equals(
|
||||
capabilities.focusMode[i],
|
||||
meteringModeNames[mockCapabilities.supportedFocusModes[i]],
|
||||
'focusMode');
|
||||
}
|
||||
assert_equals(capabilities.exposureMode.length,
|
||||
mockCapabilities.supportedExposureModes.length,
|
||||
'exposureMode');
|
||||
for (i = 0; i < capabilities.exposureMode.length; ++i) {
|
||||
assert_equals(
|
||||
capabilities.exposureMode[i],
|
||||
meteringModeNames[mockCapabilities.supportedExposureModes[i]],
|
||||
'exposureMode');
|
||||
}
|
||||
|
||||
assert_true(capabilities.exposureCompensation instanceof
|
||||
MediaSettingsRange);
|
||||
assert_equals(capabilities.exposureCompensation.max,
|
||||
mockCapabilities.exposureCompensation.max);
|
||||
assert_equals(capabilities.exposureCompensation.min,
|
||||
mockCapabilities.exposureCompensation.min);
|
||||
assert_equals(capabilities.exposureCompensation.step,
|
||||
mockCapabilities.exposureCompensation.step);
|
||||
assert_equals(capabilities.focusMode.length,
|
||||
mockCapabilities.supportedFocusModes.length,
|
||||
'focusMode');
|
||||
for (i = 0; i < capabilities.focusMode.length; ++i) {
|
||||
assert_equals(
|
||||
capabilities.focusMode[i],
|
||||
meteringModeNames[mockCapabilities.supportedFocusModes[i]],
|
||||
'focusMode');
|
||||
}
|
||||
|
||||
assert_true(capabilities.exposureTime instanceof
|
||||
MediaSettingsRange);
|
||||
assert_equals(capabilities.exposureTime.max,
|
||||
mockCapabilities.exposureTime.max);
|
||||
assert_equals(capabilities.exposureTime.min,
|
||||
mockCapabilities.exposureTime.min);
|
||||
assert_equals(capabilities.exposureTime.step,
|
||||
mockCapabilities.exposureTime.step);
|
||||
assert_true(capabilities.exposureCompensation instanceof
|
||||
MediaSettingsRange);
|
||||
assert_equals(capabilities.exposureCompensation.max,
|
||||
mockCapabilities.exposureCompensation.max);
|
||||
assert_equals(capabilities.exposureCompensation.min,
|
||||
mockCapabilities.exposureCompensation.min);
|
||||
assert_equals(capabilities.exposureCompensation.step,
|
||||
mockCapabilities.exposureCompensation.step);
|
||||
|
||||
assert_true(capabilities.colorTemperature instanceof
|
||||
MediaSettingsRange);
|
||||
assert_equals(capabilities.colorTemperature.max,
|
||||
mockCapabilities.colorTemperature.max);
|
||||
assert_equals(capabilities.colorTemperature.min,
|
||||
mockCapabilities.colorTemperature.min);
|
||||
assert_equals(capabilities.colorTemperature.step,
|
||||
mockCapabilities.colorTemperature.step);
|
||||
assert_true(capabilities.exposureTime instanceof
|
||||
MediaSettingsRange);
|
||||
assert_equals(capabilities.exposureTime.max,
|
||||
mockCapabilities.exposureTime.max);
|
||||
assert_equals(capabilities.exposureTime.min,
|
||||
mockCapabilities.exposureTime.min);
|
||||
assert_equals(capabilities.exposureTime.step,
|
||||
mockCapabilities.exposureTime.step);
|
||||
|
||||
assert_true(capabilities.iso instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.iso.max, mockCapabilities.iso.max);
|
||||
assert_equals(capabilities.iso.min, mockCapabilities.iso.min);
|
||||
assert_equals(capabilities.iso.step, mockCapabilities.iso.step);
|
||||
assert_true(capabilities.colorTemperature instanceof
|
||||
MediaSettingsRange);
|
||||
assert_equals(capabilities.colorTemperature.max,
|
||||
mockCapabilities.colorTemperature.max);
|
||||
assert_equals(capabilities.colorTemperature.min,
|
||||
mockCapabilities.colorTemperature.min);
|
||||
assert_equals(capabilities.colorTemperature.step,
|
||||
mockCapabilities.colorTemperature.step);
|
||||
|
||||
assert_true(capabilities.brightness instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.brightness.max,
|
||||
mockCapabilities.brightness.max);
|
||||
assert_equals(capabilities.brightness.min,
|
||||
mockCapabilities.brightness.min);
|
||||
assert_equals(capabilities.brightness.step,
|
||||
mockCapabilities.brightness.step);
|
||||
assert_true(capabilities.iso instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.iso.max, mockCapabilities.iso.max);
|
||||
assert_equals(capabilities.iso.min, mockCapabilities.iso.min);
|
||||
assert_equals(capabilities.iso.step, mockCapabilities.iso.step);
|
||||
|
||||
assert_true(capabilities.contrast instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.contrast.max,
|
||||
mockCapabilities.contrast.max);
|
||||
assert_equals(capabilities.contrast.min,
|
||||
mockCapabilities.contrast.min);
|
||||
assert_equals(capabilities.contrast.step,
|
||||
mockCapabilities.contrast.step);
|
||||
assert_true(capabilities.brightness instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.brightness.max,
|
||||
mockCapabilities.brightness.max);
|
||||
assert_equals(capabilities.brightness.min,
|
||||
mockCapabilities.brightness.min);
|
||||
assert_equals(capabilities.brightness.step,
|
||||
mockCapabilities.brightness.step);
|
||||
|
||||
assert_true(capabilities.saturation instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.saturation.max,
|
||||
mockCapabilities.saturation.max);
|
||||
assert_equals(capabilities.saturation.min,
|
||||
mockCapabilities.saturation.min);
|
||||
assert_equals(capabilities.saturation.step,
|
||||
mockCapabilities.saturation.step);
|
||||
assert_true(capabilities.contrast instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.contrast.max,
|
||||
mockCapabilities.contrast.max);
|
||||
assert_equals(capabilities.contrast.min,
|
||||
mockCapabilities.contrast.min);
|
||||
assert_equals(capabilities.contrast.step,
|
||||
mockCapabilities.contrast.step);
|
||||
|
||||
assert_true(capabilities.sharpness instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.sharpness.max,
|
||||
mockCapabilities.sharpness.max);
|
||||
assert_equals(capabilities.sharpness.min,
|
||||
mockCapabilities.sharpness.min);
|
||||
assert_equals(capabilities.sharpness.step,
|
||||
mockCapabilities.sharpness.step);
|
||||
assert_true(capabilities.saturation instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.saturation.max,
|
||||
mockCapabilities.saturation.max);
|
||||
assert_equals(capabilities.saturation.min,
|
||||
mockCapabilities.saturation.min);
|
||||
assert_equals(capabilities.saturation.step,
|
||||
mockCapabilities.saturation.step);
|
||||
|
||||
assert_true(capabilities.focusDistance instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.focusDistance.max,
|
||||
mockCapabilities.focusDistance.max);
|
||||
assert_equals(capabilities.focusDistance.min,
|
||||
mockCapabilities.focusDistance.min);
|
||||
assert_equals(capabilities.focusDistance.step,
|
||||
mockCapabilities.focusDistance.step);
|
||||
assert_true(capabilities.sharpness instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.sharpness.max,
|
||||
mockCapabilities.sharpness.max);
|
||||
assert_equals(capabilities.sharpness.min,
|
||||
mockCapabilities.sharpness.min);
|
||||
assert_equals(capabilities.sharpness.step,
|
||||
mockCapabilities.sharpness.step);
|
||||
|
||||
assert_true(capabilities.pan instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.pan.max, mockCapabilities.pan.max);
|
||||
assert_equals(capabilities.pan.min, mockCapabilities.pan.min);
|
||||
assert_equals(capabilities.pan.step, mockCapabilities.pan.step);
|
||||
assert_true(capabilities.focusDistance instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.focusDistance.max,
|
||||
mockCapabilities.focusDistance.max);
|
||||
assert_equals(capabilities.focusDistance.min,
|
||||
mockCapabilities.focusDistance.min);
|
||||
assert_equals(capabilities.focusDistance.step,
|
||||
mockCapabilities.focusDistance.step);
|
||||
|
||||
assert_true(capabilities.tilt instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.tilt.max, mockCapabilities.tilt.max);
|
||||
assert_equals(capabilities.tilt.min, mockCapabilities.tilt.min);
|
||||
assert_equals(capabilities.tilt.step, mockCapabilities.tilt.step);
|
||||
if (ptzPermission === 'granted') {
|
||||
assert_true(capabilities.pan instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.pan.max, mockCapabilities.pan.max);
|
||||
assert_equals(capabilities.pan.min, mockCapabilities.pan.min);
|
||||
assert_equals(capabilities.pan.step, mockCapabilities.pan.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);
|
||||
assert_true(capabilities.tilt instanceof MediaSettingsRange);
|
||||
assert_equals(capabilities.tilt.max, mockCapabilities.tilt.max);
|
||||
assert_equals(capabilities.tilt.min, mockCapabilities.tilt.min);
|
||||
assert_equals(capabilities.tilt.step, mockCapabilities.tilt.step);
|
||||
} else if (ptzPermission === 'denied') {
|
||||
assert_false('pan' in capabilities);
|
||||
assert_false('tilt' 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,
|
||||
'torch');
|
||||
|
||||
}, 'exercises MediaStreamTrack.getCapabilities()');
|
||||
assert_equals(capabilities.torch, mockCapabilities.supportsTorch,
|
||||
'torch');
|
||||
});
|
||||
}
|
||||
|
||||
generate_tests(makeImageCaptureTest, [
|
||||
[
|
||||
"exercises MediaStreamTrack.getCapabilities() with PTZ permission denied",
|
||||
false,
|
||||
],
|
||||
[
|
||||
"exercises MediaStreamTrack.getCapabilities() with PTZ permission granted",
|
||||
true,
|
||||
],
|
||||
]);
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
|
||||
<body>
|
||||
<canvas id='canvas' width=10 height=10/>
|
||||
|
@ -11,63 +13,84 @@ const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];
|
|||
|
||||
// This test verifies that the settings defined in the mock Mojo service
|
||||
// implementation are the same as those returned by the corresponding
|
||||
// MediaStreamTrack.getSettings().
|
||||
// MediaStreamTrack.getSettings(), except for PTZ settings when PTZ
|
||||
// permission is denied.
|
||||
|
||||
image_capture_test(async (t, imageCaptureTest) => {
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
context.fillRect(0, 0, 10, 10);
|
||||
function makeImageCaptureTest(hasPanTiltZoomPermissionGranted) {
|
||||
image_capture_test(async (t, imageCaptureTest) => {
|
||||
const ptzPermission = hasPanTiltZoomPermissionGranted ? 'granted' : 'denied';
|
||||
await test_driver.set_permission({name: 'camera', panTiltZoom: true},
|
||||
ptzPermission, false);
|
||||
|
||||
let mockSettings = imageCaptureTest.mockImageCapture().state();
|
||||
let canvas = document.getElementById('canvas');
|
||||
let context = canvas.getContext('2d');
|
||||
context.fillStyle = 'red';
|
||||
context.fillRect(0, 0, 10, 10);
|
||||
|
||||
// |stream| must be created _after_ |mock| is constructed to give the
|
||||
// latter time to override the bindings.
|
||||
let stream = canvas.captureStream();
|
||||
let videoTrack = stream.getVideoTracks()[0];
|
||||
let mockSettings = imageCaptureTest.mockImageCapture().state();
|
||||
|
||||
// |videoTrack|s settings retrieval, just like the actual capture, is a
|
||||
// process kicked right after creation, we introduce a small delay to
|
||||
// allow for those to be collected.
|
||||
await new Promise(resolve => step_timeout(resolve, 100));
|
||||
// |stream| must be created _after_ |mock| is constructed to give the
|
||||
// latter time to override the bindings.
|
||||
let stream = canvas.captureStream();
|
||||
let videoTrack = stream.getVideoTracks()[0];
|
||||
|
||||
let settings = videoTrack.getSettings();
|
||||
assert_equals(typeof settings, 'object');
|
||||
// |videoTrack|s settings retrieval, just like the actual capture, is a
|
||||
// process kicked right after creation, we introduce a small delay to
|
||||
// allow for those to be collected.
|
||||
await new Promise(resolve => step_timeout(resolve, 100));
|
||||
|
||||
assert_equals(settings.whiteBalanceMode,
|
||||
meteringModeNames[mockSettings.currentWhiteBalanceMode],
|
||||
'whiteBalanceMode');
|
||||
assert_equals(settings.exposureMode,
|
||||
meteringModeNames[mockSettings.currentExposureMode],
|
||||
'exposureMode;');
|
||||
assert_equals(settings.focusMode,
|
||||
meteringModeNames[mockSettings.currentFocusMode],
|
||||
'focusMode');
|
||||
let settings = videoTrack.getSettings();
|
||||
assert_equals(typeof settings, 'object');
|
||||
|
||||
assert_point2d_array_approx_equals(
|
||||
settings.pointsOfInterest, mockSettings.pointsOfInterest, 0.01);
|
||||
assert_equals(settings.whiteBalanceMode,
|
||||
meteringModeNames[mockSettings.currentWhiteBalanceMode],
|
||||
'whiteBalanceMode');
|
||||
assert_equals(settings.exposureMode,
|
||||
meteringModeNames[mockSettings.currentExposureMode],
|
||||
'exposureMode;');
|
||||
assert_equals(settings.focusMode,
|
||||
meteringModeNames[mockSettings.currentFocusMode],
|
||||
'focusMode');
|
||||
|
||||
assert_equals(settings.exposureCompensation,
|
||||
mockSettings.exposureCompensation.current);
|
||||
assert_equals(settings.exposureTime,
|
||||
mockSettings.exposureTime.current);
|
||||
assert_equals(settings.colorTemperature,
|
||||
mockSettings.colorTemperature.current);
|
||||
assert_equals(settings.iso, mockSettings.iso.current);
|
||||
assert_point2d_array_approx_equals(
|
||||
settings.pointsOfInterest, mockSettings.pointsOfInterest, 0.01);
|
||||
|
||||
assert_equals(settings.brightness, mockSettings.brightness.current);
|
||||
assert_equals(settings.contrast, mockSettings.contrast.current);
|
||||
assert_equals(settings.saturation, mockSettings.saturation.current);
|
||||
assert_equals(settings.sharpness, mockSettings.sharpness.current);
|
||||
assert_equals(settings.exposureCompensation,
|
||||
mockSettings.exposureCompensation.current);
|
||||
assert_equals(settings.exposureTime,
|
||||
mockSettings.exposureTime.current);
|
||||
assert_equals(settings.colorTemperature,
|
||||
mockSettings.colorTemperature.current);
|
||||
assert_equals(settings.iso, mockSettings.iso.current);
|
||||
|
||||
assert_equals(settings.focusDistance, mockSettings.focusDistance.current);
|
||||
assert_equals(settings.brightness, mockSettings.brightness.current);
|
||||
assert_equals(settings.contrast, mockSettings.contrast.current);
|
||||
assert_equals(settings.saturation, mockSettings.saturation.current);
|
||||
assert_equals(settings.sharpness, mockSettings.sharpness.current);
|
||||
|
||||
assert_equals(settings.pan, mockSettings.pan.current);
|
||||
assert_equals(settings.tilt, mockSettings.tilt.current);
|
||||
assert_equals(settings.zoom, mockSettings.zoom.current);
|
||||
assert_equals(settings.focusDistance, mockSettings.focusDistance.current);
|
||||
|
||||
assert_equals(settings.torch, mockSettings.torch, 'torch');
|
||||
if (ptzPermission === 'granted') {
|
||||
assert_equals(settings.pan, mockSettings.pan.current);
|
||||
assert_equals(settings.tilt, mockSettings.tilt.current);
|
||||
} else if (ptzPermission === 'denied') {
|
||||
assert_false('pan' in settings);
|
||||
assert_false('tilt' in settings);
|
||||
}
|
||||
assert_equals(settings.zoom, mockSettings.zoom.current);
|
||||
|
||||
}, 'exercises MediaStreamTrack.getSettings()');
|
||||
assert_equals(settings.torch, mockSettings.torch, 'torch');
|
||||
});
|
||||
}
|
||||
|
||||
generate_tests(makeImageCaptureTest, [
|
||||
[
|
||||
"exercises MediaStreamTrack.getSettings() with PTZ permission denied",
|
||||
false,
|
||||
],
|
||||
[
|
||||
"exercises MediaStreamTrack.getSettings() with PTZ permission granted",
|
||||
true,
|
||||
],
|
||||
]);
|
||||
</script>
|
||||
|
|
|
@ -51,12 +51,13 @@ async function initialize_generic_sensor_tests() {
|
|||
|
||||
function sensor_test(func, name, properties) {
|
||||
promise_test(async (t) => {
|
||||
t.add_cleanup(() => {
|
||||
if (sensorTest)
|
||||
return sensorTest.reset();
|
||||
});
|
||||
|
||||
let sensorTest = await initialize_generic_sensor_tests();
|
||||
try {
|
||||
await func(t, sensorTest.getSensorProvider());
|
||||
} finally {
|
||||
await sensorTest.reset();
|
||||
};
|
||||
return func(t, sensorTest.getSensorProvider());
|
||||
}, name, properties);
|
||||
}
|
||||
|
||||
|
@ -91,7 +92,15 @@ function generateOrientationData(alpha, beta, gamma, absolute) {
|
|||
|
||||
async function setMockSensorDataForType(sensorProvider, sensorType, mockDataArray) {
|
||||
const createdSensor = await sensorProvider.getCreatedSensor(sensorType);
|
||||
return createdSensor.setSensorReading([mockDataArray]);
|
||||
// We call setSensorReadingAndUpdateSharedBuffer() rather than
|
||||
// setSensorReading() to accommodate Blink's Device Orientation
|
||||
// implementation, which uses its own timer to read the sensor's shared
|
||||
// memory buffer rather than relying on SensorReadingChanged(). This timer
|
||||
// may fire out of sync with the JS timer in MockSensor.startReading(), so
|
||||
// the former might read the shared memory buffer before the latter has
|
||||
// updated |this.buffer_|. We thus immediately update the buffer here
|
||||
// (without consuming data from the ring buffer).
|
||||
return createdSensor.setSensorReadingImmediately([mockDataArray]);
|
||||
}
|
||||
|
||||
// Device[Orientation|Motion]EventPump treat NaN as a missing value.
|
||||
|
|
|
@ -0,0 +1,130 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Parent is isolated, child1 is not isolated, child1 navigates to a different site, child2 gets inserted and is isolated, child1 navigates back</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script type="module">
|
||||
import { insertIframe, navigateIframe, waitForIframe, sendWasmModule,
|
||||
setBothDocumentDomains, sendWasmModuleBetween, accessDocumentBetween }
|
||||
from "./resources/helpers.mjs";
|
||||
|
||||
let frameWindow1, frame1, frameWindow2;
|
||||
promise_setup(async () => {
|
||||
frameWindow1 = await insertIframe("{{hosts[][www]}}");
|
||||
frame1 = document.querySelector("iframe");
|
||||
});
|
||||
|
||||
// Since they're different-origin, the parent's isolation request is respected,
|
||||
// as is the child's non-request. So the parent ends up in the origin-keyed
|
||||
// agent cluster and the child ends up in the site-keyed one.
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow1);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "Before navigation: parent to child1: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
await setBothDocumentDomains(frameWindow1);
|
||||
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow1.document;
|
||||
});
|
||||
}, "Before navigation: parent to child1: setting document.domain must not give sync access");
|
||||
|
||||
// Navigate the iframe to a different site. These, of course, must not be in the
|
||||
// same agent cluster.
|
||||
|
||||
promise_test(async () => {
|
||||
await navigateIframe(frame1, "{{hosts[alt][]}}");
|
||||
}, "Navigation");
|
||||
|
||||
// Now insert a second iframe, pointing to the same place as the first one
|
||||
// originally did, but this time with origin isolation enabled. Because of the
|
||||
// historical map of agent cluster keys for the browsing context group, the new
|
||||
// iframe should still end up in the site-keyed agent cluster.
|
||||
|
||||
promise_test(async () => {
|
||||
frameWindow2 = await insertIframe("{{hosts[][www]}}", "?1");
|
||||
}, "Inserting a second iframe");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow2);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "After navigation: parent to child2: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
await setBothDocumentDomains(frameWindow2);
|
||||
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow2.document;
|
||||
});
|
||||
}, "After navigation: parent to child2: setting document.domain must not give sync access");
|
||||
|
||||
// Now navigate the first iframe back. The resulting Document should be put in
|
||||
// the site agent cluster, together with the second iframe's Document.
|
||||
|
||||
promise_test(async () => {
|
||||
const waitPromise = waitForIframe(frame1);
|
||||
history.back();
|
||||
await waitPromise;
|
||||
|
||||
await setBothDocumentDomains(frameWindow1);
|
||||
}, "Going back in history (navigating back the first iframe)");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow1);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "After back: parent to child1: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
await setBothDocumentDomains(frameWindow2);
|
||||
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow1.document;
|
||||
});
|
||||
}, "After back: parent to child1: setting document.domain must not give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow2);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "After back: parent to child2: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
await setBothDocumentDomains(frameWindow1);
|
||||
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow1.document;
|
||||
});
|
||||
}, "After back: parent to child2: setting document.domain must not give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModuleBetween(frameWindow1, 1);
|
||||
|
||||
assert_equals(whatHappened, "WebAssembly.Module message received");
|
||||
}, "child1 to child2: message event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await accessDocumentBetween(frameWindow1, 1);
|
||||
|
||||
assert_equals(whatHappened, "accessed document successfully");
|
||||
}, "child1 to child2: setting document.domain must give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModuleBetween(frameWindow2, 0);
|
||||
|
||||
assert_equals(whatHappened, "WebAssembly.Module message received");
|
||||
}, "child2 to child1: message event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await accessDocumentBetween(frameWindow2, 0);
|
||||
|
||||
assert_equals(whatHappened, "accessed document successfully");
|
||||
}, "child2 to child1: setting document.domain must give sync access");
|
||||
</script>
|
|
@ -0,0 +1 @@
|
|||
Origin-Isolation: ?1
|
|
@ -0,0 +1,99 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Parent is isolated, child1 is not isolated, child1 navigates to a different site, child2 gets inserted and is isolated, child1 navigates back</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script type="module">
|
||||
import { insertIframe, navigateIframe, waitForIframe, sendWasmModule,
|
||||
setBothDocumentDomains, sendWasmModuleBetween, accessDocumentBetween }
|
||||
from "./resources/helpers.mjs";
|
||||
|
||||
let frame1, frameWindow1, frameWindow2, frameWindow3;
|
||||
promise_setup(async () => {
|
||||
frameWindow1 = await insertIframe("{{hosts[][www]}}");
|
||||
frame1 = document.querySelector("iframe");
|
||||
});
|
||||
|
||||
// Since they're different-origin, the parent's isolation request is respected,
|
||||
// as is the child's non-request. So the parent ends up in the origin-keyed
|
||||
// agent cluster and the child ends up in the site-keyed one.
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow1);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "Before: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
await setBothDocumentDomains(frameWindow1);
|
||||
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow1.document;
|
||||
});
|
||||
}, "Before: setting document.domain must not give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
frame1.remove();
|
||||
|
||||
frameWindow2 = await insertIframe("{{hosts[][www]}}", "?1");
|
||||
frameWindow3 = await insertIframe("{{hosts[][www1]}}");
|
||||
|
||||
await setBothDocumentDomains(frameWindow2);
|
||||
await setBothDocumentDomains(frameWindow3);
|
||||
}, "Remove the iframe and insert new ones");
|
||||
|
||||
// Because of the historical presence of a non-isolated {{hosts[][www]}} iframe,
|
||||
// the origin isolation request for frameWindow2 will be ignored. So,
|
||||
// frameWindow2 and frameWindow3 both end up in the site-keyed agent cluster.
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow2);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "Parent to child2: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow2.document;
|
||||
});
|
||||
}, "Parent to child2: setting document.domain must not give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModule(frameWindow3);
|
||||
|
||||
assert_equals(whatHappened, "messageerror");
|
||||
}, "Parent to child3: messageerror event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
assert_throws_dom("SecurityError", DOMException, () => {
|
||||
frameWindow3.document;
|
||||
});
|
||||
}, "Parent to child3: setting document.domain must not give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModuleBetween(frameWindow2, 1);
|
||||
|
||||
assert_equals(whatHappened, "WebAssembly.Module message received");
|
||||
}, "child2 to child3: message event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await accessDocumentBetween(frameWindow2, 1);
|
||||
|
||||
assert_equals(whatHappened, "accessed document successfully");
|
||||
}, "child2 to child3: setting document.domain must give sync access");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await sendWasmModuleBetween(frameWindow3, 0);
|
||||
|
||||
assert_equals(whatHappened, "WebAssembly.Module message received");
|
||||
}, "child3 to child2: message event must occur");
|
||||
|
||||
promise_test(async () => {
|
||||
const whatHappened = await accessDocumentBetween(frameWindow3, 0);
|
||||
|
||||
assert_equals(whatHappened, "accessed document successfully");
|
||||
}, "child3 to child2: setting document.domain must give sync access");
|
||||
</script>
|
|
@ -0,0 +1 @@
|
|||
Origin-Isolation: ?1
|
|
@ -1,19 +1,36 @@
|
|||
export function insertIframe(hostname, header) {
|
||||
const iframe = document.createElement("iframe");
|
||||
const navigatePromise = navigateIframe(iframe, hostname, header);
|
||||
document.body.append(iframe);
|
||||
return navigatePromise;
|
||||
}
|
||||
|
||||
export function navigateIframe(iframeEl, hostname, header) {
|
||||
const url = getURL(hostname, header);
|
||||
|
||||
const waitPromise = waitForIframe(iframeEl, url);
|
||||
iframeEl.src = url;
|
||||
return waitPromise;
|
||||
}
|
||||
|
||||
export function waitForIframe(iframeEl, destinationForErrorMessage) {
|
||||
return new Promise((resolve, reject) => {
|
||||
iframeEl.addEventListener("load", () => resolve(iframeEl.contentWindow));
|
||||
iframeEl.addEventListener(
|
||||
"error",
|
||||
() => reject(new Error(`Could not navigate to ${destinationForErrorMessage}`))
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getURL(hostname, header) {
|
||||
const url = new URL("send-origin-isolation-header.py", import.meta.url);
|
||||
url.hostname = hostname;
|
||||
|
||||
if (header !== undefined) {
|
||||
url.searchParams.set("header", header);
|
||||
}
|
||||
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.src = url.href;
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
iframe.onload = () => resolve(iframe.contentWindow);
|
||||
iframe.onerror = () => reject(new Error(`Could not load ${iframe.src}`));
|
||||
document.body.append(iframe);
|
||||
});
|
||||
return url.href;
|
||||
}
|
||||
|
||||
// This function is coupled to ./send-origin-isolation-header.py, which ensures
|
||||
|
|
|
@ -16,6 +16,8 @@ def main(request, response):
|
|||
<meta charset="utf-8">
|
||||
<title>Helper page for origin isolation tests</title>
|
||||
|
||||
<body>
|
||||
|
||||
<script type="module">
|
||||
import { sendWasmModule } from "./helpers.mjs";
|
||||
|
||||
|
@ -50,5 +52,7 @@ def main(request, response):
|
|||
window.onmessageerror = e => {
|
||||
e.source.postMessage("messageerror", "*");
|
||||
};
|
||||
|
||||
document.body.textContent = location.href;
|
||||
</script>
|
||||
"""
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<!doctype html>
|
||||
<title>Page Lifecycle IDL tests</title>
|
||||
<meta name="timeout" content="long">
|
||||
<link rel="help" href="https://wicg.github.io/page-lifecycle/">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
<!DOCTYPE HTML>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/resources/testdriver-actions.js"></script>
|
||||
<script type="text/javascript" src="../pointerevent_support.js"></script>
|
||||
<style>
|
||||
#target {
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
#spacer {
|
||||
background: green;
|
||||
height: 200px;
|
||||
}
|
||||
</style>
|
||||
<h1>Verifies that pointerup/down are fired correctly for corresponding mouse events on the scollbar.</h1>
|
||||
<div id="target">
|
||||
<div id="spacer"></div>
|
||||
</div>
|
||||
|
||||
<div id="console"></div>
|
||||
|
||||
<script>
|
||||
var receivedEvents = [];
|
||||
var targetDiv = document.getElementById('target');
|
||||
|
||||
function init() {
|
||||
var eventList = ["mousedown", "mouseup", "pointerdown", "pointerup"];
|
||||
eventList.forEach(function(eventName) {
|
||||
targetDiv.addEventListener(eventName, function(event) {
|
||||
receivedEvents.push(event.type + "@target");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function performActions(x, y){
|
||||
return new test_driver.Actions()
|
||||
.pointerMove(0, 0)
|
||||
.pointerMove(x, y)
|
||||
.pointerDown(0)
|
||||
.pointerUp(0)
|
||||
.send()
|
||||
.then(()=>resolveWhen(()=>receivedEvents.length == 4));
|
||||
}
|
||||
|
||||
function runTests() {
|
||||
var rect = targetDiv.getBoundingClientRect();
|
||||
var x1 = rect.right - 5;
|
||||
var y1 = rect.top + 20;
|
||||
|
||||
test(function(){
|
||||
assert_equals(targetDiv, document.elementFromPoint(x1,y1),
|
||||
"Didn't hit the scrollbar as expected");
|
||||
}, `Test point (${x1},${y1}) is on the scrollbar`);
|
||||
|
||||
promise_test(async () => {
|
||||
await performActions(Math.ceil(x1), Math.ceil(y1));
|
||||
assert_array_equals(receivedEvents, ["pointerdown@target", "mousedown@target",
|
||||
"pointerup@target", "mouseup@target"]);
|
||||
}, "Verifies that pointerup/down are fired correctly for corresponding mouse events on the scollbar.");
|
||||
}
|
||||
|
||||
init();
|
||||
runTests();
|
||||
</script>
|
|
@ -0,0 +1,87 @@
|
|||
<!DOCTYPE HTML>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/resources/testdriver-actions.js"></script>
|
||||
<script type="text/javascript" src="../pointerevent_support.js"></script>
|
||||
<style>
|
||||
div.box {
|
||||
margin: 10px;
|
||||
padding: 50px;
|
||||
float: left;
|
||||
}
|
||||
</style>
|
||||
<h1>Verifies that pointerup/down are fired correctly for corresponding mouse events</h1>
|
||||
<div id="lightgreen" class="box" style="background-color:lightgreen">
|
||||
<div id="green" class="box" style="background-color:green">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="console"></div>
|
||||
|
||||
<script>
|
||||
var eventsReceived = [];
|
||||
function init() {
|
||||
var eventList = ["mousedown", "mouseup", "pointerdown", "pointerup"];
|
||||
|
||||
["green", "lightgreen"].forEach(function(id) {
|
||||
var targetDiv = document.getElementById(id);
|
||||
|
||||
eventList.forEach(function(eventName) {
|
||||
targetDiv.addEventListener(eventName, function(event) {
|
||||
eventsReceived.push(`${event.type}@${id}`);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function performActions() {
|
||||
var rect = document.getElementById("green").getBoundingClientRect();
|
||||
var x1 = Math.ceil(rect.left + 5);
|
||||
var y1 = Math.ceil(rect.top + 5);
|
||||
|
||||
var rect = document.getElementById("lightgreen").getBoundingClientRect();
|
||||
var x2 = Math.ceil(rect.left + 5);
|
||||
var y2 = Math.ceil(rect.top + 5);
|
||||
|
||||
return new test_driver.Actions()
|
||||
.pointerMove(x1, y1)
|
||||
.pointerDown()
|
||||
.pointerUp()
|
||||
.pointerDown()
|
||||
|
||||
.pointerMove(x2, y2)
|
||||
.pointerUp()
|
||||
.pointerDown()
|
||||
|
||||
.pointerMove(x1, y1)
|
||||
.pointerUp()
|
||||
.send()
|
||||
.then(()=>resolveWhen(()=>eventsExpected.length === eventsReceived.length));
|
||||
}
|
||||
var eventsExpected = ["pointerdown@green", "pointerdown@lightgreen",
|
||||
"mousedown@green", "mousedown@lightgreen",
|
||||
"pointerup@green", "pointerup@lightgreen",
|
||||
"mouseup@green", "mouseup@lightgreen",
|
||||
"pointerdown@green", "pointerdown@lightgreen",
|
||||
"mousedown@green", "mousedown@lightgreen",
|
||||
"pointerup@lightgreen", "mouseup@lightgreen",
|
||||
"pointerdown@lightgreen", "mousedown@lightgreen",
|
||||
"pointerup@green", "pointerup@lightgreen",
|
||||
"mouseup@green", "mouseup@lightgreen"];
|
||||
function runTests(){
|
||||
promise_test((test) => {
|
||||
return new Promise(async (resolve)=>{
|
||||
await performActions();
|
||||
test.step(()=>{
|
||||
assert_array_equals(eventsExpected, eventsReceived);
|
||||
});
|
||||
resolve();
|
||||
});
|
||||
}, "pointerup/down events are fired correctly for corresponding mouse events");
|
||||
}
|
||||
|
||||
init();
|
||||
runTests();
|
||||
</script>
|
|
@ -44,6 +44,7 @@
|
|||
var eventRcvd = false;
|
||||
var isAsync = false;
|
||||
var event_log = [];
|
||||
var actions_promise;
|
||||
|
||||
add_completion_callback(end_of_test);
|
||||
function end_of_test() {
|
||||
|
@ -105,7 +106,10 @@
|
|||
assert_false(eventRcvd, "no other events should be received before lostpointercapture." + eventsRcvd_str);
|
||||
assert_equals(event.pointerId, pointerdown_event.pointerId, "pointerID is same for pointerdown and lostpointercapture");
|
||||
});
|
||||
test_pointerEvent.done(); // complete test
|
||||
// Make sure the test finishes after all the input actions are completed.
|
||||
actions_promise.then( () => {
|
||||
test_pointerEvent.done();
|
||||
});
|
||||
}
|
||||
else {
|
||||
if (testStarted && pointerdown_event != null && pointerdown_event.pointerId === event.pointerId) {
|
||||
|
@ -128,7 +132,7 @@
|
|||
}
|
||||
|
||||
// Inject mouse inputs.
|
||||
new test_driver.Actions()
|
||||
actions_promise = new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: captureButton})
|
||||
.pointerDown()
|
||||
.pointerMove(2, 0, {origin: captureButton})
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
var eventTested = false;
|
||||
var pointerleaveReceived = false;
|
||||
var detected_pointertypes = {};
|
||||
var test_pointerleave = async_test("pointerleave shouldn't be received on descendant's pointerover");
|
||||
var actions_promise;
|
||||
|
||||
add_completion_callback(showPointerTypes);
|
||||
|
||||
|
@ -41,9 +43,12 @@
|
|||
on_event(target1, "pointerdown", function(event) {
|
||||
detected_pointertypes[event.pointerType] = true;
|
||||
|
||||
test(function() {
|
||||
assert_true(!pointerleaveReceived, "pointerleave shouldn't be received on descendant's pointerover")
|
||||
test_pointerleave.step(function() {
|
||||
assert_true(!pointerleaveReceived, "pointerleave shouldn't be received on descendant's pointerover");
|
||||
}, "pointerleave shouldn't be received on descendant's pointerover");
|
||||
actions_promise.then( () => {
|
||||
test_pointerleave.done();
|
||||
});
|
||||
});
|
||||
|
||||
on_event(target0, "pointerleave", function (event) {
|
||||
|
@ -54,7 +59,7 @@
|
|||
});
|
||||
|
||||
// Inject mouse inputs.
|
||||
new test_driver.Actions()
|
||||
actions_promise = new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: target0})
|
||||
.pointerMove(0, 0, {origin: target1})
|
||||
.pointerDown()
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
<script type="text/javascript">
|
||||
var detected_pointertypes = {};
|
||||
var test_pointerEvent = async_test("pointerLeave event does not bubble"); // set up test harness
|
||||
var actions_promise;
|
||||
// showPointerTypes is defined in pointerevent_support.js
|
||||
// Requirements: the callback function will reference the test_pointerEvent object and
|
||||
// will fail unless the async_test is created with the var name "test_pointerEvent".
|
||||
|
@ -39,11 +40,14 @@
|
|||
test_pointerEvent.step(function () {
|
||||
assert_equals(event.target.id, "parent0", "Recieved " + event.type + " in parent for " + event.target.id);
|
||||
});
|
||||
test_pointerEvent.done(); // complete test
|
||||
// Make sure the test finishes after all the input actions are completed.
|
||||
actions_promise.then( () => {
|
||||
test_pointerEvent.done();
|
||||
});
|
||||
});
|
||||
|
||||
// Inject mouse inputs.
|
||||
new test_driver.Actions()
|
||||
actions_promise = new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: target0})
|
||||
.pointerMove(0, 0)
|
||||
.send();
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
<script>
|
||||
var pointeroutCounter = 0;
|
||||
var detected_pointertypes = {};
|
||||
var actions_promise;
|
||||
|
||||
setup({ explicit_done: true });
|
||||
add_completion_callback(showPointerTypes);
|
||||
|
@ -47,12 +48,14 @@
|
|||
test(function() {
|
||||
assert_true(pointeroutCounter == 1, "pointerout received just once")
|
||||
}, "pointerout received just once");
|
||||
done();
|
||||
actions_promise.then( () => {
|
||||
done();
|
||||
});
|
||||
}, 5000);
|
||||
});
|
||||
|
||||
// Inject mouse inputs.
|
||||
new test_driver.Actions()
|
||||
actions_promise = new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: target0})
|
||||
.pointerMove(0, 0)
|
||||
.send();
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
var detected_pointertypes = {};
|
||||
add_completion_callback(showPointerTypes);
|
||||
var test_setPointerCapture = async_test("setPointerCapture: DOMException InvalidStateError");
|
||||
var actions_promise;
|
||||
|
||||
function run() {
|
||||
var target0 = document.getElementById("target0");
|
||||
|
@ -35,11 +36,14 @@
|
|||
assert_equals(e.name, "InvalidStateError", "DOMException should be InvalidStateError");
|
||||
});
|
||||
}
|
||||
test_setPointerCapture.done();
|
||||
// Make sure the test finishes after all the input actions are completed.
|
||||
actions_promise.then( () => {
|
||||
test_setPointerCapture.done();
|
||||
});
|
||||
});
|
||||
|
||||
// Inject mouse inputs.
|
||||
new test_driver.Actions()
|
||||
actions_promise = new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: target0})
|
||||
.pointerDown()
|
||||
.pointerUp()
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
<script type="text/javascript">
|
||||
var detected_pointertypes = {};
|
||||
var test_pointerEvent = async_test("setPointerCapture: DOMException NotFoundError"); // set up test harness
|
||||
var actions_promise;
|
||||
// showPointerTypes is defined in pointerevent_support.js
|
||||
// Requirements: the callback function will reference the test_pointerEvent object and
|
||||
// will fail unless the async_test is created with the var name "test_pointerEvent".
|
||||
|
@ -36,11 +37,14 @@
|
|||
assert_throws_dom("NotFoundError", function(){ listener.setPointerCapture(INVALID_POINTERID); },
|
||||
"It should not be possible to capture an invalid pointer id");
|
||||
});
|
||||
test_pointerEvent.done(); // complete test
|
||||
// Make sure the test finishes after all the input actions are completed.
|
||||
actions_promise.then( () => {
|
||||
test_pointerEvent.done();
|
||||
});
|
||||
});
|
||||
|
||||
// Inject mouse inputs.
|
||||
new test_driver.Actions()
|
||||
actions_promise = new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: target0})
|
||||
.pointerDown()
|
||||
.pointerUp()
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue