Update web-platform-tests to revision 6d7f862e4afa43d45bb3f800c457e9f746cd8730

This commit is contained in:
WPT Sync Bot 2020-03-06 08:19:18 +00:00
parent ca25e18791
commit 5b34e16ada
93 changed files with 2141 additions and 1321 deletions

View file

@ -285,6 +285,15 @@
}, },
"semantics": { "semantics": {
"embedded-content": { "embedded-content": {
"the-img-element": {
"image-loading-lazy-subframe-detached-crash.html": [
"86a290d50db16d9f19d08bb8a9ad07b0aa52f66d",
[
null,
{}
]
]
},
"the-object-element": { "the-object-element": {
"block-object-with-ruby-crash.html": [ "block-object-with-ruby-crash.html": [
"481a7408e4a4fa91613556b39c9ddc95d568c50c", "481a7408e4a4fa91613556b39c9ddc95d568c50c",
@ -136992,19 +137001,6 @@
{} {}
] ]
], ],
"font-display-feature-policy-01.tentative.html": [
"56b040d8faf6dee3740a288af5c1bf486b1c9e08",
[
null,
[
[
"/css/css-fonts/font-display/font-display-feature-policy-01.tentative-ref.html",
"=="
]
],
{}
]
],
"font-display-feature-policy-02.tentative.html": [ "font-display-feature-policy-02.tentative.html": [
"65f76b07846faf193e2b0900f45211303aa290f9", "65f76b07846faf193e2b0900f45211303aa290f9",
[ [
@ -143642,7 +143638,7 @@
] ]
], ],
"repeat-auto-fill-001.html": [ "repeat-auto-fill-001.html": [
"e17fc8274f441835888ff57d12bd985d0ece7623", "9e57028c4cc2757eb3ec52cc214f902562413474",
[ [
null, null,
[ [
@ -143655,7 +143651,7 @@
] ]
], ],
"repeat-auto-fill-002.html": [ "repeat-auto-fill-002.html": [
"38d0bea0d08e6e1b1691a595ac9a1c2dfea59adb", "80980f14e9f8ccfced29e252114a4337a0dc5aeb",
[ [
null, null,
[ [
@ -143668,7 +143664,7 @@
] ]
], ],
"repeat-auto-fill-003.html": [ "repeat-auto-fill-003.html": [
"b58799bd86bd1ad1f7875a6c9da7e8247136e6f8", "3a1d2707c37c6861dc97cd6cdd5f2f3739a431c7",
[ [
null, null,
[ [
@ -143681,7 +143677,7 @@
] ]
], ],
"repeat-auto-fill-004.html": [ "repeat-auto-fill-004.html": [
"beacff588a2c6209ee89b8715eccd374b1847ba8", "9dd8f33eb9b0e8815ea2a407087cb344b1f870a2",
[ [
null, null,
[ [
@ -240235,7 +240231,7 @@
], ],
"security-features": { "security-features": {
"README.md": [ "README.md": [
"387e68334aeaaad68a71c3ffa32cf0ca05345b91", "fb9a2f108f9faf68bb86f0bd9f848dbd28630ca4",
[] []
], ],
"resources": { "resources": {
@ -240370,7 +240366,11 @@
[] []
], ],
"generate.py": [ "generate.py": [
"3345d6520691de734977a18d73c94f71b446408a", "057c4d81ef1e110be161360ea3f1ea092702d21d",
[]
],
"spec.src.json": [
"7cf6a06c0f53492b7cb0f54b6db90688b649c1fc",
[] []
], ],
"spec_validator.py": [ "spec_validator.py": [
@ -283615,14 +283615,6 @@
"e06a55939995ed04a5745bc0dd4cf28113f918c8", "e06a55939995ed04a5745bc0dd4cf28113f918c8",
[] []
], ],
"font-display-feature-policy-01.tentative-ref.html": [
"fc43ebc49b5a84486dff5b3f82134b0b8807d025",
[]
],
"font-display-feature-policy-01.tentative.html.headers": [
"0c3e29db99f07ddc1bb3c07cac24e2904e546b1b",
[]
],
"font-display-feature-policy-02.tentative-ref.html": [ "font-display-feature-policy-02.tentative-ref.html": [
"019043fd116d0b9581fc187767b2552558906cf1", "019043fd116d0b9581fc187767b2552558906cf1",
[] []
@ -283631,14 +283623,6 @@
"e6c4898d5d3d28fa225e834674dfb768dbcf55d7", "e6c4898d5d3d28fa225e834674dfb768dbcf55d7",
[] []
], ],
"font-display-feature-policy-report-only.tentative.html.headers": [
"e6c4898d5d3d28fa225e834674dfb768dbcf55d7",
[]
],
"font-display-feature-policy-reporting.tentative.html.headers": [
"0c3e29db99f07ddc1bb3c07cac24e2904e546b1b",
[]
],
"font-display-preload-ref.html": [ "font-display-preload-ref.html": [
"e3ba8caa32f13479896e82afcaab654a3785375f", "e3ba8caa32f13479896e82afcaab654a3785375f",
[] []
@ -291082,11 +291066,11 @@
[] []
], ],
"repeat-auto-fill-001-ref.html": [ "repeat-auto-fill-001-ref.html": [
"bbf5d374589b29c9c0dcb04b941160a94130b3a1", "8cd0ef66b974e808463b51db603476adee3b5f5d",
[] []
], ],
"repeat-auto-fill-004-ref.html": [ "repeat-auto-fill-004-ref.html": [
"07ba960200b1fe9ba69448da8e5e9ff1ebf547fd", "ca2729fa3f2af414f8a176b9f162ee0d5f3ebc40",
[] []
], ],
"repeat-auto-fill-005-ref.html": [ "repeat-auto-fill-005-ref.html": [
@ -309661,6 +309645,14 @@
"font-display-document-policy-01.tentative.html.headers": [ "font-display-document-policy-01.tentative.html.headers": [
"e1387f50deead65859267b376367a5eb2a92482d", "e1387f50deead65859267b376367a5eb2a92482d",
[] []
],
"font-display-document-policy-report-only.tentative.html.headers": [
"e090edd0da42f4e98c400f84fb42232adbe95ab6",
[]
],
"font-display-document-policy-reporting.tentative.html.headers": [
"84ad7cbf97bcbfd9f56bfeef5bc5928b8819ae4e",
[]
] ]
}, },
"required-policy": { "required-policy": {
@ -315438,6 +315430,10 @@
"43c44cffd64e01f12a8d0dc22bbddfdd05a79a90", "43c44cffd64e01f12a8d0dc22bbddfdd05a79a90",
[] []
], ],
"report-only-require-corp.https.html.headers": [
"289659a41fdf41178781c764643f8946f4ec09b7",
[]
],
"require-corp-about-blank.html.headers": [ "require-corp-about-blank.html.headers": [
"8df98474b589d070992677cb0134bd47bd0509c4", "8df98474b589d070992677cb0134bd47bd0509c4",
[] []
@ -315515,6 +315511,10 @@
"30ddeac2e7a3596de3910def1a7066e817873cbe", "30ddeac2e7a3596de3910def1a7066e817873cbe",
[] []
], ],
"report.py": [
"8adf3009d08e2311cdf9c2008d7a10a0882ce030",
[]
],
"require-corp-sw.js": [ "require-corp-sw.js": [
"3e2f069ded033f33528c8f850d330c5b4e84e46c", "3e2f069ded033f33528c8f850d330c5b4e84e46c",
[] []
@ -315527,6 +315527,18 @@
"9db755226020479fd87e87f42ea622c999b38f7d", "9db755226020479fd87e87f42ea622c999b38f7d",
[] []
], ],
"stash-take.py": [
"73e0def86caed347bf673b0daa8df46b9a4e074d",
[]
],
"subresource-corp.html": [
"4b029700e0e9a7545dae07df489eef7e32256030",
[]
],
"subresource-corp.html.sub.headers": [
"00609991031ea5a07c5a3fa802fcc73dcd00863e",
[]
],
"sw-store-to-cache-storage.js": [ "sw-store-to-cache-storage.js": [
"00b9e9395a7ec2171b3fee9d75f6ccb1d46ee60f", "00b9e9395a7ec2171b3fee9d75f6ccb1d46ee60f",
[] []
@ -325155,6 +325167,10 @@
"2ea3d38240e527f10af7ef392e0c0935a3750572", "2ea3d38240e527f10af7ef392e0c0935a3750572",
[] []
], ],
"origin-policy.idl": [
"e48e0632bd89ff764fa9b3864207b39723a388cf",
[]
],
"page-visibility.idl": [ "page-visibility.idl": [
"6b8bd52a047ce411b968a79e6d0f7d152ab32a57", "6b8bd52a047ce411b968a79e6d0f7d152ab32a57",
[] []
@ -325268,7 +325284,7 @@
[] []
], ],
"shape-detection-api.idl": [ "shape-detection-api.idl": [
"51c996959bea2acc1b2d0a3c3be438b0c6182e23", "5b1c45a773987eb8ce8b59fd5b98c2f0c9ae4ea5",
[] []
], ],
"speech-api.idl": [ "speech-api.idl": [
@ -325288,7 +325304,7 @@
[] []
], ],
"trusted-types.tentative.idl": [ "trusted-types.tentative.idl": [
"be58b63b2c3d10e8a53ac2af7388e9a44f8fa3e6", "5442d8b44e65d21cbfddbef6b5b323390640e6bb",
[] []
], ],
"uievents.idl": [ "uievents.idl": [
@ -325380,7 +325396,7 @@
[] []
], ],
"webrtc-stats.idl": [ "webrtc-stats.idl": [
"d1a54898b9a62e85a3c1488704afe736058d5e93", "f66b0791cb2fae4665a6df8cde1d1c67a18797f6",
[] []
], ],
"webrtc-svc.idl": [ "webrtc-svc.idl": [
@ -326300,16 +326316,20 @@
[] []
], ],
"README.md": [ "README.md": [
"641969d932cf827f947d0e70d0f92a40ecab31fd", "953611f93037cfebe0459d5f67599b727539ae40",
[] []
], ],
"resources": { "resources": {
"common.js": [ "child.sub.html": [
"36df1d8c1557ec5e02c1b69dfe2687e1898bb457", "f52b5eefbc5d0cf0dd88ee9103f851d632268f5d",
[] []
], ],
"iframe.sub.html": [ "common.js": [
"b1a476cff2e8af1550083a57e62fa7a0b2e9af1c", "92ff11b35b1d6ab501a7b7dbac52411c08711a83",
[]
],
"grandchild.sub.html": [
"98522e0649e505d66766b9d8c62946a5513aa5a1",
[] []
] ]
} }
@ -328299,7 +328319,7 @@
[] []
], ],
"spec_json.js": [ "spec_json.js": [
"af9cf72857e5d640bad18b441f1d3c81bc44a2de", "c36a535f45363654bfd7c8b86f3710995f769f63",
[] []
], ],
"test-case.sub.js": [ "test-case.sub.js": [
@ -328308,7 +328328,7 @@
] ]
}, },
"spec.src.json": [ "spec.src.json": [
"547dc97504029dcac4a006113d538f3813a2c2b6", "16843700da8f314638aafaa517797152cab6f02f",
[] []
] ]
}, },
@ -337249,7 +337269,7 @@
[] []
], ],
"spec_json.js": [ "spec_json.js": [
"a8b723d5a98f9748689faf31e95bd2c7a887b079", "fbe59a2cc9cc5fec5ddd8a0d35354cca787dd515",
[] []
], ],
"test-case.sub.js": [ "test-case.sub.js": [
@ -337258,7 +337278,7 @@
] ]
}, },
"spec.src.json": [ "spec.src.json": [
"d32ee80a8d2ce1edd57b09f919732eefa4f6caeb", "9063428647a33acfefb5bd35a74f0f080de09510",
[] []
] ]
}, },
@ -342485,7 +342505,7 @@
[] []
], ],
"test_valid.py": [ "test_valid.py": [
"4573541bf5864badfa39a155c5d62d71a18911e0", "aa1ce20cd6d36191d96e2080393a70b13d8aa1df",
[] []
] ]
} }
@ -347697,7 +347717,7 @@
] ]
}, },
"requirements.txt": [ "requirements.txt": [
"99898d1736daadaca5b422c5c4e80becb742e94e", "6cd14095d9ba1fcf49b9e403a644008e8fe2ca3b",
[] []
], ],
"requirements_android_webview.txt": [ "requirements_android_webview.txt": [
@ -347729,7 +347749,7 @@
[] []
], ],
"requirements_firefox.txt": [ "requirements_firefox.txt": [
"f2d02e0b8a3f8fcb4eec55bd61ffe70a8c3d05f7", "ae72940810432bed693c001d4b057a1214fd2dac",
[] []
], ],
"requirements_ie.txt": [ "requirements_ie.txt": [
@ -348826,7 +348846,7 @@
[] []
], ],
"trusted-types-eval-reporting-no-unsafe-eval.tentative.https.html.headers": [ "trusted-types-eval-reporting-no-unsafe-eval.tentative.https.html.headers": [
"30fe3b1df1d8f10ea4eb495f53bf93066a9e5ecd", "e4147bd2e372e4498f9a6ca138f9f29f4750561f",
[] []
], ],
"trusted-types-eval-reporting-report-only.tentative.https.html.headers": [ "trusted-types-eval-reporting-report-only.tentative.https.html.headers": [
@ -348834,7 +348854,7 @@
[] []
], ],
"trusted-types-eval-reporting.tentative.https.html.headers": [ "trusted-types-eval-reporting.tentative.https.html.headers": [
"91a2be91ef749e470f8998d7058871484dcb274d", "3f55bba7d1b8d0965d3f9f29c7db301806f7c1a0",
[] []
], ],
"trusted-types-report-only.tentative.https.html.headers": [ "trusted-types-report-only.tentative.https.html.headers": [
@ -349369,7 +349389,7 @@
}, },
"generic": { "generic": {
"spec_json.js": [ "spec_json.js": [
"0adba4938d47d896fa2d343f58022cfa113615da", "c0ef97148952f32e7c510b8a485f6d2da0e4a177",
[] []
], ],
"test-case.sub.js": [ "test-case.sub.js": [
@ -349462,7 +349482,7 @@
} }
}, },
"spec.src.json": [ "spec.src.json": [
"70417038bcccc269cb5fb40df09dfe7ec0f7b578", "d64315903aa66dd5c9ffd19bf862e96ac26b3a64",
[] []
], ],
"support": { "support": {
@ -384090,7 +384110,7 @@
] ]
], ],
"AnimationEffect-updateTiming.tentative.html": [ "AnimationEffect-updateTiming.tentative.html": [
"de6953c761facd400a37572419e3c97f42b4cfed", "e6556dac4bde9fd436237cb78f5e88a1968be7d1",
[ [
null, null,
{} {}
@ -384118,7 +384138,7 @@
] ]
], ],
"CSSAnimation-effect.tentative.html": [ "CSSAnimation-effect.tentative.html": [
"95a904187204286a49a17377d3201f4918128566", "5e2d18b5bf9659e9cf8930c151abcd2a12635fa0",
[ [
null, null,
{ {
@ -387413,20 +387433,6 @@
null, null,
{} {}
] ]
],
"font-display-feature-policy-report-only.tentative.html": [
"ff3a7f197835370a2eaaf96cf920b0f09d3d8405",
[
null,
{}
]
],
"font-display-feature-policy-reporting.tentative.html": [
"6f6a51a28fda5c9f5816bf6c54dc7fba5f462475",
[
null,
{}
]
] ]
}, },
"font-feature-settings-serialization-001.html": [ "font-feature-settings-serialization-001.html": [
@ -392581,21 +392587,21 @@
}, },
"css-page": { "css-page": {
"page-rule-declarations-000.html": [ "page-rule-declarations-000.html": [
"227b9148a3870617ffccff141e1f763a631024b6", "cbe53855a0a6869dfc49d5997bba7584b04dcbdd",
[ [
null, null,
{} {}
] ]
], ],
"page-rule-declarations-001.html": [ "page-rule-declarations-001.html": [
"e57424029ba827862e7be5bd1c7e949b74c58331", "dc225b5abdc5fb5d4ad27e5c7b251c7b988b31f9",
[ [
null, null,
{} {}
] ]
], ],
"page-rule-declarations-002.html": [ "page-rule-declarations-002.html": [
"183072dec676d6e913c3ed35935d5e06f3fd4963", "b35fa29244cc89ad37c6e988c4cd6d9277061161",
[ [
null, null,
{} {}
@ -407590,6 +407596,22 @@
] ]
}, },
"document-policy": { "document-policy": {
"font-display": {
"font-display-document-policy-report-only.tentative.html": [
"03fa5b68a3ef8a587a72fba5b37fd5145307e1b0",
[
null,
{}
]
],
"font-display-document-policy-reporting.tentative.html": [
"db871d19f7e9f73419aabadb44e978579678990c",
[
null,
{}
]
]
},
"required-policy": { "required-policy": {
"document-policy.html": [ "document-policy.html": [
"1935be3dd0a961add3d80aa35ded92734d9f8869", "1935be3dd0a961add3d80aa35ded92734d9f8869",
@ -407786,7 +407808,7 @@
] ]
], ],
"Event-dispatch-click.html": [ "Event-dispatch-click.html": [
"2241d57e5118843a37601bd6feae9645a82961a7", "7690f753d9cd0b47f2c2c25352576caed970cd19",
[ [
null, null,
{} {}
@ -407799,6 +407821,13 @@
{} {}
] ]
], ],
"Event-dispatch-detached-input-and-change.html": [
"a53ae71ac2a08d901b9ac8aaf35912cbbdcb7746",
[
null,
{}
]
],
"Event-dispatch-handlers-changed.html": [ "Event-dispatch-handlers-changed.html": [
"24e6fd70cb4ec4d44905ba8624280a526ef888c6", "24e6fd70cb4ec4d44905ba8624280a526ef888c6",
[ [
@ -431333,6 +431362,22 @@
} }
] ]
], ],
"report-only-require-corp.https.html": [
"ff9e5b64a084eb2d2d990c3a7660633468772ff8",
[
null,
{
"timeout": "long"
}
]
],
"reporting.https.html": [
"3a0aebe49a7baf67ad2e3fc1ac57eb6bf3fbb5f2",
[
null,
{}
]
],
"require-corp-about-blank.html": [ "require-corp-about-blank.html": [
"5c51df71ae5b6a84f5c68c90a4012729a9e9c380", "5c51df71ae5b6a84f5c68c90a4012729a9e9c380",
[ [
@ -451108,7 +451153,7 @@
}, },
"measure-memory": { "measure-memory": {
"measure-memory-cross-origin-iframe.tentative.window.js": [ "measure-memory-cross-origin-iframe.tentative.window.js": [
"15590560ee93b908519794342bfc129509d36893", "c8dcbb77edd33fd8c29678eeaedd3792dea172bc",
[ [
"measure-memory/measure-memory-cross-origin-iframe.tentative.window.html", "measure-memory/measure-memory-cross-origin-iframe.tentative.window.html",
{ {
@ -451131,7 +451176,7 @@
] ]
], ],
"measure-memory-same-origin-iframe.tentative.window.js": [ "measure-memory-same-origin-iframe.tentative.window.js": [
"519ed85864da59e1965a27371b3184f0a56523b9", "24700e51c2439671ae10e6fc5a6e2d725906ca59",
[ [
"measure-memory/measure-memory-same-origin-iframe.tentative.window.html", "measure-memory/measure-memory-same-origin-iframe.tentative.window.html",
{ {
@ -451153,30 +451198,10 @@
} }
] ]
], ],
"measure-memory.tentative.any.js": [ "measure-memory.tentative.window.js": [
"22ec66c3460f0bad637eded4a5f8282c5b3081ac", "0c595eda73a2d8e5dd1b8749e40e120f651dffb4",
[ [
"measure-memory/measure-memory.tentative.any.html", "measure-memory/measure-memory.tentative.window.html",
{
"script_metadata": [
[
"script",
"/common/get-host-info.sub.js"
],
[
"script",
"./resources/common.js"
],
[
"timeout",
"long"
]
],
"timeout": "long"
}
],
[
"measure-memory/measure-memory.tentative.any.worker.html",
{ {
"script_metadata": [ "script_metadata": [
[ [
@ -472586,6 +472611,15 @@
} }
] ]
], ],
"pointerevent_pointercapture-not-lost-in-chorded-buttons.html": [
"02a6af0a4b89abf1c0c51844ace15b54e91966e9",
[
null,
{
"testdriver": true
}
]
],
"pointerevent_pointercapture_in_frame.html": [ "pointerevent_pointercapture_in_frame.html": [
"a4107fd707a2ec4cb40d22fcad786db0b42471d6", "a4107fd707a2ec4cb40d22fcad786db0b42471d6",
[ [
@ -528772,7 +528806,7 @@
] ]
], ],
"idlharness.https.any.js": [ "idlharness.https.any.js": [
"e7f2cc8ff862d5b25a7ebf55eb6e2448f79688ad", "da60edbee630db75d42242b051bda7ea94a12b5b",
[ [
"shape-detection/idlharness.https.any.html", "shape-detection/idlharness.https.any.html",
{ {
@ -528788,10 +528822,6 @@
[ [
"script", "script",
"/resources/idlharness.js" "/resources/idlharness.js"
],
[
"script",
"/shape-detection/resources/shapedetection-helpers.js"
] ]
] ]
} }
@ -528811,10 +528841,6 @@
[ [
"script", "script",
"/resources/idlharness.js" "/resources/idlharness.js"
],
[
"script",
"/shape-detection/resources/shapedetection-helpers.js"
] ]
] ]
} }
@ -528834,10 +528860,6 @@
[ [
"script", "script",
"/resources/idlharness.js" "/resources/idlharness.js"
],
[
"script",
"/shape-detection/resources/shapedetection-helpers.js"
] ]
] ]
} }
@ -528857,10 +528879,6 @@
[ [
"script", "script",
"/resources/idlharness.js" "/resources/idlharness.js"
],
[
"script",
"/shape-detection/resources/shapedetection-helpers.js"
] ]
] ]
} }
@ -538130,13 +538148,6 @@
{} {}
] ]
], ],
"TrustedTypePolicy-getPolicyNames.tentative.html": [
"d1ae9e45c0669a5aadce7c09d1e3c56360583708",
[
null,
{}
]
],
"TrustedTypePolicyFactory-constants.tentative.html": [ "TrustedTypePolicyFactory-constants.tentative.html": [
"0ba2eb62375a57c78f1caba4592e880b92483599", "0ba2eb62375a57c78f1caba4592e880b92483599",
[ [
@ -538173,7 +538184,7 @@
] ]
], ],
"TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [ "TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [
"f049484f1199a088db7e60c4b899a1150c70906b", "9fdafb2ccf04bf2808e3399d64c83a131c8648d2",
[ [
null, null,
{} {}
@ -538308,7 +538319,7 @@
] ]
], ],
"csp-block-eval.tentative.html": [ "csp-block-eval.tentative.html": [
"7902ca4040f582427e36941b6779e1bcdc51abf8", "e3911bf9e6a9340a35906d9ec70f71f6b8152951",
[ [
null, null,
{} {}
@ -538350,7 +538361,7 @@
] ]
], ],
"eval-csp-tt-default-policy.tentative.html": [ "eval-csp-tt-default-policy.tentative.html": [
"eaa74eaf4cd03e0aa3da97e26f700317945a87da", "106a024f2c1a8f4e2b2e99d2f15a81457179d807",
[ [
null, null,
{} {}
@ -538459,7 +538470,7 @@
] ]
], ],
"trusted-types-eval-reporting-no-unsafe-eval.tentative.https.html": [ "trusted-types-eval-reporting-no-unsafe-eval.tentative.https.html": [
"40c1ccc69a1b186f2f8820091c68edade5dceedc", "081f9becbd09e7875ca3786842b9d2495df7e9ba",
[ [
null, null,
{} {}
@ -538473,7 +538484,7 @@
] ]
], ],
"trusted-types-eval-reporting.tentative.https.html": [ "trusted-types-eval-reporting.tentative.https.html": [
"dec8a07cfc4bbdf60eda9819bbf6d16a587906a7", "9621aaba9749a9522703f87bfd23466545f14a70",
[ [
null, null,
{} {}
@ -547654,7 +547665,7 @@
] ]
], ],
"animate.html": [ "animate.html": [
"ba10b172c2d4ec20b92a8283740a1045d52d4e54", "bfe351250ffc28e9681cd2534024eefef33d2fc8",
[ [
null, null,
{} {}
@ -547885,14 +547896,14 @@
] ]
], ],
"processing-a-keyframes-argument-001.html": [ "processing-a-keyframes-argument-001.html": [
"87e60a2b1085125040a454763216ed335f249e6c", "654d4db7c79bd7f94727a38e595ab8d78c2172f2",
[ [
null, null,
{} {}
] ]
], ],
"processing-a-keyframes-argument-002.html": [ "processing-a-keyframes-argument-002.html": [
"4b0e15c9a2f73a81eb181691c8c096fecc55edae", "8620f883f98f17a71adcbd7364c6ae942d830a45",
[ [
null, null,
{} {}
@ -547913,7 +547924,7 @@
] ]
], ],
"target.html": [ "target.html": [
"eaef10fcb51050e8279393760cf75f6ea70397c8", "6951682c4d8af29736e1ec655b65e4147aee9538",
[ [
null, null,
{} {}
@ -550839,7 +550850,7 @@
] ]
], ],
"createcredential-badargs-rp.https.html": [ "createcredential-badargs-rp.https.html": [
"8886cc15c92e0ae98f0c65d6d1daa92cb93acfb7", "fa4d2264fefe8be7da1de8ecefeeb60da27511e0",
[ [
null, null,
{ {
@ -550879,7 +550890,7 @@
] ]
], ],
"createcredential-passing.https.html": [ "createcredential-passing.https.html": [
"ab10c7f519a6868c28c233fa6f933da925fe3dc9", "a94be363da20214ac84950b2bb701d428372dd10",
[ [
null, null,
{ {
@ -550909,7 +550920,7 @@
] ]
], ],
"getcredential-badargs-rpid.https.html": [ "getcredential-badargs-rpid.https.html": [
"6e0ef5f201842f878d4cc2cd38a05e1923c992a8", "3f9d3f2177fd9624da6bebfabedae7c57f3152a8",
[ [
null, null,
{ {
@ -550939,7 +550950,7 @@
] ]
], ],
"getcredential-passing.https.html": [ "getcredential-passing.https.html": [
"dae05e0993a0358ec77c3c2c7981c39a7483c82e", "c5237d2cda27e573ee591e95fdad92fae06e56a7",
[ [
null, null,
{ {

View file

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

View file

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

View file

@ -0,0 +1,2 @@
[mix-blend-mode-paragraph.html]
expected: FAIL

View file

@ -1,2 +0,0 @@
[font-display-feature-policy-01.tentative.html]
expected: FAIL

View file

@ -1,5 +0,0 @@
[font-display-feature-policy-report-only.tentative.html]
expected: ERROR
[font-display-late-swap Report Format]
expected: NOTRUN

View file

@ -1,5 +0,0 @@
[font-display-feature-policy-reporting.tentative.html]
expected: ERROR
[font-display-late-swap Report Format]
expected: NOTRUN

View file

@ -1,2 +1,2 @@
[no-transition-from-ua-to-blocking-stylesheet.html] [no-transition-from-ua-to-blocking-stylesheet.html]
expected: TIMEOUT expected: FAIL

View file

@ -1,4 +0,0 @@
[CaretPosition-001.html]
[Element at (400, 100)]
expected: FAIL

View file

@ -2,3 +2,6 @@
[listeners are called when <iframe> is resized] [listeners are called when <iframe> is resized]
expected: FAIL expected: FAIL
[listeners are called correct number of times]
expected: FAIL

View file

@ -1,4 +0,0 @@
[elementFromPoint-001.html]
[CSSOM View - 5 - extensions to the Document interface]
expected: FAIL

View file

@ -0,0 +1,25 @@
[Event-dispatch-detached-input-and-change.html]
[attached to shadow dom radio should emit input and change events on click().]
expected: FAIL
[detached checkbox should not emit input or change events on click().]
expected: FAIL
[attached to shadow dom checkbox should emit input and change events on click().]
expected: FAIL
[detached radio should not emit input or change events on click().]
expected: FAIL
[detached radio should not emit input or change events on dispatchEvent(new MouseEvent('click')).]
expected: FAIL
[detached checkbox should not emit input or change events on dispatchEvent(new MouseEvent('click')).]
expected: FAIL
[attached to shadow dom checkbox should emit input and change events on dispatchEvent(new MouseEvent('click')).]
expected: FAIL
[attached to shadow dom radio should emit input and change events on dispatchEvent(new MouseEvent('click')).]
expected: FAIL

View file

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

View file

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

View file

@ -1,20 +1,16 @@
[supported-elements.html] [supported-elements.html]
expected: TIMEOUT
[Contenteditable element should support autofocus] [Contenteditable element should support autofocus]
expected: FAIL expected: FAIL
[Element with tabindex should support autofocus] [Element with tabindex should support autofocus]
expected: TIMEOUT expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped] [Host element with delegatesFocus including no focusable descendants should be skipped]
expected: NOTRUN expected: FAIL
[Area element should support autofocus] [Area element should support autofocus]
expected: NOTRUN expected: FAIL
[Host element with delegatesFocus should support autofocus] [Host element with delegatesFocus should support autofocus]
expected: NOTRUN expected: FAIL
[Non-HTMLElement should not support autofocus]
expected: NOTRUN

View file

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

View file

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

View file

@ -35,3 +35,6 @@
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44043 more errors.\n\tMax AbsError of 1.9962286949157715e+0 at index of 32177.\n\t[32177\]\t9.9879217147827148e-1\t-9.9743652343750000e-1\t1.9962286949157715e+0\t2.0013591321441684e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 14112.\n\t[14112\]\t-9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44043 more errors.\n\tMax AbsError of 1.9962286949157715e+0 at index of 32177.\n\t[32177\]\t9.9879217147827148e-1\t-9.9743652343750000e-1\t1.9962286949157715e+0\t2.0013591321441684e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 14112.\n\t[14112\]\t-9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n]
expected: FAIL expected: FAIL
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 42288 more errors.\n\tMax AbsError of 1.9962286949157715e+0 at index of 29972.\n\t[29972\]\t9.9879217147827148e-1\t-9.9743652343750000e-1\t1.9962286949157715e+0\t2.0013591321441684e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n]
expected: FAIL

View file

@ -176,3 +176,9 @@
[X SNR (-447.224261749694 dB) is not greater than or equal to 65.737. Got -447.224261749694.] [X SNR (-447.224261749694 dB) is not greater than or equal to 65.737. Got -447.224261749694.]
expected: FAIL expected: FAIL
[X SNR (-61.90637588457 dB) is not greater than or equal to 65.737. Got -61.90637588457.]
expected: FAIL
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[19030\]\t8.3196109375000000e+4\t-7.3546999692916870e-1\t8.3196844844996929e+4\t1.1312065100190540e+5\t3.8985999999999999e-3\n\t[19031\]\t-3.6017334461212158e-1\t-6.9157749414443970e-1\t3.3140414953231812e-1\t4.7920030992665957e-1\t3.8985999999999999e-3\n\t[38059\]\t1.6516518750000000e+5\t-9.8956179618835449e-1\t1.6516617706179619e+5\t1.6690840096898633e+5\t3.8985999999999999e-3\n\t[38060\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 1.6516617706179619e+5 at index of 38059.\n\tMax RelError of 1.6690840096898633e+5 at index of 38059.\n]
expected: FAIL

View file

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

View file

@ -1,4 +1,5 @@
[005.html] [005.html]
expected: ERROR
[dedicated worker in shared worker in dedicated worker] [dedicated worker in shared worker in dedicated worker]
expected: FAIL expected: FAIL

View file

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

View file

@ -32,6 +32,7 @@ This is the overview of the project structure:
``` ```
common/security-features/ common/security-features/
└── tools/ - the common test generator logic └── tools/ - the common test generator logic
├── spec.src.json
└── template/ - the test files templates └── template/ - the test files templates
project-directory/ (e.g. referrer-policy/) project-directory/ (e.g. referrer-policy/)
├── spec.src.json ├── spec.src.json
@ -57,7 +58,14 @@ path/to/common/security-features/tools/generate.py --spec path/to/project-direct
git add path/to/project-directory/gen/ && git commit -m "Add generated tests" git add path/to/project-directory/gen/ && git commit -m "Add generated tests"
``` ```
This will parse the spec JSON5 (`project-directory/spec.src.json`) and determine which tests to generate (or skip) while using templates. This will parse the spec JSON5 files and determine which tests to generate (or skip) while using templates.
- The default spec JSON5: `common/security-features/tools/spec.src.json`.
- Describes common configurations, such as subresource types, source context types, etc.
- The per-project spec JSON5: `project-directory/spec.src.json`.
- Describes project-specific configurations, particularly those related to test generation patterns (`specification`), policy deliveries (e.g. `delivery_type`, `delivery_value`) and `expectation`.
For how these two spec JSON5 files are merged, see [Sub projects](#sub-projects) section.
Note: `spec.src.json` is transitioning to JSON5 [#21710](https://github.com/web-platform-tests/wpt/issues/21710). Note: `spec.src.json` is transitioning to JSON5 [#21710](https://github.com/web-platform-tests/wpt/issues/21710).

View file

@ -3,6 +3,7 @@
from __future__ import print_function from __future__ import print_function
import argparse import argparse
import collections
import copy import copy
import json import json
import os import os
@ -359,8 +360,14 @@ def main():
print('Error: No spec.src.json is found at %s.' % spec_directory) print('Error: No spec.src.json is found at %s.' % spec_directory)
return return
spec_json = util.load_spec_json(spec_filenames[0]) # Load the default spec JSON file, ...
for spec_filename in spec_filenames[1:]: default_spec_filename = os.path.join(util.script_directory, 'spec.src.json')
spec_json = collections.OrderedDict()
if os.path.exists(default_spec_filename):
spec_json = util.load_spec_json(default_spec_filename)
# ... and then make spec JSON files in subdirectories override the default.
for spec_filename in spec_filenames:
child_spec_json = util.load_spec_json(spec_filename) child_spec_json = util.load_spec_json(spec_filename)
merge_json(spec_json, child_spec_json) merge_json(spec_json, child_spec_json)

View file

@ -0,0 +1,468 @@
{
"selection_pattern": "%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s",
"test_file_path_pattern": "gen/%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s.html",
"excluded_tests": [
{
"name": "Workers are same-origin only",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": [
"worker-classic",
"worker-module",
"sharedworker-classic",
"sharedworker-module"
],
"origin": [
"cross-https",
"cross-http",
"cross-http-downgrade",
"cross-wss",
"cross-ws",
"cross-ws-downgrade"
],
"expectation": "*"
},
{
"name": "Workers are same-origin only (redirects)",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": [
"swap-origin",
"swap-scheme"
],
"subresource": [
"worker-classic",
"worker-module",
"sharedworker-classic",
"sharedworker-module"
],
"origin": "*",
"expectation": "*"
},
{
"name": "Websockets are ws/wss-only",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": "websocket",
"origin": [
"same-https",
"same-http",
"same-http-downgrade",
"cross-https",
"cross-http",
"cross-http-downgrade"
],
"expectation": "*"
},
{
// Redirects are intentionally forbidden in browsers:
// https://fetch.spec.whatwg.org/#concept-websocket-establish
"name": "Websockets are no-redirect only",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": [
"keep-origin",
"swap-origin",
"keep-scheme",
"swap-scheme",
"downgrade"
],
"subresource": "websocket",
"origin": "*",
"expectation": "*"
},
{
"name": "ws/wss are websocket-only",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": [
"area-tag",
"a-tag",
"fetch",
"iframe-tag",
"img-tag",
"script-tag",
"sharedworker-classic",
"sharedworker-import-data",
"sharedworker-module",
"worker-classic",
"worker-import-data",
"worker-module",
"worklet-animation",
"worklet-animation-import-data",
"worklet-audio",
"worklet-audio-import-data",
"worklet-layout",
"worklet-layout-import-data",
"worklet-paint",
"worklet-paint-import-data",
"xhr"
],
"origin": [
"same-wss",
"same-ws",
"same-ws-downgrade",
"cross-wss",
"cross-ws",
"cross-ws-downgrade"
],
"expectation": "*"
}
],
"source_context_schema": {
"supported_subresource": {
"top": "*",
"iframe": "*",
"iframe-blank": "*",
"srcdoc": "*",
"worker-classic": [
"xhr",
"fetch",
"websocket",
"worker-classic",
"worker-module"
],
"worker-module": [
"xhr",
"fetch",
"websocket",
"worker-classic",
"worker-module"
],
"worker-classic-data": [
"xhr",
"fetch",
"websocket"
],
"worker-module-data": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-classic": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-module": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-classic-data": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-module-data": [
"xhr",
"fetch",
"websocket"
]
}
},
"source_context_list_schema": {
// Warning: Currently, some nested patterns of contexts have different
// inheritance rules for different kinds of policies.
// For example, an HTTP(S) dedicated worker inherits parent's CSP but not
// parent's referrer policy, and "worker-classic" source_context_list
// value here reflects the referrer policy spec, not CSP.
// Perhaps we have to introduce separate source_context_list entries,
// e.g. "worker-classic-CSP" to test the same nested contexts with
// different policy inheritance expectations.
// The generated tests will be used to test/investigate the policy
// inheritance rules, and eventually the policy inheritance rules will
// be unified (https://github.com/w3ctag/design-principles/issues/111).
"top": {
"description": "Policy set by the top-level Document",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"req": {
"description": "Subresource request's policy should override Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
}
],
"subresourcePolicyDeliveries": [
"nonNullPolicy"
]
},
"srcdoc-inherit": {
"description": "srcdoc iframe without its own policy should inherit parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "srcdoc"
}
],
"subresourcePolicyDeliveries": []
},
"srcdoc": {
"description": "srcdoc iframe's policy should override parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "srcdoc",
"policyDeliveries": [
"nonNullPolicy"
]
}
],
"subresourcePolicyDeliveries": []
},
"iframe": {
"description": "external iframe's policy should override parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "iframe",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"iframe-blank-inherit": {
"description": "blank iframe should inherit parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "iframe-blank"
}
],
"subresourcePolicyDeliveries": []
},
"worker-classic": {
// Warning: This is incompatible with the current CSP spec,
// so is not applicable to upgrade-insecure-requests and mixed-content tests.
"description": "dedicated workers shouldn't inherit its parent's policy.",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "worker-classic",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-classic-data": {
"description": "data: dedicated workers should inherit its parent's policy.",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "worker-classic-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
},
"worker-module": {
// Warning: This is incompatible with the current CSP spec,
// so is not applicable to upgrade-insecure-requests and mixed-content tests.
"description": "dedicated workers shouldn't inherit its parent's policy.",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "worker-module",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-module-data": {
"description": "data: dedicated workers should inherit its parent's policy.",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "worker-module-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
},
"sharedworker-classic-data": {
"description": "data: shared workers should inherit its parent's policy.",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "sharedworker-classic-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
},
"sharedworker-module-data": {
"description": "data: shared workers should inherit its parent's policy.",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "sharedworker-module-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
}
},
"test_expansion_schema": {
"expansion": [
"default",
"override"
],
"source_scheme": [
"http",
"https"
],
"source_context_list": [
"top",
"req",
"srcdoc-inherit",
"srcdoc",
"iframe",
"iframe-blank-inherit",
"worker-classic",
"worker-classic-data",
"worker-module",
"worker-module-data",
"sharedworker-classic-data",
"sharedworker-module-data"
],
"redirection": [
"no-redirect",
"keep-origin",
"swap-origin",
"keep-scheme",
"swap-scheme",
"downgrade"
],
"origin": [
"same-https",
"same-http",
"same-http-downgrade",
"cross-https",
"cross-http",
"cross-http-downgrade",
"same-wss",
"same-ws",
"same-ws-downgrade",
"cross-wss",
"cross-ws",
"cross-ws-downgrade"
],
"subresource": [
"a-tag",
"area-tag",
"audio-tag",
"beacon",
"fetch",
"iframe-tag",
"img-tag",
"link-css-tag",
"link-prefetch-tag",
"object-tag",
"picture-tag",
"script-tag",
"sharedworker-classic",
"sharedworker-import-data",
"sharedworker-module",
"video-tag",
"websocket",
"worker-classic",
"worker-import-data",
"worker-module",
"worklet-animation",
"worklet-animation-import-data",
"worklet-audio",
"worklet-audio-import-data",
"worklet-layout",
"worklet-layout-import-data",
"worklet-paint",
"worklet-paint-import-data",
"xhr"
]
}
}

View file

@ -23,7 +23,6 @@ test(t => {
div.style.animationDuration = '4s'; div.style.animationDuration = '4s';
div.style.animationDelay = '6s'; div.style.animationDelay = '6s';
getComputedStyle(div).animationDuration;
assert_equals( assert_equals(
animation.effect.getTiming().duration, animation.effect.getTiming().duration,
@ -61,7 +60,6 @@ test(t => {
div.style.animationDirection = 'alternate'; div.style.animationDirection = 'alternate';
div.style.animationDelay = '6s'; div.style.animationDelay = '6s';
div.style.animationFillMode = 'both'; div.style.animationFillMode = 'both';
getComputedStyle(div).animationIterationCount;
assert_equals( assert_equals(
animation.effect.getTiming().iterations, animation.effect.getTiming().iterations,
@ -97,7 +95,6 @@ test(t => {
div.style.animationFillMode = 'forwards'; div.style.animationFillMode = 'forwards';
div.style.animationIterationCount = '6'; div.style.animationIterationCount = '6';
div.style.animationDirection = 'reverse'; div.style.animationDirection = 'reverse';
getComputedStyle(div).animationDelay;
assert_equals( assert_equals(
animation.effect.getTiming().delay, animation.effect.getTiming().delay,
@ -132,7 +129,6 @@ test(t => {
}, 'Negative iteration count should cause an error to be thrown'); }, 'Negative iteration count should cause an error to be thrown');
div.style.animationDuration = '4s'; div.style.animationDuration = '4s';
getComputedStyle(div).animationDuration;
assert_equals( assert_equals(
animation.effect.getTiming().duration, animation.effect.getTiming().duration,
@ -155,7 +151,6 @@ test(t => {
div.style.animationDuration = '6s'; div.style.animationDuration = '6s';
div.style.animationTimingFunction = 'ease-in'; div.style.animationTimingFunction = 'ease-in';
getComputedStyle(div).animationDuration;
assert_equals( assert_equals(
animation.effect.getTiming().easing, animation.effect.getTiming().easing,

View file

@ -158,7 +158,6 @@ test(t => {
div.style.animationDelay = '8s'; div.style.animationDelay = '8s';
div.style.animationFillMode = 'both'; div.style.animationFillMode = 'both';
div.style.animationPlayState = 'paused'; div.style.animationPlayState = 'paused';
getComputedStyle(div).animationDuration;
// Update the keyframes // Update the keyframes
keyframesRule.deleteRule(0); keyframesRule.deleteRule(0);

View file

@ -1,30 +0,0 @@
<!DOCTYPE html>
<title>Test for font-display-late-swap feature policy behavior when set to reporting</title>
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
.ahem {
font-family: 'Ahem';
}
.arial {
font-family: 'Arial';
}
</style>
<p>Tests if font-display is set to optional for each option except for when it is set to fallback</p>
<table id="container">
<tr>
<th>not-set</th>
<th>auto</th>
<th>block</th>
<th>swap</th>
<th>fallback</th>
<th>optional</th>
</tr>
<tr>
<td class="arial">a</td>
<td class="arial">a</td>
<td class="arial">a</td>
<td class="arial">a</td>
<td class="ahem">a</td>
<td class="arial">a</td>
</tr>
</table>

View file

@ -1,46 +0,0 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Test for font-display-late-swap feature policy behavior when set to reporting</title>
<link rel="help" href="https://github.com/w3c/webappsec-feature-policy/blob/master/policies/font-display-late-swap.md">
<link rel="match" href="font-display-feature-policy-01.tentative-ref.html">
<style>
</style>
<p>Tests if font-display is set to optional for each option except for when it is set to fallback</p>
<table id="container">
<tr>
<th>not-set</th>
<th>auto</th>
<th>block</th>
<th>swap</th>
<th>fallback</th>
<th>optional</th>
</tr>
</table>
<script>
const fontDisplayValues = ['', 'auto', 'block', 'swap', 'fallback', 'optional'];
const table = document.getElementById('container');
function makeFontFaceDeclaration(family, display) {
url = '/fonts/Ahem.ttf?pipe=trickle(d1)'; // Before the swap period is over
return '@font-face { font-family: ' + family + '; src: url("' + url + '"); font-display: ' + display + '; }';
}
window.onload = () => {
let tr = document.createElement('tr');
for (let display of fontDisplayValues) {
const family = display + '-face';
const rule = makeFontFaceDeclaration(family, display);
document.styleSheets[0].insertRule(rule, 0);
let td = document.createElement('td');
td.textContent = 'a';
td.style.fontFamily = family + ', Arial';
tr.appendChild(td);
}
table.appendChild(tr);
const timeoutMilliSec = 1500; // After the font is loaded
setTimeout(() => {
document.documentElement.classList.remove("reftest-wait");
}, timeoutMilliSec);
}
</script>
</html>

View file

@ -1 +0,0 @@
Feature-Policy: font-display-late-swap 'none';

View file

@ -1 +0,0 @@
Feature-Policy-Report-Only: font-display-late-swap 'none';

View file

@ -163,6 +163,45 @@ html,body {
<div style="grid-column:1"></div> <div style="grid-column:1"></div>
</div></div> </div></div>
<div class="grid"><div class="subgrid fill-0k">
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
</div></div>
<div class="grid"><div class="subgrid fill-0l">
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
</div></div>
<div class="grid"><div class="subgrid fill-0m">
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
</div></div>
<div class="grid"><div class="subgrid fill-1a"> <div class="grid"><div class="subgrid fill-1a">
<div style="grid-column:4"></div> <div style="grid-column:4"></div>
<div style="grid-column:4"></div> <div style="grid-column:4"></div>

View file

@ -37,6 +37,9 @@ html,body {
.fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */ .fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */
.fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */ .fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */
.fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */ .fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-0k { grid-template-columns: subgrid repeat(auto-fill, [y]) repeat(100, [z]) } /* [z] [z] [z] [z] [z] */
.fill-0l { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) repeat(100, [z]) } /* [x] [z] [z] [z] [z] */
.fill-0m { grid-template-columns: subgrid repeat(100, [x]) repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */ .fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */
.fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */ .fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */
@ -195,6 +198,45 @@ html,body {
<div style="grid-column:y -5"></div> <div style="grid-column:y -5"></div>
</div></div> </div></div>
<div class="grid"><div class="subgrid fill-0k">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div>
<div class="grid"><div class="subgrid fill-0l">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div>
<div class="grid"><div class="subgrid fill-0m">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div>
<div class="grid"><div class="subgrid fill-1a"> <div class="grid"><div class="subgrid fill-1a">
<div style="grid-column:y 5"></div> <div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div> <div style="grid-column:y 4"></div>
@ -402,6 +444,9 @@ html,body {
"subgrid [x] [x] [x] [x] [x]", "subgrid [x] [x] [x] [x] [x]",
"subgrid [x] [x] [x] [x] [x]", "subgrid [x] [x] [x] [x] [x]",
"subgrid [x] [x] [x] [x] [x]", "subgrid [x] [x] [x] [x] [x]",
"subgrid [z] [z] [z] [z] [z]",
"subgrid [x] [z] [z] [z] [z]",
"subgrid [x] [x] [x] [x] [x]",
"subgrid [y] [z] [z] [z] [z]", "subgrid [y] [z] [z] [z] [z]",
"subgrid [x] [y] [z] [z] [z]", "subgrid [x] [y] [z] [z] [z]",
"subgrid [x] [x] [y] [z] [z]", "subgrid [x] [x] [y] [z] [z]",

View file

@ -40,6 +40,9 @@ html,body {
.fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */ .fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */
.fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */ .fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */
.fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */ .fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-0k { grid-template-columns: subgrid repeat(auto-fill, [y]) repeat(100, [z]) } /* [z] [z] [z] [z] [z] */
.fill-0l { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) repeat(100, [z]) } /* [x] [z] [z] [z] [z] */
.fill-0m { grid-template-columns: subgrid repeat(100, [x]) repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */ .fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */
.fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */ .fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */
@ -198,6 +201,45 @@ html,body {
<div style="grid-column:y -5"></div> <div style="grid-column:y -5"></div>
</div></div></div> </div></div></div>
<div class="grid"><div class="subgrid fill-0k"><div class="subgrid">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-0l"><div class="subgrid">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-0m"><div class="subgrid">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-1a"><div class="subgrid"> <div class="grid"><div class="subgrid fill-1a"><div class="subgrid">
<div style="grid-column:y 5"></div> <div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div> <div style="grid-column:y 4"></div>

View file

@ -45,6 +45,9 @@ html,body {
.fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */ .fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */
.fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */ .fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */
.fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */ .fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-0k { grid-template-columns: subgrid repeat(auto-fill, [y]) repeat(100, [z]) } /* [z] [z] [z] [z] [z] */
.fill-0l { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) repeat(100, [z]) } /* [x] [z] [z] [z] [z] */
.fill-0m { grid-template-columns: subgrid repeat(100, [x]) repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */ .fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */
.fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */ .fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */
@ -204,6 +207,45 @@ html,body {
<div style="grid-row:y -5"></div> <div style="grid-row:y -5"></div>
</div></div></div> </div></div></div>
<div class="grid"><div class="subgrid fill-0k"><div class="subgrid">
<div style="grid-row:y 5"></div>
<div style="grid-row:y 4"></div>
<div style="grid-row:y 3"></div>
<div style="grid-row:y 2"></div>
<div style="grid-row:y 1"></div>
<div style="grid-row:y -1"></div>
<div style="grid-row:y -2"></div>
<div style="grid-row:y -3"></div>
<div style="grid-row:y -4"></div>
<div style="grid-row:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-0l"><div class="subgrid">
<div style="grid-row:y 5"></div>
<div style="grid-row:y 4"></div>
<div style="grid-row:y 3"></div>
<div style="grid-row:y 2"></div>
<div style="grid-row:y 1"></div>
<div style="grid-row:y -1"></div>
<div style="grid-row:y -2"></div>
<div style="grid-row:y -3"></div>
<div style="grid-row:y -4"></div>
<div style="grid-row:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-0m"><div class="subgrid">
<div style="grid-row:y 5"></div>
<div style="grid-row:y 4"></div>
<div style="grid-row:y 3"></div>
<div style="grid-row:y 2"></div>
<div style="grid-row:y 1"></div>
<div style="grid-row:y -1"></div>
<div style="grid-row:y -2"></div>
<div style="grid-row:y -3"></div>
<div style="grid-row:y -4"></div>
<div style="grid-row:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-1a"><div class="subgrid"> <div class="grid"><div class="subgrid fill-1a"><div class="subgrid">
<div style="grid-row:y 5"></div> <div style="grid-row:y 5"></div>
<div style="grid-row:y 4"></div> <div style="grid-row:y 4"></div>

View file

@ -163,6 +163,45 @@ html,body {
<div style="grid-column:1"></div> <div style="grid-column:1"></div>
</div></div> </div></div>
<div class="grid"><div class="subgrid fill-0k">
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
</div></div>
<div class="grid"><div class="subgrid fill-0l">
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
</div></div>
<div class="grid"><div class="subgrid fill-0m">
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:4"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
<div style="grid-column:1"></div>
</div></div>
<div class="grid"><div class="subgrid fill-1a"> <div class="grid"><div class="subgrid fill-1a">
<div style="grid-column:4"></div> <div style="grid-column:4"></div>
<div style="grid-column:4"></div> <div style="grid-column:4"></div>

View file

@ -40,6 +40,9 @@ html,body {
.fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */ .fill-0h { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] [z] } /* [x] [x] [x] [x] [x] */
.fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */ .fill-0i { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) [z] } /* [x] [x] [x] [x] [x] */
.fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */ .fill-0j { grid-template-columns: subgrid [x] [x] [x] [x] [x] [x] [x] repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-0k { grid-template-columns: subgrid repeat(auto-fill, [y]) repeat(100, [z]) } /* [z] [z] [z] [z] [z] */
.fill-0l { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) repeat(100, [z]) } /* [x] [z] [z] [z] [z] */
.fill-0m { grid-template-columns: subgrid repeat(100, [x]) repeat(auto-fill, [y]) } /* [x] [x] [x] [x] [x] */
.fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */ .fill-1a { grid-template-columns: subgrid repeat(auto-fill, [y]) [z] [z] [z] [z] } /* [y] [z] [z] [z] [z] */
.fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */ .fill-1b { grid-template-columns: subgrid [x] repeat(auto-fill, [y]) [z] [z] [z] } /* [x] [y] [z] [z] [z] */
@ -198,6 +201,45 @@ html,body {
<div style="grid-column:y -5"></div> <div style="grid-column:y -5"></div>
</div></div></div> </div></div></div>
<div class="grid"><div class="subgrid fill-0k"><div class="subgrid">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-0l"><div class="subgrid">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-0m"><div class="subgrid">
<div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div>
<div style="grid-column:y 3"></div>
<div style="grid-column:y 2"></div>
<div style="grid-column:y 1"></div>
<div style="grid-column:y -1"></div>
<div style="grid-column:y -2"></div>
<div style="grid-column:y -3"></div>
<div style="grid-column:y -4"></div>
<div style="grid-column:y -5"></div>
</div></div></div>
<div class="grid"><div class="subgrid fill-1a"><div class="subgrid"> <div class="grid"><div class="subgrid fill-1a"><div class="subgrid">
<div style="grid-column:y 5"></div> <div style="grid-column:y 5"></div>
<div style="grid-column:y 4"></div> <div style="grid-column:y 4"></div>

View file

@ -80,41 +80,43 @@
</style> </style>
<script type="text/javascript"> <script type="text/javascript">
test(function(){ let expectedForSelector = {
let expectedForSelector = { "" : "margin-top: 5cm; margin-bottom: 10cm;",
"" : "margin-top: 5cm; margin-bottom: 10cm;", ":left" : "margin-right: 3cm;",
":left" : "margin-right: 3cm;", ":right" : "margin-left: 3cm;",
":right" : "margin-left: 3cm;", ":first" : "border-width: 1px;",
":first" : "border-width: 1px;", "hello" : "color: green;",
"hello" : "color: green;", "world:right" : "background-color: green;",
"world:right" : "background-color: green;", "auto_page" : "size: auto;",
"auto_page" : "size: auto;", "square_page" : "size: 4in;",
"square_page" : "size: 4in;", "letter_page" : "size: letter;",
"letter_page" : "size: letter;", "page_width_height" : "size: 10cm 15cm;",
"page_width_height" : "size: 10cm 15cm;", "page_size_orientation" : "size: ledger landscape;",
"page_size_orientation" : "size: ledger landscape;", "page_orientation_size" : "size: a4 portrait;",
"page_orientation_size" : "size: a4 portrait;", "page_jis_size_orientation" : "size: jis-b5 portrait;",
"page_jis_size_orientation" : "size: jis-b5 portrait;", "page_orientation_jis_size" : "size: jis-b4 landscape;",
"page_orientation_jis_size" : "size: jis-b4 landscape;", "err_empty_size" : "",
"err_empty_size" : "", "err_unknow_page_size" : "",
"err_unknow_page_size" : "", "err_length_and_page_size" : "",
"err_length_and_page_size" : "", "err_length_and_orientation" : "",
"err_length_and_orientation" : "", "err_orientations" : "",
"err_orientations" : "", "err_too_many_params" : ""
"err_too_many_params" : "" };
}; let styleSheets = document.styleSheets;
let styleSheets = document.styleSheets; for (let i = 0; i < styleSheets.length; i++) {
for (let i = 0; i < styleSheets.length; i++) { let rules = styleSheets[i].cssRules;
let rules = styleSheets[i].cssRules; for (let rule of rules) {
for (let rule of rules) { if (rule.type == CSSRule.PAGE_RULE) {
if (rule.type == CSSRule.PAGE_RULE) { let expected = expectedForSelector[rule.selectorText];
let expected = expectedForSelector[rule.selectorText]; test(function(){
assert_equals(rule.style.cssText, expected, "unexpected @page contents"); assert_equals(rule.style.cssText, expected, "unexpected @page contents");
delete expectedForSelector[rule.selectorText]; }, "unexpected contents for selector ['" + rule.selectorText + "']");
} delete expectedForSelector[rule.selectorText];
} }
} }
}
test(function() {
assert_equals(Object.keys(expectedForSelector).length, 0, "missing @page selectors"); assert_equals(Object.keys(expectedForSelector).length, 0, "missing @page selectors");
}, "test CSS @page declarations"); });
</script> </script>

View file

@ -27,29 +27,31 @@
</style> </style>
<script type="text/javascript"> <script type="text/javascript">
test(function(){ let expectedForSelector = {
let expectedForSelector = { "" : "margin: 3cm;",
"" : "margin: 3cm;", ":first" : "margin-top: 6cm;",
":first" : "margin-top: 6cm;", ":left" : "color: red;",
":left" : "color: red;", ":right" : "color: blue;"
":right" : "color: blue;" };
}; let styleSheets = document.styleSheets;
let styleSheets = document.styleSheets; for (let i = 0; i < styleSheets.length; i++) {
for (let i = 0; i < styleSheets.length; i++) { let rules = styleSheets[i].cssRules;
let rules = styleSheets[i].cssRules; for (let rule of rules) {
for (let rule of rules) { if (rule.type == CSSRule.MEDIA_RULE && rule.conditionText == 'print') {
if (rule.type == CSSRule.MEDIA_RULE && rule.conditionText == 'print') { for (let mediaRule of rule.cssRules) {
for (let mediaRule of rule.cssRules) { if (mediaRule.type == CSSRule.PAGE_RULE) {
if (mediaRule.type == CSSRule.PAGE_RULE) { let expected = expectedForSelector[mediaRule.selectorText];
let expected = expectedForSelector[mediaRule.selectorText]; test(function(){
assert_equals(mediaRule.style.cssText, expected, "unexpected @page contents"); assert_equals(mediaRule.style.cssText, expected, "unexpected @page contents");
delete expectedForSelector[mediaRule.selectorText]; }, "unexpected contents for selector ['" + mediaRule.selectorText + "']");
} delete expectedForSelector[mediaRule.selectorText];
} }
} }
} }
} }
}
test(function() {
assert_equals(Object.keys(expectedForSelector).length, 0, "missing @page selectors in @media"); assert_equals(Object.keys(expectedForSelector).length, 0, "missing @page selectors in @media");
}, "test @page inside a @media print rule"); });
</script> </script>

View file

@ -23,14 +23,12 @@
</style> </style>
<script type="text/javascript"> <script type="text/javascript">
test(function(){ test_valid_value("page", "auto");
test_valid_value("page", "auto"); test_valid_value("page", "small_page");
test_valid_value("page", "small_page"); test_valid_value("page", "large_page");
test_valid_value("page", "large_page"); test_invalid_value("page", "auto small_page");
test_invalid_value("page", "auto small_page"); test_invalid_value("page", "large_page auto");
test_invalid_value("page", "large_page auto"); test_invalid_value("page", "small_page large_page");
test_invalid_value("page", "small_page large_page"); test_invalid_value("page", "1cm");
test_invalid_value("page", "1cm");
}, "test page properties in HTML elements");
</script> </script>

View file

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>Test for font-display-late-swap feature policy set to report-only</title> <title>Test for font-display-late-swap feature policy set to report-only</title>
<link rel="help" href="https://w3c.github.io/webappsec-feature-policy/#reporting"> <link rel="help" href="https://github.com/w3c/webappsec-feature-policy/blob/master/policies/font-display-late-swap.md">
<script src='/resources/testharness.js'></script> <script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script> <script src='/resources/testharnessreport.js'></script>
<style> <style>
@ -52,7 +52,7 @@ let t = async_test('font-display-late-swap Report Format');
let check_report_format = (reports, observer) => { let check_report_format = (reports, observer) => {
reportCounter -= reports.length; reportCounter -= reports.length;
for (let report of reports) { for (let report of reports) {
assert_equals(report.type, 'feature-policy-violation'); assert_equals(report.type, 'document-policy-violation');
assert_equals(report.url, document.location.href, 'Report URL'); assert_equals(report.url, document.location.href, 'Report URL');
assert_equals(report.body.featureId, 'font-display-late-swap'); assert_equals(report.body.featureId, 'font-display-late-swap');
assert_equals(report.body.disposition, 'report'); assert_equals(report.body.disposition, 'report');
@ -66,7 +66,7 @@ let check_report_format = (reports, observer) => {
}; };
new ReportingObserver(t.step_func(check_report_format), new ReportingObserver(t.step_func(check_report_format),
{types: ['feature-policy-violation'], buffered: true}).observe(); {types: ['document-policy-violation'], buffered: true}).observe();
</script> </script>
</body> </body>
</html> </html>

View file

@ -0,0 +1 @@
Document-Policy-Report-Only: no-font-display-late-swap

View file

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>Test for font-display-late-swap feature policy set to reporting</title> <title>Test for font-display-late-swap feature policy set to reporting</title>
<link rel="help" href="https://w3c.github.io/webappsec-feature-policy/#reporting"> <link rel="help" href="https://github.com/w3c/webappsec-feature-policy/blob/master/policies/font-display-late-swap.md">
<script src='/resources/testharness.js'></script> <script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script> <script src='/resources/testharnessreport.js'></script>
<style> <style>
@ -52,7 +52,7 @@ let t = async_test('font-display-late-swap Report Format');
let check_report_format = (reports, observer) => { let check_report_format = (reports, observer) => {
reportCounter -= reports.length; reportCounter -= reports.length;
for (let report of reports) { for (let report of reports) {
assert_equals(report.type, 'feature-policy-violation'); assert_equals(report.type, 'document-policy-violation');
assert_equals(report.url, document.location.href, 'Report URL'); assert_equals(report.url, document.location.href, 'Report URL');
assert_equals(report.body.featureId, 'font-display-late-swap'); assert_equals(report.body.featureId, 'font-display-late-swap');
assert_equals(report.body.disposition, 'enforce'); assert_equals(report.body.disposition, 'enforce');
@ -66,7 +66,7 @@ let check_report_format = (reports, observer) => {
}; };
new ReportingObserver(t.step_func(check_report_format), new ReportingObserver(t.step_func(check_report_format),
{types: ['feature-policy-violation'], buffered: true}).observe(); {types: ['document-policy-violation'], buffered: true}).observe();
</script> </script>
</body> </body>
</html> </html>

View file

@ -0,0 +1 @@
Document-Policy: no-font-display-late-swap

View file

@ -191,6 +191,24 @@ async_test(function(t) {
input.click() input.click()
}, "disconnected radio should be checked") }, "disconnected radio should be checked")
async_test(t => {
const input = document.createElement('input');
input.type = 'checkbox';
input.onclick = t.step_func_done(() => {
assert_true(input.checked);
});
input.dispatchEvent(new MouseEvent('click'));
}, `disconnected checkbox should be checked from dispatchEvent(new MouseEvent('click'))`);
async_test(t => {
const input = document.createElement('input');
input.type = 'radio';
input.onclick = t.step_func_done(() => {
assert_true(input.checked);
});
input.dispatchEvent(new MouseEvent('click'));
}, `disconnected radio should be checked from dispatchEvent(new MouseEvent('click'))`);
async_test(function(t) { async_test(function(t) {
var form = document.createElement("form") var form = document.createElement("form")
var didSubmit = false var didSubmit = false

View file

@ -0,0 +1,190 @@
<!DOCTYPE html>
<meta charset="utf-8">
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
<title>input and change events for detached checkbox and radio elements</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
test(() => {
const input = document.createElement('input');
input.type = 'checkbox';
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.click();
assert_false(inputEventFired);
assert_false(changeEventFired);
}, 'detached checkbox should not emit input or change events on click().');
test(() => {
const input = document.createElement('input');
input.type = 'radio';
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.click();
assert_false(inputEventFired);
assert_false(changeEventFired);
}, 'detached radio should not emit input or change events on click().');
test(() => {
const input = document.createElement('input');
input.type = 'checkbox';
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.dispatchEvent(new MouseEvent('click'));
assert_false(inputEventFired);
assert_false(changeEventFired);
}, `detached checkbox should not emit input or change events on dispatchEvent(new MouseEvent('click')).`);
test(() => {
const input = document.createElement('input');
input.type = 'radio';
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.dispatchEvent(new MouseEvent('click'));
assert_false(inputEventFired);
assert_false(changeEventFired);
}, `detached radio should not emit input or change events on dispatchEvent(new MouseEvent('click')).`);
test(() => {
const input = document.createElement('input');
input.type = 'checkbox';
document.body.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.click();
assert_true(inputEventFired);
assert_true(changeEventFired);
}, 'attached checkbox should emit input and change events on click().');
test(() => {
const input = document.createElement('input');
input.type = 'radio';
document.body.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.click();
assert_true(inputEventFired);
assert_true(changeEventFired);
}, 'attached radio should emit input and change events on click().');
test(() => {
const input = document.createElement('input');
input.type = 'checkbox';
document.body.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.dispatchEvent(new MouseEvent('click'));
assert_true(inputEventFired);
assert_true(changeEventFired);
}, `attached checkbox should emit input and change events on dispatchEvent(new MouseEvent('click')).`);
test(() => {
const input = document.createElement('input');
input.type = 'radio';
document.body.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.dispatchEvent(new MouseEvent('click'));
assert_true(inputEventFired);
assert_true(changeEventFired);
}, `attached radio should emit input and change events on dispatchEvent(new MouseEvent('click')).`);
test(() => {
const input = document.createElement('input');
input.type = 'checkbox';
const shadowHost = document.createElement('div');
document.body.appendChild(shadowHost);
const shadowRoot = shadowHost.attachShadow({mode: 'open'});
shadowRoot.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.click();
assert_true(inputEventFired);
assert_true(changeEventFired);
}, 'attached to shadow dom checkbox should emit input and change events on click().');
test(() => {
const input = document.createElement('input');
input.type = 'radio';
const shadowHost = document.createElement('div');
document.body.appendChild(shadowHost);
const shadowRoot = shadowHost.attachShadow({mode: 'open'});
shadowRoot.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.click();
assert_true(inputEventFired);
assert_true(changeEventFired);
}, 'attached to shadow dom radio should emit input and change events on click().');
test(() => {
const input = document.createElement('input');
input.type = 'checkbox';
const shadowHost = document.createElement('div');
document.body.appendChild(shadowHost);
const shadowRoot = shadowHost.attachShadow({mode: 'open'});
shadowRoot.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.dispatchEvent(new MouseEvent('click'));
assert_true(inputEventFired);
assert_true(changeEventFired);
}, `attached to shadow dom checkbox should emit input and change events on dispatchEvent(new MouseEvent('click')).`);
test(() => {
const input = document.createElement('input');
input.type = 'radio';
const shadowHost = document.createElement('div');
document.body.appendChild(shadowHost);
const shadowRoot = shadowHost.attachShadow({mode: 'open'});
shadowRoot.appendChild(input);
let inputEventFired = false;
input.addEventListener('input', () => inputEventFired = true);
let changeEventFired = false;
input.addEventListener('change', () => changeEventFired = true);
input.dispatchEvent(new MouseEvent('click'));
assert_true(inputEventFired);
assert_true(changeEventFired);
}, `attached to shadow dom radio should emit input and change events on dispatchEvent(new MouseEvent('click')).`);
</script>
</body>

View file

@ -0,0 +1,86 @@
<!doctype html>
<meta name="timeout" content="long">
<title>Cross-Origin-Embedder-Policy-Report-Only header does not affect the actual behavior</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/common/utils.js></script> <!-- Use token() to allow running tests in parallel -->
<script src="/common/get-host-info.sub.js"></script>
<div id=log></div>
<script>
const HOST = get_host_info();
const BASE = new URL("resources", location).pathname;
async_test(t => {
const frame = document.createElement("iframe");
t.add_cleanup(() => frame.remove());
frame.onload = t.step_func_done(() => {
assert_not_equals(frame.contentDocument, null);
});
frame.src = "/common/blank.html";
document.body.append(frame);
assert_equals(frame.contentDocument.body.localName, "body");
}, `"none" top-level: navigating a frame to "none" should succeed`);
async_test(t => {
const frame = document.createElement("iframe");
t.add_cleanup(() => frame.remove());
const blank = "/common/blank.html";
let firstNavOk = false;
frame.onload = t.step_func(() => {
if (!firstNavOk) {
assert_not_equals(frame.contentDocument, null);
firstNavOk = true;
} else {
assert_not_equals(frame.contentDocument, null);
assert_equals(frame.contentWindow.location.pathname, blank);
t.done();
}
});
frame.src = `resources/navigate-require-corp.sub.html?to=${blank}`;
document.body.append(frame);
assert_equals(frame.contentDocument.body.localName, "body");
}, `"none" top-level: navigating a frame from "require-corp" to "none" should succeed`);
async_test(t => {
const w = window.open(`resources/navigate-none.sub.html?to=navigate-require-corp.sub.html`, "window_name");
t.add_cleanup(() => w.close());
w.onload = t.step_func(() => {
w.history.back();
t.step_timeout(() => {
assert_not_equals(w.document, null);
t.done();
}, 1500);
});
}, `"none" top-level: navigating a frame back from "require-corp" should succeed`);
async_test(t => {
let pageLoaded = false;
const bc = new BroadcastChannel(token());
let finished = false;
let doneCheck = _ => {
if (finished && pageLoaded) {
t.done();
}
}
bc.onmessage = t.step_func((event) => {
pageLoaded = true;
let payload = event.data;
assert_equals(payload, "loaded");
doneCheck();
});
const bc2 = new BroadcastChannel(token());
bc2.onmessage = t.step_func((event) => {
finished = true;
let payload = event.data;
assert_equals(payload, "loaded");
doneCheck();
});
const win = window.open(`resources/navigate-require-corp.sub.html?channelName=${bc.name}&to=navigate-none.sub.html?channelName=${bc2.name}`, "_blank", "noopener");
assert_equals(win, null);
}, `"require-corp" top-level noopener popup: navigating to "none" should succeed`);
</script>

View file

@ -0,0 +1 @@
cross-origin-embedder-policy-report-only: require-corp

View file

@ -0,0 +1,68 @@
<!doctype html>
<html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script>
const HOST = get_host_info();
function getIframeUrl(filename, token1, token2) {
let query = `template=${filename}`;
if (token1) {
query += `&coep=${token1}`
}
if (token2) {
query += `&coep-report-only=${token2}`
}
return `resources/reporting-iframe.py?${query}`;
}
function checkReports(reports, contextUrl) {
assert_not_equals(reports, null);
assert_equals(reports.length, 2);
assert_equals(reports[0].type, 'coep');
assert_equals(reports[0].url, contextUrl);
assert_equals(reports[0].body.type, 'corp');
assert_equals(reports[1].type, 'coep');
assert_equals(reports[1].url, contextUrl);
assert_equals(reports[1].body.type, 'corp');
// The order of the reports is non-deterministic.
const actualBlockedUrls = reports.map((r) => r.body['blocked-url']).sort();
const expectedBlockedUrls = [
`${HOST.REMOTE_ORIGIN}/common/text-plain.txt`,
`${HOST.ORIGIN}/common/redirect.py?location=${HOST.REMOTE_ORIGIN}/common/text-plain.txt`,
];
assert_array_equals(actualBlockedUrls.sort(), expectedBlockedUrls.sort());
}
async_test(async (t) => {
try {
const iframe = document.createElement('iframe');
t.add_cleanup(() => iframe.remove());
const token1 = token();
const token2 = token();
iframe.src = `resources/subresource-corp.html?token1=${token1}&token2=${token2}`;
document.body.appendChild(iframe);
await new Promise(resolve => t.step_timeout(resolve, 3000));
const res1 = await fetch(`resources/stash-take.py?key=${token1}`);
const res2 = await fetch(`resources/stash-take.py?key=${token2}`);
const reports = JSON.parse(await res1.text());
const reportsForReportOnly = JSON.parse(await res2.text());
checkReports(reports, iframe.src);
checkReports(reportsForReportOnly, iframe.src);
t.done();
} catch (e) {
t.step(() => { throw e });
};
}, 'report-to parameter for COEP and COEP-report-only');
</script>

View file

@ -0,0 +1,19 @@
import json
def main(request, response):
if request.method == 'OPTIONS':
# CORS preflight
response.headers.set('Access-Control-Allow-Origin', '*')
response.headers.set('Access-Control-Allow-Methods', 'POST')
response.headers.set('Access-Control-Allow-Headers', 'content-type')
return ''
url_dir = '/'.join(request.url_parts.path.split('/')[:-1]) + '/'
key = request.GET.first('key')
reports = request.server.stash.take(key, url_dir) or []
for report in json.loads(request.body):
reports.append(report)
request.server.stash.put(key, reports, url_dir)
response.headers.set('Access-Control-Allow-Origin', '*')
return 'done'

View file

@ -0,0 +1,9 @@
from wptserve.handlers import json_handler
@json_handler
def main(request, response):
path = '/'.join(request.url_parts.path.split('/')[:-1]) + '/'
key = request.GET.first('key')
response.headers.set('Access-Control-Allow-Origin', '*')
return request.server.stash.take(key, path)

View file

@ -0,0 +1,35 @@
<!doctype html>
<html>
<script src="/common/get-host-info.sub.js"></script>
<script>
const HOST = get_host_info();
const current = new URL(window.location.href);
const token = current.searchParams.get("token");
const cache = 'no-store';
const mode = 'no-cors';
async function run() {
const init = { mode, cache };
// This is not blocked.
await fetch('/common/text-plain.txt', init);
// This is blocked but not due to COEP.
try {
await fetch('nothing-same-origin-corp.txt', init);
} catch (e) {
}
try {
await fetch(`${HOST.REMOTE_ORIGIN}/common/text-plain.txt`, init);
} catch (e) {
}
try {
await fetch(`/common/redirect.py?location=${HOST.REMOTE_ORIGIN}/common/text-plain.txt`, init);
} catch (e) {
}
}
run();
</script>
</html>

View file

@ -0,0 +1,4 @@
cache-control: no-store, no-cache
report-to: { "group": "endpoint", "max_age": 3600, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-embedder-policy/resources/report.py?key={{GET[token1]}}" }] }, { "group": "report-only-endpoint", "max_age": 3600, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-embedder-policy/resources/report.py?key={{GET[token2]}}" }] }
cross-origin-embedder-policy: require-corp; report-to="endpoint"
cross-origin-embedder-policy-report-only: require-corp; report-to="report-only-endpoint"

View file

@ -0,0 +1,26 @@
<!doctype html>
<html class="test-wait">
<title>Crash when detaching a frame during a lazy-load operation</title>
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
<link rel="author" href="https://mozilla.org" title="Mozilla">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1619858">
<iframe srcdoc=""></iframe>
<script>
onload = function() {
let frame = document.querySelector("iframe");
frame.contentDocument.body.innerHTML = `
<div style="height: 300vh"></div>
<img loading="lazy" src="/images/blue96x96.png" width=96 height=96>
`;
let img = frame.contentDocument.querySelector("img");
new IntersectionObserver(() => {
frame.remove();
requestAnimationFrame(function() {
requestAnimationFrame(function() {
document.documentElement.className = "";
});
});
}).observe(img);
frame.contentWindow.scrollTo(0, img.getBoundingClientRect().top);
};
</script>

View file

@ -0,0 +1,8 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into reffy-reports
// (https://github.com/tidoust/reffy-reports)
// Source: Origin Policy (https://wicg.github.io/origin-policy/)
partial interface mixin WindowOrWorkerGlobalScope {
readonly attribute FrozenArray<DOMString> originPolicyIds;
};

View file

@ -15,12 +15,9 @@ dictionary FaceDetectorOptions {
boolean fastMode; boolean fastMode;
}; };
[Exposed=(Window,Worker), dictionary DetectedFace {
SecureContext, required DOMRectReadOnly boundingBox;
Serializable] required FrozenArray<Landmark>? landmarks;
interface DetectedFace {
[SameObject] readonly attribute DOMRectReadOnly boundingBox;
[SameObject] readonly attribute FrozenArray<Landmark>? landmarks;
}; };
dictionary Landmark { dictionary Landmark {
@ -47,14 +44,11 @@ dictionary BarcodeDetectorOptions {
sequence<BarcodeFormat> formats; sequence<BarcodeFormat> formats;
}; };
[Exposed=(Window,Worker), dictionary DetectedBarcode {
SecureContext, required DOMRectReadOnly boundingBox;
Serializable] required DOMString rawValue;
interface DetectedBarcode { required BarcodeFormat format;
[SameObject] readonly attribute DOMRectReadOnly boundingBox; required FrozenArray<Point2D> cornerPoints;
[SameObject] readonly attribute DOMString rawValue;
[SameObject] readonly attribute BarcodeFormat format;
[SameObject] readonly attribute FrozenArray<Point2D> cornerPoints;
}; };
enum BarcodeFormat { enum BarcodeFormat {

View file

@ -23,7 +23,6 @@ interface TrustedScriptURL {
interface TrustedTypePolicyFactory { interface TrustedTypePolicyFactory {
[Unforgeable] TrustedTypePolicy createPolicy(DOMString policyName, TrustedTypePolicyOptions policyOptions); [Unforgeable] TrustedTypePolicy createPolicy(DOMString policyName, TrustedTypePolicyOptions policyOptions);
// All the policy object names that have been created // All the policy object names that have been created
[Unforgeable] sequence<DOMString> getPolicyNames();
}; };
[Exposed=(Window, Worker)] [Exposed=(Window, Worker)]

View file

@ -203,7 +203,7 @@ dictionary RTCVideoSourceStats : RTCMediaSourceStats {
unsigned long height; unsigned long height;
unsigned long bitDepth; unsigned long bitDepth;
unsigned long frames; unsigned long frames;
unsigned long framesPerSecond; double framesPerSecond;
}; };
dictionary RTCRtpContributingSourceStats : RTCStats { dictionary RTCRtpContributingSourceStats : RTCStats {
@ -220,7 +220,7 @@ dictionary RTCPeerConnectionStats : RTCStats {
unsigned long dataChannelsAccepted; unsigned long dataChannelsAccepted;
}; };
dictionary RTCRtpTransceiverStats { dictionary RTCRtpTransceiverStats : RTCStats {
DOMString senderId; DOMString senderId;
DOMString receiverId; DOMString receiverId;
DOMString mid; DOMString mid;
@ -257,7 +257,7 @@ dictionary RTCAudioReceiverStats : RTCAudioHandlerStats {
dictionary RTCDataChannelStats : RTCStats { dictionary RTCDataChannelStats : RTCStats {
DOMString label; DOMString label;
DOMString protocol; DOMString protocol;
long dataChannelIdentifier; unsigned short dataChannelIdentifier;
DOMString transportId; DOMString transportId;
RTCDataChannelState state; RTCDataChannelState state;
unsigned long messagesSent; unsigned long messagesSent;
@ -354,95 +354,3 @@ dictionary RTCIceServerStats : RTCStats {
unsigned long totalResponsesReceived; unsigned long totalResponsesReceived;
double totalRoundTripTime; double totalRoundTripTime;
}; };
dictionary RTCMediaStreamStats : RTCStats {
DOMString streamIdentifier;
sequence<DOMString> trackIds;
};
dictionary RTCSenderVideoTrackAttachmentStats : RTCVideoSenderStats {
};
dictionary RTCSenderAudioTrackAttachmentStats : RTCAudioSenderStats {
};
dictionary RTCReceiverVideoTrackAttachmentStats : RTCVideoReceiverStats {};
dictionary RTCReceiverAudioTrackAttachmentStats : RTCAudioReceiverStats {};
partial dictionary RTCCodecStats {
DOMString implementation;
};
partial dictionary RTCIceCandidateStats {
boolean deleted = false;
boolean isRemote;
};
partial dictionary RTCIceCandidatePairStats {
double totalRtt;
double currentRtt;
unsigned long long priority;
};
partial dictionary RTCRtpStreamStats {
DOMString mediaType;
double averageRTCPInterval;
};
partial dictionary RTCInboundRtpStreamStats {
double fractionLost;
};
partial dictionary RTCAudioHandlerStats {
double audioLevel;
double totalAudioEnergy;
double totalSamplesDuration;
boolean voiceActivityFlag;
};
partial dictionary RTCAudioSenderStats {
unsigned long long totalSamplesSent;
double echoReturnLoss;
double echoReturnLossEnhancement;
};
partial dictionary RTCAudioReceiverStats {
DOMHighResTimeStamp estimatedPlayoutTimestamp;
double jitterBufferDelay;
unsigned long long jitterBufferEmittedCount;
unsigned long long totalSamplesReceived;
unsigned long long concealedSamples;
unsigned long long silentConcealedSamples;
unsigned long long concealmentEvents;
unsigned long long insertedSamplesForDeceleration;
unsigned long long removedSamplesForAcceleration;
double audioLevel;
double totalAudioEnergy;
double totalSamplesDuration;
};
partial dictionary RTCVideoHandlerStats {
unsigned long frameWidth;
unsigned long frameHeight;
double framesPerSecond;
};
partial dictionary RTCVideoSenderStats {
unsigned long keyFramesSent;
unsigned long framesCaptured;
unsigned long framesSent;
unsigned long hugeFramesSent;
};
partial dictionary RTCVideoReceiverStats {
unsigned long keyFramesReceived;
DOMHighResTimeStamp estimatedPlayoutTimestamp;
double jitterBufferDelay;
unsigned long long jitterBufferEmittedCount;
unsigned long framesReceived;
unsigned long framesDecoded;
unsigned long framesDropped;
unsigned long partialFramesLost;
unsigned long fullFramesLost;
};

View file

@ -4,5 +4,5 @@ Tests in this directory are for the proposed performance.measureMemory API.
This is not yet standardised and browsers should not be expected to pass This is not yet standardised and browsers should not be expected to pass
these tests. these tests.
See the explainer at https://github.com/ulan/performance-measure-memory See the explainer at https://github.com/WICG/performance-measure-memory
for more information about the API. for more information about the API.

View file

@ -5,12 +5,15 @@
promise_test(async testCase => { promise_test(async testCase => {
const frame = document.createElement("iframe"); const frame = document.createElement("iframe");
const path = new URL("resources/iframe.sub.html", window.location).pathname; const child = getUrl(CROSS_ORIGIN, "resources/child.sub.html");
frame.src = `${CROSS_ORIGIN}${path}`; const grandchild = getUrl(CROSS_ORIGIN, "resources/grandchild.sub.html");
frame.src = child;
document.body.append(frame); document.body.append(frame);
try { try {
let result = await performance.measureMemory(); let result = await performance.measureMemory();
checkMeasureMemory(result); checkMeasureMemory(result, {
allowed: [window.location.href, child]
});
} catch (error) { } catch (error) {
if (!(error instanceof DOMException)) { if (!(error instanceof DOMException)) {
throw error; throw error;

View file

@ -5,12 +5,15 @@
promise_test(async testCase => { promise_test(async testCase => {
const frame = document.createElement("iframe"); const frame = document.createElement("iframe");
const path = new URL("resources/iframe.sub.html", window.location).pathname; const child = getUrl(SAME_ORIGIN, "resources/child.sub.html");
frame.src = `${SAME_ORIGIN}${path}`; const grandchild = getUrl(SAME_ORIGIN, "resources/grandchild.sub.html");
frame.src = child;
document.body.append(frame); document.body.append(frame);
try { try {
let result = await performance.measureMemory(); let result = await performance.measureMemory();
checkMeasureMemory(result); checkMeasureMemory(result, {
allowed: [window.location.href, child, grandchild],
});
} catch (error) { } catch (error) {
if (!(error instanceof DOMException)) { if (!(error instanceof DOMException)) {
throw error; throw error;

View file

@ -6,7 +6,7 @@
promise_test(async testCase => { promise_test(async testCase => {
try { try {
let result = await performance.measureMemory(); let result = await performance.measureMemory();
checkMeasureMemory(result); checkMeasureMemory(result, {allowed: [window.location.href]});
} catch (error) { } catch (error) {
if (!(error instanceof DOMException)) { if (!(error instanceof DOMException)) {
throw error; throw error;

View file

@ -0,0 +1,8 @@
<!doctype html>
<meta charset=utf-8>
<html>
<body>
Hello from child iframe.
<iframe src="grandchild.sub.html"></iframe>
</body>
</html>

View file

@ -1,27 +1,33 @@
const SAME_ORIGIN = {origin: get_host_info().HTTPS_ORIGIN, name: "SAME_ORIGIN"}; const SAME_ORIGIN = {origin: get_host_info().HTTPS_ORIGIN, name: "SAME_ORIGIN"};
const CROSS_ORIGIN = {origin: get_host_info().HTTPS_NOTSAMESITE_ORIGIN, name: "CROSS_ORIGIN"} const CROSS_ORIGIN = {origin: get_host_info().HTTPS_NOTSAMESITE_ORIGIN, name: "CROSS_ORIGIN"}
function checkMeasureMemoryBreakdown(breakdown) { function checkMeasureMemoryBreakdown(breakdown, options) {
let allowed = new Set(options.allowed);
assert_own_property(breakdown, 'bytes'); assert_own_property(breakdown, 'bytes');
assert_greater_than_equal(breakdown.bytes, 0); assert_greater_than_equal(breakdown.bytes, 0);
assert_own_property(breakdown, 'globals');
assert_greater_than_equal(breakdown.globals, 0);
assert_own_property(breakdown, 'type'); assert_own_property(breakdown, 'type');
assert_equals(typeof breakdown.type, 'string'); assert_equals(typeof breakdown.type, 'string');
assert_own_property(breakdown, 'origins'); assert_own_property(breakdown, 'attribution');
assert_greater_than_equal(breakdown.origins.length, 1); for (let attribution of breakdown.attribution) {
for (let origin of breakdown.origins) { assert_equals(typeof attribution, 'string');
assert_equals(typeof origin, 'string'); assert_true(
allowed.has(attribution),
`${attribution} must be in ${JSON.stringify(options.allowed)}`);
} }
} }
function checkMeasureMemory(result) { function checkMeasureMemory(result, options) {
assert_own_property(result, 'bytes'); assert_own_property(result, 'bytes');
assert_own_property(result, 'breakdown'); assert_own_property(result, 'breakdown');
let bytes = 0; let bytes = 0;
for (let breakdown of result.breakdown) { for (let breakdown of result.breakdown) {
checkMeasureMemoryBreakdown(breakdown); checkMeasureMemoryBreakdown(breakdown, options);
bytes += breakdown.bytes; bytes += breakdown.bytes;
} }
assert_equals(bytes, result.bytes); assert_equals(bytes, result.bytes);
}
function getUrl(host, relativePath) {
const path = new URL(relativePath, window.location).pathname;
return `${host.origin}/${path}`;
} }

View file

@ -2,6 +2,6 @@
<meta charset=utf-8> <meta charset=utf-8>
<html> <html>
<body> <body>
Hello from iframe. Hello from grandchild iframe.
</body> </body>
</html> </html>

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,4 @@
{ {
"selection_pattern": "%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s",
"test_file_path_pattern": "gen/%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s.html",
"test_description_template": "Mixed-Content: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.", "test_description_template": "Mixed-Content: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.",
"test_page_title_template": "Mixed-Content: %(title)s", "test_page_title_template": "Mixed-Content: %(title)s",
"specification": [ "specification": [
@ -269,50 +267,6 @@
"origin": "*", "origin": "*",
"expectation": "*" "expectation": "*"
}, },
{
"name": "Redundant-subresources",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": "a-tag",
"origin": "*",
"expectation": "*"
},
{
"name": "Skip-origins-not-applicable-to-websockets",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": "websocket",
"origin": [
"same-https",
"same-http",
"cross-https",
"cross-http"
],
"expectation": "*"
},
{
"name": "Websockets are no-redirect only",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": [
"keep-scheme",
"swap-scheme"
],
"subresource": "websocket",
"origin": "*",
"expectation": "*"
},
{ {
"name": "Skip-redundant-for-opt-in-method", "name": "Skip-redundant-for-opt-in-method",
"expansion": "*", "expansion": "*",
@ -327,7 +281,59 @@
"subresource": "*", "subresource": "*",
"origin": "*", "origin": "*",
"expectation": "*" "expectation": "*"
} },
{
"name": "source_context_list values not yet tested",
"expansion": "*",
"source_scheme": "*",
"source_context_list": [
"req",
"srcdoc-inherit",
"srcdoc",
"iframe",
"iframe-blank-inherit",
"worker-classic",
"worker-module",
],
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": "*",
"origin": "*",
"expectation": "*"
},
{
"name": "subresource values not yet tested",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": [
"a-tag",
"area-tag",
"iframe-tag",
],
"origin": "*",
"expectation": "*"
},
{
"name": "redirections that mixed-content tests don't care",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": [
"keep-origin",
"swap-origin",
"downgrade"
],
"origin": "*",
"subresource": "*",
"expectation": "*"
},
], ],
"source_context_schema": { "source_context_schema": {
"supported_delivery_type": { "supported_delivery_type": {
@ -361,168 +367,42 @@
], ],
"sharedworker-classic-data": [], "sharedworker-classic-data": [],
"sharedworker-module-data": [] "sharedworker-module-data": []
},
"supported_subresource": {
"top": "*",
"iframe": "*",
"iframe-blank": "*",
"srcdoc": "*",
"worker-classic": [
"xhr",
"fetch",
"websocket"
],
"worker-module": [
"xhr",
"fetch",
"websocket"
],
"worker-classic-data": [
"xhr",
"fetch",
"websocket"
],
"worker-module-data": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-classic": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-module": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-classic-data": [
"xhr",
"fetch",
"websocket"
],
"sharedworker-module-data": [
"xhr",
"fetch",
"websocket"
]
} }
}, },
"subresource_schema": { "subresource_schema": {
"supported_delivery_type": { "supported_delivery_type": {
"script-tag": [],
"link-css-tag": [],
"xhr": [],
"worker-classic": [],
"worker-module": [],
"worker-import-data": [],
"sharedworker-classic": [],
"sharedworker-module": [],
"sharedworker-import-data": [],
"worklet-animation": [],
"worklet-audio": [],
"worklet-layout": [],
"worklet-paint": [],
"worklet-animation-import-data": [],
"worklet-audio-import-data": [],
"worklet-layout-import-data": [],
"worklet-paint-import-data": [],
"fetch": [],
"a-tag": [], "a-tag": [],
"area-tag": [],
"audio-tag": [],
"beacon": [],
"fetch": [],
"iframe-tag": [],
"img-tag": [],
"link-css-tag": [],
"link-prefetch-tag": [],
"object-tag": [], "object-tag": [],
"picture-tag": [], "picture-tag": [],
"script-tag": [],
"sharedworker-classic": [],
"sharedworker-import-data": [],
"sharedworker-module": [],
"video-tag": [],
"websocket": [], "websocket": [],
"link-prefetch-tag": [], "worker-classic": [],
"beacon": [], "worker-import-data": [],
"img-tag": [], "worker-module": [],
"audio-tag": [], "worklet-animation": [],
"video-tag": [] "worklet-animation-import-data": [],
} "worklet-audio": [],
}, "worklet-audio-import-data": [],
"source_context_list_schema": { "worklet-layout": [],
"top": { "worklet-layout-import-data": [],
"description": "Policy set by the top-level Document", "worklet-paint": [],
"sourceContextList": [ "worklet-paint-import-data": [],
{ "xhr": []
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-classic-data": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "worker-classic-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
},
"worker-module-data": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "worker-module-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
},
"sharedworker-classic-data": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "sharedworker-classic-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
},
"sharedworker-module-data": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "sharedworker-module-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
} }
}, },
"test_expansion_schema": { "test_expansion_schema": {
"expansion": [
"default",
"override"
],
"source_scheme": [
"http",
"https"
],
"delivery_type": [ "delivery_type": [
"http-rp", "http-rp",
"meta" "meta"
@ -531,57 +411,6 @@
null, null,
"opt-in" "opt-in"
], ],
"source_context_list": [
"top",
"worker-classic-data",
"worker-module-data",
"sharedworker-classic-data",
"sharedworker-module-data"
],
"redirection": [
"no-redirect",
"keep-scheme",
"swap-scheme"
],
"origin": [
"same-https",
"same-http",
"cross-https",
"cross-http",
"same-wss",
"same-ws",
"cross-wss",
"cross-ws"
],
"subresource": [
"script-tag",
"link-css-tag",
"xhr",
"worker-classic",
"worker-module",
"worker-import-data",
"sharedworker-classic",
"sharedworker-module",
"sharedworker-import-data",
"worklet-animation",
"worklet-audio",
"worklet-layout",
"worklet-paint",
"worklet-animation-import-data",
"worklet-audio-import-data",
"worklet-layout-import-data",
"worklet-paint-import-data",
"fetch",
"a-tag",
"object-tag",
"picture-tag",
"websocket",
"link-prefetch-tag",
"beacon",
"img-tag",
"audio-tag",
"video-tag"
],
"expectation": [ "expectation": [
"allowed", "allowed",
"blocked" "blocked"

View file

@ -0,0 +1,225 @@
<!doctype html>
<html>
<head>
<title>Set/Release capture when using chorded buttons</title>
<meta name="viewport" content="width=device-width">
<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1053385">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<style>
.container {
height: 500px;
width: 500px;
border: 1px solid black;
overflow: hidden;
position: relative;
}
#box {
height: 50px;
width: 50px;
background: red;
position: absolute;
}
</style>
</head>
<body>
<h1>Pointer Events Capture Test - capture should not be lost early</h1>
<h4>
Test Description: This test checks if setCapture/pointerup functions
works properly. Complete the following actions:
<ol>
<li> Put your mouse over the red box
<li> Press and hold left mouse button. Box will call setPointerCapture
<li> Press right button and release
<li> Pointer capture should not be lost
<li> Press right button again and release
<li> Pointer capture should not be lost
<li> Release left mouse button. lostpointercapture is called
</ol>
</h4>
Test passes if the proper behavior of the events is observed.
<div class="container">
<div id="box"></div>
</div>
<div id="log"></div>
</body>
<script>
var PhaseEnum = {
WaitingForDown: "down",
WaitingForUp: "up",
UpDone : "up_done"
};
var origin = {x:0, y:0};
var position = {x:0, y:0};
var deltaX = 0;
var deltaY = 0;
var box = document.getElementById("box");
var logDiv = document.getElementById("log");
var currentPhase = PhaseEnum.WaitingForDown;
var events = [];
function slide(event){
// move the target following the mouse
deltaX = event.clientX - origin.x
deltaY = event.clientY - origin.y
box.style.left = `${position.x + deltaX}px`;
box.style.top = `${position.y + deltaY}px`;
}
function addLog(message){
var messageDiv = document.createElement("div");
var textContent = document.createTextNode(message);
messageDiv.appendChild(textContent);
logDiv.appendChild(messageDiv);
}
function handle_pointerdown(e){
box.setPointerCapture(e.pointerId);
if(window.promise_test){
current_test.step(function(){
// once receiving a pointer down and the pointer is captured,
// no other mousedown should send pointerdown events during the test
assert_true(currentPhase === PhaseEnum.WaitingForDown,
"Current Phase should be " + PhaseEnum.WaitingForDown);
currentPhase = PhaseEnum.WaitingForUp;
events.push("target@pointerdown");
});
}
origin = { x: event.clientX, y: event.clientY };
box.addEventListener("pointermove", slide);
}
function handle_pointerup(e){
box.releasePointerCapture(e.pointerId);
if(window.promise_test){
current_test.step(function(){
assert_true(event.buttons === 0,
'pointerup should happen when all buttons are released.');
assert_true(currentPhase === PhaseEnum.WaitingForUp,
"Current Phase should be " + PhaseEnum.WaitingForUp);
currentPhase = PhaseEnum.UpDone;
events.push("target@pointerup");
});
}
box.removeEventListener("pointermove", slide);
}
function handle_contextmenu(e){
e.preventDefault();
}
function handle_lostpointercapture(e){
if(window.promise_test){
current_test.step(function(){
events.push("target@lostpointercapture");
assert_true(currentPhase === PhaseEnum.UpDone,
"Current Phase should be " + PhaseEnum.UpDone + "." +
'lostpointercapture should happen after pointerup event.');
assert_true(event.buttons === 0,
'lostpointercapture should happen when all buttons are released.');
assert_array_equals(events, ["target@pointerdown",
"target@pointerup", "target@lostpointercapture"]);
resolve_test();
current_test.done();
});
}
if(event.buttons === 0){
addLog("Test Passed!");
}else{
addLog("Test Failed!");
}
}
function removeEventListeners(){
box.removeEventListener('pointerdown', handle_pointerdown);
box.removeEventListener('pointerup', handle_pointerup);
box.removeEventListener('contextmenu', handle_contextmenu);
box.removeEventListener('lostpointercapture',
handle_lostpointercapture);
}
function addEventListeners(){
box.addEventListener('pointerdown', handle_pointerdown);
box.addEventListener('pointerup', handle_pointerup);
box.addEventListener('contextmenu', handle_contextmenu);
box.addEventListener('lostpointercapture',
handle_lostpointercapture);
}
var current_test = null;
var resolve_test = null;
var reject_test = null;
// window.promise_test is only defined when running the
// test using testharness.js
// if window.promise_test is not defined we'll run the manual testing
// path
if(!window.promise_test){
addEventListeners();
}
if(window.promise_test){
promise_test(function(t){
addEventListeners();
t.add_cleanup(function(){
removeEventListeners();
currentPhase = PhaseEnum.WaitingForDown;
events = [];
});
return new Promise(function(resolve, reject){
current_test = t;
resolve_test = resolve;
reject_test = reject;
var actions = new test_driver.Actions();
var actions_promise = actions
.pointerMove(0, 0, {origin: box})
.pointerDown({button: actions.ButtonType.LEFT})
// Ensure clicking other buttons while a first button has
// captured the pointer doesn't release the capture
.pointerDown({button: actions.ButtonType.RIGHT})
.pointerUp({button: actions.ButtonType.RIGHT})
.pointerDown({button: actions.ButtonType.RIGHT})
.pointerUp({button: actions.ButtonType.RIGHT})
.pointerUp({button: actions.ButtonType.LEFT})
.send();
})
}, "Pointer Events Capture Test - capture not lost due to " +
"chorded buttons interaction");
promise_test(function(t){
addEventListeners();
t.add_cleanup(function(){
removeEventListeners();
currentPhase = PhaseEnum.WaitingForDown;
events = [];
});
return new Promise(function(resolve, reject){
current_test = t;
resolve_test = resolve;
reject_test = reject;
var actions = new test_driver.Actions();
var actions_promise = actions
.pointerMove(0, 0, {origin: box})
.pointerDown({button: actions.ButtonType.LEFT})
// Ensure clicking other buttons while a first button has
// captured the pointer doesn't release the capture
.pointerDown({button: actions.ButtonType.RIGHT})
.pointerUp({button: actions.ButtonType.LEFT})
.pointerDown({button: actions.ButtonType.LEFT})
.pointerUp({button: actions.ButtonType.RIGHT})
.pointerUp({button: actions.ButtonType.LEFT})
.send();
})
}, "Pointer Events Capture Test - capture not lost " +
"due to combination of left and right chorded buttons interaction.");
}
</script>
</html>

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,4 @@
{ {
"selection_pattern": "%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s",
"test_file_path_pattern": "gen/%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s.html",
"test_description_template": "Referrer Policy: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.", "test_description_template": "Referrer Policy: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.",
"test_page_title_template": "Referrer-Policy: %(title)s", "test_page_title_template": "Referrer-Policy: %(title)s",
"specification": [ "specification": [
@ -529,26 +527,6 @@
], ],
"delivery_key": "referrerPolicy", "delivery_key": "referrerPolicy",
"excluded_tests": [ "excluded_tests": [
{
"name": "cross-origin-workers",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"redirection": "*",
"delivery_type": "*",
"delivery_value": "*",
"origin": [
"cross-http",
"cross-https"
],
"subresource": [
"worker-classic",
"worker-module",
"sharedworker-classic",
"sharedworker-module"
],
"expectation": "*"
},
{ {
"name": "upgraded-protocol-workers", "name": "upgraded-protocol-workers",
"expansion": "*", "expansion": "*",
@ -579,40 +557,17 @@
"redirection": "*", "redirection": "*",
"origin": [ "origin": [
"same-http", "same-http",
"cross-http" "same-http-downgrade",
"cross-http",
"cross-http-downgrade",
"same-ws",
"same-ws-downgrade",
"cross-ws",
"cross-ws-downgrade"
], ],
"subresource": "*", "subresource": "*",
"expectation": "*" "expectation": "*"
}, },
{
"name": "area-tag",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"origin": "*",
"subresource": "area-tag",
"expectation": "*"
},
{
"name": "worker-requests-with-swap-origin-redirect",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "swap-origin",
"origin": "*",
"subresource": [
"worker-classic",
"worker-module",
"sharedworker-classic",
"sharedworker-module"
],
"expectation": "*"
},
{ {
"name": "overhead-for-redirection", "name": "overhead-for-redirection",
"expansion": "*", "expansion": "*",
@ -663,7 +618,90 @@
"origin": "*", "origin": "*",
"subresource": "*", "subresource": "*",
"expectation": "*" "expectation": "*"
} },
{
"name": "redirections that referrer-policy tests don't care",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": [
"keep-scheme",
"swap-scheme",
"downgrade"
],
"origin": "*",
"subresource": "*",
"expectation": "*"
},
{
"name": "origins that referrer-policy tests don't care",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"origin": [
"same-http-downgrade",
"cross-http-downgrade",
"same-ws-downgrade",
"cross-ws-downgrade"
],
"subresource": "*",
"expectation": "*"
},
{
"name": "subresource values not yet tested",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": [
"area-tag",
"audio-tag",
"beacon",
"link-css-tag",
"link-prefetch-tag",
"object-tag",
"picture-tag",
"sharedworker-import-data",
"video-tag",
"websocket",
"worker-import-data",
"worklet-animation",
"worklet-animation-import-data",
"worklet-audio",
"worklet-audio-import-data",
"worklet-layout",
"worklet-layout-import-data",
"worklet-paint",
"worklet-paint-import-data"
],
"origin": "*",
"expectation": "*"
},
{
"name": "source_context_list values not yet tested",
"expansion": "*",
"source_scheme": "*",
"source_context_list": [
"iframe-blank-inherit",
"sharedworker-classic-data",
"sharedworker-module-data",
"worker-classic-data",
"worker-module-data"
],
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": "*",
"origin": "*",
"expectation": "*"
},
], ],
"source_context_schema": { "source_context_schema": {
"supported_delivery_type": { "supported_delivery_type": {
@ -688,46 +726,22 @@
"http-rp" "http-rp"
], ],
"worker-classic-data": [], "worker-classic-data": [],
"worker-module-data": [] "worker-module-data": [],
}, "sharedworker-classic": [
"supported_subresource": { "http-rp"
"top": "*",
"iframe": "*",
"iframe-blank": "*",
"srcdoc": "*",
"worker-classic": [
"xhr",
"fetch",
"worker-classic",
"worker-module"
], ],
"worker-module": [ "sharedworker-module": [
"xhr", "http-rp"
"fetch",
"worker-classic",
"worker-module"
], ],
"worker-classic-data": [ "sharedworker-classic-data": [],
"xhr", "sharedworker-module-data": []
"fetch"
],
"worker-module-data": [
"xhr",
"fetch"
]
} }
}, },
"subresource_schema": { "subresource_schema": {
"supported_delivery_type": { "supported_delivery_type": {
"iframe-tag": [ // List of elements that support "attr" delivery type can be followed
"attr" // from the cross reference of:
], // https://html.spec.whatwg.org/C/#referrer-policy-attribute
"img-tag": [
"attr"
],
"script-tag": [
"attr"
],
"a-tag": [ "a-tag": [
"attr", "attr",
"rel-noref" "rel-noref"
@ -735,166 +749,54 @@
"area-tag": [ "area-tag": [
"attr" "attr"
], ],
"xhr": [], "audio-tag": [],
"beacon": [],
// Fetch API supports `init["referrerPolicy"]` in `Request`:
// https://fetch.spec.whatwg.org/#dom-request.
// TODO(https://github.com/web-platform-tests/wpt/issues/21815):
// Add support for this. Currently `common.sub.js` doesn't support this.
"fetch": [], "fetch": [],
"sharedworker-module": [], "iframe-tag": [
"worker-module": [], "attr"
],
"img-tag": [
"attr"
],
// TODO(https://github.com/web-platform-tests/wpt/issues/21815):
// Support "attr" in the following `<link>`-related subresources.
// The current referrrer-policy test helper doesn't support
// checking referrer results via <link> elements.
"link-css-tag": [],
"link-prefetch-tag": [],
"object-tag": [],
// `<img>` supports referrerpolicy attribute,
// so `<img>` inside `<picture>` also supports the attribute.
// TODO(https://github.com/web-platform-tests/wpt/issues/21815):
// Support this.
"picture-tag": [],
"script-tag": [
"attr"
],
"sharedworker-classic": [], "sharedworker-classic": [],
"worker-classic": [] "sharedworker-import-data": [],
} "sharedworker-module": [],
}, "video-tag": [],
"source_context_list_schema": { "websocket": [],
"top": { "worker-classic": [],
"description": "Policy set by the top-level Document", "worker-import-data": [],
"sourceContextList": [ "worker-module": [],
{ "worklet-animation": [],
"sourceContextType": "top", "worklet-animation-import-data": [],
"policyDeliveries": [ "worklet-audio": [],
"policy" "worklet-audio-import-data": [],
] "worklet-layout": [],
} "worklet-layout-import-data": [],
], "worklet-paint": [],
"subresourcePolicyDeliveries": [] "worklet-paint-import-data": [],
}, "xhr": []
"req": {
"description": "Subresource request's policy should override Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
}
],
"subresourcePolicyDeliveries": [
"nonNullPolicy"
]
},
"srcdoc-inherit": {
"description": "srcdoc iframe should inherit parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "srcdoc"
}
],
"subresourcePolicyDeliveries": []
},
"srcdoc": {
"description": "srcdoc iframe's policy should override parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "srcdoc",
"policyDeliveries": [
"nonNullPolicy"
]
}
],
"subresourcePolicyDeliveries": []
},
"iframe": {
"description": "external iframe's policy should override parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "iframe",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-classic": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "worker-classic",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-classic-data": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "worker-classic-data",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-module": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "worker-module",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
},
"worker-module-data": {
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"anotherPolicy"
]
},
{
"sourceContextType": "worker-module-data",
"policyDeliveries": [
"policy"
]
}
],
"subresourcePolicyDeliveries": []
} }
}, },
"test_expansion_schema": { "test_expansion_schema": {
"expansion": [
"default",
"override"
],
"delivery_type": [ "delivery_type": [
"attr", "attr",
"rel-noref", "rel-noref",
@ -912,45 +814,6 @@
"strict-origin-when-cross-origin", "strict-origin-when-cross-origin",
"unsafe-url" "unsafe-url"
], ],
"origin": [
"same-http",
"same-https",
"cross-http",
"cross-https"
],
"source_context_list": [
"top",
"req",
"srcdoc-inherit",
"srcdoc",
"iframe",
"worker-classic",
"worker-classic-data",
"worker-module",
"worker-module-data"
],
"source_scheme": [
"http",
"https"
],
"redirection": [
"no-redirect",
"keep-origin",
"swap-origin"
],
"subresource": [
"iframe-tag",
"img-tag",
"script-tag",
"a-tag",
"area-tag",
"xhr",
"worker-classic",
"worker-module",
"sharedworker-classic",
"sharedworker-module",
"fetch"
],
"expectation": [ "expectation": [
"omitted", "omitted",
"origin", "origin",

View file

@ -1,7 +1,6 @@
// META: global=window,worker // META: global=window,worker
// META: script=/resources/WebIDLParser.js // META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js // META: script=/resources/idlharness.js
// META: script=/shape-detection/resources/shapedetection-helpers.js
// See: https://wicg.github.io/shape-detection-api/ // See: https://wicg.github.io/shape-detection-api/
@ -12,53 +11,8 @@ idl_test(
['dom', 'geometry'], ['dom', 'geometry'],
async idl_array => { async idl_array => {
idl_array.add_objects({ idl_array.add_objects({
FaceDetector: ['faceDetector'], FaceDetector: ['new FaceDetector()'],
DetectedFace: ['detectedFace'], BarcodeDetector: ['new BarcodeDetector()'],
BarcodeDetector: ['barcodeDetector'],
DetectedBarcode: ['detectedBarcode']
}); });
let faceDetectionTest;
try {
faceDetectionTest =
await initialize_detection_tests("FaceDetectionTest");
const img = createTestImage();
const theImageBitmap = await createImageBitmap(img);
self.faceDetector = new FaceDetector();
const faceDetectionResult = await faceDetector.detect(theImageBitmap);
self.detectedFace = faceDetectionResult[0];
} catch (e) {
// Surfaced in idlharness.js's test_object.
} finally {
faceDetectionTest && faceDetectionTest.reset();
}
let barcodeDetectionTest;
try {
barcodeDetectionTest =
await initialize_detection_tests("BarcodeDetectionTest");
const img = createTestImage();
const theImageBitmap = await createImageBitmap(img);
self.barcodeDetector = new BarcodeDetector();
const barcodeDetectionResult =
await barcodeDetector.detect(theImageBitmap);
self.detectedBarcode = barcodeDetectionResult[0];
} catch (e) {
// Surface in idlharness.js's test_object.
} finally {
barcodeDetectionTest && barcodeDetectionTest.reset();
}
} }
); );
function createTestImage() {
const image = new OffscreenCanvas(100, 50);
const imgctx = image.getContext('2d');
imgctx.fillStyle = "#F00";
imgctx.fillRect(0, 0, 2, 2);
imgctx.fillStyle = "#0F0";
imgctx.fillRect(0, 0, 1, 1);
return image;
}

View file

@ -6,7 +6,6 @@ import jsone
import mock import mock
import pytest import pytest
import requests import requests
import sys
import yaml import yaml
from jsonschema import validate from jsonschema import validate
@ -20,9 +19,6 @@ def data_path(filename):
return os.path.join(here, "..", "testdata", filename) return os.path.join(here, "..", "testdata", filename)
@pytest.mark.xfail(sys.version_info.major == 2,
reason="taskcluster library has an encoding bug "
"https://github.com/taskcluster/json-e/issues/338")
def test_verify_taskcluster_yml(): def test_verify_taskcluster_yml():
"""Verify that the json-e in the .taskcluster.yml is valid""" """Verify that the json-e in the .taskcluster.yml is valid"""
with open(os.path.join(root, ".taskcluster.yml"), encoding="utf8") as f: with open(os.path.join(root, ".taskcluster.yml"), encoding="utf8") as f:

View file

@ -1,6 +1,6 @@
html5lib==1.0.1 html5lib==1.0.1
mozinfo==1.1.0 mozinfo==1.1.0
mozlog==5.0 mozlog==6.0
mozdebug==0.2 mozdebug==0.2
# Pillow 7 requires Python 3 # Pillow 7 requires Python 3
pillow==6.2.2 # pyup: <7.0 pillow==6.2.2 # pyup: <7.0

View file

@ -1,5 +1,5 @@
marionette_driver==3.0.0 marionette_driver==3.0.0
mozcrash==1.2.0 mozcrash==2.0.0
mozdownload==1.26.0 mozdownload==1.26.0
mozinstall==2.0.0 mozinstall==2.0.0
mozleak==0.2 mozleak==0.2

View file

@ -1,24 +0,0 @@
<!DOCTYPE html>
<script src="/resources/testharness.js" ></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/helper.sub.js"></script>
<meta http-equiv="Content-Security-Policy" content="trusted-types *">
<body>
<script>
test(t => {
let policy = trustedTypes.createPolicy('thisisaname', {});
assert_true(policy instanceof TrustedTypePolicy);
assert_equals(policy.name, 'thisisaname');
}, "policy.name = name");
// Retrieve policy names tests
test(t => {
let policy = trustedTypes.createPolicy('anothername', {});
let names = trustedTypes.getPolicyNames();
assert_equals(names.length, 2);
assert_true(names.includes('thisisaname'));
assert_true(names.includes('anothername'));
}, "getPolicyNames returns all policy names");
</script>

View file

@ -20,14 +20,6 @@
}); });
}, "duplicate policy name attempt throws"); }, "duplicate policy name attempt throws");
// Retrieve policy names tests
test(t => {
let policy = trustedTypes.createPolicy('SomeOtherName', {} );
let names = trustedTypes.getPolicyNames();
assert_true(names.includes('SomeName'));
assert_true(names.includes('SomeOtherName'));
}, "Retrieving policy names");
// Check error messages. // Check error messages.
test(t => { test(t => {
try { try {

View file

@ -6,7 +6,7 @@
<script nonce="abc" src="support/helper.sub.js"></script> <script nonce="abc" src="support/helper.sub.js"></script>
<!-- Note: Trusted Types enforcement, and a CSP that does not blanket-allow eval. --> <!-- Note: Trusted Types enforcement, and a CSP that does not blanket-allow eval. -->
<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'; trusted-types *"> <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'; require-trusted-types-for 'script'">
</head> </head>
<body> <body>
<script nonce="abc"> <script nonce="abc">

View file

@ -4,7 +4,7 @@
<script nonce="abc" src="/resources/testharness.js"></script> <script nonce="abc" src="/resources/testharness.js"></script>
<script nonce="abc" src="/resources/testharnessreport.js"></script> <script nonce="abc" src="/resources/testharnessreport.js"></script>
<script nonce="abc" src="support/helper.sub.js"></script> <script nonce="abc" src="support/helper.sub.js"></script>
<meta http-equiv="Content-Security-Policy" content="trusted-types *"> <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
</head> </head>
<body> <body>
<script> <script>
@ -16,7 +16,7 @@
}, "eval of TrustedScript works."); }, "eval of TrustedScript works.");
test(t => { test(t => {
assert_equals(eval('1+1'), 2); assert_equals(eval('1+1'), 15); // '1+1' + 4 becomes '1+14'.
}, "eval of string works."); }, "eval of string works.");
test(t => { test(t => {

View file

@ -10,9 +10,9 @@
// (rather than as "<meta http-equiv" tags). This test assumes the following // (rather than as "<meta http-equiv" tags). This test assumes the following
// headers are set in the .headers file: // headers are set in the .headers file:
// //
// Content-Security-Policy: trusted-types *
// Content-Security-Policy: script-src 'unsafe-inline'; report-uri ... // Content-Security-Policy: script-src 'unsafe-inline'; report-uri ...
// Content-Security-Policy: plugin-types bla/blubb // Content-Security-Policy: plugin-types bla/blubb
// Content-Security-Policy: require-trusted-types-for 'script'
// //
// The last rule is there so we can provoke a CSP violation report at will. // The last rule is there so we can provoke a CSP violation report at will.
// The intent is that in order to test that a violation has *not* been thrown // The intent is that in order to test that a violation has *not* been thrown

View file

@ -1,4 +1,3 @@
Content-Security-Policy: trusted-types *
Content-Security-Policy: script-src http: https: 'nonce-123' 'report-sample' Content-Security-Policy: script-src http: https: 'nonce-123' 'report-sample'
Content-Security-Policy: plugin-types bla/blubb Content-Security-Policy: plugin-types bla/blubb
Content-Security-Policy: require-trusted-types-for 'script' Content-Security-Policy: require-trusted-types-for 'script'

View file

@ -9,9 +9,9 @@
// (rather than as "<meta http-equiv" tags). This test assumes the following // (rather than as "<meta http-equiv" tags). This test assumes the following
// headers are set in the .headers file: // headers are set in the .headers file:
// //
// Content-Security-Policy: trusted-types *
// Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval'; report-uri ... // Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval'; report-uri ...
// Content-Security-Policy: plugin-types bla/blubb // Content-Security-Policy: plugin-types bla/blubb
// Content-Security-Policy: require-trusted-types-for 'script'
// //
// The last rule is there so we can provoke a CSP violation report at will. // The last rule is there so we can provoke a CSP violation report at will.
// The intent is that in order to test that a violation has *not* been thrown // The intent is that in order to test that a violation has *not* been thrown

View file

@ -1,4 +1,3 @@
Content-Security-Policy: trusted-types *
Content-Security-Policy: script-src http: https: 'nonce-123' 'unsafe-eval' Content-Security-Policy: script-src http: https: 'nonce-123' 'unsafe-eval'
Content-Security-Policy: plugin-types bla/blubb Content-Security-Policy: plugin-types bla/blubb
Content-Security-Policy: require-trusted-types-for 'script' Content-Security-Policy: require-trusted-types-for 'script'

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,4 @@
{ {
"selection_pattern": "%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s",
"test_file_path_pattern": "gen/%(source_context_list)s.%(delivery_type)s/%(delivery_value)s/%(subresource)s/%(origin)s.%(redirection)s.%(source_scheme)s.html",
"test_description_template": "Upgrade-Insecure-Requests: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.", "test_description_template": "Upgrade-Insecure-Requests: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.",
"test_page_title_template": "Upgrade-Insecure-Requests: %(title)s", "test_page_title_template": "Upgrade-Insecure-Requests: %(title)s",
"specification": [ "specification": [
@ -98,7 +96,28 @@
"expectation": "*" "expectation": "*"
}, },
{ {
"name": "Workers are same-origin only", "name": "source_context_list values not yet tested",
"expansion": "*",
"source_scheme": "*",
"source_context_list": [
"req",
"srcdoc",
"iframe",
"worker-classic",
"worker-module",
"worker-module-data",
"sharedworker-classic-data",
"sharedworker-module-data"
],
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": "*",
"origin": "*",
"expectation": "*"
},
{
"name": "subresource values not yet tested",
"expansion": "*", "expansion": "*",
"source_scheme": "*", "source_scheme": "*",
"source_context_list": "*", "source_context_list": "*",
@ -106,86 +125,54 @@
"delivery_value": "*", "delivery_value": "*",
"redirection": "*", "redirection": "*",
"subresource": [ "subresource": [
"worker-classic", "a-tag",
"worker-module", "area-tag",
"sharedworker-classic", "audio-tag",
"sharedworker-module" "beacon",
], "link-css-tag",
"origin": [ "link-prefetch-tag",
"cross-https", "object-tag",
"cross-http-downgrade", "picture-tag",
"cross-wss", "script-tag",
"cross-ws-downgrade" "video-tag"
], ],
"origin": "*",
"expectation": "*" "expectation": "*"
}, },
{ {
"name": "Websockets are ws/wss-only", "name": "origins that upgrade-insecure-requests tests don't care",
"expansion": "*", "expansion": "*",
"source_scheme": "*", "source_scheme": "*",
"source_context_list": "*", "source_context_list": "*",
"delivery_type": "*", "delivery_type": "*",
"delivery_value": "*", "delivery_value": "*",
"redirection": "*", "redirection": "*",
"subresource": "websocket",
"origin": [ "origin": [
"same-https", "same-http",
"same-http-downgrade", "cross-http",
"cross-https", "same-ws",
"cross-http-downgrade" "cross-ws"
], ],
"subresource": "*",
"expectation": "*" "expectation": "*"
}, },
{ {
"name": "Websockets is no-redirect only", "name": "redirections that upgrade-insecure-requests tests don't care",
"expansion": "*", "expansion": "*",
"source_scheme": "*", "source_scheme": "*",
"source_context_list": "*", "source_context_list": "*",
"delivery_type": "*", "delivery_type": "*",
"delivery_value": "*", "delivery_value": "*",
"redirection": [ "redirection": [
"downgrade" "keep-origin",
"swap-origin",
"keep-scheme",
"swap-scheme"
], ],
"subresource": "websocket",
"origin": "*", "origin": "*",
"subresource": "*",
"expectation": "*" "expectation": "*"
}, },
{
"name": "ws/wss are websocket-only",
"expansion": "*",
"source_scheme": "*",
"source_context_list": "*",
"delivery_type": "*",
"delivery_value": "*",
"redirection": "*",
"subresource": [
"iframe-tag",
"img-tag",
"xhr",
"fetch",
"worker-classic",
"worker-module",
"worker-import-data",
"sharedworker-classic",
"sharedworker-module",
"sharedworker-import-data",
"worklet-animation",
"worklet-audio",
"worklet-layout",
"worklet-paint",
"worklet-animation-import-data",
"worklet-audio-import-data",
"worklet-layout-import-data",
"worklet-paint-import-data"
],
"origin": [
"same-wss",
"same-ws-downgrade",
"cross-wss",
"cross-ws-downgrade"
],
"expectation": "*"
}
], ],
"source_context_schema": { "source_context_schema": {
"supported_delivery_type": { "supported_delivery_type": {
@ -210,126 +197,51 @@
"http-rp" "http-rp"
], ],
"worker-classic-data": [], "worker-classic-data": [],
"worker-module-data": [] "worker-module-data": [],
}, "sharedworker-classic": [
"supported_subresource": { "http-rp"
"top": "*",
"iframe": "*",
"iframe-blank": "*",
"srcdoc": "*",
"worker-classic": [
"xhr",
"fetch",
"websocket"
], ],
"worker-module": [ "sharedworker-module": [
"xhr", "http-rp"
"fetch",
"websocket"
], ],
"worker-classic-data": [ "sharedworker-classic-data": [],
"xhr", "sharedworker-module-data": []
"fetch",
"websocket"
],
"worker-module-data": [
"xhr",
"fetch",
"websocket"
]
} }
}, },
"subresource_schema": { "subresource_schema": {
"supported_delivery_type": { "supported_delivery_type": {
"xhr": [], "a-tag": [],
"worker-classic": [], "area-tag": [],
"worker-module": [], "audio-tag": [],
"worker-import-data": [], "beacon": [],
"sharedworker-classic": [],
"sharedworker-module": [],
"sharedworker-import-data": [],
"worklet-animation": [],
"worklet-audio": [],
"worklet-layout": [],
"worklet-paint": [],
"worklet-animation-import-data": [],
"worklet-audio-import-data": [],
"worklet-layout-import-data": [],
"worklet-paint-import-data": [],
"fetch": [], "fetch": [],
"websocket": [], "iframe-tag": [],
"img-tag": [], "img-tag": [],
"iframe-tag": [] "link-css-tag": [],
} "link-prefetch-tag": [],
}, "object-tag": [],
"source_context_list_schema": { "picture-tag": [],
"top": { "script-tag": [],
"description": "CSP set by the top-level Document", "sharedworker-classic": [],
"sourceContextList": [ "sharedworker-import-data": [],
{ "sharedworker-module": [],
"sourceContextType": "top", "video-tag": [],
"policyDeliveries": [ "websocket": [],
"policy" "worker-classic": [],
] "worker-import-data": [],
} "worker-module": [],
], "worklet-animation": [],
"subresourcePolicyDeliveries": [] "worklet-animation-import-data": [],
}, "worklet-audio": [],
"srcdoc-inherit": { "worklet-audio-import-data": [],
"description": "srcdoc iframe should inherit parent Document's policy", "worklet-layout": [],
"sourceContextList": [ "worklet-layout-import-data": [],
{ "worklet-paint": [],
"sourceContextType": "top", "worklet-paint-import-data": [],
"policyDeliveries": [ "xhr": []
"policy"
]
},
{
"sourceContextType": "srcdoc"
}
],
"subresourcePolicyDeliveries": []
},
"iframe-blank-inherit": {
"description": "blank iframe should inherit parent Document's policy",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "iframe-blank"
}
],
"subresourcePolicyDeliveries": []
},
"worker-classic-data": {
"description": "CSP set by the top-level Document is inherited to dedicated workers",
"sourceContextList": [
{
"sourceContextType": "top",
"policyDeliveries": [
"policy"
]
},
{
"sourceContextType": "worker-classic-data",
"policyDeliveries": []
}
],
"subresourcePolicyDeliveries": []
} }
}, },
"test_expansion_schema": { "test_expansion_schema": {
"expansion": [
"default",
"override"
],
"source_scheme": [
"https"
],
"delivery_type": [ "delivery_type": [
"http-rp", "http-rp",
"meta" "meta"
@ -338,47 +250,6 @@
null, null,
"upgrade" "upgrade"
], ],
"source_context_list": [
"top",
"srcdoc-inherit",
"iframe-blank-inherit",
"worker-classic-data"
],
"redirection": [
"no-redirect",
"downgrade"
],
"origin": [
"same-https",
"same-http-downgrade",
"cross-https",
"cross-http-downgrade",
"same-wss",
"same-ws-downgrade",
"cross-wss",
"cross-ws-downgrade"
],
"subresource": [
"iframe-tag",
"img-tag",
"xhr",
"fetch",
"websocket",
"worker-classic",
"worker-module",
"worker-import-data",
"sharedworker-classic",
"sharedworker-module",
"sharedworker-import-data",
"worklet-animation",
"worklet-audio",
"worklet-layout",
"worklet-paint",
"worklet-animation-import-data",
"worklet-audio-import-data",
"worklet-layout-import-data",
"worklet-paint-import-data"
],
"expectation": [ "expectation": [
"allowed", "allowed",
"blocked" "blocked"

View file

@ -247,7 +247,6 @@ promise_test(async t => {
test(t => { test(t => {
const div = createDiv(t); const div = createDiv(t);
div.classList.add('pseudo'); div.classList.add('pseudo');
getComputedStyle(div,"::before").content; // Sync style
const anim = div.animate(null, {pseudoElement: '::before'}); const anim = div.animate(null, {pseudoElement: '::before'});
assert_class_string(anim, 'Animation', 'The returned object is an Animation'); assert_class_string(anim, 'Animation', 'The returned object is an Animation');
}, 'animate() with pseudoElement parameter creates an Animation object'); }, 'animate() with pseudoElement parameter creates an Animation object');
@ -262,7 +261,6 @@ test(t => {
const div = createDiv(t); const div = createDiv(t);
div.classList.add('pseudo'); div.classList.add('pseudo');
div.style.display = 'list-item'; div.style.display = 'list-item';
getComputedStyle(div,"::marker").content; // Sync style
const anim = div.animate(null, {pseudoElement: '::marker'}); const anim = div.animate(null, {pseudoElement: '::marker'});
assert_class_string(anim, 'Animation', 'The returned object is an Animation for ::marker'); assert_class_string(anim, 'Animation', 'The returned object is an Animation for ::marker');
}, 'animate() with pseudoElement parameter creates an Animation object for ::marker'); }, 'animate() with pseudoElement parameter creates an Animation object for ::marker');
@ -278,7 +276,6 @@ test(t => {
test(t => { test(t => {
const div = createDiv(t); const div = createDiv(t);
div.classList.add('pseudo'); div.classList.add('pseudo');
getComputedStyle(div,"::before").content; // Sync style
const anim = div.animate(null, {pseudoElement: '::before'}); const anim = div.animate(null, {pseudoElement: '::before'});
assert_equals(anim.effect.target, div, 'The returned element has the correct target element'); assert_equals(anim.effect.target, div, 'The returned element has the correct target element');
assert_equals(anim.effect.pseudoElement, '::before', assert_equals(anim.effect.pseudoElement, '::before',
@ -299,7 +296,6 @@ test(t => {
const div = createDiv(t); const div = createDiv(t);
div.classList.add('pseudo'); div.classList.add('pseudo');
div.style.display = 'list-item'; div.style.display = 'list-item';
getComputedStyle(div,"::marker").content; // Sync style
const anim = div.animate(null, {pseudoElement: '::marker'}); const anim = div.animate(null, {pseudoElement: '::marker'});
assert_equals(anim.effect.target, div, 'The returned element has the correct target element'); assert_equals(anim.effect.target, div, 'The returned element has the correct target element');
assert_equals(anim.effect.pseudoElement, '::marker', assert_equals(anim.effect.pseudoElement, '::marker',

View file

@ -343,6 +343,42 @@ test(() => {
}, 'Reading from a custom iterator that returns a non-object keyframe' }, 'Reading from a custom iterator that returns a non-object keyframe'
+ ' should throw'); + ' should throw');
test(() => {
assert_throws_js(TypeError, () => {
new KeyframeEffect(null, createIterable([
{ done: false, value: { left: '100px', easing: '' } },
{ done: false, value: 1234 },
{ done: false, value: { left: '200px' } },
{ done: true },
]));
});
}, 'Reading from a custom iterator that returns a non-object keyframe'
+ ' and an invalid easing should throw');
test(() => {
assert_throws_js(TypeError, () => {
new KeyframeEffect(null, createIterable([
{ done: false, value: { left: '100px' } },
{ done: false, value: { left: '150px', offset: 'o' } },
{ done: false, value: { left: '200px' } },
{ done: true },
]));
});
}, 'Reading from a custom iterator that returns a keyframe with a non finite'
+ ' floating-point offset value should throw');
test(() => {
assert_throws_js(TypeError, () => {
new KeyframeEffect(null, createIterable([
{ done: false, value: { left: '100px', easing: '' } },
{ done: false, value: { left: '150px', offset: 'o' } },
{ done: false, value: { left: '200px' } },
{ done: true },
]));
});
}, 'Reading from a custom iterator that returns a keyframe with a non finite'
+ ' floating-point offset value and an invalid easing should throw');
test(() => { test(() => {
const effect = new KeyframeEffect(null, createIterable([ const effect = new KeyframeEffect(null, createIterable([
{ done: false, value: { left: '100px' } }, { done: false, value: { left: '100px' } },

View file

@ -53,6 +53,29 @@ test(() => {
}, 'Invalid easing values are correctly rejected when using a keyframe' }, 'Invalid easing values are correctly rejected when using a keyframe'
+ ' sequence'); + ' sequence');
test(() => {
let readToEnd = false;
const keyframe_obj = {
*[Symbol.iterator]() {
yield { left: '100px', easing: '' };
yield { left: '200px' };
readToEnd = true;
},
};
assert_throws_js(
TypeError,
() => {
new KeyframeEffect(null, keyframe_obj);
},
'TypeError is thrown for an invalid easing'
);
assert_true(
readToEnd,
'Read all the keyframe properties before reporting invalid easing'
);
}, 'Invalid easing values are correctly rejected after doing all the'
+ ' iterating');
test(() => { test(() => {
let propAccessCount = 0; let propAccessCount = 0;
const keyframe = {}; const keyframe = {};

View file

@ -122,7 +122,6 @@ for (const hasContent of [true, false]){
d.classList.add('pseudoa'); d.classList.add('pseudoa');
if (hasContent) { if (hasContent) {
d.classList.add('before'); d.classList.add('before');
getComputedStyle(d,"::before").content; // Sync style
} }
const effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC); const effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC);
@ -147,7 +146,6 @@ for (const hasContent of [true, false]){
d.classList.add('pseudoa'); d.classList.add('pseudoa');
if (hasContent) { if (hasContent) {
d.classList.add('before'); d.classList.add('before');
getComputedStyle(d,"::before").content; // Sync style
} }
const effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC); const effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC);
@ -172,7 +170,6 @@ for (const hasContent of [true, false]){
d.classList.add('pseudoa'); d.classList.add('pseudoa');
if (hasContent) { if (hasContent) {
d.classList.add('before'); d.classList.add('before');
getComputedStyle(d,"::before").content; // Sync style
} }
const anim = d.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'}); const anim = d.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'});
@ -198,11 +195,9 @@ for (const hasContent of [true, false]){
b.classList.add('pseudob'); b.classList.add('pseudob');
if (prevHasContent) { if (prevHasContent) {
a.classList.add('before'); a.classList.add('before');
getComputedStyle(a,"::before").content; // Sync style
} }
if (hasContent) { if (hasContent) {
b.classList.add('before'); b.classList.add('before');
getComputedStyle(b,"::before").content; // Sync style
} }
const anim = a.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'}); const anim = a.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'});
@ -228,11 +223,9 @@ for (const hasContent of [true, false]){
d.classList.add('pseudoc'); d.classList.add('pseudoc');
if (prevHasContent) { if (prevHasContent) {
d.classList.add('before'); d.classList.add('before');
getComputedStyle(d,"::before").content; // Sync style
} }
if (hasContent) { if (hasContent) {
d.classList.add('after'); d.classList.add('after');
getComputedStyle(d,"::after").content; // Sync style
} }
const anim = d.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'}); const anim = d.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'});

View file

@ -27,6 +27,12 @@ standardSetup(function() {
new CreateCredentialsTest("options.publicKey.rp.id", "-invaliddomain.com").runTest("Bad rp: id is invalid domain (starts with dash)", "SecurityError"); new CreateCredentialsTest("options.publicKey.rp.id", "-invaliddomain.com").runTest("Bad rp: id is invalid domain (starts with dash)", "SecurityError");
new CreateCredentialsTest("options.publicKey.rp.id", "0invaliddomain.com").runTest("Bad rp: id is invalid domain (starts with number)", "SecurityError"); new CreateCredentialsTest("options.publicKey.rp.id", "0invaliddomain.com").runTest("Bad rp: id is invalid domain (starts with number)", "SecurityError");
let hostAndPort = window.location.host;
if (!hostAndPort.match(/:\d+$/)) {
hostAndPort += ":443";
}
new CreateCredentialsTest("options.publicKey.rp.id", hostAndPort).runTest("Bad rp id: id is host + port", "SecurityError");
// // rp.name // // rp.name
new CreateCredentialsTest({path: "options.publicKey.rp.name", value: undefined}).runTest("rp missing name", TypeError); new CreateCredentialsTest({path: "options.publicKey.rp.name", value: undefined}).runTest("rp missing name", TypeError);

View file

@ -20,7 +20,6 @@ standardSetup(function() {
new CreateCredentialsTest().runTest("passing credentials.create() with default arguments"); new CreateCredentialsTest().runTest("passing credentials.create() with default arguments");
// rp // rp
new CreateCredentialsTest({path: "options.publicKey.rp.id", value: window.location.host}).runTest("passing credentials.create() with rpId (host and port)");
new CreateCredentialsTest({path: "options.publicKey.rp.id", value: window.location.hostname}).runTest("passing credentials.create() with rpId (hostname)"); new CreateCredentialsTest({path: "options.publicKey.rp.id", value: window.location.hostname}).runTest("passing credentials.create() with rpId (hostname)");
new CreateCredentialsTest({path: "options.publicKey.rp.icon", value: undefined}).runTest("passing credentials.create() without rp.icon"); new CreateCredentialsTest({path: "options.publicKey.rp.icon", value: undefined}).runTest("passing credentials.create() without rp.icon");

View file

@ -31,6 +31,14 @@ standardSetup(function() {
new GetCredentialsTest("options.publicKey.rpId", "0invaliddomain.com") new GetCredentialsTest("options.publicKey.rpId", "0invaliddomain.com")
.addCredential(credPromise) .addCredential(credPromise)
.runTest("Bad rpId: invalid domain (starts with number)", "SecurityError"); .runTest("Bad rpId: invalid domain (starts with number)", "SecurityError");
let hostAndPort = window.location.host;
if (!hostAndPort.match(/:\d+$/)) {
hostAndPort += ":443";
}
new GetCredentialsTest({path: "options.publicKey.rpId", value: hostAndPort})
.addCredential(credPromise)
.runTest("Bad rpId: host + port", "SecurityError");
}); });
/* JSHINT */ /* JSHINT */

View file

@ -30,9 +30,6 @@ standardSetup(function() {
new GetCredentialsTest({path: "options.publicKey.rpId", value: undefined}) new GetCredentialsTest({path: "options.publicKey.rpId", value: undefined})
.addCredential(credPromise) .addCredential(credPromise)
.runTest("rpId undefined"); .runTest("rpId undefined");
new GetCredentialsTest({path: "options.publicKey.rpId", value: window.location.host})
.addCredential(credPromise)
.runTest("passing credentials.get() with rpId (host and port)");
new GetCredentialsTest({path: "options.publicKey.rpId", value: window.location.hostname}) new GetCredentialsTest({path: "options.publicKey.rpId", value: window.location.hostname})
.addCredential(credPromise) .addCredential(credPromise)
.runTest("passing credentials.get() with rpId (hostname)"); .runTest("passing credentials.get() with rpId (hostname)");