mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
Update web-platform-tests to revision a589fd30bc64bb4d40e1d6854e07accca69b8472
This commit is contained in:
parent
81ab255b70
commit
fd4e600639
57 changed files with 1735 additions and 208 deletions
|
@ -13753,12 +13753,6 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"pointerevents/pointerevent_click_during_capture-manual.html": [
|
||||
[
|
||||
"/pointerevents/pointerevent_click_during_capture-manual.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"pointerevents/pointerevent_disabled_form_control-manual.html": [
|
||||
[
|
||||
"/pointerevents/pointerevent_disabled_form_control-manual.html",
|
||||
|
@ -86567,6 +86561,18 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/CSS2/stacking-context/opacity-change-twice-stacking-context.html": [
|
||||
[
|
||||
"/css/CSS2/stacking-context/opacity-change-twice-stacking-context.html",
|
||||
[
|
||||
[
|
||||
"/css/CSS2/stacking-context/opacity-change-twice-stacking-context-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/CSS2/syntax/at-charset-001.xht": [
|
||||
[
|
||||
"/css/CSS2/syntax/at-charset-001.xht",
|
||||
|
@ -245883,6 +245889,11 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/CSS2/stacking-context/opacity-change-twice-stacking-context-ref.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/CSS2/support/100x100-lime.png": [
|
||||
[
|
||||
{}
|
||||
|
@ -300143,6 +300154,16 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"idle-detection/META.yml": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"idle-detection/idle-detection.idl": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"imagebitmap-renderingcontext/META.yml": [
|
||||
[
|
||||
{}
|
||||
|
@ -303813,6 +303834,11 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"payment-request/blank.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"payment-request/payment-response/helpers.js": [
|
||||
[
|
||||
{}
|
||||
|
@ -303953,6 +303979,26 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"portals/resources/portal-forward-with-broadcast.sub.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"portals/resources/portal-host-cross-origin-navigate.sub.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"portals/resources/portal-host-cross-origin.sub.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"portals/resources/portal-host.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"portals/resources/portals-rendering-portal.html": [
|
||||
[
|
||||
{}
|
||||
|
@ -325248,6 +325294,11 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"workers/examples/fetch_tests_from_worker.js": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.js": [
|
||||
[
|
||||
{}
|
||||
|
@ -347130,6 +347181,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/css-tables/inheritance.html": [
|
||||
[
|
||||
"/css/css-tables/inheritance.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-tables/percent-width-ignored-001.tentative.html": [
|
||||
[
|
||||
"/css/css-tables/percent-width-ignored-001.tentative.html",
|
||||
|
@ -367881,10 +367938,6 @@
|
|||
"/fetch/cross-origin-resource-policy/fetch.any.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/fetch.any.serviceworker.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/fetch.any.sharedworker.html",
|
||||
{}
|
||||
|
@ -367894,6 +367947,24 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"fetch/cross-origin-resource-policy/fetch.https.any.js": [
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/fetch.https.any.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/fetch.https.any.serviceworker.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/fetch.https.any.sharedworker.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/fetch.https.any.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"fetch/cross-origin-resource-policy/iframe-loads.html": [
|
||||
[
|
||||
"/fetch/cross-origin-resource-policy/iframe-loads.html",
|
||||
|
@ -382064,6 +382135,26 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"idle-detection/basics.tentative.https.any.js": [
|
||||
[
|
||||
"/idle-detection/basics.tentative.https.any.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/idle-detection/basics.tentative.https.any.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"idle-detection/idlharness.https.any.js": [
|
||||
[
|
||||
"/idle-detection/idlharness.https.any.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/idle-detection/idlharness.https.any.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html": [
|
||||
[
|
||||
"/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html",
|
||||
|
@ -397062,6 +397153,14 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"payment-request/payment-is-showing.https.html": [
|
||||
[
|
||||
"/payment-request/payment-is-showing.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"payment-request/payment-request-abort-method.https.html": [
|
||||
[
|
||||
"/payment-request/payment-request-abort-method.https.html",
|
||||
|
@ -397468,6 +397567,14 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"pointerevents/pointerevent_click_during_capture.html": [
|
||||
[
|
||||
"/pointerevents/pointerevent_click_during_capture.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"pointerevents/pointerevent_constructor.html": [
|
||||
[
|
||||
"/pointerevents/pointerevent_constructor.html",
|
||||
|
@ -397562,6 +397669,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"portals/portals-host-exposure.sub.html": [
|
||||
[
|
||||
"/portals/portals-host-exposure.sub.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"portals/portals-host-null.html": [
|
||||
[
|
||||
"/portals/portals-host-null.html",
|
||||
|
@ -422488,6 +422601,38 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"workers/examples/fetch_tests_from_worker.html": [
|
||||
[
|
||||
"/workers/examples/fetch_tests_from_worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"workers/examples/general.any.js": [
|
||||
[
|
||||
"/workers/examples/general.any.serviceworker.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/workers/examples/general.any.sharedworker.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"/workers/examples/general.any.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"workers/examples/general.worker.js": [
|
||||
[
|
||||
"/workers/examples/general.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"workers/examples/onconnect.any.js": [
|
||||
[
|
||||
"/workers/examples/onconnect.any.sharedworker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"workers/importscripts_mime.any.js": [
|
||||
[
|
||||
"/workers/importscripts_mime.any.serviceworker.html",
|
||||
|
@ -457192,7 +457337,7 @@
|
|||
"support"
|
||||
],
|
||||
"common/get-host-info.sub.js": [
|
||||
"b46fc4516cf6b1b12b0b438435b65c300fa5a01b",
|
||||
"743bec18ec26279dc2e83dba664873e4babbf6c3",
|
||||
"support"
|
||||
],
|
||||
"common/get-host-info.sub.js.headers": [
|
||||
|
@ -522711,6 +522856,14 @@
|
|||
"94587c5f6e21b92ab7ab1d5ca3b447eb2bdab15b",
|
||||
"reftest"
|
||||
],
|
||||
"css/CSS2/stacking-context/opacity-change-twice-stacking-context-ref.html": [
|
||||
"da17527af567e0e9d14e181b11ac09548b8003b0",
|
||||
"support"
|
||||
],
|
||||
"css/CSS2/stacking-context/opacity-change-twice-stacking-context.html": [
|
||||
"c3c680c68fad38f55a809f144867cb3fd285db9d",
|
||||
"reftest"
|
||||
],
|
||||
"css/CSS2/support/100x100-lime.png": [
|
||||
"1b947700808585e8c224cee096247eb5d30a1ded",
|
||||
"support"
|
||||
|
@ -572331,6 +572484,10 @@
|
|||
"d4f0986fcd8452846e004806013f0bc9f66411c4",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-tables/inheritance.html": [
|
||||
"2c640db6d9ecb61ad02af68257d3647d24146bea",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-tables/internal-containing-block-001.html": [
|
||||
"a8745487b6702b8b8e8ac85bd843014dc296b717",
|
||||
"reftest"
|
||||
|
@ -615148,7 +615305,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"fetch/api/basic/mode-no-cors.sub.any.js": [
|
||||
"709eef5bf1dbd85600ba88ca4abb5fd1003358d4",
|
||||
"a4abcac55f39a93a561798c1e072e301ff0cab73",
|
||||
"testharness"
|
||||
],
|
||||
"fetch/api/basic/mode-same-origin.any.js": [
|
||||
|
@ -616156,7 +616313,11 @@
|
|||
"testharness"
|
||||
],
|
||||
"fetch/cross-origin-resource-policy/fetch.any.js": [
|
||||
"ded3bdc5daee50fec9c970cd31f24f2bd6f2b60a",
|
||||
"6f40c8465635cd732dadf2c24589a378c1981bfa",
|
||||
"testharness"
|
||||
],
|
||||
"fetch/cross-origin-resource-policy/fetch.https.any.js": [
|
||||
"98b9ba4785312c1ea2da3825b2f812cb28a4a97c",
|
||||
"testharness"
|
||||
],
|
||||
"fetch/cross-origin-resource-policy/iframe-loads.html": [
|
||||
|
@ -636555,6 +636716,22 @@
|
|||
"55cb5ce527ea69fa23e6aba675719bb6524d7411",
|
||||
"manual"
|
||||
],
|
||||
"idle-detection/META.yml": [
|
||||
"7e5836bc3701366fba535a67a0ffc4032776b104",
|
||||
"support"
|
||||
],
|
||||
"idle-detection/basics.tentative.https.any.js": [
|
||||
"916829e32d752dc83302dcf1c613fb87e9086e5d",
|
||||
"testharness"
|
||||
],
|
||||
"idle-detection/idle-detection.idl": [
|
||||
"f529cd036bf7c166d104f34b645cd87d6a8a1938",
|
||||
"support"
|
||||
],
|
||||
"idle-detection/idlharness.https.any.js": [
|
||||
"d7b5b96b666ee7589b68807faa76af42f1539ee2",
|
||||
"testharness"
|
||||
],
|
||||
"imagebitmap-renderingcontext/META.yml": [
|
||||
"f6a06f4e7d7625855e271ec5422629ca5e734560",
|
||||
"support"
|
||||
|
@ -637488,7 +637665,7 @@
|
|||
"support"
|
||||
],
|
||||
"interfaces/html.idl": [
|
||||
"3a513c5b9dbb47dc0b7a29af5efcf36259b22ef0",
|
||||
"d46d1452eadbd3a1a7bb5aadd3a346818492daf1",
|
||||
"support"
|
||||
],
|
||||
"interfaces/image-capture.idl": [
|
||||
|
@ -637776,7 +637953,7 @@
|
|||
"support"
|
||||
],
|
||||
"interfaces/webrtc.idl": [
|
||||
"c7529ced356dfa932c403217910d859e69773bea",
|
||||
"dc51e2f2f3ae8f33b2cde6aa005efa34f46648aa",
|
||||
"support"
|
||||
],
|
||||
"interfaces/webusb.idl": [
|
||||
|
@ -638244,7 +638421,7 @@
|
|||
"support"
|
||||
],
|
||||
"longtask-timing/supported-longtask-types.any.js": [
|
||||
"0179fc5e60ceeb3312e060a4fc5f0927b1a1bc29",
|
||||
"3c68c01d32d614dab435d91a0dce39244f8d7e09",
|
||||
"testharness"
|
||||
],
|
||||
"magnetometer/META.yml": [
|
||||
|
@ -642592,7 +642769,7 @@
|
|||
"support"
|
||||
],
|
||||
"navigation-timing/supported_navigation_type.any.js": [
|
||||
"5e9151cea72434b61fc317cc512ed9e61643fdb2",
|
||||
"3239c7d29ffb11cbfebda12b4e5420bca0131094",
|
||||
"testharness"
|
||||
],
|
||||
"navigation-timing/test_document_open.html": [
|
||||
|
@ -649632,7 +649809,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"paint-timing/supported-paint-type.any.js": [
|
||||
"623c880c5735214866352a39bd2d214acaf30753",
|
||||
"36acf82ca3b646b32977c3d0212a397c6fa8ea09",
|
||||
"testharness"
|
||||
],
|
||||
"payment-handler/META.yml": [
|
||||
|
@ -649883,6 +650060,10 @@
|
|||
"cb9acf6eb6a20df5ddd03ef734796cefb6195467",
|
||||
"manual"
|
||||
],
|
||||
"payment-request/blank.html": [
|
||||
"7852a427e861a9be3c9068deb306b67ad909843f",
|
||||
"support"
|
||||
],
|
||||
"payment-request/change-shipping-option-manual.https.html": [
|
||||
"a33365bac73ed51b6873215d0f54d79a73422163",
|
||||
"manual"
|
||||
|
@ -649911,6 +650092,10 @@
|
|||
"0484eb868f983e3cdb0efceab5fe2b3c6084b4ab",
|
||||
"testharness"
|
||||
],
|
||||
"payment-request/payment-is-showing.https.html": [
|
||||
"650b76d61f72d82fce1644be95e1ee2b99a90d95",
|
||||
"testharness"
|
||||
],
|
||||
"payment-request/payment-request-abort-method.https.html": [
|
||||
"8e561b288d15fa30971dd1f88b930671c83a5887",
|
||||
"testharness"
|
||||
|
@ -650319,9 +650504,9 @@
|
|||
"04d56cb7a51db2be25972c181cf60cf69ba39591",
|
||||
"manual"
|
||||
],
|
||||
"pointerevents/pointerevent_click_during_capture-manual.html": [
|
||||
"ed0e3e2c1eb7f3970014d899aa3fd5be96628331",
|
||||
"manual"
|
||||
"pointerevents/pointerevent_click_during_capture.html": [
|
||||
"7f63283b61a4bedac614914b3fda14364abd14ad",
|
||||
"testharness"
|
||||
],
|
||||
"pointerevents/pointerevent_constructor.html": [
|
||||
"b8a97d1a6bb7f7b895d16282a1231c335e35f650",
|
||||
|
@ -650691,6 +650876,10 @@
|
|||
"ac1505d2a5b2fe1df083eae75893483e025a2ad7",
|
||||
"testharness"
|
||||
],
|
||||
"portals/portals-host-exposure.sub.html": [
|
||||
"83e31bd4735131d35b2a03ae82d07be364497689",
|
||||
"testharness"
|
||||
],
|
||||
"portals/portals-host-null.html": [
|
||||
"e0f1d63743c54c687d62f86abe278873fa823430",
|
||||
"testharness"
|
||||
|
@ -650715,6 +650904,22 @@
|
|||
"cf09caebc0ff9ac38facde84075a7af5be19fd48",
|
||||
"support"
|
||||
],
|
||||
"portals/resources/portal-forward-with-broadcast.sub.html": [
|
||||
"39bda69b0eef9b0062809507bfb91d9fc3401d95",
|
||||
"support"
|
||||
],
|
||||
"portals/resources/portal-host-cross-origin-navigate.sub.html": [
|
||||
"44c6c16c5771f1027c3cc82e966342bbaa80ad8d",
|
||||
"support"
|
||||
],
|
||||
"portals/resources/portal-host-cross-origin.sub.html": [
|
||||
"aa369d39f0bd674a5cb1a9ad8954e3106a807687",
|
||||
"support"
|
||||
],
|
||||
"portals/resources/portal-host.html": [
|
||||
"5043a158ea74ef173f166c0580f9c1a27242bd14",
|
||||
"support"
|
||||
],
|
||||
"portals/resources/portals-rendering-portal.html": [
|
||||
"1b6f23f512da5bb7d1c7b5b85e48277470d2e146",
|
||||
"support"
|
||||
|
@ -660736,7 +660941,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"resource-timing/supported_resource_type.any.js": [
|
||||
"6096ad714904fdd5c0085b33b4240301cdb952fb",
|
||||
"31e40096ddb2c3a8e38ddbeec00a67ca7a91ce59",
|
||||
"testharness"
|
||||
],
|
||||
"resource-timing/test_resource_timing.html": [
|
||||
|
@ -665420,7 +665625,7 @@
|
|||
"support"
|
||||
],
|
||||
"service-workers/service-worker/resources/worker-interception-iframe.https.html": [
|
||||
"ab10a078f3d67a8c213b8511b8ff5ffcde92375b",
|
||||
"84204a3ee5df1fc3a71784215071b14f0c65f9f2",
|
||||
"support"
|
||||
],
|
||||
"service-workers/service-worker/resources/worker-interception-redirect-serviceworker.js": [
|
||||
|
@ -665432,7 +665637,7 @@
|
|||
"support"
|
||||
],
|
||||
"service-workers/service-worker/resources/worker-load-interceptor.js": [
|
||||
"695777a514f65628b25f76549970ddfbc854fee3",
|
||||
"a5f65c3216e44632ff052bac0448316f25d443c6",
|
||||
"support"
|
||||
],
|
||||
"service-workers/service-worker/resources/worker-testharness.js": [
|
||||
|
@ -665632,7 +665837,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"service-workers/service-worker/worker-interception.https.html": [
|
||||
"f9ba656b5178359f2c7b6e2419a57ff12ec79d23",
|
||||
"7b2941263bf756c33e6d15b36ed96548f886c6c2",
|
||||
"testharness"
|
||||
],
|
||||
"service-workers/service-worker/xhr-response-url.https.html": [
|
||||
|
@ -676916,7 +677121,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"trusted-types/TrustedTypePolicy-createXXX.tentative.html": [
|
||||
"6a0151ad9bcf7d02b6a98532ba53db509e086f83",
|
||||
"475a264790482aedf714958f63a4d47d69661941",
|
||||
"testharness"
|
||||
],
|
||||
"trusted-types/TrustedTypePolicy-exposed.tentative.html": [
|
||||
|
@ -676928,7 +677133,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html": [
|
||||
"a162d84cd820051d6c5868c35b58cd347b0026e5",
|
||||
"37e245ee27aa5828bd97568d9390d9cbfbb6f968",
|
||||
"testharness"
|
||||
],
|
||||
"trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html": [
|
||||
|
@ -677000,7 +677205,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html": [
|
||||
"f9cbdc5a889dc765558775ee013a2d9e866ce111",
|
||||
"d77d9dab58681658d04a7b55d1f340da8f684bfa",
|
||||
"testharness"
|
||||
],
|
||||
"trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [
|
||||
|
@ -677008,7 +677213,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [
|
||||
"fd89bb33c13aa0b2ad5867118f03ae1c76ff8028",
|
||||
"fe27d45d08a2d8f9a98e44c3d0244230f343954d",
|
||||
"testharness"
|
||||
],
|
||||
"trusted-types/block-string-assignment-to-Location-assign.tentative.html": [
|
||||
|
@ -677028,7 +677233,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"trusted-types/block-string-assignment-to-Window-open.tentative.html": [
|
||||
"fd30b6edfbaf40c09cabe98d1bd8891446b16e65",
|
||||
"c66a16d5c00535c3def556afc5daff3a7614c62c",
|
||||
"testharness"
|
||||
],
|
||||
"trusted-types/idlharness.window.js": [
|
||||
|
@ -677920,7 +678125,7 @@
|
|||
"support"
|
||||
],
|
||||
"user-timing/supported-usertiming-types.any.js": [
|
||||
"a373c562f94d88460f5b19ff9f00ec503f1c1152",
|
||||
"ea3b2fe9dc90f70f3998a94a1460460b8b8b5992",
|
||||
"testharness"
|
||||
],
|
||||
"user-timing/user-timing-tojson.html": [
|
||||
|
@ -682956,7 +683161,7 @@
|
|||
"support"
|
||||
],
|
||||
"webrtc/RTCTrackEvent-constructor.html": [
|
||||
"9579dd4d4f81be24c065529728183cb2287d15b6",
|
||||
"a0c031eaa5a25729639d2595f1a5748ae59955cb",
|
||||
"testharness"
|
||||
],
|
||||
"webrtc/RTCTrackEvent-fire.html": [
|
||||
|
@ -687496,7 +687701,7 @@
|
|||
"support"
|
||||
],
|
||||
"workers/README.md": [
|
||||
"78cc74371b981de53be670795a0edbc708c78b58",
|
||||
"b78a05ebdbe81f7a5d46082ccfa2fed771fe63b1",
|
||||
"support"
|
||||
],
|
||||
"workers/SharedWorkerPerformanceNow.html": [
|
||||
|
@ -687983,6 +688188,26 @@
|
|||
"f54faf54350990a9593e7af022c9eeb769595b15",
|
||||
"testharness"
|
||||
],
|
||||
"workers/examples/fetch_tests_from_worker.html": [
|
||||
"5ac765c7eeae8c03678ca98c2f0d89fd826cf45e",
|
||||
"testharness"
|
||||
],
|
||||
"workers/examples/fetch_tests_from_worker.js": [
|
||||
"01ba12a622f3535733c11102ab5fa4793984697c",
|
||||
"support"
|
||||
],
|
||||
"workers/examples/general.any.js": [
|
||||
"2aa82e3db904a2dc4768d3276e11669b44dc66fc",
|
||||
"testharness"
|
||||
],
|
||||
"workers/examples/general.worker.js": [
|
||||
"aeca236781bf870eb80363a612b0c7963f224d8d",
|
||||
"testharness"
|
||||
],
|
||||
"workers/examples/onconnect.any.js": [
|
||||
"85546f2d11df3907f592ee52b7a8ef4faec1f338",
|
||||
"testharness"
|
||||
],
|
||||
"workers/importscripts_mime.any.js": [
|
||||
"04c63a3a5f6d9bd3b71d94142f65a1825358b8ed",
|
||||
"testharness"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[opacity-change-twice-stacking-context.html]
|
||||
expected: TIMEOUT
|
|
@ -1,2 +0,0 @@
|
|||
[css-transforms-3d-on-anonymous-block-001.html]
|
||||
expected: FAIL
|
|
@ -3,3 +3,6 @@
|
|||
[scroll-behavior: smooth on DIV element]
|
||||
expected: FAIL
|
||||
|
||||
[Instant scrolling while doing history navigation.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
type: testharness
|
||||
|
||||
[single-byte-decoder.html?document]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[ISO-8859-4: iso_8859-4:1988 (document.characterSet and document.inputEncoding)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -32,7 +32,7 @@
|
|||
|
||||
|
||||
[single-byte-decoder.html?XMLHttpRequest]
|
||||
expected: CRASH
|
||||
expected: TIMEOUT
|
||||
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -55,7 +55,7 @@
|
|||
expected: FAIL
|
||||
|
||||
[windows-1252: iso_8859-1:1987 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
[windows-1254: iso_8859-9:1989 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
@ -63,9 +63,6 @@
|
|||
[windows-1256: cp1256 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1254: iso_8859-9 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1254: iso88599 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
@ -138,16 +135,22 @@
|
|||
[windows-1252: x-cp1252 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1252: l1 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1252: windows-1252 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1252: us-ascii (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1252: iso-8859-1 (XMLHttpRequest)]
|
||||
[windows-1258: cp1258 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1257: x-cp1257 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[x-mac-cyrillic: x-mac-cyrillic (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
[windows-1256: windows-1256 (XMLHttpRequest)]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
[fetch]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[fetch.any.html]
|
||||
[fetch]
|
||||
expected: FAIL
|
||||
|
@ -24,6 +25,9 @@
|
|||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-site' response header.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-scheme (HTTP to HTTPS) no-cors fetch to a same-site URL with a 'Cross-Origin-Resource-Policy: same-site' response header.]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[fetch.any.worker.html]
|
||||
[fetch]
|
||||
|
@ -47,6 +51,9 @@
|
|||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' redirect response header.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-scheme (HTTP to HTTPS) no-cors fetch to a same-site URL with a 'Cross-Origin-Resource-Policy: same-site' response header.]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[fetch.any.sharedworker.html]
|
||||
[fetch]
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
[fetch.https.any.html]
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header after a redirection.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' redirect response header.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-site' response header.]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[fetch.https.any.serviceworker.html]
|
||||
[fetch]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[fetch.https.any.sharedworker.html]
|
||||
[fetch]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[fetch.https.any.worker.html]
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header after a redirection.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' redirect response header.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header.]
|
||||
expected: FAIL
|
||||
|
||||
[Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-site' response header.]
|
||||
expected: FAIL
|
||||
|
|
@ -11,6 +11,3 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%0C]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[traverse_the_history_4.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -6082,6 +6082,18 @@
|
|||
[Document interface: attribute onformdata]
|
||||
expected: FAIL
|
||||
|
||||
[Window interface: window must inherit property "queueMicrotask(VoidFunction)" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Window interface: operation postMessage(any, WindowPostMessageOptions)]
|
||||
expected: FAIL
|
||||
|
||||
[Window interface: calling queueMicrotask(VoidFunction) on window with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[Window interface: operation queueMicrotask(VoidFunction)]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[interfaces.https.html?include=HTML.*]
|
||||
[HTML IDL tests]
|
||||
|
@ -9351,6 +9363,36 @@
|
|||
[HTMLElement interface: document.createElement("noscript") must inherit property "onformdata" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLImageElement interface: attribute decoding]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLElement interface: document.createElement("noscript") must inherit property "autocapitalize" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLImageElement interface: document.createElement("img") must inherit property "decoding" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLElement interface: attribute enterKeyHint]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLScriptElement interface: attribute referrerPolicy]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLScriptElement interface: document.createElement("script") must inherit property "referrerPolicy" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLElement interface: document.createElement("noscript") must inherit property "enterKeyHint" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLImageElement interface: new Image() must inherit property "decoding" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLElement interface: attribute autocapitalize]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLIFrameElement interface: attribute allow]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[interfaces.https.html?exclude=(Document|Window|HTML.*)]
|
||||
[HTML IDL tests]
|
||||
|
@ -10928,3 +10970,33 @@
|
|||
[FormDataEvent interface: existence and properties of interface prototype object]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: operation getContextAttributes()]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute direction]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute textAlign]
|
||||
expected: FAIL
|
||||
|
||||
[MessagePort interface: operation postMessage(any, PostMessageOptions)]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute font]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute textBaseline]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -732,3 +732,108 @@
|
|||
[MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface object length]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute emHeightAscent]
|
||||
expected: FAIL
|
||||
|
||||
[DedicatedWorkerGlobalScope interface: calling requestAnimationFrame(FrameRequestCallback) on self with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute ideographicBaseline]
|
||||
expected: FAIL
|
||||
|
||||
[WorkerGlobalScope interface: self must inherit property "queueMicrotask(VoidFunction)" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[WorkerGlobalScope interface: operation queueMicrotask(VoidFunction)]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute actualBoundingBoxAscent]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected: FAIL
|
||||
|
||||
[WorkerGlobalScope interface: calling queueMicrotask(VoidFunction) on self with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[DedicatedWorkerGlobalScope interface: self must inherit property "cancelAnimationFrame(unsigned long)" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute emHeightDescent]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute direction]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute actualBoundingBoxDescent]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute actualBoundingBoxLeft]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: existence and properties of interface object]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute font]
|
||||
expected: FAIL
|
||||
|
||||
[DedicatedWorkerGlobalScope interface: calling cancelAnimationFrame(unsigned long) on self with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute hangingBaseline]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute width]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute actualBoundingBoxRight]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute fontBoundingBoxAscent]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute alphabeticBaseline]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: existence and properties of interface prototype object]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: attribute fontBoundingBoxDescent]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute textBaseline]
|
||||
expected: FAIL
|
||||
|
||||
[OffscreenCanvasRenderingContext2D interface: attribute textAlign]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: FAIL
|
||||
|
||||
[DedicatedWorkerGlobalScope interface: self must inherit property "requestAnimationFrame(FrameRequestCallback)" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[DedicatedWorkerGlobalScope interface: operation cancelAnimationFrame(unsigned long)]
|
||||
expected: FAIL
|
||||
|
||||
[DedicatedWorkerGlobalScope interface: operation requestAnimationFrame(FrameRequestCallback)]
|
||||
expected: FAIL
|
||||
|
||||
[MessagePort interface: operation postMessage(any, PostMessageOptions)]
|
||||
expected: FAIL
|
||||
|
||||
[TextMetrics interface object name]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
[non-active-document.html]
|
||||
[DOMParser]
|
||||
expected: FAIL
|
||||
|
||||
[createHTMLDocument]
|
||||
expected: FAIL
|
||||
|
||||
[<template>]
|
||||
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
|
||||
|
||||
|
|
11
tests/wpt/metadata/workers/examples/general.any.js.ini
Normal file
11
tests/wpt/metadata/workers/examples/general.any.js.ini
Normal file
|
@ -0,0 +1,11 @@
|
|||
[general.any.serviceworker.html]
|
||||
[general]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[general.any.sharedworker.html]
|
||||
[general]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[general.any.worker.html]
|
4
tests/wpt/metadata/workers/examples/onconnect.any.js.ini
Normal file
4
tests/wpt/metadata/workers/examples/onconnect.any.js.ini
Normal file
|
@ -0,0 +1,4 @@
|
|||
[onconnect.any.sharedworker.html]
|
||||
[onconnect]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[005.html]
|
||||
expected: ERROR
|
||||
[dedicated worker in shared worker in dedicated worker]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ function get_host_info() {
|
|||
HTTP_REMOTE_ORIGIN_WITH_DIFFERENT_PORT: 'http://' + REMOTE_HOST + HTTP_PORT2_ELIDED,
|
||||
HTTPS_REMOTE_ORIGIN: 'https://' + REMOTE_HOST + HTTPS_PORT_ELIDED,
|
||||
HTTPS_REMOTE_ORIGIN_WITH_CREDS: 'https://foo:bar@' + REMOTE_HOST + HTTPS_PORT_ELIDED,
|
||||
HTTPS_NOTSAMESITE_ORIGIN: 'https://' + NOTSAMESITE_HOST + HTTPS_PORT_ELIDED,
|
||||
UNAUTHENTICATED_ORIGIN: 'http://' + OTHER_HOST + HTTP_PORT_ELIDED,
|
||||
AUTHENTICATED_ORIGIN: 'https://' + OTHER_HOST + HTTPS_PORT_ELIDED
|
||||
};
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<!doctype HTML>
|
||||
<div style="width: 100px; height: 100px; z-index: 1; opacity: 0.9; background: blue; position: absolute">
|
||||
</div>
|
|
@ -0,0 +1,19 @@
|
|||
<!doctype HTML>
|
||||
<html class="reftest-wait">
|
||||
<title>CSS Test: Test for re-paint after stacking context changes opacity twice</title>
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS2/zindex.html">
|
||||
<link rel="match" href="opacity-change-twice-stacking-context-ref.html">
|
||||
<script src="/common/reftest-wait.js"></script>
|
||||
<div id="target" style="width: 100px; height: 100px; z-index: 1; opacity: 0; background: blue; position: absolute">
|
||||
</div>
|
||||
<script>
|
||||
onload = () => {
|
||||
requestAnimationFrame(() => requestAnimationFrame(() => {
|
||||
target.style.opacity = 1;
|
||||
target.offsetHeight;
|
||||
target.style.opacity = 0.9;
|
||||
takeScreenshot();
|
||||
}));
|
||||
}
|
||||
</script>
|
||||
</html>
|
25
tests/wpt/web-platform-tests/css/css-tables/inheritance.html
Normal file
25
tests/wpt/web-platform-tests/css/css-tables/inheritance.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Inheritance of CSS Tables properties</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-tables-3/#property-index">
|
||||
<meta name="assert" content="Properties inherit or not according to the spec.">
|
||||
<meta name="assert" content="Properties have initial values according to the spec.">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/css/support/inheritance-testcommon.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="target"></div>
|
||||
</div>
|
||||
<script>
|
||||
assert_inherited('border-collapse', 'separate', 'collapse');
|
||||
assert_inherited('border-spacing', '0px 0px', '10px 20px');
|
||||
assert_inherited('caption-side', 'top', 'bottom');
|
||||
assert_inherited('empty-cells', 'show', 'hide');
|
||||
assert_not_inherited('table-layout', 'auto', 'fixed');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -7,6 +7,7 @@ function fetchNoCors(url, isOpaqueFiltered) {
|
|||
return fetch(url + urlQuery, {"mode": "no-cors"}).then(function(resp) {
|
||||
assert_equals(resp.status, 0, "Opaque filter: status is 0");
|
||||
assert_equals(resp.statusText, "", "Opaque filter: statusText is \"\"");
|
||||
assert_equals(resp.url, "", "Opaque filter: url is \"\"");
|
||||
assert_equals(resp.type , "opaque", "Opaque filter: response's type is opaque");
|
||||
assert_equals(resp.headers.get("x-is-filtered"), null, "Header x-is-filtered is filtered");
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// META: global=window,worker
|
||||
// META: global=window,dedicatedworker,sharedworker
|
||||
// META: script=/common/get-host-info.sub.js
|
||||
|
||||
const host = get_host_info();
|
||||
|
@ -40,8 +40,8 @@ promise_test((test) => {
|
|||
|
||||
promise_test((test) => {
|
||||
const remoteURL = httpsBaseURL + "resources/hello.py?corp=same-site";
|
||||
return fetch(remoteURL, { mode: "no-cors" });
|
||||
}, "Cross-origin no-cors fetch to a same-site URL with a 'Cross-Origin-Resource-Policy: same-site' response header.");
|
||||
return promise_rejects(test, new TypeError, fetch(remoteURL, { mode: "no-cors" }));
|
||||
}, "Cross-scheme (HTTP to HTTPS) no-cors fetch to a same-site URL with a 'Cross-Origin-Resource-Policy: same-site' response header.");
|
||||
|
||||
promise_test((test) => {
|
||||
const remoteURL = httpsBaseURL + "resources/hello.py?corp=same-origin";
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
// META: global=window,worker
|
||||
// META: script=/common/get-host-info.sub.js
|
||||
|
||||
const host = get_host_info();
|
||||
const path = "/fetch/cross-origin-resource-policy/";
|
||||
const localBaseURL = host.HTTPS_ORIGIN + path;
|
||||
const notSameSiteBaseURL = host.HTTPS_NOTSAMESITE_ORIGIN + path;
|
||||
|
||||
promise_test(async () => {
|
||||
const response = await fetch("./resources/hello.py?corp=same-origin");
|
||||
assert_equals(await response.text(), "hello");
|
||||
}, "Same-origin fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header.");
|
||||
|
||||
promise_test(async () => {
|
||||
const response = await fetch("./resources/hello.py?corp=same-site");
|
||||
assert_equals(await response.text(), "hello");
|
||||
}, "Same-origin fetch with a 'Cross-Origin-Resource-Policy: same-site' response header.");
|
||||
|
||||
promise_test(async (test) => {
|
||||
const response = await fetch(notSameSiteBaseURL + "resources/hello.py?corp=same-origin");
|
||||
assert_equals(await response.text(), "hello");
|
||||
}, "Cross-origin cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header.");
|
||||
|
||||
promise_test(async (test) => {
|
||||
const response = await fetch(notSameSiteBaseURL + "resources/hello.py?corp=same-site");
|
||||
assert_equals(await response.text(), "hello");
|
||||
}, "Cross-origin cors fetch with a 'Cross-Origin-Resource-Policy: same-site' response header.");
|
||||
|
||||
promise_test((test) => {
|
||||
const remoteURL = notSameSiteBaseURL + "resources/hello.py?corp=same-origin";
|
||||
return promise_rejects(test, new TypeError, fetch(remoteURL, { mode : "no-cors" }));
|
||||
}, "Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header.");
|
||||
|
||||
promise_test((test) => {
|
||||
const remoteURL = notSameSiteBaseURL + "resources/hello.py?corp=same-site";
|
||||
return promise_rejects(test, new TypeError, fetch(remoteURL, { mode: "no-cors" }));
|
||||
}, "Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-site' response header.");
|
||||
|
||||
promise_test((test) => {
|
||||
const finalURL = notSameSiteBaseURL + "resources/hello.py?corp=same-origin";
|
||||
return promise_rejects(test, new TypeError, fetch("resources/redirect.py?redirectTo=" + encodeURIComponent(finalURL), { mode: "no-cors" }));
|
||||
}, "Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header after a redirection.");
|
||||
|
||||
promise_test((test) => {
|
||||
const finalURL = localBaseURL + "resources/hello.py?corp=same-origin";
|
||||
return fetch(notSameSiteBaseURL + "resources/redirect.py?redirectTo=" + encodeURIComponent(finalURL), { mode: "no-cors" });
|
||||
}, "Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' response header after a cross-origin redirection.");
|
||||
|
||||
promise_test(async (test) => {
|
||||
const finalURL = localBaseURL + "resources/hello.py?corp=same-origin";
|
||||
|
||||
await fetch(finalURL, { mode: "no-cors" });
|
||||
|
||||
return promise_rejects(test, new TypeError, fetch(notSameSiteBaseURL + "resources/redirect.py?corp=same-origin&redirectTo=" + encodeURIComponent(finalURL), { mode: "no-cors" }));
|
||||
}, "Cross-origin no-cors fetch with a 'Cross-Origin-Resource-Policy: same-origin' redirect response header.");
|
5
tests/wpt/web-platform-tests/idle-detection/META.yml
Normal file
5
tests/wpt/web-platform-tests/idle-detection/META.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
spec: https://github.com/inexorabletash/idle-detection
|
||||
suggested_reviewers:
|
||||
- goto
|
||||
- jsbell
|
||||
- reillyg
|
|
@ -0,0 +1,69 @@
|
|||
// META: title=Idle Detection API: Basics
|
||||
|
||||
'use strict';
|
||||
|
||||
promise_test(async t => {
|
||||
let promise = navigator.idle.query();
|
||||
assert_equals(promise.constructor, Promise,
|
||||
'query() returns a promise');
|
||||
|
||||
let status = await promise;
|
||||
assert_true(status instanceof IdleStatus,
|
||||
'query() promise resolves to an IdleStatus');
|
||||
|
||||
assert_true(['active', 'idle', 'locked'].includes(status.state),
|
||||
'status has a valid state');
|
||||
}, 'query() basics');
|
||||
|
||||
promise_test(async t => {
|
||||
let used = false;
|
||||
|
||||
await navigator.idle.query({
|
||||
get threshold() {
|
||||
used = true;
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
|
||||
assert_true(used, 'query() options "threshold" member was used');
|
||||
}, 'query() uses threshold property');
|
||||
|
||||
promise_test(async t => {
|
||||
return promise_rejects(
|
||||
t,
|
||||
new TypeError,
|
||||
navigator.idle.query({threshold: 0}),
|
||||
'Threshold of 0 should reject');
|
||||
}, 'query() throws with invalid threshold (0)');
|
||||
|
||||
promise_test(async t => {
|
||||
return promise_rejects(
|
||||
t,
|
||||
new TypeError,
|
||||
navigator.idle.query({threshold: null}),
|
||||
'Threshold of null should reject');
|
||||
}, 'query() throws with invalid threshold (null)');
|
||||
|
||||
promise_test(async t => {
|
||||
return promise_rejects(
|
||||
t,
|
||||
new TypeError,
|
||||
navigator.idle.query({threshold: -1}),
|
||||
'Threshold of negative numbers should reject');
|
||||
}, 'query() throws with invalid threshold (-1)');
|
||||
|
||||
promise_test(async t => {
|
||||
return promise_rejects(
|
||||
t,
|
||||
new TypeError,
|
||||
navigator.idle.query({threshold: NaN}),
|
||||
'Threshold of NaN should reject');
|
||||
}, 'query() throws with invalid threshold (NaN)');
|
||||
|
||||
promise_test(async t => {
|
||||
return navigator.idle.query();
|
||||
}, 'query() uses a default value for the threshold when none is passed');
|
||||
|
||||
promise_test(async t => {
|
||||
return navigator.idle.query({threshold: undefined});
|
||||
}, 'query() uses a default value for the threshold');
|
|
@ -0,0 +1,32 @@
|
|||
[SecureContext]
|
||||
interface mixin NavigatorIdle {
|
||||
readonly attribute IdleManager idle;
|
||||
};
|
||||
|
||||
Navigator includes NavigatorIdle;
|
||||
WorkerNavigator includes NavigatorIdle;
|
||||
|
||||
[
|
||||
SecureContext,
|
||||
Exposed=(Window,Worker)
|
||||
] interface IdleManager {
|
||||
Promise<IdleStatus> query(optional IdleOptions options);
|
||||
};
|
||||
|
||||
dictionary IdleOptions {
|
||||
unsigned long threshold;
|
||||
};
|
||||
|
||||
[
|
||||
SecureContext,
|
||||
Exposed=(Window,Worker)
|
||||
] interface IdleStatus : EventTarget {
|
||||
readonly attribute IdleState state;
|
||||
attribute EventHandler onchange;
|
||||
};
|
||||
|
||||
enum IdleState {
|
||||
"active",
|
||||
"idle",
|
||||
"locked"
|
||||
};
|
|
@ -0,0 +1,32 @@
|
|||
// META: script=/resources/WebIDLParser.js
|
||||
// META: script=/resources/idlharness.js
|
||||
|
||||
// https://github.com/inexorabletash/idle-detection
|
||||
|
||||
'use strict';
|
||||
|
||||
promise_test(async () => {
|
||||
const srcs = ['./idle-detection.idl',
|
||||
'/interfaces/dom.idl', '/interfaces/html.idl'];
|
||||
const [idle, dom, html] = await Promise.all(
|
||||
srcs.map(i => fetch(i).then(r => r.text())));
|
||||
|
||||
const idl_array = new IdlArray();
|
||||
idl_array.add_idls(idle);
|
||||
idl_array.add_dependency_idls(dom);
|
||||
idl_array.add_dependency_idls(html);
|
||||
|
||||
self.idle = await navigator.idle.query();
|
||||
|
||||
idl_array.add_objects({
|
||||
IdleManager: ['navigator.idle'],
|
||||
IdleStatus: ['idle'],
|
||||
});
|
||||
if (self.Window) {
|
||||
idl_array.add_objects({ Navigator: ['navigator'] });
|
||||
} else {
|
||||
idl_array.add_objects({ WorkerNavigator: ['navigator'] });
|
||||
}
|
||||
|
||||
idl_array.test();
|
||||
}, 'Test IDL implementation of Idle Detection API');
|
|
@ -1,3 +1,10 @@
|
|||
// GENERATED CONTENT - DO NOT EDIT
|
||||
// Content was automatically extracted by Reffy into reffy-reports
|
||||
// (https://github.com/tidoust/reffy-reports)
|
||||
// Source: HTML Standard (https://html.spec.whatwg.org/)
|
||||
|
||||
// Example interface manually removed here, see https://github.com/tidoust/reffy/issues/129.
|
||||
|
||||
[Exposed=Window,
|
||||
LegacyUnenumerableNamedProperties]
|
||||
interface HTMLAllCollection {
|
||||
|
@ -15,6 +22,7 @@ interface HTMLFormControlsCollection : HTMLCollection {
|
|||
getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
|
||||
};
|
||||
|
||||
[Exposed=Window]
|
||||
interface RadioNodeList : NodeList {
|
||||
attribute DOMString value;
|
||||
};
|
||||
|
@ -65,8 +73,8 @@ partial interface Document {
|
|||
readonly attribute HTMLOrSVGScriptElement? currentScript; // classic scripts in a document tree only
|
||||
|
||||
// dynamic markup insertion
|
||||
[CEReactions] Document open(optional DOMString type = "text/html", optional DOMString replace = "");
|
||||
WindowProxy open(USVString url, DOMString name, DOMString features);
|
||||
[CEReactions] Document open(optional DOMString unused1, optional DOMString unused2); // both arguments are ignored
|
||||
WindowProxy? open(USVString url, DOMString name, DOMString features);
|
||||
[CEReactions] void close();
|
||||
[CEReactions] void write(DOMString... text);
|
||||
[CEReactions] void writeln(DOMString... text);
|
||||
|
@ -105,25 +113,23 @@ interface HTMLElement : Element {
|
|||
readonly attribute DOMString accessKeyLabel;
|
||||
[CEReactions] attribute boolean draggable;
|
||||
[CEReactions] attribute boolean spellcheck;
|
||||
[CEReactions] attribute DOMString autocapitalize;
|
||||
|
||||
[CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;
|
||||
};
|
||||
|
||||
dictionary FocusOptions {
|
||||
boolean preventScroll = false;
|
||||
};
|
||||
|
||||
HTMLElement includes GlobalEventHandlers;
|
||||
HTMLElement includes DocumentAndElementEventHandlers;
|
||||
HTMLElement includes ElementContentEditable;
|
||||
HTMLElement includes HTMLOrSVGElement;
|
||||
|
||||
// Note: intentionally not [HTMLConstructor]
|
||||
[Exposed=Window]
|
||||
interface HTMLUnknownElement : HTMLElement { };
|
||||
|
||||
interface mixin HTMLOrSVGElement {
|
||||
[SameObject] readonly attribute DOMStringMap dataset;
|
||||
attribute DOMString nonce;
|
||||
attribute DOMString nonce; // intentionally no [CEReactions]
|
||||
|
||||
[CEReactions] attribute long tabIndex;
|
||||
void focus(optional FocusOptions options);
|
||||
|
@ -140,9 +146,7 @@ interface DOMStringMap {
|
|||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLHtmlElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLHtmlElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
|
@ -184,8 +188,6 @@ interface HTMLMetaElement : HTMLElement {
|
|||
[CEReactions] attribute DOMString name;
|
||||
[CEReactions] attribute DOMString httpEquiv;
|
||||
[CEReactions] attribute DOMString content;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -197,35 +199,25 @@ HTMLStyleElement includes LinkStyle;
|
|||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLBodyElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLBodyElement : HTMLElement {};
|
||||
|
||||
HTMLBodyElement includes WindowEventHandlers;
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLHeadingElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLHeadingElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLParagraphElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLParagraphElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLHRElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLHRElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLPreElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLPreElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
|
@ -239,42 +231,30 @@ interface HTMLOListElement : HTMLElement {
|
|||
[CEReactions] attribute boolean reversed;
|
||||
[CEReactions] attribute long start;
|
||||
[CEReactions] attribute DOMString type;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLUListElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLUListElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLMenuElement : HTMLElement {
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLLIElement : HTMLElement {
|
||||
[CEReactions] attribute long value;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLDListElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLDListElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLDivElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLDivElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
|
@ -290,8 +270,6 @@ interface HTMLAnchorElement : HTMLElement {
|
|||
[CEReactions] attribute DOMString text;
|
||||
|
||||
[CEReactions] attribute DOMString referrerPolicy;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
HTMLAnchorElement includes HTMLHyperlinkElementUtils;
|
||||
|
||||
|
@ -313,9 +291,7 @@ interface HTMLSpanElement : HTMLElement {};
|
|||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLBRElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLBRElement : HTMLElement {};
|
||||
|
||||
interface mixin HTMLHyperlinkElementUtils {
|
||||
[CEReactions] stringifier attribute USVString href;
|
||||
|
@ -370,10 +346,9 @@ interface HTMLImageElement : HTMLElement {
|
|||
readonly attribute boolean complete;
|
||||
readonly attribute USVString currentSrc;
|
||||
[CEReactions] attribute DOMString referrerPolicy;
|
||||
[CEReactions] attribute DOMString decoding;
|
||||
|
||||
Promise<void> decode();
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -383,18 +358,15 @@ interface HTMLIFrameElement : HTMLElement {
|
|||
[CEReactions] attribute DOMString srcdoc;
|
||||
[CEReactions] attribute DOMString name;
|
||||
[SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
|
||||
[CEReactions] attribute DOMString allow;
|
||||
[CEReactions] attribute boolean allowFullscreen;
|
||||
[CEReactions] attribute boolean allowPaymentRequest;
|
||||
[CEReactions] attribute boolean allowUserMedia;
|
||||
[CEReactions] attribute DOMString width;
|
||||
[CEReactions] attribute DOMString height;
|
||||
[CEReactions] attribute DOMString referrerPolicy;
|
||||
readonly attribute Document? contentDocument;
|
||||
readonly attribute WindowProxy? contentWindow;
|
||||
Document? getSVGDocument();
|
||||
[SameObject, PutForwards=value] readonly attribute DOMTokenList delegateStickyUserActivation;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -405,8 +377,6 @@ interface HTMLEmbedElement : HTMLElement {
|
|||
[CEReactions] attribute DOMString width;
|
||||
[CEReactions] attribute DOMString height;
|
||||
Document? getSVGDocument();
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -430,8 +400,6 @@ interface HTMLObjectElement : HTMLElement {
|
|||
boolean checkValidity();
|
||||
boolean reportValidity();
|
||||
void setCustomValidity(DOMString error);
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -439,8 +407,6 @@ interface HTMLObjectElement : HTMLElement {
|
|||
interface HTMLParamElement : HTMLElement {
|
||||
[CEReactions] attribute DOMString name;
|
||||
[CEReactions] attribute DOMString value;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -681,8 +647,6 @@ interface HTMLAreaElement : HTMLElement {
|
|||
[CEReactions] attribute DOMString rel;
|
||||
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
|
||||
[CEReactions] attribute DOMString referrerPolicy;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
HTMLAreaElement includes HTMLHyperlinkElementUtils;
|
||||
|
||||
|
@ -707,32 +671,24 @@ interface HTMLTableElement : HTMLElement {
|
|||
[SameObject] readonly attribute HTMLCollection rows;
|
||||
HTMLTableRowElement insertRow(optional long index = -1);
|
||||
[CEReactions] void deleteRow(long index);
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLTableCaptionElement : HTMLElement {
|
||||
// also has obsolete members
|
||||
};
|
||||
interface HTMLTableCaptionElement : HTMLElement {};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLTableColElement : HTMLElement {
|
||||
[CEReactions] attribute unsigned long span;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
interface HTMLTableSectionElement : HTMLElement {
|
||||
[SameObject] readonly attribute HTMLCollection rows;
|
||||
HTMLElement insertRow(optional long index = -1);
|
||||
HTMLTableRowElement insertRow(optional long index = -1);
|
||||
[CEReactions] void deleteRow(long index);
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -743,8 +699,6 @@ interface HTMLTableRowElement : HTMLElement {
|
|||
[SameObject] readonly attribute HTMLCollection cells;
|
||||
HTMLTableCellElement insertCell(optional long index = -1);
|
||||
[CEReactions] void deleteCell(long index);
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -757,8 +711,6 @@ interface HTMLTableCellElement : HTMLElement {
|
|||
|
||||
[CEReactions] attribute DOMString scope; // only conforming for th elements
|
||||
[CEReactions] attribute DOMString abbr; // only conforming for th elements
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -855,8 +807,6 @@ interface HTMLInputElement : HTMLElement {
|
|||
void setRangeText(DOMString replacement);
|
||||
void setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
|
||||
void setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
|
@ -969,7 +919,7 @@ interface HTMLTextAreaElement : HTMLElement {
|
|||
|
||||
readonly attribute DOMString type;
|
||||
[CEReactions] attribute DOMString defaultValue;
|
||||
[CEReactions] attribute [TreatNullAs=EmptyString] DOMString value;
|
||||
attribute [TreatNullAs=EmptyString] DOMString value;
|
||||
readonly attribute unsigned long textLength;
|
||||
|
||||
readonly attribute boolean willValidate;
|
||||
|
@ -1055,8 +1005,6 @@ interface HTMLFieldSetElement : HTMLElement {
|
|||
HTMLConstructor]
|
||||
interface HTMLLegendElement : HTMLElement {
|
||||
readonly attribute HTMLFormElement? form;
|
||||
|
||||
// also has obsolete members
|
||||
};
|
||||
|
||||
enum SelectionMode {
|
||||
|
@ -1118,6 +1066,7 @@ interface HTMLScriptElement : HTMLElement {
|
|||
[CEReactions] attribute DOMString? crossOrigin;
|
||||
[CEReactions] attribute DOMString text;
|
||||
[CEReactions] attribute DOMString integrity;
|
||||
[CEReactions] attribute DOMString referrerPolicy;
|
||||
|
||||
};
|
||||
|
||||
|
@ -1139,7 +1088,7 @@ dictionary AssignedNodesOptions {
|
|||
boolean flatten = false;
|
||||
};
|
||||
|
||||
typedef (CanvasRenderingContext2D or ImageBitmapRenderingContext or WebGLRenderingContext) RenderingContext;
|
||||
typedef (CanvasRenderingContext2D or ImageBitmapRenderingContext or WebGLRenderingContext or WebGL2RenderingContext) RenderingContext;
|
||||
|
||||
[Exposed=Window,
|
||||
HTMLConstructor]
|
||||
|
@ -1177,6 +1126,8 @@ enum ImageSmoothingQuality { "low", "medium", "high" };
|
|||
interface CanvasRenderingContext2D {
|
||||
// back-reference to the canvas
|
||||
readonly attribute HTMLCanvasElement canvas;
|
||||
|
||||
CanvasRenderingContext2DSettings getContextAttributes();
|
||||
};
|
||||
CanvasRenderingContext2D includes CanvasState;
|
||||
CanvasRenderingContext2D includes CanvasTransform;
|
||||
|
@ -1212,6 +1163,7 @@ interface mixin CanvasTransform {
|
|||
void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
|
||||
void setTransform(optional DOMMatrix2DInit transform);
|
||||
void resetTransform();
|
||||
|
||||
};
|
||||
|
||||
interface mixin CanvasCompositing {
|
||||
|
@ -1224,6 +1176,7 @@ interface mixin CanvasImageSmoothing {
|
|||
// image smoothing
|
||||
attribute boolean imageSmoothingEnabled; // (default true)
|
||||
attribute ImageSmoothingQuality imageSmoothingQuality; // (default low)
|
||||
|
||||
};
|
||||
|
||||
interface mixin CanvasFillStrokeStyles {
|
||||
|
@ -1233,6 +1186,7 @@ interface mixin CanvasFillStrokeStyles {
|
|||
CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
|
||||
CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
|
||||
CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition);
|
||||
|
||||
};
|
||||
|
||||
interface mixin CanvasShadowStyles {
|
||||
|
@ -1264,7 +1218,6 @@ interface mixin CanvasDrawPath {
|
|||
void stroke(Path2D path);
|
||||
void clip(optional CanvasFillRule fillRule = "nonzero");
|
||||
void clip(Path2D path, optional CanvasFillRule fillRule = "nonzero");
|
||||
void resetClip();
|
||||
boolean isPointInPath(unrestricted double x, unrestricted double y, optional CanvasFillRule fillRule = "nonzero");
|
||||
boolean isPointInPath(Path2D path, unrestricted double x, unrestricted double y, optional CanvasFillRule fillRule = "nonzero");
|
||||
boolean isPointInStroke(unrestricted double x, unrestricted double y);
|
||||
|
@ -1336,9 +1289,12 @@ interface mixin CanvasPath {
|
|||
void quadraticCurveTo(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y);
|
||||
void bezierCurveTo(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y);
|
||||
void arcTo(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius);
|
||||
|
||||
void rect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
void arc(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
|
||||
|
||||
void ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
|
||||
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker)]
|
||||
|
@ -1353,7 +1309,7 @@ interface CanvasPattern {
|
|||
void setTransform(optional DOMMatrix2DInit transform);
|
||||
};
|
||||
|
||||
[Exposed=Window]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface TextMetrics {
|
||||
// x-direction
|
||||
readonly attribute double width; // advance width
|
||||
|
@ -1367,7 +1323,9 @@ interface TextMetrics {
|
|||
readonly attribute double actualBoundingBoxDescent;
|
||||
readonly attribute double emHeightAscent;
|
||||
readonly attribute double emHeightDescent;
|
||||
Baselines getBaselines();
|
||||
readonly attribute double hangingBaseline;
|
||||
readonly attribute double alphabeticBaseline;
|
||||
readonly attribute double ideographicBaseline;
|
||||
};
|
||||
|
||||
[Constructor(unsigned long sw, unsigned long sh),
|
||||
|
@ -1397,27 +1355,25 @@ dictionary ImageBitmapRenderingContextSettings {
|
|||
boolean alpha = true;
|
||||
};
|
||||
|
||||
typedef (OffscreenCanvasRenderingContext2D or
|
||||
WebGLRenderingContext) OffscreenRenderingContext;
|
||||
typedef (OffscreenCanvasRenderingContext2D or WebGLRenderingContext or WebGL2RenderingContext) OffscreenRenderingContext;
|
||||
|
||||
dictionary ImageEncodeOptions {
|
||||
DOMString type = "image/png";
|
||||
unrestricted double quality = 1.0;
|
||||
};
|
||||
|
||||
enum OffscreenRenderingContextId { "2d", "webgl" };
|
||||
enum OffscreenRenderingContextId { "2d", "webgl", "webgl2" };
|
||||
|
||||
[Constructor([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height), Exposed=(Window,Worker), Transferable]
|
||||
interface OffscreenCanvas : EventTarget {
|
||||
attribute unsigned long long width;
|
||||
attribute unsigned long long height;
|
||||
attribute [EnforceRange] unsigned long long width;
|
||||
attribute [EnforceRange] unsigned long long height;
|
||||
|
||||
OffscreenRenderingContext? getContext(OffscreenRenderingContextId contextId, optional any options = null);
|
||||
ImageBitmap transferToImageBitmap();
|
||||
Promise<Blob> convertToBlob(optional ImageEncodeOptions options);
|
||||
};
|
||||
|
||||
|
||||
[Exposed=(Window,Worker)]
|
||||
interface OffscreenCanvasRenderingContext2D {
|
||||
void commit();
|
||||
|
@ -1433,33 +1389,41 @@ OffscreenCanvasRenderingContext2D includes CanvasShadowStyles;
|
|||
OffscreenCanvasRenderingContext2D includes CanvasFilters;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasRect;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasDrawPath;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasText;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasDrawImage;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasImageData;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles;
|
||||
OffscreenCanvasRenderingContext2D includes CanvasPath;
|
||||
|
||||
|
||||
[Exposed=Window]
|
||||
interface CustomElementRegistry {
|
||||
[CEReactions] void define(DOMString name, Function constructor, optional ElementDefinitionOptions options);
|
||||
[CEReactions] void define(DOMString name, CustomElementConstructor constructor, optional ElementDefinitionOptions options);
|
||||
any get(DOMString name);
|
||||
Promise<void> whenDefined(DOMString name);
|
||||
[CEReactions] void upgrade(Node root);
|
||||
};
|
||||
|
||||
callback CustomElementConstructor = any ();
|
||||
|
||||
dictionary ElementDefinitionOptions {
|
||||
DOMString extends;
|
||||
};
|
||||
|
||||
dictionary FocusOptions {
|
||||
boolean preventScroll = false;
|
||||
};
|
||||
|
||||
interface mixin ElementContentEditable {
|
||||
[CEReactions] attribute DOMString contentEditable;
|
||||
[CEReactions] attribute DOMString enterKeyHint;
|
||||
readonly attribute boolean isContentEditable;
|
||||
[CEReactions] attribute DOMString inputMode;
|
||||
};
|
||||
|
||||
[Exposed=Window,
|
||||
Constructor]
|
||||
interface DataTransfer {
|
||||
interface DataTransfer {
|
||||
attribute DOMString dropEffect;
|
||||
attribute DOMString effectAllowed;
|
||||
|
||||
|
@ -1514,6 +1478,7 @@ interface Window : EventTarget {
|
|||
[Replaceable] readonly attribute WindowProxy self;
|
||||
[Unforgeable] readonly attribute Document document;
|
||||
attribute DOMString name;
|
||||
|
||||
[PutForwards=href, Unforgeable] readonly attribute Location location;
|
||||
readonly attribute History history;
|
||||
readonly attribute CustomElementRegistry customElements;
|
||||
|
@ -1545,7 +1510,8 @@ interface Window : EventTarget {
|
|||
|
||||
// the user agent
|
||||
readonly attribute Navigator navigator;
|
||||
readonly attribute ApplicationCache applicationCache;
|
||||
|
||||
[SecureContext] readonly attribute ApplicationCache applicationCache;
|
||||
|
||||
// user prompts
|
||||
void alert();
|
||||
|
@ -1554,20 +1520,12 @@ interface Window : EventTarget {
|
|||
DOMString? prompt(optional DOMString message = "", optional DOMString default = "");
|
||||
void print();
|
||||
|
||||
unsigned long requestAnimationFrame(FrameRequestCallback callback);
|
||||
void cancelAnimationFrame(unsigned long handle);
|
||||
|
||||
void postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []);
|
||||
void postMessage(any message, optional sequence<object> transfer = [], optional WindowPostMessageOptions options);
|
||||
|
||||
// also has obsolete members
|
||||
void postMessage(any message, optional WindowPostMessageOptions options);
|
||||
};
|
||||
Window includes GlobalEventHandlers;
|
||||
Window includes WindowEventHandlers;
|
||||
|
||||
callback FrameRequestCallback = void (DOMHighResTimeStamp time);
|
||||
|
||||
dictionary WindowPostMessageOptions {
|
||||
dictionary WindowPostMessageOptions : PostMessageOptions {
|
||||
USVString targetOrigin = "/";
|
||||
};
|
||||
|
||||
|
@ -1580,7 +1538,6 @@ enum ScrollRestoration { "auto", "manual" };
|
|||
|
||||
[Exposed=Window]
|
||||
interface History {
|
||||
readonly attribute unsigned long index;
|
||||
readonly attribute unsigned long length;
|
||||
attribute ScrollRestoration scrollRestoration;
|
||||
readonly attribute any state;
|
||||
|
@ -1647,7 +1604,8 @@ interface BeforeUnloadEvent : Event {
|
|||
attribute DOMString returnValue;
|
||||
};
|
||||
|
||||
[Exposed=Window]
|
||||
[SecureContext,
|
||||
Exposed=Window]
|
||||
interface ApplicationCache : EventTarget {
|
||||
|
||||
// update status
|
||||
|
@ -1825,6 +1783,9 @@ interface mixin WindowOrWorkerGlobalScope {
|
|||
long setInterval(TimerHandler handler, optional long timeout = 0, any... arguments);
|
||||
void clearInterval(optional long handle = 0);
|
||||
|
||||
// microtask queuing
|
||||
void queueMicrotask(VoidFunction callback);
|
||||
|
||||
// ImageBitmap
|
||||
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options);
|
||||
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options);
|
||||
|
@ -1854,8 +1815,6 @@ interface mixin NavigatorID {
|
|||
readonly attribute DOMString userAgent;
|
||||
[Exposed=Window] readonly attribute DOMString vendor;
|
||||
[Exposed=Window] readonly attribute DOMString vendorSub; // constant ""
|
||||
|
||||
// also has additional members in a partial interface
|
||||
};
|
||||
|
||||
partial interface NavigatorID {
|
||||
|
@ -1944,6 +1903,15 @@ dictionary ImageBitmapOptions {
|
|||
ResizeQuality resizeQuality = "low";
|
||||
};
|
||||
|
||||
callback FrameRequestCallback = void (DOMHighResTimeStamp time);
|
||||
|
||||
interface mixin AnimationFrameProvider {
|
||||
unsigned long requestAnimationFrame(FrameRequestCallback callback);
|
||||
void cancelAnimationFrame(unsigned long handle);
|
||||
};
|
||||
Window includes AnimationFrameProvider;
|
||||
DedicatedWorkerGlobalScope includes AnimationFrameProvider;
|
||||
|
||||
[Constructor(DOMString type, optional MessageEventInit eventInitDict), Exposed=(Window,Worker,AudioWorklet)]
|
||||
interface MessageEvent : Event {
|
||||
readonly attribute any data;
|
||||
|
@ -2038,7 +2006,8 @@ interface MessageChannel {
|
|||
|
||||
[Exposed=(Window,Worker,AudioWorklet), Transferable]
|
||||
interface MessagePort : EventTarget {
|
||||
void postMessage(any message, optional sequence<object> transfer = []);
|
||||
void postMessage(any message, sequence<object> transfer);
|
||||
void postMessage(any message, optional PostMessageOptions options);
|
||||
void start();
|
||||
void close();
|
||||
|
||||
|
@ -2047,6 +2016,10 @@ interface MessagePort : EventTarget {
|
|||
attribute EventHandler onmessageerror;
|
||||
};
|
||||
|
||||
dictionary PostMessageOptions {
|
||||
sequence<object> transfer = [];
|
||||
};
|
||||
|
||||
[Constructor(DOMString name), Exposed=(Window,Worker)]
|
||||
interface BroadcastChannel : EventTarget {
|
||||
readonly attribute DOMString name;
|
||||
|
@ -2075,7 +2048,8 @@ interface WorkerGlobalScope : EventTarget {
|
|||
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
|
||||
[Replaceable] readonly attribute DOMString name;
|
||||
|
||||
void postMessage(any message, optional sequence<object> transfer = []);
|
||||
void postMessage(any message, sequence<object> transfer);
|
||||
void postMessage(any message, optional PostMessageOptions options);
|
||||
|
||||
void close();
|
||||
|
||||
|
@ -2100,14 +2074,15 @@ interface mixin AbstractWorker {
|
|||
interface Worker : EventTarget {
|
||||
void terminate();
|
||||
|
||||
void postMessage(any message, optional sequence<object> transfer = []);
|
||||
void postMessage(any message, sequence<object> transfer);
|
||||
void postMessage(any message, optional PostMessageOptions options);
|
||||
attribute EventHandler onmessage;
|
||||
attribute EventHandler onmessageerror;
|
||||
};
|
||||
|
||||
dictionary WorkerOptions {
|
||||
WorkerType type = "classic";
|
||||
RequestCredentials credentials = "omit"; // credentials is only used if type is "module"
|
||||
RequestCredentials credentials = "same-origin"; // credentials is only used if type is "module"
|
||||
DOMString name = "";
|
||||
};
|
||||
|
||||
|
@ -2174,6 +2149,8 @@ interface StorageEvent : Event {
|
|||
readonly attribute DOMString? newValue;
|
||||
readonly attribute USVString url;
|
||||
readonly attribute Storage? storageArea;
|
||||
|
||||
void initStorageEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional DOMString? key = null, optional DOMString? oldValue = null, optional DOMString? newValue = null, optional USVString url = "", optional Storage? storageArea = null);
|
||||
};
|
||||
|
||||
dictionary StorageEventInit : EventInit {
|
||||
|
@ -2293,6 +2270,7 @@ interface HTMLFontElement : HTMLElement {
|
|||
[CEReactions] attribute [TreatNullAs=EmptyString] DOMString color;
|
||||
[CEReactions] attribute DOMString face;
|
||||
[CEReactions] attribute DOMString size;
|
||||
|
||||
};
|
||||
|
||||
partial interface HTMLHeadingElement {
|
||||
|
|
|
@ -402,6 +402,7 @@ dictionary RTCRtpSynchronizationSource : RTCRtpContributingSource {
|
|||
};
|
||||
|
||||
[Exposed=Window] interface RTCDtlsTransport : EventTarget {
|
||||
[SameObject]
|
||||
readonly attribute RTCIceTransport iceTransport;
|
||||
readonly attribute RTCDtlsTransportState state;
|
||||
sequence<ArrayBuffer> getRemoteCertificates();
|
||||
|
|
|
@ -7,3 +7,32 @@ test(() => {
|
|||
assert_false(types.includes("taskattribution"),
|
||||
"There should NOT be 'taskattribution' in PerformanceObserver.supportedEntryTypes");
|
||||
}, "supportedEntryTypes contains 'longtask' but not 'taskattribution'.");
|
||||
|
||||
function syncWait(waitDuration) {
|
||||
if (waitDuration <= 0)
|
||||
return;
|
||||
|
||||
const startTime = performance.now();
|
||||
let unused = '';
|
||||
for (let i = 0; i < 10000; i++)
|
||||
unused += '' + Math.random();
|
||||
|
||||
return syncWait(waitDuration - (performance.now() - startTime));
|
||||
}
|
||||
|
||||
if (typeof PerformanceObserver.supportedEntryTypes !== "undefined") {
|
||||
const entryType = "longtask";
|
||||
if (PerformanceObserver.supportedEntryTypes.includes(entryType)) {
|
||||
promise_test(async () => {
|
||||
await new Promise((resolve) => {
|
||||
new PerformanceObserver(function (list, observer) {
|
||||
observer.disconnect();
|
||||
resolve();
|
||||
}).observe({entryTypes: [entryType]});
|
||||
|
||||
// Force the PerformanceEntry.
|
||||
syncWait(50);
|
||||
})
|
||||
}, `'${entryType}' entries should be observable.`)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,3 +4,17 @@ test(() => {
|
|||
assert_true(PerformanceObserver.supportedEntryTypes.includes("navigation"),
|
||||
"There should be an entry 'navigation' in PerformanceObserver.supportedEntryTypes");
|
||||
}, "supportedEntryTypes contains 'navigation'.");
|
||||
|
||||
if (typeof PerformanceObserver.supportedEntryTypes !== "undefined") {
|
||||
const entryType = "navigation";
|
||||
if (PerformanceObserver.supportedEntryTypes.includes(entryType)) {
|
||||
promise_test(async() => {
|
||||
await new Promise((resolve) => {
|
||||
new PerformanceObserver(function (list, observer) {
|
||||
observer.disconnect();
|
||||
resolve();
|
||||
}).observe({entryTypes: [entryType]});
|
||||
})
|
||||
}, `'${entryType}' entries should be observable.`)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,3 +4,22 @@ test(() => {
|
|||
assert_true(PerformanceObserver.supportedEntryTypes.includes("paint"),
|
||||
"There should be an entry 'paint' in PerformanceObserver.supportedEntryTypes");
|
||||
}, "supportedEntryTypes contains 'paint'.");
|
||||
|
||||
if (typeof PerformanceObserver.supportedEntryTypes !== "undefined") {
|
||||
const entryType = 'paint';
|
||||
if (PerformanceObserver.supportedEntryTypes.includes(entryType)) {
|
||||
promise_test(async() => {
|
||||
await new Promise((resolve) => {
|
||||
new PerformanceObserver(function (list, observer) {
|
||||
observer.disconnect();
|
||||
resolve();
|
||||
}).observe({entryTypes: [entryType]});
|
||||
|
||||
// Force the PerformanceEntry.
|
||||
// Use `self` for Workers.
|
||||
if (self.document)
|
||||
document.head.parentNode.appendChild(document.createTextNode('foo'));
|
||||
})
|
||||
}, `'${entryType}' entries should be observable.`)
|
||||
}
|
||||
}
|
||||
|
|
1
tests/wpt/web-platform-tests/payment-request/blank.html
Normal file
1
tests/wpt/web-platform-tests/payment-request/blank.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!DOCTYPE html> <meta charset="utf-8" />
|
|
@ -0,0 +1,380 @@
|
|||
<!DOCTYPE html> <meta charset="utf-8" />
|
||||
<title>Test for PaymentRequest.show(optional promise) method</title>
|
||||
<link
|
||||
rel="help"
|
||||
href="https://w3c.github.io/browser-payment-api/#dfn-payment-request-is-showing"
|
||||
/>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
"use strict";
|
||||
const applePayMethod = {
|
||||
supportedMethods: "https://apple.com/apple-pay",
|
||||
data: {
|
||||
version: 3,
|
||||
merchantIdentifier: "merchant.com.example",
|
||||
countryCode: "US",
|
||||
merchantCapabilities: ["supports3DS"],
|
||||
supportedNetworks: ["visa"],
|
||||
},
|
||||
};
|
||||
const methods = [{ supportedMethods: "basic-card" }, applePayMethod];
|
||||
const details = {
|
||||
total: {
|
||||
label: "Total",
|
||||
amount: {
|
||||
currency: "USD",
|
||||
value: "1.00",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Attaches an iframe to window.document.
|
||||
*
|
||||
* @param {String} src Optional resource URL to load.
|
||||
* @returns {Promise} Resolves when the src loads.
|
||||
*/
|
||||
async function attachIframe(src = "blank.html") {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.allowPaymentRequest = true;
|
||||
iframe.src = src;
|
||||
document.body.appendChild(iframe);
|
||||
await new Promise(resolve => {
|
||||
iframe.addEventListener("load", resolve, { once: true });
|
||||
});
|
||||
return iframe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a popup window
|
||||
*
|
||||
* @param {String} src Optional resource URL to load.
|
||||
* @returns {Promise} Resolves when the src loads.
|
||||
*/
|
||||
async function loadPopup(src = "blank.html") {
|
||||
const popupWindow = await test_driver.bless("a popup window", () =>
|
||||
window.open(src, "", "width=400,height=400")
|
||||
);
|
||||
await new Promise(resolve => {
|
||||
popupWindow.addEventListener("load", resolve, { once: true });
|
||||
});
|
||||
popupWindow.focus();
|
||||
return popupWindow;
|
||||
}
|
||||
|
||||
promise_test(async t => {
|
||||
const request1 = new PaymentRequest(methods, details);
|
||||
const request2 = new PaymentRequest(methods, details);
|
||||
|
||||
// Sets the "payment-relevant browsing context's payment request is showing boolean" to true.
|
||||
const showPromise1 = test_driver.bless("show payment request", () =>
|
||||
request1.show()
|
||||
);
|
||||
|
||||
// Try to show a second payment sheet in the same window, which should reject.
|
||||
const showPromise2 = test_driver.bless("show payment request", () =>
|
||||
// Sets the request's state to "closed", and rejects with AbortError.
|
||||
// See: https://github.com/w3c/payment-request/pull/821
|
||||
request2.show()
|
||||
);
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
showPromise2,
|
||||
"Attempting to show a second payment request must reject."
|
||||
);
|
||||
await request1.abort();
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
showPromise1,
|
||||
"request1 was aborted via .abort()"
|
||||
);
|
||||
// Finally, request2 should have been "closed", so trying to show
|
||||
// it will again result in promise rejected with an InvalidStateError.
|
||||
// See: https://github.com/w3c/payment-request/pull/821
|
||||
const rejectedPromise = request2.show();
|
||||
await promise_rejects(
|
||||
t,
|
||||
"InvalidStateError",
|
||||
rejectedPromise,
|
||||
"Attempting to show a second payment request must reject."
|
||||
);
|
||||
// Finally, we confirm that request2's returned promises are unique.
|
||||
assert_not_equals(
|
||||
showPromise2,
|
||||
rejectedPromise,
|
||||
"Returned Promises be unique"
|
||||
);
|
||||
}, "The top browsing context can only show one payment sheet at a time.");
|
||||
|
||||
promise_test(async t => {
|
||||
const iframe = await attachIframe();
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
|
||||
// Payment requests
|
||||
const iframeRequest = new iframeWindow.PaymentRequest(methods, details);
|
||||
const windowRequest = new window.PaymentRequest(methods, details);
|
||||
|
||||
// Let's get some blessed showPromises
|
||||
const showPromise = test_driver.bless("show payment request", () => {
|
||||
// iframe sets "is showing boolean", ignore the returned promise.
|
||||
iframeRequest.show();
|
||||
// The top level window now tries to show() the payment request.
|
||||
return windowRequest.show();
|
||||
});
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
showPromise,
|
||||
"iframe is already showing a payment request."
|
||||
);
|
||||
|
||||
// Cleanup
|
||||
await iframeRequest.abort();
|
||||
iframe.remove();
|
||||
}, "If an iframe shows a payment request, the top-level browsing context can't also show one.");
|
||||
|
||||
promise_test(async t => {
|
||||
const iframe = await attachIframe();
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
|
||||
// Payment requests
|
||||
const iframeRequest = new iframeWindow.PaymentRequest(methods, details);
|
||||
const windowRequest = new window.PaymentRequest(methods, details);
|
||||
|
||||
// We show a payment request via the the top level browsing context,
|
||||
// windowRequest.show() sets "is showing boolean" to true.
|
||||
// We don't care about the returned promise.
|
||||
test_driver.bless("show payment request", () => windowRequest.show());
|
||||
|
||||
// calling iframeRequest.show() must return a rejected promise.
|
||||
const iframeShowPromise = test_driver.bless("show payment request", () =>
|
||||
iframeRequest.show()
|
||||
);
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
iframeShowPromise,
|
||||
"The top window is already showing a payment request."
|
||||
);
|
||||
|
||||
// Cleanup
|
||||
await windowRequest.abort();
|
||||
iframe.remove();
|
||||
}, "An iframe cannot show a payment request if the top-level window is already showing one.");
|
||||
|
||||
promise_test(async t => {
|
||||
const popupWindow = await loadPopup();
|
||||
|
||||
// Create requests
|
||||
const popupRequest = new popupWindow.PaymentRequest(methods, details);
|
||||
const windowRequest = new window.PaymentRequest(methods, details);
|
||||
|
||||
// show the Popup's payment request.
|
||||
const popupShowPromise = test_driver.bless(
|
||||
"show popup's payment request",
|
||||
() =>
|
||||
// popupRequest.show(), but via the window.PaymentRequest.prototype
|
||||
window.PaymentRequest.prototype.show.call(popupRequest)
|
||||
);
|
||||
const showPromise = test_driver.bless("show window payment request", () =>
|
||||
windowRequest.show()
|
||||
);
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
showPromise,
|
||||
"Expected window's showPromise to reject, request is already showing"
|
||||
);
|
||||
popupWindow.close();
|
||||
}, "Using a popup window prevents the top-browsing context from showing a payment request");
|
||||
|
||||
promise_test(async t => {
|
||||
const iframe = await attachIframe();
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
const popupWindow = await loadPopup();
|
||||
|
||||
// Create requests
|
||||
const windowRequest = new window.PaymentRequest(methods, details);
|
||||
const popupRequest = new popupWindow.PaymentRequest(methods, details);
|
||||
const iframeRequest = new iframeWindow.PaymentRequest(methods, details);
|
||||
// Get the showPromise for each browsing context
|
||||
const [
|
||||
windowShowPromise,
|
||||
popupShowPromise,
|
||||
iframeShowPromise,
|
||||
] = await test_driver.bless("show payment request", () => {
|
||||
return [
|
||||
windowRequest.show(),
|
||||
popupRequest.show(),
|
||||
iframeRequest.show(),
|
||||
];
|
||||
});
|
||||
|
||||
// popupRequest and iframeRequest will both reject
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
popupShowPromise,
|
||||
"Expected popupShowPromise to reject, request is already showing."
|
||||
);
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
iframeShowPromise,
|
||||
"Expected iframeShowPromise to reject, request is already showing."
|
||||
);
|
||||
|
||||
await windowRequest.abort();
|
||||
popupWindow.close();
|
||||
iframe.remove();
|
||||
}, "Given multiple nested browsing contexts, and window calls show() first, other nested browsing contexts can't show a request.");
|
||||
|
||||
promise_test(async t => {
|
||||
const iframe = await attachIframe();
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
const popupWindow = await loadPopup();
|
||||
|
||||
// Create requests
|
||||
const windowRequest = new window.PaymentRequest(methods, details);
|
||||
const popupRequest = new popupWindow.PaymentRequest(methods, details);
|
||||
const iframeRequest = new iframeWindow.PaymentRequest(methods, details);
|
||||
|
||||
// Get the showPromise for each browsing context
|
||||
const [
|
||||
popupShowPromise,
|
||||
windowShowPromise,
|
||||
iframeShowPromise,
|
||||
] = await test_driver.bless("show payment request", () => {
|
||||
return [
|
||||
popupRequest.show(),
|
||||
windowRequest.show(),
|
||||
iframeRequest.show(),
|
||||
];
|
||||
});
|
||||
|
||||
// windowShowPromise and iframeRequest will both reject
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
windowShowPromise,
|
||||
"Expected windowShowPromise to reject, the popup is showing a payment request."
|
||||
);
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
iframeShowPromise,
|
||||
"Expected iframeShowPromise to reject, the popup is showing a payment request."
|
||||
);
|
||||
|
||||
await popupRequest.abort();
|
||||
popupWindow.close();
|
||||
iframe.remove();
|
||||
}, "Given multiple nested browsing contexts, and popup calls show() first, other nested browsing contexts can't show a request.");
|
||||
|
||||
promise_test(async t => {
|
||||
const iframe = await attachIframe();
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
const popupWindow = await loadPopup();
|
||||
|
||||
// Create requests
|
||||
const windowRequest = new window.PaymentRequest(methods, details);
|
||||
const popupRequest = new popupWindow.PaymentRequest(methods, details);
|
||||
const iframeRequest = new iframeWindow.PaymentRequest(methods, details);
|
||||
|
||||
// Get the showPromise for each browsing context
|
||||
const [
|
||||
iframeShowPromise,
|
||||
popupShowPromise,
|
||||
windowShowPromise,
|
||||
] = await test_driver.bless("show payment request", () => {
|
||||
return [
|
||||
iframeRequest.show(),
|
||||
popupRequest.show(),
|
||||
windowRequest.show(),
|
||||
];
|
||||
});
|
||||
|
||||
// windowShowPromise and iframeRequest will both reject
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
windowShowPromise,
|
||||
"Expected windowShowPromise to reject, the popup is showing a payment request."
|
||||
);
|
||||
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
popupShowPromise,
|
||||
"Expected popupShowPromise to reject, the popup is showing a payment request."
|
||||
);
|
||||
|
||||
await iframeRequest.abort();
|
||||
popupWindow.close();
|
||||
iframe.remove();
|
||||
}, "Given multiple nested browsing contexts, and an iframe calls show() first, other nested browsing contexts can't show a request.");
|
||||
|
||||
promise_test(async t => {
|
||||
const iframe = await attachIframe();
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
const iframeRequest = new iframeWindow.PaymentRequest(methods, details);
|
||||
const iframeShowPromise = test_driver.bless("show payment request", () =>
|
||||
iframeRequest.show()
|
||||
);
|
||||
|
||||
// We navigate away, causing the payment sheet to close
|
||||
// and the request is showing boolean to become false.
|
||||
iframe.src = "blank.html?abc=123";
|
||||
await new Promise(resolve => (iframe.onload = resolve));
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
iframeShowPromise,
|
||||
"Navigating iframe away must cause the iframeShowPromise to reject."
|
||||
);
|
||||
iframe.remove();
|
||||
|
||||
// Now we should be ok to spin up a new payment request
|
||||
const request = new window.PaymentRequest(method, details);
|
||||
const showPromise = request.show();
|
||||
await request.abort();
|
||||
}, "Navigating an iframe as a nested browsing context sets 'payment request is showing boolean' to false.");
|
||||
|
||||
promise_test(async t => {
|
||||
const popupWindow = await loadPopup();
|
||||
const popupRequest = new popupWindow.PaymentRequest(methods, details);
|
||||
const showPromise = test_driver.bless("show payment request", () =>
|
||||
popupRequest.show()
|
||||
);
|
||||
|
||||
// We navigate away, causing the payment sheet to close
|
||||
// and the request is showing boolean to become false.
|
||||
popupWindow.location = "blank.html?abc=123";
|
||||
await new Promise(resolve => (popupWindow.onload = resolve));
|
||||
await promise_rejects(
|
||||
t,
|
||||
"AbortError",
|
||||
showPromise,
|
||||
"Navigating away must cause the showPromise to reject with an AbortError"
|
||||
);
|
||||
popupWindow.close();
|
||||
|
||||
// Now we should be ok to spin up a new payment request.
|
||||
const request = new window.PaymentRequest(method, details);
|
||||
request.show();
|
||||
await request.abort();
|
||||
}, "Navigating a popup as a nested browsing context sets 'payment request is showing boolean' to false.");
|
||||
</script>
|
||||
</body>
|
|
@ -7,6 +7,9 @@
|
|||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="pointerevent_support.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-actions.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<style>
|
||||
.box {
|
||||
margin: 10px;
|
||||
|
@ -35,13 +38,13 @@
|
|||
phase = PhaseEnum.Phase1;
|
||||
receivedEvents = [];
|
||||
}
|
||||
|
||||
|
||||
function run() {
|
||||
var test_pointerEvent = setup_pointerevent_test("click target during capture", ['mouse']);
|
||||
var grey = document.getElementById('grey');
|
||||
var blue = document.getElementById('blue');
|
||||
var green = document.getElementById('green');
|
||||
|
||||
|
||||
['gotpointercapture', 'lostpointercapture', 'pointerdown', 'pointerup', 'click'].forEach(function(eventName) {
|
||||
[grey, blue, green].forEach(function(target) {
|
||||
target.addEventListener(eventName, function(event) {
|
||||
|
@ -49,14 +52,14 @@
|
|||
receivedEvents.push(event.type + '@' + target.id);
|
||||
if (phase == PhaseEnum.Phase1 && target == green && event.type == 'click') {
|
||||
test(function() {
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@green,pointerup@green,click@green', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@green,pointerup@green,click@green', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
}, "Click target when pointerup/down targeted at the same element with no capture");
|
||||
phase = PhaseEnum.Phase2;
|
||||
receivedEvents = [];
|
||||
}
|
||||
if (phase == PhaseEnum.Phase2 && target == grey && event.type == 'click') {
|
||||
test(function() {
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@blue,pointerup@green,click@grey', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@blue,pointerup@green,click@grey', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
}, "Click target when pointerup/down targeted at different elements with no capture");
|
||||
phase = PhaseEnum.Phase1WithCapturing;
|
||||
receivedEvents = [];
|
||||
|
@ -64,13 +67,13 @@
|
|||
if (target == blue && event.type == 'lostpointercapture') {
|
||||
if (phase == PhaseEnum.Phase1WithCapturing) {
|
||||
test_pointerEvent.step(function() {
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@green,gotpointercapture@blue,pointerup@blue,click@grey,lostpointercapture@blue', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@green,gotpointercapture@blue,pointerup@blue,click@grey,lostpointercapture@blue', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
});
|
||||
phase = PhaseEnum.Phase2WithCapturing;
|
||||
receivedEvents = [];
|
||||
} else if (phase == PhaseEnum.Phase2WithCapturing) {
|
||||
test_pointerEvent.step(function() {
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@blue,gotpointercapture@blue,pointerup@blue,click@blue,lostpointercapture@blue', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
assert_equals(receivedEvents.join(','), 'pointerdown@blue,gotpointercapture@blue,pointerup@blue,click@blue,lostpointercapture@blue', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
|
||||
});
|
||||
test_pointerEvent.done();
|
||||
}
|
||||
|
@ -83,6 +86,27 @@
|
|||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Inject mouse inputs.
|
||||
var green = document.getElementById('green');
|
||||
var blue = document.getElementById('blue');
|
||||
new test_driver.Actions()
|
||||
.pointerMove(0, 0, {origin: green})
|
||||
.pointerDown()
|
||||
.pointerUp()
|
||||
.pointerMove(0, 0, {origin: blue})
|
||||
.pointerDown()
|
||||
.pointerMove(0, 0, {origin: green})
|
||||
.pointerUp()
|
||||
.pointerMove(0, 0, {origin: green})
|
||||
.pointerDown()
|
||||
.pointerUp()
|
||||
.pointerMove(0, 0, {origin: blue})
|
||||
.pointerDown()
|
||||
.pointerMove(0, 0, {origin: green})
|
||||
.pointerUp()
|
||||
.send();
|
||||
|
||||
}
|
||||
</script>
|
||||
</head>
|
|
@ -0,0 +1,44 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
let channelIndex = 0;
|
||||
async function openPortalAndReceiveMessage(portalSrc) {
|
||||
let channelName = `portals-host-exposure-${channelIndex++}`
|
||||
let broadcastChannel = new BroadcastChannel(channelName);
|
||||
try {
|
||||
let received = new Promise((resolve, reject) => {
|
||||
broadcastChannel.addEventListener('message', e => {
|
||||
resolve(e.data);
|
||||
}, {once: true})
|
||||
});
|
||||
let portal = document.createElement('portal');
|
||||
portal.src = `${portalSrc}?broadcastchannel=${channelName}`;
|
||||
document.body.appendChild(portal);
|
||||
return await received;
|
||||
} finally {
|
||||
broadcastChannel.close();
|
||||
}
|
||||
}
|
||||
|
||||
promise_test(async t => {
|
||||
let {hasHost} = await openPortalAndReceiveMessage(
|
||||
'resources/portal-host.html');
|
||||
assert_true(hasHost, "window.portalHost should be defined");
|
||||
}, "window.portalHost should be exposed in same-origin portal");
|
||||
|
||||
promise_test(async t => {
|
||||
let {hasHost} = await openPortalAndReceiveMessage(
|
||||
'http://{{hosts[alt][www]}}:{{ports[http][0]}}/portals/resources/portal-host-cross-origin.sub.html');
|
||||
assert_true(hasHost, "window.portalHost should be defined");
|
||||
}, "window.portalHost should be exposed in cross-origin portal");
|
||||
|
||||
promise_test(async t => {
|
||||
let {hasHost} = await openPortalAndReceiveMessage(
|
||||
'resources/portal-host-cross-origin-navigate.sub.html');
|
||||
assert_true(hasHost, "window.portalHost should be defined");
|
||||
}, "window.portalHost should be exposed in portal after cross-origin navigation");
|
||||
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
function forwardMessage(e) {
|
||||
let broadcastChannel = new BroadcastChannel(new URL(location).searchParams.get('broadcastchannel'));
|
||||
try {
|
||||
broadcastChannel.postMessage(e.data);
|
||||
} finally {
|
||||
broadcastChannel.close();
|
||||
}
|
||||
}
|
||||
window.addEventListener("message", forwardMessage);
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
let channelName = new URL(location).searchParams.get('broadcastchannel');
|
||||
window.location.href = `http://{{hosts[alt][www]}}:{{ports[http][0]}}/portals/resources/portal-host-cross-origin.sub.html?broadcastchannel=${channelName}`;
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
let message = {
|
||||
hasHost: !!window.portalHost
|
||||
};
|
||||
let forwardingIframe = document.createElement('iframe');
|
||||
let channelName = new URL(location).searchParams.get('broadcastchannel');
|
||||
forwardingIframe.src = `http://{{host}}:{{ports[http][0]}}/portals/resources/portal-forward-with-broadcast.sub.html?broadcastchannel=${channelName}`;
|
||||
forwardingIframe.onload = () => {
|
||||
forwardingIframe.contentWindow.postMessage(message, '*');
|
||||
}
|
||||
document.body.appendChild(forwardingIframe);
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
let message = {
|
||||
hasHost: !!window.portalHost
|
||||
};
|
||||
let broadcastChannel = new BroadcastChannel(new URL(location).searchParams.get('broadcastchannel'));
|
||||
try {
|
||||
broadcastChannel.postMessage(message);
|
||||
} finally {
|
||||
broadcastChannel.close();
|
||||
}
|
||||
</script>
|
||||
</body>
|
|
@ -4,3 +4,21 @@
|
|||
assert_true(PerformanceObserver.supportedEntryTypes.includes("resource"),
|
||||
"There should be an entry 'resource' in PerformanceObserver.supportedEntryTypes");
|
||||
}, "supportedEntryTypes contains 'resource'.");
|
||||
|
||||
if (typeof PerformanceObserver.supportedEntryTypes !== "undefined") {
|
||||
const entryType = "resource";
|
||||
if (PerformanceObserver.supportedEntryTypes.includes(entryType)) {
|
||||
promise_test(async() => {
|
||||
await new Promise((resolve) => {
|
||||
new PerformanceObserver(function (list, observer) {
|
||||
observer.disconnect();
|
||||
resolve();
|
||||
}).observe({entryTypes: [entryType]});
|
||||
|
||||
// Force the PerformanceEntry.
|
||||
// Use `self` for Workers.
|
||||
fetch(self.location.href + "?" + Math.random());
|
||||
})
|
||||
}, `'${entryType}' entries should be observable.`)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="test-helpers.sub.js?pipe=sub"></script>
|
||||
<script>
|
||||
var host_info = get_host_info();
|
||||
|
@ -11,7 +12,7 @@ function boilerplate_test(url, msg) {
|
|||
worker.postMessage(msg);
|
||||
})
|
||||
.then(function(data) {
|
||||
window.parent.postMessage({results: data}, host_info['HTTPS_ORIGIN']);
|
||||
assert_equals(data, "This load was successfully intercepted.");
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ self.onfetch = function(event) {
|
|||
if (url.indexOf("synthesized-response.txt") != -1) {
|
||||
event.respondWith(new Response(response_text));
|
||||
} else if (url.indexOf("synthesized-response.js") != -1) {
|
||||
event.respondWith(new Response(response_script));
|
||||
event.respondWith(new Response(
|
||||
response_script,
|
||||
{headers: {'Content-Type': 'application/javascript'}}));
|
||||
}
|
||||
};
|
||||
|
|
|
@ -106,12 +106,6 @@ promise_test(function(t) {
|
|||
var service_worker = 'resources/worker-load-interceptor.js';
|
||||
var scope = 'resources/';
|
||||
|
||||
window.addEventListener('message', t.step_func(on_message), false);
|
||||
function on_message(e) {
|
||||
assert_equals(e.data.results, "This load was successfully intercepted.");
|
||||
t.done();
|
||||
}
|
||||
|
||||
return service_worker_unregister_and_register(t, service_worker, scope)
|
||||
.then(function(r) {
|
||||
t.add_cleanup(function() {
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
assert_equals(el.title, INPUTS.URL);
|
||||
|
||||
el.title = policy.createURL(INPUTS.HTML);
|
||||
assert_equals(el.title, "");
|
||||
assert_equals(el.title, INPUTS.HTML);
|
||||
}, "Attributes without type constraints will work as before.");
|
||||
|
||||
test(t => {
|
||||
|
@ -71,14 +71,14 @@
|
|||
|
||||
const urlTestCases = [
|
||||
[ s => s, INPUTS.SCRIPTURL ],
|
||||
[ s => null, "" ],
|
||||
[ s => null, "null" ],
|
||||
[ s => s + "#duck", INPUTS.SCRIPTURL + "#duck" ],
|
||||
[ s => { throw new Error() }, new Error() ],
|
||||
[ s => s + "#" + aGlobalVarForSideEffectTesting,
|
||||
INPUTS.SCRIPTURL + "#global" ],
|
||||
[ anotherGlobalFunction.bind(aGlobalObject), INPUTS.SCRIPTURL + "#well," ],
|
||||
[ s => anotherGlobalFunction(s),
|
||||
INPUTS.SCRIPTURL + "#a%20global%20var%20named%20foo" ],
|
||||
INPUTS.SCRIPTURL + "#a global var named foo" ],
|
||||
];
|
||||
|
||||
function policyBuilder(trustedMethodName, trustedType, defaultArg) {
|
||||
|
|
|
@ -165,7 +165,7 @@
|
|||
}, "script_url = identity function");
|
||||
|
||||
test(t => {
|
||||
createScriptURLTest('TestPolicyScriptURL2', { createScriptURL: s => null }, "", t);
|
||||
createScriptURLTest('TestPolicyScriptURL2', { createScriptURL: s => null }, "null", t);
|
||||
}, "script_url = null");
|
||||
|
||||
var scriptURLstr = '#duck';
|
||||
|
@ -240,7 +240,7 @@
|
|||
}, "url = identity function");
|
||||
|
||||
test(t => {
|
||||
createURLTest('TestPolicyURL2', { createURL: s => null }, "", t);
|
||||
createURLTest('TestPolicyURL2', { createURL: s => null }, "null", t);
|
||||
}, "url = null");
|
||||
|
||||
var URLstr = '#x';
|
||||
|
|
|
@ -97,20 +97,14 @@
|
|||
URLTestCases.forEach(c => {
|
||||
test(t => {
|
||||
assert_element_accepts_trusted_type(c[0], c[1], INPUTS.URL, RESULTS.URL);
|
||||
|
||||
// Properties that actually parse the URLs will resort to the base URL
|
||||
// when given a null or empty URL.
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, "" + window.location);
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null"));
|
||||
}, c[0] + "." + c[1] + " accepts string and null after default policy was created.");
|
||||
});
|
||||
|
||||
scriptURLTestCases.forEach(c => {
|
||||
test(t => {
|
||||
assert_element_accepts_trusted_type(c[0], c[1], INPUTS.SCRIPTURL, RESULTS.SCRIPTURL);
|
||||
|
||||
// Properties that actually parse the URLs will resort to the base URL
|
||||
// when given a null or empty URL.
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, "" + window.location);
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null"));
|
||||
}, c[0] + "." + c[1] + " accepts string and null after default policy was created.");
|
||||
});
|
||||
|
||||
|
|
|
@ -74,14 +74,14 @@
|
|||
URLTestCases.forEach(c => {
|
||||
test(t => {
|
||||
assert_element_accepts_trusted_type(c[0], c[1], INPUTS.URL, RESULTS.URL);
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, "" + window.location);
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null"));
|
||||
}, c[0] + "." + c[1] + " accepts string and null after default policy was created");
|
||||
});
|
||||
|
||||
scriptURLTestCases.forEach(c => {
|
||||
test(t => {
|
||||
assert_element_accepts_trusted_type(c[0], c[1], INPUTS.SCRIPTURL, RESULTS.SCRIPTURL);
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, "" + window.location);
|
||||
assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null"));
|
||||
}, c[0] + "." + c[1] + " accepts string and null after default policy was created");
|
||||
});
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
let p = createURL_policy(window, nb);
|
||||
let url = p.createURL(INPUTS.URL);
|
||||
let child_window = win.open(url, "", "");
|
||||
t.add_cleanup(_ => child_window.close());
|
||||
child_window.onload = t.step_func_done(_ => {
|
||||
assert_equals(child_window.location.href, "" + url);
|
||||
child_window.close();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -25,15 +25,14 @@
|
|||
let p = createURL_policy(window, nb);
|
||||
assert_throws(new TypeError(), _ => {
|
||||
let child_window = win.open(url, "", "");
|
||||
child_window.close();
|
||||
});
|
||||
}
|
||||
|
||||
function testWindowDoesntThrow(t, url, expected, win) {
|
||||
let child_window = win.open(url, "", "");
|
||||
t.add_cleanup(_ => child_window.close());
|
||||
child_window.onload = t.step_func_done(_ => {
|
||||
assert_equals(child_window.location.href, expected);
|
||||
child_window.close();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -9,3 +9,29 @@ test(() => {
|
|||
assert_greater_than(types.indexOf("measure"), types.indexOf('mark'),
|
||||
"The 'measure' entry should appear after the 'mark' entry");
|
||||
}, "supportedEntryTypes contains 'mark' and 'measure'.");
|
||||
|
||||
if (typeof PerformanceObserver.supportedEntryTypes !== "undefined") {
|
||||
const entryTypes = {
|
||||
"mark": () => {
|
||||
performance.mark('foo');
|
||||
},
|
||||
"measure": () => {
|
||||
performance.measure('bar');
|
||||
}
|
||||
}
|
||||
for (let entryType in entryTypes) {
|
||||
if (PerformanceObserver.supportedEntryTypes.includes(entryType)) {
|
||||
promise_test(async() => {
|
||||
await new Promise((resolve) => {
|
||||
new PerformanceObserver(function (list, observer) {
|
||||
observer.disconnect();
|
||||
resolve();
|
||||
}).observe({entryTypes: [entryType]});
|
||||
|
||||
// Force the PerformanceEntry.
|
||||
entryTypes[entryType]();
|
||||
})
|
||||
}, `'${entryType}' entries should be observable.`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
assert_equals(trackEvent.receiver, receiver);
|
||||
assert_equals(trackEvent.track, track);
|
||||
assert_array_equals(trackEvent.streams, []);
|
||||
assert_equals(trackEvent.streams, trackEvent.streams); // [SameObject]
|
||||
assert_equals(trackEvent.streams, trackEvent.streams, '[SameObject]');
|
||||
assert_equals(trackEvent.transceiver, transceiver);
|
||||
|
||||
assert_equals(trackEvent.type, 'track');
|
||||
|
|
|
@ -1,2 +1,137 @@
|
|||
# Worker WPT tests
|
||||
|
||||
These are the workers (`Worker`, `SharedWorker`) tests for the
|
||||
[Web workers chapter of the HTML Standard](https://html.spec.whatwg.org/multipage/workers.html).
|
||||
|
||||
See also
|
||||
[testharness.js API > Web Workers](https://web-platform-tests.org/writing-tests/testharness-api.html#web-workers).
|
||||
|
||||
## Writing `*.any.js`
|
||||
|
||||
The easiest and most recommended way to write tests for workers
|
||||
is to create .any.js-style tests.
|
||||
|
||||
Official doc:
|
||||
[WPT > File Name Flags > Test Features](https://web-platform-tests.org/writing-tests/file-names.html#test-features).
|
||||
|
||||
- Standard `testharness.js`-style can be used (and is enforced).
|
||||
- The same test can be run on window and many types of workers.
|
||||
- All glue code are automatically generated.
|
||||
- No need to care about how to create and communicate with each type of workers,
|
||||
thanks to `fetch_tests_from_worker` in `testharness.js`.
|
||||
|
||||
Converting existing tests into `.any.js`-style also has benefits:
|
||||
|
||||
- Multiple tests can be merged into one.
|
||||
- Tests written for window can be run on workers
|
||||
with a very low development cost.
|
||||
|
||||
### How to write tests
|
||||
|
||||
If you write `testharness.js`-based tests in `foo.any.js` and
|
||||
specify types of workers to be tested,
|
||||
the test can run on any of dedicated, shared and service workers.
|
||||
|
||||
See `examples/general.any.js` for example.
|
||||
|
||||
Even for testing specific features in a specific type of workers
|
||||
(e.g. shared worker's `onconnect`), `.any.js`-style tests can be used.
|
||||
|
||||
See `examples/onconnect.any.js` for example.
|
||||
|
||||
### How to debug tests
|
||||
|
||||
Whether each individual test passed or failed,
|
||||
and its assertion failures (if any) are all reported in the final results.
|
||||
|
||||
`console.log()` might not appear in the test results and
|
||||
thus might not be useful for printf debugging.
|
||||
For example, in Chromium, this message
|
||||
|
||||
- Appears (in stderr) on a window or a dedicated worker, but
|
||||
- Does NOT appear on a shared worker or a service worker.
|
||||
|
||||
### How it works
|
||||
|
||||
`.any.js`-style tests use
|
||||
`fetch_tests_from_worker` functionality of `testharness.js`.
|
||||
|
||||
The WPT test server generates necessary glue code
|
||||
(including generated Document HTML and worker top-level scripts).
|
||||
See
|
||||
[serve.py](https://github.com/web-platform-tests/wpt/blob/master/tools/serve/serve.py)
|
||||
for the actual glue code.
|
||||
|
||||
Note that `.any.js` file is not the worker top-level script,
|
||||
and currently we cannot set response headers to the worker top-level script,
|
||||
e.g. to set Referrer Policy of the workers.
|
||||
|
||||
## Writing `*.worker.js`
|
||||
|
||||
Similar to `.any.js`, you can also write `.worker.js`
|
||||
for tests only for dedicated workers.
|
||||
Almost the same as `.any.js`, except for the things listed below.
|
||||
|
||||
Official doc:
|
||||
[WPT > File Name Flags > Test Features](https://web-platform-tests.org/writing-tests/file-names.html#test-features).
|
||||
|
||||
### How to write tests
|
||||
|
||||
You have to write two things manually (which is generated in `.any.js` tests):
|
||||
|
||||
- `importScripts("/resources/testharness.js");` at the beginning.
|
||||
- `done();` at the bottom.
|
||||
|
||||
Note: Even if you write `async_test()` or `promise_test()`,
|
||||
this global `done()` is always needed
|
||||
(this is different from async_test's `done()`)
|
||||
for dedicated workers and shared workers.
|
||||
See official doc:
|
||||
[testharness.js API > Determining when all tests are complete](https://web-platform-tests.org/writing-tests/testharness-api.html#determining-when-all-tests-are-complete).
|
||||
|
||||
See `examples/general.worker.js` for example.
|
||||
|
||||
### How it works
|
||||
|
||||
`.worker.js`-style tests also use
|
||||
`fetch_tests_from_worker` functionality of `testharness.js`.
|
||||
|
||||
The WPT test server generates glue code in Document HTML-side,
|
||||
but not for worker top-level scripts.
|
||||
This is why you have to manually write `importScripts()` etc.
|
||||
See
|
||||
[serve.py](https://github.com/web-platform-tests/wpt/blob/master/tools/serve/serve.py)
|
||||
for the actual glue code.
|
||||
|
||||
Unlike `*.any.js` cases, the `*.worker.js` is the worker top-level script.
|
||||
|
||||
## Using `fetch_tests_from_worker`
|
||||
|
||||
If you need more flexibility,
|
||||
writing tests using `fetch_tests_from_worker` is the way to go.
|
||||
For example, when
|
||||
|
||||
- Additional processing is needed on the parent Document.
|
||||
- Workers should be created in a specific way.
|
||||
- You are writing non-WPT tests using `testharness.js`.
|
||||
|
||||
You have to write the main HTMLs and the worker scripts,
|
||||
but most of the glue code needed for running tests on workers
|
||||
are provided by `fetch_tests_from_worker`.
|
||||
|
||||
### How to write tests
|
||||
|
||||
See
|
||||
|
||||
- `examples/fetch_tests_from_worker.html` and
|
||||
`examples/fetch_tests_from_worker.js`.
|
||||
|
||||
## Writing the whole tests manually
|
||||
|
||||
If `fetch_tests_from_worker` isn't suitable for your specific case
|
||||
(which should be rare but might be still possible),
|
||||
you have to write the whole tests,
|
||||
including the main Document HTML, worker scripts,
|
||||
and message passing code between them.
|
||||
|
||||
TODO: Supply the templates for writing this kind of tests.
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
<!doctype html>
|
||||
<!--
|
||||
This file is an example of a hand-written test using
|
||||
fetch_tests_from_worker().
|
||||
Unlike *.any.js or *.worker.js tests, fetch_tests_from_worker.html/js files
|
||||
are manually written and no generated glue code are involved.
|
||||
-->
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
fetch_tests_from_worker(new Worker("fetch_tests_from_worker.js"));
|
||||
|
||||
// If you want to test on SharedWorker,
|
||||
// fetch_tests_from_worker(new SharedWorker("fetch_tests_from_worker.js"));
|
||||
|
||||
// See ServiceWorkersHandler in
|
||||
// https://github.com/web-platform-tests/wpt/blob/master/tools/serve/serve.py
|
||||
// for the generated snippet used in .any.js for service workers.
|
||||
// Note: when testing service workers, also add ".https." file flag in the
|
||||
// main HTML's file name to run the test on HTTPS.
|
||||
</script>
|
|
@ -0,0 +1,28 @@
|
|||
// This file is an example of a hand-written test using
|
||||
// fetch_tests_from_worker().
|
||||
// Unlike *.any.js or *.worker.js tests, fetch_tests_from_worker.html/js files
|
||||
// are manually written and no generated glue code are involved.
|
||||
|
||||
// fetch_tests_from_worker() requires testharness.js both on the parent
|
||||
// document and on the worker.
|
||||
importScripts("/resources/testharness.js");
|
||||
|
||||
// ============================================================================
|
||||
|
||||
// Test body.
|
||||
test(() => {
|
||||
assert_equals(1, 1, "1 == 1");
|
||||
},
|
||||
"Test that should pass"
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
|
||||
// `done()` is always needed at the bottom for dedicated workers and shared
|
||||
// workers, even if you write `async_test()` or `promise_test()`.
|
||||
// `async_test()` and `promise_test()` called before this `done()`
|
||||
// will continue and assertions/failures after this `done()` are not ignored.
|
||||
// See
|
||||
// https://web-platform-tests.org/writing-tests/testharness-api.html#determining-when-all-tests-are-complete
|
||||
// for details.
|
||||
done();
|
34
tests/wpt/web-platform-tests/workers/examples/general.any.js
Normal file
34
tests/wpt/web-platform-tests/workers/examples/general.any.js
Normal file
|
@ -0,0 +1,34 @@
|
|||
// META: global=!default,worker
|
||||
|
||||
// See
|
||||
// https://web-platform-tests.org/writing-tests/testharness.html#multi-global-tests
|
||||
// for how to specify in which global scopes to run this tests,
|
||||
// how to specify additional scripts needed, etc.
|
||||
|
||||
// testharness.js is imported (via importScripts()) by generated glue code by
|
||||
// WPT server.
|
||||
// See AnyWorkerHandler in
|
||||
// https://github.com/web-platform-tests/wpt/blob/master/tools/serve/serve.py.
|
||||
|
||||
// ============================================================================
|
||||
|
||||
// Test body.
|
||||
// .any.js tests are always testharness.js-based.
|
||||
test(() => {
|
||||
assert_equals(1, 1, "1 == 1");
|
||||
},
|
||||
"Test that should pass"
|
||||
);
|
||||
|
||||
test(() => {
|
||||
// This file is "general.any.js" but the worker top-level script is
|
||||
// "general.any.worker.js", which is generated by the WPT server.
|
||||
assert_equals(location.pathname, "/workers/examples/general.any.worker.js");
|
||||
},
|
||||
"Worker top-level script is a generated script."
|
||||
);
|
||||
|
||||
// done() is NOT needed in .any.js tests, as it is called by generated
|
||||
// glue code by the WPT server.
|
||||
// See AnyWorkerHandler in
|
||||
// https://github.com/web-platform-tests/wpt/blob/master/tools/serve/serve.py.
|
|
@ -0,0 +1,35 @@
|
|||
// This file is an example of a test using *.worker.js mechanism.
|
||||
// The parent document that calls fetch_tests_from_worker() is auto-generated
|
||||
// but there are no generated code in the worker side.
|
||||
|
||||
// fetch_tests_from_worker() requires testharness.js both on the parent
|
||||
// document and on the worker.
|
||||
importScripts("/resources/testharness.js");
|
||||
|
||||
// ============================================================================
|
||||
|
||||
// Test body.
|
||||
test(() => {
|
||||
assert_equals(1, 1, "1 == 1");
|
||||
},
|
||||
"Test that should pass"
|
||||
);
|
||||
|
||||
test(() => {
|
||||
// This file is "general.worker.js" and this file itself is the worker
|
||||
// top-level script (which is different from the .any.js case).
|
||||
assert_equals(location.pathname, "/workers/examples/general.worker.js");
|
||||
},
|
||||
"Worker top-level script is the .worker.js file itself."
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
|
||||
// `done()` is always needed at the bottom for dedicated workers and shared
|
||||
// workers, even if you write `async_test()` or `promise_test()`.
|
||||
// `async_test()` and `promise_test()` called before this `done()`
|
||||
// will continue and assertions/failures after this `done()` are not ignored.
|
||||
// See
|
||||
// https://web-platform-tests.org/writing-tests/testharness-api.html#determining-when-all-tests-are-complete
|
||||
// for details.
|
||||
done();
|
|
@ -0,0 +1,4 @@
|
|||
// META: global=!default,sharedworker
|
||||
const t = async_test("onconnect is called");
|
||||
onconnect = t.step_func_done((event) => {
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue