diff options
Diffstat (limited to 'tests/wpt')
258 files changed, 9527 insertions, 3190 deletions
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 893b07e9e3f..277c0f4217d 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -605,6 +605,13 @@ {} ] ], + "root-element-background-image-opaque-crash.html": [ + "d380310d0968c3ad63eb6adc52acd929b3b43b14", + [ + null, + {} + ] + ], "root-element-filter-background-clip-text-crash.html": [ "e12e4bb80f40e09e189f7f239486be246ea67ade", [ @@ -799,6 +806,13 @@ {} ] ], + "chrome-bug-415627003.html": [ + "af942fbcc9701955f3778dc2e57521d10bb1ce41", + [ + null, + {} + ] + ], "pseudo-element-animation-with-marker.html": [ "ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5", [ @@ -4794,6 +4808,13 @@ {} ] ], + "table-col-and-dead-row-group-crash.html": [ + "e6e90a63a345fe2bb9499b729d2cf2df6ed65d9d", + [ + null, + {} + ] + ], "table-collapsed-borders-crash.html": [ "aa699317e2734fece3d662ad102fdd2772680e25", [ @@ -5866,7 +5887,32 @@ null, {} ] - ] + ], + "root-preserve3d-crash.html": [ + "1123280187506b326adc9378465bfc560af4415e", + [ + null, + {} + ] + ], + "root-replace-crash.html": [ + "165eec41b6bc56db131cc7fc19f23701bc291b8c", + [ + null, + {} + ] + ], + "scoped": { + "crashtests": { + "shadow-dom.html": [ + "a2faafc1694e15f5c513655e57e320325bd4f45a", + [ + null, + {} + ] + ] + } + } }, "css-viewport": { "zoom": { @@ -6114,6 +6160,13 @@ {} ] ], + "backdrop-filter-transform-popover-crash.html": [ + "582f0c119656020aaa5167b0547cfbde20d11b95", + [ + null, + {} + ] + ], "crashtests": { "broken-reference-crash-001.html": [ "6e18e06c317e329a58b2b5132cf17dc6086d444f", @@ -33290,6 +33343,19 @@ {} ] ], + "root-margin-001-print.html": [ + "b2ec34fe0799d7cab5ac4dacb237780b6f7503e0", + [ + null, + [ + [ + "/css/css-break/root-margin-001-print-ref.html", + "==" + ] + ], + {} + ] + ], "table": { "repeated-section": { "fixedpos-in-footer-forced-break-print.html": [ @@ -38040,6 +38106,19 @@ {} ] ], + "webkit-box-ignores-flex-wrap.tentative.html": [ + "98086f83570d4c5b4c6251f31093744442a907ca", + [ + null, + [ + [ + "/compat/green-ref.html", + "==" + ] + ], + {} + ] + ], "webkit-box-rtl-flex.html": [ "d20b3a0a9dbab237a799f62504b9b1ea7b90a564", [ @@ -124754,6 +124833,19 @@ {} ] ], + "justify-items-anonymous.tentative.html": [ + "641dea1f54b2f0cea29bc4c4c82e023a479e3d3c", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "justify-self-auto-margins-1.html": [ "b54eb775114808ff22b82a858426e764a623e432", [ @@ -159361,7 +159453,7 @@ ] ], "contain-paint-stacking-context-001a.html": [ - "71102b6c73a3d88cdd953ecf82c69602ff87baa2", + "5e588cb61742ca406b23f573dd3609a52a191a1e", [ null, [ @@ -159374,7 +159466,7 @@ ] ], "contain-paint-stacking-context-001b.html": [ - "0c4d3323bf7cb28b5a31de8aac41563013b2ecd4", + "e03323782a7fbfbb924184fa71b0ab1031381671", [ null, [ @@ -184678,6 +184770,19 @@ {} ] ], + "font-variant-emoji-005.html": [ + "0f5c2d7a98a615323b1adc0babb479fdb738537d", + [ + null, + [ + [ + "/css/css-fonts/font-variant-emoji-005-ref.html", + "==" + ] + ], + {} + ] + ], "font-variant-emoji-1.html": [ "53cf539edd8b61a7f08f8b95ae83f4f7a5179308", [ @@ -186484,6 +186589,19 @@ ], {} ] + ], + "flex-gap-decorations-022.html": [ + "5f3b512ef76214b3645c329c92bd06ebf23efd9d", + [ + null, + [ + [ + "/css/css-gaps/agnostic/gap-decorations-002-ref.html", + "==" + ] + ], + {} + ] ] }, "grid": { @@ -186837,6 +186955,84 @@ ], {} ] + ], + "grid-gap-decorations-029.html": [ + "6da75548d94b5e17e1ad7ba1011662c42b818d83", + [ + null, + [ + [ + "/css/css-gaps/grid/grid-gap-decorations-029-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-030.html": [ + "ef4507ef92638eeff660e67e2024bbce323c1aa8", + [ + null, + [ + [ + "/css/css-gaps/grid/grid-gap-decorations-030-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-031.html": [ + "530b661bfe32c5af7687954f3f4b2cbdfa61380a", + [ + null, + [ + [ + "/css/css-gaps/grid/grid-gap-decorations-031-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-032.html": [ + "ac2d38fdda0ec6a1f4a3b7b091d03c896e3e5e47", + [ + null, + [ + [ + "/css/css-gaps/grid/grid-gap-decorations-032-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-033.html": [ + "47ef35cc3688b2fcd2329558b1d0a27880983b38", + [ + null, + [ + [ + "/css/css-gaps/grid/grid-gap-decorations-033-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-38.html": [ + "8b87bcd4860ac50a1c2f3de98cec9599bebb77a3", + [ + null, + [ + [ + "/css/css-gaps/agnostic/gap-decorations-002-ref.html", + "==" + ] + ], + {} + ] ] }, "multicol": { @@ -187047,6 +187243,19 @@ ], {} ] + ], + "multicol-gap-decorations-017.html": [ + "c7d1fe42584f77e77acd3676f249ffa6510ada3b", + [ + null, + [ + [ + "/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html", + "==" + ] + ], + {} + ] ] } }, @@ -201929,6 +202138,45 @@ {} ] ], + "linear-gradient-body-sibling-index.html": [ + "299b86d464ad54f383ce8f384ec6677b3d3e305b", + [ + null, + [ + [ + "/css/css-images/linear-gradient-body-sibling-index-ref.html", + "==" + ] + ], + {} + ] + ], + "linear-gradient-calc-em-units.html": [ + "e764e62890dad81adfda9d60d50d82a1e07c5de5", + [ + null, + [ + [ + "/css/css-images/linear-gradient-calc-em-units-ref.html", + "==" + ] + ], + {} + ] + ], + "linear-gradient-sibling-index.html": [ + "b92897e0697441df6876b88e53daa148a5edb009", + [ + null, + [ + [ + "/css/css-images/linear-gradient-sibling-index-ref.html", + "==" + ] + ], + {} + ] + ], "multiple-position-color-stop-conic-2.html": [ "f3171bf3fb9823095312ab080ee3d0481a8545f6", [ @@ -256915,6 +257163,19 @@ {} ] ], + "letter-spacing-cursive-001.html": [ + "5700c600981ab815e2ecf33577a6408d8e54dee1", + [ + null, + [ + [ + "/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html", + "==" + ] + ], + {} + ] + ], "letter-spacing-end-of-line-001.html": [ "645ef10509803cb86b31c7250928c007acb21431", [ @@ -277158,6 +277419,35 @@ {} ] ], + "css-scale-of-clip-path.html": [ + "dda72c0d139979213741174da8c9572f1237bcc3", + [ + null, + [ + [ + "/css/css-transforms/css-scale-of-clip-path-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 40 + ], + [ + 0, + 3000 + ] + ] + ] + ] + } + ] + ], "css-skew-001.html": [ "f209834121bb00ff3542029d44ba1ce878b0dd77", [ @@ -281127,6 +281417,35 @@ {} ] ], + "scale-transform-filtered-text.html": [ + "a479b12528a0bb6903d58d46a4b2a0d073b9ee97", + [ + null, + [ + [ + "/css/css-transforms/scale-transform-filtered-text-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 25 + ], + [ + 0, + 500 + ] + ] + ] + ] + } + ] + ], "scale-transform-overlap.html": [ "0cb8db40b66accf337babe82d281d0a77c0ffa0d", [ @@ -328573,6 +328892,19 @@ {} ] ], + "backdrop-filter-scale-transform.html": [ + "813fb95d5ad3b5e4844e480980b4c712d6b8f28d", + [ + null, + [ + [ + "/css/filter-effects/backdrop-filter-scale-transform-ref.html", + "==" + ] + ], + {} + ] + ], "backdrop-filter-svg-background-image-blur.html": [ "9cd18b0542c86911b3a0b774fe892a61102c8b85", [ @@ -356396,7 +356728,7 @@ "the-button-element": { "interest-target": { "interesttarget-keyboard-invalidation.tentative.html": [ - "8c0ebd7a2cdcbab16e13618dbd5b8e36c58359f8", + "b6d0ff10932f1717fb038efb28c42c2bbf57cbf8", [ null, [ @@ -356410,19 +356742,6 @@ } ] ], - "interesttarget-outline-appearance.tentative.html": [ - "28cb2052a8d430b5dfadd31171b17d32a567d073", - [ - null, - [ - [ - "/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html", - "!=" - ] - ], - {} - ] - ], "interesttarget-plain-inline-element.tentative.html": [ "68ce00193f70c021cc392e0e2460662d7eb38ad9", [ @@ -372429,6 +372748,14 @@ [] ] } + }, + "translator": { + "resources": { + "util.js": [ + "ad06086a123bccbe2c852dffd1a36ffde0613ada", + [] + ] + } } }, "ambient-light": { @@ -374690,6 +375017,10 @@ "840e187cbad1cca4ea09e144c88df2a14032136a", [] ], + "WEB_FEATURES.yml": [ + "3c4f69200f67b3cd856f56913025c14de17a0e73", + [] + ], "resources": { "setAppBadge_iframe.html": [ "8738099658fbb2de893658e70242e855ecccd4b1", @@ -375026,6 +375357,10 @@ "65ca96dbb9d774e97cc3a60f6b6dde952104893b", [] ], + "WEB_FEATURES.yml": [ + "d55b5faaf11be9aa92df01f814d5ce165b23025f", + [] + ], "support": { "clear-cache-helper.sub.js": [ "5db0caf834cbf6a598f02761beda267dc8f1bcf8", @@ -417931,6 +418266,10 @@ "8c19f1cf4c6c0173b45face28d624368d365ec70", [] ], + "root-margin-001-print-ref.html": [ + "320da2e0f551b82e2e699500179fe06db612151b", + [] + ], "rounded-clipped-border-ref.html": [ "be08126fd2c3bab356a3a4fd5ff1cc1579184662", [] @@ -419214,7 +419553,7 @@ [] ], "contain-paint-stacking-context-001-ref.html": [ - "c7553716ab6c257bb0d9407582eed186bd763369", + "e2516f3d3788fd7f28356d266ee73e6b7ec0a4e3", [] ], "contain-size-block-001-ref.html": [ @@ -424631,6 +424970,10 @@ "633a94c4e51f32328bc68eeb74837aada6f4aff0", [] ], + "font-variant-emoji-005-ref.html": [ + "d4275b5c951c05ea270f1a2a474ff4ccaf9afc4a", + [] + ], "font-variant-emoji-1-notref.html": [ "bbf3654ccfcdd415fe5a28468e3329ba94ce63da", [] @@ -431505,6 +431848,10 @@ "gap-decorations-001-ref.html": [ "a7314fc7dca1545dacd710c261c7594117a3894a", [] + ], + "gap-decorations-002-ref.html": [ + "42c5ef128b47fc9cdd14c9ce4f8abdffb209d94e", + [] ] }, "flex": { @@ -431669,6 +432016,26 @@ "grid-gap-decorations-027-ref.html": [ "7e0d9cbcd6ff64b17bc8fe57616a37ba29a9fd8e", [] + ], + "grid-gap-decorations-029-ref.html": [ + "35450e07ae5579707c94b4a0a58f29eb83d7f7fa", + [] + ], + "grid-gap-decorations-030-ref.html": [ + "d4953ae2ddda701324d350ccf25a113b8e67fc37", + [] + ], + "grid-gap-decorations-031-ref.html": [ + "0615305bc9f8de791f1c2061ad6d90039932b157", + [] + ], + "grid-gap-decorations-032-ref.html": [ + "f90e3dd68132078e2557f33b7e32605d278cd0eb", + [] + ], + "grid-gap-decorations-033-ref.html": [ + "e26143a6b93e9fdd53d4055234d89e40d98dc2af", + [] ] }, "multicol": { @@ -431735,6 +432102,10 @@ "multicol-gap-decorations-016-ref.html": [ "8b2458fccce5a190c2c804b7e552dc0d85a8849a", [] + ], + "multicol-gap-decorations-017-ref.html": [ + "23fd089ac8e575e4035c5614c10ae55d7c3b06a4", + [] ] } }, @@ -434305,10 +434676,22 @@ "a80236dcf75c22ecd8e43935d004f1fddf0550cb", [] ], + "linear-gradient-body-sibling-index-ref.html": [ + "7325685511a542964859c34a359b107823db18df", + [] + ], + "linear-gradient-calc-em-units-ref.html": [ + "be13be8e260ef8d89be878d811edf83411dd2cee", + [] + ], "linear-gradient-ref.html": [ "033f1767799d718f072b48b6a99a4eaf7070f90e", [] ], + "linear-gradient-sibling-index-ref.html": [ + "eea8518d95b9393a5c1e1d34afc20744b8834c34", + [] + ], "multiple-position-color-stop-conic-2-ref.html": [ "2ee92a11ee43a60031302ecb24b5a1e2865590ec", [] @@ -439016,7 +439399,7 @@ [] ], "scroll-buttons-appearance-ref.html": [ - "462186407d55da46e14f5ebbc8f90218cd0b80b7", + "c382f738a6fc01402668747529ce7ab7b46f5f4f", [] ], "scroll-buttons-disabled-ref.html": [ @@ -445745,6 +446128,10 @@ "977d8211457a6e7b4976b596be91068cdf518869", [] ], + "letter-spacing-cursive-001-ref.html": [ + "720c9491b4d8cfdba5c2279dacdc297d495c2b67", + [] + ], "letter-spacing-end-of-line-001-ref.html": [ "eb474ab8d234d0836c3466e29bfe9b313e10d302", [] @@ -449499,6 +449886,10 @@ "54940566cd107ba443d3183dccecb505a811d14e", [] ], + "css-scale-of-clip-path-ref.html": [ + "d6fa480b0408ffc9c3687515e25a30ddc68f199f", + [] + ], "css-skew-001-ref.html": [ "70c256ebec653128a2d91555e817b54880666a35", [] @@ -449949,6 +450340,10 @@ ] } }, + "scale-transform-filtered-text-ref.html": [ + "e8b564ce3ddd6560299d91f347b4407fe6a5db6b", + [] + ], "scale-transform-overlap-ref.html": [ "4750764ae93092e7b7e9f7d151eb1b7904c32ca8", [] @@ -457138,6 +457533,10 @@ "f8947e0472f489ca1a98a9e231b17e7d8ce6585e", [] ], + "scrollIntoView-frame.html": [ + "ee2be2fd3ab04ad9a1bde48ee188789d92d9ca8a", + [] + ], "simultaneousScrollIntoViews.js": [ "32de35fb544c5a83b0c8159de21f9a6ebfed19ba", [] @@ -457465,6 +457864,10 @@ "c92741df4300e5416cbe26339d52b819ec35347c", [] ], + "backdrop-filter-scale-transform-ref.html": [ + "d7faa0e97a175fc5dabf6f2d89ce71ba0fd498e1", + [] + ], "backdrop-filter-transform-ref.html": [ "1af8776cf0dc663ec7bac1f83ba361ccb8b2b5d4", [] @@ -458240,7 +458643,7 @@ [] ], "WEB_FEATURES.yml": [ - "24027360aab4a27b72975f0d77062ffe8fb1a060", + "7f15b7fa475230b42981a3f92f60f434e9ccf1af", [] ], "prefers-color-scheme-svg-as-image-ref.html": [ @@ -460304,7 +460707,7 @@ [] ], "testdriver.md": [ - "67757af63f2ed6af4026577dd35000c183509d44", + "e0fae529875ee89d5e8a2457cdab35e1866f663b", [] ], "testharness-api.md": [ @@ -460874,6 +461277,12 @@ ] } }, + "observable": { + "WEB_FEATURES.yml": [ + "3e872791165e41402949da13fedd7a8780aaf660", + [] + ] + }, "parts": { "resources": { "domparts-utils.js": [ @@ -461338,7 +461747,7 @@ [] ], "element-timing-helpers.js": [ - "2c1bd195ea76f8126d739e705fed7af3a562fc45", + "5ff01bfa1209a26d84d69bb5a80d7fd21d671fab", [] ], "iframe-stores-entry.html": [ @@ -462656,7 +463065,7 @@ [] ], "event-timing-test-utils.js": [ - "59c78ebf39c8a8e0f31aafa1eccd0809bea54376", + "afad67bb6fc2d90e02bf7b40633be891bb2fe3d0", [] ], "slow-image.py": [ @@ -464352,6 +464761,10 @@ ] }, "request": { + "WEB_FEATURES.yml": [ + "69b2ea582a2281403c4899e122343262e43976db", + [] + ], "destination": { "resources": { "dummy": [ @@ -465226,6 +465639,10 @@ [] ], "resources": { + "cached_pragma_rand.py": [ + "18c7d25159fa3041b8aa278c8ac022003eee0e36", + [] + ], "http-cache.py": [ "3ab610dd1421cea5289ad14a8ef472ade27f07f1", [] @@ -465244,6 +465661,30 @@ ] } }, + "local-network-access": { + "META.yml": [ + "4c5c6983ed0467f3ebca3182a6b5d095270f85d2", + [] + ], + "README.md": [ + "95066cdcd0ba6f2baed3cd02d67610420367b6df", + [] + ], + "resources": { + "fetch-private.html": [ + "b96a207ec33a13e5dd4c53083ac3d73123b23cbb", + [] + ], + "support.sub.js": [ + "774e34d0a6fe59bab19aca14cb71b6e520acb798", + [] + ], + "target.py": [ + "eabcdd47517c8938d12cd08a0d66f0db2e518456", + [] + ] + } + }, "metadata": { "META.yml": [ "85f0a7d2ee12616aa7a5698b346954829d8a8bb0", @@ -465865,7 +466306,7 @@ [] ], "WEB_FEATURES.yml": [ - "45e40acba1dcb6b4abe11d1478c682264a4c1e90", + "7faf67952b5b82107a2797706e41dfdc780ef041", [] ], "resources": { @@ -471334,6 +471775,10 @@ [] ], "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ], "canvas-display-p3.js": [ "c6ee97b7880a4ac2333b82b60407102045d1f509", [] @@ -471696,6 +472141,10 @@ "2d.path.stroke.overlap.png": [ "e2a35d48d4c4363294aec671a38cbd4b39c9a53c", [] + ], + "WEB_FEATURES.yml": [ + "1bbef5e88d6630d820e2206f283ac38cffceb67d", + [] ] }, "pixel-manipulation": { @@ -471879,6 +472328,12 @@ [] ] } + }, + "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ] } }, "offscreen": { @@ -472358,8 +472813,20 @@ "fc7265a48c393566ad8c9fe7b73281e4f5137b21", [] ] + }, + "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ] } }, + "path-objects": { + "WEB_FEATURES.yml": [ + "1bbef5e88d6630d820e2206f283ac38cffceb67d", + [] + ] + }, "reset": { "2d.reset.after-rasterization-expected.html": [ "3162e16e63d9fa5cc495401ca53d6c0242d3ee65", @@ -472471,6 +472938,12 @@ "00ecdccad3743db0d0a1ec99850f80ea7964d512", [] ] + }, + "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ] } }, "resources": { @@ -477418,6 +477891,14 @@ } } }, + "embedded-content": { + "the-img-element": { + "WEB_FEATURES.yml": [ + "5716baa5def9bd2af6813751aa7a93ffba64c4cd", + [] + ] + } + }, "iana": { "application-x-www-form-urlencoded": { "original-id.json": [ @@ -478970,6 +479451,10 @@ }, "scripting": { "the-script-element": { + "WEB_FEATURES.yml": [ + "864bd3398ee21fb62665a2d5c259a52acdd04232", + [] + ], "resources": { "script.js": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -482984,11 +483469,7 @@ }, "interest-target": { "interesttarget-keyboard-invalidation-ref.html": [ - "0ba07b16f497203f231d03cc7908453c6ccc43c4", - [] - ], - "interesttarget-outline-appearance-ref.html": [ - "33b0cf668587f182caf87dfb98665a9301fca19a", + "9d520943d5f542a2aeb45ac6cb1417eb20c25477", [] ], "resources": { @@ -483000,6 +483481,10 @@ } }, "the-link-element": { + "WEB_FEATURES.yml": [ + "6a444ee171ad29c442d573fb2131b544820b6cad", + [] + ], "resources": { "stylesheet.css": [ "9d9d772fb468756d1a90f72325f89cd372f812ef", @@ -486735,7 +487220,7 @@ [] ], "largest-contentful-paint.idl": [ - "872ba552b0d3b0398be533beb578fdedd260baea", + "d1630cc7daae802bf27107ce0ab07185d0746d7f", [] ], "layout-instability.idl": [ @@ -487059,7 +487544,7 @@ [] ], "service-workers.idl": [ - "d9ff2f651f8235968dd29bd6d7f86e9e8fdcb4cf", + "34af3372401eed53328b8bc5e7ea42b87ddd9b20", [] ], "shape-detection-api.idl": [ @@ -487211,7 +487696,7 @@ [] ], "webauthn.idl": [ - "a33c85e7bad86753211fa7aa9270abac18b1e54e", + "7fbe55e67652b3fd35079d1a06423bb441657bd5", [] ], "webcodecs-aac-codec-registration.idl": [ @@ -487702,7 +488187,7 @@ [] ], "largest-contentful-paint-helpers.js": [ - "a01080c00881d7b66a80886e34367624913e1d6f", + "99916f5c5d31110d83c91d4ce346890efb494b12", [] ], "lcp-sw-from-cache.js": [ @@ -491118,7 +491603,7 @@ [] ], "utils.js": [ - "ed58c957c97132276bb813603e1d25133cf0d860", + "41c76d6826658c0f73301f70ef0ae08cf84572e4", [] ] } @@ -494280,6 +494765,10 @@ "da9bbc387f41ab069c27edc055962f72036b96f2", [] ], + "WEB_FEATURES.yml": [ + "f59321971a7668545949ee3212e54420e424c7ae", + [] + ], "prepare-device.js": [ "a12dbaf28717cf3776d9e34f5a12e4adaa7bae18", [] @@ -494388,7 +494877,7 @@ [] ], "report-helper.js": [ - "5b5438903de11c346ac3901a9de81a96e4446386", + "216da22eae8c0ccde223c70a110a7a892676c14f", [] ], "report.py": [ @@ -495204,7 +495693,7 @@ [] ], "api-tests-1.html": [ - "9de875b0f127776e0d60df68075402d32c195749", + "6ec396c221b98f282b46a366e99a76bd9daef492", [] ], "api-tests-2.html": [ @@ -495589,7 +496078,7 @@ [] ], "testdriver.js": [ - "6e8410b7ea46064438c8d276274b6fbb689f81d2", + "992b9e3ab2ce0b63b94be2a5aa671b321f65e334", [] ], "testdriver.js.headers": [ @@ -495609,7 +496098,7 @@ [] ], "testharness.js": [ - "d1d9d61eab890f2090e06a286aa76aedc98db7c7", + "6ccede34483b227cc41fcb15235e56aa60d4022e", [] ], "testharness.js.headers": [ @@ -499883,7 +500372,7 @@ [] ], "basic-service-worker.js": [ - "17fccd448d2412287515f6176b0731189eb8eede", + "59d7d8bae9ee4d46d8a0bb12bcc3377d041280f4", [] ], "conditional-status.py": [ @@ -499895,11 +500384,11 @@ [] ], "counting-executor.py": [ - "cbcbc8eccb9bd8cf536c56cf576a4b5ea73ca44a", + "3511fe4905e2d8962175f0e4bc318a13c41c35f5", [] ], "executor.sub.html": [ - "d27acfe100a6a3567606bd64df0b8cd1c5bdbfc1", + "975a3e5092ed149b687f34ba6b9c6d5af11432ea", [] ], "executor.sub.html.headers": [ @@ -500875,14 +501364,6 @@ [] ], "animations": { - "reftests": { - "reference": { - "green-100x100.svg": [ - "120941444a4898197d6b6001f9908a6cd48b62ba", - [] - ] - } - }, "support": { "animated-path-helpers.js": [ "8fd4492265c2eb8aa00fb173bd8d625f119adaac", @@ -500927,6 +501408,10 @@ } }, "embedded": { + "WEB_FEATURES.yml": [ + "8482e555584bf205a6afa11836b35d046976e0df", + [] + ], "image-embedding-svg-with-near-integral-width-ref.html": [ "655d982b16ce0582f6b83e26844b2a6e2437b17b", [] @@ -501765,6 +502250,10 @@ } }, "scripted": { + "WEB_FEATURES.yml": [ + "864bd3398ee21fb62665a2d5c259a52acdd04232", + [] + ], "script-style-attribute-csp-ref.html": [ "a7316213f13a57fa1c3ab5c058bc9d21f14d5055", [] @@ -513355,7 +513844,7 @@ [] ], "emulation.py": [ - "e587a082c037d4fdcd72441616a3800d341c981a", + "fd5cf733ab761639493df402268429f5ab09f528", [] ], "input.py": [ @@ -513714,7 +514203,7 @@ [] ], "android_webview.py": [ - "0e02d3c02cd5456d62401423e7bb7581d70dc32f", + "c796be18a734cfbb33fd73b0d99a7c30512c8dd6", [] ], "base.py": [ @@ -513726,7 +514215,7 @@ [] ], "chrome_android.py": [ - "820323e615ad57d89df7ccdee68a4587b8acc6fc", + "4ed7707c3bed88e2f5061a331e49683db8a4f583", [] ], "chrome_ios.py": [ @@ -513750,7 +514239,7 @@ [] ], "firefox.py": [ - "494a7514efda2f2607c7394bca5ff9ddb19adf51", + "c63bfa2ceebb281e01e49a79aaf6cdeb2bbd92e5", [] ], "firefox_android.py": [ @@ -513826,7 +514315,7 @@ [] ], "asyncactions.py": [ - "9925a4b511def24fda82522acb5c5f0f9f3e80a1", + "8397d7838a3d6bd45e28dc613322d00ff8f2aebb", [] ], "base.py": [ @@ -513858,7 +514347,7 @@ [] ], "executorwebdriver.py": [ - "87403c2944d57e31c2612871262af9b77ce73235", + "7ca46a05a7b0f2bc3da65512fdee57080946b7d0", [] ], "executorwktr.py": [ @@ -513874,7 +514363,7 @@ [] ], "protocol.py": [ - "833dff45636c7e22697e47cfe692ebecfcf2d76f", + "16eb3cbb4a528ac9e4fc4897aa36f2a58e6d68ec", [] ], "pytestrunner": { @@ -513929,18 +514418,10 @@ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", [] ], - "chromium.py": [ - "95f53011bfc32de47a93e0bb7d2ac99f84be4e40", - [] - ], "tests": { "__init__.py": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", [] - ], - "test_chromium.py": [ - "bf815d5dc761b869f89ec71fdec66c395b453fbd", - [] ] }, "wptreport.py": [ @@ -513989,7 +514470,7 @@ [] ], "testdriver-extra.js": [ - "ab8b04ba3cdfc3d7c351ce99c6289de6e99b8f3e", + "3c2dd8b42dd5b572841b5b5529b42a17f724cef9", [] ], "testdriver-vendor.js": [ @@ -514017,7 +514498,7 @@ [] ], "testrunner.py": [ - "64668fc470b730ecc664c06c0c5412a657f3d2da", + "2c2da790e901f8e56f5f5f77673a281530c53294", [] ], "tests": { @@ -514131,7 +514612,7 @@ [] ], "wptcommandline.py": [ - "647cc7f21b1e2f35f9111650cb6eba2dce5376a4", + "7bfeef317170f2032152df46d9f976a1a82cbc90", [] ], "wptlogging.py": [ @@ -516425,6 +516906,10 @@ "afa5e4eaf032e0ad26e730615d633ce498a73c12", [] ], + "simd_select.wast.js": [ + "e997d81f75abc7ef0ba8e6e78e5435e3bd63e13c", + [] + ], "simd_splat.wast.js": [ "3ecdc10e2791eda422bb2fa657386ea476951592", [] @@ -518417,7 +518902,7 @@ [] ], "__init__.py": [ - "955335ea87e7fc427104a9a4eab5ba7c9e338558", + "587dc91a9387d3047fa56fa85ad80612637b24fd", [] ], "browser": { @@ -518641,11 +519126,11 @@ ], "set_geolocation_override": { "__init__.py": [ - "33dcca90f047b58e9026a104b99f537678191666", + "5e1fd1aa8637529a20b48356fe20e4f970b8428c", [] ], "conftest.py": [ - "a90895c74ed90c04b5f181af22c3bddec9ac132d", + "5fb9451f0a23821bbd7d25ac59efeb928f84b5ac", [] ] } @@ -519964,7 +520449,7 @@ }, "resources": { "utils.js": [ - "50d7911a9181a5139d9e16f7c866112dc54d6d01", + "9d5cfc70c10187743807096421975a099f22afc9", [] ], "utils_validation.js": [ @@ -520184,7 +520669,7 @@ [] ], "RTCPeerConnection-insertable-streams.js": [ - "0bf820acde48058711163708b05d02e89501546b", + "f3873e1de4b12aa668f711dfbbf41cb9b2d0ac66", [] ], "RTCPeerConnection-sender-worker-single-frame.js": [ @@ -529018,7 +529503,7 @@ ] ], "idbcursor-request-source.any.js": [ - "2fe8c66f2e590b170a1456648e1dca74077464d8", + "8e1b34ee798a69c3d61386c5ae1f9adaeba6f21a", [ "IndexedDB/idbcursor-request-source.any.html", { @@ -549735,7 +550220,7 @@ ] ], "idlharness.https.any.js": [ - "ae65eb49f2120e1a6d7222a7c0ecc9836c4ff5a8", + "5ddf7eab6dba2116d0d3bbc6826b176463107eb0", [ "WebCryptoAPI/idlharness.https.any.html", { @@ -551569,10 +552054,10 @@ ] }, "translator": { - "translator-bad-input.tentative.https.window.js": [ - "53a184bfd196f6006e7df9c908518ba47deacda6", + "translator-bad-input.https.window.js": [ + "db8905a61f660f8dc0aa7666c044794d22683799", [ - "ai/translator/translator-bad-input.tentative.https.window.html", + "ai/translator/translator-bad-input.https.window.html", { "script_metadata": [ [ @@ -551592,15 +552077,15 @@ } ] ], - "translator-translate.tentative.https.window.js": [ - "a8aad5e03e1f46db43a47966d66f7aecc526b255", + "translator.optional.https.window.js": [ + "96eca09d28bd61ccc4d31b746216f1f252d0bf3b", [ - "ai/translator/translator-translate.tentative.https.window.html", + "ai/translator/translator.optional.https.window.html", { "script_metadata": [ [ "title", - "Translate from English to Japanese" + "Translator Translate" ], [ "global", @@ -551621,6 +552106,10 @@ [ "script", "/resources/testdriver.js" + ], + [ + "script", + "resources/util.js" ] ], "timeout": "long" @@ -571866,6 +572355,13 @@ {} ] ], + "style-src-inline-style-with-csstext.html": [ + "5e812b4aee9d0d081673a0f333f8b29187619c3d", + [ + null, + {} + ] + ], "style-src-multiple-policies-multiple-hashing-algorithms.html": [ "027c61d8c632f2387408b8fb6869dee69bb8913d", [ @@ -573017,7 +573513,7 @@ ] ], "cookieListItem_attributes.https.any.js": [ - "6716d91788db746765593a2a95d34e1ecbb4e3a5", + "542bd6c53870b5baaa9ac0f75c2235079b7bfe88", [ "cookie-store/cookieListItem_attributes.https.any.html", { @@ -573771,7 +574267,7 @@ ] ], "httponly_cookies.https.window.js": [ - "8a10e358ef6de72d5476ae8dc8a571482881d7ef", + "605e94e67440aaedbcaa39f185270fe77b316ad3", [ "cookie-store/httponly_cookies.https.window.html", { @@ -577594,7 +578090,7 @@ ] ], "anchor-position-grid-001.html": [ - "92fb4d275b8988641ed0736969e918703e4d649d", + "7bd389b39d8d6642f02181e475bbc5eaa7322f2d", [ null, {} @@ -577636,7 +578132,7 @@ ] ], "anchor-position-multicol-002.html": [ - "7b2691a2b904ffb7fdc3d720b07ca454e1df7fe1", + "1e1f0a5c95b1b5f1d86efc5f22ffc87afbbab453", [ null, {} @@ -577650,7 +578146,7 @@ ] ], "anchor-position-multicol-004.html": [ - "399494120ea0ea5da5534a0a14a9b99e598222d5", + "8f7a3dad12915ddbea9bd88077694434d0a17b48", [ null, {} @@ -577692,7 +578188,7 @@ ] ], "anchor-position-multicol-nested-001.html": [ - "35ab2cfc15cea1fa1788f9b4cb09f9af39d079ec", + "c5ce41299af29008356b7a049a3d479038379fae", [ null, {} @@ -581625,7 +582121,7 @@ ], "table": { "border-spacing.html": [ - "fc5e87e35dde4b4cb2ed5c457f5cd22ec73d96b0", + "9fd94760681f0186f86f9a55da300250499f2a50", [ null, {} @@ -581669,7 +582165,7 @@ ] ], "table-parts-offsets-vertical-rl.tentative.html": [ - "9d4a472d4382825c13af35114acc48a3b5face2a", + "1eb751032ca4b7598ee3a413408c61c5a592b3e4", [ null, {} @@ -581846,6 +582342,13 @@ {} ] ], + "inline-style-background.html": [ + "11451f8cefd3e725b017b263dded4bf9a806d785", + [ + null, + {} + ] + ], "layer-basic.html": [ "e214bffc25f5fc3b56480ec9c8704a80bf109c17", [ @@ -588888,6 +589391,13 @@ {} ] ], + "gap-decorations-col-rule-width.html": [ + "db7b97e74a58f30a52b22b68a92475f48f865ed7", + [ + null, + {} + ] + ], "gap-decorations-color-computed.html": [ "fbc3c3f4c976b344d48a9bd927547214f072e3ab", [ @@ -595016,8 +595526,8 @@ {} ] ], - "dashed-function-cycles.tentative.html": [ - "11e653e9b7d02d944e4bd74bda6e08e838c4ea42", + "dashed-function-cycles.html": [ + "15305be2b287ca3e4fbfad928f8d101ed8463104", [ null, {} @@ -595251,6 +595761,34 @@ {} ] ], + "getclientrects-005.html": [ + "ee60a607dccb3fdba2ed7dc99cb344071f5bb34a", + [ + null, + {} + ] + ], + "getclientrects-006.html": [ + "9f07a7de7444de7a2f91f97ff0a4fe44b7e177af", + [ + null, + {} + ] + ], + "getclientrects-007.html": [ + "0791c5b931fe3fade4c7b4483ef2469435ffbd77", + [ + null, + {} + ] + ], + "getclientrects-008.html": [ + "21505a7e48a2d2f9947342329de19dfde974d8e5", + [ + null, + {} + ] + ], "going-out-of-flow-after-spanner.html": [ "2fe0e42a7522647b7eca4db1e6f710a9975faaa4", [ @@ -596325,6 +596863,24 @@ } ] ], + "scroll-button-activation-without-scroller.html": [ + "f5951efc419d62a28f661c4f7d93cd9654b42616", + [ + null, + { + "testdriver": true + } + ] + ], + "scroll-button-disabled-no-focus.html": [ + "a88977068742f03bdd4929ff1e3f96e581d9ba2d", + [ + null, + { + "testdriver": true + } + ] + ], "scroll-button-display-none.html": [ "8b3068be6dad6d1ccbe1134b9833ecc1c8b0f594", [ @@ -611456,7 +612012,7 @@ ] ], "transform.html": [ - "7a852545a74a494348d90d727fc7266140033d2f", + "d12714a499c75ecbae8c4586f452d335594240fb", [ null, {} @@ -613525,7 +614081,7 @@ ] ], "sibling-function-descriptors.tentative.html": [ - "d31d4acf499fb62f777817f24186e394626d507e", + "76d2ff8ee4db660e41ede9b188465a6c31843e3b", [ null, {} @@ -613545,6 +614101,20 @@ {} ] ], + "sibling-index-keyframe-length-value-dynamic.html": [ + "cbd34602fb3c74f3cea8a1e2192d1b5687e38a05", + [ + null, + {} + ] + ], + "sibling-index-keyframe-value-dynamic.html": [ + "286e0d3d3e2eecdd091df74c8c47f738cb700dd1", + [ + null, + {} + ] + ], "tree-scoped-sibling-function.html": [ "979466bb7cf3d5e5c4e9a2681f02f969858953e6", [ @@ -614627,6 +615197,13 @@ ] ] }, + "start-skip-start.html": [ + "e04979472f1725b0225cdb98bbbd5222ed98c16c", + [ + null, + {} + ] + ], "start-view-transtion-skips-active.html": [ "971c7b38d4c816489caab9c611adc800b3638971", [ @@ -614703,7 +615280,7 @@ ] ], "view-transition-types-mutable-no-document-element-crashtest.html": [ - "d5c0abd652cd3c673a71979a458df8183ab057ba", + "3ac946b273ba9fa9f9da27b10e492420daa3430a", [ null, {} @@ -617060,7 +617637,7 @@ ] ], "getBoundingClientRect-newline.html": [ - "40e29181d6fed001b641b0b0050cf21d6f3c589c", + "ce82b7237d003d79fe4333e5a67aa74b004bb11c", [ null, {} @@ -617535,6 +618112,13 @@ {} ] ], + "scrollIntoView-container.html": [ + "3b241ea22517ecc5db6f286422233ed9f25cab5f", + [ + null, + {} + ] + ], "scrollIntoView-fixed-outside-of-viewport.html": [ "b3d61a430a3d2b566ff73b0844a79bf5ec4e92db", [ @@ -618029,6 +618613,13 @@ {} ] ], + "css-filters-opacity-hit-testing.html": [ + "3b288fca4df13fcad7cfe0104c0f333aec73e45c", + [ + null, + {} + ] + ], "filter-sign-function.html": [ "97e5a26073b097728cf4571712bb9bd472ed69fd", [ @@ -618224,7 +618815,7 @@ }, "geometry": { "DOMMatrix-001.html": [ - "f578da076cbe6d7d7eb69b2cf438aa6f11a5c060", + "3436e17ced00de235f23117ed3a2bf8eba828a03", [ null, {} @@ -624137,7 +624728,7 @@ } ] ], - "overscroll-deltas.html": [ + "overscroll-deltas.tentative.html": [ "e13e9f1cce5949da74227a1f069f64baad1f517c", [ null, @@ -624146,7 +624737,7 @@ } ] ], - "overscroll-event-fired-to-document.html": [ + "overscroll-event-fired-to-document.tentative.html": [ "c054ffca9c471f78ce5d1cbaa210fa7aad3aee3b", [ null, @@ -624155,7 +624746,7 @@ } ] ], - "overscroll-event-fired-to-element-with-overscroll-behavior.html": [ + "overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html": [ "750080e6568e863a9249bc62e52971d9459f8418", [ null, @@ -624164,7 +624755,7 @@ } ] ], - "overscroll-event-fired-to-scrolled-element.html": [ + "overscroll-event-fired-to-scrolled-element.tentative.html": [ "be4176df59d6a1d59d90beee839bc5ca6a72f1c5", [ null, @@ -624173,7 +624764,7 @@ } ] ], - "overscroll-event-fired-to-window.html": [ + "overscroll-event-fired-to-window.tentative.html": [ "ef5ae3daef8158c9424cf07ad091c6a945456d0a", [ null, @@ -646902,6 +647493,15 @@ } ] ], + "orphan-keydown.html": [ + "0ab105d4d7284c19513a92241a9e16976fadefd0", + [ + null, + { + "testdriver": true + } + ] + ], "pointerdown.html": [ "2eb6ae898ccd006da1633a7f812dbcfc0fcbe9f1", [ @@ -648836,7 +649436,7 @@ ] ], "fedcm-disconnect.sub.https.html": [ - "2ea2d4a2599751cad941552964c700ced2f1b7cc", + "04fcd272dcf261a19cf71abb049e41c8b41abbbf", [ null, { @@ -662487,6 +663087,13 @@ } ] ], + "pragma-no-cache-with-cache-control.html": [ + "19a80fe5edc6fcfdaad36219bc608312f5d15a3b", + [ + null, + {} + ] + ], "split-cache.html": [ "c822abba3acee8db1079ad08dd7fbcbf38d9e3b9", [ @@ -662766,6 +663373,17 @@ ] ] }, + "local-network-access": { + "fetch.tentative.https.html": [ + "9c591f309b75af6731c6d6be9c0907d3b8c22618", + [ + null, + { + "testdriver": true + } + ] + ] + }, "metadata": { "audio-worklet.https.html": [ "3b768ef0b5ddd2d13361629afd011e6987cb38d0", @@ -692448,6 +693066,13 @@ }, "windows": { "auxiliary-browsing-contexts": { + "named-lookup-noopener.html": [ + "91cf6ae6ee24611856b1a5eeb87f60b99cb82d64", + [ + null, + {} + ] + ], "named-lookup-scoped-to-browsing-context-group.html": [ "0450d479196a19535419c286fa2447580b344b25", [ @@ -721865,6 +722490,15 @@ } ] ], + "pointerdown-add-display-none.html": [ + "653944e155b71055761ab900f9f485ba812b46d2", + [ + null, + { + "testdriver": true + } + ] + ], "pointerdown-add-overflow-hidden.html": [ "ac953adfd874b19ab42379039dc26ac0efb67b7b", [ @@ -733709,6 +734343,15 @@ } ] ], + "select-input-keyboard-behavior.tentative.html": [ + "bf3fbab9d18a4747f903d082a8c11d6ebad737aa", + [ + null, + { + "testdriver": true + } + ] + ], "select-inside-top-layer.tentative.html": [ "6d70f3aaf8d3dc23b2f5fb784c399991913dc938", [ @@ -740739,6 +741382,15 @@ } ] ], + "interesttarget-partial-interest.tentative.html": [ + "bc7184d42d2528fe8e027e7af51463a796177ca9", + [ + null, + { + "testdriver": true + } + ] + ], "interesttarget-popover-focus.tentative.html": [ "9dfc39a37a60d438ecf9287d0ddffc0212e7a21c", [ @@ -748364,7 +749016,7 @@ }, "emulation": { "set_geolocation_override.https.html": [ - "5cbcf546423c772a98fd3725531754c366ab7b91", + "e339f39dcd89aa311e91c744669bf2cd9aadc103", [ null, { @@ -748875,7 +749527,7 @@ ] ], "input-events-spin-button-click-on-number-input-delete-document.html": [ - "fb3655398dbd1bdde84f032df392b6352b7fcafe", + "9e5d9b9ef99a4290b4195ff5901eab324935c3fe", [ null, { @@ -750756,7 +751408,7 @@ ] ], "idlharness.html": [ - "5f5d286b356cf5dcffd76f2ed6f689804e8426ba", + "0dd006e711c6d7b02fcbcd4d31a5c11381fe8d69", [ null, {} @@ -750959,7 +751611,7 @@ ] ], "observe-text.html": [ - "0724a0bb92bf5248938c33fe1377d2e3a23309a5", + "d029d500aa1217b92c3898e90a50de83a98bc9e0", [ null, {} @@ -763879,7 +764531,7 @@ ] ], "paint-timing-mixin.html": [ - "c43b7668b5c9b376774672746b6f1e31e5feb3cb", + "048c985c7c75cc3fe717b3b836120f170e847d1e", [ null, {} @@ -785589,7 +786241,7 @@ ] ], "sanitizer-basic-filtering.tentative.html": [ - "0b6924b0980d8295d02a5ed3d552ba4e58beb212", + "38c764ae181418014488cf86126398158e653157", [ null, {} @@ -785616,6 +786268,13 @@ {} ] ], + "sanitizer-parseHTML.tentative.html": [ + "c4a31e2eb0365f67479968f4ce08117d04384889", + [ + null, + {} + ] + ], "sanitizer-removeUnsafe.tentative.html": [ "7ad8253ad5fdec29b79c590e50e9c0d211d17031", [ @@ -797066,7 +797725,7 @@ ] ], "innertext.tentative.html": [ - "d40b6047924834ef09137fa975cbd2d142999bcb", + "7716488f25a08ea62635fceec679d97650d1f383", [ null, { @@ -797075,7 +797734,7 @@ ] ], "interaction-with-paint-before-back.tentative.html": [ - "7b884f2bdb38945a346c3b5a8b178c04e88989ad", + "5961a6ebcdfdd2b10bf16173d3f0cece2733fa1c", [ null, { @@ -797255,6 +797914,19 @@ } ] ], + "smoke": { + "tentative": { + "basic.html": [ + "9bfedf09b1934e00a85cd030388ed470f575f7b0", + [ + null, + { + "testdriver": true + } + ] + ] + } + }, "soft-navigation-detection-main-descendent.tentative.html": [ "96ff55260c3b9553ac5735cc5fe209ee7cfd5f37", [ @@ -797362,7 +798034,7 @@ ] ], "text-lcp-followed-by-anim-image-softnav-lcp.tentative.html": [ - "0615b513e61319d61bcbed3540aa1a5d47289cb6", + "b34a6e81a58333c61ccedb4e25551feba4893736", [ null, { @@ -797389,7 +798061,7 @@ ] ], "visited-link.tentative.html": [ - "0bb149f00e91fc2f0033a6f763543967ef542ab2", + "0bb31aaac1540b3d2b9f6a3157bb43d96e430a58", [ null, { @@ -798309,6 +798981,75 @@ "timeout": "long" } ] + ], + "redirect.sub.https.html": [ + "f56f6bf09b9f61956e9297f8098677b846270d49", + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler-synthetic", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler-to-fallback", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=no-fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler-synthetic", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler-to-fallback", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=no-fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=fetch-handler-to-fallback", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=no-fetch-handler", + { + "timeout": "long" + } + ] ] } }, @@ -800074,6 +800815,26 @@ } ] ], + "prefetch-eagerness-pointer-down.https.html": [ + "cbf69cefba61f23b706c9b397308625467671237", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], + "prefetch-eagerness-pointer-hover.https.html": [ + "f5e749b9c6f63f80c40ed9ff7cac42570f8b8d13", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "prerender-target-hint.https.html": [ "cab8f4586c514f562976ee41acb2cd6f74568eac", [ @@ -800151,10 +800912,12 @@ ] ], "SpeechRecognition-installOnDevice.https.html": [ - "1d1dd35edc26d75419a49120d8a76c4ea7c84233", + "2f5b359c571d6d9cc97815ae6ba46e4249ec569e", [ null, - {} + { + "testdriver": true + } ] ], "SpeechRecognition-onerror.https.html": [ @@ -807083,7 +807846,7 @@ ], "crashtests": { "garbage-collection.any.js": [ - "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335", + "6e9d80c41425b13800717f9e27184f64f1514752", [ "streams/readable-streams/crashtests/garbage-collection.any.html", { @@ -812280,6 +813043,71 @@ } ] ], + "crashtests": { + "garbage-collection.any.js": [ + "a3796881c9fb544a0b446db39af233b3866ae2b9", + [ + "streams/writable-streams/crashtests/garbage-collection.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ], + [ + "streams/writable-streams/crashtests/garbage-collection.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ], + [ + "streams/writable-streams/crashtests/garbage-collection.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ], + [ + "streams/writable-streams/crashtests/garbage-collection.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ] + ] + }, "error.any.js": [ "d08c8a54863bb9693e76116946bd118592d6928c", [ @@ -813749,6 +814577,34 @@ {} ] ], + "tentative": { + "integrity-policy": { + "parsing.https.html": [ + "205854419a7d58871e39a5cfb3a86ccd38cd5492", + [ + "subresource-integrity/tentative/integrity-policy/parsing.https.html?type=enforce", + { + "timeout": "long" + } + ], + [ + "subresource-integrity/tentative/integrity-policy/parsing.https.html?type=report", + { + "timeout": "long" + } + ] + ], + "script.https.html": [ + "783374db920a24ae32a3492d8cfe2edc5d8eb5d3", + [ + null, + { + "timeout": "long" + } + ] + ] + } + }, "unencoded-digest": { "tentative": { "fetch.any.js": [ @@ -814694,13 +815550,6 @@ {} ] ], - "discard-check-removal-order.html": [ - "2935a69addaabdeee2eb381de847cd7f77688ce3", - [ - null, - {} - ] - ], "end-attribute-change-end-time.html": [ "9f05d7d405d364a1eadfa104c1c4bd90a2bf3b8c", [ @@ -815922,7 +816771,7 @@ ] ], "idlharness.window.js": [ - "b363128c25a9068df93b26966b82b50cdd9b87f7", + "57beca77fd45b83f40fcdf378103d6f1c1c0940d", [ "svg/idlharness.window.html", { @@ -817086,7 +817935,7 @@ ] ], "presentation-attributes-special-cases.html": [ - "7bfa001030a0e0969d845e353a9d721d9ce940a0", + "9a5da751ce1ace3c277bfce3bf9b99352ac7786f", [ null, {} @@ -825119,6 +825968,13 @@ {} ] ], + "simd_select.wast.js.html": [ + "5d50138374b1ce1edaa9d8b28d03f33b6cb6bab3", + [ + null, + {} + ] + ], "simd_splat.wast.js.html": [ "45204220343e96015990bb8c6374c2a98aa62382", [ @@ -851947,7 +852803,7 @@ ] ], "conv2d.https.any.js": [ - "9fe246c9395c6cacf7e2f5245dac420e295707be", + "45fecb2b40cc399ace227264e881d2009d467cd2", [ "webnn/conformance_tests/conv2d.https.any.html?cpu", { @@ -852058,7 +852914,7 @@ ] ], "conv_transpose2d.https.any.js": [ - "67ce5dbaf65cc99ba7f2fdd02aaf2d9b3e9022ce", + "a17df911e4482de7e49874d84f5818694515e722", [ "webnn/conformance_tests/conv_transpose2d.https.any.html?cpu", { @@ -856147,7 +857003,7 @@ ] ], "log.https.any.js": [ - "011beef53aca200f5916dc51152fe745866989ec", + "8ed807b3401330e961f2ae9721f6378147580ddd", [ "webnn/conformance_tests/log.https.any.html?cpu", { @@ -858136,7 +858992,7 @@ ] ], "pooling.https.any.js": [ - "f385aab1f154387bbe35b171927d29684c8d5120", + "8f81ff565d232dec427381dfdae638cffceb0d91", [ "webnn/conformance_tests/pooling.https.any.html?cpu", { @@ -858469,7 +859325,7 @@ ] ], "qdq_subgraph.https.any.js": [ - "3b59c3bb49d6441a77e83309f48a97dd982aea74", + "aa816cce7fb2cd3d0a3f81d0453c8c199bf052fe", [ "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu", { @@ -861811,7 +862667,7 @@ ] ], "sign.https.any.js": [ - "4c3a330f850ca591bcc5a1b9c8fc784469ee821e", + "004c03bdf1339d74a84c95d5b03b31b56876d0fe", [ "webnn/conformance_tests/sign.https.any.html?cpu", { @@ -881541,7 +882397,7 @@ ], "tentative": { "RTCEncodedAudioFrame-clone.https.html": [ - "9f07713d4439c676fd7a5cc2f7d32af92a350e19", + "c93f8b3e54150b94334c33f30031d0b9f3afcd19", [ null, { @@ -881550,7 +882406,7 @@ ] ], "RTCEncodedAudioFrame-metadata.https.html": [ - "435e1c067834fe2050fd5c510f95516c5e6aeb61", + "df4577c5614a82afd7b02d988d0f15caa3b9e848", [ null, { @@ -927344,7 +928200,7 @@ ] ], "user_contexts.py": [ - "64c261637342868e90ee67a2332503e00fa96b0d", + "fa1e748d6b2a91addeb6c0569ebd271c00865fb8", [ null, {} @@ -927424,28 +928280,35 @@ "emulation": { "set_geolocation_override": { "contexts.py": [ - "8a0e43475da52609a362bf5f3e0853ceb2a9725f", + "068bb804e73bd06e2d901363280792d479cfb38f", [ null, {} ] ], "coordinates.py": [ - "b23354e9e42ef1bdd9d6684d11b782ce15f4eb8c", + "ea4fe643c3ecfc6e3609172706b51df17456e2e7", + [ + null, + {} + ] + ], + "error.py": [ + "27c23dc7811458feb7cd43c8a286c83809d9d2d0", [ null, {} ] ], "invalid.py": [ - "e804848e0be6c483340dcd8b3b4def10dddedce9", + "2334d37517df00cde8f845e7ec6412d1570e405b", [ null, {} ] ], "user_contexts.py": [ - "008dee5698de43a3371c1f7d697bb69014cf1b65", + "b3038bb59587b661e75945c5b8eeb4e943c72d9e", [ null, {} diff --git a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini deleted file mode 100644 index 88bb87548ec..00000000000 --- a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini +++ /dev/null @@ -1,8 +0,0 @@ -[idlharness.https.any.html] - [idl_test setup] - expected: FAIL - - -[idlharness.https.any.worker.html] - [idl_test setup] - expected: FAIL diff --git a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini b/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini deleted file mode 100644 index a5cf5faf238..00000000000 --- a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[style-src-attr-blocked-src-allowed.html] - expected: TIMEOUT - [Should fire a security policy violation event] - expected: NOTRUN - - [The attribute style should not be applied] - expected: FAIL diff --git a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini b/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini deleted file mode 100644 index 979fc151f38..00000000000 --- a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[style-src-elem-allowed-attr-blocked.html] - expected: TIMEOUT - [Should fire a security policy violation for the attribute] - expected: NOTRUN - - [The attribute style should not be applied and the inline style should be applied] - expected: FAIL diff --git a/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini b/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini index 0c8111987c0..c99d7bd7844 100644 --- a/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini +++ b/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini @@ -1,13 +1,36 @@ [inline-style-allowed-while-cloning-objects.sub.html] - expected: TIMEOUT - [Test that violation report event was fired] - expected: NOTRUN + [non-HTML namespace] + expected: FAIL - [inline-style-allowed-while-cloning-objects 12] + [inline-style-allowed-while-cloning-objects 1] expected: FAIL - [inline-style-allowed-while-cloning-objects 14] + [inline-style-allowed-while-cloning-objects 3] expected: FAIL - [non-HTML namespace] + [inline-style-allowed-while-cloning-objects 5] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 7] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 8] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 9] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 10] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 11] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 17] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 18] + expected: FAIL + + [inline-style-allowed-while-cloning-objects 19] expected: FAIL diff --git a/tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini b/tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini deleted file mode 100644 index 92f00acdffe..00000000000 --- a/tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-style-attribute-blocked.sub.html] - [Expecting logs: ["violated-directive=style-src-attr","PASS"\]] - expected: FAIL diff --git a/tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini b/tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini deleted file mode 100644 index d910f28e56a..00000000000 --- a/tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[style-src-inline-style-attribute-blocked.html] - expected: TIMEOUT - [Inline style attribute should not be applied without 'unsafe-inline'] - expected: FAIL - - [Should fire a securitypolicyviolation event] - expected: NOTRUN diff --git a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini b/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini deleted file mode 100644 index 26dc98e8f62..00000000000 --- a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[style_attribute_denied_missing_unsafe_hashes.html] - expected: TIMEOUT - [Test that the inline style attribute is blocked] - expected: NOTRUN diff --git a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini b/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini deleted file mode 100644 index 3031a4f6f77..00000000000 --- a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[style_attribute_denied_wrong_hash.html] - expected: TIMEOUT - [Test that the inline style attribute is blocked] - expected: NOTRUN diff --git a/tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini b/tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini new file mode 100644 index 00000000000..1d8edacc4e1 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini @@ -0,0 +1,2 @@ +[flex-gap-decorations-022.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini new file mode 100644 index 00000000000..6198f1bf534 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-029.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini new file mode 100644 index 00000000000..76e055a6a0a --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-030.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini new file mode 100644 index 00000000000..d9765648ea7 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-031.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini new file mode 100644 index 00000000000..1e5a6bc2a68 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-032.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini new file mode 100644 index 00000000000..aaeff2efe72 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-033.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini new file mode 100644 index 00000000000..eb1f89bfb6d --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-38.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini b/tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini new file mode 100644 index 00000000000..b4d67fce3e3 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-017.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini b/tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini new file mode 100644 index 00000000000..02d385579b9 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini @@ -0,0 +1,9 @@ +[gap-decorations-col-rule-width.html] + [`column-rule-width` should be `0px` when `column-rule-style` is `none` with single value] + expected: FAIL + + [`column-rule-width` should be as specified regardless of `column-rule-style` with multiple values] + expected: FAIL + + [`column-rule-width` should be as specified regardless of `column-rule-style` with multiple (repeat) values] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini b/tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini new file mode 100644 index 00000000000..638b6c21891 --- /dev/null +++ b/tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini @@ -0,0 +1,2 @@ +[linear-gradient-body-sibling-index.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini b/tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini new file mode 100644 index 00000000000..d81ff383b17 --- /dev/null +++ b/tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini @@ -0,0 +1,2 @@ +[linear-gradient-sibling-index.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-mixins/dashed-function-cycles.tentative.html.ini b/tests/wpt/meta/css/css-mixins/dashed-function-cycles.html.ini index e16c79da6ad..7faf9c2b2e4 100644 --- a/tests/wpt/meta/css/css-mixins/dashed-function-cycles.tentative.html.ini +++ b/tests/wpt/meta/css/css-mixins/dashed-function-cycles.html.ini @@ -1,4 +1,4 @@ -[dashed-function-cycles.tentative.html] +[dashed-function-cycles.html] [Local with self-cycle] expected: FAIL @@ -11,7 +11,10 @@ [Local shadowing cyclic property --x] expected: FAIL - [Local shadowing cyclic outer local --x ] + [Local shadowing cyclic outer local --x] + expected: FAIL + + [Argument shadowing cyclic outer local --x] expected: FAIL [Arguments shadowing cyclic properties] @@ -53,6 +56,9 @@ [Cycle through local, other function] expected: FAIL + [Cycle through local, other function, fallback in function] + expected: FAIL + [Cycle through various variables and other functions] expected: FAIL @@ -62,15 +68,6 @@ [Cyclic defaults] expected: FAIL - [Local shadowing cyclic outer local --x] - expected: FAIL - - [Argument shadowing cyclic outer local --x] - expected: FAIL - - [Cycle through local, other function, fallback in function] - expected: FAIL - [Cyclic outer --b shadows custom property] expected: FAIL diff --git a/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini b/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini index 287f1c19314..3c65d9bcf19 100644 --- a/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini +++ b/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini @@ -10,3 +10,15 @@ [sibling-count() should not be allowed in @font-face descriptors] expected: FAIL + + [sibling-index() should not be allowed in @font-palette-values descriptors] + expected: FAIL + + [sibling-count() should not be allowed in @font-palette-values descriptors] + expected: FAIL + + [sibling-index() should not be allowed in @counter-style descriptors] + expected: FAIL + + [sibling-count() should not be allowed in @counter-style descriptors] + expected: FAIL diff --git a/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini new file mode 100644 index 00000000000..f61a6205280 --- /dev/null +++ b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini @@ -0,0 +1,6 @@ +[sibling-index-keyframe-length-value-dynamic.html] + [Initially, the sibling-index() is 2 for #target] + expected: FAIL + + [Removing a preceding sibling of #target reduces the sibling-index()] + expected: FAIL diff --git a/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini new file mode 100644 index 00000000000..df16c83f839 --- /dev/null +++ b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini @@ -0,0 +1,6 @@ +[sibling-index-keyframe-value-dynamic.html] + [Initially, the sibling-index() is 3 for #target] + expected: FAIL + + [Removing a preceding sibling of #target reduces the sibling-index()] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini new file mode 100644 index 00000000000..0e9b4a98ac4 --- /dev/null +++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini @@ -0,0 +1,15 @@ +[scrollIntoView-container.html] + [scrollIntoView() defaults to scrolling ancestors] + expected: FAIL + + [scrollIntoView({container: 'all'}) scrolls ancestors] + expected: FAIL + + [scrollIntoView({container: 'nearest'}) only scrolls nearest scroll container] + expected: FAIL + + [scrollIntoView({container: 'nearest'}) doesn't stop at itself] + expected: FAIL + + [scrollIntoView({container: 'nearest'}) doesn't propagate to outer frames] + expected: FAIL diff --git a/tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini b/tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini new file mode 100644 index 00000000000..128ff19f7aa --- /dev/null +++ b/tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-scale-transform.html] + expected: FAIL diff --git a/tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini b/tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini new file mode 100644 index 00000000000..cb607530097 --- /dev/null +++ b/tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini @@ -0,0 +1,6 @@ +[DOMMatrix-001.html] + [new DOMMatrix("scale(sign(1em))")] + expected: FAIL + + [new DOMMatrixReadOnly("scale(sign(1em))")] + expected: FAIL diff --git a/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini b/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini index 3369a3a2a49..5750c2948be 100644 --- a/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini +++ b/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini @@ -1,28 +1,22 @@ [webkit-animation-end-event.html] expected: TIMEOUT - [onanimationend and onwebkitanimationend are not aliases] - expected: FAIL - [dispatchEvent of a webkitAnimationEnd event does trigger a prefixed event handler or listener] expected: FAIL - [dispatchEvent of an animationend event does not trigger a prefixed event handler or listener] - expected: FAIL - [onwebkitanimationend event handler should trigger for an animation] - expected: FAIL + expected: TIMEOUT [onwebkitanimationend event handler should not trigger if an unprefixed event handler also exists] - expected: FAIL + expected: NOTRUN [onwebkitanimationend event handler should not trigger if an unprefixed listener also exists] - expected: FAIL + expected: NOTRUN [event types for prefixed and unprefixed animationend event handlers should be named appropriately] - expected: FAIL + expected: NOTRUN [webkitAnimationEnd event listener should trigger for an animation] - expected: TIMEOUT + expected: NOTRUN [webkitAnimationEnd event listener should not trigger if an unprefixed listener also exists] expected: NOTRUN diff --git a/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini b/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini index 880ef51e59d..233a98ed69b 100644 --- a/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini +++ b/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini @@ -1,28 +1,22 @@ [webkit-animation-iteration-event.html] expected: TIMEOUT - [onanimationiteration and onwebkitanimationiteration are not aliases] - expected: FAIL - [dispatchEvent of a webkitAnimationIteration event does trigger a prefixed event handler or listener] expected: FAIL - [dispatchEvent of an animationiteration event does not trigger a prefixed event handler or listener] - expected: FAIL - [onwebkitanimationiteration event handler should trigger for an animation] - expected: FAIL + expected: TIMEOUT [onwebkitanimationiteration event handler should not trigger if an unprefixed event handler also exists] - expected: FAIL + expected: NOTRUN [onwebkitanimationiteration event handler should not trigger if an unprefixed listener also exists] - expected: FAIL + expected: NOTRUN [event types for prefixed and unprefixed animationiteration event handlers should be named appropriately] - expected: FAIL + expected: NOTRUN [webkitAnimationIteration event listener should trigger for an animation] - expected: TIMEOUT + expected: NOTRUN [webkitAnimationIteration event listener should not trigger if an unprefixed listener also exists] expected: NOTRUN diff --git a/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini b/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini index ca7e2b96918..6e3e5febb82 100644 --- a/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini +++ b/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini @@ -1,4 +1,5 @@ [webkit-animation-start-event.html] + expected: TIMEOUT [onanimationstart and onwebkitanimationstart are not aliases] expected: FAIL @@ -8,32 +9,29 @@ [dispatchEvent of a webkitAnimationStart event does not trigger an unprefixed event handler or listener] expected: FAIL - [dispatchEvent of an animationstart event does not trigger a prefixed event handler or listener] - expected: FAIL - [onwebkitanimationstart event handler should trigger for an animation] - expected: FAIL + expected: TIMEOUT [onwebkitanimationstart event handler should not trigger if an unprefixed event handler also exists] - expected: FAIL + expected: NOTRUN [onwebkitanimationstart event handler should not trigger if an unprefixed listener also exists] - expected: FAIL + expected: NOTRUN [event types for prefixed and unprefixed animationstart event handlers should be named appropriately] - expected: FAIL + expected: NOTRUN [webkitAnimationStart event listener should trigger for an animation] - expected: FAIL + expected: NOTRUN [webkitAnimationStart event listener should not trigger if an unprefixed listener also exists] - expected: FAIL + expected: NOTRUN [webkitAnimationStart event listener should not trigger if an unprefixed event handler also exists] - expected: FAIL + expected: NOTRUN [event types for prefixed and unprefixed animationstart event listeners should be named appropriately] - expected: FAIL + expected: NOTRUN [webkitAnimationStart event listener is case sensitive] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini b/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini index b7fe8688a23..d1d6814c761 100644 --- a/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini +++ b/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini @@ -1,27 +1,15 @@ [webkit-transition-end-event.html] - [dispatchEvent of an transitionend event does not trigger a prefixed event handler or listener] - expected: FAIL - [onwebkittransitionend event handler should trigger for an animation] expected: FAIL - [onwebkittransitionend event handler should not trigger if an unprefixed listener also exists] - expected: FAIL - [event types for prefixed and unprefixed transitionend event handlers should be named appropriately] expected: FAIL [event types for prefixed and unprefixed transitionend event listeners should be named appropriately] expected: FAIL - [ontransitionend and onwebkittransitionend are not aliases] - expected: FAIL - [webkitTransitionEnd event listener should trigger for an animation] expected: FAIL [dispatchEvent of a webkitTransitionEnd event does trigger a prefixed event handler or listener] expected: FAIL - - [onwebkittransitionend event handler should not trigger if an unprefixed event handler also exists] - expected: FAIL diff --git a/tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini b/tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini new file mode 100644 index 00000000000..5e3ad18d789 --- /dev/null +++ b/tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini @@ -0,0 +1,3 @@ +[pragma-no-cache-with-cache-control.html] + [Response with Cache-Control: max-age=2592000, public and Pragma: no-cache should be cached] + expected: FAIL diff --git a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini index a02fcf871ab..12a2314e747 100644 --- a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini +++ b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini @@ -52,3 +52,6 @@ [sec-fetch-storage-access - Cross-site] expected: FAIL + + [sec-fetch-user] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini index 2241163d563..6313c3e33dd 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini @@ -2,8 +2,5 @@ [window.open] expected: FAIL - [form submission] - expected: FAIL - [link click] expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini index 5f9a07f92f0..277436ffad2 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini @@ -1,6 +1,3 @@ [iframe-src-aboutblank-navigate-immediately.html] [Navigating to a different document with window.open] expected: FAIL - - [Navigating to a different document with form submission] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini new file mode 100644 index 00000000000..60a4fa51f8a --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini @@ -0,0 +1,3 @@ +[a-click.html] + [aElement.click() before the load event must NOT replace] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini deleted file mode 100644 index 6e8c7d20d83..00000000000 --- a/tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[scroll-to-top.html] - [Fragment Navigation: When fragid is TOP scroll to the top of the document] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini index a03a8322165..7a5fcb79165 100644 --- a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini +++ b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini @@ -1,3 +1,3 @@ -[traverse_the_history_3.html] +[traverse_the_history_5.html] [Multiple history traversals, last would be aborted] expected: FAIL diff --git a/tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini b/tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini new file mode 100644 index 00000000000..6907354e049 --- /dev/null +++ b/tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini @@ -0,0 +1,7 @@ +[named-lookup-noopener.html] + expected: TIMEOUT + [Two noopener window.open() calls create separate windows] + expected: TIMEOUT + + [Two rel=noopener <a href> clicks create separate windows] + expected: NOTRUN diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini index 8daf97ba765..673fc1e4ffd 100644 --- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini +++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini @@ -1,5 +1,5 @@ [createImageBitmap-invalid-args.html] - expected: TIMEOUT + expected: ERROR [createImageBitmap with a vector HTMLImageElement source and sw set to 0] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini index 7e036a1c4e4..5d2657041d1 100644 --- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini +++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini @@ -1,5 +1,5 @@ [createImageBitmap-transfer.html] - expected: TIMEOUT + expected: ERROR [Transfer ImageBitmap created from a vector HTMLImageElement] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini new file mode 100644 index 00000000000..5cdcce07c65 --- /dev/null +++ b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.disconnected.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini b/tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini deleted file mode 100644 index 1a3c292f9f2..00000000000 --- a/tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[2d.imageData.object.ctor.basics.html] - [Testing different type of ImageData constructor] - expected: FAIL diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini index 25375c6ea47..311e3abaf15 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -1657,48 +1657,27 @@ [Window interface: window must inherit property "external" with the proper type] expected: FAIL - [Window interface: attribute onwebkitanimationstart] - expected: FAIL - [Window interface: window must inherit property "statusbar" with the proper type] expected: FAIL - [Document interface: new Document() must inherit property "onwebkittransitionend" with the proper type] - expected: FAIL - [Document interface: calling queryCommandEnabled(DOMString) on documentWithHandlers with too few arguments must throw TypeError] expected: FAIL - [Document interface: new Document() must inherit property "onwebkitanimationstart" with the proper type] - expected: FAIL - [Document interface: calling queryCommandIndeterm(DOMString) on documentWithHandlers with too few arguments must throw TypeError] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onwebkitanimationend" with the proper type] - expected: FAIL - [Document interface: iframe.contentDocument must inherit property "dir" with the proper type] expected: FAIL - [Window interface: window must inherit property "onwebkitanimationiteration" with the proper type] - expected: FAIL - [Window interface: window must inherit property "applicationCache" with the proper type] expected: FAIL - [Document interface: attribute onauxclick] - expected: FAIL - [Window interface: window must inherit property "menubar" with the proper type] expected: FAIL [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false] expected: FAIL - [Document interface: new Document() must inherit property "onwebkitanimationiteration" with the proper type] - expected: FAIL - [Document interface: attribute designMode] expected: FAIL @@ -1714,9 +1693,6 @@ [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on new Document() with too few arguments must throw TypeError] expected: FAIL - [Document interface: attribute onwebkitanimationiteration] - expected: FAIL - [Document interface: operation queryCommandEnabled(DOMString)] expected: FAIL @@ -1741,42 +1717,24 @@ [Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type] expected: FAIL - [Document interface: documentWithHandlers must inherit property "onslotchange" with the proper type] - expected: FAIL - [Document interface: documentWithHandlers must inherit property "alinkColor" with the proper type] expected: FAIL [Document interface: documentWithHandlers must inherit property "dir" with the proper type] expected: FAIL - [Window interface: window must inherit property "onslotchange" with the proper type] - expected: FAIL - [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique] expected: FAIL [Window interface: attribute applicationCache] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onwebkitanimationstart" with the proper type] - expected: FAIL - - [Document interface: attribute onslotchange] - expected: FAIL - [Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError] expected: FAIL [Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onwebkitanimationiteration" with the proper type] - expected: FAIL - - [Document interface: attribute onwebkittransitionend] - expected: FAIL - [Document interface: iframe.contentDocument must inherit property "all" with the proper type] expected: FAIL @@ -1789,9 +1747,6 @@ [Document interface: attribute linkColor] expected: FAIL - [Window interface: attribute onwebkitanimationiteration] - expected: FAIL - [Window interface: window must inherit property "scrollbars" with the proper type] expected: FAIL @@ -1807,18 +1762,12 @@ [Document interface: iframe.contentDocument must inherit property "designMode" with the proper type] expected: FAIL - [Document interface: documentWithHandlers must inherit property "onwebkitanimationiteration" with the proper type] - expected: FAIL - [Window interface: attribute toolbar] expected: FAIL [Window interface: attribute statusbar] expected: FAIL - [Window interface: window must inherit property "onwebkittransitionend" with the proper type] - expected: FAIL - [Document interface: new Document() must inherit property "linkColor" with the proper type] expected: FAIL @@ -1828,15 +1777,9 @@ [Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type] expected: FAIL - [Window interface: attribute onwebkittransitionend] - expected: FAIL - [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on iframe.contentDocument with too few arguments must throw TypeError] expected: FAIL - [Document interface: new Document() must inherit property "onslotchange" with the proper type] - expected: FAIL - [Document interface: documentWithHandlers must inherit property "designMode" with the proper type] expected: FAIL @@ -1855,9 +1798,6 @@ [Window interface: window must inherit property "personalbar" with the proper type] expected: FAIL - [Document interface: attribute onwebkitanimationend] - expected: FAIL - [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError] expected: FAIL @@ -1882,24 +1822,15 @@ [Document interface: attribute vlinkColor] expected: FAIL - [Window interface: window must inherit property "onauxclick" with the proper type] - expected: FAIL - [Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onslotchange" with the proper type] - expected: FAIL - [Document interface: new Document() must inherit property "alinkColor" with the proper type] expected: FAIL [Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type] expected: FAIL - [Window interface: attribute onslotchange] - expected: FAIL - [Document interface: new Document() must inherit property "all" with the proper type] expected: FAIL @@ -1909,24 +1840,6 @@ [Window interface: window must inherit property "print()" with the proper type] expected: FAIL - [Document interface: documentWithHandlers must inherit property "onauxclick" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "onwebkitanimationend" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "onauxclick" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "onwebkitanimationstart" with the proper type] - expected: FAIL - - [Document interface: attribute onwebkitanimationstart] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type] - expected: FAIL - [Document interface: calling queryCommandValue(DOMString) on documentWithHandlers with too few arguments must throw TypeError] expected: FAIL @@ -1939,9 +1852,6 @@ [Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError] expected: FAIL - [Window interface: attribute onauxclick] - expected: FAIL - [Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type] expected: FAIL @@ -1954,48 +1864,30 @@ [Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type] expected: FAIL - [Window interface: window must inherit property "onwebkitanimationend" with the proper type] - expected: FAIL - [Window interface: window must inherit property "toolbar" with the proper type] expected: FAIL [Document interface: documentWithHandlers must inherit property "linkColor" with the proper type] expected: FAIL - [Document interface: new Document() must inherit property "onwebkitanimationend" with the proper type] - expected: FAIL - [Document interface: operation queryCommandIndeterm(DOMString)] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onwebkittransitionend" with the proper type] - expected: FAIL - [Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError] expected: FAIL - [Window interface: attribute onwebkitanimationend] - expected: FAIL - [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on documentWithHandlers with too few arguments must throw TypeError] expected: FAIL [Document interface: documentWithHandlers must inherit property "queryCommandState(DOMString)" with the proper type] expected: FAIL - [Document interface: documentWithHandlers must inherit property "onwebkittransitionend" with the proper type] - expected: FAIL - [Document interface: new Document() must inherit property "vlinkColor" with the proper type] expected: FAIL [Window interface: window must inherit property "locationbar" with the proper type] expected: FAIL - [Window interface: window must inherit property "onwebkitanimationstart" with the proper type] - expected: FAIL - [Document interface: documentWithHandlers must inherit property "queryCommandIndeterm(DOMString)" with the proper type] expected: FAIL @@ -2023,24 +1915,12 @@ [Window interface: attribute clientInformation] expected: FAIL - [Window interface: attribute oncontextlost] - expected: FAIL - - [Window interface: attribute oncontextrestored] - expected: FAIL - [Window interface: operation reportError(any)] expected: FAIL [Window interface: window must inherit property "clientInformation" with the proper type] expected: FAIL - [Window interface: window must inherit property "oncontextlost" with the proper type] - expected: FAIL - - [Window interface: window must inherit property "oncontextrestored" with the proper type] - expected: FAIL - [Window interface: window must inherit property "reportError(any)" with the proper type] expected: FAIL @@ -2050,129 +1930,15 @@ [Document interface: attribute onvisibilitychange] expected: FAIL - [Document interface: attribute oncontextlost] - expected: FAIL - - [Document interface: attribute oncontextrestored] - expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onvisibilitychange" with the proper type] expected: FAIL - [Document interface: iframe.contentDocument must inherit property "oncontextlost" with the proper type] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "oncontextrestored" with the proper type] - expected: FAIL - [Document interface: new Document() must inherit property "onvisibilitychange" with the proper type] expected: FAIL - [Document interface: new Document() must inherit property "oncontextlost" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "oncontextrestored" with the proper type] - expected: FAIL - [Document interface: documentWithHandlers must inherit property "onvisibilitychange" with the proper type] expected: FAIL - [Document interface: documentWithHandlers must inherit property "oncontextlost" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "oncontextrestored" with the proper type] - expected: FAIL - - [Window interface: attribute onbeforeinput] - expected: FAIL - - [Window interface: attribute onbeforematch] - expected: FAIL - - [Window interface: attribute onscrollend] - expected: FAIL - - [Window interface: window must inherit property "onbeforeinput" with the proper type] - expected: FAIL - - [Window interface: window must inherit property "onbeforematch" with the proper type] - expected: FAIL - - [Window interface: window must inherit property "onscrollend" with the proper type] - expected: FAIL - - [Document interface: attribute onbeforeinput] - expected: FAIL - - [Document interface: attribute onbeforematch] - expected: FAIL - - [Document interface: attribute onscrollend] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "onbeforeinput" with the proper type] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "onbeforematch" with the proper type] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "onscrollend" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "onbeforeinput" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "onbeforematch" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "onscrollend" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "onbeforeinput" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "onbeforematch" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "onscrollend" with the proper type] - expected: FAIL - - [Window interface: attribute oncopy] - expected: FAIL - - [Window interface: attribute oncut] - expected: FAIL - - [Window interface: attribute onpaste] - expected: FAIL - - [Window interface: window must inherit property "oncopy" with the proper type] - expected: FAIL - - [Window interface: window must inherit property "oncut" with the proper type] - expected: FAIL - - [Window interface: window must inherit property "onpaste" with the proper type] - expected: FAIL - - [Window interface: attribute onbeforetoggle] - expected: FAIL - - [Window interface: window must inherit property "onbeforetoggle" with the proper type] - expected: FAIL - - [Document interface: attribute onbeforetoggle] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "onbeforetoggle" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "onbeforetoggle" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "onbeforetoggle" with the proper type] - expected: FAIL - [Window interface: attribute navigation] expected: FAIL @@ -2191,18 +1957,6 @@ [Document interface: calling parseHTMLUnsafe(DOMString) on documentWithHandlers with too few arguments must throw TypeError] expected: FAIL - [Window interface: attribute onpagereveal] - expected: FAIL - - [Window interface: window must inherit property "onpagereveal" with the proper type] - expected: FAIL - - [Window interface: attribute onpageswap] - expected: FAIL - - [Window interface: window must inherit property "onpageswap" with the proper type] - expected: FAIL - [Document interface: operation parseHTMLUnsafe(HTMLString)] expected: FAIL @@ -2227,24 +1981,6 @@ [Document interface: calling parseHTMLUnsafe((TrustedHTML or DOMString)) on documentWithHandlers with too few arguments must throw TypeError] expected: FAIL - [Window interface: attribute oncommand] - expected: FAIL - - [Window interface: window must inherit property "oncommand" with the proper type] - expected: FAIL - - [Document interface: attribute oncommand] - expected: FAIL - - [Document interface: iframe.contentDocument must inherit property "oncommand" with the proper type] - expected: FAIL - - [Document interface: new Document() must inherit property "oncommand" with the proper type] - expected: FAIL - - [Document interface: documentWithHandlers must inherit property "oncommand" with the proper type] - expected: FAIL - [idlharness.https.html?include=HTML.*] [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type] @@ -2610,12 +2346,6 @@ [HTMLImageElement interface: document.createElement("img") must inherit property "decoding" with the proper type] expected: FAIL - [HTMLElement interface: attribute onwebkitanimationiteration] - expected: FAIL - - [HTMLElement interface: attribute onslotchange] - expected: FAIL - [HTMLVideoElement interface: attribute width] expected: FAIL @@ -2727,9 +2457,6 @@ [HTMLAnchorElement interface: attribute type] expected: FAIL - [HTMLElement interface: attribute onwebkitanimationend] - expected: FAIL - [HTMLInputElement interface: attribute height] expected: FAIL @@ -2949,9 +2676,6 @@ [HTMLElement interface: attribute tabIndex] expected: FAIL - [HTMLElement interface: attribute onwebkitanimationstart] - expected: FAIL - [HTMLImageElement interface: new Image() must inherit property "loading" with the proper type] expected: FAIL @@ -3639,9 +3363,6 @@ [HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type] expected: FAIL - [HTMLElement interface: attribute onwebkittransitionend] - expected: FAIL - [HTMLLinkElement interface: document.createElement("link") must inherit property "imageSrcset" with the proper type] expected: FAIL @@ -3945,12 +3666,6 @@ [HTMLSlotElement interface: calling assign((Element or Text)...) on document.createElement("slot") with too few arguments must throw TypeError] expected: FAIL - [HTMLElement interface: attribute oncontextlost] - expected: FAIL - - [HTMLElement interface: attribute oncontextrestored] - expected: FAIL - [HTMLElement interface: document.createElement("noscript") must inherit property "oncontextlost" with the proper type] expected: FAIL @@ -4044,15 +3759,6 @@ [HTMLElement interface: attribute inert] expected: FAIL - [HTMLElement interface: attribute onbeforeinput] - expected: FAIL - - [HTMLElement interface: attribute onbeforematch] - expected: FAIL - - [HTMLElement interface: attribute onscrollend] - expected: FAIL - [HTMLElement interface: document.createElement("noscript") must inherit property "inert" with the proper type] expected: FAIL @@ -4317,36 +4023,12 @@ [HTMLSelectElement interface: document.createElement("select") must inherit property "showPicker()" with the proper type] expected: FAIL - [HTMLBodyElement interface: attribute onpagereveal] - expected: FAIL - - [HTMLBodyElement interface: document.createElement("body") must inherit property "onpagereveal" with the proper type] - expected: FAIL - - [HTMLFrameSetElement interface: attribute onpagereveal] - expected: FAIL - - [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagereveal" with the proper type] - expected: FAIL - [HTMLTemplateElement interface: attribute shadowRootClonable] expected: FAIL [HTMLTemplateElement interface: document.createElement("template") must inherit property "shadowRootClonable" with the proper type] expected: FAIL - [HTMLBodyElement interface: attribute onpageswap] - expected: FAIL - - [HTMLBodyElement interface: document.createElement("body") must inherit property "onpageswap" with the proper type] - expected: FAIL - - [HTMLFrameSetElement interface: attribute onpageswap] - expected: FAIL - - [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type] - expected: FAIL - [HTMLElement interface: attribute writingSuggestions] expected: FAIL @@ -5866,42 +5548,6 @@ [HTMLElement interface: attribute popover] expected: FAIL - [HTMLElement interface: attribute onauxclick] - expected: FAIL - - [HTMLElement interface: attribute onbeforeinput] - expected: FAIL - - [HTMLElement interface: attribute onbeforematch] - expected: FAIL - - [HTMLElement interface: attribute onbeforetoggle] - expected: FAIL - - [HTMLElement interface: attribute oncontextlost] - expected: FAIL - - [HTMLElement interface: attribute oncontextrestored] - expected: FAIL - - [HTMLElement interface: attribute onscrollend] - expected: FAIL - - [HTMLElement interface: attribute onslotchange] - expected: FAIL - - [HTMLElement interface: attribute onwebkitanimationend] - expected: FAIL - - [HTMLElement interface: attribute onwebkitanimationiteration] - expected: FAIL - - [HTMLElement interface: attribute onwebkitanimationstart] - expected: FAIL - - [HTMLElement interface: attribute onwebkittransitionend] - expected: FAIL - [HTMLElement interface: attribute enterKeyHint] expected: FAIL @@ -5950,42 +5596,6 @@ [HTMLElement interface: document.createElement("noscript") must inherit property "popover" with the proper type] expected: FAIL - [HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforeinput" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforematch" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforetoggle" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "oncontextlost" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "oncontextrestored" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onscrollend" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationend" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" with the proper type] - expected: FAIL - [HTMLElement interface: document.createElement("noscript") must inherit property "enterKeyHint" with the proper type] expected: FAIL @@ -6064,12 +5674,6 @@ [HTMLBodyElement interface: attribute aLink] expected: FAIL - [HTMLBodyElement interface: attribute onpagereveal] - expected: FAIL - - [HTMLBodyElement interface: attribute onpageswap] - expected: FAIL - [HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type] expected: FAIL @@ -6079,12 +5683,6 @@ [HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type] expected: FAIL - [HTMLBodyElement interface: document.createElement("body") must inherit property "onpagereveal" with the proper type] - expected: FAIL - - [HTMLBodyElement interface: document.createElement("body") must inherit property "onpageswap" with the proper type] - expected: FAIL - [HTMLHeadingElement interface: attribute align] expected: FAIL @@ -7681,24 +7279,12 @@ [HTMLFrameSetElement interface: attribute rows] expected: FAIL - [HTMLFrameSetElement interface: attribute onpagereveal] - expected: FAIL - - [HTMLFrameSetElement interface: attribute onpageswap] - expected: FAIL - [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type] expected: FAIL [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type] expected: FAIL - [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagereveal" with the proper type] - expected: FAIL - - [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type] - expected: FAIL - [HTMLFrameElement interface: attribute name] expected: FAIL @@ -7813,12 +7399,6 @@ [HTMLDialogElement interface: operation requestClose(optional DOMString)] expected: FAIL - [HTMLElement interface: attribute oncommand] - expected: FAIL - - [HTMLElement interface: document.createElement("noscript") must inherit property "oncommand" with the proper type] - expected: FAIL - [HTMLButtonElement interface: attribute command] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index 6a420504feb..7da2bc5ac80 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_escaping-3.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index bbc1f35d8d9..e8872b3585b 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_nonescaping-1.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index d5fd800f09d..ff6467094b8 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-3.html] - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini deleted file mode 100644 index 7682a4830bf..00000000000 --- a/tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[reparent-form-during-planned-navigation-task.html] - expected: TIMEOUT - [reparent-form-during-planned-navigation-task] - expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini index 1abe0eb8b88..320f8cf856c 100644 --- a/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini +++ b/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini @@ -181,3 +181,6 @@ [text/plain: non-ASCII in filename (formdata event)] expected: FAIL + + [text/plain: 0x00 in name (normal form)] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini index 095b97aa5a0..8dba4e9c469 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini @@ -5,9 +5,6 @@ [Different blob URLs pointing to the same blob resolve to different modules] expected: FAIL - [Revoking a blob URL immediately after calling import will not fail] - expected: FAIL - [blob-url.any.worker-module.html] expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini b/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini index bf4c7b0b9c9..3a75e5ee0ee 100644 --- a/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini +++ b/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini @@ -1,6 +1,3 @@ [button-event-dispatch-content-attribute.html] [oncommand content attribute works] expected: FAIL - - [oncommand content with a value of false prevents default] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini b/tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini deleted file mode 100644 index 45513bfcfe5..00000000000 --- a/tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[interesttarget-outline-appearance.tentative.html] - expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini index cd77f908ffb..4d4bbb8a39e 100644 --- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini +++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini @@ -11,9 +11,6 @@ [onauxclick: the default value must be null] expected: FAIL - [onauxclick: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onblur: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL @@ -62,9 +59,6 @@ [oncontextlost: the default value must be null] expected: FAIL - [oncontextlost: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [oncontextmenu: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL @@ -77,9 +71,6 @@ [oncontextrestored: the default value must be null] expected: FAIL - [oncontextrestored: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [oncuechange: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL @@ -338,9 +329,6 @@ [onslotchange: the default value must be null] expected: FAIL - [onslotchange: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onstalled: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL @@ -389,9 +377,6 @@ [onwebkitanimationend: the default value must be null] expected: FAIL - [onwebkitanimationend: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onwebkitanimationend: the content attribute must execute when an event is dispatched] expected: FAIL @@ -401,9 +386,6 @@ [onwebkitanimationiteration: the default value must be null] expected: FAIL - [onwebkitanimationiteration: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onwebkitanimationiteration: the content attribute must execute when an event is dispatched] expected: FAIL @@ -413,9 +395,6 @@ [onwebkitanimationstart: the default value must be null] expected: FAIL - [onwebkitanimationstart: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onwebkitanimationstart: the content attribute must execute when an event is dispatched] expected: FAIL @@ -425,9 +404,6 @@ [onwebkittransitionend: the default value must be null] expected: FAIL - [onwebkittransitionend: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onwebkittransitionend: the content attribute must execute when an event is dispatched] expected: FAIL @@ -443,27 +419,18 @@ [onbeforeinput: the default value must be null] expected: FAIL - [onbeforeinput: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onbeforematch: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL [onbeforematch: the default value must be null] expected: FAIL - [onbeforematch: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [onscrollend: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL [onscrollend: the default value must be null] expected: FAIL - [onscrollend: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - [oncopy: must be on the appropriate locations for GlobalEventHandlers] expected: FAIL @@ -488,33 +455,6 @@ [onbeforetoggle: the default value must be null] expected: FAIL - [onbeforetoggle: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - - [onauxclick: dispatching an Event at a <meta> element must trigger element.onauxclick] - expected: FAIL - - [onbeforeinput: dispatching an Event at a <meta> element must trigger element.onbeforeinput] - expected: FAIL - - [onbeforematch: dispatching an Event at a <meta> element must trigger element.onbeforematch] - expected: FAIL - - [onbeforetoggle: dispatching an Event at a <meta> element must trigger element.onbeforetoggle] - expected: FAIL - - [oncontextlost: dispatching an Event at a <meta> element must trigger element.oncontextlost] - expected: FAIL - - [oncontextrestored: dispatching an Event at a <meta> element must trigger element.oncontextrestored] - expected: FAIL - - [onscrollend: dispatching an Event at a <meta> element must trigger element.onscrollend] - expected: FAIL - - [onslotchange: dispatching an Event at a <meta> element must trigger element.onslotchange] - expected: FAIL - [onwebkitanimationend: dispatching an Event at a <meta> element must trigger element.onwebkitanimationend] expected: FAIL @@ -532,9 +472,3 @@ [oncommand: the default value must be null] expected: FAIL - - [oncommand: the content attribute must be compiled into a function as the corresponding property] - expected: FAIL - - [oncommand: dispatching an Event at a <meta> element must trigger element.oncommand] - expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini index deec7c5c132..3b3a37ff7c2 100644 --- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini +++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini @@ -1,181 +1,19 @@ [event-handler-attributes-body-window.html] - [not shadowed auxclick (document.body)] - expected: FAIL - - [not shadowed contextlost (document.body)] - expected: FAIL - - [not shadowed contextrestored (document.body)] - expected: FAIL - - [not shadowed slotchange (document.body)] - expected: FAIL - - [not shadowed webkitanimationend (document.body)] - expected: FAIL - - [not shadowed webkitanimationiteration (document.body)] - expected: FAIL - - [not shadowed webkitanimationstart (document.body)] - expected: FAIL - - [not shadowed webkittransitionend (document.body)] - expected: FAIL - - [not shadowed copy (document.body)] - expected: FAIL - - [not shadowed cut (document.body)] - expected: FAIL - - [not shadowed paste (document.body)] - expected: FAIL - - [not shadowed auxclick (document.createElement("body"))] - expected: FAIL - - [not shadowed contextlost (document.createElement("body"))] - expected: FAIL - - [not shadowed contextrestored (document.createElement("body"))] - expected: FAIL - - [not shadowed slotchange (document.createElement("body"))] - expected: FAIL - - [not shadowed webkitanimationend (document.createElement("body"))] - expected: FAIL - - [not shadowed webkitanimationiteration (document.createElement("body"))] - expected: FAIL - - [not shadowed webkitanimationstart (document.createElement("body"))] - expected: FAIL - - [not shadowed webkittransitionend (document.createElement("body"))] - expected: FAIL - - [not shadowed copy (document.createElement("body"))] - expected: FAIL - - [not shadowed cut (document.createElement("body"))] - expected: FAIL - - [not shadowed paste (document.createElement("body"))] - expected: FAIL - - [not shadowed auxclick (window)] - expected: FAIL - - [not shadowed contextlost (window)] - expected: FAIL - - [not shadowed contextrestored (window)] - expected: FAIL - - [not shadowed slotchange (window)] - expected: FAIL - - [not shadowed webkitanimationend (window)] - expected: FAIL - - [not shadowed webkitanimationiteration (window)] - expected: FAIL - - [not shadowed webkitanimationstart (window)] - expected: FAIL - - [not shadowed webkittransitionend (window)] - expected: FAIL - - [not shadowed beforeinput (document.body)] - expected: FAIL - - [not shadowed beforematch (document.body)] - expected: FAIL - - [not shadowed scrollend (document.body)] - expected: FAIL - - [not shadowed beforeinput (document.createElement("body"))] - expected: FAIL - - [not shadowed beforematch (document.createElement("body"))] - expected: FAIL - - [not shadowed scrollend (document.createElement("body"))] - expected: FAIL - - [not shadowed beforeinput (window)] - expected: FAIL - - [not shadowed beforematch (window)] - expected: FAIL - - [not shadowed scrollend (window)] - expected: FAIL - - [not shadowed beforetoggle (document.body)] - expected: FAIL - - [not shadowed beforetoggle (document.createElement("body"))] - expected: FAIL - - [not shadowed beforetoggle (window)] - expected: FAIL - - [shadowed pagereveal (document.body)] - expected: FAIL - - [shadowed pagereveal removal (document.body)] - expected: FAIL - - [shadowed pagereveal (document.createElement("body"))] - expected: FAIL - [shadowed pagereveal removal (document.createElement("body"))] expected: FAIL - [shadowed pagereveal (window)] - expected: FAIL - [shadowed pagereveal removal (window)] expected: FAIL - [shadowed pageswap (document.body)] - expected: FAIL - - [shadowed pageswap removal (document.body)] - expected: FAIL - - [shadowed pageswap (document.createElement("body"))] - expected: FAIL - [shadowed pageswap removal (document.createElement("body"))] expected: FAIL - [shadowed pageswap (window)] - expected: FAIL - [shadowed pageswap removal (window)] expected: FAIL [shadowed blur on body fires when event dispatched on window] expected: FAIL - [shadowed messageerror on body fires when event dispatched on window] - expected: FAIL - - [shadowed pagereveal on body fires when event dispatched on window] - expected: FAIL - - [shadowed pageswap on body fires when event dispatched on window] - expected: FAIL - - [shadowed rejectionhandled on body fires when event dispatched on window] - expected: FAIL - [shadowed focus removal (document.createElement("body"))] expected: FAIL @@ -206,6 +44,9 @@ [shadowed message removal (document.createElement("body"))] expected: FAIL + [shadowed messageerror removal (document.createElement("body"))] + expected: FAIL + [shadowed offline removal (document.createElement("body"))] expected: FAIL @@ -233,6 +74,9 @@ [shadowed load removal (window)] expected: FAIL + [shadowed rejectionhandled removal (document.createElement("body"))] + expected: FAIL + [shadowed resize removal (window)] expected: FAIL @@ -257,6 +101,9 @@ [shadowed message removal (window)] expected: FAIL + [shadowed messageerror removal (window)] + expected: FAIL + [shadowed offline removal (window)] expected: FAIL @@ -272,17 +119,11 @@ [shadowed popstate removal (window)] expected: FAIL - [shadowed storage removal (window)] + [shadowed rejectionhandled removal (window)] expected: FAIL - [shadowed unload removal (window)] - expected: FAIL - - [not shadowed command (document.body)] - expected: FAIL - - [not shadowed command (document.createElement("body"))] + [shadowed storage removal (window)] expected: FAIL - [not shadowed command (window)] + [shadowed unload removal (window)] expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini index 4484356912c..b18a8cf6d5b 100644 --- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini +++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini @@ -1,166 +1,4 @@ [event-handler-attributes-frameset-window.html] - [not shadowed auxclick (document.body)] - expected: FAIL - - [not shadowed contextlost (document.body)] - expected: FAIL - - [not shadowed contextrestored (document.body)] - expected: FAIL - - [not shadowed slotchange (document.body)] - expected: FAIL - - [not shadowed webkitanimationend (document.body)] - expected: FAIL - - [not shadowed webkitanimationiteration (document.body)] - expected: FAIL - - [not shadowed webkitanimationstart (document.body)] - expected: FAIL - - [not shadowed webkittransitionend (document.body)] - expected: FAIL - - [not shadowed copy (document.body)] - expected: FAIL - - [not shadowed cut (document.body)] - expected: FAIL - - [not shadowed paste (document.body)] - expected: FAIL - - [not shadowed auxclick (document.createElement("frameset"))] - expected: FAIL - - [not shadowed contextlost (document.createElement("frameset"))] - expected: FAIL - - [not shadowed contextrestored (document.createElement("frameset"))] - expected: FAIL - - [not shadowed slotchange (document.createElement("frameset"))] - expected: FAIL - - [not shadowed webkitanimationend (document.createElement("frameset"))] - expected: FAIL - - [not shadowed webkitanimationiteration (document.createElement("frameset"))] - expected: FAIL - - [not shadowed webkitanimationstart (document.createElement("frameset"))] - expected: FAIL - - [not shadowed webkittransitionend (document.createElement("frameset"))] - expected: FAIL - - [not shadowed copy (document.createElement("frameset"))] - expected: FAIL - - [not shadowed cut (document.createElement("frameset"))] - expected: FAIL - - [not shadowed paste (document.createElement("frameset"))] - expected: FAIL - - [not shadowed auxclick (window)] - expected: FAIL - - [not shadowed contextlost (window)] - expected: FAIL - - [not shadowed contextrestored (window)] - expected: FAIL - - [not shadowed slotchange (window)] - expected: FAIL - - [not shadowed webkitanimationend (window)] - expected: FAIL - - [not shadowed webkitanimationiteration (window)] - expected: FAIL - - [not shadowed webkitanimationstart (window)] - expected: FAIL - - [not shadowed webkittransitionend (window)] - expected: FAIL - - [not shadowed beforeinput (document.body)] - expected: FAIL - - [not shadowed beforematch (document.body)] - expected: FAIL - - [not shadowed scrollend (document.body)] - expected: FAIL - - [not shadowed beforeinput (document.createElement("frameset"))] - expected: FAIL - - [not shadowed beforematch (document.createElement("frameset"))] - expected: FAIL - - [not shadowed scrollend (document.createElement("frameset"))] - expected: FAIL - - [not shadowed beforeinput (window)] - expected: FAIL - - [not shadowed beforematch (window)] - expected: FAIL - - [not shadowed scrollend (window)] - expected: FAIL - - [not shadowed beforetoggle (document.body)] - expected: FAIL - - [not shadowed beforetoggle (document.createElement("frameset"))] - expected: FAIL - - [not shadowed beforetoggle (window)] - expected: FAIL - - [shadowed pagereveal (document.body)] - expected: FAIL - - [shadowed pagereveal removal (document.body)] - expected: FAIL - - [shadowed pagereveal (document.createElement("frameset"))] - expected: FAIL - - [shadowed pagereveal removal (document.createElement("frameset"))] - expected: FAIL - - [shadowed pagereveal (window)] - expected: FAIL - - [shadowed pagereveal removal (window)] - expected: FAIL - - [shadowed pageswap (document.body)] - expected: FAIL - - [shadowed pageswap removal (document.body)] - expected: FAIL - - [shadowed pageswap (document.createElement("frameset"))] - expected: FAIL - - [shadowed pageswap removal (document.createElement("frameset"))] - expected: FAIL - - [shadowed pageswap (window)] - expected: FAIL - - [shadowed pageswap removal (window)] - expected: FAIL - [shadowed blur on body fires when event dispatched on window] expected: FAIL @@ -226,12 +64,3 @@ [shadowed unload on body fires when event dispatched on window] expected: FAIL - - [not shadowed command (document.body)] - expected: FAIL - - [not shadowed command (document.createElement("frameset"))] - expected: FAIL - - [not shadowed command (window)] - expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini deleted file mode 100644 index db4d6e3321d..00000000000 --- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini +++ /dev/null @@ -1,102 +0,0 @@ -[event-handler-attributes-windowless-body.html] - [auxclick is unaffected on a windowless body] - expected: FAIL - - [contextlost is unaffected on a windowless body] - expected: FAIL - - [contextrestored is unaffected on a windowless body] - expected: FAIL - - [slotchange is unaffected on a windowless body] - expected: FAIL - - [webkitanimationend is unaffected on a windowless body] - expected: FAIL - - [webkitanimationiteration is unaffected on a windowless body] - expected: FAIL - - [webkitanimationstart is unaffected on a windowless body] - expected: FAIL - - [webkittransitionend is unaffected on a windowless body] - expected: FAIL - - [auxclick is unaffected on a windowless frameset] - expected: FAIL - - [contextlost is unaffected on a windowless frameset] - expected: FAIL - - [contextrestored is unaffected on a windowless frameset] - expected: FAIL - - [slotchange is unaffected on a windowless frameset] - expected: FAIL - - [webkitanimationend is unaffected on a windowless frameset] - expected: FAIL - - [webkitanimationiteration is unaffected on a windowless frameset] - expected: FAIL - - [webkitanimationstart is unaffected on a windowless frameset] - expected: FAIL - - [webkittransitionend is unaffected on a windowless frameset] - expected: FAIL - - [beforeinput is unaffected on a windowless body] - expected: FAIL - - [beforematch is unaffected on a windowless body] - expected: FAIL - - [scrollend is unaffected on a windowless body] - expected: FAIL - - [beforeinput is unaffected on a windowless frameset] - expected: FAIL - - [beforematch is unaffected on a windowless frameset] - expected: FAIL - - [scrollend is unaffected on a windowless frameset] - expected: FAIL - - [beforetoggle is unaffected on a windowless body] - expected: FAIL - - [beforetoggle is unaffected on a windowless frameset] - expected: FAIL - - [Return null when getting the pagereveal event handler of a windowless body] - expected: FAIL - - [Ignore setting of pagereveal window event handlers on windowless body] - expected: FAIL - - [Return null when getting the pagereveal event handler of a windowless frameset] - expected: FAIL - - [Ignore setting of pagereveal window event handlers on windowless frameset] - expected: FAIL - - [Return null when getting the pageswap event handler of a windowless body] - expected: FAIL - - [Ignore setting of pageswap window event handlers on windowless body] - expected: FAIL - - [Return null when getting the pageswap event handler of a windowless frameset] - expected: FAIL - - [Ignore setting of pageswap window event handlers on windowless frameset] - expected: FAIL - - [command is unaffected on a windowless body] - expected: FAIL - - [command is unaffected on a windowless frameset] - expected: FAIL diff --git a/tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini b/tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini new file mode 100644 index 00000000000..6204bdc21da --- /dev/null +++ b/tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini @@ -0,0 +1,9 @@ +[garbage-collection.any.html] + +[garbage-collection.any.sharedworker.html] + expected: ERROR + +[garbage-collection.any.serviceworker.html] + expected: ERROR + +[garbage-collection.any.worker.html] diff --git a/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini new file mode 100644 index 00000000000..8634900f9c2 --- /dev/null +++ b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini @@ -0,0 +1,9 @@ +[parsing.https.html?type=enforce] + [Ensure that test is working with a valid destination] + expected: FAIL + + [Ensure that test is working with a valid destination and source] + expected: FAIL + + +[parsing.https.html?type=report] diff --git a/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini new file mode 100644 index 00000000000..3563393c660 --- /dev/null +++ b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini @@ -0,0 +1,15 @@ +[script.https.html] + [Ensure that a script without integrity did not run] + expected: FAIL + + [Ensure that a script with unknown integrity algorithm did not run] + expected: FAIL + + [Ensure that a script without integrity algorithm runs and gets reported in report-only mode] + expected: FAIL + + [Ensure that a no-cors script gets blocked] + expected: FAIL + + [Ensure that ReportingObserver gets called without endpoints] + expected: FAIL diff --git a/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini b/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini index 225c4d84121..205dd5886a8 100644 --- a/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini +++ b/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini @@ -23,9 +23,21 @@ [Event handler div.onpaste should be blocked.] expected: FAIL + [Event handler div.onauxclick should be blocked.] + expected: FAIL + [Event handler div.onabort should be blocked.] expected: FAIL + [Event handler div.onbeforeinput should be blocked.] + expected: FAIL + + [Event handler div.onbeforematch should be blocked.] + expected: FAIL + + [Event handler div.onbeforetoggle should be blocked.] + expected: FAIL + [Event handler div.onblur should be blocked.] expected: FAIL @@ -47,9 +59,18 @@ [Event handler div.onclose should be blocked.] expected: FAIL + [Event handler div.oncommand should be blocked.] + expected: FAIL + [Event handler div.oncontextmenu should be blocked.] expected: FAIL + [Event handler div.oncontextlost should be blocked.] + expected: FAIL + + [Event handler div.oncontextrestored should be blocked.] + expected: FAIL + [Event handler div.oncuechange should be blocked.] expected: FAIL @@ -173,6 +194,9 @@ [Event handler div.onscroll should be blocked.] expected: FAIL + [Event handler div.onscrollend should be blocked.] + expected: FAIL + [Event handler div.onsecuritypolicyviolation should be blocked.] expected: FAIL @@ -188,6 +212,9 @@ [Event handler div.onshow should be blocked.] expected: FAIL + [Event handler div.onslotchange should be blocked.] + expected: FAIL + [Event handler div.onstalled should be blocked.] expected: FAIL @@ -229,3 +256,15 @@ [Event handler div.onselectionchange should be blocked.] expected: FAIL + + [Event handler div.onwebkitanimationend should be blocked.] + expected: FAIL + + [Event handler div.onwebkitanimationiteration should be blocked.] + expected: FAIL + + [Event handler div.onwebkitanimationstart should be blocked.] + expected: FAIL + + [Event handler div.onwebkittransitionend should be blocked.] + expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index 590f4ee6a07..c9d88fc368b 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -784,3 +784,15 @@ [X SNR (42.96525288004425 dB) is not greater than or equal to 65.737. Got 42.96525288004425.] 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[14650\]\t-2.7243524527875707e-5\t8.6956524848937988e-1\t8.6959249201390776e-1\t1.0000313300520867e+0\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 8.6959249201390776e-1 at index of 14650.\n\tMax RelError of 1.0000313300520867e+0 at index of 14650.\n] + expected: FAIL + + [X SNR (42.96506816850161 dB) is not greater than or equal to 65.737. Got 42.96506816850161.] + 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[14650\]\t-1.7532469034194946e+0\t8.6956524848937988e-1\t2.6228121519088745e+0\t3.0162338668262767e+0\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.6228121519088745e+0 at index of 14650.\n\tMax RelError of 3.0162338668262767e+0 at index of 14650.\n] + expected: FAIL + + [X SNR (34.8385032008375 dB) is not greater than or equal to 65.737. Got 34.8385032008375.] + expected: FAIL diff --git a/tests/wpt/meta/webmessaging/messageerror.html.ini b/tests/wpt/meta/webmessaging/messageerror.html.ini deleted file mode 100644 index 9b875551f90..00000000000 --- a/tests/wpt/meta/webmessaging/messageerror.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[messageerror.html] - [The onmessageerror content attribute must be compiled into the onmessageerror property] - expected: FAIL - - [The onmessageerror content attribute must execute when an event is dispatched on the window] - expected: FAIL diff --git a/tests/wpt/meta/webxr/render_state_update.https.html.ini b/tests/wpt/meta/webxr/render_state_update.https.html.ini new file mode 100644 index 00000000000..0e57356683e --- /dev/null +++ b/tests/wpt/meta/webxr/render_state_update.https.html.ini @@ -0,0 +1,2 @@ +[render_state_update.https.html] + expected: ERROR diff --git a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini new file mode 100644 index 00000000000..24daae4c2e7 --- /dev/null +++ b/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini @@ -0,0 +1,3 @@ +[WorkerGlobalScope-close.html] + [Test sending a message after closing.] + expected: FAIL diff --git a/tests/wpt/meta/xhr/formdata/append.any.js.ini b/tests/wpt/meta/xhr/formdata/append.any.js.ini new file mode 100644 index 00000000000..e727a77e38d --- /dev/null +++ b/tests/wpt/meta/xhr/formdata/append.any.js.ini @@ -0,0 +1,8 @@ +[append.any.worker.html] + [testFormDataAppendEmptyBlob] + expected: FAIL + + +[append.any.html] + [testFormDataAppendEmptyBlob] + expected: FAIL diff --git a/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js b/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js index 2fe8c66f2e5..8e1b34ee798 100644 --- a/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js +++ b/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js @@ -6,21 +6,111 @@ 'use strict'; -[cursor => cursor.update(0), cursor => cursor.delete()].forEach( - func => indexeddb_test( - (t, db) => { - db.createObjectStore('store', {autoIncrement: true}); - }, - (t, db) => { - const tx = db.transaction('store', 'readwrite'); - const store = tx.objectStore('store'); - store.put('value'); - store.openCursor().onsuccess = t.step_func(e => { - const cursor = e.target.result; - assert_equals( - func(cursor).source, cursor, - `${func}.source should be the cursor itself`); +// Setup each test by populating an object store with an index for the cursor to +// iterate and manipulate. +function initializeDatabase(db) { + const store = db.createObjectStore('store', {autoIncrement: true}); + store.createIndex('index', /*keypath=*/ 'value'); + store.put({value: 'z'}); + store.put({value: 'y'}); + store.put({value: 'x'}); + store.put({value: 'w'}); +} + +function isIndex(cursorSourceType) { + return cursorSourceType === 'IDBIndex'; +} + +// Return the object store or index, depending on the test's `cursorSourceType`. +function getCursorSource(transaction, cursorSourceType) { + let cursorSource = transaction.objectStore('store'); + if (isIndex(cursorSourceType)) { + cursorSource = cursorSource.index('index'); + } + return cursorSource; +} + +// Verify the request source after calling delete() or update() on the cursor. +function cursor_request_source_test( + cursorSourceType, createRequestFunctionName, createRequestFunctionArgs) { + indexeddb_test( + (t, db) => initializeDatabase(db), + (t, db) => { + const tx = db.transaction('store', 'readwrite'); + const cursorSource = getCursorSource(tx, cursorSourceType); + + // Open the cursor. + const openCursorRequest = cursorSource.openCursor(); + openCursorRequest.onerror = + t.unreached_func('The cursor must not fail to open.'); + + openCursorRequest.onsuccess = t.step_func(e => { + // Use the cursor to create a new request. + const cursor = e.target.result; + const request = + cursor[createRequestFunctionName](...createRequestFunctionArgs); + assert_equals( + request.source, cursor, + `The request's source must be the cursor itself.`); + t.done(); + }); + }, + `The source of the request from ${cursorSourceType}::${ + createRequestFunctionName}() is the cursor itself`); +} + +// Verify the request source after calling openCursor() or openKeyCursor() and +// then using the cursor to iterate. +function open_cursor_request_source_test( + cursorSourceType, openCursorFunctionName) { + indexeddb_test( + (t, db) => initializeDatabase(db), + (t, db) => { + const tx = db.transaction('store', 'readonly'); + const cursorSource = getCursorSource(tx, cursorSourceType); + + // Open the cursor. + const openCursorRequest = cursorSource[openCursorFunctionName](); + openCursorRequest.onerror = + t.unreached_func('The cursor must not fail to open or iterate.'); + + assert_equals( + openCursorRequest.source, cursorSource, + 'The request source must be the opener of the cursor.'); + + // Verify the cursor's `request.source` after iterating with + // `advance()`, `continue()`, and `continuePrimaryKey()`. + let iterationCount = 0; + openCursorRequest.onsuccess = t.step_func(e => { + assert_equals( + openCursorRequest.source, cursorSource, + 'The request source must be the opener of the cursor after iterating.'); + + const cursor = e.target.result; + ++iterationCount; + + if (iterationCount == 1) { + cursor.advance(1); + } else if (iterationCount == 2) { + cursor.continue(); + } else if (iterationCount == 3 && isIndex(cursorSourceType)) { + cursor.continuePrimaryKey('z', 0); + } else { t.done(); - }); - }, - `The source of the request from ${func} is the cursor itself`)); + } + }); + }, + `${cursorSourceType}::${ + openCursorFunctionName}'s request source must be the ${ + cursorSourceType} instance that opened the cursor`); +} + +open_cursor_request_source_test('IDBObjectStore', 'openCursor'); +open_cursor_request_source_test('IDBObjectStore', 'openKeyCursor'); +open_cursor_request_source_test('IDBIndex', 'openCursor'); +open_cursor_request_source_test('IDBIndex', 'openKeyCursor'); + +cursor_request_source_test('IDBObjectStore', 'update', /*args=*/[0]); +cursor_request_source_test('IDBObjectStore', 'delete', /*args=*/[]); +cursor_request_source_test('IDBIndex', 'update', /*args=*/[0]); +cursor_request_source_test('IDBIndex', 'delete', /*args=*/[]); diff --git a/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js b/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js index ae65eb49f21..5ddf7eab6db 100644 --- a/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js +++ b/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js @@ -5,7 +5,7 @@ // https://w3c.github.io/webcrypto/Overview.html idl_test( - ['WebCryptoAPI'], + ['webcrypto'], ['html', 'dom'], idl_array => { idl_array.add_objects({ diff --git a/tests/wpt/tests/ai/translator/resources/util.js b/tests/wpt/tests/ai/translator/resources/util.js new file mode 100644 index 00000000000..ad06086a123 --- /dev/null +++ b/tests/wpt/tests/ai/translator/resources/util.js @@ -0,0 +1,4 @@ +async function createTranslator(options) { + await test_driver.bless(); + return await Translator.create(options); +} diff --git a/tests/wpt/tests/ai/translator/translator-bad-input.tentative.https.window.js b/tests/wpt/tests/ai/translator/translator-bad-input.https.window.js index 53a184bfd19..db8905a61f6 100644 --- a/tests/wpt/tests/ai/translator/translator-bad-input.tentative.https.window.js +++ b/tests/wpt/tests/ai/translator/translator-bad-input.https.window.js @@ -8,8 +8,7 @@ 'use strict'; promise_test(async t => { - await promise_rejects_js( - t, TypeError, Translator.create(/*empty options*/)); + await promise_rejects_js(t, TypeError, Translator.create(/*empty options*/)); }, 'Translator.create rejects with TypeError if no options are passed.'); promise_test(async t => { diff --git a/tests/wpt/tests/ai/translator/translator-translate.tentative.https.window.js b/tests/wpt/tests/ai/translator/translator.optional.https.window.js index a8aad5e03e1..96eca09d28b 100644 --- a/tests/wpt/tests/ai/translator/translator-translate.tentative.https.window.js +++ b/tests/wpt/tests/ai/translator/translator.optional.https.window.js @@ -1,21 +1,16 @@ -// META: title=Translate from English to Japanese +// META: title=Translator Translate // META: global=window // META: timeout=long // META: script=../resources/util.js // META: script=../resources/language_codes.js // META: script=/resources/testdriver.js +// META: script=resources/util.js // // Setting `timeout=long` as this test may require downloading the translation // library and the language models. 'use strict'; -async function createTranslator(options) { - return await test_driver.bless('Create translator', async () => { - return await Translator.create(options); - }); -} - promise_test(async t => { const languagePair = {sourceLanguage: 'en', targetLanguage: 'ja'}; @@ -141,7 +136,7 @@ promise_test(async t => { for (let i = 0; i < translatableStrings.length; i++) { assert_not_equals(translatedTranslatableString[i], translatableStrings[i]); } -}, 'Translator.translate() echos non-translatable content'); +}, 'Translator.translate() echoes non-translatable content'); promise_test(async t => { const translator = diff --git a/tests/wpt/tests/badging/WEB_FEATURES.yml b/tests/wpt/tests/badging/WEB_FEATURES.yml new file mode 100644 index 00000000000..3c4f69200f6 --- /dev/null +++ b/tests/wpt/tests/badging/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: badging + files: "**" diff --git a/tests/wpt/tests/clear-site-data/WEB_FEATURES.yml b/tests/wpt/tests/clear-site-data/WEB_FEATURES.yml new file mode 100644 index 00000000000..d55b5faaf11 --- /dev/null +++ b/tests/wpt/tests/clear-site-data/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: clear-site-data + files: "**" diff --git a/tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html b/tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html new file mode 100644 index 00000000000..98086f83570 --- /dev/null +++ b/tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<link rel="help" href="https://compat.spec.whatwg.org/#valdef-flex--webkit-box"> +<link rel="match" href="green-ref.html"> +<div style="display: -webkit-box; flex-wrap: wrap; width: 50px;"> + <div style="width: 50px; height: 100px; background: green;"></div> + <div style="width: 50px; height: 100px; background: green;"></div> +</div> diff --git a/tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html b/tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html new file mode 100644 index 00000000000..5e812b4aee9 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html @@ -0,0 +1,29 @@ +<!doctype html> +<html> +<head> + <meta http-equiv="Content-Security-Policy" content="style-src 'self';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + + <script> + var t = async_test("Manipulating cssText should be allowed with 'self'"); + document.addEventListener("securitypolicyviolation", t.unreached_func("Should not trigger a security policy violation")); + </script> +</head> +<body> + <div id='log'></div> + + <div id="content">Lorem ipsum</div> + + <script> + t.step(function() { + var contentEl = document.getElementById("content"); + contentEl.style.cssText = 'margin-left: 2px;'; + var marginLeftVal = getComputedStyle(contentEl).getPropertyValue('margin-left'); + assert_equals(marginLeftVal, "2px"); + t.done(); + }); + </script> + +</body> +</html> diff --git a/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js b/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js index 6716d91788d..542bd6c5387 100644 --- a/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js +++ b/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js @@ -207,3 +207,20 @@ promise_test(async testCase => { const cookie = await cookieStore.get('cookie-name'); assert_equals(cookie.secure, true); }, 'CookieListItem - secure defaults to true'); + +promise_test(async testCase => { + await cookieStore.delete('cookie-name'); + testCase.add_cleanup(async () => { + await cookieStore.delete('cookie-name'); + }); + + let encodedCookie = encodeURIComponent(JSON.stringify("cookie-name=1; max-age=99999999999999999999999999999; path=/")); + await fetch(`/cookies/resources/cookie.py?set=${encodedCookie}`); + + assert_equals(document.cookie, "cookie-name=1", 'The cookie was set as expected.'); + + const cookie = await cookieStore.get('cookie-name'); + assert_equals(cookie.name, 'cookie-name'); + assert_equals(cookie.value, '1'); + assert_approx_equals(cookie.expires, kFourHundredDaysFromNow, kOneDay); +}, "Test max-age attribute over the 400 days"); diff --git a/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js b/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js index 8a10e358ef6..605e94e6744 100644 --- a/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js +++ b/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js @@ -67,3 +67,33 @@ cookie_test(async t => { 'cookie1=value1; cookie2=value2; cookie3=value3', 'httpOnly is not an option for CookieStore.set()'); }, 'HttpOnly cookies can not be set by CookieStore'); + +cookie_test(async t => { + await setCookieStringHttp('HTTPONLY-cookie=value; path=/; httponly'); + assert_equals( + await getCookieString(), + undefined, + 'HttpOnly cookie we wrote using HTTP in cookie jar' + + ' is invisible to script'); + assert_equals( + await getCookieStringHttp(), + 'HTTPONLY-cookie=value', + 'HttpOnly cookie we wrote using HTTP in HTTP cookie jar'); + + try { + await cookieStore.set('HTTPONLY-cookie', 'dummy'); + } catch(e) {} + + assert_equals( + await getCookieString(), + undefined, + 'HttpOnly cookie is not overwritten'); + + try { + await cookieStore.delete('HTTPONLY-cookie'); + } catch(e) {} + + assert_equals(await getCookieString(), undefined, 'HttpOnly cookie is not overwritten'); + + assert_equals(await getCookieStringHttp(), 'HTTPONLY-cookie=value', 'HttpOnly cookie is not deleted'); +}, 'HttpOnly cookies are not deleted/overwritten'); diff --git a/tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html b/tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html new file mode 100644 index 00000000000..d380310d096 --- /dev/null +++ b/tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html @@ -0,0 +1,9 @@ +<!doctype html> +<style> + :root { + background-color: rgba(255, 255, 255, 0.98); + background-image: url(/images/computer.jpg); /* opaque */ + background-position: top left; + background-repeat: repeat; + } +</style> diff --git a/tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html b/tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html new file mode 100644 index 00000000000..641dea1f54b --- /dev/null +++ b/tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11461"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="width: 100px; height: 100px; background: red;"> + <div style="width: 200px; justify-items: right;"> + <span style="display: inline-block; width: 100px; height: 100px; background: green;"></span> + <div></div> <!-- Forces an anonymous block around <span> in most browsers. --> + </div> +</div> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html index 92fb4d275b8..7bd389b39d8 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html @@ -75,8 +75,8 @@ <div class="target target1-l" data-offset-x=100 data-expected-height=100></div> <div class="target target1-r" data-offset-x=404 data-expected-height=100></div> - <div class="target target1-t" data-offset-y=0 data-expected-width=310></div> - <div class="target target1-b" data-offset-y=95 data-expected-width=310></div> + <div class="target target1-t" data-offset-y=-10 data-expected-width=310></div> + <div class="target target1-b" data-offset-y=85 data-expected-width=310></div> </div> </div> </div> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html index 7b2691a2b90..1e1f0a5c95b 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html @@ -71,15 +71,15 @@ <!-- The containing block of querying elements is block-fragmented. --> <div class="target target1" - data-offset-x=18 data-offset-y=65 + data-offset-x=128 data-offset-y=-35 data-expected-width=160 data-expected-height=100></div> <div class="target target1-rb" - data-offset-x=168 data-offset-y=155></div> + data-offset-x=278 data-offset-y=55></div> <div class="target fixed target1" - data-offset-x=26 data-offset-y=70 + data-offset-x=136 data-offset-y=-30 data-expected-width=160 data-expected-height=100></div> <div class="target fixed target1-rb" - data-offset-x=176 data-offset-y=160></div> + data-offset-x=286 data-offset-y=60></div> </div> <!-- The containing block of querying elements is a multi-column. --> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html index 399494120ea..8f7a3dad129 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html @@ -69,16 +69,16 @@ <div class="anchor1" style="width: 20px"></div> <div class="target target1" - data-offset-x=18 data-offset-y=65 + data-offset-x=128 data-offset-y=-35 data-expected-width=130 data-expected-height=100></div> <div class="target target1-rb" - data-offset-x=138 data-offset-y=155></div> + data-offset-x=248 data-offset-y=55></div> </div> <div class="target target1" - data-offset-x=34 data-offset-y=225 + data-offset-x=364 data-offset-y=-75 data-expected-width=130 data-expected-height=100></div> <div class="target target1-rb" - data-offset-x=154 data-offset-y=315></div> + data-offset-x=484 data-offset-y=15></div> </div> </body> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html index 35ab2cfc15c..c5ce41299af 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html @@ -68,8 +68,8 @@ data-expected-width=180 data-expected-height=100></div> </div> </div> - <div class="target" - data-offset-x=13 data-offset-y=97 + <div class="target" style="background:hotpink;" + data-offset-x=173 data-offset-y=-3 data-expected-width=180 data-expected-height=100></div> </div> </div> diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html new file mode 100644 index 00000000000..af942fbcc97 --- /dev/null +++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="help" href="https://crbug.com/415627003"> +<style> + @keyframes --anim { + from { + text-size-adjust: calc(50% * sibling-index()); + } + to { + text-size-adjust: calc(50%); + } + } + #target { + animation: --anim 2s; + } +</style> +<p>Pass if no crash</p> +<div id="target"></div> diff --git a/tests/wpt/tests/css/css-break/root-margin-001-print-ref.html b/tests/wpt/tests/css/css-break/root-margin-001-print-ref.html new file mode 100644 index 00000000000..320da2e0f55 --- /dev/null +++ b/tests/wpt/tests/css/css-break/root-margin-001-print-ref.html @@ -0,0 +1,6 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<div style="height:1px;"></div> +<div style="break-before:page; margin-top:8px;"></div> +This text should be on the second page. +The first page should be blank. diff --git a/tests/wpt/tests/css/css-break/root-margin-001-print.html b/tests/wpt/tests/css/css-break/root-margin-001-print.html new file mode 100644 index 00000000000..b2ec34fe079 --- /dev/null +++ b/tests/wpt/tests/css/css-break/root-margin-001-print.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<title>Root block-start margin taller than the page</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-break/#break-margins"> +<link rel="match" href="root-margin-001-print-ref.html"> +<style> + html { margin-top: 10in; } +</style> +This text should be on the second page. +The first page should be blank. diff --git a/tests/wpt/tests/css/css-break/table/border-spacing.html b/tests/wpt/tests/css/css-break/table/border-spacing.html index fc5e87e35dd..9fd94760681 100644 --- a/tests/wpt/tests/css/css-break/table/border-spacing.html +++ b/tests/wpt/tests/css/css-break/table/border-spacing.html @@ -5,7 +5,7 @@ .cell > div { background:white; } </style> <p>No red should be seen below.</p> -<div id="multicol" style="columns:2; column-fill:auto; height:70px; width:200px; line-height:20px;"> +<div id="multicol" style="columns:2; column-fill:auto; gap:0; height:70px; width:200px; line-height:20px;"> <div style="position:relative; display:table; border-spacing:10px;"> <div class="cell" style="display:table-cell; width:30px; background:red;"> <div id="child1">1<br></div> @@ -20,15 +20,20 @@ <script src="/resources/testharnessreport.js"></script> <script> test(() => { + assert_equals(document.getElementById("child1").offsetLeft, 10); assert_equals(document.getElementById("child1").offsetTop, 10); assert_equals(document.getElementById("child1").offsetHeight, 20); + assert_equals(document.getElementById("child2").offsetLeft, 10); assert_equals(document.getElementById("child2").offsetTop, 30); assert_equals(document.getElementById("child2").offsetHeight, 20); + assert_equals(document.getElementById("child3").offsetLeft, 10); assert_equals(document.getElementById("child3").offsetTop, 50); assert_equals(document.getElementById("child3").offsetHeight, 20); - assert_equals(document.getElementById("child4").offsetTop, 70); + assert_equals(document.getElementById("child4").offsetLeft, 110); + assert_equals(document.getElementById("child4").offsetTop, 0); assert_equals(document.getElementById("child4").offsetHeight, 20); - assert_equals(document.getElementById("child5").offsetTop, 90); + assert_equals(document.getElementById("child5").offsetLeft, 110); + assert_equals(document.getElementById("child5").offsetTop, 20); assert_equals(document.getElementById("child5").offsetHeight, 20); }, "Table with border spacing"); </script> diff --git a/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html b/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html index 9d4a472d438..1eb751032ca 100644 --- a/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html +++ b/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html @@ -37,104 +37,104 @@ <script src="/resources/testharnessreport.js"></script> <script> test(() => { - assert_equals(table.offsetTop, 408, "offsetTop"); - assert_equals(table.offsetLeft, 41, "offsetLeft"); + assert_equals(table.offsetTop, 8, "offsetTop"); + assert_equals(table.offsetLeft, 8, "offsetLeft"); assert_equals(table.offsetWidth, 177, "offsetWidth"); assert_equals(table.offsetHeight, 184, "offsetHeight"); }, "table"); test(() => { - assert_equals(colgroup.offsetTop, 418, "offsetTop"); - assert_equals(colgroup.offsetLeft, 51, "offsetLeft"); + assert_equals(colgroup.offsetTop, 18, "offsetTop"); + assert_equals(colgroup.offsetLeft, 8, "offsetLeft"); assert_equals(colgroup.offsetWidth, 157, "offsetWidth"); assert_equals(colgroup.offsetHeight, 107, "offsetHeight"); }, "colgroup"); test(() => { - assert_equals(col.offsetTop, 418, "offsetTop"); - assert_equals(col.offsetLeft, 51, "offsetLeft"); + assert_equals(col.offsetTop, 18, "offsetTop"); + assert_equals(col.offsetLeft, 8, "offsetLeft"); assert_equals(col.offsetWidth, 157, "offsetWidth"); assert_equals(col.offsetHeight, 50, "offsetHeight"); }, "col"); test(() => { - assert_equals(col2.offsetTop, 475, "offsetTop"); - assert_equals(col2.offsetLeft, 51, "offsetLeft"); + assert_equals(col2.offsetTop, 75, "offsetTop"); + assert_equals(col2.offsetLeft, 8, "offsetLeft"); assert_equals(col2.offsetWidth, 157, "offsetWidth"); assert_equals(col2.offsetHeight, 50, "offsetHeight"); }, "col2"); test(() => { - assert_equals(colgroup2.offsetTop, 532, "offsetTop"); - assert_equals(colgroup2.offsetLeft, 51, "offsetLeft"); + assert_equals(colgroup2.offsetTop, 132, "offsetTop"); + assert_equals(colgroup2.offsetLeft, 8, "offsetLeft"); assert_equals(colgroup2.offsetWidth, 157, "offsetWidth"); assert_equals(colgroup2.offsetHeight, 50, "offsetHeight"); }, "colgroup2"); test(() => { - assert_equals(col3.offsetTop, 532, "offsetTop"); - assert_equals(col3.offsetLeft, 51, "offsetLeft"); + assert_equals(col3.offsetTop, 132, "offsetTop"); + assert_equals(col3.offsetLeft, 8, "offsetLeft"); assert_equals(col3.offsetWidth, 157, "offsetWidth"); assert_equals(col3.offsetHeight, 50, "offsetHeight"); }, "col3"); test(() => { - assert_equals(rowgroup.offsetTop, 418, "offsetTop"); - assert_equals(rowgroup.offsetLeft, 51, "offsetLeft"); + assert_equals(rowgroup.offsetTop, 18, "offsetTop"); + assert_equals(rowgroup.offsetLeft, 8, "offsetLeft"); assert_equals(rowgroup.offsetWidth, 157, "offsetWidth"); assert_equals(rowgroup.offsetHeight, 164, "offsetHeight"); }, "rowgroup"); test(() => { - assert_equals(row.offsetTop, 218, "offsetTop"); - assert_equals(row.offsetLeft, 38, "offsetLeft"); + assert_equals(row.offsetTop, 18, "offsetTop"); + assert_equals(row.offsetLeft, 8, "offsetLeft"); assert_equals(row.offsetWidth, 100, "offsetWidth"); assert_equals(row.offsetHeight, 164, "offsetHeight"); }, "row"); test(() => { - assert_equals(cell.offsetTop, 218, "offsetTop"); - assert_equals(cell.offsetLeft, 38, "offsetLeft"); + assert_equals(cell.offsetTop, 18, "offsetTop"); + assert_equals(cell.offsetLeft, 8, "offsetLeft"); assert_equals(cell.offsetWidth, 100, "offsetWidth"); assert_equals(cell.offsetHeight, 50, "offsetHeight"); }, "cell"); test(() => { - assert_equals(content.offsetTop, 218, "offsetTop"); - assert_equals(content.offsetLeft, 38, "offsetLeft"); + assert_equals(content.offsetTop, 18, "offsetTop"); + assert_equals(content.offsetLeft, 8, "offsetLeft"); assert_equals(content.offsetWidth, 100, "offsetWidth"); assert_equals(content.offsetHeight, 50, "offsetHeight"); }, "content"); test(() => { - assert_equals(cell2.offsetTop, 275, "offsetTop"); - assert_equals(cell2.offsetLeft, 38, "offsetLeft"); + assert_equals(cell2.offsetTop, 75, "offsetTop"); + assert_equals(cell2.offsetLeft, 8, "offsetLeft"); assert_equals(cell2.offsetWidth, 100, "offsetWidth"); assert_equals(cell2.offsetHeight, 50, "offsetHeight"); }, "cell2"); test(() => { - assert_equals(content2.offsetTop, 275, "offsetTop"); - assert_equals(content2.offsetLeft, 38, "offsetLeft"); + assert_equals(content2.offsetTop, 75, "offsetTop"); + assert_equals(content2.offsetLeft, 8, "offsetLeft"); assert_equals(content2.offsetWidth, 100, "offsetWidth"); assert_equals(content2.offsetHeight, 50, "offsetHeight"); }, "content2"); test(() => { - assert_equals(cell3.offsetTop, 332, "offsetTop"); - assert_equals(cell3.offsetLeft, 38, "offsetLeft"); + assert_equals(cell3.offsetTop, 132, "offsetTop"); + assert_equals(cell3.offsetLeft, 8, "offsetLeft"); assert_equals(cell3.offsetWidth, 100, "offsetWidth"); assert_equals(cell3.offsetHeight, 50, "offsetHeight"); }, "cell3"); test(() => { - assert_equals(content3.offsetTop, 332, "offsetTop"); - assert_equals(content3.offsetLeft, 38, "offsetLeft"); + assert_equals(content3.offsetTop, 132, "offsetTop"); + assert_equals(content3.offsetLeft, 8, "offsetLeft"); assert_equals(content3.offsetWidth, 100, "offsetWidth"); assert_equals(content3.offsetHeight, 50, "offsetHeight"); }, "content3"); test(() => { - assert_equals(row2.offsetTop, 418, "offsetTop"); - assert_equals(row2.offsetLeft, 51, "offsetLeft"); + assert_equals(row2.offsetTop, 218, "offsetTop"); + assert_equals(row2.offsetLeft, 8, "offsetLeft"); assert_equals(row2.offsetWidth, 50, "offsetWidth"); assert_equals(row2.offsetHeight, 164, "offsetHeight"); }, "row2"); test(() => { - assert_equals(cell4.offsetTop, 418, "offsetTop"); - assert_equals(cell4.offsetLeft, 51, "offsetLeft"); + assert_equals(cell4.offsetTop, 218, "offsetTop"); + assert_equals(cell4.offsetLeft, 8, "offsetLeft"); assert_equals(cell4.offsetWidth, 50, "offsetWidth"); assert_equals(cell4.offsetHeight, 50, "offsetHeight"); }, "cell4"); test(() => { - assert_equals(content4.offsetTop, 418, "offsetTop"); - assert_equals(content4.offsetLeft, 51, "offsetLeft"); + assert_equals(content4.offsetTop, 218, "offsetTop"); + assert_equals(content4.offsetLeft, 8, "offsetLeft"); assert_equals(content4.offsetWidth, 50, "offsetWidth"); assert_equals(content4.offsetHeight, 50, "offsetHeight"); }, "content4"); diff --git a/tests/wpt/tests/css/css-cascade/inline-style-background.html b/tests/wpt/tests/css/css-cascade/inline-style-background.html new file mode 100644 index 00000000000..11451f8cefd --- /dev/null +++ b/tests/wpt/tests/css/css-cascade/inline-style-background.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<head> + <link rel="help" href="https://crbug.com/40934009"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> + <div id="d" style="background:revert">Test passes if it does not crash.</div> + <script> + test(() => { + d.offsetTop; + d.style.background = "url(dummy.png)"; + d.offsetLeft; + }); + </script> +</body> diff --git a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html index c7553716ab6..e2516f3d378 100644 --- a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html +++ b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html @@ -1,62 +1,13 @@ <!DOCTYPE HTML> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Reftest Reference</title> - <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com"> - <style> - div { - position: relative; - width: 100px; - } - #div1, - #div3 { - background-color: #cfc; - } - #div1 { - z-index: 5; - } - #div2 { - z-index: 1; - background-color: #fdd; - height: 100px; - top: -20px; - } - #div2_1 { - background-color: #ffc; - z-index: 6; - top: -10px; - } - #div2_2 { - z-index: 3; - position: absolute; - top: -15px; - width: 40px; - height: 100px; - background-color: #ddf; - } - #div3 { - z-index: 2; - top: -50px; - } - </style> -</head> -<body> - <div id="div1"> - <br/><br/> - </div> - - <div id="div2"> - <div id="div2_1"> - <br/><br/> - </div> - - <div id="div2_2"> - </div> - </div> - - <div id="div3"> - <br/><br/> - </div> -</body> -</html> +<meta charset="utf-8"> +<title>Paint Containment Stacking Context Reference</title> +<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com"> +<style> + div { + width: 100px; + height: 100px; + background-color: green; + } +</style> +<div></div> +Test succeeds if there is no red. diff --git a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html index 71102b6c73a..5e588cb6174 100644 --- a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html +++ b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html @@ -1,66 +1,32 @@ <!DOCTYPE HTML> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Test: 'contain: paint' with stacking contents. Z-index is defined only for siblings and children.</title> - <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com"> - - <link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> - <link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> - <link rel="match" href="contain-paint-stacking-context-001-ref.html"> - <style> - div { - position: relative; - width: 100px; - } - #div1, - #div3 { - background-color: #cfc; - } - #div1 { - z-index: 5; - } - #div2 { - contain: paint; - background-color: #fdd; - height: 100px; - top: -20px; - } - #div2_1 { - background-color: #ffc; - z-index: 6; - top: -10px; - } - #div2_2 { - z-index: 3; - position: absolute; - top: -15px; - width: 40px; - height: 100px; - background-color: #ddf; - } - #div3 { - z-index: 2; - top: -50px; - } - </style> -</head> -<body> - <div id="div1"> - <br/><br/> - </div> - - <div id="div2"> - <div id="div2_1"> - <br/><br/> - </div> - - <div id="div2_2"> - </div> - </div> - - <div id="div3"> - <br/><br/> - </div> -</body> -</html> +<title>'contain: paint' establishes stacking context.</title> +<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> +<link rel="match" href="contain-paint-stacking-context-001-ref.html"> +<style> + div { + width: 100px; + height: 100px; + } + #front { + background-color: green; + /* makes a stacking context and puts this on top */ + position: absolute; + z-index: 10; + } + #back { + contain: paint; + } + #notOnTop { + background-color: red; + /* z-index is higher than on #front, but this should still be covered up because it is inside #back, which has 'contain: paint' */ + position: absolute; + z-index: 1000; + } +</style> +<div id="front"></div> +<div id="back"> + <div id="notOnTop"></div> +</div> +Test succeeds if there is no red. diff --git a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html index 0c4d3323bf7..e03323782a7 100644 --- a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html +++ b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html @@ -1,66 +1,32 @@ <!DOCTYPE HTML> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Test: 'will-change: contain' with stacking contents. Z-index is defined only for siblings and children.</title> - <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com"> - - <link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> - <link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> - <link rel="match" href="contain-paint-stacking-context-001-ref.html"> - <style> - div { - position: relative; - width: 100px; - } - #div1, - #div3 { - background-color: #cfc; - } - #div1 { - z-index: 5; - } - #div2 { - will-change: contain; - background-color: #fdd; - height: 100px; - top: -20px; - } - #div2_1 { - background-color: #ffc; - z-index: 6; - top: -10px; - } - #div2_2 { - z-index: 3; - position: absolute; - top: -15px; - width: 40px; - height: 100px; - background-color: #ddf; - } - #div3 { - z-index: 2; - top: -50px; - } - </style> -</head> -<body> - <div id="div1"> - <br/><br/> - </div> - - <div id="div2"> - <div id="div2_1"> - <br/><br/> - </div> - - <div id="div2_2"> - </div> - </div> - - <div id="div3"> - <br/><br/> - </div> -</body> -</html> +<title>'will-change: contain' establishes stacking context.</title> +<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> +<link rel="match" href="contain-paint-stacking-context-001-ref.html"> +<style> + div { + width: 100px; + height: 100px; + } + #front { + background-color: green; + /* makes a stacking context and puts this on top */ + position: absolute; + z-index: 10; + } + #back { + will-change: contain; + } + #notOnTop { + background-color: red; + /* z-index is higher than on #front, but this should still be covered up because it is inside #back, which has 'will-change: contain' */ + position: absolute; + z-index: 1000; + } +</style> +<div id="front"></div> +<div id="back"> + <div id="notOnTop"></div> +</div> +Test succeeds if there is no red. diff --git a/tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html new file mode 100644 index 00000000000..d4275b5c951 --- /dev/null +++ b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<meta charset="UTF-8" /> +<title>CSS Fonts reference</title> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + +<style> +body { background: white; } +p { font: 16px/3 serif; } +span { color: white; font: 25px Ahem; } +span span { color: initial; font-variant-emoji: emoji; } +</style> + +<h4>Only lines 3 and 4 should show a keycap numeral:</h4> + +<p>1. text: <span>X</span></p> + +<p>2. unicode: <span>X</span></p> + +<p>3. emoji: <span>X<span>3️⃣</span>X</span></p> + +<p>4. with VS16: <span>X<span>4️⃣</span>X</span></p> + +<p>5. emoji, with VS15: <span>X</span></p> diff --git a/tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html new file mode 100644 index 00000000000..0f5c2d7a98a --- /dev/null +++ b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="UTF-8" /> +<title>CSS Fonts: font-variant-emoji web font test</title> +<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-variant-emoji-prop" /> +<link rel="help" href="https://www.unicode.org/reports/tr51/tr51-25.html#Emoji_Properties_and_Data_Files" /> +<link rel="match" href="font-variant-emoji-005-ref.html"/> +<meta name="assert" content="Digit-keycap sequences render as emoji if required, in preference to using the named font"/> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + +<style> +body { background: white; } +p { font: 16px/3 serif; } +/* A color-emoji glyph in the span will be visible despite the white color; + * if color-emoji presentation is not used, the span will be invisible. + */ +span { color: white; font: 25px Ahem; } +</style> + +<h4>Only lines 3 and 4 should show a keycap numeral:</h4> + +<p>1. text: <span style="font-variant-emoji: text">X1⃣X</span></p> + +<p>2. unicode: <span style="font-variant-emoji: unicode">X2⃣X</span></p> + +<p>3. emoji: <span style="font-variant-emoji: emoji">X3⃣X</span></p> + +<p>4. with VS16: <span style="font-variant-emoji: normal">X4️⃣X</span></p> + +<p>5. emoji, with VS15: <span style="font-variant-emoji: emoji">X5︎⃣X</span></p> diff --git a/tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html new file mode 100644 index 00000000000..42c5ef128b4 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + display: flex; + width: 120px; + height: 110px; + column-gap: 20px; + row-gap: 10px; + flex-wrap: wrap; + } + + .item { + background: skyblue; + height: 50px; + width: 50px; + margin: 0; + } + + .row-gap { + position: absolute; + top: 50px; + background: gold; + width: 120px; + height: 10px; + } + + .column-gap { + position: absolute; + top: 0px; + left: 50px; + background: blue; + height: 110px; + width: 20px; + } + +</style> +<div class="container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="row-gap"></div> +<div class="column-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html b/tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html new file mode 100644 index 00000000000..5f3b512ef76 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: flex column gaps are painted with different sized gaps and row-rule-outset 0. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="../agnostic/gap-decorations-002-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .flex-container { + height: 110px; + width: 120px; + + display: flex; + + column-gap: 20px; + row-gap: 10px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 20px; + + row-rule-color: gold; + row-rule-style: solid; + row-rule-width: 10px; + + row-rule-break: intersection; + row-rule-outset: 0; + + flex-wrap: wrap; + } + + .flex-item { + background: skyblue; + width: 50px; + } +</style> +<div class="flex-container"> + <div class="flex-item"></div> + <div class="flex-item"></div> + <div class="flex-item"></div> + <div class="flex-item"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html new file mode 100644 index 00000000000..35450e07ae5 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + grid-template-rows: 100px 100px 100px; + width: 120px; + height: 120px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + position: absolute; + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 102.5px; + } + + .row-gap2 { + top: 212.5px; + } + + .col-gap { + position: absolute; + top: 0px; + width: 0px; + height: 320px; + border-left: solid 5px blue; + } + + .col-gap1 { + left: 102.5px; + } + + .col-gap2 { + left: 212.5px; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html new file mode 100644 index 00000000000..6da75548d94 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Gaps are painted when items overflow container. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-029-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + grid-template-rows: 100px 100px 100px; + width: 120px; + height: 120px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html new file mode 100644 index 00000000000..d4953ae2ddd --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + width: 120px; + height: 120px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .col-gap { + position: absolute; + top: 0px; + width: 0px; + height: 120px; + border-left: solid 5px blue; + } + + .col-gap1 { + left: 102.5px; + } + + .col-gap2 { + left: 212.5px; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html new file mode 100644 index 00000000000..ef4507ef926 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Gaps are painted when items overflow container - no row gaps. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-030-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + width: 120px; + height: 120px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html new file mode 100644 index 00000000000..0615305bc9f --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-rows: 100px 100px 100px; + grid-auto-flow: column; + width: 120px; + height: 120px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + position: absolute; + width: 120px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 102.5px; + } + + .row-gap2 { + top: 212.5px; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html new file mode 100644 index 00000000000..530b661bfe3 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Gaps are painted when items overflow container - no column gaps. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-031-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-rows: 100px 100px 100px; + grid-auto-flow: column; + width: 120px; + height: 120px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html new file mode 100644 index 00000000000..f90e3dd6813 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + overflow: hidden; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + grid-template-rows: repeat(6, 100px); + width: 120px; + height: 120px; + } + + .row-gap { + position: absolute; + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 102.5px; + } + + .row-gap2 { + top: 212.5px; + } + + .row-gap3 { + top: 322.5px; + } + + .row-gap4 { + top: 432.5px; + } + + .row-gap5 { + top: 542.5px; + } + + .col-gap { + position: absolute; + top: 0px; + width: 0px; + height: 650px; + border-left: solid 10px blue; + } + + .col-gap1 { + left: 100px; + } + + .col-gap2 { + left: 210px; + } +</style> +<div class="grid-container"></div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> +<div class="row-gap row-gap3"> </div> +<div class="row-gap row-gap4"> </div> +<div class="row-gap row-gap5"> </div> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html new file mode 100644 index 00000000000..ac2d38fdda0 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Gaps are painted when rows are dynamically added and overflow container. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-032-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + overflow: hidden; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + grid-template-rows: 100px; + width: 120px; + height: 120px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 10px; + } + +</style> + +<body> + <div class="grid-container"></div> +<script> + const grid = document.querySelector('.grid-container'); + grid.style.gridTemplateRows = 'repeat(6, 100px)'; + + grid.style.rowRuleColor = 'red'; + grid.style.rowRuleStyle = 'solid'; + grid.style.rowRuleWidth = '5px'; +</script> +</body> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html new file mode 100644 index 00000000000..e26143a6b93 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + overflow: hidden; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: repeat(3, 50px); + grid-template-rows: repeat(6, 50px); + width: 50px; + height: 50px; + } + + .row-gap { + position: absolute; + width: 170px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 52.5px; + } + + .row-gap2 { + top: 112.5px; + } + + .row-gap3 { + top: 172.5px; + } + + .row-gap4 { + top: 232.5px; + } + + .row-gap5 { + top: 195px; + border-bottom: solid 200px red; /*expand the last row gap's height*/ + } + + .col-gap { + position: absolute; + top: 0px; + width: 0px; + height: 350px; + border-left: solid 10px blue; + } + + .col-gap1 { + left: 50px; + } + + .col-gap2 { + left: 110px; + } +</style> +<div class="grid-container"></div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> +<div class="row-gap row-gap3"> </div> +<div class="row-gap row-gap4"> </div> +<div class="row-gap row-gap5"> </div> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html new file mode 100644 index 00000000000..47ef35cc368 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Decorations are painted when rule thickness is greater than gap size. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-033-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + overflow: hidden; + } + + .grid-container { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, 50px); + grid-template-rows: repeat(6, 50px); + width: 50px; + height: 50px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 10px; + } + +</style> + +<body> + <div class="grid-container"></div> +<script> + const grid = document.querySelector('.grid-container'); + + grid.style.rowRuleColor = 'red'; + grid.style.rowRuleStyle = 'solid'; + grid.style.rowRuleWidth = 'repeat(4, 5px) 200px'; +</script> +</body> diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html new file mode 100644 index 00000000000..8b87bcd4860 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: grid column gaps are painted with different sized gaps and column-rule-outset 0. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="../agnostic/gap-decorations-002-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + height: 110px; + width: 120px; + + display: grid; + grid-template-columns: repeat(2, 1fr); + + column-gap: 20px; + row-gap: 10px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 20px; + + row-rule-color: gold; + row-rule-style: solid; + row-rule-width: 10px; + + row-rule-break: intersection; + row-rule-outset: 0; + } + + .grid-item { + background: skyblue; + } +</style> +<div class="grid-container"> + <div class="grid-item"></div> + <div class="grid-item"></div> + <div class="grid-item"></div> + <div class="grid-item"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html new file mode 100644 index 00000000000..23fd089ac8e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 210px; + height: 130px; + column-gap: 20px; + display: flex; + } + + .items { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 56.666px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 210px; + background: gold; + left: 2px; + top: 62px; + } + + .column-gap { + position: absolute; + height: 130px; + width: 20px; + background: blue; + top: 2px; + } +</style> + +<div class="container"> + <div class="items"></div> + <div class="items"></div> + <div class="items"></div> +</div> +<div class="row-gap"></div> +<div class="column-gap" style="left:58.666px;"></div> +<div class="column-gap" style="left:135.332px;"></div> diff --git a/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html new file mode 100644 index 00000000000..c7d1fe42584 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and with different sized gaps and row-rule-outset 0. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-017-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 210px; + height: 130px; + column-count: 3; + column-width: 56.666px; + column-height: 60px; + column-gap: 20px; + row-gap: 10px; + column-rule-width: 20px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + + row-rule-break: intersection; + row-rule-outset: 0; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html b/tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html new file mode 100644 index 00000000000..db7b97e74a5 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Gap Decorations: Ensure getComputedStyle for column-rule-width is as specified with multiple values</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#column-row-rule-width"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<script src="/resources/testharness.js" type="text/javascript"></script> +<script src="/resources/testharnessreport.js" type="text/javascript"></script> +</head> +<body> +<div id="target1"></div> +<div id="target2"></div> +<div id="target3"></div> +<style> + #target1 { + column-rule-width: thin; + } + + #target2 { + column-rule-width: 5px 10px 15px; + } + + #target3 { + column-rule-width: repeat(auto, 5px); + } +</style> +<script> + test(function() { + const containerStyle = window.getComputedStyle(document.querySelector('#target1')); + const columnRuleWidth = containerStyle.getPropertyValue('column-rule-width'); + assert_equals(columnRuleWidth, '0px'); + + }, "`column-rule-width` should be `0px` when `column-rule-style` is `none` with single value"); + + test(function() { + const containerStyle = window.getComputedStyle(document.querySelector('#target2')); + const columnRuleWidth = containerStyle.getPropertyValue('column-rule-width'); + assert_equals(columnRuleWidth, '5px 10px 15px'); + + }, "`column-rule-width` should be as specified regardless of `column-rule-style` with multiple values"); + + test(function() { + const containerStyle = window.getComputedStyle(document.querySelector('#target3')); + const columnRuleWidth = containerStyle.getPropertyValue('column-rule-width'); + assert_equals(columnRuleWidth, 'repeat(auto, 5px)'); + + }, "`column-rule-width` should be as specified regardless of `column-rule-style` with multiple (repeat) values"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html new file mode 100644 index 00000000000..7325685511a --- /dev/null +++ b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<title>CSS Test Reference</title> +<style> + body { + background-position: top left; + background-repeat: no-repeat; + background-size: 100px 100px; + background-image: linear-gradient(blue 40px, yellow); + } +</style> +<body> diff --git a/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html new file mode 100644 index 00000000000..299b86d464a --- /dev/null +++ b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>CSS Images Test: Linear gradient with sibling-index()</title> +<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients"> +<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting"> +<link rel="match" href="linear-gradient-body-sibling-index-ref.html"> +<link rel="assert" content"sibling-index() is 2 for body"> +<style> + body { + background-position: top left; + background-repeat: no-repeat; + background-size: 100px 100px; + background-image: linear-gradient(blue calc(20px * sibling-index()), yellow); + } +</style> +<body> diff --git a/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html new file mode 100644 index 00000000000..be13be8e260 --- /dev/null +++ b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<title>CSS Test Reference</title> +<style> + div { width: 100px; height: 100px; } +</style> +<div style="background: linear-gradient(blue 20px, yellow)"></div> +<div style="background: linear-gradient(blue 60px, yellow)"></div> diff --git a/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html new file mode 100644 index 00000000000..e764e62890d --- /dev/null +++ b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>CSS Images Test: Linear gradient with em in calc()</title> +<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients"> +<link rel="match" href="linear-gradient-calc-em-units-ref.html"> +<style> + div { + width: 100px; + height: 100px; + background: linear-gradient(blue calc(2em), yellow); + } + #em1 { + font-size: 10px; + } + #em2 { + font-size: 30px; + } +</style> +<div id="em1"></div> +<div id="em2"></div> diff --git a/tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html new file mode 100644 index 00000000000..eea8518d95b --- /dev/null +++ b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<title>CSS Test Reference</title> +<style> + div { width: 100px; height: 100px; } +</style> +<div style="background: linear-gradient(blue 20px, yellow)"></div> +<div style="background: linear-gradient(blue 50px, yellow)"></div> diff --git a/tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html new file mode 100644 index 00000000000..b92897e0697 --- /dev/null +++ b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>CSS Images Test: Linear gradient with sibling-index()</title> +<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients"> +<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting"> +<link rel="match" href="linear-gradient-sibling-index-ref.html"> +<style> + .grad { + width: 100px; + height: 100px; + background: linear-gradient(blue calc(10px * sibling-index()), yellow); + } +</style> +<div> + <div></div> + <div class="grad"></div> + <div></div> + <div></div> + <div class="grad"></div> +</div> diff --git a/tests/wpt/tests/css/css-mixins/dashed-function-cycles.tentative.html b/tests/wpt/tests/css/css-mixins/dashed-function-cycles.html index 11e653e9b7d..15305be2b28 100644 --- a/tests/wpt/tests/css/css-mixins/dashed-function-cycles.tentative.html +++ b/tests/wpt/tests/css/css-mixins/dashed-function-cycles.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <title>Custom Functions: Handling cycles</title> -<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#cycles"> -<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11500"> +<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#evaluating-custom-functions"> +<link rel="help" href="https://drafts.csswg.org/css-values-5/#cyclic-substitution-contexts"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/utils.js"></script> diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-005.html b/tests/wpt/tests/css/css-multicol/getclientrects-005.html new file mode 100644 index 00000000000..ee60a607dcc --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/getclientrects-005.html @@ -0,0 +1,139 @@ +<!DOCTYPE html> +<title>getClientRects on fragmented table-column and table-column-group</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects"> +<link rel="help" href="https://drafts.csswg.org/css-multicol/"> +<style> + body { + margin: 8px; + } +</style> +<div style="columns:6; gap:20px; inline-size:580px; column-rule:solid; column-fill:auto; block-size:100px; background:yellow;"> + <div style="block-size:110px;"></div> + <div style="display:table; inline-size:100%; border-spacing:5px; border:2px solid; background:pink;"> + <div style="display:table-caption; block-size:100px;"></div> + <div style="display:table-caption; caption-side:bottom; block-size:100px;"></div> + <div id="col1" style="display:table-column; inline-size:15px; background:blue;"></div> + <div id="col2" style="display:table-column; background:lime;"></div> + <div id="group" style="display:table-column-group;"> + <div id="col3" style="display:table-column; inline-size:20px; background:hotpink;"></div> + <div id="col4" style="display:table-column; inline-size:10px; background:cyan;" id="col2"></div> + </div> + <div style="display:table-row-group;"> + <div style="display:table-cell;"> + <div style="block-size:5px;"></div> + </div> + </div> + <div style="display:table-row-group;"> + <div style="display:table-cell;"> + <div style="block-size:240px;"></div> + </div> + <div style="display:table-cell;"></div> + <div style="display:table-cell;"></div> + <div style="display:table-cell;"></div> + </div> + </div> +</div> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(()=> { + let rects = col1.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 215); + assert_equals(rects[0].top, 25); + assert_equals(rects[0].width, 15); + assert_equals(rects[0].height, 83); + + assert_equals(rects[1].left, 315); + assert_equals(rects[1].top, 8); + assert_equals(rects[1].width, 15); + assert_equals(rects[1].height, 100); + + assert_equals(rects[2].left, 415); + assert_equals(rects[2].top, 8); + assert_equals(rects[2].width, 15); + assert_equals(rects[2].height, 67); + }, "#col1"); + + test(()=> { + let rects = col2.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 235); + assert_equals(rects[0].top, 25); + assert_equals(rects[0].width, 10); + assert_equals(rects[0].height, 83); + + assert_equals(rects[1].left, 335); + assert_equals(rects[1].top, 8); + assert_equals(rects[1].width, 10); + assert_equals(rects[1].height, 100); + + assert_equals(rects[2].left, 435); + assert_equals(rects[2].top, 8); + assert_equals(rects[2].width, 10); + assert_equals(rects[2].height, 67); + }, "#col2"); + + test(()=> { + let rects = col3.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 250); + assert_equals(rects[0].top, 25); + assert_equals(rects[0].width, 20); + assert_equals(rects[0].height, 83); + + assert_equals(rects[1].left, 350); + assert_equals(rects[1].top, 8); + assert_equals(rects[1].width, 20); + assert_equals(rects[1].height, 100); + + assert_equals(rects[2].left, 450); + assert_equals(rects[2].top, 8); + assert_equals(rects[2].width, 20); + assert_equals(rects[2].height, 67); + }, "#col3"); + + test(()=> { + let rects = col4.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 275); + assert_equals(rects[0].top, 25); + assert_equals(rects[0].width, 10); + assert_equals(rects[0].height, 83); + + assert_equals(rects[1].left, 375); + assert_equals(rects[1].top, 8); + assert_equals(rects[1].width, 10); + assert_equals(rects[1].height, 100); + + assert_equals(rects[2].left, 475); + assert_equals(rects[2].top, 8); + assert_equals(rects[2].width, 10); + assert_equals(rects[2].height, 67); + }, "#col4"); + + test(()=> { + let rects = group.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 250); + assert_equals(rects[0].top, 25); + assert_equals(rects[0].width, 35); + assert_equals(rects[0].height, 83); + + assert_equals(rects[1].left, 350); + assert_equals(rects[1].top, 8); + assert_equals(rects[1].width, 35); + assert_equals(rects[1].height, 100); + + assert_equals(rects[2].left, 450); + assert_equals(rects[2].top, 8); + assert_equals(rects[2].width, 35); + assert_equals(rects[2].height, 67); + }, "#group"); +</script> diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-006.html b/tests/wpt/tests/css/css-multicol/getclientrects-006.html new file mode 100644 index 00000000000..9f07a7de744 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/getclientrects-006.html @@ -0,0 +1,139 @@ +<!DOCTYPE html> +<title>getClientRects on fragmented table-column and table-column-group, vertical-rl</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects"> +<link rel="help" href="https://drafts.csswg.org/css-multicol/"> +<style> + body { + margin: 8px; + } +</style> +<div style="writing-mode:vertical-rl; columns:6; gap:20px; inline-size:580px; column-rule:solid; column-fill:auto; block-size:100px; background:yellow;"> + <div style="block-size:110px;"></div> + <div style="display:table; inline-size:100%; border-spacing:5px; border:2px solid; background:pink;"> + <div style="display:table-caption; block-size:100px;"></div> + <div style="display:table-caption; caption-side:bottom; block-size:100px;"></div> + <div id="col1" style="display:table-column; inline-size:15px; background:blue;"></div> + <div id="col2" style="display:table-column; background:lime;"></div> + <div id="group" style="display:table-column-group;"> + <div id="col3" style="display:table-column; inline-size:20px; background:hotpink;"></div> + <div id="col4" style="display:table-column; inline-size:10px; background:cyan;" id="col2"></div> + </div> + <div style="display:table-row-group;"> + <div style="display:table-cell;"> + <div style="block-size:5px;"></div> + </div> + </div> + <div style="display:table-row-group;"> + <div style="display:table-cell;"> + <div style="block-size:240px;"></div> + </div> + <div style="display:table-cell;"></div> + <div style="display:table-cell;"></div> + <div style="display:table-cell;"></div> + </div> + </div> +</div> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(()=> { + let rects = col1.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 215); + assert_equals(rects[0].width, 83); + assert_equals(rects[0].height, 15); + + assert_equals(rects[1].left, 8); + assert_equals(rects[1].top, 315); + assert_equals(rects[1].width, 100); + assert_equals(rects[1].height, 15); + + assert_equals(rects[2].left, 41); + assert_equals(rects[2].top, 415); + assert_equals(rects[2].width, 67); + assert_equals(rects[2].height, 15); + }, "#col1"); + + test(()=> { + let rects = col2.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 235); + assert_equals(rects[0].width, 83); + assert_equals(rects[0].height, 10); + + assert_equals(rects[1].left, 8); + assert_equals(rects[1].top, 335); + assert_equals(rects[1].width, 100); + assert_equals(rects[1].height, 10); + + assert_equals(rects[2].left, 41); + assert_equals(rects[2].top, 435); + assert_equals(rects[2].width, 67); + assert_equals(rects[2].height, 10); + }, "#col2"); + + test(()=> { + let rects = col3.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 250); + assert_equals(rects[0].width, 83); + assert_equals(rects[0].height, 20); + + assert_equals(rects[1].left, 8); + assert_equals(rects[1].top, 350); + assert_equals(rects[1].width, 100); + assert_equals(rects[1].height, 20); + + assert_equals(rects[2].left, 41); + assert_equals(rects[2].top, 450); + assert_equals(rects[2].width, 67); + assert_equals(rects[2].height, 20); + }, "#col3"); + + test(()=> { + let rects = col4.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 275); + assert_equals(rects[0].width, 83); + assert_equals(rects[0].height, 10); + + assert_equals(rects[1].left, 8); + assert_equals(rects[1].top, 375); + assert_equals(rects[1].width, 100); + assert_equals(rects[1].height, 10); + + assert_equals(rects[2].left, 41); + assert_equals(rects[2].top, 475); + assert_equals(rects[2].width, 67); + assert_equals(rects[2].height, 10); + }, "#col4"); + + test(()=> { + let rects = group.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 250); + assert_equals(rects[0].width, 83); + assert_equals(rects[0].height, 35); + + assert_equals(rects[1].left, 8); + assert_equals(rects[1].top, 350); + assert_equals(rects[1].width, 100); + assert_equals(rects[1].height, 35); + + assert_equals(rects[2].left, 41); + assert_equals(rects[2].top, 450); + assert_equals(rects[2].width, 67); + assert_equals(rects[2].height, 35); + }, "#group"); +</script> diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-007.html b/tests/wpt/tests/css/css-multicol/getclientrects-007.html new file mode 100644 index 00000000000..0791c5b931f --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/getclientrects-007.html @@ -0,0 +1,139 @@ +<!DOCTYPE html> +<title>getClientRects on fragmented table-column and table-column-group, vertical-lr</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects"> +<link rel="help" href="https://drafts.csswg.org/css-multicol/"> +<style> + body { + margin: 8px; + } +</style> +<div style="float:left; writing-mode:vertical-lr; columns:6; gap:20px; inline-size:580px; column-rule:solid; column-fill:auto; block-size:100px; background:yellow;"> + <div style="block-size:110px;"></div> + <div style="display:table; inline-size:100%; border-spacing:5px; border:2px solid; background:pink;"> + <div style="display:table-caption; block-size:100px;"></div> + <div style="display:table-caption; caption-side:bottom; block-size:100px;"></div> + <div id="col1" style="display:table-column; inline-size:15px; background:blue;"></div> + <div id="col2" style="display:table-column; background:lime;"></div> + <div id="group" style="display:table-column-group;"> + <div id="col3" style="display:table-column; inline-size:20px; background:hotpink;"></div> + <div id="col4" style="display:table-column; inline-size:10px; background:cyan;" id="col2"></div> + </div> + <div style="display:table-row-group;"> + <div style="display:table-cell;"> + <div style="block-size:5px;"></div> + </div> + </div> + <div style="display:table-row-group;"> + <div style="display:table-cell;"> + <div style="block-size:240px;"></div> + </div> + <div style="display:table-cell;"></div> + <div style="display:table-cell;"></div> + <div style="display:table-cell;"></div> + </div> + </div> +</div> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(()=> { + let rects = col1.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].top, 215); + assert_equals(rects[0].left, 25); + assert_equals(rects[0].height, 15); + assert_equals(rects[0].width, 83); + + assert_equals(rects[1].top, 315); + assert_equals(rects[1].left, 8); + assert_equals(rects[1].height, 15); + assert_equals(rects[1].width, 100); + + assert_equals(rects[2].top, 415); + assert_equals(rects[2].left, 8); + assert_equals(rects[2].height, 15); + assert_equals(rects[2].width, 67); + }, "#col1"); + + test(()=> { + let rects = col2.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].top, 235); + assert_equals(rects[0].left, 25); + assert_equals(rects[0].height, 10); + assert_equals(rects[0].width, 83); + + assert_equals(rects[1].top, 335); + assert_equals(rects[1].left, 8); + assert_equals(rects[1].height, 10); + assert_equals(rects[1].width, 100); + + assert_equals(rects[2].top, 435); + assert_equals(rects[2].left, 8); + assert_equals(rects[2].height, 10); + assert_equals(rects[2].width, 67); + }, "#col2"); + + test(()=> { + let rects = col3.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].top, 250); + assert_equals(rects[0].left, 25); + assert_equals(rects[0].height, 20); + assert_equals(rects[0].width, 83); + + assert_equals(rects[1].top, 350); + assert_equals(rects[1].left, 8); + assert_equals(rects[1].height, 20); + assert_equals(rects[1].width, 100); + + assert_equals(rects[2].top, 450); + assert_equals(rects[2].left, 8); + assert_equals(rects[2].height, 20); + assert_equals(rects[2].width, 67); + }, "#col3"); + + test(()=> { + let rects = col4.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].top, 275); + assert_equals(rects[0].left, 25); + assert_equals(rects[0].height, 10); + assert_equals(rects[0].width, 83); + + assert_equals(rects[1].top, 375); + assert_equals(rects[1].left, 8); + assert_equals(rects[1].height, 10); + assert_equals(rects[1].width, 100); + + assert_equals(rects[2].top, 475); + assert_equals(rects[2].left, 8); + assert_equals(rects[2].height, 10); + assert_equals(rects[2].width, 67); + }, "#col4"); + + test(()=> { + let rects = group.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].top, 250); + assert_equals(rects[0].left, 25); + assert_equals(rects[0].height, 35); + assert_equals(rects[0].width, 83); + + assert_equals(rects[1].top, 350); + assert_equals(rects[1].left, 8); + assert_equals(rects[1].height, 35); + assert_equals(rects[1].width, 100); + + assert_equals(rects[2].top, 450); + assert_equals(rects[2].left, 8); + assert_equals(rects[2].height, 35); + assert_equals(rects[2].width, 67); + }, "#group"); +</script> diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-008.html b/tests/wpt/tests/css/css-multicol/getclientrects-008.html new file mode 100644 index 00000000000..21505a7e48a --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/getclientrects-008.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<title>getClientRects on monolithic elements and their container</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects"> +<link rel="help" href="https://drafts.csswg.org/css-multicol/"> +<style> + body { + margin: 8px; + } +</style> +<div style="columns:3; column-fill:auto; gap:10px; width:320px; height:100px; background:yellow;"> + <div id="container" style="background:gray;"> + <div id="monolith1" style="contain:size; width:50%; height:250px; background:cyan;"></div> + <div id="monolith2" style="contain:size; width:50%; height:50px; background:black;"></div> + <div id="monolith3" style="contain:size; width:50%; height:250px; background:hotpink;"></div> + </div> +</div> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(()=> { + let rects = monolith1.getClientRects(); + assert_equals(rects.length, 1); + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 8); + assert_equals(rects[0].width, 50); + assert_equals(rects[0].height, 250); + }, "#monolith1"); + + test(()=> { + let rects = monolith2.getClientRects(); + assert_equals(rects.length, 1); + assert_equals(rects[0].left, 118); + assert_equals(rects[0].top, 8); + assert_equals(rects[0].width, 50); + assert_equals(rects[0].height, 50); + }, "#monolith2"); + + test(()=> { + let rects = monolith3.getClientRects(); + assert_equals(rects.length, 1); + assert_equals(rects[0].left, 228); + assert_equals(rects[0].top, 8); + assert_equals(rects[0].width, 50); + assert_equals(rects[0].height, 250); + }, "#monolith3"); + + test(()=> { + let rects = container.getClientRects(); + assert_equals(rects.length, 3); + + assert_equals(rects[0].left, 8); + assert_equals(rects[0].top, 8); + assert_equals(rects[0].width, 100); + assert_equals(rects[0].height, 250); + + assert_equals(rects[1].left, 118); + assert_equals(rects[1].top, 8); + assert_equals(rects[1].width, 100); + assert_equals(rects[1].height, 100); + + assert_equals(rects[2].left, 228); + assert_equals(rects[2].top, 8); + assert_equals(rects[2].width, 100); + assert_equals(rects[2].height, 250); + }, "#container"); +</script> diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html b/tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html new file mode 100644 index 00000000000..f5951efc419 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html @@ -0,0 +1,36 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Test: ::scroll-button() activation without scroller shouldn't crash</title> +<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-buttons"> +<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> +div::scroll-button(inline-start) { + content: ""; + height: 100px; + width: 100px; +} +</style> +<div></div> +<script> + promise_test(async t => { + await new test_driver.Actions() + .pointerMove(50, 50) + .pointerDown() + .pointerUp() + .pointerDown() + .pointerUp() + .send(); + const kTab = '\uE004'; + const kEnter = '\uE007'; + await new test_driver.Actions() + .keyDown(kTab) + .keyUp(kTab) + .keyDown(kEnter) + .keyUp(kEnter) + .send(); + }); +</script> diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html b/tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html new file mode 100644 index 00000000000..a8897706874 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html @@ -0,0 +1,30 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Test: disabled ::scroll-button() shouldn't be focusable</title> +<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-buttons"> +<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> +div::scroll-button(inline-start) { + content: ""; + background-color: green; +} + +div::scroll-button(inline-start):focus { + background-color: red; +} +</style> +<div id="target"></div> +<script> + promise_test(async t => { + const kTab = '\uE004'; + await new test_driver.Actions() + .keyDown(kTab) + .keyUp(kTab) + .send(); + assert_equals(getComputedStyle(target, "::scroll-button(inline-start)").backgroundColor, "rgb(0, 128, 0)"); + }); +</script> diff --git a/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html b/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html index 462186407d5..c382f738a6f 100644 --- a/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html +++ b/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html @@ -7,4 +7,4 @@ <p>Test passes if there are two buttons, the first one using appearance auto and the second using appearance: none.</p> <div></div> -<button>appearance: auto</button><button class="none">appearance: none</button> +<button disabled="true">appearance: auto</button><button disabled="true" class="none">appearance: none</button> diff --git a/tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html b/tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html new file mode 100644 index 00000000000..e6e90a63a34 --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://issues.chromium.org/issues/416061199"> +<div style="display:table;"> + <div style="display:table-column-group;"></div> + <div id="e13" style="display:table-row-group;"> + <div style="height:200vh;"></div> + x + </div> +</div> +<script> + window.scroll(0, 100); + e13.style.display = "none"; +</script> diff --git a/tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html b/tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html new file mode 100644 index 00000000000..5700c600981 --- /dev/null +++ b/tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<head> +<meta charset="utf-8"> +<title> +CSS Text Test - Letter-spacing should not be applied for Cursive Scripts. +</title> +<link rel="author" title="Sejal Anand" href="mailto:sejalanand@microsoft.com"> +<link rel="help" href="https://www.w3.org/TR/css-text-3/#cursive-tracking"> +<link rel="match" href="reference/letter-spacing-cursive-001-ref.html"> +<meta name="assert" content="Letter-spacing must not be applied to Arabic text, + preserving cursive connections."> +<style> +div { + margin: 1em; + font: 24px serif; + white-space: nowrap; + display: inline-block; + outline: 1px solid gray; +} +.letterspacing { + letter-spacing: 10px; /* Should NOT affect Arabic text */ +} +</style> +</head> +<body> +<p> +The following test will pass if no spacing appears between letters within +Arabic words. Both Arabic texts should display identically. +</p> +<div class="letterspacing"> +<span>مرحباً</span> +</div> +<br> +<div> +<span>مرحباً</span> +</div> +<br> +</body> +</html> diff --git a/tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html b/tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html new file mode 100644 index 00000000000..720c9491b4d --- /dev/null +++ b/tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<head> +<meta charset="utf-8"> +<title> +CSS Text Test - Letter-spacing should not be applied for Cursive Scripts. +</title> +<link rel="author" title="Sejal Anand" href="mailto:sejalanand@microsoft.com"> +<style> +div { + margin: 1em; + font: 24px serif; + white-space: nowrap; + display: inline-block; + outline: 1px solid gray; +} +</style> +</head> +<body> +<p> +The following test will pass if no spacing appears between letters within +Arabic words. Both Arabic texts should display identically. +</p> +<div> +<span>مرحباً</span> +</div> +<br> +<div> +<span>مرحباً</span> +</div> +<br> +</body> +</html> diff --git a/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html new file mode 100644 index 00000000000..d6fa480b040 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html @@ -0,0 +1,20 @@ +<!doctype HTML> +<style> +.tile { + width: 620px; + height: 671px; + position: absolute; + clip-path: circle(50%); + background-color: lightblue; +} +#container { + transform: scale(0.25); + position: relative; + left: -200px; + will-change: transform; +} +</style> +<div id=container> + <div class="tile" style="top: 520px;"></div> + <div class="tile" style="top: 688px; left: 390px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html new file mode 100644 index 00000000000..dda72c0d139 --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html @@ -0,0 +1,23 @@ +<!doctype HTML> +<link rel="author" title="Chris Harrelson"> +<link rel="help" href="https://drafts.csswg.org/css-transforms-2/"> +<link rel="match" href="css-scale-of-clip-path-ref.html"> +<meta name=fuzzy content="maxDifference=0-40;totalPixels=0-3000"> +<style> +.tile { + width: 620px; + height: 671px; + position: absolute; + clip-path: circle(50%); + background-color: lightblue; +} +#container { + transform: scale(0.25); + position: relative; + left: -200px; +} +</style> +<div id=container> + <div class="tile" style="top: 520px;"></div> + <div class="tile" style="top: 688px; left: 390px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html new file mode 100644 index 00000000000..e8b564ce3dd --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<style> + #container { + transform: scale(0.5); + background-color: lightblue; + font-size: 80px; + } + #animated, #content { + will-change: transform; + } +</style> +<div id=container> + <div id=content> + <div id=animated>Text</div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html new file mode 100644 index 00000000000..a479b12528a --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<link rel="author" href="mailto:chrishtr@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-transforms-2/"> +<meta name="assert" content="Text is not blurry under w/filter and animation."> +<link rel="match" href="scale-transform-filtered-text-ref.html"> +<meta name=fuzzy content="maxDifference=0-25;totalPixels=0-500"> +<style> + #container { + transform: scale(0.5); + background-color: lightblue; + font-size: 80px; + } + #content { + filter: blur(0px); + } + #animated { + will-change: transform; + } +</style> +<div id=container> + <div id=content> + <div id=animated>Text</div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html index 7a852545a74..d12714a499c 100644 --- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html +++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html @@ -18,4 +18,8 @@ runPropertyTests('transform', [ { syntax: '<transform>' }, ]); +runUnsupportedPropertyTests('transform', [ + 'matrix(sibling-index(), 2, 3, 4, 5 ,6)' +]); + </script> diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html index d31d4acf499..76d2ff8ee4d 100644 --- a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html +++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html @@ -4,7 +4,7 @@ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10982"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<style id="test_sheet"> +<style id="page_sheet"> @page { margin: 100px; margin: calc(0px * sibling-index()); @@ -13,33 +13,131 @@ margin: 100px; margin: calc(0px * sibling-count()); } +</style> +<style id="font_face_sheet"> @font-face { font-family: my-font; font-weight: 300; font-weight: calc(max(0 * sibling-index(), 400)); + font-feature-settings: "vert" 2; + font-feature-settings: "vert" calc(max(sibling-index(), 1)); } @font-face { font-family: my-font; font-weight: 300; font-weight: calc(max(0 * sibling-count(), 400)); + font-feature-settings: "vert" 2; + font-feature-settings: "vert" calc(max(sibling-count(), 1)); + } +</style> +<style id="font_palette_sheet"> + @font-palette-values --foo { + font-family: my-font; + base-palette: 1; + base-palette: calc(max(sibling-index(), 2)); + override-colors: 1 green; + override-colors: sibling-index() red; + } + @font-palette-values --foo { + font-family: my-font; + base-palette: 1; + base-palette: calc(max(sibling-count(), 2)); + override-colors: 1 green; + override-colors: sibling-count() red; + } +</style> +<style id="counter_style_sheet"> + @counter-style --foo { + system: fixed 1; + system: fixed calc(max(sibling-index(), 2)); + negative: --pass; + negative: linear-gradient(red calc(20px * sibling-index()), pink); + prefix: --pass; + prefix: linear-gradient(red calc(20px * sibling-index()), pink); + suffix: --pass; + suffix: linear-gradient(red calc(20px * sibling-index()), pink); + range: 1 infinite; + range: calc(max(sibling-index(), 2)) infinite; + pad: 1 --pass; + pad: 1 linear-gradient(red calc(20px * sibling-index()), pink); + pad: calc(max(sibling-index(), 2)) --fail; + symbols: --pass; + symbols: linear-gradient(red calc(20px * sibling-index()), pink); + } + @counter-style --foo { + system: fixed 1; + system: fixed calc(max(sibling-count(), 2)); + negative: --pass; + negative: linear-gradient(green, green); + negative: linear-gradient(red calc(20px * sibling-count()), pink); + prefix: --pass; + prefix: linear-gradient(red calc(20px * sibling-count()), pink); + suffix: --pass; + suffix: linear-gradient(red calc(20px * sibling-count()), pink); + range: 1 infinite; + range: calc(max(sibling-count(), 2)) infinite; + pad: 1 --pass; + pad: 1 linear-gradient(red calc(20px * sibling-count()), pink); + pad: calc(max(sibling-count(), 2)) --fail; + symbols: --pass; + symbols: linear-gradient(red calc(20px * sibling-count()), pink); } </style> <script> - const rules = test_sheet.sheet.cssRules; + const page_rules = page_sheet.sheet.cssRules; test(() => { - assert_equals(rules[0].style.margin, "100px"); + assert_equals(page_rules[0].style.margin, "100px"); }, "sibling-index() should not be allowed in @page properties"); test(() => { - assert_equals(rules[1].style.margin, "100px"); + assert_equals(page_rules[1].style.margin, "100px"); }, "sibling-count() should not be allowed in @page properties"); + const font_face_rules = font_face_sheet.sheet.cssRules; + test(() => { - assert_equals(rules[2].style.fontWeight, "300"); + assert_equals(font_face_rules[0].style.fontWeight, "300"); + assert_equals(font_face_rules[0].style.fontFeatureSettings, "\"vert\" 2"); }, "sibling-index() should not be allowed in @font-face descriptors"); test(() => { - assert_equals(rules[3].style.fontWeight, "300"); + assert_equals(font_face_rules[1].style.fontWeight, "300"); + assert_equals(font_face_rules[1].style.fontFeatureSettings, "\"vert\" 2"); }, "sibling-count() should not be allowed in @font-face descriptors"); + + const font_palette_rules = font_palette_sheet.sheet.cssRules; + + test(() => { + assert_equals(font_palette_rules[0].basePalette, "1"); + assert_equals(font_palette_rules[0].overrideColors, "1 green"); + }, "sibling-index() should not be allowed in @font-palette-values descriptors"); + + test(() => { + assert_equals(font_palette_rules[1].basePalette, "1"); + assert_equals(font_palette_rules[1].overrideColors, "1 green"); + }, "sibling-count() should not be allowed in @font-palette-values descriptors"); + + const counter_style_rules = counter_style_sheet.sheet.cssRules; + + test(() => { + assert_equals(counter_style_rules[0].system, "fixed 1"); + assert_equals(counter_style_rules[0].negative, "--pass"); + assert_equals(counter_style_rules[0].prefix, "--pass"); + assert_equals(counter_style_rules[0].suffix, "--pass"); + assert_equals(counter_style_rules[0].range, "1 infinite"); + assert_equals(counter_style_rules[0].pad, "1 --pass"); + assert_equals(counter_style_rules[0].symbols, "--pass"); + }, "sibling-index() should not be allowed in @counter-style descriptors"); + + test(() => { + assert_equals(counter_style_rules[1].system, "fixed 1"); + assert_equals(counter_style_rules[1].negative, "--pass"); + assert_equals(counter_style_rules[1].prefix, "--pass"); + assert_equals(counter_style_rules[1].suffix, "--pass"); + assert_equals(counter_style_rules[1].range, "1 infinite"); + assert_equals(counter_style_rules[1].pad, "1 --pass"); + assert_equals(counter_style_rules[1].symbols, "--pass"); + }, "sibling-count() should not be allowed in @counter-style descriptors"); + </script> diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html new file mode 100644 index 00000000000..cbd34602fb3 --- /dev/null +++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<title>CSS Values and Units Test: sibling-index() changing length value during @keyframes animation</title> +<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + @keyframes --anim { + from { + top: calc(100px * sibling-index()); + } + to { + top: 0px; + } + } + #target { + animation: --anim 1000s step-end; + position: absolute; + top: 13px; + width: 100px; + height: 100px; + } +</style> +<div> + <div id="rm"></div> + <div id="target"></div> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(target).top, "200px"); + }, "Initially, the sibling-index() is 2 for #target"); + + test(() => { + rm.remove(); + assert_equals(getComputedStyle(target).top, "100px"); + }, "Removing a preceding sibling of #target reduces the sibling-index()"); + +</script> diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html new file mode 100644 index 00000000000..286e0d3d3e2 --- /dev/null +++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title>CSS Values and Units Test: sibling-index() changing value during @keyframes animation</title> +<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + @keyframes --anim { + from { + z-index: sibling-index(); + } + to { + z-index: 1; + } + } + #target { + animation: --anim 1000s step-end; + position: relative; + width: 100px; + height: 100px; + background: red; + } + #abs { + position: absolute; + width: 100px; + height: 100px; + z-index: 3; + background: green; + } +</style> +<p>You should see a green square below.</p> +<div> + <div id="rm"></div> + <div id="abs"></div> + <div id="target"></div> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(target).zIndex, "3"); + }, "Initially, the sibling-index() is 3 for #target"); + + test(() => { + rm.remove(); + assert_equals(getComputedStyle(target).zIndex, "2"); + }, "Removing a preceding sibling of #target reduces the sibling-index()"); + +</script> diff --git a/tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html b/tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html new file mode 100644 index 00000000000..11232801875 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1963368"> +<style> + * { + border-style: double !important; + -webkit-transform-style: preserve-3d !important; + } +</style> +<script> + document.addEventListener("DOMContentLoaded", async () => { + document.startViewTransition(undefined) + }) +</script> diff --git a/tests/wpt/tests/css/css-view-transitions/root-replace-crash.html b/tests/wpt/tests/css/css-view-transitions/root-replace-crash.html new file mode 100644 index 00000000000..165eec41b6b --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/root-replace-crash.html @@ -0,0 +1,15 @@ +<html> +<head> + <script> + document.addEventListener("DOMContentLoaded", async () => { + const tt = document.createElementNS("http://www.w3.org/1999/xhtml", "tt") + tt.popover = "manual" + const viewTransition = document.startViewTransition(undefined) + await viewTransition.updateCallbackDone + for (let i = 0; i < 2; i++) { + document.replaceChild(tt, document.childNodes[(2324524876 % document.childNodes.length)]) + } + }) + </script> + <head> +</html> diff --git a/tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html b/tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html new file mode 100644 index 00000000000..a2faafc1694 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html class="test-wait"> +<body> +<meter><div id="node1"></div></meter> +<div> + <template shadowrootmode="open"></template> + <div id="node2"></div> +</div> +<div style="display:none"> + <div id="node3"></div> +</div> +<script> + const tr1 = node1.startViewTransition(); + const tr2 = node2.startViewTransition(); + const tr3 = node3.startViewTransition(); + onload = async () => { + await tr1.finished; + await tr2.finished; + await tr3.finished; + document.documentElement.classList.remove('test-wait'); + } +</script> +</body> +</html> diff --git a/tests/wpt/tests/css/css-view-transitions/start-skip-start.html b/tests/wpt/tests/css/css-view-transitions/start-skip-start.html new file mode 100644 index 00000000000..e04979472f1 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/start-skip-start.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Test start skip and then start on a view transition</title> + <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/"> +</head> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> + :root { + view-transition-name: none; + } + #target { + width: 100px; + height: 100px; + background: blue; + contain: paint; + view-transition-name: target; + } + #target.update-1 { + height: 150px; + } + #target.update-2 { + height: 200px; + } +</style> + +<body> + <div id="target"></div> +</body> +<script> + promise_test(async t => { + let rejected_promise_tally = 0; + const target = document.getElementById("target"); + assert_implements(document.startViewTransition, + "Missing document.startViewTransition"); + + const verifyAbortedTransition = (promise) => { + return promise.then( + () => { assert_not_reached('transition aborted') }, + (reason) => { + assert_true(reason instanceof DOMException); + assert_equals(reason.code, DOMException.ABORT_ERR); + rejected_promise_tally++; + }); + }; + + const vt1 = document.startViewTransition(() => { + target.className = 'update-1'; + }); + + vt1.skipTransition(); + const vt2 = document.startViewTransition(() => { + assert_equals(target.className, 'update-1'); + target.className = 'update-2'; + }); + + vt2.skipTransition(); + const vt3 = document.startViewTransition(() => { + assert_equals(target.className, 'update-2'); + }); + + await verifyAbortedTransition(vt1.ready); + await verifyAbortedTransition(vt2.ready); + await vt3.ready; + + assert_equals(rejected_promise_tally, 2, + 'first 2 transitions were skipped'); + const sizeTransformAnimations = document.getAnimations().filter(a => { + return 'height' in a.effect.getKeyframes()[0]; + }); + assert_equals(sizeTransformAnimations.length, 1); + const startingHeight = + sizeTransformAnimations[0].effect.getKeyframes()[0].height; + + assert_equals(startingHeight, '200px', + 'Height change applied before capture'); + + }, 'Synchronously starting a view transition blocks on DOM callback for ' + + 'previously skipped transitions'); + +</script> +</html> diff --git a/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html b/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html index d5c0abd652c..3ac946b273b 100644 --- a/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html +++ b/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html @@ -3,6 +3,7 @@ <link rel="help" href="https://www.w3.org/TR/css-transitions-2/"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> <style> ::view-transition-group(*), @@ -14,14 +15,18 @@ </style> <script> - test(() => { - assert_implements(document.startViewTransition); +promise_test(async () => { + assert_implements(document.startViewTransition); - const { types } = document.startViewTransition(); - document.documentElement.remove(); - types.add("a"); - assert_array_equals([...types], ["a"]); - }, "ViewTransitionTypeSet should not crash when documentElement is null"); + await new Promise((r) => requestAnimationFrame(() => { + waitForCompositorReady().then(r); + })); + + const { types } = document.startViewTransition(); + document.documentElement.remove(); + types.add("a"); + assert_array_equals([...types], ["a"]); +}, "ViewTransitionTypeSet should not crash when documentElement is null"); </script> </html> diff --git a/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html b/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html index 40e29181d6f..ce82b7237d0 100644 --- a/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html +++ b/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html @@ -5,17 +5,14 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <style> -div { +div[contenteditable] { white-space: pre; - font-family: Ahem; - font-size: 10px; - line-height: 1; + font: 10px/1 Ahem; width: 10ch; } </style> <body> <div contenteditable></div> -</body> <script> function getBoundingClientRect(node, offset) { const range = document.createRange(); @@ -37,3 +34,4 @@ test(function() { assert_less_than(rect6.y, rect7.y); }, 'Range.getBoundingClientRect() should return the first position of the next line when the collapsed range is a newline character'); </script> +</body> diff --git a/tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html b/tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html new file mode 100644 index 00000000000..ee2be2fd3ab --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta name="viewport" content="initial-scale=1"> +<style> +body { + height: 600px; +} +#target { + position: absolute; + top: 400px; + height: 200px; +} +</style> +<body> +<div id="target"></div> +</body> diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-container.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-container.html new file mode 100644 index 00000000000..3b241ea2251 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-container.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<title>CSSOM View - scrollIntoView container option</title> +<meta charset="utf-8"> +<meta name="viewport" content="initial-scale=1"> +<link rel="author" title="Rob Flack" href="mailto:flackr@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +.scroller { + overflow: auto; + height: 200px; +} +.spacer { + height: 400px; +} +#target { + height: 200px; +} +</style> +<script> +let setFrameLoaded = null; +let frameLoaded = new Promise(resolve => { + setFrameLoaded = resolve; +}); +</script> +<div id="outer" class="scroller"> + <div class="spacer"></div> + <div id="inner" class="scroller"> + <div class="spacer"></div> + <div id="target"></div> + <iframe id="frame" height="200" src="resources/scrollIntoView-frame.html" onload="setFrameLoaded()"></iframe> + </div> +</div> +<script> +const outer = document.getElementById('outer'); +const inner = document.getElementById('inner'); +const target = document.getElementById('target'); + +function reset() { + outer.scrollTop = 0; + inner.scrollTop = 0; +} + +test(() => { + reset(); + target.scrollIntoView(); + assert_equals(inner.scrollTop, 400, '#inner scrollTop'); + assert_equals(outer.scrollTop, 400, '#outer scrollTop'); +}, `scrollIntoView() defaults to scrolling ancestors`); + +test(() => { + reset(); + target.scrollIntoView({container: 'all'}); + assert_equals(inner.scrollTop, 400, '#inner scrollTop'); + assert_equals(outer.scrollTop, 400, '#outer scrollTop'); +}, `scrollIntoView({container: 'all'}) scrolls ancestors`); + +test(() => { + reset(); + target.scrollIntoView({container: 'nearest'}); + assert_equals(inner.scrollTop, 400, '#inner scrollTop'); + assert_equals(outer.scrollTop, 0, '#outer scrollTop'); +}, `scrollIntoView({container: 'nearest'}) only scrolls nearest scroll container`); + +test(() => { + reset(); + inner.scrollIntoView({container: 'nearest'}); + assert_equals(outer.scrollTop, 400, '#outer scrollTop'); + assert_equals(inner.scrollTop, 0, '#inner scrollTop'); +}, `scrollIntoView({container: 'nearest'}) doesn't stop at itself`); + +promise_test(async () => { + reset(); + await frameLoaded; + const frameDoc = document.getElementById("frame").contentDocument; + const frameTarget = frameDoc.getElementById("target"); + frameTarget.scrollIntoView({container: 'nearest'}); + assert_equals(frameDoc.scrollingElement.scrollTop, 400, 'frame scrollingElement scrollTop'); + assert_equals(inner.scrollTop, 0, '#inner scrollTop'); + assert_equals(outer.scrollTop, 0, '#outer scrollTop'); +}, `scrollIntoView({container: 'nearest'}) doesn't propagate to outer frames`); + +</script> diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html new file mode 100644 index 00000000000..d7faa0e97a1 --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<style> + #container { + position: relative; + width: 200px; + height: 200px; + transform: scale(1.1); + } + + #backdropfilter { + background: black; + position: relative; + width: 100%; + height: 100%; + } +</style> +<div id=container> + <div id=backdropfilter></div> +</div> + diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html new file mode 100644 index 00000000000..813fb95d5ad --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<link rel="author" href="mailto:chrishtr@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-scale-transform-ref.html"> +<style> + #container { + position: relative; + width: 200px; + height: 200px; + transform: scale(1.1); + } + + #backdropfilter { + backdrop-filter: invert(100%); + position: relative; + width: 100%; + height: 100%; + } +</style> +<div id=container> + <div id=backdropfilter></div> +</div> + diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html new file mode 100644 index 00000000000..582f0c11965 --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html @@ -0,0 +1,17 @@ +<lijnk rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1845184"> +<style> +* { + min-width: 1952643579% !important; + transform: skew(0, 1.8turn) scale(1.5794431017420837e+38) translate(215mm, 62%) scaleY(55498.5); + border-top-left-radius: 98779902.05ch; + backdrop-filter: sepia() invert(870236770%) drop-shadow(16Q -79.35pc 125vw hsla(-1.93deg, 66%, 84%)); +} +</style> +<script> +window.addEventListener("load", () => { + let a = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas") + document.documentElement.appendChild(a) + a.popover = "a" + a.togglePopover(true) +}) +</script> diff --git a/tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html b/tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html new file mode 100644 index 00000000000..3b288fca4df --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>Elements with 'opacity: 0' should respond to hit testing.</title> +<link rel="author" title="Psychpsyo" href="psychpsyo@gmail.com"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + div { + width: 100px; + height: 100px; + opacity: 0; + } +</style> +<div></div> +<script> + test(() => { + assert_equals(document.elementFromPoint(50, 50).tagName, "DIV", "element with 'opacity: 0' doesn't respond to hit testing"); + }); +</script> diff --git a/tests/wpt/tests/css/geometry/DOMMatrix-001.html b/tests/wpt/tests/css/geometry/DOMMatrix-001.html index f578da076cb..3436e17ced0 100644 --- a/tests/wpt/tests/css/geometry/DOMMatrix-001.html +++ b/tests/wpt/tests/css/geometry/DOMMatrix-001.html @@ -113,6 +113,8 @@ ['translateX (5px)', 'scale(2 2) translateX(5) translateY(5)', 'scale(2, 2), translateX(5) ,translateY(5)', + 'scale(sign(1em))', + 'scale(sibling-index())', 'translateX(5em)', 'translateX(5ex)', 'translateX(5ch)', @@ -130,10 +132,14 @@ 'translateX(5vmin)', 'translateX(5vmax)', 'translateX(5%)', + 'translateX(calc(10px * sign(1em - 10px)))', + 'translateX(calc(10px * sibling-index()))', 'rotate(5)', 'rotate(5, 5, 5)', 'rotate(5, 5px, 5px)', 'rotate(5deg, 5px, 5px)', + 'rotate(calc(5deg * sign(1em - 10px)))', + 'rotate(calc(5deg * sibling-index()))', ' ', '/**/', '\0', diff --git a/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml b/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml index 24027360aab..7f15b7fa475 100644 --- a/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml +++ b/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml @@ -25,3 +25,7 @@ features: - name: update files: - update-media-feature.html +- name: scripting + files: + - scripting.html + - scripting-* diff --git a/tests/wpt/tests/docs/writing-tests/testdriver.md b/tests/wpt/tests/docs/writing-tests/testdriver.md index 67757af63f2..e0fae529875 100644 --- a/tests/wpt/tests/docs/writing-tests/testdriver.md +++ b/tests/wpt/tests/docs/writing-tests/testdriver.md @@ -313,3 +313,11 @@ The module provides access to [Web Bluetooth](https://webbluetoothcg.github.io/w .. js:autofunction:: test_driver.bidi.bluetooth.simulate_preconnected_peripheral .. js:autofunction:: test_driver.bidi.bluetooth.request_device_prompt_updated ``` + +### Emulation ### + +Emulation of browser APIs via [WebDriver BiDi Emulation](https://www.w3.org/TR/webdriver-bidi/#module-emulation). + +```eval_rst +.. js:autofunction:: test_driver.bidi.emulation.set_geolocation_override +``` diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.html b/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.tentative.html index e13e9f1cce5..e13e9f1cce5 100644 --- a/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.html +++ b/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.tentative.html diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.tentative.html index c054ffca9c4..c054ffca9c4 100644 --- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.html +++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.tentative.html diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html index 750080e6568..750080e6568 100644 --- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.html +++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.tentative.html index be4176df59d..be4176df59d 100644 --- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html +++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.tentative.html diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.tentative.html index ef5ae3daef8..ef5ae3daef8 100644 --- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.html +++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.tentative.html diff --git a/tests/wpt/tests/dom/observable/WEB_FEATURES.yml b/tests/wpt/tests/dom/observable/WEB_FEATURES.yml new file mode 100644 index 00000000000..3e872791165 --- /dev/null +++ b/tests/wpt/tests/dom/observable/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: observable + files: "**" diff --git a/tests/wpt/tests/element-timing/resources/element-timing-helpers.js b/tests/wpt/tests/element-timing/resources/element-timing-helpers.js index 2c1bd195ea7..5ff01bfa120 100644 --- a/tests/wpt/tests/element-timing/resources/element-timing-helpers.js +++ b/tests/wpt/tests/element-timing/resources/element-timing-helpers.js @@ -19,7 +19,7 @@ function checkElementInternal(entry, expectedUrl, expectedIdentifier, expectedID assert_greater_than_equal(entry.paintTime, beforeRender, 'paintTime should represent the time when the UA started painting'); // PaintTimingMixin - if ("presentationTime" in entry) { + if ("presentationTime" in entry && entry.presentationTime !== null) { assert_greater_than(entry.presentationTime, entry.paintTime); assert_equals(entry.presentationTime, entry.renderTime); } else { diff --git a/tests/wpt/tests/event-timing/orphan-keydown.html b/tests/wpt/tests/event-timing/orphan-keydown.html new file mode 100644 index 00000000000..0ab105d4d72 --- /dev/null +++ b/tests/wpt/tests/event-timing/orphan-keydown.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: orphan keydown.</title> +<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> +<script src=resources/event-timing-test-utils.js></script> + +<body> + <button id='target'>Click me</button> + + <script> + let observedEntries = []; + const map = new Map(); + const events = ['keydown']; + + promise_test(async t => { + assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.'); + + const callback = (entryList) => {observedEntries = observedEntries.concat(entryList.getEntries().filter(filterAndAddToMap(events, map))); }; + const readyToResolve = () => { return observedEntries.length >= 1; }; + const observerPromise = createPerformanceObserverPromise(['event'], callback, readyToResolve); + + await interactAndObserve('orphan-keydown', document.getElementById('target'), observerPromise); + + assert_equals(observedEntries.length, 1, "Keydown without a keyup should be fired properly."); + assert_greater_than(map.get('keydown'), 0, "Should have a non-trivial interactionId.") + }, "Event Timing: Orphan keydown should be measured as an interaction."); + </script> +</body> +</html> diff --git a/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js b/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js index 59c78ebf39c..afad67bb6fc 100644 --- a/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js +++ b/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js @@ -554,6 +554,17 @@ async function interactAndObserve(interactionType, target, observerPromise, key interactionPromise = textSelectionAndBlockMain(target, 30); break; } + case 'orphan-keydown': { + addListeners(target, ['keydown']); + interactionPromise = new test_driver.Actions() + .pointerMove(0, 0, {origin: target}) + .pointerDown() + .pointerUp() + .addTick() + .keyDown('a') + .send(); + break; + } } return Promise.all([interactionPromise, observerPromise]); } diff --git a/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html b/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html index 2ea2d4a2599..04fcd272dcf 100644 --- a/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html +++ b/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html @@ -13,6 +13,7 @@ import {fedcm_test, mark_signed_in, disconnect_options, fedcm_get_and_select_first_account, + fedcm_select_account_promise, request_options_with_mediation_required, alt_manifest_origin, alt_request_options_with_mediation_required, @@ -82,4 +83,20 @@ fedcm_test(async t => { await IdentityCredential.disconnect(disconnect_options("1")); return IdentityCredential.disconnect(alt_disconnect_options("2")); }, 'Disconnect is bound to each IDP'); + +fedcm_test(async t => { + await mark_signed_in(alt_manifest_origin); + // Get at least one connected account that can be disconnected. + await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); + + // Pending get request. + const credentialPromise = navigator.credentials.get(alt_request_options_with_mediation_required()); + + // Disconnect the one connected account. + await IdentityCredential.disconnect(alt_disconnect_options("1234")); + + // Select an account to resolve the pending get request. + fedcm_select_account_promise(t, 0); + return credentialPromise; +}, 'Test that disconnect succeeds when there is a pending get request and the get request succeeds after the disconnect'); </script> diff --git a/tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml b/tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml new file mode 100644 index 00000000000..69b2ea582a2 --- /dev/null +++ b/tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - request-init-priority.any.js diff --git a/tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html b/tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html new file mode 100644 index 00000000000..19a80fe5edc --- /dev/null +++ b/tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTTP Cache: Cache-Control with Pragma: no-cache</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +promise_test(async t => { + // According to https://www.rfc-editor.org/rfc/rfc9111.html#name-pragma + // the pragma header is deprecated. + // When there's a mismatch between pragma and Cache-Control then the latter + // should be respected, and the resource should be cached. + const url = 'resources/cached_pragma_rand.py' + + // First fetch to populate the cache + const response1 = await fetch(url, { cache: 'default' }); + assert_true(response1.ok, 'First fetch should succeed'); + const text1 = await response1.text(); + + // Second fetch should be served from cache + const response2 = await fetch(url, { cache: 'default' }); + assert_true(response2.ok, 'Second fetch should succeed'); + const text2 = await response2.text(); + + assert_equals(text1, text2, 'Responses should be identical, indicating caching'); +}, 'Response with Cache-Control: max-age=2592000, public and Pragma: no-cache should be cached'); +</script> +</body> diff --git a/tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py b/tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py new file mode 100644 index 00000000000..18c7d25159f --- /dev/null +++ b/tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py @@ -0,0 +1,14 @@ +def main(request, response): + # Disable non-standard XSS protection + response.headers.set(b"X-XSS-Protection", b"0") + response.headers.set(b"Content-Type", b"text/html") + + # Set caching headers + # According to rfc9111 Pragma: no-cache is deprecated, so we expect + # Cache-Control to take precedence when there's a mismatch. + response.headers.set(b"Cache-Control", b"max-age=2592000, public") + response.headers.set(b"Pragma", b"no-cache") + + # Include a timestamp to verify caching behavior + import time + response.content = f"Timestamp: {time.time()}".encode('utf-8') diff --git a/tests/wpt/tests/fetch/local-network-access/META.yml b/tests/wpt/tests/fetch/local-network-access/META.yml new file mode 100644 index 00000000000..4c5c6983ed0 --- /dev/null +++ b/tests/wpt/tests/fetch/local-network-access/META.yml @@ -0,0 +1,5 @@ +spec: https://wicg.github.io/local-network-access/ +suggested_reviewers: + - cthomp + - camillelamy + - hchao diff --git a/tests/wpt/tests/fetch/local-network-access/README.md b/tests/wpt/tests/fetch/local-network-access/README.md new file mode 100644 index 00000000000..95066cdcd0b --- /dev/null +++ b/tests/wpt/tests/fetch/local-network-access/README.md @@ -0,0 +1,11 @@ +# Local Network Access tests + +This directory contains tests for Local Network Access' integration with +the Fetch specification. + +See also: + +* [Explainer](https://github.com/explainers-by-googlers/local-network-access) + +Local Network Access replaced [Private Network +Access](https://wicg.github.io/local-network-access/). diff --git a/tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html b/tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html new file mode 100644 index 00000000000..9c591f309b7 --- /dev/null +++ b/tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>LNA Fetch tests: HTTPS </title> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/support.sub.js"></script> +<script> + "use strict"; + + promise_test(t => { + const sourceUrl = resolveUrl("resources/fetch-private.html", + sourceResolveOptions({ server: Server.HTTPS_PUBLIC })); + + function checkResult(evt) { + checkTestResult(evt.data, FetchTestResult.SUCCESS); + t.done(); + } + + const promise = new Promise((resolve) => { + window.addEventListener('message', resolve, {once: true}); + }).then(checkResult); + const popup = window.open(sourceUrl); + t.add_cleanup(() => popup.close()); + + return promise; + }, 'LNA Public to private with permission'); + + promise_test(t => { + // TODO(crbug.com/406991278): consider moving permission url param into + // options + const sourceUrl = resolveUrl("resources/fetch-private.html?permission=denied", + sourceResolveOptions({ server: Server.HTTPS_PUBLIC })); + + function checkResult(evt) { + checkTestResult(evt.data, FetchTestResult.FAILURE); + t.done(); + } + + const promise = new Promise((resolve) => { + window.addEventListener('message', resolve, {once: true}); + }).then(checkResult); + const popup = window.open(sourceUrl); + t.add_cleanup(() => popup.close()); + + return promise; + }, 'LNA Public to private with permission denied'); +</script> +</body> diff --git a/tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html b/tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html new file mode 100644 index 00000000000..b96a207ec33 --- /dev/null +++ b/tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Fetch Private resource</title> + +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="support.sub.js"></script> +<script> +"use strict"; + +// Set the 'local-network-access' permission then attempt to fetch a resource +// in the private address space. +// +// By default, 'local-network-access' permission is set to 'granted'. This can +// be changed by passing in a different value via the 'permission' URL parameter. +// Valid values: +// +// * granted +// * denied +// * prompt +Promise.resolve().then(async () => { + + const window_url = new URL(window.location.href); + let permission_value = 'granted'; + if (window_url.searchParams.has('permission')) { + permission_value = window_url.searchParams.get('permission'); + } + + test_driver.set_test_context(opener); + await test_driver.set_permission({ name: 'local-network-access' }, permission_value); + + const target = { + server: Server.HTTPS_PRIVATE, + behavior: { response: ResponseBehavior.allowCrossOrigin() }, + }; + const targetUrl = resolveTargetUrl(target); + + fetch(targetUrl) + .then(async function(response) { + const body = await response.text(); + const message = { + ok: response.ok, + type: response.type, + body: body, + }; + opener.postMessage(message, "*"); + }) + .catch(error => { + opener.postMessage({ error: error.toString() }, "*"); + }); +}); +</script> diff --git a/tests/wpt/tests/fetch/local-network-access/resources/support.sub.js b/tests/wpt/tests/fetch/local-network-access/resources/support.sub.js new file mode 100644 index 00000000000..774e34d0a6f --- /dev/null +++ b/tests/wpt/tests/fetch/local-network-access/resources/support.sub.js @@ -0,0 +1,186 @@ +// Maps protocol (without the trailing colon) and address space to port. +const SERVER_PORTS = { + "http": { + "local": {{ports[http][0]}}, + "private": {{ports[http-private][0]}}, + "public": {{ports[http-public][0]}}, + }, + "https": { + "local": {{ports[https][0]}}, + "other-local": {{ports[https][1]}}, + "private": {{ports[https-private][0]}}, + "public": {{ports[https-public][0]}}, + }, + "ws": { + "local": {{ports[ws][0]}}, + }, + "wss": { + "local": {{ports[wss][0]}}, + }, +}; + +// A `Server` is a web server accessible by tests. It has the following shape: +// +// { +// addressSpace: the IP address space of the server ("local", "private" or +// "public"), +// name: a human-readable name for the server, +// port: the port on which the server listens for connections, +// protocol: the protocol (including trailing colon) spoken by the server, +// } +// +// Constants below define the available servers, which can also be accessed +// programmatically with `get()`. +class Server { + // Maps the given `protocol` (without a trailing colon) and `addressSpace` to + // a server. Returns null if no such server exists. + static get(protocol, addressSpace) { + const ports = SERVER_PORTS[protocol]; + if (ports === undefined) { + return null; + } + + const port = ports[addressSpace]; + if (port === undefined) { + return null; + } + + return { + addressSpace, + name: `${protocol}-${addressSpace}`, + port, + protocol: protocol + ':', + }; + } + + static HTTP_LOCAL = Server.get("http", "local"); + static HTTP_PRIVATE = Server.get("http", "private"); + static HTTP_PUBLIC = Server.get("http", "public"); + static HTTPS_LOCAL = Server.get("https", "local"); + static OTHER_HTTPS_LOCAL = Server.get("https", "other-local"); + static HTTPS_PRIVATE = Server.get("https", "private"); + static HTTPS_PUBLIC = Server.get("https", "public"); + static WS_LOCAL = Server.get("ws", "local"); + static WSS_LOCAL = Server.get("wss", "local"); +}; + +// Resolves a URL relative to the current location, returning an absolute URL. +// +// `url` specifies the relative URL, e.g. "foo.html" or "http://foo.example". +// `options`, if defined, should have the following shape: +// +// { +// // Optional. Overrides the protocol of the returned URL. +// protocol, +// +// // Optional. Overrides the port of the returned URL. +// port, +// +// // Extra headers. +// headers, +// +// // Extra search params. +// searchParams, +// } +// +function resolveUrl(url, options) { + const result = new URL(url, window.location); + if (options === undefined) { + return result; + } + + const { port, protocol, headers, searchParams } = options; + if (port !== undefined) { + result.port = port; + } + if (protocol !== undefined) { + result.protocol = protocol; + } + if (headers !== undefined) { + const pipes = []; + for (key in headers) { + pipes.push(`header(${key},${headers[key]})`); + } + result.searchParams.append("pipe", pipes.join("|")); + } + if (searchParams !== undefined) { + for (key in searchParams) { + result.searchParams.append(key, searchParams[key]); + } + } + + return result; +} + +// Computes options to pass to `resolveUrl()` for a source document's URL. +// +// `server` identifies the server from which to load the document. +// `treatAsPublic`, if set to true, specifies that the source document should +// be artificially placed in the `public` address space using CSP. +function sourceResolveOptions({ server, treatAsPublic }) { + const options = {...server}; + if (treatAsPublic) { + options.headers = { "Content-Security-Policy": "treat-as-public-address" }; + } + return options; +} + +// Computes the URL of a target handler configured with the given options. +// +// `server` identifies the server from which to load the resource. +// `behavior` specifies the behavior of the target server. It may contain: +// - `response`: The result of calling one of `ResponseBehavior`'s methods. +// - `redirect`: A URL to which the target should redirect GET requests. +function resolveTargetUrl({ server, behavior }) { + if (server === undefined) { + throw new Error("no server specified."); + } + const options = {...server}; + if (behavior) { + const { response, redirect } = behavior; + options.searchParams = { + ...response, + }; + if (redirect !== undefined) { + options.searchParams.redirect = redirect; + } + } + + return resolveUrl("target.py", options); +} + +// Methods generate behavior specifications for how `resources/target.py` +// should behave upon receiving a regular (non-preflight) request. +const ResponseBehavior = { + // The response should succeed without CORS headers. + default: () => ({}), + + // The response should succeed with CORS headers. + allowCrossOrigin: () => ({ "final-headers": "cors" }), +}; + +const FetchTestResult = { + SUCCESS: { + ok: true, + body: "success", + }, + OPAQUE: { + ok: false, + type: "opaque", + body: "", + }, + FAILURE: { + error: "TypeError: Failed to fetch", + }, +}; + +// Helper function for checking results from fetch tests. +function checkTestResult(actual, expected) { + assert_equals(actual.error, expected.error, "error mismatch"); + assert_equals(actual.ok, expected.ok, "response ok mismatch"); + assert_equals(actual.body, expected.body, "response body mismatch"); + + if (expected.type !== undefined) { + assert_equals(type, expected.type, "response type mismatch"); + } +} diff --git a/tests/wpt/tests/fetch/local-network-access/resources/target.py b/tests/wpt/tests/fetch/local-network-access/resources/target.py new file mode 100644 index 00000000000..eabcdd47517 --- /dev/null +++ b/tests/wpt/tests/fetch/local-network-access/resources/target.py @@ -0,0 +1,105 @@ +# This endpoint responds to requests for a target of a (possible) LNA request. +# +# Its behavior can be configured with various search/GET parameters, all of +# which are optional: +# +# - final-headers: Valid values are: +# - cors: this endpoint responds with valid CORS headers to CORS-enabled +# non-preflight requests. These should be sufficient for non-preflighted +# CORS-enabled requests to succeed. +# - sw: this endpoint responds with a valid Service-Worker header to allow +# for the request to serve as a Service worker script resource. This is +# only valid in conjunction with the cors value above. +# - unspecified: this endpoint responds with no CORS headers to non-preflight +# requests. This should fail CORS-enabled requests, but be sufficient for +# no-CORS requests. +# +# The following parameters only affect non-preflight responses: +# +# - redirect: If set, the response code is set to 301 and the `Location` +# response header is set to this value. +# - mime-type: If set, the `Content-Type` response header is set to this value. +# - file: Specifies a path (relative to this file's directory) to a file. If +# set, the response body is copied from this file. +# - random-js-prefix: If set to any value, the response body is prefixed with +# a Javascript comment line containing a random value. This is useful in +# service worker tests, since service workers are only updated if the new +# script is not byte-for-byte identical with the old script. +# - body: If set and `file` is not, the response body is set to this value. +# + +import os +import random + +from wptserve.utils import isomorphic_encode + +_ACAO = ("Access-Control-Allow-Origin", "*") +_ACAH = ("Access-Control-Allow-Headers", "Service-Worker") + +def _get_response_headers(method, mode, origin): + acam = ("Access-Control-Allow-Methods", method) + + if mode == b"cors": + return [acam, _ACAO] + + if mode == b"cors+sw": + return [acam, _ACAO, _ACAH] + + if mode == b"navigation": + return [ + acam, + ("Access-Control-Allow-Origin", origin), + ("Access-Control-Allow-Credentials", "true"), + ] + + return [] + + +def _is_loaded_in_fenced_frame(request): + return request.GET.get(b"is-loaded-in-fenced-frame") + +def _final_response_body(request): + file_name = None + if file_name is None: + file_name = request.GET.get(b"file") + if file_name is None: + return request.GET.get(b"body") or "success" + + prefix = b"" + if request.GET.get(b"random-js-prefix"): + value = random.randint(0, 1000000000) + prefix = isomorphic_encode("// Random value: {}\n\n".format(value)) + + path = os.path.join(os.path.dirname(isomorphic_encode(__file__)), file_name) + with open(path, 'rb') as f: + contents = f.read() + + return prefix + contents + +def _handle_final_request(request, response): + mode = request.GET.get(b"final-headers") + origin = request.headers.get("Origin") + headers = _get_response_headers(request.method, mode, origin) + + redirect = request.GET.get(b"redirect") + if redirect is not None: + headers.append(("Location", redirect)) + return (301, headers, b"") + + mime_type = request.GET.get(b"mime-type") + if mime_type is not None: + headers.append(("Content-Type", mime_type),) + + if _is_loaded_in_fenced_frame(request): + headers.append(("Supports-Loading-Mode", "fenced-frame")) + + body = _final_response_body(request) + return (headers, body) + + +def main(request, response): + try: + return _handle_final_request(request, response) + except BaseException as e: + # Surface exceptions to the client, where they show up as assertion errors. + return (500, [("X-exception", str(e))], "exception: {}".format(e)) diff --git a/tests/wpt/tests/file-system-access/WEB_FEATURES.yml b/tests/wpt/tests/file-system-access/WEB_FEATURES.yml index 45e40acba1d..7faf67952b5 100644 --- a/tests/wpt/tests/file-system-access/WEB_FEATURES.yml +++ b/tests/wpt/tests/file-system-access/WEB_FEATURES.yml @@ -1,3 +1,7 @@ features: - name: file-system-access files: "**" +- name: origin-private-file-system + files: + - getDirectory.https.any.js + - opaque-origin.https.window.js diff --git a/tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html b/tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html new file mode 100644 index 00000000000..91cf6ae6ee2 --- /dev/null +++ b/tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<title>Named lookup does not work with noopener</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script> +<link rel="help" href="https://github.com/whatwg/html/issues/11291"> + +<body> +<script> + +promise_test(async t => { + const windowName = 'named-window'; + + const rcHelper = new RemoteContextHelper(); + const rcPopup1 = await rcHelper.addWindow(undefined, { target: windowName, features: 'noopener' }); + const rcPopup2 = await rcHelper.addWindow(undefined, { target: windowName, features: 'noopener' }); + + // If both scripts execute, then the windows are separate, and the test passes. + // If the window is reused, then rcPopup1 will not be able to execute script, and so the test will timeout. + + assert_equals(await rcPopup1.executeScript(() => window.name), windowName); + assert_equals(await rcPopup2.executeScript(() => window.name), windowName); +}, 'Two noopener window.open() calls create separate windows'); + +promise_test(async t => { + const windowName = 'named-window-2'; + + function executorCreator(url) { + const a = document.createElement("a"); + a.href = url; + a.rel = 'noopener'; + a.target = windowName; + document.body.append(a); + a.click(); + } + + const rcHelper = new RemoteContextHelper(); + const rcPopup1 = await rcHelper.createContext({ executorCreator }); + const rcPopup2 = await rcHelper.createContext({ executorCreator }); + + // If both scripts execute, then the windows are separate, and the test passes. + // If the window is reused, then rcPopup1 will not be able to execute script, and so the test will timeout. + + assert_equals(await rcPopup1.executeScript(() => window.name), windowName); + assert_equals(await rcPopup2.executeScript(() => window.name), windowName); +}, 'Two rel=noopener <a href> clicks create separate windows'); +</script> diff --git a/tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 00000000000..b4d11212a6c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**" diff --git a/tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml new file mode 100644 index 00000000000..1bbef5e88d6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: canvas-roundrect + files: + - 2d.path.roundrect.* diff --git a/tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 00000000000..b4d11212a6c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**" diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 00000000000..b4d11212a6c --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**" diff --git a/tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml new file mode 100644 index 00000000000..1bbef5e88d6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: canvas-roundrect + files: + - 2d.path.roundrect.* diff --git a/tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 00000000000..b4d11212a6c --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**" diff --git a/tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html b/tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html new file mode 100644 index 00000000000..653944e155b --- /dev/null +++ b/tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html @@ -0,0 +1,65 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<head> +<title>Test dragging still occurs when pointerdown adds display:none to the dragged element</title> +<style> +.dragging { + display: none; +} + +#dragBox { + width: 200px; + height: 200px; + background-color: #4CAF50; + color: white; + border-radius: 8px; + cursor: grab; + user-select: none; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.inner { + background: rgba(255, 255, 255, 0.2); + padding: 10px; + margin-top: 10px; + border-radius: 4px; +} +</style> +</head> +<body> +<div id="dragBox" draggable="true"> + Drag me + <div class="inner" id="innerButton">Click or press here</div> +</div> +<script> + +promise_test(function() { + return new Promise(r => { + innerButton.addEventListener("pointerdown", function() { + innerButton.classList.add("dragging"); + }); + + dragBox.addEventListener("dragstart", function(e) { + assert_equals(e.target, dragBox); + r(); + }); + + const buttonRect = innerButton.getBoundingClientRect(); + new test_driver.Actions() + .pointerMove(0, 0, {origin: innerButton}) + .pointerDown() + .pointerMove(buttonRect.left + 10, buttonRect.top + 10) + .pointerUp() + .send(); + }); +}, "dragstart should still fire when the dragged element gets display:none in its pointerdown"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml b/tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml new file mode 100644 index 00000000000..5716baa5def --- /dev/null +++ b/tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-img-fetchpriority.html diff --git a/tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml b/tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml new file mode 100644 index 00000000000..864bd3398ee --- /dev/null +++ b/tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-script-fetchpriority.html diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html new file mode 100644 index 00000000000..bf3fbab9d18 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/402429384"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> + +<style> +select, ::picker(select) { + appearance: base-select; +} +</style> + +<select> + <div id=inputwrapper></div> + <option class=one>one</option> + <option class=two>two</option> +</select> + +<script> +const select = document.querySelector('select'); +const optionOne = select.querySelector('option.one'); +const optionTwo = select.querySelector('option.two'); +const input = document.createElement('input'); +document.getElementById('inputwrapper').appendChild(input); + +function pressKey(key) { + return (new test_driver.Actions() + .keyDown(key) + .keyUp(key)) + .send(); +} +const spaceKey = '\uE00D'; +const arrowDown = '\uE015'; +const arrowUp = '\uE013'; + +promise_test(async () => { + assert_equals(getComputedStyle(select).appearance, 'base-select', + 'appearance: base-select must be supported for this test to run.'); + + select.focus(); + await pressKey(spaceKey); + assert_true(select.matches(':open'), + 'select should be open after pressing space.'); + assert_equals(document.activeElement, input, + 'input should be focused after opening select.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionOne, + 'first option should be focused after arrow down from input.'); + + await pressKey(arrowUp); + assert_equals(document.activeElement, input, + 'input should be focused after arrow up from first option.'); +}, 'Keyboard behavior of <input> in <select>.'); +</script> diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html index 0ba07b16f49..9d520943d5f 100644 --- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html +++ b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html @@ -7,21 +7,24 @@ <button id=hasinterest>Button</button> <button class=otherselector>Button</button> <button class=otherselector>Button</button> -<div id=target>Target</div> +<div popover id=target>Target</div> <style> #hasinterest { - background-color: red; - outline: solid 3px -webkit-focus-ring-color; + background-color: purple; } .otherselector { background-color: green; } #target { background-color: yellow; + inset:auto; + top:50px; + left:0; } </style> <script> + target.showPopover(); hasinterest.focus(); </script> diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html index 8c0ebd7a2cd..b6d0ff10932 100644 --- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html +++ b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html @@ -13,7 +13,7 @@ <button id=b3 interesttarget=target>Button</button> <button id=b4>Button</button> <button id=b5>Button</button> -<div id=target>Target</div> +<div popover id=target>Target</div> <style> :has-interest { @@ -22,18 +22,24 @@ :has-interest:has-partial-interest { background-color: red; } - :has-partial-interest + button { + /* Test complicated combinators: */ + :has-interest + button { background-color: green; } :root:has(:has-interest) #b5 { background-color: green; } - :target-of-interest:target-of-partial-interest { + :target-of-interest { background-color: yellow; } [interesttarget] { interest-target-delay: 0s; } + #target { + inset:auto; + top:50px; + left:0; + } </style> <script> diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html deleted file mode 100644 index 33b0cf66858..00000000000 --- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8" /> -<link rel="author" href="mailto:masonf@chromium.org"> - -<button id=non_interesttarget_button>Interesttarget Button</button> - -<script> - document.querySelector('#non_interesttarget_button').focus(); -</script> diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html deleted file mode 100644 index 28cb2052a8d..00000000000 --- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8" /> -<link rel="author" href="mailto:masonf@chromium.org"> -<link rel="help" href="https://open-ui.org/components/interest-invokers.explainer/" /> -<link rel="mismatch" href="interesttarget-outline-appearance-ref.html"> - -<button interesttarget=target>Interesttarget Button</button> - -<style> - /* Outline style should apply even when the element doesn't have interest. */ - :has-interest { background-color: red; } -</style> - -<script> - document.querySelector('[interesttarget]').focus(); -</script> diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html new file mode 100644 index 00000000000..bc7184d42d2 --- /dev/null +++ b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel="help" href="https://open-ui.org/components/interest-invokers.explainer/" /> +<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> +<script src="resources/invoker-utils.js"></script> + +<button id=invoker interesttarget=target>Button</button> +<div id=target popover>Popover with <button id=contained>button</button></div> + +<style> + [interesttarget] { + interest-target-delay: 0s; + } +</style> + +<script> + let expectInterest; + let expectPartial; + let eventCount = 0; + function checkInterest(e) { + const notStr = expectInterest ? "" : "not "; + const event = e instanceof Event ? `${e.type} event` : e; + assert_equals(invoker.matches(':has-interest'),expectInterest,`target should ${notStr}gain interest (${event})`); + assert_equals(invoker.matches(':has-partial-interest'),expectInterest&&expectPartial,`Interest should ${expectPartial ? "" : "not "}be partial (${event})`); + assert_equals(target.matches(':popover-open'),expectInterest,`popover should ${notStr}be open (${event})`); + ++eventCount; + } + + promise_test(async function (t) { + invoker.addEventListener('focus',checkInterest); + target.addEventListener('interest',(e) => { + checkInterest(e); + expectInterest = true; + expectPartial = true; + }); + + expectInterest = false; + expectPartial = false; + await focusOn(invoker); + assert_equals(eventCount,2,'focus and interest should both have fired'); + assert_true(expectInterest,'the interest event should set this'); + checkInterest('before hot key'); + await sendShowInterestHotkey(); + expectPartial = false; + checkInterest('after hot key'); + },'Partial interest timing should not be observable'); +</script> diff --git a/tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml b/tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml new file mode 100644 index 00000000000..6a444ee171a --- /dev/null +++ b/tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-link-fetchpriority.html diff --git a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html index 5cbcf546423..e339f39dcd8 100644 --- a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html +++ b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html @@ -13,10 +13,6 @@ descriptor: {name: "geolocation"}, state: "granted", }); - - // Ensure any previously set geolocation emulations are cleared. - await test_driver.bidi.emulation.set_geolocation_override( - {coordinates: null}); }); /** Get the current geolocation or error */ @@ -24,13 +20,13 @@ return new Promise( resolve => window.navigator.geolocation.getCurrentPosition( position => resolve(position.coords.toJSON()), - error => resolve({code: error.code, message: error.message}), + error => resolve({code: error.code}), // Fail fast if geolocation is not available. {timeout: 500} )) } - /** Asserts that relevant coordinate properties match */ + /** Asserts that coordinate or error matches the expected value */ function assert_coordinates_match(actual, expected) { for (const key in expected) { assert_equals(actual[key], expected[key], @@ -49,6 +45,11 @@ }; promise_test(async (t) => { + t.add_cleanup(async () => { + await test_driver.bidi.emulation.set_geolocation_override( + {coordinates: null}); + }); + // Get the initial geolocation (might be error). const initial_coords = await get_current_geolocation(); @@ -66,6 +67,28 @@ await test_driver.bidi.emulation.set_geolocation_override( {coordinates: null}); // Assert coordinates are set to the original value. - assert_coordinates_match(await get_current_geolocation(), initial_coords); + assert_coordinates_match(await get_current_geolocation(), + initial_coords); }, "emulate geolocation and clear override"); + + promise_test(async (t) => { + // Emulate position unavailable. + await test_driver.bidi.emulation.set_geolocation_override({ + error: {type: 'positionUnavailable'}, + }); + + // Get the geolocation after setting the override. + const error = await get_current_geolocation(); + + assert_equals(error.code, 2, + `Geolocation should be unavailable with code POSITION_UNAVAILABLE = 2`); + }, "emulate geolocation position unavailable"); + + promise_test(async (t) => { + assert_throws_js(Error, + () => test_driver.bidi.emulation.set_geolocation_override({ + error: {type: 'positionUnavailable'}, + coordinates: SOME_COORDINATES + }), "Setting both `coordinates` and `error` should fail"); + }, "cannot set `coordinates` and `error` simultaneously"); </script> diff --git a/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html b/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html index fb3655398db..9e5d9b9ef99 100644 --- a/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html +++ b/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html @@ -21,7 +21,7 @@ promise_test(async function () { await loadIframe( - "<input type='number' style='width: 100px; height: 20px'>" + "<input type='number' style='width: 100px; height: 20px' value='5'>" ); const inputElement = frame.contentDocument.querySelector("input"); @@ -38,12 +38,14 @@ events.push("change"); }); + assert_equals(inputElement.value, "5", "Original value should be 5"); + // Roughly get the offset to the spin up arrow button's center point within // the iframe's viewport. Note that this is fragile and might need specific // coordinates for each browser and maybe platform. const rect = inputElement.getBoundingClientRect(); - const x = rect.x + rect.width - 10; - const y = rect.y + Math.round(rect.height / 4); + const x = Math.round(rect.x + rect.width - 5); + const y = Math.round(rect.y + (3 * rect.height) / 4); const actions = new test_driver.Actions() .setContext(frame.contentWindow) @@ -52,6 +54,7 @@ .pointerUp(); await actions.send(); + assert_equals(inputElement.value, "6", "Value should increase after clicking the up arrow"); assert_array_equals(events, ['beforeinput']); assert_false(document.body.contains(frame)); }, "Number input should not crash and not fire subsequent events when event handler removes document"); diff --git a/tests/wpt/tests/interfaces/largest-contentful-paint.idl b/tests/wpt/tests/interfaces/largest-contentful-paint.idl index 872ba552b0d..d1630cc7daa 100644 --- a/tests/wpt/tests/interfaces/largest-contentful-paint.idl +++ b/tests/wpt/tests/interfaces/largest-contentful-paint.idl @@ -5,7 +5,6 @@ [Exposed=Window] interface LargestContentfulPaint : PerformanceEntry { - readonly attribute DOMHighResTimeStamp renderTime; readonly attribute DOMHighResTimeStamp loadTime; readonly attribute unsigned long size; readonly attribute DOMString id; @@ -13,3 +12,5 @@ interface LargestContentfulPaint : PerformanceEntry { readonly attribute Element? element; [Default] object toJSON(); }; + +LargestContentfulPaint includes PaintTimingMixin; diff --git a/tests/wpt/tests/interfaces/service-workers.idl b/tests/wpt/tests/interfaces/service-workers.idl index d9ff2f651f8..34af3372401 100644 --- a/tests/wpt/tests/interfaces/service-workers.idl +++ b/tests/wpt/tests/interfaces/service-workers.idl @@ -34,7 +34,7 @@ interface ServiceWorkerRegistration : EventTarget { readonly attribute USVString scope; readonly attribute ServiceWorkerUpdateViaCache updateViaCache; - [NewObject] Promise<undefined> update(); + [NewObject] Promise<ServiceWorkerRegistration> update(); [NewObject] Promise<boolean> unregister(); // event diff --git a/tests/wpt/tests/interfaces/webauthn.idl b/tests/wpt/tests/interfaces/webauthn.idl index a33c85e7bad..7fbe55e6765 100644 --- a/tests/wpt/tests/interfaces/webauthn.idl +++ b/tests/wpt/tests/interfaces/webauthn.idl @@ -311,22 +311,37 @@ enum PublicKeyCredentialHint { partial dictionary AuthenticationExtensionsClientInputs { DOMString appid; }; +partial dictionary AuthenticationExtensionsClientInputsJSON { + DOMString appid; +}; partial dictionary AuthenticationExtensionsClientOutputs { boolean appid; }; +partial dictionary AuthenticationExtensionsClientOutputsJSON { + boolean appid; +}; partial dictionary AuthenticationExtensionsClientInputs { DOMString appidExclude; }; +partial dictionary AuthenticationExtensionsClientInputsJSON { + DOMString appidExclude; +}; partial dictionary AuthenticationExtensionsClientOutputs { boolean appidExclude; }; +partial dictionary AuthenticationExtensionsClientOutputsJSON { + boolean appidExclude; +}; partial dictionary AuthenticationExtensionsClientInputs { boolean credProps; }; +partial dictionary AuthenticationExtensionsClientInputsJSON { + boolean credProps; +}; dictionary CredentialPropertiesOutput { boolean rk; @@ -335,33 +350,57 @@ dictionary CredentialPropertiesOutput { partial dictionary AuthenticationExtensionsClientOutputs { CredentialPropertiesOutput credProps; }; +partial dictionary AuthenticationExtensionsClientOutputsJSON { + CredentialPropertiesOutput credProps; +}; dictionary AuthenticationExtensionsPRFValues { required BufferSource first; BufferSource second; }; +dictionary AuthenticationExtensionsPRFValuesJSON { + required Base64URLString first; + Base64URLString second; +}; dictionary AuthenticationExtensionsPRFInputs { AuthenticationExtensionsPRFValues eval; record<DOMString, AuthenticationExtensionsPRFValues> evalByCredential; }; +dictionary AuthenticationExtensionsPRFInputsJSON { + AuthenticationExtensionsPRFValuesJSON eval; + record<DOMString, AuthenticationExtensionsPRFValuesJSON> evalByCredential; +}; partial dictionary AuthenticationExtensionsClientInputs { AuthenticationExtensionsPRFInputs prf; }; +partial dictionary AuthenticationExtensionsClientInputsJSON { + AuthenticationExtensionsPRFInputsJSON prf; +}; dictionary AuthenticationExtensionsPRFOutputs { boolean enabled; AuthenticationExtensionsPRFValues results; }; +dictionary AuthenticationExtensionsPRFOutputsJSON { + boolean enabled; + AuthenticationExtensionsPRFValuesJSON results; +}; partial dictionary AuthenticationExtensionsClientOutputs { AuthenticationExtensionsPRFOutputs prf; }; +partial dictionary AuthenticationExtensionsClientOutputsJSON { + AuthenticationExtensionsPRFOutputsJSON prf; +}; partial dictionary AuthenticationExtensionsClientInputs { AuthenticationExtensionsLargeBlobInputs largeBlob; }; +partial dictionary AuthenticationExtensionsClientInputsJSON { + AuthenticationExtensionsLargeBlobInputsJSON largeBlob; +}; enum LargeBlobSupport { "required", @@ -373,13 +412,26 @@ dictionary AuthenticationExtensionsLargeBlobInputs { boolean read; BufferSource write; }; +dictionary AuthenticationExtensionsLargeBlobInputsJSON { + DOMString support; + boolean read; + Base64URLString write; +}; partial dictionary AuthenticationExtensionsClientOutputs { AuthenticationExtensionsLargeBlobOutputs largeBlob; }; +partial dictionary AuthenticationExtensionsClientOutputsJSON { + AuthenticationExtensionsLargeBlobOutputsJSON largeBlob; +}; dictionary AuthenticationExtensionsLargeBlobOutputs { boolean supported; ArrayBuffer blob; boolean written; }; +dictionary AuthenticationExtensionsLargeBlobOutputsJSON { + boolean supported; + Base64URLString blob; + boolean written; +}; diff --git a/tests/wpt/tests/largest-contentful-paint/idlharness.html b/tests/wpt/tests/largest-contentful-paint/idlharness.html index 5f5d286b356..0dd006e711c 100644 --- a/tests/wpt/tests/largest-contentful-paint/idlharness.html +++ b/tests/wpt/tests/largest-contentful-paint/idlharness.html @@ -10,7 +10,7 @@ idl_test( ['largest-contentful-paint'], - ['performance-timeline', 'dom', 'hr-time'], + ['performance-timeline', 'dom', 'hr-time', 'paint-timing'], async (idl_array, t) => { idl_array.add_objects({ LargestContentfulPaint: ['lcp'] diff --git a/tests/wpt/tests/largest-contentful-paint/observe-text.html b/tests/wpt/tests/largest-contentful-paint/observe-text.html index 0724a0bb92b..d029d500aa1 100644 --- a/tests/wpt/tests/largest-contentful-paint/observe-text.html +++ b/tests/wpt/tests/largest-contentful-paint/observe-text.html @@ -26,7 +26,7 @@ p { // PaintTimingMixin assert_greater_than_equal(entry.paintTime, beforeRender, 'paintTime should represent the time when the UA started painting'); - if ("presentationTime" in entry) { + if ("presentationTime" in entry && entry.presentationTime !== null) { assert_greater_than(entry.presentationTime, entry.paintTime); assert_equals(entry.presentationTime, entry.renderTime); } else { diff --git a/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js b/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js index a01080c0088..99916f5c5d3 100644 --- a/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js +++ b/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js @@ -55,7 +55,7 @@ function checkImage(entry, expectedUrl, expectedID, expectedSize, timeLowerBound assert_greater_than_equal(entry.paintTime, timeLowerBound, 'paintTime should represent the time when the UA started painting'); // PaintTimingMixin - if ("presentationTime" in entry) { + if ("presentationTime" in entry && entry.presentationTime !== null) { assert_greater_than(entry.presentationTime, entry.paintTime); assert_equals(entry.presentationTime, entry.renderTime); } else { diff --git a/tests/wpt/tests/paint-timing/paint-timing-mixin.html b/tests/wpt/tests/paint-timing/paint-timing-mixin.html index c43b7668b5c..048c985c7c7 100644 --- a/tests/wpt/tests/paint-timing/paint-timing-mixin.html +++ b/tests/wpt/tests/paint-timing/paint-timing-mixin.html @@ -26,7 +26,7 @@ }); const entry = await performance_entry_promise; assert_greater_than(entry.paintTime, reference_time); - if ("presentationTime" in entry) { + if ("presentationTime" in entry && entry.presentationTime !== null) { assert_greater_than(entry.presentationTime, entry.paintTime); assert_equals(entry.presentationTime, entry.startTime); } else { diff --git a/tests/wpt/tests/paint-timing/resources/utils.js b/tests/wpt/tests/paint-timing/resources/utils.js index ed58c957c97..41c76d68266 100644 --- a/tests/wpt/tests/paint-timing/resources/utils.js +++ b/tests/wpt/tests/paint-timing/resources/utils.js @@ -51,7 +51,7 @@ async function test_fcp(label, before_assert_fcp_func) { main.className = 'contentful'; const entry = await assertFirstContentfulPaint(t); if ("paintTime" in entry) { - if ("presentationTime" in entry) { + if ("presentationTime" in entry && entry.presentationTime !== null) { assert_greater_than(entry.presentationTime, entry.paintTime); assert_equals(entry.startTime, entry.presentationTime); } else { diff --git a/tests/wpt/tests/remote-playback/WEB_FEATURES.yml b/tests/wpt/tests/remote-playback/WEB_FEATURES.yml new file mode 100644 index 00000000000..f59321971a7 --- /dev/null +++ b/tests/wpt/tests/remote-playback/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: remote-playback + files: "**" diff --git a/tests/wpt/tests/reporting/resources/report-helper.js b/tests/wpt/tests/reporting/resources/report-helper.js index 5b5438903de..216da22eae8 100644 --- a/tests/wpt/tests/reporting/resources/report-helper.js +++ b/tests/wpt/tests/reporting/resources/report-helper.js @@ -40,7 +40,9 @@ function checkReportExists(reports, type, url) { function getReport(reports, type, document_url, subresource_url) { for (const report of reports) { if (report.type !== type) continue; - if (report.body.documentURL === document_url && report.body.subresourceURL == subresource_url) return report; + if (report.body.documentURL === document_url + && (report.body.subresourceURL == subresource_url + || report.body.blockedURL == subresource_url)) return report; } return null; } diff --git a/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html b/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html index 9de875b0f12..6ec396c221b 100644 --- a/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html +++ b/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html @@ -132,7 +132,13 @@ { assert_less_than(10, 11, "10 is less than 11") } - test(basicAssertApproxEquals, "basic assert_less_than test"); + test(basicAssertLessThan, "basic assert_less_than test"); + + function bigintAssertLessThan() + { + assert_less_than(10n, 11n, "10n is less than 11n") + } + test(bigintAssertLessThan, "bigint assert_less_than test"); function basicAssertGreaterThan() { @@ -140,12 +146,24 @@ } test(basicAssertGreaterThan, "assert_greater_than expected to fail"); + function bigintAssertGreaterThan() + { + assert_greater_than(10n, 11n, "10n is not greater than 11n"); + } + test(bigintAssertGreaterThan, "bigint assert_greater_than expected to fail"); + function basicAssertGreaterThanEqual() { assert_greater_than_equal(10, 10, "10 is greater than or equal to 10") } test(basicAssertGreaterThanEqual, "basic assert_greater_than_equal test"); + function bigintAssertGreaterThanEqual() + { + assert_greater_than_equal(10n, 10n, "10n is greater than or equal to 10n") + } + test(bigintAssertGreaterThanEqual, "bigint assert_greater_than_equal test"); + function basicAssertLessThanEqual() { assert_greater_than_equal('10', 10, "'10' is not a number") @@ -464,6 +482,12 @@ }, { "status_string": "FAIL", + "name": "bigint assert_greater_than expected to fail", + "message": "assert_greater_than: 10n is not greater than 11n expected a number greater than 11n but got 10n", + "properties": {} + }, + { + "status_string": "FAIL", "name": "assert_less_than_equal expected to fail", "message": "assert_greater_than_equal: '10' is not a number expected a number but got a \"string\"", "properties": {} @@ -518,12 +542,24 @@ }, { "status_string": "PASS", + "name": "bigint assert_greater_than_equal test", + "message": null, + "properties": {} + }, + { + "status_string": "PASS", "name": "basic assert_less_than test", "message": null, "properties": {} }, { "status_string": "PASS", + "name": "bigint assert_less_than test", + "message": null, + "properties": {} + }, + { + "status_string": "PASS", "name": "body element fires the onload event set from the attribute", "message": null, "properties": {} @@ -745,13 +781,22 @@ "status": 0 }, { - "assert_name": "assert_approx_equals", + "assert_name": "assert_less_than", "test": "basic assert_less_than test", "args": [ "10", "11", - "1", - "\"10 is approximately (+/- 1) 11\"" + "\"10 is less than 11\"" + ], + "status": 0 + }, + { + "assert_name": "assert_less_than", + "test": "bigint assert_less_than test", + "args": [ + "10n", + "11n", + "\"10n is less than 11n\"" ], "status": 0 }, @@ -766,6 +811,16 @@ "status": 1 }, { + "assert_name": "assert_greater_than", + "test": "bigint assert_greater_than expected to fail", + "args": [ + "10n", + "11n", + "\"10n is not greater than 11n\"" + ], + "status": 1 + }, + { "assert_name": "assert_greater_than_equal", "test": "basic assert_greater_than_equal test", "args": [ @@ -777,6 +832,16 @@ }, { "assert_name": "assert_greater_than_equal", + "test": "bigint assert_greater_than_equal test", + "args": [ + "10n", + "10n", + "\"10n is greater than or equal to 10n\"" + ], + "status": 0 + }, + { + "assert_name": "assert_greater_than_equal", "test": "assert_less_than_equal expected to fail", "args": [ "\"10\"", diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js index 6e8410b7ea4..992b9e3ab2c 100644 --- a/tests/wpt/tests/resources/testdriver.js +++ b/tests/wpt/tests/resources/testdriver.js @@ -280,8 +280,14 @@ * @param {object} params - Parameters for the command. * @param {null|object} params.coordinates - The optional * geolocation coordinates to set. Matches the - * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#type-emulation-GeolocationCoordinates>`_ - * value. If null or omitted, the emulation will be removed. + * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#commands-emulationsetgeolocationoverride>`_ + * value. If null or omitted and the `params.error` is set, the + * emulation will be removed. Mutually exclusive with + * `params.error`. + * @param {object} params.error - The optional + * geolocation error to emulate. Matches the + * `emulation.GeolocationPositionError <https://w3c.github.io/webdriver-bidi/#commands-emulationsetgeolocationoverride>`_ + * value. Mutually exclusive with `params.coordinates`. * @param {null|Array.<(Context)>} [params.contexts] The * optional contexts parameter specifies which browsing contexts * to set the geolocation override on. It should be either an diff --git a/tests/wpt/tests/resources/testharness.js b/tests/wpt/tests/resources/testharness.js index d1d9d61eab8..6ccede34483 100644 --- a/tests/wpt/tests/resources/testharness.js +++ b/tests/wpt/tests/resources/testharness.js @@ -1400,6 +1400,8 @@ return "-0"; } return String(val); + case "bigint": + return String(val) + 'n'; case "object": if (val === null) { return "null"; @@ -1771,20 +1773,25 @@ /** * Assert that ``actual`` is a number less than ``expected``. * - * @param {number} actual - Test value. - * @param {number} expected - Number that ``actual`` must be less than. + * @param {number|bigint} actual - Test value. + * @param {number|bigint} expected - Value that ``actual`` must be less than. * @param {string} [description] - Description of the condition being tested. */ function assert_less_than(actual, expected, description) { /* - * Test if a primitive number is less than another + * Test if a primitive number (or bigint) is less than another */ - assert(typeof actual === "number", + assert(typeof actual === "number" || typeof actual === "bigint", "assert_less_than", description, "expected a number but got a ${type_actual}", {type_actual:typeof actual}); + assert(typeof actual === typeof expected, + "assert_less_than", description, + "expected a ${type_expected} but got a ${type_actual}", + {type_expected:typeof expected, type_actual:typeof actual}); + assert(actual < expected, "assert_less_than", description, "expected a number less than ${expected} but got ${actual}", @@ -1795,20 +1802,25 @@ /** * Assert that ``actual`` is a number greater than ``expected``. * - * @param {number} actual - Test value. - * @param {number} expected - Number that ``actual`` must be greater than. + * @param {number|bigint} actual - Test value. + * @param {number|bigint} expected - Value that ``actual`` must be greater than. * @param {string} [description] - Description of the condition being tested. */ function assert_greater_than(actual, expected, description) { /* - * Test if a primitive number is greater than another + * Test if a primitive number (or bigint) is greater than another */ - assert(typeof actual === "number", + assert(typeof actual === "number" || typeof actual === "bigint", "assert_greater_than", description, "expected a number but got a ${type_actual}", {type_actual:typeof actual}); + assert(typeof actual === typeof expected, + "assert_greater_than", description, + "expected a ${type_expected} but got a ${type_actual}", + {type_expected:typeof expected, type_actual:typeof actual}); + assert(actual > expected, "assert_greater_than", description, "expected a number greater than ${expected} but got ${actual}", @@ -1820,21 +1832,31 @@ * Assert that ``actual`` is a number greater than ``lower`` and less * than ``upper`` but not equal to either. * - * @param {number} actual - Test value. - * @param {number} lower - Number that ``actual`` must be greater than. - * @param {number} upper - Number that ``actual`` must be less than. + * @param {number|bigint} actual - Test value. + * @param {number|bigint} lower - Value that ``actual`` must be greater than. + * @param {number|bigint} upper - Value that ``actual`` must be less than. * @param {string} [description] - Description of the condition being tested. */ function assert_between_exclusive(actual, lower, upper, description) { /* - * Test if a primitive number is between two others + * Test if a primitive number (or bigint) is between two others */ - assert(typeof actual === "number", + assert(typeof lower === typeof upper, + "assert_between_exclusive", description, + "expected lower (${type_lower}) and upper (${type_upper}) types to match (test error)", + {type_lower:typeof lower, type_upper:typeof upper}); + + assert(typeof actual === "number" || typeof actual === "bigint", "assert_between_exclusive", description, "expected a number but got a ${type_actual}", {type_actual:typeof actual}); + assert(typeof actual === typeof lower, + "assert_between_exclusive", description, + "expected a ${type_lower} but got a ${type_actual}", + {type_lower:typeof lower, type_actual:typeof actual}); + assert(actual > lower && actual < upper, "assert_between_exclusive", description, "expected a number greater than ${lower} " + @@ -1846,21 +1868,26 @@ /** * Assert that ``actual`` is a number less than or equal to ``expected``. * - * @param {number} actual - Test value. - * @param {number} expected - Number that ``actual`` must be less + * @param {number|bigint} actual - Test value. + * @param {number|bigint} expected - Value that ``actual`` must be less * than or equal to. * @param {string} [description] - Description of the condition being tested. */ function assert_less_than_equal(actual, expected, description) { /* - * Test if a primitive number is less than or equal to another + * Test if a primitive number (or bigint) is less than or equal to another */ - assert(typeof actual === "number", + assert(typeof actual === "number" || typeof actual === "bigint", "assert_less_than_equal", description, "expected a number but got a ${type_actual}", {type_actual:typeof actual}); + assert(typeof actual === typeof expected, + "assert_less_than_equal", description, + "expected a ${type_expected} but got a ${type_actual}", + {type_expected:typeof expected, type_actual:typeof actual}); + assert(actual <= expected, "assert_less_than_equal", description, "expected a number less than or equal to ${expected} but got ${actual}", @@ -1871,21 +1898,26 @@ /** * Assert that ``actual`` is a number greater than or equal to ``expected``. * - * @param {number} actual - Test value. - * @param {number} expected - Number that ``actual`` must be greater + * @param {number|bigint} actual - Test value. + * @param {number|bigint} expected - Value that ``actual`` must be greater * than or equal to. * @param {string} [description] - Description of the condition being tested. */ function assert_greater_than_equal(actual, expected, description) { /* - * Test if a primitive number is greater than or equal to another + * Test if a primitive number (or bigint) is greater than or equal to another */ - assert(typeof actual === "number", + assert(typeof actual === "number" || typeof actual === "bigint", "assert_greater_than_equal", description, "expected a number but got a ${type_actual}", {type_actual:typeof actual}); + assert(typeof actual === typeof expected, + "assert_greater_than_equal", description, + "expected a ${type_expected} but got a ${type_actual}", + {type_expected:typeof expected, type_actual:typeof actual}); + assert(actual >= expected, "assert_greater_than_equal", description, "expected a number greater than or equal to ${expected} but got ${actual}", @@ -1897,21 +1929,31 @@ * Assert that ``actual`` is a number greater than or equal to ``lower`` and less * than or equal to ``upper``. * - * @param {number} actual - Test value. - * @param {number} lower - Number that ``actual`` must be greater than or equal to. - * @param {number} upper - Number that ``actual`` must be less than or equal to. + * @param {number|bigint} actual - Test value. + * @param {number|bigint} lower - Value that ``actual`` must be greater than or equal to. + * @param {number|bigint} upper - Value that ``actual`` must be less than or equal to. * @param {string} [description] - Description of the condition being tested. */ function assert_between_inclusive(actual, lower, upper, description) { /* - * Test if a primitive number is between to two others or equal to either of them + * Test if a primitive number (or bigint) is between to two others or equal to either of them */ - assert(typeof actual === "number", + assert(typeof lower === typeof upper, + "assert_between_inclusive", description, + "expected lower (${type_lower}) and upper (${type_upper}) types to match (test error)", + {type_lower:typeof lower, type_upper:typeof upper}); + + assert(typeof actual === "number" || typeof actual === "bigint", "assert_between_inclusive", description, "expected a number but got a ${type_actual}", {type_actual:typeof actual}); + assert(typeof actual === typeof lower, + "assert_between_inclusive", description, + "expected a ${type_lower} but got a ${type_actual}", + {type_lower:typeof lower, type_actual:typeof actual}); + assert(actual >= lower && actual <= upper, "assert_between_inclusive", description, "expected a number greater than or equal to ${lower} " + diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html index 0b6924b0980..38c764ae181 100644 --- a/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html +++ b/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html @@ -273,6 +273,15 @@ for(const group of div.setHTMLUnsafe(testcase.data, config); assert_testcase(div, testcase); }, `setHTMLUnsafe testcase ${group.id}/${index}, "${testcase.data}"`); + + // parseHTML and parseHTMLUnsafe need to allow "html" and "body" for these + // tests to be useful. Update the config, if necessary. + if (config && config["sanitizer"] && config["sanitizer"]["elements"]) { + config["sanitizer"] = new Sanitizer(config["sanitizer"]); + config["sanitizer"].allowElement("body"); + config["sanitizer"].allowElement("html"); + } + test(_ => { assert_testcase( Document.parseHTML(testcase.data, config).body, testcase); diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html new file mode 100644 index 00000000000..c4a31e2eb03 --- /dev/null +++ b/tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html @@ -0,0 +1,145 @@ +<!DOCTYPE html> +<head> +<title>Testcases for parseHTML and parseHTMLUnsafe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/html5lib-testcase-support.js"></script> +<!-- + This is a set of basic Sanitizer test cases using the parseHTML and + parseHTMLUnsafe methods. +--> +<script id="all" type="html5lib-testcases"> +#data +text +#document +| <html> +| <head> +| <body> +| "text" + +#data +<div>text +#config +{ "elements": ["html", "body", "div"] } +#document +| <html> +| <body> +| <div> +| "text" + +#data +<div>text +#config +{ "elements": ["body", "div"] } +#document + +#data +<div>text +#config +{ "elements": ["html", "div"] } +#document +| <html> + +</script> +<script id="safe" type="html5lib-testcases"> +#data +<script>hello +#document +| <html> +| <head> +| <body> + +#data +<html onload="2+2"><body onload="3+3"><div>hello +#document +| <html> +| <head> +| <body> +| <div> +| "hello" + +</script> +<script id="unsafe" type="html5lib-testcases"> +#data +<script>hello +#document +| <html> +| <head> +| <script> +| "hello" +| <body> + +#data +<html onload="2+2"><body onload="3+3"><div>hello +#document +| <html> +| onload="2+2" +| <head> +| <body> +| onload="3+3" +| <div> +| "hello" + +</script> +<script id="document" type="html5lib-testcases"> +#data +<!DOCTYPE html> +text +#document +| <!DOCTYPE html "" ""> +| <html> +| <head> +| <body> +| "text" + +</script> +<script> +function test_safe(testcase, index) { + let config = undefined; + try { + config = { sanitizer: JSON.parse(testcase.config) }; + } catch { /* config remains undefined */ } + test(_ => { + assert_testcase(Document.parseHTML(testcase.data, config), testcase); + }, `parseHTML testcase ${index}, "${testcase.data}"`); +} +function test_unsafe(testcase, index) { + let config = undefined; + try { + config = { sanitizer: JSON.parse(testcase.config) }; + } catch { /* config remains undefined */ } + test(_ => { + assert_testcase(Document.parseHTMLUnsafe(testcase.data, config), testcase); + }, `parseHTMLUnsafe testcase ${index}, "${testcase.data}"`); +} + +const all = parse_html5lib_testcases( + document.getElementById("all").textContent); +const safe = parse_html5lib_testcases( + document.getElementById("safe").textContent); +const unsafe = parse_html5lib_testcases( + document.getElementById("unsafe").textContent); +all.forEach(test_safe); +all.forEach(test_unsafe); +safe.forEach(test_safe); +unsafe.forEach(test_unsafe); + + +// DOM only supports Document Type Declarations as children of documents. This +// trips up the assert_testcase implementation, so we'll handle that seperately. +parse_html5lib_testcases( + document.getElementById("document").textContent). + forEach((testcase, index) => { + test(_ => { + const tree = build_node_tree(new Document(), testcase.document); + assert_subtree_equals(Document.parseHTMLUnsafe(testcase.data, {}), tree); + }, `parseHTMLUnsafe full document testcase ${index}, "${testcase.data}"`); + test(_ => { + const tree = build_node_tree(new Document(), testcase.document); + assert_subtree_equals(Document.parseHTML(testcase.data, {}), tree); + }, `parseHTML full document testcase ${index}, "${testcase.data}"`); +}); +</script> +</head> +<body> +</body> diff --git a/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html index d40b6047924..7716488f25a 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html @@ -20,13 +20,18 @@ const link = document.getElementById("link"); testSoftNavigation({ addContent: async () => { - document.getElementById("softnav-content").innerText = - "Lorem Ipsum dolor sit amet"; + document.getElementById("softnav-content").innerText = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, ' + + 'sed do eiusmod tempor incididunt ut labore et dolore magna ' + + 'aliqua. Ut enim ad minim veniam, quis nostrud exercitation ' + + 'ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis ' + + 'aute irure dolor in reprehenderit in voluptate velit esse ' + + 'cillum dolore eu fugiat nulla pariatur. Excepteur sint ' + + 'occaecat cupidatat non proident, sunt in culpa qui officia ' + + 'deserunt mollit anim id est laborum.'; }, link: link, test: "Soft navigation when only innerText was modified"}); </script> </body> </html> - - diff --git a/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html index 7b884f2bdb3..5961a6ebcdf 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html @@ -1,73 +1,93 @@ -<!DOCTYPE HTML> +<!doctype html> <html> -<head> -<meta charset="utf-8"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/soft-navigation-helper.js"></script> -</head> -<body> - <main id=main> - <div> - <a id=link><img src="/images/lcp-256x256.png" id="img"></a> - <a id=not_nav><img src="/images/lcp-16x16.png"></a> + <head> + <meta charset="utf-8" /> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <div id="main"> + <div id="almost_soft_nav_div"> + A click will almost initiate a soft nav, by (1) mutating the DOM by adding an image; (2) + causing the image to be painted. + </div> + <div id="soft_nav_div"> + A click will initiate a soft nav, by (1) mutating the DOM by adding an image; (2) causing + the image to be painted; (3) updating the URL via history.back(), but without causing a hard + navigation. + </div> </div> - </main> - <script> - // Push state a couple of times - history.pushState({}, "", "foobar.html"); - history.pushState({}, "", "anotherOne.html"); + <script> + promise_test( + async (t) => { + // Setup a click handler for 'almost_soft_nav_div', which adds a + // specific, identifiable image 'almost_soft_nav_img' to the document. + document.getElementById("almost_soft_nav_div").addEventListener("click", () => { + const img = new Image(); + img.src = "/images/lcp-133x106.png"; + img.elementTiming = "almost_soft_nav_img"; + document.getElementById("main").appendChild(img); + }); - (async () => { - const link = document.getElementById("link"); - // Trigger a user interaction that doesn't result in a soft navigation, but - // does paint. - await (async () => { - const not_nav = document.getElementById("not_nav"); - let non_soft_nav_click; - const non_soft_nav_click_promise = - new Promise(r => { non_soft_nav_click = r; }); - not_nav.addEventListener("click", () => { - addImageToMain("lcp-133x106.png", "not_soft_nav_image"); - (new PerformanceObserver(non_soft_nav_click)).observe({type: "element"}); - }); - if (test_driver) { - test_driver.click(not_nav); - } - await non_soft_nav_click_promise; - })(); - const url = URL + "?" + counter; - link.addEventListener("click", () => { - // Add an LCP element. - const img = new Image(); - img.src = '/images/lcp-100x500.png' + "?" + Math.random(); - document.getElementById("main").appendChild(img); - history.back(); - }); - promise_test(async t => { - const soft_nav_promise = waitOnSoftNav(); - if (test_driver) { - test_driver.click(link); - } - await soft_nav_promise; - assert_equals( - document.softNavigations, 1, - 'Single Soft Navigation detected'); - const [entries, options] = await new Promise(resolve => { - (new PerformanceObserver((list, obs, options) => resolve( - [list.getEntries(), options]))).observe( - {type: 'soft-navigation', buffered: true}); + // Also set up a click handler for 'soft_nav_div', for adding + // another image, but in addition to what we do for the almost soft nav + // above, also let the handler change the URL, by invoking + // history.back(). We prepare with pushState for the history.back() + // invocation, to avoid triggering a hard navigation. + const test_origin = new URL(location.href).origin; + history.pushState({}, "", "/foo.html"); // We will observe this below. + history.pushState({}, "", "/bar.html"); // Prep for history.back(). + document.getElementById("soft_nav_div").addEventListener("click", () => { + const img = new Image(); + img.src = "/images/lcp-133x106.png"; + document.getElementById("main").appendChild(img); + history.back(); // URL change triggering the soft nav }); - assert_equals(entries.length, 1, - "Performance observer got an entry"); - }, "Ensure that soft navigation entry emitted through a synchronous " + - "event that modified DOM and committed a same document navigation, " + - "and that was preceded by a user intreaction that resulted in a " + - "contentful paint is properly detected."); - })(); - </script> -</body> + // Now, click almost_soft_nav_div, and observe that time image + // was rendered but no soft nav was triggered. + { + const element_timing_promise = new Promise((resolve) => { + new PerformanceObserver(resolve).observe({ type: "element", buffered: true }); + }); + if (test_driver) { + test_driver.click(almost_soft_nav_div); + } + // Returns entries of type PerformanceElementTiming, see + // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceElementTiming. + const entries = (await element_timing_promise).getEntries(); + assert_equals(entries.length, 1); + assert_equals( + entries[0].identifier, + "almost_soft_nav_img", + "Image based on the user interaction was painted.", + ); + assert_equals(document.softNavigations, 0, "No soft navigation detected."); + } + + // Now, click soft_nav_div, and observe the detected soft navigation. + { + const soft_nav_promise = new Promise((resolve) => { + new PerformanceObserver(resolve).observe({ type: "soft-navigation", buffered: true }); + }); + if (test_driver) { + test_driver.click(soft_nav_div); + } + // Returns entries of type SoftNavigationEntry, see + // https://github.com/WICG/soft-navigations/ + const entries = (await soft_nav_promise).getEntries(); + assert_equals(document.softNavigations, 1, "Single soft navigation detected"); + assert_equals(entries.length, 1, "Performance observer got an entry"); + assert_equals(entries[0].name, test_origin + "/foo.html"); + } + }, + "Ensure that soft navigation entry emitted through a synchronous " + + "event that modified DOM and committed a same document navigation, " + + "and that was preceded by a user interaction that resulted in a " + + "contentful paint is properly detected.", + ); + </script> + </body> </html> diff --git a/tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html b/tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html new file mode 100644 index 00000000000..9bfedf09b19 --- /dev/null +++ b/tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html @@ -0,0 +1,67 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8" /> + <title>Soft Navigation Detection: The Basics.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script> + // The click handler is triggered by user interaction; it modifies + // the DOM, causing a paint, and also changes the URL. + // This constitutes a soft navigation. + function clickHandler() { + const greeting = document.createElement("div"); + greeting.textContent = "Hello, World."; + document.body.appendChild(greeting); + history.pushState({}, "", "/greeting.html"); + } + </script> + </head> + <body> + <div id="click-target" onclick="clickHandler()">Click here!</div> + + <script> + test(() => { + const observer = new PerformanceObserver(() => {}); + observer.observe({ type: "soft-navigation", buffered: true }); + const records = observer.takeRecords(); + observer.disconnect(); + assert_equals(records.length, 0, "Expecting empty list."); + }, "No soft navigation detection without user interaction."); + + promise_test(async (t) => { + const test_origin = new URL(location.href).origin; + + let entries; + new PerformanceObserver((list, observer) => { + entries = list.getEntries(); + observer.disconnect(); + }).observe({ type: "soft-navigation" }); + + // Initiate the user interaction to trigger the soft navigation. + if (test_driver) { + test_driver.click(document.getElementById("click-target")); + } + + await t.step_wait( + () => entries !== undefined, + "Waiting for entries from PerformanceObserver.", + ); + + // Now check there's one entry, and it's fields. + // The SoftNavigationEntry instance is spec'd in + // https://github.com/WICG/soft-navigations/ + assert_equals(entries.length, 1, "Expecting one soft navigation entry."); + + const expected_url = new URL("/greeting.html", test_origin); + assert_equals( + entries[0].name, + expected_url.toString(), + "Soft navigation should record destination URL as its name.", + ); + }, "Detect soft navigation after a click."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html index 0615b513e61..b34a6e81a58 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html @@ -21,12 +21,15 @@ addContent: async () => { const main = document.getElementById("main"); main.removeChild(document.getElementsByTagName("div")[0]); - await addImageToMain("anim-gr.png"); + const img = new Image(500, 500); + img.src = "/images/anim-gr.png?" + Math.random(); + img.id = "imagelcp"; + img.setAttribute("elementtiming", "imagelcp"); + main.appendChild(img); }, link: link, - test: "Test that a text LCP followup by a smaller soft navigation image" - + " LCP properly queues an LCP entry"}); + test: "Test that a text LCP followup by an animaged image " + + " properly queues a soft navigation entry"}); </script> </body> </html> - diff --git a/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html index 0bb149f00e9..0bb31aaac15 100644 --- a/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html +++ b/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html @@ -24,7 +24,15 @@ })); const main = document.getElementById("main"); const div = document.createElement("div"); - const text = document.createTextNode("Lorem Ipsum"); + const text = document.createTextNode( + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, ' + + 'sed do eiusmod tempor incididunt ut labore et dolore magna ' + + 'aliqua. Ut enim ad minim veniam, quis nostrud exercitation ' + + 'ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis ' + + 'aute irure dolor in reprehenderit in voluptate velit esse ' + + 'cillum dolore eu fugiat nulla pariatur. Excepteur sint ' + + 'occaecat cupidatat non proident, sunt in culpa qui officia ' + + 'deserunt mollit anim id est laborum.'); div.appendChild(text); main.appendChild(div); } diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js b/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js index 17fccd448d2..59d7d8bae9e 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js @@ -32,6 +32,13 @@ if (swOption !== 'no-fetch-handler') { if (swOption === 'fetch-handler') { event.respondWith(fetch(event.request)); + } else if (swOption === 'fetch-handler-synthetic') { + const finalUrl = new URL(event.request.url).searchParams.get('location'); + if (finalUrl) { + event.respondWith(Response.redirect(finalUrl)); + } else { + // Fallback to the network. + } } else if (swOption === 'fetch-handler-modify-url') { // The "Sec-Purpose: prefetch" header is dropped in fetch-handler-modify-* // cases in Step 33 of // https://fetch.spec.whatwg.org/#dom-request diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py b/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py index cbcbc8eccb9..3511fe4905e 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py @@ -21,6 +21,11 @@ def main(request, response): request_count["prefetch" if prefetch else "nonPrefetch"] += 1 request.server.stash.put(uuid, request_count) + if b"location" in request.GET: + response.status = 302 + response.headers.set(b"Location", request.GET[b"location"]) + return + response.content = template( request, open(os.path.join(os.path.dirname(__file__), "executor.sub.html"), "rb").read()) diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html b/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html index d27acfe100a..975a3e5092e 100644 --- a/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html @@ -1,5 +1,8 @@ <!DOCTYPE html> <script src="/common/dispatcher/dispatcher.js" nonce="abc"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> <script src="utils.sub.js" nonce="abc"></script> <script nonce="abc"> // For a given string `str` that is escaped by WPT's `.sub.html` or @@ -45,6 +48,39 @@ Object.keys(requestHeaders).forEach(key => { } }); +// Add a link to the page in order to use during the test +function add_link(id, url) { + const link_element = document.createElement("a"); + const link_text = document.createTextNode(url); + link_element.setAttribute("href", url); + link_element.setAttribute("id", id); + link_element.appendChild(link_text); + document.body.appendChild(link_element); +} + +// "id" is the id of the link that we need to hover on in order +// to start the prefetch +async function start_non_eager_prefetch_on_hover(id) { + let target = document.getElementById(id); + + test_driver.set_test_context(window.opener); + // Inject the inputs to run this test. + await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0, {origin: target}).send(); +} + +// "id" is the id of the link that we need to press on in order +// to start the prefetch +async function start_non_eager_prefetch_on_pointerdown(id) { + let target = document.getElementById(id); + + test_driver.set_test_context(window.opener); + // Inject the inputs to run this test. + // Move mouse pointer outside of the anchor so that we don't start the + // navigation before making sure the prefetch request started server-side. + await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0, {origin: target}).pointerDown().pointerMove(0, 0).pointerUp().send(); +} + + // The fetch request's URL sent to the server. window.requestUrl = reverse_html_escape( "{{location[server]}}{{location[path]}}{{location[query]}}"); diff --git a/tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html b/tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html new file mode 100644 index 00000000000..f56f6bf09b9 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html @@ -0,0 +1,122 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="../../../resources/utils.js"></script> +<script src="../../resources/utils.sub.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> + +<meta name="variant" content="?origin=same-site&sc=in-in&sw=fetch-handler"> +<meta name="variant" content="?origin=same-site&sc=in-in&sw=fetch-handler-to-fallback"> +<meta name="variant" content="?origin=same-site&sc=in-in&sw=fetch-handler-synthetic"> +<meta name="variant" content="?origin=same-site&sc=in-in&sw=no-fetch-handler"> + +<meta name="variant" content="?origin=same-site&sc=in-out&sw=fetch-handler"> +<meta name="variant" content="?origin=same-site&sc=in-out&sw=fetch-handler-to-fallback"> +<meta name="variant" content="?origin=same-site&sc=in-out&sw=fetch-handler-synthetic"> +<meta name="variant" content="?origin=same-site&sc=in-out&sw=no-fetch-handler"> + +<meta name="variant" content="?origin=same-site&sc=out-in&sw=fetch-handler"> +<meta name="variant" content="?origin=same-site&sc=out-in&sw=fetch-handler-to-fallback"> +<meta name="variant" content="?origin=same-site&sc=out-in&sw=no-fetch-handler"> + +<script> +setup(() => assertSpeculationRulesIsSupported()); + +const originOption = new URL(location.href).searchParams.get('origin'); +const swOption = new URL(location.href).searchParams.get('sw'); + +// We use a short name `sc` to avoid long file names https://crbug.com/40469687 +const scopeOption = new URL(location.href).searchParams.get('sc'); + +promise_test(async t => { + const hostname = originOption === 'cross-site' ? '{{hosts[alt][www]}}' + : undefined; + const win = await spawnWindow(t, { protocol: 'https', hostname: hostname }); + + const finalUrl = win.getExecutorURL({ executor: 'counting-executor.py', protocol: 'https', page: 2 }); + const initialUrl = new URL('../../resources/counting-executor.py', location.href); + // Assign a different UUID to track the number of requests to server + // separately for the initialUrl and finalUrl. + initialUrl.searchParams.set('uuid', token()); + initialUrl.searchParams.set('location', finalUrl); + + const swUrl = new URL('../../resources/basic-service-worker.js?sw=' + swOption, location.href).href; + + let sw1; + if (scopeOption === 'in-in' || scopeOption === 'in-out') { + // Register a SW for `initialUrl`. + const reg = await service_worker_unregister_and_register( + t, swUrl + '&sw1', initialUrl); + sw1 = reg.installing; + await wait_for_state(t, reg.installing, 'activated'); + } + + let sw2; + if (scopeOption === 'in-in' || scopeOption === 'out-in') { + // Register a SW for `finalUrl`. + const reg = await service_worker_unregister_and_register( + t, swUrl + '&sw2', finalUrl); + sw2 = reg.installing; + await wait_for_state(t, reg.installing, 'activated'); + } + + // Start speculation rules prefetch and navigate to the URL. + await win.forceSinglePrefetch(initialUrl); + + await win.navigate(initialUrl, {expectedDestinationUrl: finalUrl}); + + const initialRequestCount = await (await fetch(initialUrl + '&check')).json(); + const finalRequestCount = await (await fetch(finalUrl + '&check')).json(); + + const headers = await win.execute_script(() => { + return requestHeaders; + }, []); + + const controllerUrl = await win.execute_script(() => { + return navigator.serviceWorker.controller ? + navigator.serviceWorker.controller.scriptURL : + undefined; + }, []); + + if (sw2) { + // The navigated page should be controlled by the ServiceWorker, + // regardless of whether prefetch is performed/used. + assert_equals(controllerUrl, swUrl + '&sw2'); + } else { + assert_equals(controllerUrl, undefined); + } + + // In any cases prefetch + redirects + ServiceWorker fails and prefetched + // results aren't served. + assert_not_prefetched(headers, "Prefetched result should not be served."); + + if (swOption === 'fetch-handler-synthetic') { + // Synthetic redirect response from ServiceWorker prevents the initial + // prefetch/non-prefetch requests to the server. + assert_equals(initialRequestCount.prefetch, 0, + 'prefetch requests to initial URL should not be sent to the server.'); + assert_equals(initialRequestCount.nonPrefetch, 0, + 'a non-prefetch requests to initial URL should not be sent to the server.'); + } else { + // Otherwise, the initial prefetch request (either with or without + // ServiceWorker interception) anyway reaches the server, and then + // re-requested as a non-prefetch request on navigation. + assert_equals(initialRequestCount.prefetch, 1, + 'prefetch requests to initial URL should be sent to the server.'); + assert_equals(initialRequestCount.nonPrefetch, 1, + 'a non-prefetch requests to initial URL should be sent to the server.'); + } + + // Prefetch requests to the URL after redirects shouldn't be sent to server + // because prefetch should fail immediately on receiving redirects. + assert_equals(finalRequestCount.prefetch, 0, + 'prefetch requests should not be sent to the server.'); + // Instead, a single non-prefetch request should be sent. + assert_equals(finalRequestCount.nonPrefetch, 1, + 'a non-prefetch request should be sent to the server.'); + +}, "Prefetch with ServiceWorker (" + swOption + ")"); +</script> diff --git a/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html new file mode 100644 index 00000000000..cbf69cefba6 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title>Sec-Speculation-Tags request headers</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/utils.js"></script> +<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script> +<script src="/speculation-rules/prerender/resources/utils.js"></script> +<script src="/speculation-rules/resources/utils.js"></script> +<script src="/speculation-rules/prefetch/resources/utils.sub.js"></script> +<script> +"use strict"; + +setup(() => assertSpeculationRulesIsSupported()); + +promise_test(async t => { + const agent = await spawnWindow(t); + const nextUrl = agent.getExecutorURL({ page: 2 }); + await agent.forceSpeculationRules({ + prefetch: [ + {source: "list", "tag": "conservative", + "eagerness": "conservative", urls: [nextUrl]}, + {source: "list", "tag": "moderate", + "eagerness": "moderate", urls: [nextUrl]} + ] + }); + + const linkId = 'target'; + await agent.execute_script(async (linkId, nextUrl) => { + add_link(linkId, nextUrl); + }, [linkId, nextUrl]); + + await agent.execute_script(async (linkId) => { + await start_non_eager_prefetch_on_pointerdown(linkId); + }, [linkId]); + await agent.navigate(nextUrl); + + const headers = await agent.getRequestHeaders(); + assert_prefetched(headers, "must be prefetched"); + assert_equals(headers.sec_speculation_tags, "\"conservative\", \"moderate\"", "Sec-Speculation-Tags"); +}, "Sec-Speculation-Tags prefetch with eagerness triggered by point down"); + +</script> diff --git a/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html new file mode 100644 index 00000000000..f5e749b9c6f --- /dev/null +++ b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<title>Sec-Speculation-Tags request headers</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/utils.js"></script> +<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script> +<script src="/speculation-rules/prerender/resources/utils.js"></script> +<script src="/speculation-rules/resources/utils.js"></script> +<script src="/speculation-rules/prefetch/resources/utils.sub.js"></script> +<script> +"use strict"; + +setup(() => assertSpeculationRulesIsSupported()); + +promise_test(async t => { + const agent = await spawnWindow(t); + const nextUrl = agent.getExecutorURL({ page: 2 }); + await agent.forceSpeculationRules({ + prefetch: [ + {source: "list", "tag": "conservative", + "eagerness": "conservative", urls: [nextUrl]}, + {source: "list", "tag": "moderate", + "eagerness": "moderate", urls: [nextUrl]} + ] + }); + + const linkId = 'target'; + await agent.execute_script(async (linkId, nextUrl) => { + add_link(linkId, nextUrl); + }, [linkId, nextUrl]); + + await agent.execute_script(async (linkId) => { + await start_non_eager_prefetch_on_hover(linkId); + }, [linkId]); + + // TODO(crbug.com/381687257): Remove this when 0ms hover trigger is supported. + // Wait for longer than 200 ms for the onhover trigger to fire. + await new Promise(resolve => t.step_timeout(resolve, 500)); + await agent.navigate(nextUrl); + + const headers = await agent.getRequestHeaders(); + assert_prefetched(headers, "must be prefetched"); + assert_equals(headers.sec_speculation_tags, "\"moderate\"", "Sec-Speculation-Tags"); +}, "Sec-Speculation-Tags prefetch with eagerness triggered by point hover"); + +</script> diff --git a/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html b/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html index 1d1dd35edc2..2f5b359c571 100644 --- a/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html +++ b/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html @@ -2,17 +2,39 @@ <title>SpeechRecognition installOnDevice</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> <script> promise_test(async (t) => { const validLang = "en-US"; const invalidLang = "invalid language code"; - window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; + const validDownloadableLang = "fr-FR"; + window.SpeechRecognition = + window.SpeechRecognition || window.webkitSpeechRecognition; - // Test that it returns a promise. - const validResultPromise = SpeechRecognition.installOnDevice(validLang); + // Attempt to call installOnDevice directly, without a user gesture with a + // language that is downloadable but not installed. + const installWithoutUserGesturePromise = + SpeechRecognition.installOnDevice(validDownloadableLang); + + // Assert that the promise rejects with NotAllowedError. + await promise_rejects_dom( + t, + "NotAllowedError", + window.DOMException, + installWithoutUserGesturePromise, + "SpeechRecognition.installOnDevice() must reject with NotAllowedError if " + + "called without a user gesture." + ); + + // Test that it returns a promise when called with a valid language. + const validResultPromise = test_driver.bless( + "Call SpeechRecognition.installOnDevice with a valid language", + () => SpeechRecognition.installOnDevice(validLang) + ); assert_true( validResultPromise instanceof Promise, - "installOnDevice should return a Promise." + "installOnDevice (with gesture) should return a Promise." ); // Verify the resolved value is a boolean. @@ -22,15 +44,17 @@ promise_test(async (t) => { "The resolved value of the installOnDevice promise should be a boolean." ); - // Verify that the method returns true when called with a supported language code. + // Verify that the method returns true when called with a supported language. assert_equals( validResult, true, - "installOnDevice should resolve with `true` when called with a supported language code." + "installOnDevice should resolve with `true` when called with a " + + "supported language code." ); // Verify that the newly installed language pack is available. - const availableOnDeviceResultPromise = SpeechRecognition.availableOnDevice(validLang); + const availableOnDeviceResultPromise = + SpeechRecognition.availableOnDevice(validLang); assert_true( availableOnDeviceResultPromise instanceof Promise, "availableOnDevice should return a Promise." @@ -42,28 +66,58 @@ promise_test(async (t) => { "The resolved value of the availableOnDevice promise should be a string." ); - assert_true(availableOnDeviceResult === "available", - "The resolved value of the availableOnDevice promise should be available." + assert_true( + availableOnDeviceResult === "available", + "The resolved value of the availableOnDevice promise should be 'available'." ); - // Verify that installing an already installed language pack resolves to true. - const secondResultPromise = SpeechRecognition.installOnDevice(validLang); + // Verify that installing an already installed language resolves to true. + const secondResultPromise = test_driver.bless( + "Call SpeechRecognition.installOnDevice for an already installed language", + () => SpeechRecognition.installOnDevice(validLang) + ); + assert_true( + secondResultPromise instanceof Promise, + "installOnDevice (with gesture, for already installed language) should " + + "return a Promise." + ); const secondResult = await secondResultPromise; + assert_true( + typeof secondResult === "boolean", + "The resolved value of the second installOnDevice promise should be a " + + "boolean." + ); assert_equals( secondResult, true, - "installOnDevice should resolve with `true` if the language is already installed." + "installOnDevice should resolve with `true` if the language is already " + + "installed." ); - // Test that it returns a promise. - const invalidResultPromise = SpeechRecognition.installOnDevice(invalidLang); + // Test that it returns a promise and resolves to false for unsupported lang. + const invalidResultPromise = test_driver.bless( + "Call SpeechRecognition.installOnDevice with an unsupported language code", + () => SpeechRecognition.installOnDevice(invalidLang) + ); + assert_true( + invalidResultPromise instanceof Promise, + "installOnDevice (with gesture, for unsupported language) should return " + + "a Promise." + ); const invalidResult = await invalidResultPromise; + assert_true( + typeof invalidResult === "boolean", + "The resolved value of the installOnDevice promise (unsupported language) " + + "should be a boolean." + ); assert_equals( invalidResult, false, - "installOnDevice should resolve with `false` when called with an unsupported language code." + "installOnDevice should resolve with `false` when called with an " + + "unsupported language code." ); -}, "SpeechRecognition.installOnDevice resolves with a boolean value."); +}, "SpeechRecognition.installOnDevice resolves with a boolean value " + + "(with user gesture)."); promise_test(async (t) => { const iframe = document.createElement("iframe"); @@ -78,7 +132,13 @@ promise_test(async (t) => { t, "InvalidStateError", frameDOMException, - frameSpeechRecognition.installOnDevice("en-US"), + test_driver.bless( + "Call SpeechRecognition.installOnDevice in a detached frame context", + () => { + return frameSpeechRecognition.installOnDevice("en-US"); + } + ) ); -}, "SpeechRecognition.installOnDevice rejects in a detached context."); +}, "SpeechRecognition.installOnDevice rejects in a detached context " + + "(with user gesture)."); </script> diff --git a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js index cf10f7f2e83..6e9d80c4142 100644 --- a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js +++ b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js @@ -14,35 +14,6 @@ promise_test(async () => { await garbageCollect(); }, 'Garbage-collecting a stream along with its reader should not crash'); - -// See https://crbug.com/390646657 for details. -promise_test(async () => { - const written = new WritableStream({ - write(chunk) { - return new Promise(resolve => {}); - } - }).getWriter().write('just nod if you can hear me'); - for (let i = 0; i < 5; ++i) - await garbageCollect(); -}, 'Garbage-collecting a stream writer with a pending write should not crash'); - - -promise_test(async () => { - const closed = new WritableStream({ - write(chunk) { } - }).getWriter().closed; - for (let i = 0; i < 5; ++i) - await garbageCollect(); -}, 'Garbage-collecting a stream writer should not crash with closed promise is retained'); - -promise_test(async () => { - const ready = new WritableStream({ - write(chunk) { } - }, {highWaterMark: 0}).getWriter().ready; - for (let i = 0; i < 5; ++i) - await garbageCollect(); -}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied'); - promise_test(async () => { let reader = new ReadableStream({ pull() { } diff --git a/tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js new file mode 100644 index 00000000000..a3796881c9f --- /dev/null +++ b/tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js @@ -0,0 +1,43 @@ +// META: global=window,worker +// META: script=/common/gc.js +'use strict'; + +// See https://crbug.com/390646657 for details. +promise_test(async () => { + const written = new WritableStream({ + write(chunk) { + return new Promise(resolve => {}); + } + }).getWriter().write('just nod if you can hear me'); + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer with a pending write should not crash'); + +promise_test(async () => { + const closed = new WritableStream({ + write(chunk) { } + }).getWriter().closed; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash with closed promise is retained'); + +promise_test(async () => { + let writer = new WritableStream({ + write(chunk) { return new Promise(resolve => {}); }, + close() { return new Promise(resolve => {}); } + }).getWriter(); + writer.write('is there anyone home?'); + writer.close(); + writer = null; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash with close promise pending'); + +promise_test(async () => { + const ready = new WritableStream({ + write(chunk) { } + }, {highWaterMark: 0}).getWriter().ready; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied'); + diff --git a/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html new file mode 100644 index 00000000000..205854419a7 --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html @@ -0,0 +1,119 @@ +<!doctype html> +<head> + <meta name="timeout" content="long"> + <meta name="variant" content="?type=enforce"> + <meta name="variant" content="?type=report"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/dispatcher/dispatcher.js"></script> + <script src="/common/utils.js"></script> + <script src="/reporting/resources/report-helper.js"></script> +</head> +<body> +<script> + + const run_test = (test_case) => { + promise_test(async () => { + const REMOTE_EXECUTOR = + `/common/dispatcher/remote-executor.html?pipe=`; + + let header_name = "Integrity-Policy"; + const params = new URLSearchParams(location.search); + if (params.get('type') === "report") { + if (test_case.expected.blocked) { + return; + } + header_name += "-Report-Only"; + } + const iframe_uuid = token(); + const header = + `header(${header_name},${test_case.header_value})`; + const iframe_url = + `${REMOTE_EXECUTOR}${encodeURIComponent(header)}&uuid=${iframe_uuid}`; + + const iframe = document.createElement('iframe'); + iframe.src = iframe_url; + document.body.appendChild(iframe); + + // Execute code directly from the iframe. + const ctx = new RemoteContext(iframe_uuid); + const result = await ctx.execute_script(async (test_case) => { + const resource_url = "/content-security-policy/resources/ran.js"; + let report_observed_promise; + + // Load a script with no integrity. If there's a policy in place, it + // would be blocked. + const loaded = await new Promise(resolve => { + const script = document.createElement('script'); + script.onload = () => { resolve(true); }; + script.onerror = () => { resolve(false); }; + script.src = resource_url; + document.body.appendChild(script); + }); + return { blocked: !loaded, ran: window.ran }; + }, [test_case]); + assert_equals(!result.blocked, !!result.ran); + assert_equals(result.blocked, test_case.expected.blocked); + }, test_case.description); + }; + + const test_cases = [ + { + description: "Ensure that test is working with a valid destination", + header_value: "blocked-destinations=\\(script\\)", + expected: {blocked: true}, + }, + { + description: "Ensure that test is working with a valid destination and source", + header_value: "blocked-destinations=\\(script\\)\\, sources=\\(inline\\)", + expected: {blocked: true}, + }, + { + description: "Ensure that an empty header does not block", + header_value: "", + expected: {blocked: false}, + }, + { + description: "Ensure that a destination header with a token value does not parse", + header_value: "blocked-destinations=script", + expected: {blocked: false}, + }, + { + description: "Ensure that a destination header with an inner list of strings does not parse", + header_value: 'blocked-destinations=\\("script"\\)', + expected: {blocked: false}, + }, + { + description: "Ensure that a destination header with an inner list of single-quote strings does not parse", + header_value: "blocked-destinations=\\('script'\\)", + expected: {blocked: false}, + }, + { + description: "Ensure that a destination header with an unclosed inner list does not parse", + header_value: "blocked-destinations=\\(script", + expected: {blocked: false}, + }, + { + description: "Ensure that a destination header with a malformed inner list does not parse", + header_value: "blocked-destinations=\\(script\\,style\\)", + expected: {blocked: false}, + }, + { + description: "Ensure that an unknown destination does not enforce a policy", + header_value: "blocked-destinations=\\(style\\)", + expected: {blocked: false}, + }, + { + description: "Ensure that an unknown source causes the policy to not be enforced", + header_value: "blocked-destinations=\\(script\\)\\, sources=\\(telepathy\\)", + expected: {blocked: false}, + }, + { + description: "Ensure that an invalid source causes the policy to not be enforced", + header_value: "blocked-destinations=\\(script\\)\\, sources=\\(invalid", + expected: {blocked: false}, + }, + ]; + test_cases.map(run_test); +</script> + diff --git a/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html new file mode 100644 index 00000000000..783374db920 --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html @@ -0,0 +1,239 @@ +<!doctype html> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/reporting/resources/report-helper.js"></script> + +<body> +<script> + const {ORIGIN} = get_host_info(); + const getAbsoluteUrl = url => { + return new URL(url, window.location.href).href; + } + + const check_report = async (reporting_endpoint, reporting_uuid, iframe_url, url, report_only) => { + const reports = await pollReports(reporting_endpoint, reporting_uuid); + const abs_iframe_url = getAbsoluteUrl(iframe_url); + checkReportExists(reports, 'integrity-violation', abs_iframe_url); + const abs_blocked_url = getAbsoluteUrl(url); + const report = getReport(reports, 'integrity-violation', abs_iframe_url, abs_blocked_url); + assert_not_equals(report, null); + assert_equals(report.body.documentURL, abs_iframe_url); + assert_equals(report.body.blockedURL, abs_blocked_url); + assert_equals(report.body.destination, "script"); + assert_equals(report.body.reportOnly, report_only); + }; + const blob = new Blob([`window.ran=true;`], + { type: 'application/javascript' }); + + const blob_url = URL.createObjectURL(blob); + + // Generated using https://sha2.it/ed25519.html (In Chrome Canary, with Experimental Web Platform Features enabled) + const signature = encodeURIComponent( + 'header(Unencoded-Digest, sha-384=:tqyFpeo21WFM8HDeUtLqH20GUq\/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak:)' + + '|header(Signature-Input, signature=\\("unencoded-digest";sf\\); keyid="JrQLj5P\/89iXES9+vFgrIy29clF9CC\/oPPsw3c5D0bs="; tag="sri")' + + '|header(Signature, signature=:qM19uLskHm2TQG5LJcH/hY0n0BWWzYOJztVWYlwk0cZb3u0JdgUMre1J4Jn8Tma0x2u5/kPBfbXRMbB+X+vTBw==:)'); + + const test_cases = [ + { + description: "Ensure that a script without integrity did not run", + url: "/content-security-policy/resources/ran.js", + cross_origin: true, + integrity: "", + policy_violation: true, + block: true, + endpoints: true, + expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false }, + }, + { + description: "Ensure that a script with unknown integrity algorithm did not run", + url: "/content-security-policy/resources/ran.js", + cross_origin: true, + integrity: "foobar-AAAAAAAAAAAAAAAAAAAa", + policy_violation: true, + block: true, + endpoints: true, + expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false }, + }, + { + description: "Ensure that a script without integrity algorithm runs and gets reported in report-only mode", + url: "/content-security-policy/resources/ran.js", + cross_origin: true, + integrity: "", + policy_violation: true, + block: false, + endpoints: true, + expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: true }, + }, + { + description: "Ensure that a no-cors script gets blocked", + url: "/content-security-policy/resources/ran.js", + cross_origin: false, + integrity: "sha384-tqyFpeo21WFM8HDeUtLqH20GUq/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak", + policy_violation: true, + block: true, + endpoints: true, + expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false }, + }, + { + description: "Ensure that ReportingObserver gets called without endpoints", + url: "/content-security-policy/resources/ran.js", + cross_origin: false, + integrity: "sha384-tqyFpeo21WFM8HDeUtLqH20GUq/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak", + policy_violation: true, + block: true, + endpoints: false, + expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false }, + }, + { + description: "Ensure that a script with integrity runs", + url: "/content-security-policy/resources/ran.js", + cross_origin: true, + integrity: "sha384-tqyFpeo21WFM8HDeUtLqH20GUq/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak", + policy_violation: false, + block: true, + endpoints: true, + expected: {blocked: "", ran: true }, + }, + { + description: "Ensure that a script with signature integrity runs", + url: "/content-security-policy/resources/ran.js?pipe=" + signature, + cross_origin: true, + integrity: "ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=", + policy_violation: false, + block: true, + endpoints: true, + expected: {blocked: "", ran: true }, + }, + { + description: "Ensure that a data URI script with no integrity runs", + url: "data:application/javascript,window.ran=true", + cross_origin: true, + integrity: "", + policy_violation: false, + block: true, + endpoints: true, + expected: {blocked: "", ran: true }, + }, + { + description: "Ensure that a no-CORS data URI script with no integrity runs", + url: "data:application/javascript,window.ran=true", + cross_origin: false, + integrity: "", + policy_violation: false, + block: true, + endpoints: true, + expected: {blocked: "", ran: true }, + }, + { + description: "Ensure that a blob URL script with no integrity runs", + url: blob_url, + cross_origin: true, + integrity: "", + policy_violation: false, + block: true, + endpoints: true, + expected: {blocked: "", ran: true }, + }, + { + description: "Ensure that a no-CORS blob URL script with no integrity runs", + url: blob_url, + cross_origin: false, + integrity: "", + policy_violation: false, + block: true, + endpoints: true, + expected: {blocked: "", ran: true }, + } + ]; + test_cases.map(test_case => { + promise_test(async () => { + const REMOTE_EXECUTOR = + `/common/dispatcher/remote-executor.html?pipe=`; + const iframe_uuid = token(); + + const params = new URLSearchParams(location.search); + if (params.get('type') === "report") { + if (test_case.expected.blocked) { + return; + } + header_name += "-Report-Only"; + } + const reporting_uuid_1 = token(); + const reporting_uuid_2 = token(); + const reporting_uuid_3 = token(); + const reporting_endpoint = `${ORIGIN}/reporting/resources/report.py`; + let header = ""; + if (test_case.block) { + header += + `header(Integrity-Policy,blocked-destinations=\\(script\\)\\, endpoints=\\(integrity-endpoint-1 integrity-endpoint-2\\))`; + } + header += + `|header(Integrity-Policy-Report-Only,blocked-destinations=\\(script\\)\\, endpoints=\\(integrity-endpoint-3\\))`; + if (test_case.endpoints) { + header += + `|header(Reporting-Endpoints, integrity-endpoint-1=\"${reporting_endpoint}?reportID=${reporting_uuid_1}\"\\, ` + + `integrity-endpoint-2=\"${reporting_endpoint}?reportID=${reporting_uuid_2}\"\\, ` + + `integrity-endpoint-3=\"${reporting_endpoint}?reportID=${reporting_uuid_3}\")`; + } + const iframe_url = `${REMOTE_EXECUTOR}${encodeURIComponent(header)}&uuid=${iframe_uuid}`; + + const iframe = document.createElement('iframe'); + iframe.src = iframe_url; + document.body.appendChild(iframe); + + // Execute code directly from the iframe. + const ctx = new RemoteContext(iframe_uuid); + const result = await ctx.execute_script(async (test_case) => { + window.ran = false; + let report_observed_promise; + if (test_case.policy_violation) { + report_observed_promise = new Promise(r => { + (new ReportingObserver((reports, observer) => { + reports.forEach(report => { + if (report.body.blockedURL.endsWith(test_case.url)) { + r(report.body); + observer.disconnect(); + } + }); + })).observe('integrity-violation'); + }); + } + + // Load the script + await new Promise(resolve => { + const script = document.createElement('script'); + if (test_case.cross_origin) { + script.crossOrigin="anonymous"; + } + if (test_case.integrity) { + script.integrity = test_case.integrity; + } + script.onload = resolve; + script.onerror = resolve; + script.src = test_case.url; + document.body.appendChild(script); + }); + const report_body = await report_observed_promise; + return { body: report_body, ran: window.ran }; + }, [test_case]); + assert_equals(result.ran, test_case.expected.ran); + if (test_case.policy_violation) { + assert_equals(result.body.blockedURL, test_case.expected.blocked); + assert_true(result.body.documentURL.endsWith(iframe_url)); + assert_equals(result.body.destination, "script"); + assert_equals(result.body.reportOnly, !test_case.block); + } + if (test_case.endpoints && test_case.policy_violation) { + if (test_case.block) { + await check_report(reporting_endpoint, reporting_uuid_1, iframe_url, test_case.url, !test_case.block); + await check_report(reporting_endpoint, reporting_uuid_2, iframe_url, test_case.url, !test_case.block); + } + await check_report(reporting_endpoint, reporting_uuid_3, iframe_url, test_case.url, true); + } + }, test_case.description); + }); +</script> diff --git a/tests/wpt/tests/svg/animations/discard-check-removal-order.html b/tests/wpt/tests/svg/animations/discard-check-removal-order.html deleted file mode 100644 index 2935a69adda..00000000000 --- a/tests/wpt/tests/svg/animations/discard-check-removal-order.html +++ /dev/null @@ -1,52 +0,0 @@ -<!DOCTYPE HTML> -<html> -<title>This tests for the remove order of discard elements.</title> -<link rel="help" href="https://svgwg.org/specs/animations/#DiscardElement"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/SVGAnimationTestCase-testharness.js"></script> - -<body> - <div id="removeOrder"></div> - <svg id="svg" width="400" height="400"> - <rect id="rect" width="100" height="100" fill="green" /> - <animate id="animate" href="#rect" attributeName="x" from="0" to="300" dur="10s" /> - </svg> - <script> - const rootSVGElement = document.querySelector('svg'); - - let removedNodes = new Array(); - let callback = function(mutations) { - mutations.forEach(function(mutation) { - let nodeList = mutation.removedNodes; - for (let i = 0; i < nodeList.length; ++i) { - removedNodes.push(nodeList[i].nodeName); - } - }); - }; - let observer = new MutationObserver(callback); - observer.observe(rootSVGElement, { 'childList': true, 'subtree': true }); - - function checkRemovedNodes(array) { - assert_array_equals(removedNodes, array, 'removed nodes'); - } - - function discardElement(id) { - let discard = createSVGElement("discard"); - discard.setAttribute("href", "#" + id); - rootSVGElement.appendChild(discard); - } - - discardElement("animate"); - discardElement("rect"); - - smil_async_test(t => { - runAnimationTest(t, [ - // [animationId, time, sampleCallback] - ['anim', 1, checkRemovedNodes.bind(this, ['animate', 'discard', 'rect', 'discard'])], - ]); - }); - window.animationStartsImmediately = true; - </script> -</body> -</html> diff --git a/tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg b/tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg deleted file mode 100644 index 120941444a4..00000000000 --- a/tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg"> - <rect width="100" height="100" fill="green"/> -</svg> diff --git a/tests/wpt/tests/svg/embedded/WEB_FEATURES.yml b/tests/wpt/tests/svg/embedded/WEB_FEATURES.yml new file mode 100644 index 00000000000..8482e555584 --- /dev/null +++ b/tests/wpt/tests/svg/embedded/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-image-fetchpriority.html diff --git a/tests/wpt/tests/svg/idlharness.window.js b/tests/wpt/tests/svg/idlharness.window.js index b363128c25a..57beca77fd4 100644 --- a/tests/wpt/tests/svg/idlharness.window.js +++ b/tests/wpt/tests/svg/idlharness.window.js @@ -42,7 +42,6 @@ const elements = [ 'script', 'animate', 'set', - 'discard', 'animateMotion', 'mpath', 'animateTransform', @@ -111,7 +110,6 @@ idl_test( SVGGElement: ['objects.g'], SVGDefsElement: ['objects.defs'], SVGDescElement: ['objects.desc'], - SVGDiscardElement: ['objects.discard'], SVGTitleElement: ['objects.title'], SVGSymbolElement: ['objects.symbol'], SVGUseElement: ['objects.use'], @@ -168,7 +166,6 @@ idl_test( SVGViewElement: ['objects.view'], SVGScriptElement: ['objects.script'], SVGAnimateElement: ['objects.animate'], - SVGDiscardElement: ['objects.discard'], SVGSetElement: ['objects.set'], SVGAnimateMotionElement: ['objects.animateMotion'], SVGMPathElement: ['objects.mpath'], diff --git a/tests/wpt/tests/svg/scripted/WEB_FEATURES.yml b/tests/wpt/tests/svg/scripted/WEB_FEATURES.yml new file mode 100644 index 00000000000..864bd3398ee --- /dev/null +++ b/tests/wpt/tests/svg/scripted/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-script-fetchpriority.html diff --git a/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html b/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html index 7bfa001030a..9a5da751ce1 100644 --- a/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html +++ b/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html @@ -98,7 +98,7 @@ if (CSS.supports("d", "initial")) { // animation elements. if (CSS.supports("fill", "initial")) { - for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) { + for (let e of ["animate", "animateMotion", "animateTransform", "set"]) { test(function() { assertPresentationAttributeIsNotSupported(e, "fill", "blue", "fill"); }, `fill presentation attribute not supported on ${e}`); diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py index e587a082c03..fd5cf733ab7 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py @@ -35,11 +35,16 @@ class Emulation(BidiModule): def set_geolocation_override( self, coordinates: Union[CoordinatesOptions, Undefined] = UNDEFINED, + error: Optional[Dict[str, Any]] = None, contexts: Optional[List[str]] = None, user_contexts: Optional[List[str]] = None, ) -> Mapping[str, Any]: - params: MutableMapping[str, Any] = {"coordinates": coordinates} + params: MutableMapping[str, Any] = {} + if coordinates is not UNDEFINED: + params["coordinates"] = coordinates + if error is not None: + params["error"] = error if contexts is not None: params["contexts"] = contexts if user_contexts is not None: diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py index 0e02d3c02cd..c796be18a73 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py @@ -88,7 +88,6 @@ class SystemWebViewShell(ChromeAndroidBrowserBase): def __init__(self, logger, binary, webdriver_binary="chromedriver", adb_binary=None, - remote_queue=None, device_serial=None, webdriver_args=None, stackwalk_binary=None, @@ -96,7 +95,7 @@ class SystemWebViewShell(ChromeAndroidBrowserBase): """Creates a new representation of Chrome. The `binary` argument gives the browser binary to use for testing.""" super().__init__(logger, - webdriver_binary, adb_binary, remote_queue, + webdriver_binary, adb_binary, device_serial, webdriver_args, stackwalk_binary, symbols_path) self.binary = binary diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py index 820323e615a..4ed7707c3be 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py @@ -3,7 +3,7 @@ import mozprocess import subprocess -from .base import cmd_arg, require_arg +from .base import OutputHandler, cmd_arg, require_arg from .base import get_timeout_multiplier # noqa: F401 from .base import WebDriverBrowser # noqa: F401 from .chrome import executor_kwargs as chrome_executor_kwargs @@ -79,10 +79,9 @@ def env_options(): class LogcatRunner: - def __init__(self, logger, browser, remote_queue): + def __init__(self, logger, browser): self.logger = logger self.browser = browser - self.remote_queue = remote_queue def start(self): try: @@ -99,43 +98,31 @@ class LogcatRunner: self.logger.error("Failed to clear logcat buffer") self._cmd = self.browser.logcat_cmd() + self._output_handler = OutputHandler(self.logger, self._cmd) self._proc = mozprocess.ProcessHandler( self._cmd, - processOutputLine=self.on_output, + processOutputLine=self._output_handler, storeOutput=False) self._proc.run() - - def _send_message(self, command, *args): - try: - self.remote_queue.put((command, args)) - except AssertionError: - self.logger.warning("Error when send to remote queue") + self._output_handler.after_process_start(self._proc.pid) + self._output_handler.start() def stop(self, force=False): if self.is_alive(): kill_result = self._proc.kill() if force and kill_result != 0: self._proc.kill(9) + self._output_handler.after_process_stop() def is_alive(self): return hasattr(self._proc, "proc") and self._proc.poll() is None - def on_output(self, line): - data = { - "action": "process_output", - "process": "LOGCAT", - "command": "logcat", - "data": line - } - self._send_message("log", data) - class ChromeAndroidBrowserBase(WebDriverBrowser): def __init__(self, logger, webdriver_binary="chromedriver", adb_binary=None, - remote_queue=None, device_serial=None, webdriver_args=None, stackwalk_binary=None, @@ -148,15 +135,11 @@ class ChromeAndroidBrowserBase(WebDriverBrowser): self.device_serial = device_serial self.stackwalk_binary = stackwalk_binary self.symbols_path = symbols_path - self.remote_queue = remote_queue - - if self.remote_queue is not None: - self.logcat_runner = LogcatRunner(self.logger, self, self.remote_queue) + self.logcat_runner = LogcatRunner(self.logger, self) def setup(self): self.setup_adb_reverse() - if self.remote_queue is not None: - self.logcat_runner.start() + self.logcat_runner.start() def _adb_run(self, args): cmd = [self.adb_binary] @@ -176,8 +159,7 @@ class ChromeAndroidBrowserBase(WebDriverBrowser): super().cleanup() self._adb_run(['forward', '--remove-all']) self._adb_run(['reverse', '--remove-all']) - if self.remote_queue is not None: - self.logcat_runner.stop(force=True) + self.logcat_runner.stop(force=True) def executor_browser(self): cls, kwargs = super().executor_browser() @@ -231,13 +213,12 @@ class ChromeAndroidBrowser(ChromeAndroidBrowserBase): def __init__(self, logger, package_name, webdriver_binary="chromedriver", adb_binary=None, - remote_queue = None, device_serial=None, webdriver_args=None, stackwalk_binary=None, symbols_path=None): super().__init__(logger, - webdriver_binary, adb_binary, remote_queue, + webdriver_binary, adb_binary, device_serial, webdriver_args, stackwalk_binary, symbols_path) self.package_name = package_name diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py index 494a7514efd..c63bfa2ceeb 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py @@ -220,6 +220,7 @@ def run_info_extras(logger, default_prefs=None, **kwargs): not bool_pref("fission.disableSessionHistoryInParent")), "swgl": bool_pref("gfx.webrender.software"), "privateBrowsing": bool_pref("browser.privatebrowsing.autostart"), + "remoteAsyncEvents": bool_pref("remote.events.async.wheel.enabled"), "incOriginInit": os.environ.get("MOZ_ENABLE_INC_ORIGIN_INIT") == "1", } rv.update(run_info_browser_version(**kwargs)) @@ -250,6 +251,7 @@ def update_properties(): "swgl", "asan", "tsan", + "remoteAsyncEvents", "sessionHistoryInParent", "subsuite"], { "os": ["version"], diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py index 9925a4b511d..8397d7838a3 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py @@ -1,4 +1,5 @@ # mypy: allow-untyped-defs +from webdriver.bidi.undefined import UNDEFINED webdriver = None @@ -7,6 +8,22 @@ def do_delayed_imports(): global webdriver import webdriver + +def get_browsing_context_id(context): + """ + :param context: Either a string representing the browsing context id, or a + BiDi serialized window proxy object. In the latter case, the value is + extracted from the serialized object. + :return: The browsing context id. + """ + if isinstance(context, str): + return context + elif isinstance(context, webdriver.bidi.protocol.BidiWindow): + # Context can be a serialized WindowProxy. + return context.browsing_context + raise ValueError("Unexpected context type: %s" % context) + + class BidiBluetoothHandleRequestDevicePrompt: name = "bidi.bluetooth.handle_request_device_prompt" @@ -16,18 +33,10 @@ class BidiBluetoothHandleRequestDevicePrompt: self.protocol = protocol async def __call__(self, payload): - if payload["context"] is None: + if "context" not in payload: raise ValueError("Missing required parameter: context") - context = payload["context"] - if isinstance(context, str): - pass - elif isinstance(context, webdriver.bidi.protocol.BidiWindow): - # Context can be a serialized WindowProxy. - context = context.browsing_context - else: - raise ValueError("Unexpected context type: %s" % context) - + context = get_browsing_context_id(payload["context"]) prompt = payload["prompt"] accept = payload["accept"] device = payload["device"] @@ -42,17 +51,10 @@ class BidiBluetoothSimulateAdapterAction: self.protocol = protocol async def __call__(self, payload): - if payload["context"] is None: + if "context" not in payload: raise ValueError("Missing required parameter: context") - context = payload["context"] - if isinstance(context, str): - pass - elif isinstance(context, webdriver.bidi.protocol.BidiWindow): - # Context can be a serialized WindowProxy. - context = context.browsing_context - else: - raise ValueError("Unexpected context type: %s" % context) + context = get_browsing_context_id(payload["context"]) state = payload["state"] return await self.protocol.bidi_bluetooth.simulate_adapter(context, @@ -68,17 +70,9 @@ class BidiBluetoothSimulatePreconnectedPeripheralAction: self.protocol = protocol async def __call__(self, payload): - if payload["context"] is None: + if "context" not in payload: raise ValueError("Missing required parameter: context") - - context = payload["context"] - if isinstance(context, str): - pass - elif isinstance(context, webdriver.bidi.protocol.BidiWindow): - # Context can be a serialized WindowProxy. - context = context.browsing_context - else: - raise ValueError("Unexpected context type: %s" % context) + context = get_browsing_context_id(payload["context"]) address = payload["address"] name = payload["name"] @@ -97,22 +91,29 @@ class BidiEmulationSetGeolocationOverrideAction: self.protocol = protocol async def __call__(self, payload): - coordinates = payload['coordinates'] + if "error" in payload and "coordinates" in payload: + raise ValueError( + "Params `error` and `coordinates` are mutually exclusive") + + # If `error` is present, set it. Otherwise, do not pass it (error: None). + # Note, unlike `coordinates`, `error` cannot be `UNDEFINED`. It's either + # `None` and it's not passed, or some dict value which is passed. + error = payload['error'] if 'error' in payload else None + # If `error` is present, do not pass `coordinates` (coordinates: UNDEFINED). + # Otherwise, remove emulation (coordinates: None). + coordinates = payload['coordinates'] if 'coordinates' in payload else ( + None if error is None else UNDEFINED) + + if "contexts" not in payload: + raise ValueError("Missing required parameter: contexts") contexts = [] for context in payload["contexts"]: - # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the - # value is extracted from the serialized object. - if isinstance(context, str): - contexts.append(context) - elif isinstance(context, webdriver.bidi.protocol.BidiWindow): - contexts.append(context.browsing_context) - else: - raise ValueError("Unexpected context type: %s" % context) + contexts.append(get_browsing_context_id(context)) if len(contexts) == 0: raise ValueError("At least one context must be provided") return await self.protocol.bidi_emulation.set_geolocation_override( - coordinates, contexts) + coordinates, error, contexts) class BidiSessionSubscribeAction: @@ -126,17 +127,10 @@ class BidiSessionSubscribeAction: async def __call__(self, payload): events = payload["events"] contexts = None - if payload["contexts"] is not None: + if "contexts" in payload and payload["contexts"] is not None: contexts = [] for context in payload["contexts"]: - # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the - # value is extracted from the serialized object. - if isinstance(context, str): - contexts.append(context) - elif isinstance(context, webdriver.bidi.protocol.BidiWindow): - contexts.append(context.browsing_context) - else: - raise ValueError("Unexpected context type: %s" % context) + contexts.append(get_browsing_context_id(context)) return await self.protocol.bidi_events.subscribe(events, contexts) diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index 87403c2944d..7ca46a05a7b 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -272,9 +272,9 @@ class WebDriverBidiEmulationProtocolPart(BidiEmulationProtocolPart): def setup(self): self.webdriver = self.parent.webdriver - async def set_geolocation_override(self, coordinates, contexts): + async def set_geolocation_override(self, coordinates, error, contexts): return await self.webdriver.bidi_session.emulation.set_geolocation_override( - coordinates=coordinates, contexts=contexts) + coordinates=coordinates, error=error, contexts=contexts) class WebDriverBidiPermissionsProtocolPart(BidiPermissionsProtocolPart): diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py index 833dff45636..16eb3cbb4a5 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py @@ -5,7 +5,10 @@ import traceback from http.client import HTTPConnection from abc import ABCMeta, abstractmethod -from typing import Any, Awaitable, Callable, ClassVar, List, Mapping, Optional, Tuple, Type +from typing import Any, Awaitable, Callable, ClassVar, List, Mapping, Optional, \ + Tuple, Type, Union + +from webdriver.bidi.undefined import Undefined def merge_dicts(target, source): @@ -452,7 +455,8 @@ class BidiEmulationProtocolPart(ProtocolPart): @abstractmethod async def set_geolocation_override(self, - coordinates: Optional[Mapping[str, Any]], + coordinates: Optional[Union[Mapping[str, Any], Undefined]], + error: Optional[Mapping[str, Any]], contexts: List[str]) -> None: pass diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py deleted file mode 100644 index 95f53011bfc..00000000000 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py +++ /dev/null @@ -1,338 +0,0 @@ -# mypy: allow-untyped-defs - -import functools -import json -import time - -from collections import defaultdict -from mozlog.formatters import base - -from wptrunner.wptmanifest import serializer - -_escape_heading = functools.partial(serializer.escape, extras="]") - - -class ChromiumFormatter(base.BaseFormatter): # type: ignore - """Formatter to produce results matching the Chromium JSON Test Results format. - https://chromium.googlesource.com/chromium/src/+/master/docs/testing/json_test_results_format.md - - Notably, each test has an "artifacts" field that is a dict consisting of - "log": a list of strings (one per subtest + one for harness status, see - _append_test_message for the format) - "screenshots": a list of strings in the format of "url: base64" - - """ - - def __init__(self): - # Whether the run was interrupted, either by the test runner or user. - self.interrupted = False - - # A map of test status to the number of tests that had that status. - self.num_failures_by_status = defaultdict(int) - - # Start time, expressed as offset since UNIX epoch in seconds. Measured - # from the first `suite_start` event. - self.start_timestamp_seconds = None - - # A map of test names to test start timestamps, expressed in seconds - # since UNIX epoch. Only contains tests that are currently running - # (i.e., have not received the `test_end` event). - self.test_starts = {} - - # Trie of test results. Each directory in the test name is a node in - # the trie and the leaf contains the dict of per-test data. - self.tests = {} - - # Two dictionaries keyed by test name. Values are lists of strings: - # actual metadata content and other messages, respectively. - # See _append_test_message for examples. - self.actual_metadata = defaultdict(list) - self.messages = defaultdict(list) - - # List of tests that have failing subtests. - self.tests_with_subtest_fails = set() - - # Browser log for the current test under execution. - # These logs are from ChromeDriver's stdout/err, so we cannot say for - # sure which test a message is from, but instead we correlate them based - # on timing. - self.browser_log = [] - - def _append_test_message(self, test, subtest, wpt_actual_status, message): - r""" - Appends the message data for a test or subtest. - - :param str test: the name of the test - :param str subtest: the name of the subtest with the message. Will be - None if this is called for a test. - :param str wpt_actual_status: the test status as reported by WPT - :param str message: the string to append to the message for this test - - Example actual_metadata of a test with a subtest: - "[test_name]\n expected: OK\n" - " [subtest_name]\n expected: FAIL\n" - - NOTE: throughout this function we output a key called "expected" but - fill it in with the actual status. This is by design. The goal of this - output is to look exactly like WPT's expectation metadata so that it - can be easily diff-ed. - - Messages are appended verbatim to self.messages[test]. - """ - if subtest: - result = " [%s]\n expected: %s\n" % (_escape_heading(subtest), - wpt_actual_status) - self.actual_metadata[test].append(result) - if message: - self.messages[test].append("%s: %s\n" % (subtest, message)) - else: - # No subtest, so this is the top-level test. The result must be - # prepended to the list, so that it comes before any subtest. - test_name_last_part = test.split("/")[-1] - result = "[%s]\n expected: %s\n" % ( - _escape_heading(test_name_last_part), wpt_actual_status) - self.actual_metadata[test].insert(0, result) - if message: - self.messages[test].insert(0, "Harness: %s\n" % message) - - def _append_artifact(self, cur_dict, artifact_name, artifact_value): - """ - Appends artifacts to the specified dictionary. - :param dict cur_dict: the test leaf dictionary to append to - :param str artifact_name: the name of the artifact - :param str artifact_value: the value of the artifact - """ - assert isinstance(artifact_value, str), "artifact_value must be a str" - if "artifacts" not in cur_dict.keys(): - cur_dict["artifacts"] = defaultdict(list) - cur_dict["artifacts"][artifact_name].append(artifact_value) - - def _store_test_result(self, name, actual, expected, actual_metadata, - messages, wpt_actual, subtest_failure, - duration=None, reftest_screenshots=None): - """ - Stores the result of a single test in |self.tests| - - :param str name: name of the test. - :param str actual: actual status of the test. - :param str expected: expected statuses of the test. - :param list actual_metadata: a list of metadata items. - :param list messages: a list of test messages. - :param str wpt_actual: actual status reported by wpt, may differ from |actual|. - :param bool subtest_failure: whether this test failed because of subtests. - :param Optional[float] duration: time it took in seconds to run this test. - :param Optional[list] reftest_screenshots: see executors/base.py for definition. - """ - # The test name can contain a leading / which will produce an empty - # string in the first position of the list returned by split. We use - # filter(None) to remove such entries. - name_parts = filter(None, name.split("/")) - cur_dict = self.tests - for name_part in name_parts: - cur_dict = cur_dict.setdefault(name_part, {}) - # Splitting and joining the list of statuses here avoids the need for - # recursively postprocessing the |tests| trie at shutdown. We assume the - # number of repetitions is typically small enough for the quadratic - # runtime to not matter. - statuses = cur_dict.get("actual", "").split() - statuses.append(actual) - cur_dict["actual"] = " ".join(statuses) - cur_dict["expected"] = expected - if duration is not None: - # Record the time to run the first invocation only. - cur_dict.setdefault("time", duration) - durations = cur_dict.setdefault("times", []) - durations.append(duration) - if subtest_failure: - self._append_artifact(cur_dict, "wpt_subtest_failure", "true") - if wpt_actual != actual: - self._append_artifact(cur_dict, "wpt_actual_status", wpt_actual) - if wpt_actual == 'CRASH': - for line in self.browser_log: - self._append_artifact(cur_dict, "wpt_crash_log", line) - for metadata in actual_metadata: - self._append_artifact(cur_dict, "wpt_actual_metadata", metadata) - for message in messages: - self._append_artifact(cur_dict, "wpt_log", message) - - # Store screenshots (if any). - for item in reftest_screenshots or []: - if not isinstance(item, dict): - # Skip the relation string. - continue - data = "%s: %s" % (item["url"], item["screenshot"]) - self._append_artifact(cur_dict, "screenshots", data) - - # Figure out if there was a regression, unexpected status, or flake. - # This only happens for tests that were run - if actual != "SKIP": - if actual not in expected: - cur_dict["is_unexpected"] = True - if actual != "PASS": - cur_dict["is_regression"] = True - if len(set(statuses)) > 1: - cur_dict["is_flaky"] = True - - # Update the count of how many tests ran with each status. Only includes - # the first invocation's result in the totals. - if len(statuses) == 1: - self.num_failures_by_status[actual] += 1 - - def _map_status_name(self, status): - """ - Maps a WPT status to a Chromium status. - - Chromium has five main statuses that we have to map to: - CRASH: the test harness crashed - FAIL: the test did not run as expected - PASS: the test ran as expected - SKIP: the test was not run - TIMEOUT: the did not finish in time and was aborted - - :param str status: the string status of a test from WPT - :return: a corresponding string status for Chromium - """ - if status == "OK": - return "PASS" - if status == "NOTRUN": - return "SKIP" - if status == "EXTERNAL-TIMEOUT": - return "TIMEOUT" - if status in ("ERROR", "PRECONDITION_FAILED"): - return "FAIL" - if status == "INTERNAL-ERROR": - return "CRASH" - # Any other status just gets returned as-is. - return status - - def _get_expected_status_from_data(self, actual_status, data): - """ - Gets the expected statuses from a |data| dictionary. - - If there is no expected status in data, the actual status is returned. - This is because mozlog will delete "expected" from |data| if it is the - same as "status". So the presence of "expected" implies that "status" is - unexpected. Conversely, the absence of "expected" implies the "status" - is expected. So we use the "expected" status if it's there or fall back - to the actual status if it's not. - - If the test has multiple statuses, it will have other statuses listed as - "known_intermittent" in |data|. If these exist, they will be added to - the returned status with spaced in between. - - :param str actual_status: the actual status of the test - :param data: a data dictionary to extract expected status from - :return str: the expected statuses as a string - """ - expected_statuses = self._map_status_name(data["expected"]) if "expected" in data else actual_status - if data.get("known_intermittent"): - all_statsues = {self._map_status_name(other_status) for other_status in data["known_intermittent"]} - all_statsues.add(expected_statuses) - expected_statuses = " ".join(sorted(all_statsues)) - return expected_statuses - - def _get_time(self, data): - """Get the timestamp of a message in seconds since the UNIX epoch.""" - maybe_timestamp_millis = data.get("time") - if maybe_timestamp_millis is not None: - return float(maybe_timestamp_millis) / 1000 - return time.time() - - def _time_test(self, test_name, data): - """Time how long a test took to run. - - :param str test_name: the name of the test to time - :param data: a data dictionary to extract the test end timestamp from - :return Optional[float]: a nonnegative duration in seconds or None if - the measurement is unavailable or invalid - """ - test_start = self.test_starts.pop(test_name, None) - if test_start is not None: - # The |data| dictionary only provides millisecond resolution - # anyway, so further nonzero digits are unlikely to be meaningful. - duration = round(self._get_time(data) - test_start, 3) - if duration >= 0: - return duration - return None - - def suite_start(self, data): - if self.start_timestamp_seconds is None: - self.start_timestamp_seconds = self._get_time(data) - if 'run_info' in data: - self.flag_specific = data['run_info'].get('flag_specific', '') - - def test_start(self, data): - test_name = data["test"] - self.test_starts[test_name] = self._get_time(data) - - def test_status(self, data): - test_name = data["test"] - wpt_actual_status = data["status"] - actual_status = self._map_status_name(wpt_actual_status) - expected_statuses = self._get_expected_status_from_data(actual_status, data) - - is_unexpected = actual_status not in expected_statuses - if is_unexpected and test_name not in self.tests_with_subtest_fails: - self.tests_with_subtest_fails.add(test_name) - # We should always get a subtest in the data dict, but it's technically - # possible that it's missing. Be resilient here. - subtest_name = data.get("subtest", "UNKNOWN SUBTEST") - self._append_test_message(test_name, subtest_name, - wpt_actual_status, data.get("message", "")) - - def test_end(self, data): - test_name = data["test"] - # Save the status reported by WPT since we might change it when - # reporting to Chromium. - wpt_actual_status = data["status"] - actual_status = self._map_status_name(wpt_actual_status) - expected_statuses = self._get_expected_status_from_data(actual_status, data) - duration = self._time_test(test_name, data) - subtest_failure = False - if test_name in self.tests_with_subtest_fails: - subtest_failure = True - # Clean up the test list to avoid accumulating too many. - self.tests_with_subtest_fails.remove(test_name) - # This test passed but it has failing subtests. Since we can only - # report a single status to Chromium, we choose FAIL to indicate - # that something about this test did not run correctly. - if actual_status == "PASS": - actual_status = "FAIL" - - self._append_test_message(test_name, None, wpt_actual_status, - data.get("message", "")) - self._store_test_result(test_name, - actual_status, - expected_statuses, - self.actual_metadata[test_name], - self.messages[test_name], - wpt_actual_status, - subtest_failure, - duration, - data.get("extra", {}).get("reftest_screenshots")) - - # Remove the test from dicts to avoid accumulating too many. - self.actual_metadata.pop(test_name) - self.messages.pop(test_name) - - # New test, new browser logs. - self.browser_log = [] - - def shutdown(self, data): - # Create the final result dictionary - final_result = { - # There are some required fields that we just hard-code. - "interrupted": False, - "path_delimiter": "/", - "version": 3, - "seconds_since_epoch": self.start_timestamp_seconds, - "num_failures_by_type": self.num_failures_by_status, - "flag_name": self.flag_specific, - "tests": self.tests - } - return json.dumps(final_result) - - def process_output(self, data): - cmd = data.get("command", "") - if any(c in cmd for c in ["chromedriver", "logcat"]): - self.browser_log.append(data['data']) diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py deleted file mode 100644 index bf815d5dc76..00000000000 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py +++ /dev/null @@ -1,828 +0,0 @@ -# mypy: ignore-errors - -import json -import sys -from os.path import dirname, join -from io import StringIO - -from mozlog import handlers, structuredlog -import pytest - -sys.path.insert(0, join(dirname(__file__), "..", "..")) -from formatters.chromium import ChromiumFormatter - - -@pytest.fixture -def logger(): - test_logger = structuredlog.StructuredLogger("test_a") - try: - yield test_logger - finally: - # Loggers of the same name share state globally: - # https://searchfox.org/mozilla-central/rev/1c54648c082efdeb08cf6a5e3a8187e83f7549b9/testing/mozbase/mozlog/mozlog/structuredlog.py#195-196 - # - # Resetting the state here ensures the logger will not be shut down in - # the next test. - test_logger.reset_state() - - -def test_chromium_required_fields(logger, capfd): - # Test that the test results contain a handful of required fields. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # output a bunch of stuff - logger.suite_start(["test-id-1"], run_info={}, time=123) - logger.test_start("test-id-1") - logger.test_end("test-id-1", status="PASS", expected="PASS") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_obj = json.load(output) - - # Check for existence of required fields - assert "interrupted" in output_obj - assert "path_delimiter" in output_obj - assert "version" in output_obj - assert "num_failures_by_type" in output_obj - assert "tests" in output_obj - - test_obj = output_obj["tests"]["test-id-1"] - assert "actual" in test_obj - assert "expected" in test_obj - - -def test_time_per_test(logger, capfd): - # Test that the formatter measures time per test correctly. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - logger.suite_start(["test-id-1", "test-id-2"], run_info={}, time=50) - logger.test_start("test-id-1", time=100) - logger.test_start("test-id-2", time=200) - logger.test_end("test-id-1", status="PASS", expected="PASS", time=300) - logger.test_end("test-id-2", status="PASS", expected="PASS", time=199) - logger.suite_end() - - logger.suite_start(["test-id-1"], run_info={}, time=400) - logger.test_start("test-id-1", time=500) - logger.test_end("test-id-1", status="PASS", expected="PASS", time=600) - logger.suite_end() - - # Write the final results. - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_obj = json.load(output) - - test1_obj = output_obj["tests"]["test-id-1"] - test2_obj = output_obj["tests"]["test-id-2"] - # Test 1 run 1: 300ms - 100ms = 0.2s - # Test 1 run 2: 600ms - 500ms = 0.1s - assert test1_obj["time"] == pytest.approx(0.2) - assert len(test1_obj["times"]) == 2 - assert test1_obj["times"][0] == pytest.approx(0.2) - assert test1_obj["times"][1] == pytest.approx(0.1) - assert "time" not in test2_obj - assert "times" not in test2_obj - - -def test_chromium_test_name_trie(logger, capfd): - # Ensure test names are broken into directories and stored in a trie with - # test results at the leaves. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # output a bunch of stuff - logger.suite_start(["/foo/bar/test-id-1", "/foo/test-id-2"], run_info={}, - time=123) - logger.test_start("/foo/bar/test-id-1") - logger.test_end("/foo/bar/test-id-1", status="TIMEOUT", expected="FAIL") - logger.test_start("/foo/test-id-2") - logger.test_end("/foo/test-id-2", status="ERROR", expected="TIMEOUT") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_obj = json.load(output) - - # Ensure that the test names are broken up by directory name and that the - # results are stored at the leaves. - test_obj = output_obj["tests"]["foo"]["bar"]["test-id-1"] - assert test_obj["actual"] == "TIMEOUT" - assert test_obj["expected"] == "FAIL" - - test_obj = output_obj["tests"]["foo"]["test-id-2"] - # The ERROR status is mapped to FAIL for Chromium - assert test_obj["actual"] == "FAIL" - assert test_obj["expected"] == "TIMEOUT" - - -def test_num_failures_by_type(logger, capfd): - # Test that the number of failures by status type is correctly calculated. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run some tests with different statuses: 3 passes, 1 timeout - logger.suite_start(["t1", "t2", "t3", "t4"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="PASS", expected="PASS") - logger.test_start("t2") - logger.test_end("t2", status="PASS", expected="PASS") - logger.test_start("t3") - logger.test_end("t3", status="PASS", expected="FAIL") - logger.test_start("t4") - logger.test_end("t4", status="TIMEOUT", expected="CRASH") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - num_failures_by_type = json.load(output)["num_failures_by_type"] - - # We expect 3 passes and 1 timeout, nothing else. - assert sorted(num_failures_by_type.keys()) == ["PASS", "TIMEOUT"] - assert num_failures_by_type["PASS"] == 3 - assert num_failures_by_type["TIMEOUT"] == 1 - - -def test_subtest_messages(logger, capfd): - # Tests accumulation of test output - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run two tests with subtest messages. The subtest name should be included - # in the output. We should also tolerate missing messages and subtest names - # with unusual characters. - logger.suite_start(["t1", "t2"], run_info={}, time=123) - logger.test_start("t1") - logger.test_status("t1", status="FAIL", subtest="t1_a", - message="t1_a_message") - # Subtest name includes a backslash and two closing square brackets. - logger.test_status("t1", status="PASS", subtest=r"t1_\[]]b", - message="t1_b_message") - logger.test_end("t1", status="PASS", expected="PASS") - logger.test_start("t2") - # Subtests with empty messages should not be ignored. - logger.test_status("t2", status="PASS", subtest="t2_a") - # A test-level message will also be appended - logger.test_end("t2", status="TIMEOUT", expected="PASS", - message="t2_message") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - t1_artifacts = output_json["tests"]["t1"]["artifacts"] - assert t1_artifacts["wpt_actual_metadata"] == [ - "[t1]\n expected: PASS\n", - " [t1_a]\n expected: FAIL\n", - " [t1_\\\\[\\]\\]b]\n expected: PASS\n", - ] - assert t1_artifacts["wpt_log"] == [ - "t1_a: t1_a_message\n", - # Only humans will read the log, so there's no need to escape - # characters here. - "t1_\\[]]b: t1_b_message\n", - ] - assert t1_artifacts["wpt_subtest_failure"] == ["true"] - t2_artifacts = output_json["tests"]["t2"]["artifacts"] - assert t2_artifacts["wpt_actual_metadata"] == [ - "[t2]\n expected: TIMEOUT\n", - " [t2_a]\n expected: PASS\n", - ] - assert t2_artifacts["wpt_log"] == [ - "Harness: t2_message\n" - ] - assert "wpt_subtest_failure" not in t2_artifacts.keys() - - -def test_subtest_failure(logger, capfd): - # Tests that a test fails if a subtest fails - - # Set up the handler. - output = StringIO() - formatter = ChromiumFormatter() - logger.add_handler(handlers.StreamHandler(output, formatter)) - - # Run a test with some subtest failures. - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_status("t1", status="FAIL", subtest="t1_a", - message="t1_a_message") - logger.test_status("t1", status="PASS", subtest="t1_b", - message="t1_b_message") - logger.test_status("t1", status="TIMEOUT", subtest="t1_c", - message="t1_c_message") - - # Make sure the test name was added to the set of tests with subtest fails - assert "t1" in formatter.tests_with_subtest_fails - - # The test status is reported as a pass here because the harness was able to - # run the test to completion. - logger.test_end("t1", status="PASS", expected="PASS", message="top_message") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - t1_artifacts = test_obj["artifacts"] - assert t1_artifacts["wpt_actual_metadata"] == [ - "[t1]\n expected: PASS\n", - " [t1_a]\n expected: FAIL\n", - " [t1_b]\n expected: PASS\n", - " [t1_c]\n expected: TIMEOUT\n", - ] - assert t1_artifacts["wpt_log"] == [ - "Harness: top_message\n", - "t1_a: t1_a_message\n", - "t1_b: t1_b_message\n", - "t1_c: t1_c_message\n", - ] - assert t1_artifacts["wpt_subtest_failure"] == ["true"] - # The status of the test in the output is a failure because subtests failed, - # despite the harness reporting that the test passed. But the harness status - # is logged as an artifact. - assert t1_artifacts["wpt_actual_status"] == ["PASS"] - assert test_obj["actual"] == "FAIL" - assert test_obj["expected"] == "PASS" - # Also ensure that the formatter cleaned up its internal state - assert "t1" not in formatter.tests_with_subtest_fails - - -def test_expected_subtest_failure(logger, capfd): - # Tests that an expected subtest failure does not cause the test to fail - - # Set up the handler. - output = StringIO() - formatter = ChromiumFormatter() - logger.add_handler(handlers.StreamHandler(output, formatter)) - - # Run a test with some expected subtest failures. - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_status("t1", status="FAIL", expected="FAIL", subtest="t1_a", - message="t1_a_message") - logger.test_status("t1", status="PASS", subtest="t1_b", - message="t1_b_message") - logger.test_status("t1", status="TIMEOUT", expected="TIMEOUT", subtest="t1_c", - message="t1_c_message") - - # The subtest failures are all expected so this test should not be added to - # the set of tests with subtest failures. - assert "t1" not in formatter.tests_with_subtest_fails - - # The test status is reported as a pass here because the harness was able to - # run the test to completion. - logger.test_end("t1", status="OK", expected="OK") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - assert test_obj["artifacts"]["wpt_actual_metadata"] == [ - "[t1]\n expected: OK\n", - " [t1_a]\n expected: FAIL\n", - " [t1_b]\n expected: PASS\n", - " [t1_c]\n expected: TIMEOUT\n", - ] - assert test_obj["artifacts"]["wpt_log"] == [ - "t1_a: t1_a_message\n", - "t1_b: t1_b_message\n", - "t1_c: t1_c_message\n", - ] - # The status of the test in the output is a pass because the subtest - # failures were all expected. - assert test_obj["actual"] == "PASS" - assert test_obj["expected"] == "PASS" - - -def test_unexpected_subtest_pass(logger, capfd): - # A subtest that unexpectedly passes is considered a failure condition. - - # Set up the handler. - output = StringIO() - formatter = ChromiumFormatter() - logger.add_handler(handlers.StreamHandler(output, formatter)) - - # Run a test with a subtest that is expected to fail but passes. - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_status("t1", status="PASS", expected="FAIL", subtest="t1_a", - message="t1_a_message") - - # Since the subtest behaviour is unexpected, it's considered a failure, so - # the test should be added to the set of tests with subtest failures. - assert "t1" in formatter.tests_with_subtest_fails - - # The test status is reported as a pass here because the harness was able to - # run the test to completion. - logger.test_end("t1", status="PASS", expected="PASS") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - t1_artifacts = test_obj["artifacts"] - assert t1_artifacts["wpt_actual_metadata"] == [ - "[t1]\n expected: PASS\n", - " [t1_a]\n expected: PASS\n", - ] - assert t1_artifacts["wpt_log"] == [ - "t1_a: t1_a_message\n", - ] - assert t1_artifacts["wpt_subtest_failure"] == ["true"] - # Since the subtest status is unexpected, we fail the test. But we report - # wpt_actual_status as an artifact - assert t1_artifacts["wpt_actual_status"] == ["PASS"] - assert test_obj["actual"] == "FAIL" - assert test_obj["expected"] == "PASS" - # Also ensure that the formatter cleaned up its internal state - assert "t1" not in formatter.tests_with_subtest_fails - - -def test_expected_test_fail(logger, capfd): - # Check that an expected test-level failure is treated as a Pass - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run some tests with different statuses: 3 passes, 1 timeout - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="ERROR", expected="ERROR") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - # The test's actual and expected status should map from "ERROR" to "FAIL" - assert test_obj["actual"] == "FAIL" - assert test_obj["expected"] == "FAIL" - # ..and this test should not be a regression nor unexpected - assert "is_regression" not in test_obj - assert "is_unexpected" not in test_obj - - -def test_unexpected_test_fail(logger, capfd): - # Check that an unexpected test-level failure is marked as unexpected and - # as a regression. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run some tests with different statuses: 3 passes, 1 timeout - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="ERROR", expected="OK") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - # The test's actual and expected status should be mapped, ERROR->FAIL and - # OK->PASS - assert test_obj["actual"] == "FAIL" - assert test_obj["expected"] == "PASS" - # ..and this test should be a regression and unexpected - assert test_obj["is_regression"] is True - assert test_obj["is_unexpected"] is True - - -def test_flaky_test_expected(logger, capfd): - # Check that a flaky test with multiple possible statuses is seen as - # expected if its actual status is one of the possible ones. - - # set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run a test that is known to be flaky - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="ERROR", expected="OK", known_intermittent=["ERROR", "TIMEOUT"]) - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - # The test's statuses are all mapped, changing ERROR->FAIL and OK->PASS - assert test_obj["actual"] == "FAIL" - # All the possible statuses are merged and sorted together into expected. - assert test_obj["expected"] == "FAIL PASS TIMEOUT" - # ...this is not a regression or unexpected because the actual status is one - # of the expected ones - assert "is_regression" not in test_obj - assert "is_unexpected" not in test_obj - - -def test_flaky_test_unexpected(logger, capfd): - # Check that a flaky test with multiple possible statuses is seen as - # unexpected if its actual status is NOT one of the possible ones. - - # set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run a test that is known to be flaky - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="ERROR", expected="OK", known_intermittent=["TIMEOUT"]) - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - # The test's statuses are all mapped, changing ERROR->FAIL and OK->PASS - assert test_obj["actual"] == "FAIL" - # All the possible statuses are merged and sorted together into expected. - assert test_obj["expected"] == "PASS TIMEOUT" - # ...this is a regression and unexpected because the actual status is not - # one of the expected ones - assert test_obj["is_regression"] is True - assert test_obj["is_unexpected"] is True - - -def test_precondition_failed(logger, capfd): - # Check that a failed precondition gets properly handled. - - # set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run a test with a precondition failure - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="PRECONDITION_FAILED", expected="OK") - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - # The precondition failure should map to FAIL status, but we should also - # have an artifact containing the original PRECONDITION_FAILED status. - assert test_obj["actual"] == "FAIL" - assert test_obj["artifacts"]["wpt_actual_status"] == ["PRECONDITION_FAILED"] - # ...this is an unexpected regression because we expected a pass but failed - assert test_obj["is_regression"] is True - assert test_obj["is_unexpected"] is True - - -def test_repeated_test_statuses(logger, capfd): - # Check that the logger outputs all statuses from multiple runs of a test. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run a test suite for the first time. - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="PASS", expected="PASS", known_intermittent=[]) - logger.suite_end() - - # Run the test suite for the second time. - logger.suite_start(["t1"], run_info={}, time=456) - logger.test_start("t1") - logger.test_end("t1", status="FAIL", expected="PASS", known_intermittent=[]) - logger.suite_end() - - # Write the final results. - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - status_totals = output_json["num_failures_by_type"] - assert status_totals["PASS"] == 1 - # A missing result type is the same as being present and set to zero (0). - assert status_totals.get("FAIL", 0) == 0 - - # The actual statuses are accumulated in a ordered space-separated list. - test_obj = output_json["tests"]["t1"] - assert test_obj["actual"] == "PASS FAIL" - assert test_obj["expected"] == "PASS" - - -def test_flaky_test_detection(logger, capfd): - # Check that the logger detects flakiness for a test run multiple times. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - logger.suite_start(["t1", "t2"], run_info={}) - logger.test_start("t1") - logger.test_start("t2") - logger.test_end("t1", status="FAIL", expected="PASS") - logger.test_end("t2", status="FAIL", expected="FAIL") - logger.suite_end() - - logger.suite_start(["t1", "t2"], run_info={}) - logger.test_start("t1") - logger.test_start("t2") - logger.test_end("t1", status="PASS", expected="PASS") - logger.test_end("t2", status="FAIL", expected="FAIL") - logger.suite_end() - - # Write the final results. - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - # We consider a test flaky if it runs multiple times and produces more than - # one kind of result. - test1_obj = output_json["tests"]["t1"] - test2_obj = output_json["tests"]["t2"] - assert test1_obj["is_flaky"] is True - assert "is_flaky" not in test2_obj - - -def test_known_intermittent_empty(logger, capfd): - # If the known_intermittent list is empty, we want to ensure we don't append - # any extraneous characters to the output. - - # set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run a test and include an empty known_intermittent list - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="OK", expected="OK", known_intermittent=[]) - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - # Both actual and expected statuses get mapped to Pass. No extra whitespace - # anywhere. - assert test_obj["actual"] == "PASS" - assert test_obj["expected"] == "PASS" - - -def test_known_intermittent_duplicate(logger, capfd): - # We don't want to have duplicate statuses in the final "expected" field. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # There are two duplications in this input: - # 1. known_intermittent already contains expected; - # 2. both statuses in known_intermittent map to FAIL in Chromium. - # In the end, we should only get one FAIL in Chromium "expected". - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="ERROR", expected="ERROR", known_intermittent=["FAIL", "ERROR"]) - logger.suite_end() - logger.shutdown() - - # Check nothing got output to stdout/stderr. - # (Note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # Check the actual output of the formatter. - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - assert test_obj["actual"] == "FAIL" - # No duplicate "FAIL" in "expected". - assert test_obj["expected"] == "FAIL" - - -def test_reftest_screenshots(logger, capfd): - # reftest_screenshots, if present, should be plumbed into artifacts. - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - # Run a reftest with reftest_screenshots. - logger.suite_start(["t1"], run_info={}, time=123) - logger.test_start("t1") - logger.test_end("t1", status="FAIL", expected="PASS", extra={ - "reftest_screenshots": [ - {"url": "foo.html", "hash": "HASH1", "screenshot": "DATA1"}, - "!=", - {"url": "foo-ref.html", "hash": "HASH2", "screenshot": "DATA2"}, - ] - }) - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - assert test_obj["artifacts"]["screenshots"] == [ - "foo.html: DATA1", - "foo-ref.html: DATA2", - ] - - -def test_process_output_crashing_test(logger, capfd): - """Test that chromedriver logs are preserved for crashing tests""" - - # Set up the handler. - output = StringIO() - logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) - - logger.suite_start(["t1", "t2", "t3"], run_info={}, time=123) - - logger.test_start("t1") - logger.process_output(100, "This message should be recorded", "/some/path/to/chromedriver --some-flag") - logger.process_output(101, "This message should not be recorded", "/some/other/process --another-flag") - logger.process_output(100, "This message should also be recorded", "/some/path/to/chromedriver --some-flag") - logger.test_end("t1", status="CRASH", expected="CRASH") - - logger.test_start("t2") - logger.process_output(100, "Another message for the second test", "/some/path/to/chromedriver --some-flag") - logger.test_end("t2", status="CRASH", expected="PASS") - - logger.test_start("t3") - logger.process_output(100, "This test fails", "/some/path/to/chromedriver --some-flag") - logger.process_output(100, "But the output should not be captured", "/some/path/to/chromedriver --some-flag") - logger.process_output(100, "Because it does not crash", "/some/path/to/chromedriver --some-flag") - logger.test_end("t3", status="FAIL", expected="PASS") - - logger.suite_end() - logger.shutdown() - - # check nothing got output to stdout/stderr - # (note that mozlog outputs exceptions during handling to stderr!) - captured = capfd.readouterr() - assert captured.out == "" - assert captured.err == "" - - # check the actual output of the formatter - output.seek(0) - output_json = json.load(output) - - test_obj = output_json["tests"]["t1"] - assert test_obj["artifacts"]["wpt_crash_log"] == [ - "This message should be recorded", - "This message should also be recorded" - ] - - test_obj = output_json["tests"]["t2"] - assert test_obj["artifacts"]["wpt_crash_log"] == [ - "Another message for the second test" - ] - - test_obj = output_json["tests"]["t3"] - assert "wpt_crash_log" not in test_obj["artifacts"] diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js index ab8b04ba3cd..3c2dd8b42dd 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js @@ -263,11 +263,14 @@ window.test_driver_internal.bidi.emulation.set_geolocation_override = function (params) { + if ('coordinates' in params && 'error' in params) { + throw new Error( + "`coordinates` and `error` are mutually exclusive in set_geolocation_override"); + } + return create_action("bidi.emulation.set_geolocation_override", { // Default to the current window. contexts: [window], - // Default to no coordinates. - coordinates: null, ...(params ?? {}) }); } diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py index 64668fc470b..2c2da790e90 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py @@ -601,7 +601,7 @@ class TestRunnerManager(threading.Thread): assert self.browser.browser is not None self.browser.browser.cleanup() impl = self.test_implementations[(self.state.subsuite, self.state.test_type)] - browser = impl.browser_cls(self.logger, remote_queue=self.command_queue, + browser = impl.browser_cls(self.logger, **impl.browser_kwargs) browser.setup() self.browser = BrowserManager(self.logger, diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py index 647cc7f21b1..7bfeef31717 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py @@ -11,7 +11,7 @@ from typing import Mapping, Optional from . import config from . import products from . import wpttest -from .formatters import chromium, wptreport, wptscreenshot +from .formatters import wptreport, wptscreenshot def abs_path(path): @@ -418,7 +418,6 @@ scheme host and port.""") "Cache API (default: %s)" % wptscreenshot.DEFAULT_API, {"wptscreenshot"}, "store") - commandline.log_formatters["chromium"] = (chromium.ChromiumFormatter, "Chromium Layout Tests format") commandline.log_formatters["wptreport"] = (wptreport.WptreportFormatter, "wptreport format") commandline.log_formatters["wptscreenshot"] = (wptscreenshot.WptscreenshotFormatter, "wpt.fyi screenshots") diff --git a/tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js b/tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js new file mode 100644 index 00000000000..e997d81f75a --- /dev/null +++ b/tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js @@ -0,0 +1,24 @@ +(function simd_select_wast_js() { + +// simd_select.wast:3 +let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x88\x80\x80\x80\x00\x01\x60\x03\x7b\x7b\x7f\x01\x7b\x03\x82\x80\x80\x80\x00\x01\x00\x07\x93\x80\x80\x80\x00\x01\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x00\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\x1b\x0b"); + +// simd_select.wast:9 +run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xfd\x0c\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x41\x01\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("1 2 3 4"), v128("5 6 7 8"), 1]), v128("1 2 3 4")) + +// simd_select.wast:18 +run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xfd\x0c\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x41\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("1 2 3 4"), v128("5 6 7 8"), 0]), v128("5 6 7 8")) + +// simd_select.wast:27 +run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x00\x00\x80\x3f\x00\x00\x00\x40\x00\x00\x40\x40\x00\x00\x80\x40\xfd\x0c\x00\x00\xa0\x40\x00\x00\xc0\x40\x00\x00\xe0\x40\x00\x00\x00\x41\x41\x7f\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x00\x00\x80\x3f\x00\x00\x00\x40\x00\x00\x40\x40\x00\x00\x80\x40\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("1_065_353_216 1_073_741_824 1_077_936_128 1_082_130_432"), v128("1_084_227_584 1_086_324_736 1_088_421_888 1_090_519_040"), -1]), v128("1. 2. 3. 4.")) + +// simd_select.wast:36 +run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x00\x00\xc0\xbf\x00\x00\x20\xc0\x00\x00\x60\xc0\x00\x00\x90\xc0\xfd\x0c\x00\x00\x18\x41\x00\x00\x08\x41\x00\x00\xf0\x40\x00\x00\xd0\x40\x41\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x00\x00\x18\x41\x00\x00\x08\x41\x00\x00\xf0\x40\x00\x00\xd0\x40\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("-1_077_936_128 -1_071_644_672 -1_067_450_368 -1_064_304_640"), v128("1_092_091_904 1_091_043_328 1_089_470_464 1_087_373_312"), 0]), v128("9.5 8.5 7.5 6.5")) + +// simd_select.wast:45 +run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe3\x80\x80\x80\x00\x01\xdd\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\xfd\x0c\x10\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x41\xfb\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("67_305_985 134_678_021 202_050_057 269_422_093"), v128("219_025_168 151_653_132 84_281_096 16_909_060"), 123]), v128("1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16")) + +// simd_select.wast:54 +run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xfd\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("16_843_009 16_843_009 16_843_009 16_843_009"), v128("0 0 0 0"), 0]), v128("0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0")) +reinitializeRegistry(); +})(); diff --git a/tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html b/tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html new file mode 100644 index 00000000000..5d50138374b --- /dev/null +++ b/tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html @@ -0,0 +1,16 @@ +<!doctype html> +<html> + <head> + <meta charset="UTF-8"> + <title>WebAssembly Web Platform Test</title> + </head> + <body> + + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="../js/harness/async_index.js"></script> + + <div id=log></div> + <script src="../js/simd/simd_select.wast.js"></script> + </body> +</html> diff --git a/tests/wpt/tests/webdriver/tests/bidi/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/__init__.py index 955335ea87e..587dc91a938 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/__init__.py @@ -132,7 +132,7 @@ def assert_handle(obj: Mapping[str, Any], should_contain_handle: bool) -> None: assert "handle" not in obj, f"Result should not contain `handle`. Actual: {obj}" -async def create_console_api_message(bidi_session, context: str, text: str): +async def create_console_api_message(bidi_session, context: Any, text: str): await bidi_session.script.call_function( function_declaration="""(text) => console.log(text)""", arguments=[{"type": "string", "value": text}], @@ -142,7 +142,7 @@ async def create_console_api_message(bidi_session, context: str, text: str): return text -async def get_device_pixel_ratio(bidi_session, context: str) -> float: +async def get_device_pixel_ratio(bidi_session, context: Any) -> float: result = await bidi_session.script.call_function( function_declaration="""() => { return window.devicePixelRatio; @@ -167,7 +167,7 @@ async def get_element_dimensions(bidi_session, context, element): return remote_mapping_to_dict(result["value"]) -async def get_viewport_dimensions(bidi_session, context: str, +async def get_viewport_dimensions(bidi_session, context: Any, with_scrollbar: bool = True, quirk_mode: bool = False): if with_scrollbar: expression = """ @@ -198,7 +198,7 @@ async def get_viewport_dimensions(bidi_session, context: str, return remote_mapping_to_dict(result["value"]) -async def get_document_dimensions(bidi_session, context: str): +async def get_document_dimensions(bidi_session, context: Any): expression = """ ({ height: document.documentElement.scrollHeight, diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py index 64c26163734..fa1e748d6b2 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py @@ -1,11 +1,13 @@ import pytest +from webdriver.bidi.modules.script import ContextTarget from webdriver.bidi.undefined import UNDEFINED from ... import get_device_pixel_ratio, get_viewport_dimensions - pytestmark = pytest.mark.asyncio +CONTEXT_LOAD_EVENT = "browsingContext.load" + async def test_set_to_user_context(bidi_session, new_tab, create_user_context): user_context = await create_user_context() @@ -55,6 +57,48 @@ async def test_set_to_user_context(bidi_session, new_tab, create_user_context): ) +async def test_set_to_user_context_window_open( + bidi_session, + new_tab, + create_user_context, + inline, + subscribe_events, + wait_for_event, + wait_for_future_safe, +): + user_context = await create_user_context() + context_in_user_context_1 = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab" + ) + + test_viewport = {"width": 250, "height": 300} + await bidi_session.browsing_context.set_viewport( + user_contexts=[user_context], viewport=test_viewport + ) + assert ( + await get_viewport_dimensions(bidi_session, context_in_user_context_1) + == test_viewport + ) + + await subscribe_events(events=[CONTEXT_LOAD_EVENT]) + + # Assert that tabs opened via window.open in the same user context + # successfully load and have the right viewport set. + on_load = wait_for_event(CONTEXT_LOAD_EVENT) + result = await bidi_session.script.evaluate( + await_promise=False, + expression=f"""window.open('{inline("popup")}')""", + target=ContextTarget(context_in_user_context_1["context"]), + ) + event = await wait_for_future_safe(on_load) + + contexts = await bidi_session.browsing_context.get_tree(root=event["context"]) + assert len(contexts) == 1 + popup_context = contexts[0] + + assert await get_viewport_dimensions(bidi_session, popup_context) == test_viewport + + async def test_set_to_default_user_context(bidi_session, new_tab, create_user_context): user_context = await create_user_context() context_in_user_context_1 = await bidi_session.browsing_context.create( diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py index 33dcca90f04..5e1fd1aa863 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py @@ -1,28 +1 @@ -from webdriver.bidi.modules.script import ContextTarget - -from ... import remote_mapping_to_dict - - TEST_COORDINATES = {"latitude": 10, "longitude": 15, "accuracy": 0.5} - - -async def get_current_geolocation(bidi_session, context): - # Per geolocation spec, the geolocation coordinates are returned - # only for an active browsing context. It might be required to - # re-activate the previously active tab in the test. - await bidi_session.browsing_context.activate(context=context["context"]) - - result = await bidi_session.script.call_function( - function_declaration="""() => - new Promise( - resolve => window.navigator.geolocation.getCurrentPosition( - position => resolve(position.coords.toJSON()), - error => resolve({code: error.code, message: error.message}), - {timeout: 500} - )) - """, - target=ContextTarget(context["context"]), - await_promise=True, - ) - - return remote_mapping_to_dict(result["value"]) diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py index a90895c74ed..5fb9451f0a2 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py @@ -1,6 +1,35 @@ import pytest_asyncio -from ... import get_context_origin +from webdriver.bidi.modules.script import ContextTarget + +from ... import get_context_origin, remote_mapping_to_dict + + +@pytest_asyncio.fixture +async def get_current_geolocation(bidi_session, configuration): + async def get_current_geolocation(context): + # Per geolocation spec, the geolocation coordinates are returned + # only for an active browsing context. It might be required to + # re-activate the previously active tab in the test. + await bidi_session.browsing_context.activate(context=context["context"]) + + result = await bidi_session.script.call_function( + function_declaration="""(multiplier) => + new Promise( + resolve => window.navigator.geolocation.getCurrentPosition( + position => resolve(position.coords.toJSON()), + error => resolve({code: error.code}), + {timeout: 500 * multiplier} + )) + """, + arguments=[{"type": "number", "value": configuration["timeout_multiplier"]}], + target=ContextTarget(context["context"]), + await_promise=True, + ) + + return remote_mapping_to_dict(result["value"]) + + return get_current_geolocation @pytest_asyncio.fixture diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py index 8a0e43475da..068bb804e73 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py @@ -2,14 +2,14 @@ import pytest from webdriver.bidi.modules.emulation import CoordinatesOptions -from . import get_current_geolocation, TEST_COORDINATES +from . import TEST_COORDINATES pytestmark = pytest.mark.asyncio async def test_contexts( - bidi_session, new_tab, top_context, url, set_geolocation_permission + bidi_session, new_tab, top_context, url, get_current_geolocation, set_geolocation_permission ): test_url = url("/common/blank.html") await bidi_session.browsing_context.navigate( @@ -24,12 +24,10 @@ async def test_contexts( ) await set_geolocation_permission(new_tab) - default_coordinates = await get_current_geolocation(bidi_session, new_tab) + default_coordinates = await get_current_geolocation(new_tab) assert default_coordinates != TEST_COORDINATES - assert ( - await get_current_geolocation(bidi_session, top_context) == default_coordinates - ) + assert await get_current_geolocation(top_context) == default_coordinates # Set geolocation override. await bidi_session.emulation.set_geolocation_override( @@ -41,24 +39,20 @@ async def test_contexts( ), ) - assert await get_current_geolocation(bidi_session, new_tab) == TEST_COORDINATES - assert ( - await get_current_geolocation(bidi_session, top_context) == default_coordinates - ) + assert await get_current_geolocation(new_tab) == TEST_COORDINATES + assert await get_current_geolocation(top_context) == default_coordinates # Reset geolocation override. await bidi_session.emulation.set_geolocation_override( contexts=[new_tab["context"]], coordinates=None ) - assert await get_current_geolocation(bidi_session, new_tab) == default_coordinates - assert ( - await get_current_geolocation(bidi_session, top_context) == default_coordinates - ) + assert await get_current_geolocation(new_tab) == default_coordinates + assert await get_current_geolocation(top_context) == default_coordinates async def test_multiple_contexts( - bidi_session, new_tab, url, set_geolocation_permission + bidi_session, new_tab, url, get_current_geolocation, set_geolocation_permission ): new_context = await bidi_session.browsing_context.create(type_hint="tab") test_url = url("/common/blank.html") @@ -74,12 +68,10 @@ async def test_multiple_contexts( ) await set_geolocation_permission(new_tab) - default_coordinates = await get_current_geolocation(bidi_session, new_tab) + default_coordinates = await get_current_geolocation(new_tab) assert default_coordinates != TEST_COORDINATES - assert ( - await get_current_geolocation(bidi_session, new_context) == default_coordinates - ) + assert await get_current_geolocation(new_context) == default_coordinates # Set geolocation override. await bidi_session.emulation.set_geolocation_override( @@ -91,8 +83,8 @@ async def test_multiple_contexts( ), ) - assert await get_current_geolocation(bidi_session, new_tab) == TEST_COORDINATES - assert await get_current_geolocation(bidi_session, new_context) == TEST_COORDINATES + assert await get_current_geolocation(new_tab) == TEST_COORDINATES + assert await get_current_geolocation(new_context) == TEST_COORDINATES # Reset geolocation override. await bidi_session.emulation.set_geolocation_override( @@ -101,7 +93,5 @@ async def test_multiple_contexts( # The new coordinates can be different from the initial ones if the position # was not available at the beginning. - assert await get_current_geolocation(bidi_session, new_tab) != TEST_COORDINATES - assert ( - await get_current_geolocation(bidi_session, new_context) != TEST_COORDINATES - ) + assert await get_current_geolocation(new_tab) != TEST_COORDINATES + assert await get_current_geolocation(new_context) != TEST_COORDINATES diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py index b23354e9e42..ea4fe643c3e 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py @@ -4,7 +4,6 @@ from webdriver.bidi.modules.emulation import CoordinatesOptions from webdriver.bidi.modules.script import ContextTarget from ... import remote_mapping_to_dict -from . import get_current_geolocation pytestmark = pytest.mark.asyncio @@ -22,7 +21,12 @@ pytestmark = pytest.mark.asyncio ], ) async def test_get_current_position( - bidi_session, new_tab, url, set_geolocation_permission, test_coordinates + bidi_session, + new_tab, + url, + get_current_geolocation, + set_geolocation_permission, + test_coordinates, ): test_url = url("/common/blank.html") await bidi_session.browsing_context.navigate( @@ -32,7 +36,7 @@ async def test_get_current_position( ) await set_geolocation_permission(new_tab) - default_coordinates = await get_current_geolocation(bidi_session, new_tab) + default_coordinates = await get_current_geolocation(new_tab) # Set default accuracy value. if "accuracy" not in test_coordinates: @@ -44,7 +48,7 @@ async def test_get_current_position( contexts=[new_tab["context"]], coordinates=test_coordinates ) - assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates + assert await get_current_geolocation(new_tab) == test_coordinates async def test_watch_position( @@ -132,7 +136,7 @@ async def test_watch_position( async def test_persists_on_reload( - bidi_session, url, new_tab, set_geolocation_permission + bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission ): test_url = url("/common/blank.html") await bidi_session.browsing_context.navigate( @@ -153,17 +157,17 @@ async def test_persists_on_reload( ), ) - assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates + assert await get_current_geolocation(new_tab) == test_coordinates await bidi_session.browsing_context.reload( context=new_tab["context"], wait="complete" ) - assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates + assert await get_current_geolocation(new_tab) == test_coordinates async def test_persists_on_navigation( - bidi_session, url, new_tab, set_geolocation_permission + bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission ): test_url = url("/common/blank.html") await bidi_session.browsing_context.navigate( @@ -184,7 +188,7 @@ async def test_persists_on_navigation( ), ) - assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates + assert await get_current_geolocation(new_tab) == test_coordinates await bidi_session.browsing_context.navigate( context=new_tab["context"], @@ -192,4 +196,24 @@ async def test_persists_on_navigation( wait="complete", ) - assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates + assert await get_current_geolocation(new_tab) == test_coordinates + + +async def test_reset_without_override( + bidi_session, new_tab, url, get_current_geolocation, set_geolocation_permission +): + test_url = url("/common/blank.html") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=test_url, + wait="complete", + ) + await set_geolocation_permission(new_tab) + + default_coordinates = await get_current_geolocation(new_tab) + + await bidi_session.emulation.set_geolocation_override( + contexts=[new_tab["context"]], coordinates=None + ) + + assert await get_current_geolocation(new_tab) == default_coordinates diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py new file mode 100644 index 00000000000..27c23dc7811 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py @@ -0,0 +1,123 @@ +import pytest + +from webdriver.bidi.modules.script import ContextTarget + +from ... import remote_mapping_to_dict + +pytestmark = pytest.mark.asyncio + +ERROR = {"type": "positionUnavailable"} +EXPECTED_ERROR = {"code": 2} + + +async def test_get_current_position(bidi_session, new_tab, url, + get_current_geolocation, set_geolocation_permission): + test_url = url("/common/blank.html") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=test_url, + wait="complete", + ) + await set_geolocation_permission(new_tab) + + await bidi_session.emulation.set_geolocation_override( + contexts=[new_tab["context"]], error=ERROR + ) + + assert await get_current_geolocation(new_tab) == EXPECTED_ERROR + + +async def test_watch_position( + bidi_session, + new_tab, + url, + subscribe_events, + wait_for_event, + wait_for_future_safe, + set_geolocation_permission, +): + await subscribe_events(["script.message"]) + + test_url = url("/common/blank.html") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=test_url, + wait="complete", + ) + await set_geolocation_permission(new_tab) + + await bidi_session.emulation.set_geolocation_override( + contexts=[new_tab["context"]], + error=ERROR + ) + + on_script_message = wait_for_event("script.message") + await bidi_session.browsing_context.activate(context=new_tab["context"]) + await bidi_session.script.call_function( + arguments=[{"type": "channel", "value": {"channel": "channel_name"}}], + function_declaration="""(channel) => + window.navigator.geolocation.watchPosition( + (result) => channel("unexpected result"), + (error) => channel({code: error.code}) + ) + """, + target=ContextTarget(new_tab["context"]), + await_promise=False, + ) + event_data = await wait_for_future_safe(on_script_message) + + assert remote_mapping_to_dict(event_data["data"]["value"]) == EXPECTED_ERROR + + +async def test_persists_on_reload( + bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission +): + test_url = url("/common/blank.html") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=test_url, + wait="complete", + ) + await set_geolocation_permission(new_tab) + + # Set geolocation override. + await bidi_session.emulation.set_geolocation_override( + contexts=[new_tab["context"]], + error=ERROR, + ) + + assert await get_current_geolocation(new_tab) == EXPECTED_ERROR + + await bidi_session.browsing_context.reload( + context=new_tab["context"], wait="complete" + ) + + assert await get_current_geolocation(new_tab) == EXPECTED_ERROR + + +async def test_persists_on_navigation( + bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission +): + test_url = url("/common/blank.html") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=test_url, + wait="complete", + ) + await set_geolocation_permission(new_tab) + + # Set geolocation override. + await bidi_session.emulation.set_geolocation_override( + contexts=[new_tab["context"]], + error=ERROR, + ) + + assert await get_current_geolocation(new_tab) == EXPECTED_ERROR + + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=url("/webdriver/tests/support/html/default.html"), + wait="complete", + ) + + assert await get_current_geolocation(new_tab) == EXPECTED_ERROR diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py index e804848e0be..2334d37517d 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py @@ -2,7 +2,6 @@ import pytest import webdriver.bidi.error as error from webdriver.bidi.modules.emulation import CoordinatesOptions -from webdriver.bidi.undefined import UNDEFINED pytestmark = pytest.mark.asyncio @@ -75,7 +74,7 @@ async def test_params_contexts_iframe(bidi_session, new_tab, get_test_page): ) -@pytest.mark.parametrize("value", [UNDEFINED, False, 42, "foo", []]) +@pytest.mark.parametrize("value", [False, 42, "foo", []]) async def test_params_coordinates_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): await bidi_session.emulation.set_geolocation_override( @@ -333,3 +332,60 @@ async def test_params_user_contexts_entry_invalid_value(bidi_session, value): }, user_contexts=[value], ) + + +async def test_params_coordinates_and_error(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates={ + "latitude": 10, + "longitude": 10, + }, + error={"type": "positionUnavailable"} + ) + + +async def test_params_no_coordinates_no_error(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + ) + + +@pytest.mark.parametrize("value", [False, 42, "foo", []]) +async def test_params_error_invalid_type(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + error=value, + ) + + +async def test_params_error_empty_object(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + error={}, + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_error_type_invalid_type(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + error={ + "type": value + }, + ) + + +async def test_params_error_type_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + error={ + "type": "unknownError", + }, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py index 008dee5698d..b3038bb5958 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py @@ -2,14 +2,19 @@ import pytest from webdriver.bidi.modules.emulation import CoordinatesOptions -from . import get_current_geolocation, TEST_COORDINATES +from . import TEST_COORDINATES pytestmark = pytest.mark.asyncio async def test_user_contexts( - bidi_session, url, create_user_context, new_tab, set_geolocation_permission + bidi_session, + url, + create_user_context, + new_tab, + get_current_geolocation, + set_geolocation_permission, ): user_context = await create_user_context() context_in_user_context_1 = await bidi_session.browsing_context.create( @@ -29,12 +34,10 @@ async def test_user_contexts( await set_geolocation_permission(new_tab) await set_geolocation_permission(new_tab, user_context) - default_coordinates = await get_current_geolocation( - bidi_session, context_in_user_context_1 - ) + default_coordinates = await get_current_geolocation(context_in_user_context_1) assert default_coordinates != TEST_COORDINATES - assert await get_current_geolocation(bidi_session, new_tab) == default_coordinates + assert await get_current_geolocation(new_tab) == default_coordinates # Set geolocation override. await bidi_session.emulation.set_geolocation_override( @@ -46,11 +49,8 @@ async def test_user_contexts( ), ) - assert ( - await get_current_geolocation(bidi_session, context_in_user_context_1) - == TEST_COORDINATES - ) - assert await get_current_geolocation(bidi_session, new_tab) == default_coordinates + assert await get_current_geolocation(context_in_user_context_1) == TEST_COORDINATES + assert await get_current_geolocation(new_tab) == default_coordinates # Create a new context in the user context. context_in_user_context_2 = await bidi_session.browsing_context.create( @@ -62,14 +62,16 @@ async def test_user_contexts( wait="complete", ) - assert ( - await get_current_geolocation(bidi_session, context_in_user_context_2) - == TEST_COORDINATES - ) + assert await get_current_geolocation(context_in_user_context_2) == TEST_COORDINATES async def test_set_to_default_user_context( - bidi_session, new_tab, create_user_context, url, set_geolocation_permission + bidi_session, + new_tab, + create_user_context, + url, + get_current_geolocation, + set_geolocation_permission, ): user_context = await create_user_context() context_in_user_context_1 = await bidi_session.browsing_context.create( @@ -89,7 +91,7 @@ async def test_set_to_default_user_context( await set_geolocation_permission(new_tab) await set_geolocation_permission(new_tab, user_context) - default_coordinates = await get_current_geolocation(bidi_session, new_tab) + default_coordinates = await get_current_geolocation(new_tab) assert default_coordinates != TEST_COORDINATES await bidi_session.emulation.set_geolocation_override( @@ -103,10 +105,9 @@ async def test_set_to_default_user_context( # Make sure that the geolocation changes are only applied to the context associated with default user context. assert ( - await get_current_geolocation(bidi_session, context_in_user_context_1) - == default_coordinates + await get_current_geolocation(context_in_user_context_1) == default_coordinates ) - assert await get_current_geolocation(bidi_session, new_tab) == TEST_COORDINATES + assert await get_current_geolocation(new_tab) == TEST_COORDINATES # Create a new context in the default context. context_in_default_context_2 = await bidi_session.browsing_context.create( @@ -120,8 +121,7 @@ async def test_set_to_default_user_context( ) assert ( - await get_current_geolocation(bidi_session, context_in_default_context_2) - == TEST_COORDINATES + await get_current_geolocation(context_in_default_context_2) == TEST_COORDINATES ) # Reset geolocation override. @@ -131,7 +131,11 @@ async def test_set_to_default_user_context( async def test_set_to_multiple_user_contexts( - bidi_session, create_user_context, url, set_geolocation_permission + bidi_session, + create_user_context, + url, + get_current_geolocation, + set_geolocation_permission, ): user_context_1 = await create_user_context() context_in_user_context_1 = await bidi_session.browsing_context.create( @@ -164,18 +168,17 @@ async def test_set_to_multiple_user_contexts( ), ) - assert ( - await get_current_geolocation(bidi_session, context_in_user_context_1) - == TEST_COORDINATES - ) - assert ( - await get_current_geolocation(bidi_session, context_in_user_context_2) - == TEST_COORDINATES - ) + assert await get_current_geolocation(context_in_user_context_1) == TEST_COORDINATES + assert await get_current_geolocation(context_in_user_context_2) == TEST_COORDINATES async def test_set_to_user_context_and_then_to_context( - bidi_session, create_user_context, url, new_tab, set_geolocation_permission + bidi_session, + create_user_context, + url, + new_tab, + get_current_geolocation, + set_geolocation_permission, ): user_context = await create_user_context() context_in_user_context_1 = await bidi_session.browsing_context.create( @@ -195,9 +198,7 @@ async def test_set_to_user_context_and_then_to_context( await set_geolocation_permission(new_tab) await set_geolocation_permission(new_tab, user_context) - default_coordinates = await get_current_geolocation( - bidi_session, context_in_user_context_1 - ) + default_coordinates = await get_current_geolocation(context_in_user_context_1) assert default_coordinates != TEST_COORDINATES @@ -222,7 +223,7 @@ async def test_set_to_user_context_and_then_to_context( ), ) assert ( - await get_current_geolocation(bidi_session, context_in_user_context_1) + await get_current_geolocation(context_in_user_context_1) == new_geolocation_coordinates ) @@ -232,7 +233,7 @@ async def test_set_to_user_context_and_then_to_context( # Make sure that after reload the geolocation is still updated. assert ( - await get_current_geolocation(bidi_session, context_in_user_context_1) + await get_current_geolocation(context_in_user_context_1) == new_geolocation_coordinates ) @@ -246,10 +247,7 @@ async def test_set_to_user_context_and_then_to_context( wait="complete", ) # Make sure that the geolocation override for the user context is applied. - assert ( - await get_current_geolocation(bidi_session, context_in_user_context_2) - == TEST_COORDINATES - ) + assert await get_current_geolocation(context_in_user_context_2) == TEST_COORDINATES await bidi_session.emulation.set_geolocation_override( contexts=[context_in_user_context_1["context"]], @@ -258,6 +256,5 @@ async def test_set_to_user_context_and_then_to_context( # Make sure that the geolocation override was reset. assert ( - await get_current_geolocation(bidi_session, context_in_user_context_1) - == default_coordinates + await get_current_geolocation(context_in_user_context_1) == default_coordinates ) diff --git a/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js b/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js index 9fe246c9395..45fecb2b40c 100644 --- a/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js @@ -1105,6 +1105,1011 @@ const conv2dTests = [ } } } + }, + + // float16 tests + { + 'name': + 'conv2d float16 4D both input and filter non-constant tensors default options', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.6123046875, 0.8857421875, 0.13671875, + 0.564453125, 0.896484375, 0.367919921875, + 0.68115234375, 0.047943115234375, 0.33349609375, + 0.1988525390625, 0.41162109375, 0.079345703125, + 0.42724609375, 0.53564453125, 0.59130859375, + 0.2841796875, 0.414794921875, 0.0269012451171875, + 0.362060546875, 0.99462890625, 0.07183837890625, + 0.1220703125, 0.84228515625, 0.453857421875, + 0.21533203125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375, + 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125, + 0.56884765625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [{'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 1.5322265625, 1.357421875, 1.3642578125, 1.0712890625, 1.1259765625, + 1.4716796875, 1.0791015625, 1.1552734375, 1.6572265625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D both input and filter constant tensors default options', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.6123046875, 0.8857421875, 0.13671875, + 0.564453125, 0.896484375, 0.367919921875, + 0.68115234375, 0.047943115234375, 0.33349609375, + 0.1988525390625, 0.41162109375, 0.079345703125, + 0.42724609375, 0.53564453125, 0.59130859375, + 0.2841796875, 0.414794921875, 0.0269012451171875, + 0.362060546875, 0.99462890625, 0.07183837890625, + 0.1220703125, 0.84228515625, 0.453857421875, + 0.21533203125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}, + 'constant': true + }, + 'conv2dFilter': { + 'data': [ + 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375, + 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125, + 0.56884765625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [{'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 1.5322265625, 1.357421875, 1.3642578125, 1.0712890625, 1.1259765625, + 1.4716796875, 1.0791015625, 1.1552734375, 1.6572265625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': 'conv2d float16 4D input and filter tensors default options', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.6123046875, 0.8857421875, 0.13671875, + 0.564453125, 0.896484375, 0.367919921875, + 0.68115234375, 0.047943115234375, 0.33349609375, + 0.1988525390625, 0.41162109375, 0.079345703125, + 0.42724609375, 0.53564453125, 0.59130859375, + 0.2841796875, 0.414794921875, 0.0269012451171875, + 0.362060546875, 0.99462890625, 0.07183837890625, + 0.1220703125, 0.84228515625, 0.453857421875, + 0.21533203125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375, + 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125, + 0.56884765625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [{'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 1.5322265625, 1.357421875, 1.3642578125, 1.0712890625, 1.1259765625, + 1.4716796875, 1.0791015625, 1.1552734375, 1.6572265625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': 'conv2d float16 4D input and filter tensors options.padding', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.6123046875, 0.8857421875, 0.13671875, + 0.564453125, 0.896484375, 0.367919921875, + 0.68115234375, 0.047943115234375, 0.33349609375, + 0.1988525390625, 0.41162109375, 0.079345703125, + 0.42724609375, 0.53564453125, 0.59130859375, + 0.2841796875, 0.414794921875, 0.0269012451171875, + 0.362060546875, 0.99462890625, 0.07183837890625, + 0.1220703125, 0.84228515625, 0.453857421875, + 0.21533203125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375, + 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125, + 0.56884765625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'padding': [1, 1, 1, 1]}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 1.0390625, 0.8828125, 1.06640625, 0.814453125, + 0.67724609375, 1.0537109375, 1.5322265625, 1.357421875, + 1.3642578125, 1.1962890625, 0.80810546875, 1.0712890625, + 1.1259765625, 1.4716796875, 0.96044921875, 0.5888671875, + 1.0791015625, 1.1552734375, 1.6572265625, 1.201171875, + 0.316650390625, 0.75439453125, 0.77294921875, 0.97314453125, + 0.90234375 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': 'conv2d float16 4D input and filter tensors options.strides', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.6123046875, 0.8857421875, 0.13671875, + 0.564453125, 0.896484375, 0.367919921875, + 0.68115234375, 0.047943115234375, 0.33349609375, + 0.1988525390625, 0.41162109375, 0.079345703125, + 0.42724609375, 0.53564453125, 0.59130859375, + 0.2841796875, 0.414794921875, 0.0269012451171875, + 0.362060546875, 0.99462890625, 0.07183837890625, + 0.1220703125, 0.84228515625, 0.453857421875, + 0.21533203125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375, + 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125, + 0.56884765625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'strides': [2, 2]}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [1.5322265625, 1.3642578125, 1.0791015625, 1.6572265625], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': 'conv2d float16 4D input and filter tensors options.dilations', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.6123046875, 0.8857421875, 0.13671875, + 0.564453125, 0.896484375, 0.367919921875, + 0.68115234375, 0.047943115234375, 0.33349609375, + 0.1988525390625, 0.41162109375, 0.079345703125, + 0.42724609375, 0.53564453125, 0.59130859375, + 0.2841796875, 0.414794921875, 0.0269012451171875, + 0.362060546875, 0.99462890625, 0.07183837890625, + 0.1220703125, 0.84228515625, 0.453857421875, + 0.21533203125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375, + 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125, + 0.56884765625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'dilations': [2, 2]}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [1.3603515625], + 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'depthwise conv2d float16 4D input and filter tensors options.groups= input_channels', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.8447265625, 0.943359375, 0.65576171875, 0.6982421875, + 0.99951171875, 0.2366943359375, 0.367431640625, 0.261962890625, + 0.62548828125, 0.84033203125, 0.37841796875, 0.454345703125, + 0.253173828125, 0.578125, 0.54150390625, 0.37841796875 + ], + 'descriptor': {shape: [1, 4, 2, 2], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.272216796875, 0.28125, 0.8544921875, 0.1796875, 0.7763671875, + 0.51416015625, 0.63720703125, 0.1280517578125, 0.83740234375, + 0.57275390625, 0.09857177734375, 0.5927734375, 0.58984375, + 0.96923828125, 0.2318115234375, 0.1480712890625 + ], + 'descriptor': {shape: [4, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'groups': 4}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [1.1806640625, 1.1650390625, 1.3115234375, 0.89111328125], + 'descriptor': {shape: [1, 4, 1, 1], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.inputLayout=\'nchw\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'inputLayout': 'nchw'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125, + 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375, + 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125, + 0.693359375, 1.037109375, 0.82861328125, 0.353271484375, + 1.1787109375, 0.8125, 0.81640625, 0.67822265625, + 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'inputLayout': 'nhwc'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.962890625, 0.8017578125, 0.7412109375, + 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375, + 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125, + 0.693359375, 1.1787109375, 0.9169921875, 1.037109375, + 0.8125, 1.0830078125, 0.82861328125, 0.81640625, + 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.filterLayout=\'oihw\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'filterLayout': 'oihw'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125, + 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375, + 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125, + 0.693359375, 1.037109375, 0.82861328125, 0.353271484375, + 1.1787109375, 0.8125, 0.81640625, 0.67822265625, + 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.filterLayout=\'hwio\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625, + 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375, + 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625 + ], + 'descriptor': {shape: [2, 2, 1, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'filterLayout': 'hwio'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125, + 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375, + 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125, + 0.693359375, 1.037109375, 0.82861328125, 0.353271484375, + 1.1787109375, 0.8125, 0.81640625, 0.67822265625, + 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.filterLayout=\'ohwi\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 2, 2, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'filterLayout': 'ohwi'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125, + 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375, + 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125, + 0.693359375, 1.037109375, 0.82861328125, 0.353271484375, + 1.1787109375, 0.8125, 0.81640625, 0.67822265625, + 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.filterLayout=\'ihwo\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625, + 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375, + 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625 + ], + 'descriptor': {shape: [1, 2, 2, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'filterLayout': 'ihwo'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125, + 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375, + 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125, + 0.693359375, 1.037109375, 0.82861328125, 0.353271484375, + 1.1787109375, 0.8125, 0.81640625, 0.67822265625, + 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'oihw\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'oihw'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.962890625, 0.8017578125, 0.7412109375, + 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375, + 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125, + 0.693359375, 1.1787109375, 0.9169921875, 1.037109375, + 0.8125, 1.0830078125, 0.82861328125, 0.81640625, + 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'hwio\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625, + 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375, + 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625 + ], + 'descriptor': {shape: [2, 2, 1, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'hwio'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.962890625, 0.8017578125, 0.7412109375, + 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375, + 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125, + 0.693359375, 1.1787109375, 0.9169921875, 1.037109375, + 0.8125, 1.0830078125, 0.82861328125, 0.81640625, + 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'ohwi\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 2, 2, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'ohwi'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.962890625, 0.8017578125, 0.7412109375, + 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375, + 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125, + 0.693359375, 1.1787109375, 0.9169921875, 1.037109375, + 0.8125, 1.0830078125, 0.82861328125, 0.81640625, + 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'ihwo\'', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625, + 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375, + 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625 + ], + 'descriptor': {shape: [1, 2, 2, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'ihwo'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.884765625, 0.962890625, 0.8017578125, 0.7412109375, + 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375, + 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125, + 0.693359375, 1.1787109375, 0.9169921875, 1.037109375, + 0.8125, 1.0830078125, 0.82861328125, 0.81640625, + 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': 'conv2d float16 4D input and filter tensors 1D options.bias', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375, + 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375, + 0.59375, 0.9912109375, 0.363037109375, 0.92919921875, + 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125, + 0.619140625, 0.392822265625 + ], + 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125, + 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375, + 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625 + ], + 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'}, + 'constant': true + }, + 'conv2dBias': { + 'data': [0.8134765625, 0.83935546875, 0.494384765625], + 'descriptor': {shape: [3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, + {'options': {'bias': 'conv2dBias'}} + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 1.6982421875, 1.5546875, 1.103515625, 1.21875, + 1.8017578125, 1.75, 1.322265625, 1.3271484375, + 1.2958984375, 1.1220703125, 0.94287109375, 1.3662109375, + 1.5068359375, 1.8505859375, 1.6416015625, 1.1669921875, + 2.017578125, 1.65234375, 1.6552734375, 1.517578125, + 1.4111328125, 1.5771484375, 1.7294921875, 1.4755859375 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': 'conv2d float16 4D input and filter tensors all options', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + 0.0997314453125, 0.53759765625, 0.3056640625, + 0.72216796875, 0.5068359375, 0.32373046875, + 0.8720703125, 0.2098388671875, 0.50537109375, + 0.0268707275390625, 0.5498046875, 0.0643310546875, + 0.156005859375, 0.11968994140625, 0.0361328125, + 0.414306640625, 0.24169921875, 0.67724609375, + 0.208740234375, 0.10980224609375, 0.7451171875, + 0.744140625, 0.787109375, 0.5888671875, + 0.11016845703125, 0.904296875, 0.11724853515625, + 0.85107421875, 0.424560546875, 0.0253753662109375, + 0.74755859375, 0.464599609375, 0.0304107666015625, + 0.42431640625, 0.384765625, 0.75830078125, + 0.990234375, 0.03717041015625, 0.014495849609375, + 0.826171875, 0.210693359375, 0.65673828125, + 0.258544921875, 0.480224609375, 0.97021484375, + 0.296875, 0.75244140625, 0.029632568359375, + 0.09027099609375, 0.7783203125 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.638671875, 0.07763671875, 0.129150390625, 0.456298828125, + 0.404296875, 0.59423828125, 0.1424560546875, 0.90380859375 + ], + 'descriptor': {shape: [2, 2, 1, 2], dataType: 'float16'}, + 'constant': true + }, + 'conv2dBias': { + 'data': [0.54248046875, 0.8408203125], + 'descriptor': {shape: [2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, { + 'options': { + 'padding': [1, 0, 0, 1], + 'strides': [1, 1], + 'dilations': [1, 1], + 'groups': 2, + 'inputLayout': 'nchw', + 'filterLayout': 'hwio', + 'bias': 'conv2dBias' + } + } + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + 0.6591796875, 0.80322265625, 0.76904296875, 0.90673828125, + 0.74755859375, 0.9306640625, 1.3076171875, 0.98779296875, + 1.27734375, 0.876953125, 1.09375, 1.1748046875, + 0.82177734375, 0.92236328125, 0.57421875, 1.103515625, + 0.7978515625, 0.9609375, 0.7236328125, 0.60986328125, + 1.2451171875, 1.197265625, 1.404296875, 0.94384765625, + 0.6572265625, 1.484375, 1.6796875, 1.73046875, + 1.1162109375, 0.85595703125, 1.8291015625, 1.5419921875, + 1.501953125, 1.4853515625, 1.0712890625, 2.45703125, + 1.5126953125, 1.072265625, 1.8046875, 1.361328125, + 2.0703125, 1.55859375, 1.4384765625, 2.380859375, + 1.4814453125, 2.013671875, 1.4833984375, 1.1796875, + 2.078125, 1.37890625 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'conv2d float16 4D input and filter tensors, both negative input tensor and options.bias', + 'graph': { + 'inputs': { + 'conv2dInput': { + 'data': [ + -0.80712890625, -0.8837890625, -0.77001953125, + -0.564453125, -0.397216796875, -0.1083984375, + -0.5517578125, -0.3955078125, -0.057586669921875, + -0.5146484375, -0.2132568359375, -0.95068359375, + -0.80419921875, -0.86474609375, -0.9609375, + -0.326416015625, -0.06884765625, -0.3203125, + -0.269287109375, -0.343017578125, -0.89892578125, + -0.90380859375, -0.63671875, -0.20068359375, + -0.787109375, -0.3466796875, -0.060028076171875, + -0.14990234375, -0.6484375, -0.8935546875, + -0.81494140625, -0.642578125, -0.032745361328125, + -0.6611328125, -0.58447265625, -0.09918212890625, + -0.166015625, -0.95068359375, -0.30517578125, + -0.62109375, -0.5400390625, -0.420166015625, + -0.188232421875, -0.35888671875, -0.71142578125, + -0.375, -0.7109375, -0.360595703125, + -0.546875, -0.032257080078125 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + }, + 'conv2dFilter': { + 'data': [ + 0.638671875, 0.07763671875, 0.129150390625, 0.456298828125, + 0.404296875, 0.59423828125, 0.1424560546875, 0.90380859375 + ], + 'descriptor': {shape: [2, 2, 1, 2], dataType: 'float16'}, + 'constant': true + }, + 'conv2dBias': { + 'data': [-0.375, -0.436279296875], + 'descriptor': {shape: [2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'conv2d', + 'arguments': [ + {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, { + 'options': { + 'padding': [1, 0, 0, 1], + 'groups': 2, + 'filterLayout': 'hwio', + 'bias': 'conv2dBias' + } + } + ], + 'outputs': 'conv2dOutput' + }], + 'expectedOutputs': { + 'conv2dOutput': { + 'data': [ + -0.8271484375, -0.841796875, -0.7666015625, -0.65966796875, + -0.53564453125, -1.126953125, -1.318359375, -1.107421875, + -0.88330078125, -0.8369140625, -0.7373046875, -1.27734375, + -1.0830078125, -0.96484375, -1.091796875, -0.77587890625, + -1.1591796875, -1.16796875, -1.208984375, -1.126953125, + -1.0849609375, -0.91650390625, -0.900390625, -0.78466796875, + -0.912109375, -0.69677734375, -0.607421875, -1.111328125, + -1.62890625, -0.96728515625, -1.5556640625, -0.9208984375, + -1.3603515625, -1.8154296875, -0.85302734375, -1.001953125, + -1.458984375, -1.5810546875, -1.4970703125, -0.8505859375, + -1.220703125, -1.302734375, -1.0859375, -1.599609375, + -0.9072265625, -1.53515625, -1.302734375, -1.3232421875, + -1.142578125, -0.5107421875 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js b/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js index 67ce5dbaf65..a17df911e44 100644 --- a/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js @@ -1578,6 +1578,1670 @@ const convTranspose2dTests = [ } } } + }, + + // float16 tests + { + 'name': + 'convTranspose2d float16 4D both input and filter non-constant tensors default options', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'} + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, {'filter': 'convTranspose2dFilter'} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.1934814453125, 0.544921875, 0.356689453125, 0.18017578125, + 0.27880859375, 0.155517578125, 0.005138397216796875, + 0.0777587890625, 0.0008726119995117188 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D both input and filter constant tensors default options', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}, + 'constant': true + }, + 'convTranspose2dFilter': { + 'data': [ + 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, {'filter': 'convTranspose2dFilter'} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.1934814453125, 0.544921875, 0.356689453125, 0.18017578125, + 0.27880859375, 0.155517578125, 0.005138397216796875, + 0.0777587890625, 0.0008726119995117188 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors default options', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, {'filter': 'convTranspose2dFilter'} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.1934814453125, 0.544921875, 0.356689453125, 0.18017578125, + 0.27880859375, 0.155517578125, 0.005138397216796875, + 0.0777587890625, 0.0008726119995117188 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.padding', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875 + ], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'padding': [1, 1, 1, 1]}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [0.27880859375], + 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 input tensors options.padding is the same upper padding', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], + 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, { + 'options': { + 'outputSizes': [6, 6], + 'groups': 1, + 'strides': [2, 2], + 'dilations': [1, 1], + 'padding': [0, 1, 0, 1], + 'filterLayout': 'ohwi', + 'inputLayout': 'nhwc' + } + } + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5, + 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5, + 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5, + 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5 + ], + 'descriptor': {shape: [1, 6, 6, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.strides', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, {'options': {'strides': [3, 2]}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.03515625, + 0.6484375, + 0.446044921875, + 1.015625, + 0.4091796875, + 0.415771484375, + 0.0469970703125, + 0.00666046142578125, + 0.65185546875, + 0.08453369140625, + 1.2529296875, + 0.07757568359375, + 0.64794921875, + 0.0184173583984375, + 0.04901123046875, + 0.274169921875, + 0.62158203125, + 0.72705078125, + 0.57080078125, + 0.470458984375, + 0.332763671875, + 0.2421875, + 0.5791015625, + 0.2425537109375, + 1.0615234375, + 0.59326171875, + 0.6025390625, + 0.32373046875, + 0.0458984375, + 0.70751953125, + 0.045989990234375, + 1.177734375, + 0.1124267578125, + 0.93896484375, + 0.126953125, + 0.337646484375, + 0.405517578125, + 0.338134765625, + 0.58984375, + 0.8271484375, + 0.68212890625, + 0.08245849609375, + 0.05999755859375, + 0.8564453125, + 0.5791015625, + 1.1357421875, + 0.39892578125, + 0.405029296875, + 0.08026123046875, + 0.01137542724609375, + 0.869140625, + 0.1097412109375, + 1.44921875, + 0.07562255859375, + 0.63134765625, + 0.031463623046875, + 0.0836181640625, + 0.372314453125, + 0.80712890625, + 0.87451171875, + 0.55615234375, + 0.45849609375, + 0.054931640625, + 0.003459930419921875, + 0.71533203125, + 0.043914794921875, + 0.86865234375, + 0.040283203125, + 0.210205078125, + 0.04205322265625, + 0.02203369140625, + 0.54150390625, + 0.279541015625, + 0.587890625, + 0.256591796875, + 0.09014892578125, + 0.0159149169921875, + 0.02374267578125, + 0.2100830078125, + 0.30126953125, + 0.288330078125, + 0.276611328125, + 0.0946044921875, + 0.37841796875, + 0.023834228515625, + 0.50341796875, + 0.0238800048828125, + 1.0517578125, + 0.058380126953125, + 0.3046875, + 0.28955078125, + 0.15185546875, + 0.343505859375, + 0.152099609375, + 0.76318359375, + 0.3720703125, + 0.130615234375, + 0.10968017578125, + 0.16357421875, + 0.1658935546875, + 0.1639404296875, + 0.32470703125, + 0.40087890625, + 0.1370849609375, + 0.09381103515625, + 0.0059051513671875, + 0.935546875, + 0.056976318359375, + 0.9208984375, + 0.03924560546875, + 0.204833984375, + 0.07177734375, + 0.037628173828125, + 0.70556640625, + 0.363037109375, + 0.6044921875, + 0.25, + 0.08782958984375, + 0.0271759033203125, + 0.04052734375, + 0.276123046875, + 0.39111328125, + 0.314453125, + 0.26953125, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 2, 9, 7], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.dilations', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.319580078125, 0.97607421875, 0.4130859375, 0.479736328125, + 0.767578125, 0.908203125, 0.62060546875, 0.658203125, 0.6552734375 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [0.68359375, 0.96435546875, 0.8271484375, 0.5771484375], + 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'dilations': [2, 2]}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.218505859375, 0.66748046875, 0.59033203125, 0.94140625, + 0.3984375, 0.327880859375, 0.52490234375, 1.0830078125, + 0.740234375, 0.8759765625, 0.6884765625, 1.2568359375, + 1.572265625, 1.1982421875, 0.8701171875, 0.396728515625, + 0.634765625, 1.0283203125, 0.443115234375, 0.52392578125, + 0.51318359375, 0.54443359375, 0.900390625, 0.3798828125, + 0.378173828125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.outputPadding', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'strides': [3, 2], 'outputPadding': [1, 1]}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.03515625, + 0.6484375, + 0.446044921875, + 1.015625, + 0.4091796875, + 0.415771484375, + 0, + 0.0469970703125, + 0.00666046142578125, + 0.65185546875, + 0.08453369140625, + 1.2529296875, + 0.07757568359375, + 0.64794921875, + 0, + 0.0184173583984375, + 0.04901123046875, + 0.274169921875, + 0.62158203125, + 0.72705078125, + 0.57080078125, + 0.470458984375, + 0, + 0.332763671875, + 0.2421875, + 0.5791015625, + 0.2425537109375, + 1.0615234375, + 0.59326171875, + 0.6025390625, + 0, + 0.32373046875, + 0.0458984375, + 0.70751953125, + 0.045989990234375, + 1.177734375, + 0.1124267578125, + 0.93896484375, + 0, + 0.126953125, + 0.337646484375, + 0.405517578125, + 0.338134765625, + 0.58984375, + 0.8271484375, + 0.68212890625, + 0, + 0.08245849609375, + 0.05999755859375, + 0.8564453125, + 0.5791015625, + 1.1357421875, + 0.39892578125, + 0.405029296875, + 0, + 0.08026123046875, + 0.01137542724609375, + 0.869140625, + 0.1097412109375, + 1.44921875, + 0.07562255859375, + 0.63134765625, + 0, + 0.031463623046875, + 0.0836181640625, + 0.372314453125, + 0.80712890625, + 0.87451171875, + 0.55615234375, + 0.45849609375, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.054931640625, + 0.003459930419921875, + 0.71533203125, + 0.043914794921875, + 0.86865234375, + 0.040283203125, + 0.210205078125, + 0, + 0.04205322265625, + 0.02203369140625, + 0.54150390625, + 0.279541015625, + 0.587890625, + 0.256591796875, + 0.09014892578125, + 0, + 0.0159149169921875, + 0.02374267578125, + 0.2100830078125, + 0.30126953125, + 0.288330078125, + 0.276611328125, + 0.0946044921875, + 0, + 0.37841796875, + 0.023834228515625, + 0.50341796875, + 0.0238800048828125, + 1.0517578125, + 0.058380126953125, + 0.3046875, + 0, + 0.28955078125, + 0.15185546875, + 0.343505859375, + 0.152099609375, + 0.76318359375, + 0.3720703125, + 0.130615234375, + 0, + 0.10968017578125, + 0.16357421875, + 0.1658935546875, + 0.1639404296875, + 0.32470703125, + 0.40087890625, + 0.1370849609375, + 0, + 0.09381103515625, + 0.0059051513671875, + 0.935546875, + 0.056976318359375, + 0.9208984375, + 0.03924560546875, + 0.204833984375, + 0, + 0.07177734375, + 0.037628173828125, + 0.70556640625, + 0.363037109375, + 0.6044921875, + 0.25, + 0.08782958984375, + 0, + 0.0271759033203125, + 0.04052734375, + 0.276123046875, + 0.39111328125, + 0.314453125, + 0.26953125, + 0.0921630859375, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + 'descriptor': {shape: [1, 2, 10, 8], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.outputSizes', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'strides': [3, 2], 'outputSizes': [10, 8]}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.03515625, + 0.6484375, + 0.446044921875, + 1.015625, + 0.4091796875, + 0.415771484375, + 0, + 0.0469970703125, + 0.00666046142578125, + 0.65185546875, + 0.08453369140625, + 1.2529296875, + 0.07757568359375, + 0.64794921875, + 0, + 0.0184173583984375, + 0.04901123046875, + 0.274169921875, + 0.62158203125, + 0.72705078125, + 0.57080078125, + 0.470458984375, + 0, + 0.332763671875, + 0.2421875, + 0.5791015625, + 0.2425537109375, + 1.0615234375, + 0.59326171875, + 0.6025390625, + 0, + 0.32373046875, + 0.0458984375, + 0.70751953125, + 0.045989990234375, + 1.177734375, + 0.1124267578125, + 0.93896484375, + 0, + 0.126953125, + 0.337646484375, + 0.405517578125, + 0.338134765625, + 0.58984375, + 0.8271484375, + 0.68212890625, + 0, + 0.08245849609375, + 0.05999755859375, + 0.8564453125, + 0.5791015625, + 1.1357421875, + 0.39892578125, + 0.405029296875, + 0, + 0.08026123046875, + 0.01137542724609375, + 0.869140625, + 0.1097412109375, + 1.44921875, + 0.07562255859375, + 0.63134765625, + 0, + 0.031463623046875, + 0.0836181640625, + 0.372314453125, + 0.80712890625, + 0.87451171875, + 0.55615234375, + 0.45849609375, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.054931640625, + 0.003459930419921875, + 0.71533203125, + 0.043914794921875, + 0.86865234375, + 0.040283203125, + 0.210205078125, + 0, + 0.04205322265625, + 0.02203369140625, + 0.54150390625, + 0.279541015625, + 0.587890625, + 0.256591796875, + 0.09014892578125, + 0, + 0.0159149169921875, + 0.02374267578125, + 0.2100830078125, + 0.30126953125, + 0.288330078125, + 0.276611328125, + 0.0946044921875, + 0, + 0.37841796875, + 0.023834228515625, + 0.50341796875, + 0.0238800048828125, + 1.0517578125, + 0.058380126953125, + 0.3046875, + 0, + 0.28955078125, + 0.15185546875, + 0.343505859375, + 0.152099609375, + 0.76318359375, + 0.3720703125, + 0.130615234375, + 0, + 0.10968017578125, + 0.16357421875, + 0.1658935546875, + 0.1639404296875, + 0.32470703125, + 0.40087890625, + 0.1370849609375, + 0, + 0.09381103515625, + 0.0059051513671875, + 0.935546875, + 0.056976318359375, + 0.9208984375, + 0.03924560546875, + 0.204833984375, + 0, + 0.07177734375, + 0.037628173828125, + 0.70556640625, + 0.363037109375, + 0.6044921875, + 0.25, + 0.08782958984375, + 0, + 0.0271759033203125, + 0.04052734375, + 0.276123046875, + 0.39111328125, + 0.314453125, + 0.26953125, + 0.0921630859375, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + 'descriptor': {shape: [1, 2, 10, 8], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nchw', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'inputLayout': 'nchw'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.64794921875, + 1.0439453125, + 0.8623046875, + 0.415771484375, + 0.379638671875, + 1.1787109375, + 1.9912109375, + 1.623046875, + 1.25, + 0.424560546875, + 1.5087890625, + 3.287109375, + 2.56640625, + 1.814453125, + 0.2071533203125, + 1.25, + 1.666015625, + 2.09765625, + 1.3134765625, + 0.031463623046875, + 0.386962890625, + 1.0849609375, + 1.2216796875, + 0.45849609375, + 0.054931640625, + 0.70068359375, + 0.70166015625, + 0.269287109375, + 0.210205078125, + 0.420654296875, + 0.95849609375, + 1.8525390625, + 0.53759765625, + 0.394775390625, + 0.3994140625, + 1.578125, + 2.12109375, + 1.1416015625, + 0.43017578125, + 0.181396484375, + 1.00390625, + 1.341796875, + 0.83447265625, + 0.2249755859375, + 0.0271759033203125, + 0.302734375, + 0.58544921875, + 0.4033203125, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'inputLayout': 'nhwc'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.054931640625, + 0.64794921875, + 0.70068359375, + 1.0439453125, + 0.70166015625, + 0.8623046875, + 0.269287109375, + 0.415771484375, + 0.210205078125, + 0.379638671875, + 0.420654296875, + 1.1787109375, + 0.95849609375, + 1.9912109375, + 1.8525390625, + 1.623046875, + 0.53759765625, + 1.25, + 0.394775390625, + 0.424560546875, + 0.3994140625, + 1.5087890625, + 1.578125, + 3.287109375, + 2.12109375, + 2.56640625, + 1.1416015625, + 1.814453125, + 0.43017578125, + 0.2071533203125, + 0.181396484375, + 1.25, + 1.00390625, + 1.666015625, + 1.341796875, + 2.09765625, + 0.83447265625, + 1.3134765625, + 0.2249755859375, + 0.031463623046875, + 0.0271759033203125, + 0.386962890625, + 0.302734375, + 1.0849609375, + 0.58544921875, + 1.2216796875, + 0.4033203125, + 0.45849609375, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.filterLayout=iohw', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'filterLayout': 'iohw'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.64794921875, + 1.0439453125, + 0.8623046875, + 0.415771484375, + 0.379638671875, + 1.1787109375, + 1.9912109375, + 1.623046875, + 1.25, + 0.424560546875, + 1.5087890625, + 3.287109375, + 2.56640625, + 1.814453125, + 0.2071533203125, + 1.25, + 1.666015625, + 2.09765625, + 1.3134765625, + 0.031463623046875, + 0.386962890625, + 1.0849609375, + 1.2216796875, + 0.45849609375, + 0.054931640625, + 0.70068359375, + 0.70166015625, + 0.269287109375, + 0.210205078125, + 0.420654296875, + 0.95849609375, + 1.8525390625, + 0.53759765625, + 0.394775390625, + 0.3994140625, + 1.578125, + 2.12109375, + 1.1416015625, + 0.43017578125, + 0.181396484375, + 1.00390625, + 1.341796875, + 0.83447265625, + 0.2249755859375, + 0.0271759033203125, + 0.302734375, + 0.58544921875, + 0.4033203125, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.filterLayout=hwoi', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.97998046875, 0.626953125, 0.06170654296875, + 0.63671875, 0.322021484375, 0.83837890625, 0.75, 0.11883544921875, + 0.39306640625, 0.9921875, 0.1380615234375, 0.32861328125, + 0.283935546875, 0.8740234375, 0.423583984375, 0.720703125, + 0.1448974609375 + ], + 'descriptor': {shape: [3, 3, 2, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'filterLayout': 'hwoi'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.64794921875, + 1.0439453125, + 0.8623046875, + 0.415771484375, + 0.379638671875, + 1.1787109375, + 1.9912109375, + 1.623046875, + 1.25, + 0.424560546875, + 1.5087890625, + 3.287109375, + 2.56640625, + 1.814453125, + 0.2071533203125, + 1.25, + 1.666015625, + 2.09765625, + 1.3134765625, + 0.031463623046875, + 0.386962890625, + 1.0849609375, + 1.2216796875, + 0.45849609375, + 0.054931640625, + 0.70068359375, + 0.70166015625, + 0.269287109375, + 0.210205078125, + 0.420654296875, + 0.95849609375, + 1.8525390625, + 0.53759765625, + 0.394775390625, + 0.3994140625, + 1.578125, + 2.12109375, + 1.1416015625, + 0.43017578125, + 0.181396484375, + 1.00390625, + 1.341796875, + 0.83447265625, + 0.2249755859375, + 0.0271759033203125, + 0.302734375, + 0.58544921875, + 0.4033203125, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.filterLayout=ohwi', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'filterLayout': 'ohwi'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.64794921875, + 1.0439453125, + 0.8623046875, + 0.415771484375, + 0.379638671875, + 1.1787109375, + 1.9912109375, + 1.623046875, + 1.25, + 0.424560546875, + 1.5087890625, + 3.287109375, + 2.56640625, + 1.814453125, + 0.2071533203125, + 1.25, + 1.666015625, + 2.09765625, + 1.3134765625, + 0.031463623046875, + 0.386962890625, + 1.0849609375, + 1.2216796875, + 0.45849609375, + 0.054931640625, + 0.70068359375, + 0.70166015625, + 0.269287109375, + 0.210205078125, + 0.420654296875, + 0.95849609375, + 1.8525390625, + 0.53759765625, + 0.394775390625, + 0.3994140625, + 1.578125, + 2.12109375, + 1.1416015625, + 0.43017578125, + 0.181396484375, + 1.00390625, + 1.341796875, + 0.83447265625, + 0.2249755859375, + 0.0271759033203125, + 0.302734375, + 0.58544921875, + 0.4033203125, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc options.filterLayout=iohw', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'iohw'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.054931640625, + 0.64794921875, + 0.70068359375, + 1.0439453125, + 0.70166015625, + 0.8623046875, + 0.269287109375, + 0.415771484375, + 0.210205078125, + 0.379638671875, + 0.420654296875, + 1.1787109375, + 0.95849609375, + 1.9912109375, + 1.8525390625, + 1.623046875, + 0.53759765625, + 1.25, + 0.394775390625, + 0.424560546875, + 0.3994140625, + 1.5087890625, + 1.578125, + 3.287109375, + 2.12109375, + 2.56640625, + 1.1416015625, + 1.814453125, + 0.43017578125, + 0.2071533203125, + 0.181396484375, + 1.25, + 1.00390625, + 1.666015625, + 1.341796875, + 2.09765625, + 0.83447265625, + 1.3134765625, + 0.2249755859375, + 0.031463623046875, + 0.0271759033203125, + 0.386962890625, + 0.302734375, + 1.0849609375, + 0.58544921875, + 1.2216796875, + 0.4033203125, + 0.45849609375, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc options.filterLayout=hwoi', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.97998046875, 0.626953125, 0.06170654296875, + 0.63671875, 0.322021484375, 0.83837890625, 0.75, 0.11883544921875, + 0.39306640625, 0.9921875, 0.1380615234375, 0.32861328125, + 0.283935546875, 0.8740234375, 0.423583984375, 0.720703125, + 0.1448974609375 + ], + 'descriptor': {shape: [3, 3, 2, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'hwoi'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.054931640625, + 0.64794921875, + 0.70068359375, + 1.0439453125, + 0.70166015625, + 0.8623046875, + 0.269287109375, + 0.415771484375, + 0.210205078125, + 0.379638671875, + 0.420654296875, + 1.1787109375, + 0.95849609375, + 1.9912109375, + 1.8525390625, + 1.623046875, + 0.53759765625, + 1.25, + 0.394775390625, + 0.424560546875, + 0.3994140625, + 1.5087890625, + 1.578125, + 3.287109375, + 2.12109375, + 2.56640625, + 1.1416015625, + 1.814453125, + 0.43017578125, + 0.2071533203125, + 0.181396484375, + 1.25, + 1.00390625, + 1.666015625, + 1.341796875, + 2.09765625, + 0.83447265625, + 1.3134765625, + 0.2249755859375, + 0.031463623046875, + 0.0271759033203125, + 0.386962890625, + 0.302734375, + 1.0849609375, + 0.58544921875, + 1.2216796875, + 0.4033203125, + 0.45849609375, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc options.filterLayout=ohwi', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875, + 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375, + 0.63623046875 + ], + 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.861328125, 0.626953125, 0.63671875, 0.83837890625, + 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375, + 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75, + 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375, + 0.1448974609375 + ], + 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'inputLayout': 'nhwc', 'filterLayout': 'ohwi'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.04827880859375, + 0.054931640625, + 0.64794921875, + 0.70068359375, + 1.0439453125, + 0.70166015625, + 0.8623046875, + 0.269287109375, + 0.415771484375, + 0.210205078125, + 0.379638671875, + 0.420654296875, + 1.1787109375, + 0.95849609375, + 1.9912109375, + 1.8525390625, + 1.623046875, + 0.53759765625, + 1.25, + 0.394775390625, + 0.424560546875, + 0.3994140625, + 1.5087890625, + 1.578125, + 3.287109375, + 2.12109375, + 2.56640625, + 1.1416015625, + 1.814453125, + 0.43017578125, + 0.2071533203125, + 0.181396484375, + 1.25, + 1.00390625, + 1.666015625, + 1.341796875, + 2.09765625, + 0.83447265625, + 1.3134765625, + 0.2249755859375, + 0.031463623046875, + 0.0271759033203125, + 0.386962890625, + 0.302734375, + 1.0849609375, + 0.58544921875, + 1.2216796875, + 0.4033203125, + 0.45849609375, + 0.0921630859375 + ], + 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'} + } + } + } + }, + { + 'name': 'convTranspose2d float16 4D input and filter tensors options.bias', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + 0.1109619140625, 0.8681640625, 0.734375, 0.4306640625, + 0.59814453125, 0.12322998046875, 0.1611328125, 0.08837890625, + 0.291015625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.6162109375, 0.26220703125, 0.794921875, 0.873046875, 0.8310546875, + 0.85498046875, 0.55517578125, 0.84033203125, 0.85302734375 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + }, + 'convTranspose2dBias': { + 'data': [0.45166015625], + 'descriptor': {shape: [1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'bias': 'convTranspose2dBias'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + 0.52001953125, 1.015625, 1.2197265625, 1.333984375, + 1.03515625, 0.81396484375, 1.783203125, 2.484375, + 2.3125, 1.177734375, 0.98876953125, 2.00390625, + 2.986328125, 2.5703125, 1.4150390625, 0.83154296875, + 1.3564453125, 1.85546875, 1.3828125, 0.8056640625, + 0.541015625, 0.63623046875, 0.82470703125, 0.771484375, + 0.69970703125 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + } + } + } + }, + { + 'name': + 'convTranspose2d float16 4D input and filter tensors, both negative input tensor and options.bias', + 'graph': { + 'inputs': { + 'convTranspose2dInput': { + 'data': [ + -0.10888671875, -0.298095703125, -0.390869140625, -0.5625, + -0.732421875, -0.84228515625, -0.305908203125, -0.9765625, + -0.01416015625 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'} + }, + 'convTranspose2dFilter': { + 'data': [ + 0.6162109375, 0.26220703125, 0.794921875, 0.873046875, 0.8310546875, + 0.85498046875, 0.55517578125, 0.84033203125, 0.85302734375 + ], + 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}, + 'constant': true + }, + 'convTranspose2dBias': { + 'data': [-0.845703125], + 'descriptor': {shape: [1], dataType: 'float16'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'convTranspose2d', + 'arguments': [ + {'input': 'convTranspose2dInput'}, + {'filter': 'convTranspose2dFilter'}, + {'options': {'bias': 'convTranspose2dBias'}} + ], + 'outputs': 'convTranspose2dOutput' + }], + 'expectedOutputs': { + 'convTranspose2dOutput': { + 'data': [ + -0.91259765625, -1.0576171875, -1.2509765625, -1.185546875, + -1.15625, -1.287109375, -1.794921875, -2.685546875, + -2.228515625, -1.849609375, -1.5859375, -2.890625, + -3.73828125, -3.53515625, -1.91015625, -1.4248046875, + -2.83203125, -3.494140625, -3.025390625, -1.576171875, + -1.015625, -1.64453125, -1.935546875, -1.6904296875, + -0.85791015625 + ], + 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/conformance_tests/log.https.any.js b/tests/wpt/tests/webnn/conformance_tests/log.https.any.js index 011beef53ac..8ed807b3401 100644 --- a/tests/wpt/tests/webnn/conformance_tests/log.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/log.https.any.js @@ -14,11 +14,8 @@ // MLOperand log(MLOperand input); -const getLogPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 1 / 1024, float16: 1 / 1024}; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return {metricType: 'ATOL', value: toleranceValueDict[expectedDataType]}; +const getLogPrecisionTolerance = () => { + return {metricType: 'ULP', value: 8}; }; const logTests = [ diff --git a/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js b/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js index f385aab1f15..8f81ff565d2 100644 --- a/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js @@ -34,46 +34,6 @@ // MLOperand maxPool2d( // MLOperand input, optional MLPool2dOptions options = {}); - -const getPoolingOperatorsPrecisionTolerance = (graphResources) => { - const args = graphResources.operators[0].arguments; - const inputShape = - graphResources.inputs[args[0][Object.keys(args[0])[0]]].descriptor.shape; - const options = - args.length === 2 ? {...args[1][Object.keys(args[1])[0]]} : {}; - let height; - let width; - - if (options.windowDimensions) { - height = options.windowDimensions[0]; - width = options.windowDimensions[1]; - } else { - // If not present, the window dimensions are assumed to be the height and - // width dimensions of the input shape - if (options.layout && options.layout === 'nhwc') { - height = inputShape[1]; - width = inputShape[2]; - } else { - // nhwc layout of input - height = inputShape[2]; - width = inputShape[3]; - } - } - - const tolerance = height * width + 2; - const toleranceDict = { - averagePool2d: {float32: tolerance, float16: tolerance}, - l2Pool2d: {float32: tolerance, float16: tolerance}, - maxPool2d: {float32: 0, float16: 0}, - }; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return { - metricType: 'ULP', - value: toleranceDict[graphResources.operators[0].name][expectedDataType] - }; -}; - const poolingOperatorsTests = [ // averagePool2d tests { @@ -2345,8 +2305,7 @@ const poolingOperatorsTests = [ if (navigator.ml) { poolingOperatorsTests.forEach((test) => { - webnn_conformance_test( - buildAndExecuteGraph, getPoolingOperatorsPrecisionTolerance, test); + webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test); }); } else { test(() => assert_implements(navigator.ml, 'missing navigator.ml')); diff --git a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js index 3b59c3bb49d..aa816cce7fb 100644 --- a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js @@ -535,12 +535,12 @@ const subgraphTests = [ {'input': 'transposeOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedtransposeOutput' + 'outputs': 'quantizedTransposeOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedtransposeOutput'}, + {'input': 'quantizedTransposeOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -619,12 +619,12 @@ const subgraphTests = [ {'input': 'tanhOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedtanhOutput' + 'outputs': 'quantizedTanhOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedtanhOutput'}, + {'input': 'quantizedTanhOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -702,12 +702,12 @@ const subgraphTests = [ {'input': 'sigmoidOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedsigmoidOutput' + 'outputs': 'quantizedSigmoidOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedsigmoidOutput'}, + {'input': 'quantizedSigmoidOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -788,12 +788,12 @@ const subgraphTests = [ {'input': 'leakyReluOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedleakyReluOutput' + 'outputs': 'quantizedLeakyReluOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedleakyReluOutput'}, + {'input': 'quantizedLeakyReluOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -924,6 +924,337 @@ const subgraphTests = [ } } }, + { + 'name': 'quantized elu', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 1.6811466217041016, 0.0479511022567749, 0.33355462551116943, + -0.1988269537687301, -0.0041167140007019, -0.0634240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'elu', + 'arguments': [{'input': 'dequantizedInput'}], + 'outputs': 'eluOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'eluOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedEluOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedEluOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.49803924560546875, 0.0470588281750679, 0.3333333432674408, + -0.18039216101169586, -0.003921568859368563, -0.062745101749897, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized averagePool2d', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + -2.549168109893799, -4.794857501983643, + 8.413617134094238, 6.108623504638672 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.343092918395996], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.343092918395996], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'averagePool2d', + 'arguments': [{'input': 'dequantizedInput'}, {'options': {'layout': 'nhwc'}}], + 'outputs': 'averagePool2dOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'averagePool2dOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedAveragePool2dOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedAveragePool2dOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 3.774022102355957, + ], + 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized maxPool2d', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + -2.549168109893799, -4.794857501983643, + 8.413617134094238, 6.108623504638672 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.343092918395996], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.343092918395996], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'maxPool2d', + 'arguments': [{'input': 'dequantizedInput'}, {'options': {'layout': 'nhwc'}}], + 'outputs': 'maxPool2dOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'maxPool2dOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedMaxPool2dOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedMaxPool2dOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 8.577322959899902, + ], + 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized reshape', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 1.6811466217041016, 0.0479511022567749, 0.33355462551116943, + -0.1988269537687301, -0.0041167140007019, -0.0634240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [16], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [16], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'reshape', + 'arguments': [{'input': 'dequantizedInput'}, {'newShape': [3, 2]}], + 'outputs': 'reshapeOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'reshapeOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedReshapeOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedReshapeOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.43529415130615234, 0.0470588281750679, + 0.3333333432674408, -0.20000001788139343, + -0.003921568859368563, -0.062745101749897, + ], + 'descriptor': {shape: [3, 2], dataType: 'float32'} + } + } + } + }, ]; if (navigator.ml) { diff --git a/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js index 4c3a330f850..004c03bdf13 100644 --- a/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js @@ -122,7 +122,8 @@ const signTests = [ 'graph': { 'inputs': { 'signInput': { - 'data': [-1, 0, 1, 2], + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + 'data': [-2147483648, 0, 2147483646, 2147483647], 'descriptor': {shape: [2, 2], dataType: 'int32'} } }, @@ -166,7 +167,8 @@ const signTests = [ 'graph': { 'inputs': { 'signInput': { - 'data': [-1, 0, 1, 2, -2, -1, 0, 1], + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + 'data': [-128, 0, 1, 2, -2, -1, 0, 127], 'descriptor': {shape: [1, 2, 2, 2], dataType: 'int8'} } }, diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js index 50d7911a918..9d5cfc70c10 100644 --- a/tests/wpt/tests/webnn/resources/utils.js +++ b/tests/wpt/tests/webnn/resources/utils.js @@ -59,6 +59,13 @@ const getPrecisionTolerance = (graphResources, intermediateOperands) => { op, graphResources, intermediateOperands) .value; break; + case 'averagePool2d': + case 'maxPool2d': + case 'l2Pool2d': + toleranceValue += getPoolingOperatorsPrecisionTolerance( + op, graphResources, intermediateOperands) + .value; + break; default: const operatorTolerance = operatorToleranceDict[op.name]?.[expectedDataType]; @@ -1006,6 +1013,53 @@ const getConv2dPrecisionTolerance = return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; }; +const getPoolingOperatorsPrecisionTolerance = + (op, graphResources, intermediateOperands) => { + const args = op.arguments; + const operatorName = op.name; + const {inputs} = graphResources; + let inputShape; + const inputIndex = args[0][Object.keys(args[0])[0]]; + if (inputs[inputIndex]) { + inputShape = inputs[inputIndex].descriptor.shape; + } else { + inputShape = intermediateOperands[inputIndex].shape; + } + const options = + args.length === 2 ? {...args[1][Object.keys(args[1])[0]]} : {}; + let height; + let width; + + if (options.windowDimensions) { + height = options.windowDimensions[0]; + width = options.windowDimensions[1]; + } else { + // If not present, the window dimensions are assumed to be the height + // and width dimensions of the input shape + if (options.layout && options.layout === 'nhwc') { + height = inputShape[1]; + width = inputShape[2]; + } else { + // nhwc layout of input + height = inputShape[2]; + width = inputShape[3]; + } + } + + const tolerance = height * width + 2; + const toleranceDict = { + averagePool2d: {float32: tolerance, float16: tolerance}, + l2Pool2d: {float32: tolerance, float16: tolerance}, + maxPool2d: {float32: 0, float16: 0}, + }; + const expectedDataType = + getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); + return { + metricType: 'ULP', + value: toleranceDict[operatorName][expectedDataType] + }; +}; + const getInstanceNormPrecisionTolerance = (graphResources) => { // according to // https://github.com/web-platform-tests/wpt/pull/43891#discussion_r1457026316 diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html index 9f07713d443..c93f8b3e541 100644 --- a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html +++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html @@ -37,7 +37,7 @@ promise_test(async t => { const original = result.value; let clone = structuredClone(original); assert_equals(original.timestamp, clone.timestamp); - assert_equals(original.getMetadata().absCaptureTime, clone.getMetadata().absCaptureTime); + assert_equals(original.getMetadata().captureTime, clone.getMetadata().captureTime); assert_array_equals(Array.from(original.data), Array.from(clone.data)); await writer2.write(clone); resolve(); diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html index 435e1c06783..df4577c5614 100644 --- a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html +++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html @@ -39,7 +39,7 @@ promise_test(async t => { assert_true(original.getMetadata().hasOwnProperty('receiveTime')); assert_true(original.getMetadata().receiveTime > 0); assert_equals(original.getMetadata().rtpTimestamp, newFrame.getMetadata().rtpTimestamp); - assert_equals(original.getMetadata().absCaptureTime, newFrame.getMetadata().absCaptureTime); + assert_equals(original.getMetadata().captureTime, newFrame.getMetadata().captureTime); assert_equals(original.getMetadata().receiveTime, newFrame.getMetadata().receiveTime); assert_array_equals(Array.from(original.data), Array.from(newFrame.data)); await writer2.write(newFrame); @@ -83,7 +83,7 @@ promise_test(async t => { assert_not_equals(original.getMetadata().rtpTimestamp, newFrame.getMetadata().rtpTimestamp); assert_equals(newMetadata.rtpTimestamp, newFrame.getMetadata().rtpTimestamp); assert_equals(original.getMetadata().receiveTime, newFrame.getMetadata().receiveTime); - assert_equals(original.getMetadata().absCaptureTime, newFrame.getMetadata().absCaptureTime); + assert_equals(original.getMetadata().captureTime, newFrame.getMetadata().captureTime); assert_array_equals(Array.from(original.data), Array.from(newFrame.data)); await writer2.write(newFrame); resolve(); diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js index 0bf820acde4..f3873e1de4b 100644 --- a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js +++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js @@ -30,7 +30,7 @@ function areMetadataEqual(metadata1, metadata2, type) { metadata1.payloadType == metadata2.payloadType && areArraysEqual( metadata1.contributingSources, metadata2.contributingSources) && - metadata1.absCaptureTime == metadata2.absCaptureTime && + metadata1.captureTime == metadata2.captureTime && metadata1.frameId === metadata2.frameId && areArraysEqual(metadata1.dependencies, metadata2.dependencies) && metadata1.spatialIndex === metadata2.spatialIndex && |