diff options
author | WPT Sync Bot <josh+wptsync@joshmatthews.net> | 2018-09-28 21:31:46 -0400 |
---|---|---|
committer | WPT Sync Bot <josh+wptsync@joshmatthews.net> | 2018-09-28 22:54:30 -0400 |
commit | 7ba3376dde9fea3d84d00464da17055af66f9b44 (patch) | |
tree | b5f43c5fdc3848ae8859da70c357fff8992ac8ea | |
parent | 97e3c5f3a9158080b6e9b8d654b4ea3c285c722f (diff) | |
download | servo-7ba3376dde9fea3d84d00464da17055af66f9b44.tar.gz servo-7ba3376dde9fea3d84d00464da17055af66f9b44.zip |
Update web-platform-tests to revision 2df7f9ff620cbdaa2928464892fb1dfb880fd6c6
74 files changed, 1984 insertions, 503 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini index 947e223fb28..3a3d15b8406 100644 --- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini @@ -14,6 +14,9 @@ [Revoke blob URL after creating Request, will fetch] expected: FAIL + [Revoke blob URL after calling fetch, fetch should succeed] + expected: FAIL + [url-with-fetch.any.html] [Untitled] @@ -34,3 +37,6 @@ [Revoke blob URL after creating Request, will fetch] expected: FAIL + [Revoke blob URL after calling fetch, fetch should succeed] + expected: FAIL + diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index d13132f9b13..1aa1a0ed3ca 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -109729,6 +109729,18 @@ {} ] ], + "css/css-contain/contain-layout-button-001.html": [ + [ + "/css/css-contain/contain-layout-button-001.html", + [ + [ + "/css/css-contain/reference/contain-layout-button-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-layout-cell-001.html": [ [ "/css/css-contain/contain-layout-cell-001.html", @@ -109753,6 +109765,30 @@ {} ] ], + "css/css-contain/contain-layout-flexbox-001.html": [ + [ + "/css/css-contain/contain-layout-flexbox-001.html", + [ + [ + "/css/css-contain/reference/contain-layout-flexbox-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-contain/contain-layout-grid-001.html": [ + [ + "/css/css-contain/contain-layout-grid-001.html", + [ + [ + "/css/css-contain/reference/contain-layout-grid-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-layout-ifc-022.html": [ [ "/css/css-contain/contain-layout-ifc-022.html", @@ -110341,6 +110377,18 @@ {} ] ], + "css/css-contain/contain-paint-clip-019.html": [ + [ + "/css/css-contain/contain-paint-clip-019.html", + [ + [ + "/css/css-contain/reference/contain-paint-clip-019-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-paint-ifc-011.html": [ [ "/css/css-contain/contain-paint-ifc-011.html", @@ -120897,6 +120945,18 @@ {} ] ], + "css/css-grid/alignment/grid-gutters-013.html": [ + [ + "/css/css-grid/alignment/grid-gutters-013.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html": [ [ "/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html", @@ -172081,6 +172141,18 @@ {} ] ], + "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html": [ + [ + "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html", + [ + [ + "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html": [ [ "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html", @@ -248225,11 +248297,26 @@ {} ] ], + "css/css-contain/reference/contain-layout-button-001-ref.html": [ + [ + {} + ] + ], "css/css-contain/reference/contain-layout-cell-001-ref.html": [ [ {} ] ], + "css/css-contain/reference/contain-layout-flexbox-001-ref.html": [ + [ + {} + ] + ], + "css/css-contain/reference/contain-layout-grid-001-ref.html": [ + [ + {} + ] + ], "css/css-contain/reference/contain-layout-ifc-022-ref.html": [ [ {} @@ -248290,6 +248377,11 @@ {} ] ], + "css/css-contain/reference/contain-paint-clip-019-ref.html": [ + [ + {} + ] + ], "css/css-contain/reference/contain-paint-ifc-011-ref.html": [ [ {} @@ -275025,6 +275117,11 @@ {} ] ], + "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html": [ + [ + {} + ] + ], "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001-ref.html": [ [ {} @@ -314165,6 +314262,11 @@ {} ] ], + "webrtc/RTCIceTransport-extension-helper.js": [ + [ + {} + ] + ], "webrtc/RTCPeerConnection-helper.js": [ [ {} @@ -332830,6 +332932,12 @@ {} ] ], + "css/css-flexbox/flex-minimum-height-flex-items-009.html": [ + [ + "/css/css-flexbox/flex-minimum-height-flex-items-009.html", + {} + ] + ], "css/css-flexbox/flexbox_first-letter.html": [ [ "/css/css-flexbox/flexbox_first-letter.html", @@ -335436,9 +335544,9 @@ {} ] ], - "css/css-masking/inheritance.html": [ + "css/css-masking/inheritance.sub.html": [ [ - "/css/css-masking/inheritance.html", + "/css/css-masking/inheritance.sub.html", {} ] ], @@ -371266,6 +371374,12 @@ {} ] ], + "intersection-observer/target-in-different-window.html": [ + [ + "/intersection-observer/target-in-different-window.html", + {} + ] + ], "intersection-observer/text-target.html": [ [ "/intersection-observer/text-target.html", @@ -396946,6 +397060,12 @@ { "timeout": "long" } + ], + [ + "/service-workers/service-worker/navigation-redirect.https.html?client", + { + "timeout": "long" + } ] ], "service-workers/service-worker/navigation-timing.https.html": [ @@ -397986,6 +398106,18 @@ {} ] ], + "speech-api/SpeechSynthesisErrorEvent-constructor.html": [ + [ + "/speech-api/SpeechSynthesisErrorEvent-constructor.html", + {} + ] + ], + "speech-api/SpeechSynthesisEvent-constructor.html": [ + [ + "/speech-api/SpeechSynthesisEvent-constructor.html", + {} + ] + ], "speech-api/SpeechSynthesisUtterance-basics.https.html": [ [ "/speech-api/SpeechSynthesisUtterance-basics.https.html", @@ -437900,7 +438032,7 @@ "support" ], "README.md": [ - "684f4617f689d0611b18ce1b338bfdeb8d5886b7", + "6f9436bc3e4261e2f6813253e1709cbb60763ca2", "support" ], "WebCryptoAPI/META.yml": [ @@ -439248,11 +439380,11 @@ "manual" ], "accname/name_test_case_659-manual.html": [ - "1332c30c4929430bdc7839bb543c1078fa67047a", + "abf5e85e16ba7bc28d157127db0607a9a6023de2", "manual" ], "accname/name_test_case_660-manual.html": [ - "66b36635d940fcf5e34fdc89ecd193ad09c1a7ba", + "0c18218707b0320f114aeafe3e2b5b601c692620", "manual" ], "accname/name_test_case_661-manual.html": [ @@ -441732,7 +441864,7 @@ "testharness" ], "background-fetch/fetch.https.window.js": [ - "98ecdfa3933c40b909793100b4b9f9cccb35cb86", + "b8b1ff0983cdce1c799d03c7f1856548fa649b17", "testharness" ], "background-fetch/get-ids.https.window.js": [ @@ -441748,7 +441880,7 @@ "testharness" ], "background-fetch/mixed-content-and-allowed-schemes.https.window.js": [ - "9f24f13581819ef444a89cb7549de900f5b98ef6", + "05b32501228fbb765a5c782102660ebd476f0168", "testharness" ], "background-fetch/port-blocking.https.window.js": [ @@ -441772,7 +441904,7 @@ "support" ], "background-fetch/service_workers/sw.js": [ - "43d778c08914da6c8ff75acb819676895adbc180", + "af4655dbad4ef6ad6b17d79bb2645aee98ce1102", "support" ], "background-fetch/update-ui.https.window.js": [ @@ -530931,6 +531063,10 @@ "fadb3c41c5363742eb88bdf803eac7cdbf5e7a8f", "reftest" ], + "css/css-contain/contain-layout-button-001.html": [ + "e8beef7c0edfa20258b9600376d3ab245ca63f32", + "reftest" + ], "css/css-contain/contain-layout-cell-001.html": [ "fa1af0eee6848a34c61f47861c22d9efb56ab059", "reftest" @@ -530939,6 +531075,14 @@ "331a0e6519b0af23ba91355584f0c37dfcf6a88e", "reftest" ], + "css/css-contain/contain-layout-flexbox-001.html": [ + "2b206edb57f46f3baa9dcfbcc24591b852cf8697", + "reftest" + ], + "css/css-contain/contain-layout-grid-001.html": [ + "a6bcc4dbc2adda58602281eac5c2c0b2c0a9de61", + "reftest" + ], "css/css-contain/contain-layout-ifc-022.html": [ "3e4f3dafbf213c18a09cfd2a7512dd485c13f839", "reftest" @@ -531135,6 +531279,10 @@ "17bcccdeff538ea869a51d703acb80e9acc4b0ca", "reftest" ], + "css/css-contain/contain-paint-clip-019.html": [ + "bd761b8a523bd9fa05dd88f57b6b1317b5c4c40b", + "reftest" + ], "css/css-contain/contain-paint-ifc-011.html": [ "b8a03936cbcc3ddcc88dc1237fab0af56f4bd72b", "reftest" @@ -531272,7 +531420,7 @@ "reftest" ], "css/css-contain/contain-size-button-001.html": [ - "1e4965e9daf380aec19cf43902c409ad6b457370", + "4b2ecd7b76e421ea5dfffce6654d722142b5823c", "reftest" ], "css/css-contain/contain-size-fieldset-001.html": [ @@ -531280,11 +531428,11 @@ "reftest" ], "css/css-contain/contain-size-flexbox-001.html": [ - "31e82f5d24c4aa673291a2ce25c660cf10977e28", + "16ba62eda041abe11424f63c65d6dfd46aa82570", "reftest" ], "css/css-contain/contain-size-grid-001.html": [ - "f67f0e118e00b3426986b39226310c59b14a3755", + "4510c1e55368aeea38a79ba66059acd4d7660ddb", "reftest" ], "css/css-contain/contain-size-grid-002.html": [ @@ -531399,10 +531547,22 @@ "c68bee1d0aa4f9201fb6e48cc25199f373128ca8", "support" ], + "css/css-contain/reference/contain-layout-button-001-ref.html": [ + "11a784b213cbc05d10cdcc199a11055fe0c0fdfa", + "support" + ], "css/css-contain/reference/contain-layout-cell-001-ref.html": [ "9ff7f45e39ca741b4b334c1c9b3d1d5ee6759b73", "support" ], + "css/css-contain/reference/contain-layout-flexbox-001-ref.html": [ + "832e4c72c2cef426f2d759e77435290fff2f0d55", + "support" + ], + "css/css-contain/reference/contain-layout-grid-001-ref.html": [ + "b5ff8e0e0dad0cd586e7b899d8a7905b26063233", + "support" + ], "css/css-contain/reference/contain-layout-ifc-022-ref.html": [ "682af7d4f44b22f987c069dbbee370520612bc10", "support" @@ -531451,6 +531611,10 @@ "781a6d2f2f4e8810690ab321f7ff7bf3539044f3", "support" ], + "css/css-contain/reference/contain-paint-clip-019-ref.html": [ + "2a529c12c48e630cc7df146fe3e685afd85a42f0", + "support" + ], "css/css-contain/reference/contain-paint-ifc-011-ref.html": [ "229c8c2d74ba3f2b5cede6824091575835807092", "support" @@ -531520,7 +531684,7 @@ "support" ], "css/css-contain/reference/contain-size-button-001-ref.html": [ - "1cbaaccd1a0751c5dadf913e1fc31d130ff95259", + "eff64aa8e2ef0c7fbce03858e90ef0d9e2a7ee6b", "support" ], "css/css-contain/reference/contain-size-fieldset-001-ref.html": [ @@ -531528,11 +531692,11 @@ "support" ], "css/css-contain/reference/contain-size-flexbox-001-ref.html": [ - "85628b59c48f7931e7d3e5a498da60cc264dc363", + "70f408643007d8338f401ef947f7bb24f1eaedc9", "support" ], "css/css-contain/reference/contain-size-grid-001-ref.html": [ - "d71636bd5f4a344352249b50563eb03d249484c6", + "cf4f8076650928dfd0cefc18665ef1e8ab52d7b6", "support" ], "css/css-contain/reference/contain-size-monolithic-001-ref.html": [ @@ -534427,6 +534591,10 @@ "ead7a424b374fddb247046d2a36a37a11669baae", "reftest" ], + "css/css-flexbox/flex-minimum-height-flex-items-009.html": [ + "718386af02069fa1a3fff0ee5aaa10415ef4b23a", + "testharness" + ], "css/css-flexbox/flex-minimum-width-flex-items-001.xht": [ "b8e2866edaa46af46900c287238894cd8ddef24c", "reftest" @@ -545547,6 +545715,10 @@ "1e56e708dfb45f1dd1e48d7779818d244eb25f3d", "reftest" ], + "css/css-grid/alignment/grid-gutters-013.html": [ + "e72814725d2cb90fba6f3bd4d1e8370f37382fbb", + "reftest" + ], "css/css-grid/alignment/grid-row-axis-alignment-positioned-items-001.html": [ "e350f972357cfdc9559c5a86116e538d87c9ce61", "testharness" @@ -548911,8 +549083,8 @@ "c415eaaa67a2bc9a4b621700049eb0c0b60ec0a3", "testharness" ], - "css/css-masking/inheritance.html": [ - "34f75859ee88833ed39a56bb6c443cd60586e1b5", + "css/css-masking/inheritance.sub.html": [ + "95424204d5094bb1cbcd49e32f5e38c28d86d76f", "testharness" ], "css/css-masking/mask-image/mask-image-url-image-hash.html": [ @@ -585035,6 +585207,14 @@ "cf54aabe9936b3963e7343d566d957633fc26c69", "reftest" ], + "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html": [ + "5e5561cadf2ddbd6dfd2c7b4819f146f61be006b", + "support" + ], + "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html": [ + "d64c4bdf28ecb783af4f342d515dcf63134602c6", + "reftest" + ], "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001-ref.html": [ "b5377110201d1de21a966c8a7f1a7d60dfff4126", "support" @@ -585876,7 +586056,7 @@ "reftest" ], "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [ - "df226fa8df7801a7bbfe8807e512e678d13bf0fa", + "5bb3b650139c3293cb7d782d47af7dbff9bc3ad6", "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/support/Ahem.ttf": [ @@ -619084,7 +619264,7 @@ "support" ], "interfaces/screen-capture.idl": [ - "668f4588ba2a24a909dc7f44b24628c56631296d", + "b79d09d19dced9e3b77e791e2d543fc9f44742ee", "support" ], "interfaces/screen-orientation.idl": [ @@ -619116,7 +619296,7 @@ "support" ], "interfaces/speech-api.idl": [ - "8e998df5bc3fa41d728b5c79d592746701bc3754", + "0b5c866b35c28d8e10261205fb6cbaa6962e480a", "support" ], "interfaces/storage.idl": [ @@ -619236,7 +619416,7 @@ "support" ], "intersection-observer/bounding-box.html": [ - "69052b11ce6c40c6a56fe2b723c70c49ddc36dd9", + "50f33f0443bb70e64bec2e2fcc930fa2b4118ed6", "testharness" ], "intersection-observer/client-rect.html": [ @@ -619351,6 +619531,10 @@ "d049c70919e129fa6c335e8601f6ce6a6cd73a9d", "testharness" ], + "intersection-observer/target-in-different-window.html": [ + "cf8fe4e6ec9e6b33df2d61b6219a1b2d4bb74c79", + "testharness" + ], "intersection-observer/text-target.html": [ "13dc3abea2d8b0438ac76e9da974718778bcbb12", "testharness" @@ -619528,7 +619712,7 @@ "support" ], "lint.whitelist": [ - "46c2550e72884c3f060b0fc7355f44562d2803d4", + "9f5693fcc2b9ad790ca7d502d998a1b71701b717", "support" ], "longtask-timing/META.yml": [ @@ -644152,7 +644336,7 @@ "testharness" ], "service-workers/service-worker/navigation-redirect.https.html": [ - "b6281b9e6c30540aae97c31454e4a2a5ac2c62b9", + "6f03fd8f2f0db54f4895d284a2ced78723d9965c", "testharness" ], "service-workers/service-worker/navigation-timing.https.html": [ @@ -644948,7 +645132,7 @@ "support" ], "service-workers/service-worker/resources/navigation-redirect-other-origin.html": [ - "0d2825f31093f8959b45712eff247a0a21c7c8cd", + "d82571d1a3c71e23274009d147e410b10fe8d245", "support" ], "service-workers/service-worker/resources/navigation-redirect-out-scope.py": [ @@ -645100,7 +645284,7 @@ "support" ], "service-workers/service-worker/resources/redirect-worker.js": [ - "bf0a3a8d9e0486f896e635e478dcd623dda987c0", + "0c5bc3bd9aa5bff83df74ce5e0a8a244f21a85a7", "support" ], "service-workers/service-worker/resources/redirect.py": [ @@ -646280,7 +646464,15 @@ "testharness" ], "speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [ - "acf0d7d575b5dc7f9b348d82b056aa90089b6639", + "1b86552a1cbd8dabaf8b50f928823e743e4b46cb", + "testharness" + ], + "speech-api/SpeechSynthesisErrorEvent-constructor.html": [ + "61e179cca47b70d001e5e081e87166ec1363714a", + "testharness" + ], + "speech-api/SpeechSynthesisEvent-constructor.html": [ + "47a37d25d9723cadcb9da2d778481fd9561c37aa", "testharness" ], "speech-api/SpeechSynthesisUtterance-basics.https.html": [ @@ -651324,7 +651516,7 @@ "support" ], "tools/manifest/sourcefile.py": [ - "9be0d8966ece1bf56fd93e3fd606ac08c4bb1a76", + "1f08088eb4666158b5fbece0c2727a9f41b7d907", "support" ], "tools/manifest/tests/__init__.py": [ @@ -651344,7 +651536,7 @@ "support" ], "tools/manifest/tests/test_sourcefile.py": [ - "57a175cae913a273c6ba4ebbcc13dd47571e4970", + "ad59055de73f5f8801c53095fe16faececf4fc97", "support" ], "tools/manifest/update.py": [ @@ -656548,7 +656740,7 @@ "support" ], "tools/wptserve/tests/functional/base.py": [ - "741ab0bcb745753f72f2e26e37258f877caae513", + "e49c8287c5985aa5ebbed04ef3070bc785831733", "support" ], "tools/wptserve/tests/functional/docroot/document.txt": [ @@ -656668,7 +656860,7 @@ "support" ], "tools/wptserve/tests/functional/test_handlers.py": [ - "759a096b79957079429ae387186d6e7891651ecf", + "7ac410abfee2d0a700f9f39bc466cedffbb4780f", "support" ], "tools/wptserve/tests/functional/test_input_file.py": [ @@ -656676,11 +656868,11 @@ "support" ], "tools/wptserve/tests/functional/test_pipes.py": [ - "7739af5e26e17c7b7930a612816151772f3f5cc0", + "83b2c621641ca17b670eb5a8c08b38f8d37cc2a7", "support" ], "tools/wptserve/tests/functional/test_request.py": [ - "983539260a5215cab779e76b256f678894f654f3", + "096c0535b9ae79a9782be097545a51e526a29106", "support" ], "tools/wptserve/tests/functional/test_response.py": [ @@ -656724,7 +656916,7 @@ "support" ], "tools/wptserve/wptserve/pipes.py": [ - "33a43e1f06b9835a2acf9be78b38a765cc9fdb60", + "ad96f591a3a8c8b7e8d13a4ad95a1aae500f66da", "support" ], "tools/wptserve/wptserve/ranges.py": [ @@ -656732,11 +656924,11 @@ "support" ], "tools/wptserve/wptserve/request.py": [ - "233ff151c28e482f1087a853e385ab2f9c819276", + "cb575ccdba4514a456c0cbf73904bb63c12fd7ff", "support" ], "tools/wptserve/wptserve/response.py": [ - "483265bf084666069c21dd91310a005d2162268b", + "44299cc994ef43ebe72053e1444f5af7cd7f9598", "support" ], "tools/wptserve/wptserve/router.py": [ @@ -661408,7 +661600,7 @@ "support" ], "webdriver/tests/perform_actions/key.py": [ - "2b3414c5ebfd62955860de540b4614471efbe8ad", + "cbfb5bcef43d52bb34faa515e7c24182e808cfa9", "wdspec" ], "webdriver/tests/perform_actions/key_events.py": [ @@ -661416,7 +661608,7 @@ "wdspec" ], "webdriver/tests/perform_actions/key_modifiers.py": [ - "55dc9280c6267172a96a4f3c02f2503aa0c22500", + "e8ea30dd3d7d0be7ceddab672554fd871457bf7a", "wdspec" ], "webdriver/tests/perform_actions/key_shortcuts.py": [ @@ -662275,8 +662467,12 @@ "974ed0c76cfafb788e865c0b1c71fa19007c55b9", "testharness" ], + "webrtc/RTCIceTransport-extension-helper.js": [ + "659ec59b8df2847e7e2a3c513d3d6fd01027f16d", + "support" + ], "webrtc/RTCIceTransport-extension.https.html": [ - "9c6cec7e1e4994ee58f6822d77048eca8e8af569", + "5adee9fbe61eb9a8f7235b7faa6670eaea45cc89", "testharness" ], "webrtc/RTCIceTransport.html": [ @@ -662444,15 +662640,15 @@ "testharness" ], "webrtc/RTCQuicStream.https.html": [ - "1e08016d75af57307d922b9876605e8152f92768", + "33025451b252e1bdf2491fa118e072f4b8711d12", "testharness" ], "webrtc/RTCQuicTransport-helper.js": [ - "50d9e6666a2d3bf8b3128f94b3c902579fabc0f5", + "3ea19d7a78e4a3788e97d0fa537d51d4b9e6b4fc", "support" ], "webrtc/RTCQuicTransport.https.html": [ - "703f424a63851996b3708fe66caff63c7e0f5502", + "ec79bc228ad21de3a9ce3c2ee812a7d50e57571b", "testharness" ], "webrtc/RTCRtpCapabilities-helper.js": [ diff --git a/tests/wpt/metadata/css/css-flexbox/flex-minimum-height-flex-items-009.html.ini b/tests/wpt/metadata/css/css-flexbox/flex-minimum-height-flex-items-009.html.ini new file mode 100644 index 00000000000..c13515644a2 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/flex-minimum-height-flex-items-009.html.ini @@ -0,0 +1,7 @@ +[flex-minimum-height-flex-items-009.html] + [.container 2] + expected: FAIL + + [.container 1] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-cpm-normal.html.ini b/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-cpm-normal.html.ini index 7cf9eb15453..b480ed7298a 100644 --- a/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-cpm-normal.html.ini +++ b/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-cpm-normal.html.ini @@ -1,16 +1,4 @@ [css-text-line-break-ja-cpm-normal.html] - [203C DOUBLE EXCLAMATION MARK may NOT appear at line start if ja and normal] - expected: FAIL - - [2047 DOUBLE QUESTION MARK may NOT appear at line start if ja and normal] - expected: FAIL - - [2048 QUESTION EXCLAMATION MARK may NOT appear at line start if ja and normal] - expected: FAIL - - [2049 EXCLAMATION QUESTION MARK may NOT appear at line start if ja and normal] - expected: FAIL - [30FB KATAKANA MIDDLE DOT may NOT appear at line start if ja and normal] expected: if os == "linux": FAIL diff --git a/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-hyphens-strict.html.ini b/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-hyphens-strict.html.ini index d769457c57c..166c50e4e64 100644 --- a/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-hyphens-strict.html.ini +++ b/tests/wpt/metadata/css/css-text/i18n/ja/css-text-line-break-ja-hyphens-strict.html.ini @@ -3,3 +3,12 @@ expected: if os == "linux": FAIL + [2010 HYPHEN may NOT appear at line start if ja and strict] + expected: FAIL + + [30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN may NOT appear at line start if ja and strict] + expected: FAIL + + [2013 EN DASH may NOT appear at line start if ja and strict] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html.ini b/tests/wpt/metadata/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html.ini index 169f8bdf10a..27e695ead3c 100644 --- a/tests/wpt/metadata/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html.ini +++ b/tests/wpt/metadata/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html.ini @@ -1,16 +1,4 @@ [css-text-line-break-zh-cpm-normal.html] - [203C DOUBLE EXCLAMATION MARK may NOT appear at line start if zh and normal] - expected: FAIL - - [2047 DOUBLE QUESTION MARK may NOT appear at line start if zh and normal] - expected: FAIL - - [2048 QUESTION EXCLAMATION MARK may NOT appear at line start if zh and normal] - expected: FAIL - - [2049 EXCLAMATION QUESTION MARK may NOT appear at line start if zh and normal] - expected: FAIL - [30FB KATAKANA MIDDLE DOT may NOT appear at line start if zh and normal] expected: if os == "linux": FAIL diff --git a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini index a2e15ddcf05..b7a0697c20d 100644 --- a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini +++ b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini @@ -1,7 +1,6 @@ [properties-value-inherit-002.html] - expected: TIMEOUT [outline-width length(px) / values] - expected: TIMEOUT + expected: FAIL [border-left-width length(em) / values] expected: FAIL @@ -25,13 +24,13 @@ expected: FAIL [opacity number[0,1\](zero-to-one) / values] - expected: TIMEOUT + expected: FAIL [line-height number(integer) / values] expected: FAIL [outline-offset length(px) / values] - expected: TIMEOUT + expected: FAIL [font-size length(pt) / values] expected: FAIL @@ -40,7 +39,7 @@ expected: FAIL [vertical-align length(in) / values] - expected: TIMEOUT + expected: FAIL [max-height percentage(%) / values] expected: FAIL @@ -76,7 +75,7 @@ expected: FAIL [vertical-align percentage(%) / values] - expected: TIMEOUT + expected: FAIL [background-position length(in) / events] expected: FAIL @@ -100,10 +99,10 @@ expected: FAIL [vertical-align length(em) / values] - expected: TIMEOUT + expected: FAIL [clip rectangle(rectangle) / values] - expected: TIMEOUT + expected: FAIL [word-spacing length(em) / values] expected: FAIL @@ -127,7 +126,7 @@ expected: FAIL [outline-offset length(ex) / values] - expected: TIMEOUT + expected: FAIL [min-width length(cm) / values] expected: FAIL @@ -142,16 +141,16 @@ expected: FAIL [vertical-align length(pc) / values] - expected: TIMEOUT + expected: FAIL [vertical-align length(cm) / values] - expected: TIMEOUT + expected: FAIL [max-height length(ex) / values] expected: FAIL [vertical-align length(ex) / values] - expected: TIMEOUT + expected: FAIL [min-height percentage(%) / values] expected: FAIL @@ -160,7 +159,7 @@ expected: FAIL [outline-offset length(mm) / values] - expected: TIMEOUT + expected: FAIL [font-weight font-weight(keyword) / values] expected: FAIL @@ -169,7 +168,7 @@ expected: FAIL [outline-offset length(pt) / values] - expected: TIMEOUT + expected: FAIL [line-height length(mm) / values] expected: FAIL @@ -202,7 +201,7 @@ expected: FAIL [vertical-align length(pt) / values] - expected: TIMEOUT + expected: FAIL [border-left-color color(rgba) / values] expected: FAIL @@ -271,10 +270,10 @@ expected: FAIL [outline-offset length(in) / values] - expected: TIMEOUT + expected: FAIL [outline-width length(pt) / values] - expected: TIMEOUT + expected: FAIL [border-top-width length(pc) / values] expected: FAIL @@ -292,7 +291,7 @@ expected: FAIL [outline-width length(in) / values] - expected: TIMEOUT + expected: FAIL [word-spacing length(pt) / values] expected: FAIL @@ -304,7 +303,7 @@ expected: FAIL [outline-color color(rgba) / values] - expected: TIMEOUT + expected: FAIL [background-position length(ex) / events] expected: FAIL @@ -328,7 +327,7 @@ expected: FAIL [outline-width length(ex) / values] - expected: TIMEOUT + expected: FAIL [font-size length(pc) / values] expected: FAIL @@ -340,7 +339,7 @@ expected: FAIL [outline-width length(cm) / values] - expected: TIMEOUT + expected: FAIL [max-width percentage(%) / values] expected: FAIL @@ -355,19 +354,19 @@ expected: FAIL [outline-width length(mm) / values] - expected: TIMEOUT + expected: FAIL [border-left-width length(pc) / values] expected: FAIL [outline-width length(pc) / values] - expected: TIMEOUT + expected: FAIL [font-weight font-weight(numeric) / values] expected: FAIL [vertical-align length(px) / values] - expected: TIMEOUT + expected: FAIL [letter-spacing length(px) / values] expected: FAIL @@ -394,7 +393,7 @@ expected: FAIL [outline-width length(em) / values] - expected: TIMEOUT + expected: FAIL [border-right-width length(em) / values] expected: FAIL @@ -406,10 +405,10 @@ expected: FAIL [outline-offset length(em) / values] - expected: TIMEOUT + expected: FAIL [outline-offset length(cm) / values] - expected: TIMEOUT + expected: FAIL [background-position length(mm) / events] expected: FAIL @@ -421,13 +420,13 @@ expected: FAIL [z-index integer(integer) / values] - expected: TIMEOUT + expected: FAIL [border-left-width length(pt) / values] expected: FAIL [vertical-align length(mm) / values] - expected: TIMEOUT + expected: FAIL [border-bottom-width length(pc) / values] expected: FAIL @@ -448,7 +447,7 @@ expected: FAIL [outline-offset length(pc) / values] - expected: TIMEOUT + expected: FAIL [max-height length(pc) / values] expected: FAIL @@ -483,126 +482,30 @@ [word-spacing percentage(%) / values] expected: FAIL - [outline-width length(pc) / events] - expected: TIMEOUT - - [height percentage(%) / values] - expected: FAIL - - [vertical-align length(px) / events] - expected: TIMEOUT - - [padding-right length(em) / values] + [text-indent length(pc) / values] expected: FAIL - [outline-offset length(mm) / events] - expected: TIMEOUT - - [vertical-align length(in) / events] - expected: TIMEOUT - - [padding-left length(px) / values] + [text-indent length(ex) / values] expected: FAIL - [vertical-align length(em) / events] - expected: TIMEOUT - - [vertical-align length(cm) / events] - expected: TIMEOUT - - [outline-offset length(cm) / events] - expected: TIMEOUT - - [vertical-align length(mm) / events] - expected: TIMEOUT - - [outline-offset length(em) / events] - expected: TIMEOUT - - [z-index integer(integer) / events] - expected: TIMEOUT - - [vertical-align length(ex) / events] - expected: TIMEOUT - - [outline-width length(em) / events] - expected: TIMEOUT - - [visibility visibility(keyword) / events] - expected: TIMEOUT - - [width length(pc) / values] + [text-indent length(px) / values] expected: FAIL - [opacity number[0,1\](zero-to-one) / events] - expected: TIMEOUT - - [margin-bottom length(px) / values] + [text-indent length(mm) / values] expected: FAIL - [visibility visibility(keyword) / values] - expected: TIMEOUT - - [width length(pt) / values] + [text-indent length(cm) / values] expected: FAIL - [outline-width length(cm) / events] - expected: TIMEOUT - - [clip rectangle(rectangle) / events] - expected: TIMEOUT - - [outline-width length(ex) / events] - expected: TIMEOUT - - [outline-width length(mm) / events] - expected: TIMEOUT - - [width length(mm) / values] + [text-shadow shadow(shadow) / values] expected: FAIL - [vertical-align percentage(%) / events] - expected: TIMEOUT - - [outline-width length(pt) / events] - expected: TIMEOUT - - [outline-color color(rgba) / events] - expected: TIMEOUT - - [outline-width length(in) / events] - expected: TIMEOUT - - [outline-offset length(ex) / events] - expected: TIMEOUT - - [padding-top length(mm) / values] + [text-indent length(in) / values] expected: FAIL - [vertical-align length(pc) / events] - expected: TIMEOUT - - [vertical-align length(pt) / events] - expected: TIMEOUT - - [width length(ex) / values] + [text-indent length(em) / values] expected: FAIL - [top length(ex) / values] + [text-indent percentage(%) / values] expected: FAIL - [outline-offset length(pt) / events] - expected: TIMEOUT - - [outline-offset length(px) / events] - expected: TIMEOUT - - [outline-offset length(in) / events] - expected: TIMEOUT - - [outline-width length(px) / events] - expected: TIMEOUT - - [outline-offset length(pc) / events] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini index d56a003324d..2bd915cc0b9 100644 --- a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini +++ b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini @@ -47,66 +47,33 @@ [outline-width end] expected: FAIL - [max-height end] - expected: FAIL - - [height end] - expected: FAIL - - [line-height end] - expected: FAIL - - [min-height end] - expected: FAIL - - [bottom end] - expected: FAIL - - [clip end] - expected: FAIL - [font-weight end] expected: FAIL - [border-left-color end] - expected: FAIL - - [border-top-width end] - expected: FAIL - - [margin-right intermediate] - expected: FAIL - - [border-left-width end] - expected: FAIL - - [border-bottom-width end] - expected: FAIL - - [letter-spacing end] + [min-width intermediate] expected: FAIL - [margin-bottom end] + [clip intermediate] expected: FAIL - [border-right-width end] + [border-right-width intermediate] expected: FAIL - [border-right-color end] + [border-left-width intermediate] expected: FAIL - [border-top-color end] + [border-top-width intermediate] expected: FAIL - [color end] + [max-width intermediate] expected: FAIL - [border-spacing end] + [border-spacing intermediate] expected: FAIL - [visibility end] + [left intermediate] expected: FAIL - [left end] + [bottom intermediate] expected: FAIL diff --git a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini index d0509d2ede5..32626f90fad 100644 --- a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini +++ b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini @@ -2,7 +2,7 @@ type: testharness [single-byte-decoder.html?document] - expected: TIMEOUT + expected: CRASH [windows-1254: iso_8859-9 (document.characterSet and document.inputEncoding)] expected: FAIL diff --git a/tests/wpt/metadata/eventsource/format-field-id-2.htm.ini b/tests/wpt/metadata/eventsource/format-field-id-2.htm.ini deleted file mode 100644 index f917c63e1b7..00000000000 --- a/tests/wpt/metadata/eventsource/format-field-id-2.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[format-field-id-2.htm] - expected: TIMEOUT - [EventSource: Last-Event-ID (2)] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/eventsource/format-field-id.htm.ini b/tests/wpt/metadata/eventsource/format-field-id.htm.ini deleted file mode 100644 index 38a0c7e2916..00000000000 --- a/tests/wpt/metadata/eventsource/format-field-id.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[format-field-id.htm] - expected: TIMEOUT - [EventSource: Last-Event-ID] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini deleted file mode 100644 index dc2e45516de..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_5.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html.ini new file mode 100644 index 00000000000..a30c51097ab --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html.ini @@ -0,0 +1,16 @@ +[location-protocol-setter-non-broken-weird.html] + [Set location.protocol to data] + expected: FAIL + + [Set location.protocol to ftp] + expected: FAIL + + [Set location.protocol to gopher] + expected: FAIL + + [Set location.protocol to x] + expected: FAIL + + [Set location.protocol to http+x] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini index 1de3f8d68b2..6b0817b6c56 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini @@ -172,3 +172,63 @@ [XHTML img usemap="http://example.org/#garbage-before-hash-id"] expected: FAIL + [XHTML img usemap="#percent-escape-id-%41"] + expected: FAIL + + [XHTML img usemap="#different-CASE-id"] + expected: FAIL + + [HTML (quirks) IMG usemap="#"] + expected: FAIL + + [XHTML img usemap="hash-last#"] + expected: FAIL + + [HTML (quirks) IMG usemap="no-hash-id"] + expected: FAIL + + [HTML (quirks) IMG usemap="no-hash-name"] + expected: FAIL + + [HTML (quirks) IMG usemap="#no-such-map"] + expected: FAIL + + [HTML (quirks) IMG usemap="hash-last#"] + expected: FAIL + + [XHTML img usemap="no-hash-id"] + expected: FAIL + + [HTML (quirks) IMG usemap="#different-CASE-name"] + expected: FAIL + + [XHTML img usemap="#no-such-map"] + expected: FAIL + + [XHTML img usemap="#percent-escape-name-%41"] + expected: FAIL + + [XHTML img usemap="#"] + expected: FAIL + + [HTML (quirks) IMG usemap="#different-CASE-id"] + expected: FAIL + + [XHTML img usemap="#different-CASE-name"] + expected: FAIL + + [XHTML img usemap=""] + expected: FAIL + + [HTML (quirks) IMG usemap=""] + expected: FAIL + + [HTML (quirks) IMG usemap="#percent-escape-name-%41"] + expected: FAIL + + [HTML (quirks) IMG usemap="#percent-escape-id-%41"] + expected: FAIL + + [XHTML img usemap="no-hash-name"] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini index 772148dc71f..bed3bccce25 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini @@ -5,7 +5,7 @@ expected: TIMEOUT [picture: source (max-width:500px) valid image, img valid image, resize to wide] - expected: FAIL + expected: TIMEOUT [picture: source (max-width:500px) valid image, img broken image, resize to narrow] expected: TIMEOUT diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini index ce482a60da8..c6d49957c4a 100644 --- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini @@ -2,6 +2,3 @@ [document.open() after parser is aborted] expected: FAIL - [async document.open() after parser is aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/url/urlencoded-parser.any.js.ini b/tests/wpt/metadata/url/urlencoded-parser.any.js.ini index 110786c5f37..f3a2aaf504d 100644 --- a/tests/wpt/metadata/url/urlencoded-parser.any.js.ini +++ b/tests/wpt/metadata/url/urlencoded-parser.any.js.ini @@ -8,10 +8,10 @@ [response.formData() with input: a&b&c] expected: FAIL - [response.formData() with input: _charset_=windows-1252&test=%C2x] + [request.formData() with input: a&b&c] expected: FAIL - [response.formData() with input: a=b&c=d] + [response.formData() with input: a=b&c=d&] expected: FAIL @@ -19,18 +19,15 @@ [request.formData() with input: a&b&c] expected: FAIL - [request.formData() with input: _charset_=windows-1252&test=%C2x] - expected: FAIL - [response.formData() with input: a&b&c] expected: FAIL [response.formData() with input: a=b&c=d&] expected: FAIL - [request.formData() with input: a=b&c=d] + [response.formData() with input: &&&a=b&&&&c=d&] expected: FAIL - [response.formData() with input: _charset_=windows-1252&test=%C2x] + [request.formData() with input: a=b&c=d&] expected: FAIL diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini index dfc61af48f0..66bd350083b 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini @@ -1,2 +1,73 @@ [realtimeanalyser-fft-scaling.html] - expected: TIMEOUT + [X 2048-point FFT peak position is not equal to 64. Got 0.] + expected: FAIL + + [X 128-point FFT peak position is not equal to 4. Got 0.] + expected: FAIL + + [X 32768-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 64-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 4096-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [< [FFT scaling tests\] 22 out of 22 assertions were failed.] + expected: FAIL + + [X 128-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 8192-point FFT peak position is not equal to 256. Got 0.] + expected: FAIL + + [X 32-point FFT peak value in dBFS is not greater than or equal to -14.43. Got -1000.] + expected: FAIL + + [X 16384-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 256-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 8192-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 1024-point FFT peak position is not equal to 32. Got 0.] + expected: FAIL + + [X 64-point FFT peak position is not equal to 2. Got 0.] + expected: FAIL + + [X 512-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 32-point FFT peak position is not equal to 1. Got 0.] + expected: FAIL + + [X 16384-point FFT peak position is not equal to 512. Got 0.] + expected: FAIL + + [X 1024-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 2048-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.] + expected: FAIL + + [X 32768-point FFT peak position is not equal to 1024. Got 0.] + expected: FAIL + + [X 4096-point FFT peak position is not equal to 128. Got 0.] + expected: FAIL + + [X 512-point FFT peak position is not equal to 16. Got 0.] + expected: FAIL + + [X 256-point FFT peak position is not equal to 8. Got 0.] + expected: FAIL + + [# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.] + expected: FAIL + diff --git a/tests/wpt/metadata/workers/baseurl/alpha/import-in-moduleworker.html.ini b/tests/wpt/metadata/workers/baseurl/alpha/import-in-moduleworker.html.ini index bf2a1d61bab..bfd4d6dd2d6 100644 --- a/tests/wpt/metadata/workers/baseurl/alpha/import-in-moduleworker.html.ini +++ b/tests/wpt/metadata/workers/baseurl/alpha/import-in-moduleworker.html.ini @@ -1,4 +1,5 @@ [import-in-moduleworker.html] + expected: ERROR [Base URL in module dedicated workers: import] expected: FAIL diff --git a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini new file mode 100644 index 00000000000..dbea4f293ad --- /dev/null +++ b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini @@ -0,0 +1,2 @@ +[transition_calc_implicit.html] + expected: TIMEOUT diff --git a/tests/wpt/web-platform-tests/README.md b/tests/wpt/web-platform-tests/README.md index 684f4617f68..6f9436bc3e4 100644 --- a/tests/wpt/web-platform-tests/README.md +++ b/tests/wpt/web-platform-tests/README.md @@ -432,11 +432,11 @@ upstream review. Search filters to find things to review: -* [Open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22) -* [Reviewed but still open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3Amozilla%3Agecko-sync+-label%3Achromium-export+-label%3Awebkit-export+-label%3Aservo-export+review%3Aapproved+-label%3A%22do+not+merge+yet%22+-label%3A%22status%3Aneeds-spec-decision%22) (Merge? Something left to fix? Ping other reviewer?) +* [Open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports) +* [Reviewed but still open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3Amozilla%3Agecko-sync+-label%3Achromium-export+-label%3Awebkit-export+-label%3Aservo-export+-label%3Avendor-imports+review%3Aapproved+-label%3A%22do+not+merge+yet%22+-label%3A%22status%3Aneeds-spec-decision%22) (Merge? Something left to fix? Ping other reviewer?) * [Open PRs without reviewers](https://github.com/web-platform-tests/wpt/pulls?q=is%3Apr+is%3Aopen+label%3Astatus%3Aneeds-reviewers) -* [Open PRs with label `infra` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Ainfra+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22) -* [Open PRs with label `docs` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Adocs+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22) +* [Open PRs with label `infra` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Ainfra+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports) +* [Open PRs with label `docs` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Adocs+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports) Getting Involved ================ diff --git a/tests/wpt/web-platform-tests/accname/name_test_case_659-manual.html b/tests/wpt/web-platform-tests/accname/name_test_case_659-manual.html index 1332c30c492..abf5e85e16b 100644 --- a/tests/wpt/web-platform-tests/accname/name_test_case_659-manual.html +++ b/tests/wpt/web-platform-tests/accname/name_test_case_659-manual.html @@ -66,7 +66,7 @@ label:after { content: "baz"; } </style> <form> - <label for="test" title="bar"><input id="test" type="text" name="test" title="bar"></label> + <label for="test" title="bar"><input id="test" type="text" name="test" title="buz"></label> </form> <div id="manualMode"></div> diff --git a/tests/wpt/web-platform-tests/accname/name_test_case_660-manual.html b/tests/wpt/web-platform-tests/accname/name_test_case_660-manual.html index 66b36635d94..0c18218707b 100644 --- a/tests/wpt/web-platform-tests/accname/name_test_case_660-manual.html +++ b/tests/wpt/web-platform-tests/accname/name_test_case_660-manual.html @@ -66,7 +66,7 @@ label:after { content: "baz"; } </style> <form> - <label for="test" title="bar"><input id="test" type="password" name="test" title="bar"></label> + <label for="test" title="bar"><input id="test" type="password" name="test" title="buz"></label> </form> <div id="manualMode"></div> diff --git a/tests/wpt/web-platform-tests/background-fetch/fetch.https.window.js b/tests/wpt/web-platform-tests/background-fetch/fetch.https.window.js index 98ecdfa3933..b8b1ff0983c 100644 --- a/tests/wpt/web-platform-tests/background-fetch/fetch.https.window.js +++ b/tests/wpt/web-platform-tests/background-fetch/fetch.https.window.js @@ -70,6 +70,21 @@ backgroundFetchTest(async (test, backgroundFetch) => { backgroundFetchTest(async (test, backgroundFetch) => { const registrationId = uniqueId(); const registration = + await backgroundFetch.fetch(registrationId, ''); + + assert_equals(registration.id, registrationId); + + const {type, eventRegistration, results} = await getMessageFromServiceWorker(); + + assert_equals('backgroundfetchsuccess', type); + assert_equals(eventRegistration.result, 'success'); + assert_equals(eventRegistration.failureReason, ''); + +}, 'Empty URL is OK.'); + +backgroundFetchTest(async (test, backgroundFetch) => { + const registrationId = uniqueId(); + const registration = await backgroundFetch.fetch(registrationId, 'resources/feature-name.txt'); assert_equals(registration.id, registrationId); @@ -190,4 +205,20 @@ backgroundFetchTest(async (test, backgroundFetch) => { assert_equals(eventRegistration.result, 'failure'); assert_equals(eventRegistration.failureReason, 'bad-status'); -}, 'Using Background Fetch to fetch a non-existent resource should fail.');
\ No newline at end of file +}, 'Using Background Fetch to fetch a non-existent resource should fail.'); + +backgroundFetchTest(async (test, backgroundFetch) => { + const registration = await backgroundFetch.fetch( + 'my-id', + ['https://example.com', 'http://example.com']); + + const {type, eventRegistration, results} = await getMessageFromServiceWorker(); + + assert_equals('backgroundfetchfail', type); + assert_equals(eventRegistration.failureReason, 'fetch-error'); + + assert_equals(results.length, 2); + assert_true(results[0].url.includes('https://example.com')); + assert_equals(results[1].url, ''); + +}, 'Fetches with mixed content should fail.'); diff --git a/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js b/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js index 9f24f135818..05b32501228 100644 --- a/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js +++ b/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js @@ -32,34 +32,6 @@ backgroundFetchTest((t, bgFetch) => { backgroundFetchTest((t, bgFetch) => { return promise_rejects(t, new TypeError(), - bgFetch.fetch(uniqueId(), 'http://example.com')); -}, 'non-loopback http: fetch should reject'); - -backgroundFetchTest((t, bgFetch) => { - return promise_rejects(t, new TypeError(), - bgFetch.fetch(uniqueId(), 'http://192.0.2.0')); -}, 'non-loopback IPv4 http: fetch should reject'); - -backgroundFetchTest((t, bgFetch) => { - return promise_rejects(t, new TypeError(), - bgFetch.fetch(uniqueId(), 'http://[2001:db8::1]')); -}, 'non-loopback IPv6 http: fetch should reject'); - -backgroundFetchTest((t, bgFetch) => { - return promise_rejects(t, new TypeError(), - bgFetch.fetch(uniqueId(), ['https://example.com', - 'http://example.com'])); -}, 'https: and non-loopback http: fetch should reject'); - -backgroundFetchTest((t, bgFetch) => { - return promise_rejects(t, new TypeError(), - bgFetch.fetch(uniqueId(), ['http://example.com', - 'https://example.com'])); -}, 'non-loopback http: and https: fetch should reject'); - - -backgroundFetchTest((t, bgFetch) => { - return promise_rejects(t, new TypeError(), bgFetch.fetch(uniqueId(), 'wss:127.0.0.1')); }, 'wss: fetch should reject'); diff --git a/tests/wpt/web-platform-tests/background-fetch/service_workers/sw.js b/tests/wpt/web-platform-tests/background-fetch/service_workers/sw.js index 43d778c0891..af4655dbad4 100644 --- a/tests/wpt/web-platform-tests/background-fetch/service_workers/sw.js +++ b/tests/wpt/web-platform-tests/background-fetch/service_workers/sw.js @@ -27,5 +27,3 @@ function handleBackgroundFetchUpdateEvent(event) { self.addEventListener('backgroundfetchsuccess', handleBackgroundFetchUpdateEvent); self.addEventListener('backgroundfetchfail', handleBackgroundFetchUpdateEvent); - - diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-layout-button-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-button-001.html new file mode 100644 index 00000000000..e8beef7c0ed --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-button-001.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Layout containment on button</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-layout"> +<link rel="match" href="reference/contain-layout-button-001-ref.html"> +<meta name=assert content="Layout containment does apply to buttons, thus their baseline is the same than if they don't have contents."> +<style> +button { + border: 5px solid green; + padding: 0; + contain: layout; + color: transparent; + width: 0; + height: 0; +} +</style> + +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p> +before<button>b</button>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-layout-flexbox-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-flexbox-001.html new file mode 100644 index 00000000000..2b206edb57f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-flexbox-001.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Layout containment on flexbox container</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-layout"> +<link rel="match" href="reference/contain-layout-flexbox-001-ref.html"> +<meta name=assert content="Layout containment does apply to flexbox containers, thus their baseline is the same than if they don't have contents."> +<style> +div { + display: inline-flex; + border: 5px solid green; + contain: layout; + color: transparent; + width: 0; + height: 0; +} +</style> + +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p> +before<div>f</div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-layout-grid-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-grid-001.html new file mode 100644 index 00000000000..a6bcc4dbc2a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-grid-001.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Layout containment on grid container</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-layout"> +<link rel="match" href="reference/contain-layout-grid-001-ref.html"> +<meta name=assert content="Layout containment does apply to grid containers, thus their baseline is the same than if they don't have contents."> +<style> +div { + display: inline-grid; + border: 5px solid green; + contain: layout; + color: transparent; + width: 0; + height: 0; +} +</style> + +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p> +before<div>g</div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-paint-clip-019.html b/tests/wpt/web-platform-tests/css/css-contain/contain-paint-clip-019.html new file mode 100644 index 00000000000..bd761b8a523 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-paint-clip-019.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> + +<meta charset="UTF-8"> + +<title>CSS Containment Test: 'contain: paint' and clipping prevents scrollbars</title> + +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-contain-1/#containment-paint"> +<link rel="match" href="reference/contain-paint-clip-019-ref.html"> + +<meta content="This test checks that the paint containment of an element clips contents. + It should also prevent layout overflow from being propagated to ancestors." name="assert"> +<meta content="" name="flags"> + +<style> + #container { + contain: paint; + width: 100px; + height: 100px; + } + #green { + background-color: green; + width: 100px; + height: 100px; + } + #red { + background-color: red; + width: 100px; + height: 10000px; + } +</style> + +<p>Test passes if there there is a green square. No red and no scrollbars should be visible.</p> + +<div id="container"> + <div id="green"></div> + <div id="red"></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-button-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-button-001.html index 1e4965e9daf..4b2ecd7b76e 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/contain-size-button-001.html +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-button-001.html @@ -4,15 +4,16 @@ <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> <link rel="match" href="reference/contain-size-button-001-ref.html"> -<meta name=assert content="Size containment does apply to buttons, thus their size and baseline is the same than if they don't have contents."> +<meta name=assert content="Size containment does apply to buttons, thus their size is the same than if they don't have contents."> <style> button { border: 5px solid green; padding: 0; contain: size; color: transparent; + font-size: 2em; } </style> -<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p> +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p> before<button>flex</button>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-flexbox-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-flexbox-001.html index 31e82f5d24c..16ba62eda04 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/contain-size-flexbox-001.html +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-flexbox-001.html @@ -4,15 +4,16 @@ <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> <link rel="match" href="reference/contain-size-flexbox-001-ref.html"> -<meta name=assert content="Size containment does apply to flexbox containers, thus their size and baseline is the same than if they don't have contents."> +<meta name=assert content="Size containment does apply to flexbox containers, thus their size is the same than if they don't have contents."> <style> div { display: inline-flex; border: 5px solid green; contain: size; color: transparent; + font-size: 2em; } </style> -<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p> +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p> before<div>flex</div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-001.html index f67f0e118e0..4510c1e5536 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-001.html +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-001.html @@ -4,15 +4,16 @@ <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> <link rel="match" href="reference/contain-size-grid-001-ref.html"> -<meta name=assert content="Size containment does apply to grid containers, thus their size and baseline is the same than if they don't have contents."> +<meta name=assert content="Size containment does apply to grid containers, thus their size is the same than if they don't have contents."> <style> div { display: inline-grid; border: 5px solid green; contain: size; color: transparent; + font-size: 2em; } </style> -<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p> +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p> before<div>grid</div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-button-001-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-button-001-ref.html new file mode 100644 index 00000000000..11a784b213c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-button-001-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +button { + border: 5px solid green; + padding: 0; + color: transparent; + width: 0; + height: 0px; + /* Layout containment creates a stacking context, the following lines simuluate the same in the reference file. */ + position: relative; + z-index: 1; +} +</style> + +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p> +before<button></button>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-flexbox-001-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-flexbox-001-ref.html new file mode 100644 index 00000000000..832e4c72c2c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-flexbox-001-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +div { + display: inline-flex; + border: 5px solid green; + /* Layout containment creates a stacking context, the following lines simuluate the same in the reference file. */ + position: relative; + z-index: 1; +} +</style> + +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p> +before<div></div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-grid-001-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-grid-001-ref.html new file mode 100644 index 00000000000..b5ff8e0e0da --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-layout-grid-001-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +div { + display: inline-grid; + border: 5px solid green; + /* Layout containment creates a stacking context, the following lines simuluate the same in the reference file. */ + position: relative; + z-index: 1; +} +</style> + +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p> +before<div></div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-paint-clip-019-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-paint-clip-019-ref.html new file mode 100644 index 00000000000..2a529c12c48 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-paint-clip-019-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> + +<meta charset="UTF-8"> + +<title>CSS Reference Test</title> + +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> + +<style> + #green { + background-color: green; + width: 100px; + height: 100px; + } +</style> + +<p>Test passes if there there is a green square. No red and no scrollbars should be visible.</p> + +<div id="green"></div> diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-button-001-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-button-001-ref.html index 1cbaaccd1a0..eff64aa8e2e 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-button-001-ref.html +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-button-001-ref.html @@ -6,8 +6,12 @@ button { border: 5px solid green; padding: 0; + color: transparent; + width: 0; + height: 0; + font-size: 2em; } </style> -<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p> -before<button></button>after +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p> +before<button>b</button>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-flexbox-001-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-flexbox-001-ref.html index 85628b59c48..70f40864300 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-flexbox-001-ref.html +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-flexbox-001-ref.html @@ -6,8 +6,12 @@ div { display: inline-flex; border: 5px solid green; + color: transparent; + width: 0; + height: 0; + font-size: 2em; } </style> -<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p> -before<div></div>after +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p> +before<div>f</div>after diff --git a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-grid-001-ref.html b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-grid-001-ref.html index d71636bd5f4..cf4f8076650 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-grid-001-ref.html +++ b/tests/wpt/web-platform-tests/css/css-contain/reference/contain-size-grid-001-ref.html @@ -6,8 +6,12 @@ div { display: inline-grid; border: 5px solid green; + color: transparent; + width: 0; + height: 0; + font-size: 2em; } </style> -<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p> -before<div></div>after +<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p> +before<div>g</div>after diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-height-flex-items-009.html b/tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-height-flex-items-009.html new file mode 100644 index 00000000000..718386af020 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-height-flex-items-009.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<title>Tests correct handling of min-height: auto with dynamic changes</title> +<link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#min-size-auto" title="4.5. Implied Minimum Size of Flex Items" /> +<link rel="author" title="Google Inc." href="http://www.google.com/"> +<link href="support/flexbox.css" rel="stylesheet"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<style> +.container { + height: 300px; + outline: 2px solid black; +} + +.inner +{ + width: 400px; + flex: 1; + background-color: green; +} +#container2 .flexbox > * { flex-basis: 0; } +#container2 .column > * { flex-basis: auto; } +</style> +<script> +function change() { + var container = document.getElementById('container'); + container.offsetHeight; + container.style.height = '80px'; + container = document.getElementById('container2'); + container.offsetHeight; + container.style.height = '80px'; + checkLayout('.container'); +} +</script> +<body onload="change()"> +<p>Green rectangle should be entirely within the black rectangle</p> +<div id="log"></div> +<div id="container" class="container"> + <div class="flexbox column" style="height: 100%;"> + <div class="flexbox flex-one"> + <div class="flexbox column"> + <div class="flexbox column flex-one"> + <div class="inner" data-expected-height="80"> + </div> + </div> + </div> + </div> + </div> +</div> + +<div id="container2" class="container"> + <div class="flexbox column" style="height: 100%;"> + <div class="flexbox flex-one"> + <div class="flexbox column"> + <div class="flexbox column flex-one"> + <div class="inner" data-expected-height="80"> + </div> + </div> + </div> + </div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-013.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-013.html new file mode 100644 index 00000000000..e72814725d2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-013.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: Gutters adjacent to collapsed tracks also collapse</title> +<link rel="help" href="https://www.w3.org/TR/css-grid-1/#gutters"> +<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-shorthand"> +<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-legacy"> +<link rel="help" href="https://www.w3.org/TR/css-grid-1/#repeat-notation"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<meta name="assert" content="This test checks that gutters adjacent to collapsed tracks don't reduce the space available for aligning adjacent grid items." /> +<style> + #grid { + display: grid; + margin-top: -50px; + margin-left: -50px; + width: 500px; + height: 500px; + grid-gap: 100px; + grid-template-rows: repeat(auto-fit, 200px); + grid-template-columns: repeat(auto-fit, 200px); + align-items: center; + justify-items: center; + background: linear-gradient(red, red) no-repeat 50px 50px / 100px 100px; + } + + #grid > div { + background-color: green; + width: 50%; + height: 50%; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div id="grid"> + <div></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-masking/inheritance.html b/tests/wpt/web-platform-tests/css/css-masking/inheritance.sub.html index 34f75859ee8..95424204d50 100644 --- a/tests/wpt/web-platform-tests/css/css-masking/inheritance.html +++ b/tests/wpt/web-platform-tests/css/css-masking/inheritance.sub.html @@ -16,17 +16,17 @@ </div> <script> assert_not_inherited('clip', 'auto', 'rect(10px, 20px, 30px, 40px)'); -assert_not_inherited('clip-path', 'none', 'url("https://example.com/")'); +assert_not_inherited('clip-path', 'none', 'url("http://{{host}}/")'); assert_inherited('clip-rule', 'nonzero', 'evenodd'); assert_not_inherited('mask-border-mode', 'alpha', 'luminance'); assert_not_inherited('mask-border-outset', '0', '10px 20px 30px 40px'); assert_not_inherited('mask-border-repeat', 'stretch', 'round space'); assert_not_inherited('mask-border-slice', '0', '1 2 3 4 fill'); -assert_not_inherited('mask-border-source', 'none', 'url("https://example.com/")'); +assert_not_inherited('mask-border-source', 'none', 'url("http://{{host}}/")'); assert_not_inherited('mask-border-width', 'auto', '10px 20px 30px 40px'); assert_not_inherited('mask-clip', 'border-box', 'no-clip'); assert_not_inherited('mask-composite', 'add', 'exclude'); -assert_not_inherited('mask-image', 'none', 'url("https://example.com/")'); +assert_not_inherited('mask-image', 'none', 'url("http://{{host}}/")'); assert_not_inherited('mask-mode', 'match-source', 'luminance'); assert_not_inherited('mask-origin', 'border-box', 'padding-box'); assert_not_inherited('mask-position', '0% 0%', '10px 20px'); diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html new file mode 100644 index 00000000000..5e5561cadf2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title> + CSS Reftest Reference + </title> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <style> + .container { + width: 100px; + display: flex; + border: 1px solid purple; + margin-bottom: 15px; + } + .item { + margin: 2px; + background: lightblue; + } + .inline-box { + display: inline-block; + height: 10px; + width: 10px; + background: lightgray; + border: 1px solid black; + } + #change-width { + /* Using hardcoded CSS as reference for testcase's tweak: */ + width: 300px; + } + #change-flex { + /* Using hardcoded CSS as reference for testcase's tweak: */ + flex: 0 0 75px; + } + </style> +</head> +<body> + <div class="container"> + <div class="item" id="change-width"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + <div class="item"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + </div> + + <div class="container"> + <div class="item" id="change-flex"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + <div class="item"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html new file mode 100644 index 00000000000..d64c4bdf28e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title> + CSS Test: Testing how a sizing change to one flex item impacts its sibling + </title> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#layout-algorithm"> + <link rel="match" href="flexbox-dyn-resize-001-ref.html"> + <style> + .container { + width: 100px; + display: flex; + border: 1px solid purple; + margin-bottom: 15px; + } + .item { + margin: 2px; + background: lightblue; + } + .inline-box { + display: inline-block; + height: 10px; + width: 10px; + background: lightgray; + border: 1px solid black; + } + </style> + <script> + function go() { + // Make this item steal all the spare width (forcing its sibling to shrink) + // by giving it a huge 'width' and therefore huge flex-basis: + document.getElementById("change-width").style.width = "300px"; + + // Make this item steal all the spare width (forcing its sibling to shrink) + // by giving it a pretty big flex-basis and no shrinkability: + document.getElementById("change-flex").style.flex = "0 0 75px" + } + </script> +</head> +<body onload="go()"> + <div class="container"> + <div class="item" id="change-width"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + <div class="item"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + </div> + + <div class="container"> + <div class="item" id="change-flex"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + <div class="item"> + <div class="inline-box"></div><div class="inline-box"></div> + </div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list index df226fa8df7..5bb3b650139 100644 --- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list @@ -108,6 +108,9 @@ == flexbox-column-row-gap-003.html flexbox-column-row-gap-003-ref.html == flexbox-column-row-gap-004.html flexbox-column-row-gap-004-ref.html +# Tests with dynamic changes that impact sizing: +== flexbox-dyn-resize-001.html flexbox-dyn-resize-001-ref.html + # Tests for "flex-basis: content" == flexbox-flex-basis-content-001a.html flexbox-flex-basis-content-001-ref.html == flexbox-flex-basis-content-001b.html flexbox-flex-basis-content-001-ref.html diff --git a/tests/wpt/web-platform-tests/interfaces/screen-capture.idl b/tests/wpt/web-platform-tests/interfaces/screen-capture.idl index 668f4588ba2..b79d09d19dc 100644 --- a/tests/wpt/web-platform-tests/interfaces/screen-capture.idl +++ b/tests/wpt/web-platform-tests/interfaces/screen-capture.idl @@ -7,12 +7,24 @@ partial interface Navigator { Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints); }; +partial dictionary MediaTrackSupportedConstraints { + boolean displaySurface = true; + boolean logicalSurface = true; + boolean cursor = true; +}; + partial dictionary MediaTrackConstraintSet { ConstrainDOMString displaySurface; ConstrainBoolean logicalSurface; ConstrainDOMString cursor; }; +partial dictionary MediaTrackSettings { + DOMString displaySurface; + boolean logicalSurface; + DOMString cursor; +}; + enum DisplayCaptureSurfaceType { "monitor", "window", diff --git a/tests/wpt/web-platform-tests/interfaces/speech-api.idl b/tests/wpt/web-platform-tests/interfaces/speech-api.idl index 8e998df5bc3..0b5c866b35c 100644 --- a/tests/wpt/web-platform-tests/interfaces/speech-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/speech-api.idl @@ -137,7 +137,8 @@ interface SpeechSynthesisUtterance : EventTarget { attribute EventHandler onboundary; }; -[Exposed=Window] +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)] interface SpeechSynthesisEvent : Event { readonly attribute SpeechSynthesisUtterance utterance; readonly attribute unsigned long charIndex; @@ -145,6 +146,13 @@ interface SpeechSynthesisEvent : Event { readonly attribute DOMString name; }; +dictionary SpeechSynthesisEventInit : EventInit { + required SpeechSynthesisUtterance utterance; + unsigned long charIndex = 0; + float elapsedTime = 0; + DOMString name = ""; +}; + enum SpeechSynthesisErrorCode { "canceled", "interrupted", @@ -160,11 +168,16 @@ enum SpeechSynthesisErrorCode { "not-allowed", }; -[Exposed=Window] +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)] interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent { readonly attribute SpeechSynthesisErrorCode error; }; +dictionary SpeechSynthesisErrorEventInit : SpeechSynthesisEventInit { + required SpeechSynthesisErrorCode error; +}; + [Exposed=Window] interface SpeechSynthesisVoice { readonly attribute DOMString voiceURI; diff --git a/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html b/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html index 69052b11ce6..50f33f0443b 100644 --- a/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html +++ b/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html @@ -13,7 +13,7 @@ pre, #log { overflow: visible; height: 200px; width: 160px; - border: 7px solid black; + border: 8px solid black; } #target { margin: 10px; @@ -50,12 +50,35 @@ function step0() { var targetBounds = clientBounds(target); target.style.transform = "translateY(195px)"; runTestCycle(step1, "target.style.transform = 'translateY(195px)'"); - checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, 8, 182, 8, 222, false)); + checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, 8, 184, 8, 224, false)); } function step1() { var targetBounds = clientBounds(target); + target.style.transform = "translateY(300px)"; + runTestCycle(step2, "target.style.transform = 'translateY(300px)'"); + checkLastEntry(entries, 1, targetBounds.concat(26, 146, 221, 224, 8, 184, 8, 224, true)); +} + +function step2() { + var targetBounds = clientBounds(target); target.style.transform = ""; - checkLastEntry(entries, 1, targetBounds.concat(25, 145, 220, 222, 8, 182, 8, 222, true)); + target.style.zoom = "2"; + runTestCycle(step3, "target.style.zoom = 2"); + checkLastEntry(entries, 2, targetBounds.concat(0, 0, 0, 0, 8, 184, 8, 224, false)); } + +function step3() { + var targetBounds = clientBounds(target); + var intersectionWidth = ( + 176 // root width including border + -8 // root left border + -20 // target left margin * target zoom + ) / 2; // convert to target's zoom factor. + var intersectionHeight = (216 - 8 - 20) / 2; + var intersectionRect = [targetBounds[0], targetBounds[0] + intersectionWidth, + targetBounds[2], targetBounds[2] + intersectionHeight]; + checkLastEntry(entries, 3, targetBounds.concat(intersectionRect).concat(8, 184, 8, 224, true)); +} + </script> diff --git a/tests/wpt/web-platform-tests/intersection-observer/target-in-different-window.html b/tests/wpt/web-platform-tests/intersection-observer/target-in-different-window.html new file mode 100644 index 00000000000..cf8fe4e6ec9 --- /dev/null +++ b/tests/wpt/web-platform-tests/intersection-observer/target-in-different-window.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/intersection-observer-test-utils.js"></script> + +<script> +var entries = []; +var popup, target; + +function waitForPopupNotification(f) { + popup.requestAnimationFrame(function() { + popup.requestAnimationFrame(function() { popup.setTimeout(f); }); + }); +} + +async_test((t) => { + var observer = new IntersectionObserver(function(changes) { + entries = entries.concat(changes); + }); + popup = window.open(); + t.add_cleanup(() => popup.close()); + target = popup.document.createElement('div'); + target.style.width = "100px"; + target.style.height = "100px"; + observer.observe(target); + waitForPopupNotification(t.step_func(() => { + assert_equals(entries.length, 1, "Initial notification for detached target."); + assert_equals(entries[0].isIntersecting, false, "not intersecting"); + popup.document.body.appendChild(target); + waitForPopupNotification(t.step_func_done(() => { + assert_equals(entries.length, 2, "Notification after insertion into popup."); + assert_equals(entries[1].isIntersecting, true, "intersecting"); + })); + })); +}, "IntersectionObserver with target in a different window."); +</script> diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index 46c2550e728..9f5693fcc2b 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -169,6 +169,7 @@ SET TIMEOUT: html/webappapis/scripting/events/event-handler-processing-algorithm SET TIMEOUT: html/webappapis/scripting/processing-model-2/* SET TIMEOUT: IndexedDB/* SET TIMEOUT: infrastructure/* +SET TIMEOUT: intersection-observer/target-in-different-window.html SET TIMEOUT: media-source/mediasource-util.js SET TIMEOUT: media-source/URL-createObjectURL-revoke.html SET TIMEOUT: mixed-content/generic/sanity-checker.js diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html index b6281b9e6c3..6f03fd8f2f0 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html @@ -1,6 +1,11 @@ <!DOCTYPE html> <title>Service Worker: Navigation redirection</title> <meta name="timeout" content="long"> +<!-- empty variant tests document.location and intercepted URLs --> +<meta name="variant" content=""> +<!-- client variant tests the Clients API (resultingClientId and Client.url) --> +<meta name="variant" content="?client"> + <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/get-host-info.sub.js"></script> @@ -76,36 +81,208 @@ async function check_all_intercepted_urls(expected_urls) { assert_object_equals(urls, expected_urls, 'Intercepted URLs should match.'); } +// Checks |clients| returned from a worker. Only the client matching +// |expected_final_client_tag| should be found. Returns true if a client was +// found. Note that the final client is not necessarily found by this worker, +// if the client is cross-origin. +// +// |clients| is an object like: +// {x: {found: true, id: id1, url: url1}, b: {found: false}} +function check_clients(clients, + expected_id, + expected_url, + expected_final_client_tag, + worker_name) { + let found = false; + Object.keys(clients).forEach(key => { + const info = clients[key]; + if (info.found) { + assert_true(expected_final_client_tag, + `${worker_name} client tag exists`); + assert_equals(key, expected_final_client_tag, + `${worker_name} client tag matches`); + assert_equals(info.id, expected_id, `${worker_name} client id`); + assert_equals(info.url, expected_url, `${worker_name} client url`); + found = true; + } + }); + return found; +} + +function check_resulting_client_ids(infos, expected_infos, actual_ids, worker) { + assert_equals(infos.length, expected_infos.length, + `request length for ${worker}`); + for (var i = 0; i < infos.length; i++) { + const tag = expected_infos[i].resultingClientIdTag; + const url = expected_infos[i].url; + const actual_id = infos[i].resultingClientId; + const expected_id = actual_ids[tag]; + assert_equals(typeof(actual_id), 'string', + `resultingClientId for ${url} request to ${worker}`); + if (expected_id) { + assert_equals(requestInfos[0], expected_id, + `resultingClientId for ${url} request to ${worker}`); + } else { + actual_ids[key] = actual_id; + } + } +} + // Creates an iframe and navigates to |url|, which is expected to start a chain // of redirects. // - |expected_last_url| is the expected window.location after the // navigation. +// // - |expected_request_infos| is the expected requests that the service workers // were dispatched fetch events for. The format is: // [ -// [{url: url1}, {url: url2}], // requests from workers[0], -// [{url: url1}, // requests from workers[1], -// [{url: url1}, {url: url2}] // requests from cross-origin worker +// [ +// // Requests received by workers[0]. +// {url: url1, resultingClientIdTag: 'a'}, +// {url: url2, resultingClientIdTag: 'a'} +// ], +// [ +// // Requests received by workers[1]. +// {url: url3, resultingClientIdTag: 'a'} +// ], +// [ +// // Requests received by the cross-origin worker. +// {url: url4, resultingClientIdTag: 'x'} +// {url: url5, resultingClientIdTag: 'x'} +// ] // ] +// Here, |url| is |event.request.url| and |resultingClientIdTag| represents +// |event.resultingClientId|. Since the actual client ids are not known +// beforehand, the expectation isn't the literal expected value, but all equal +// tags must map to the same actual id. +// +// - |expected_final_client_tag| is the resultingClientIdTag that is +// expected to map to the created client's id. This is null if there +// is no such tag, which can happen when the final request was a cross-origin +// redirect to out-scope, so no worker received a fetch event whose +// resultingClientId is the id of the resulting client. +// +// In the example above: +// - workers[0] receives two requests with the same resultingClientId. +// - workers[1] receives one request also with that resultingClientId. +// - The cross-origin worker receives two requests with the same +// resultingClientId which differs from the previous one. +// - Assuming |expected_final_client_tag| is 'x', then the created +// client has the id seen by the cross-origin worker above. function redirect_test(url, expected_last_url, expected_request_infos, + expected_final_client_tag, test_name) { promise_test(async t => { const frame = await with_iframe(url); t.add_cleanup(() => { frame.remove(); }); - const expected_intercepted_urls = expected_request_infos.map(requests => { - return requests.map(info => { - return info.url; - }); - }); - await check_all_intercepted_urls(expected_intercepted_urls); - const last_url = await send_to_iframe(frame, 'getLocation'); - assert_equals(last_url, expected_last_url, 'Last URL should match.'); + // Switch on variant. + if (document.location.search == '?client') { + return client_variant_test(url, expected_last_url, expected_request_infos, + expected_final_client_tag, test_name); + } + + return default_variant_test(url, expected_last_url, expected_request_infos, + frame, test_name); }, test_name); } +// The default variant tests the request interception chain and +// resulting document.location. +async function default_variant_test(url, + expected_last_url, + expected_request_infos, + frame, + test_name) { + const expected_intercepted_urls = expected_request_infos.map( + requests_for_worker => { + return requests_for_worker.map(info => { + return info.url; + }); + }); + await check_all_intercepted_urls(expected_intercepted_urls); + const last_url = await send_to_iframe(frame, 'getLocation'); + assert_equals(last_url, expected_last_url, 'Last URL should match.'); +} + +// The "client" variant tests the Clients API using resultingClientId. +async function client_variant_test(url, + expected_last_url, + expected_request_infos, + expected_final_client_tag, + test_name) { + // Request infos is an array like: + // [ + // [{url: url1, resultingClientIdTag: tag1}], + // [{url: url2, resultingClientIdTag: tag2}], + // [{url: url3: resultingClientIdTag: tag3}] + // ] + const requestInfos = await get_all_request_infos(); + + // We check the actual infos against the expected ones, and learn the + // actual ids as we go. + const actual_ids = {}; + check_resulting_client_ids(requestInfos[0], + expected_request_infos[0], + actual_ids, + 'worker0'); + check_resulting_client_ids(requestInfos[1], + expected_request_infos[1], + actual_ids, + 'worker1'); + check_resulting_client_ids(requestInfos[2], + expected_request_infos[2], + actual_ids, + 'crossOriginWorker'); + + // Now |actual_ids| maps tag to actual id: + // {x: id1, b: id2, c: id3} + // Ask each worker to try to resolve the actual ids to clients. + // Only |expected_final_client_tag| should resolve to a client. + const client_infos = await get_all_clients(actual_ids); + + // Client infos is an object like: + // { + // worker0: {x: {found: true, id: id1, url: url1}, b: {found: false}}, + // worker1: {x: {found: true, id: id1, url: url1}}, + // crossOriginWorker: {x: {found: false}}, {b: {found: false}} + // } + // + // Now check each client info. check_clients() verifies each info: only + // |expected_final_client_tag| should ever be found and the found client + // should have the expected url and id. A wrinkle is that not all workers + // will find the client, if they are cross-origin to the client. This + // means check_clients() trivially passes if no clients are found. So + // additionally check that at least one worker found the client (|found|), + // if that was expected (|expect_found|). + let found = false; + const expect_found = !!expected_final_client_tag; + const expected_id = actual_ids[expected_final_client_tag]; + found = check_clients(client_infos.worker0, + expected_id, + expected_last_url, + expected_final_client_tag, + 'worker0'); + found = check_clients(client_infos.worker1, + expected_id, + expected_last_url, + expected_final_client_tag, + 'worker1') || found; + found = check_clients(client_infos.crossOriginWorker, + expected_id, + expected_last_url, + expected_final_client_tag, + 'crossOriginWorker') || found; + assert_equals(found, expect_found, 'client found'); + + if (!expect_found) { + // TODO(falken): Ask the other origin frame if it has a client of the + // expected URL. + } +} + window.addEventListener('message', on_message, false); function on_message(e) { @@ -129,6 +306,27 @@ function send_to_iframe(frame, message) { }); } +async function get_all_clients(actual_ids) { + const client_infos = {}; + client_infos['worker0'] = await get_clients(workers[0], actual_ids); + client_infos['worker1'] = await get_clients(workers[1], actual_ids); + client_infos['crossOriginWorker'] = + await send_to_iframe(other_origin_frame, + {command: 'get_clients', actual_ids}); + return client_infos; +} + +function get_clients(worker, actual_ids) { + return new Promise(resolve => { + var channel = new MessageChannel(); + channel.port1.onmessage = (msg) => { + resolve(msg.data.clients); + }; + worker.postMessage({command: 'getClients', actual_ids, port: channel.port2}, + [channel.port2]); + }); +} + // Returns an array of the URLs that |worker| received fetch events for: // [url1, url2] async function get_intercepted_urls(worker) { @@ -138,7 +336,10 @@ async function get_intercepted_urls(worker) { // Returns the requests that |worker| received fetch events for. The return // value is an array of format: -// [{url: url1}, {url: url2}] +// [ +// {url: url1, resultingClientId: id}, +// {url: url2, resultingClientId: id} +// ] function get_request_infos(worker) { return new Promise(resolve => { var channel = new MessageChannel(); @@ -150,6 +351,29 @@ function get_request_infos(worker) { }); } +// Returns an array of the requests the workers received fetch events for: +// [ +// // Requests from workers[0]. +// [ +// {url: url1, resultingClientIdTag: tag1}, +// {url: url2, resultingClientIdTag: tag1} +// ], +// +// // Requests from workers[1]. +// [{url: url3, resultingClientIdTag: tag2}], +// +// // Requests from the cross-origin worker. +// [] +// ] +async function get_all_request_infos() { + const request_infos = []; + request_infos.push(await get_request_infos(workers[0])); + request_infos.push(await get_request_infos(workers[1])); + request_infos.push(await send_to_iframe(other_origin_frame, + {command: 'get_request_infos'})); + return request_infos; +} + let url; let url1; let url2; @@ -159,7 +383,8 @@ url = SCOPE1; redirect_test( OUT_SCOPE + 'url=' + encodeURIComponent(url), url, - [[{url}], [], []], + [[{url, resultingClientIdTag: 'x'}], [], []], + 'x', 'Normal redirect to same-origin scope.'); @@ -167,30 +392,33 @@ url = SCOPE1 + '#ref'; redirect_test( OUT_SCOPE + 'url=' + encodeURIComponent(SCOPE1) + '#ref', url, - [[{url}], [], []], + [[{url, resultingClientIdTag: 'x'}], [], []], + 'x', 'Normal redirect to same-origin scope with a hash fragment.'); url = SCOPE1 + '#ref2'; redirect_test( OUT_SCOPE + 'url=' + encodeURIComponent(url) + '#ref', url, - [[{url}], [], []], + [[{url, resultingClientIdTag: 'x'}], [], []], + 'x', 'Normal redirect to same-origin scope with different hash fragments.'); url = OTHER_ORIGIN_SCOPE; redirect_test( OUT_SCOPE + 'url=' + encodeURIComponent(url), url, - [[], [], [{url}]], + [[], [], [{url, resultingClientIdTag: 'x'}]], + 'x', 'Normal redirect to other-origin scope.'); - // SW fallbacked redirect. SW doesn't handle the fetch request. url = SCOPE1 + 'url=' + encodeURIComponent(OUT_SCOPE); redirect_test( url, OUT_SCOPE, - [[{url}], [], []], + [[{url, resultingClientIdTag: 'x'}], [], []], + 'x', 'SW-fallbacked redirect to same-origin out-scope.'); url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1); @@ -198,7 +426,15 @@ url2 = SCOPE1; redirect_test( url1, url2, - [[{url: url1}, {url: url2}], [], []], + [ + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', 'SW-fallbacked redirect to same-origin same-scope.'); url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1) + '#ref'; @@ -206,7 +442,15 @@ url2 = SCOPE1 + '#ref'; redirect_test( url1, url2, - [[{url: url1}, {url: url2}], [], []], + [ + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', 'SW-fallbacked redirect to same-origin same-scope with a hash fragment.'); url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref'; @@ -214,7 +458,15 @@ url2 = SCOPE1 + '#ref2'; redirect_test( url1, url2, - [[{url: url1}, {url: url2}], [], []], + [ + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', 'SW-fallbacked redirect to same-origin same-scope with different hash ' + 'fragments.'); @@ -223,7 +475,12 @@ url2 = SCOPE2; redirect_test( url1, url2, - [[{url: url1}], [{url: url2}], []], + [ + [{url: url1, resultingClientIdTag: 'x'}], + [{url: url2, resultingClientIdTag: 'x'}], + [] + ], + 'x', 'SW-fallbacked redirect to same-origin other-scope.'); url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); @@ -231,7 +488,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'a'}], [], []], + 'x', 'SW-fallbacked redirect to other-origin out-scope.'); url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); @@ -239,10 +497,32 @@ url2 = OTHER_ORIGIN_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], [{url: url2}]], + [ + [{url: url1, resultingClientIdTag: 'a'}], + [], + [{url: url2, resultingClientIdTag: 'x'}] + ], + 'x', 'SW-fallbacked redirect to other-origin in-scope.'); +url3 = SCOPE1; +url2 = OTHER_ORIGIN_SCOPE + 'url=' + encodeURIComponent(url3); +url1 = SCOPE1 + 'url=' + encodeURIComponent(url2); +redirect_test( + url1, + url3, + [ + [ + {url: url1, resultingClientIdTag: 'a'}, + {url: url3, resultingClientIdTag: 'x'} + ], + [], + [{url: url2, resultingClientIdTag: 'b'}] + ], + 'x', + 'SW-fallbacked redirect to other-origin and back to same-origin.'); + // SW generated redirect. // SW: event.respondWith(Response.redirect(params['url'])); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE); @@ -250,7 +530,8 @@ url2 = OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'a'}], [], []], + null, 'SW-generated redirect to same-origin out-scope.'); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref'; @@ -258,7 +539,8 @@ url2 = OUT_SCOPE + '#ref'; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'x'}], [], []], + 'x', 'SW-generated redirect to same-origin out-scope with a hash fragment.'); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE + '#ref2') + '#ref'; @@ -266,7 +548,8 @@ url2 = OUT_SCOPE + '#ref2'; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'x'}], [], []], + 'x', 'SW-generated redirect to same-origin out-scope with different hash ' + 'fragments.'); @@ -275,7 +558,15 @@ url2 = SCOPE1; redirect_test( url1, url2, - [[{url: url1}, {url: url2}], [], []], + [ + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', 'SW-generated redirect to same-origin same-scope.'); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE2); @@ -283,7 +574,12 @@ url2 = SCOPE2; redirect_test( url1, url2, - [[{url: url1}], [{url: url2}], []], + [ + [{url: url1, resultingClientIdTag: 'x'}], + [{url: url2, resultingClientIdTag: 'x'}], + [] + ], + 'x', 'SW-generated redirect to same-origin other-scope.'); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); @@ -291,7 +587,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'a'}], [], []], + null, 'SW-generated redirect to other-origin out-scope.'); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); @@ -300,10 +597,11 @@ redirect_test( url1, url2, [ - [{url: url1}], + [{url: url1, resultingClientIdTag: 'a'}], [], - [{url: url2}] + [{url: url2, resultingClientIdTag: 'x'}] ], + 'x', 'SW-generated redirect to other-origin in-scope.'); @@ -314,7 +612,8 @@ url2 = OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'x'}], [], []], + 'x', 'SW-fetched redirect to same-origin out-scope.'); url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1); @@ -322,7 +621,15 @@ url2 = SCOPE1; redirect_test( url1, url2, - [[{url: url1}, {url: url2}], [], []], + [ + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', 'SW-fetched redirect to same-origin same-scope.'); url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2); @@ -331,10 +638,11 @@ redirect_test( url1, url2, [ - [{url: url1}], - [{url: url2}], + [{url: url1, resultingClientIdTag: 'x'}], + [{url: url2, resultingClientIdTag: 'x'}], [] ], + 'x', 'SW-fetched redirect to same-origin other-scope.'); url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); @@ -342,7 +650,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'a'}], [], []], + null, 'SW-fetched redirect to other-origin out-scope.'); url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); @@ -351,10 +660,11 @@ redirect_test( url1, url2, [ - [{url: url1}], + [{url: url1, resultingClientIdTag: 'a'}], [], - [{url: url2}] + [{url: url2, resultingClientIdTag: 'x'}] ], + 'x', 'SW-fetched redirect to other-origin in-scope.'); @@ -366,7 +676,8 @@ url2 = OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'x'}], [], []], + 'x', 'Redirect to same-origin out-scope with opaque redirect response.'); url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE1); @@ -374,7 +685,15 @@ url2 = SCOPE1; redirect_test( url1, url2, - [[{url: url1}, {url: url2}], [], []], + [ + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', 'Redirect to same-origin same-scope with opaque redirect response.'); url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE2); @@ -382,7 +701,12 @@ url2 = SCOPE2; redirect_test( url1, url2, - [[{url: url1}], [{url: url2}], []], + [ + [{url: url1, resultingClientIdTag: 'x'}], + [{url: url2, resultingClientIdTag: 'x'}], + [] + ], + 'x', 'Redirect to same-origin other-scope with opaque redirect response.'); url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); @@ -390,7 +714,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'a'}], [], []], + null, 'Redirect to other-origin out-scope with opaque redirect response.'); url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); @@ -398,12 +723,18 @@ url2 = OTHER_ORIGIN_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], [{url: url2}]], + [ + [{url: url1, resultingClientIdTag: 'a'}], + [], + [{url: url2, resultingClientIdTag: 'x'}] + ], + 'x', 'Redirect to other-origin in-scope with opaque redirect response.'); url= SCOPE1 + 'sw=manual&noLocationRedirect'; redirect_test( - url, url, [[{url}], [], []], + url, url, [[{url, resultingClientIdTag: 'x'}], [], []], + 'x', 'No location redirect response.'); @@ -414,7 +745,8 @@ url2 = OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'x'}], [], []], + 'x', 'Redirect to same-origin out-scope with opaque redirect response which ' + 'is passed through Cache.'); @@ -424,10 +756,14 @@ redirect_test( url1, url2, [ - [{url: url1}, {url: url2}], + [ + {url: url1, resultingClientIdTag: 'x'}, + {url: url2, resultingClientIdTag: 'x'} + ], [], [] ], + 'x', 'Redirect to same-origin same-scope with opaque redirect response which ' + 'is passed through Cache.'); @@ -437,10 +773,11 @@ redirect_test( url1, url2, [ - [{url: url1}], - [{url: url2}], + [{url: url1, resultingClientIdTag: 'x'}], + [{url: url2, resultingClientIdTag: 'x'}], [] ], + 'x', 'Redirect to same-origin other-scope with opaque redirect response which ' + 'is passed through Cache.'); @@ -450,7 +787,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1}], [], []], + [[{url: url1, resultingClientIdTag: 'a'}], [], []], + null, 'Redirect to other-origin out-scope with opaque redirect response which ' + 'is passed through Cache.'); @@ -461,10 +799,11 @@ redirect_test( url1, url2, [ - [{url: url1}], + [{url: url1, resultingClientIdTag: 'a'}], [], - [{url: url2}], + [{url: url2, resultingClientIdTag: 'x'}], ], + 'x', 'Redirect to other-origin in-scope with opaque redirect response which ' + 'is passed through Cache.'); @@ -472,7 +811,8 @@ url = SCOPE1 + 'sw=manualThroughCache&noLocationRedirect'; redirect_test( url, url, - [[{url}], [], []], + [[{url, resultingClientIdTag: 'x'}], [], []], + 'x', 'No location redirect response via Cache.'); // Clean up the test environment. This promise_test() needs to be the last one. diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-other-origin.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-other-origin.html index 0d2825f3109..d82571d1a3c 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-other-origin.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-other-origin.html @@ -44,6 +44,20 @@ function get_request_infos(worker) { }); } +function get_clients(worker, actual_ids) { + return new Promise(function(resolve) { + var channel = new MessageChannel(); + channel.port1.onmessage = (msg) => { + resolve(msg.data.clients); + }; + worker.postMessage({ + command: 'getClients', + actual_ids, + port: channel.port2 + }, [channel.port2]); + }); +} + window.addEventListener('message', on_message, false); function on_message(e) { @@ -59,6 +73,11 @@ function on_message(e) { .then(function(data) { send_result(e.data.id, data); }); + } else if (command == 'get_clients') { + get_clients(worker, e.data.message.actual_ids) + .then(function(data) { + send_result(e.data.id, data); + }); } else if (command == 'unregister') { registration.unregister() .then(function() { diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js index bf0a3a8d9e0..0c5bc3bd9aa 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js @@ -5,6 +5,13 @@ var cacheName = 'urls-' + self.registration.scope; var waitUntilPromiseList = []; +// Sends the requests seen by this worker. The output is: +// { +// requestInfos: [ +// {url: url1, resultingClientId: id1}, +// {url: url2, resultingClientId: id2}, +// ] +// } async function getRequestInfos(event) { // Wait for fetch events to finish. await Promise.all(waitUntilPromiseList); @@ -15,8 +22,11 @@ async function getRequestInfos(event) { const requestList = await cache.keys(); const requestInfos = []; for (let i = 0; i < requestList.length; i++) { + const response = await cache.match(requestList[i]); + const body = await response.json(); requestInfos[i] = { url: requestList[i].url, + resultingClientId: body.resultingClientId }; } await caches.delete(cacheName); @@ -24,13 +34,50 @@ async function getRequestInfos(event) { event.data.port.postMessage({requestInfos}); } +// Sends the results of clients.get(id) from this worker. The +// input is: +// { +// actual_ids: {a: id1, b: id2, x: id3} +// } +// +// The output is: +// { +// clients: { +// a: {found: false}, +// b: {found: false}, +// x: { +// id: id3, +// url: url1, +// found: true +// } +// } +// } +async function getClients(event) { + // |actual_ids| is like: + // {a: id1, b: id2, x: id3} + const actual_ids = event.data.actual_ids; + const result = {} + for (let key of Object.keys(actual_ids)) { + const id = actual_ids[key]; + const client = await self.clients.get(id); + if (client === undefined) + result[key] = {found: false}; + else + result[key] = {found: true, url: client.url, id: client.id}; + } + event.data.port.postMessage({clients: result}); +} + self.addEventListener('message', async function(event) { if (event.data.command == 'getRequestInfos') { event.waitUntil(getRequestInfos(event)); return; } - // TODO(falken): Add a getClientInfos command to test Clients API. + if (event.data.command == 'getClients') { + event.waitUntil(getClients(event)); + return; + } }); function get_query_params(url) { @@ -49,7 +96,11 @@ function get_query_params(url) { self.addEventListener('fetch', function(event) { var waitUntilPromise = caches.open(cacheName).then(function(cache) { - return cache.put(event.request, new Response()); + const responseBody = {}; + responseBody['resultingClientId'] = event.resultingClientId; + const headers = new Headers({'Content-Type': 'application/json'}); + const response = new Response(JSON.stringify(responseBody), {headers}); + return cache.put(event.request, response); }); event.waitUntil(waitUntilPromise); diff --git a/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html index acf0d7d575b..1b86552a1cb 100644 --- a/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html +++ b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html @@ -8,7 +8,7 @@ async_test(t => { const utter = new SpeechSynthesisUtterance('1'); utter.onerror = t.step_func_done((e) => { - assert_equals(e.name, "not-allowed"); + assert_equals(e.error, "not-allowed"); }); utter.onend = t.step_func_done(() => assert_unreached()); speechSynthesis.speak(utter); diff --git a/tests/wpt/web-platform-tests/speech-api/SpeechSynthesisErrorEvent-constructor.html b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesisErrorEvent-constructor.html new file mode 100644 index 00000000000..61e179cca47 --- /dev/null +++ b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesisErrorEvent-constructor.html @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +/* +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)] +interface SpeechSynthesisErrorEvent : SpeechSynthesisErrorEvent { + readonly attribute SpeechSynthesisErrorCode error; +}; +*/ +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent(); + }); +}, "SpeechSynthesisErrorEvent with no arguments throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type"); + }); +}, "SpeechSynthesisErrorEvent with no eventInitDict throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type", {}); + }); +}, `SpeechSynthesisErrorEvent with empty eventInitDict throws TypeError (requires + utterance and error)`); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type", {error:"not-allowed"}); + }); +}, `SpeechSynthesisErrorEvent with eventInitDict without utterance throws + TypeError`); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisErrorEvent("type", {utterance: new SpeechSynthesisUtterance()}); + }); +}, `SpeechSynthesisErrorEvent with eventInitDict without error throws + TypeError`); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisErrorEvent("type", {utterance: utterance, error:"not-allowed"}); + assert_equals(event.utterance, utterance); + assert_equals(event.error, "not-allowed"); + assert_equals(event.charIndex, 0); + assert_equals(event.elapsedTime, 0); + assert_equals(event.name, ""); +}, "SpeechSynthesisErrorEvent with eventInitDict having utterance and error"); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisErrorEvent("type", { + utterance: utterance, + charIndex: 5, + elapsedTime: 100, + name: "foo", + error: "synthesis-failed" + }); + assert_equals(event.bubbles, false); + assert_equals(event.cancelable, false); + assert_equals(event.type, "type"); + assert_equals(event.utterance, utterance); + assert_equals(event.charIndex, 5); + assert_equals(event.elapsedTime, 100); + assert_equals(event.name, "foo"); + assert_equals(event.error, "synthesis-failed"); +}, "SpeechSynthesisErrorEvent with custom eventInitDict"); + +test(() => { + function createEventFunc(error) { + return () => { + new SpeechSynthesisErrorEvent("type", { + utterance: new SpeechSynthesisUtterance(), + error: error + }); + }; + }; + assert_throws(new TypeError(), createEventFunc("")); + assert_throws(new TypeError(), createEventFunc("foo")); + assert_throws(new TypeError(), createEventFunc("bar")); +}, "SpeechSynthesisErrorEvent with wrong error enum"); +</script> diff --git a/tests/wpt/web-platform-tests/speech-api/SpeechSynthesisEvent-constructor.html b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesisEvent-constructor.html new file mode 100644 index 00000000000..47a37d25d97 --- /dev/null +++ b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesisEvent-constructor.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +/* +[Exposed=Window, + Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)] +interface SpeechSynthesisEvent : Event { + readonly attribute SpeechSynthesisUtterance utterance; + readonly attribute unsigned long charIndex; + readonly attribute float elapsedTime; + readonly attribute DOMString name; +}; +*/ +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent(); + }); +}, "SpeechSynthesisEvent with no arguments throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent("type"); + }); +}, "SpeechSynthesisEvent with no eventInitDict throws TypeError"); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent("type", {}); + }); +}, `SpeechSynthesisEvent with empty eventInitDict throws TypeError (requires + utterance)`); + +test(() => { + assert_throws(new TypeError(), () => { + new SpeechSynthesisEvent("type", {charIndex: 10, elapsedTime: 50, name:"foo"}); + }); +}, `SpeechSynthesisEvent with eventInitDict not having utterance throws + TypeError`); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisEvent("type", {utterance: utterance}); + assert_equals(event.utterance, utterance); + assert_equals(event.charIndex, 0); + assert_equals(event.elapsedTime, 0); + assert_equals(event.name, ""); +}, "SpeechSynthesisEvent with eventInitDict having an utterance"); + +test(() => { + const utterance = new SpeechSynthesisUtterance("foo"); + const event = new SpeechSynthesisEvent("type", { + utterance: utterance, + charIndex: 5, + elapsedTime: 100, + name: "foo" + }); + assert_equals(event.bubbles, false); + assert_equals(event.cancelable, false); + assert_equals(event.type, "type"); + assert_equals(event.utterance, utterance); + assert_equals(event.charIndex, 5); + assert_equals(event.elapsedTime, 100); + assert_equals(event.name, "foo"); +}, "SpeechSynthesisEvent with custom eventInitDict"); +</script> diff --git a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py index 9be0d8966ec..1f08088eb46 100644 --- a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py +++ b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py @@ -267,6 +267,7 @@ class SourceFile(object): self.name_prefix("MANIFEST") or self.filename == "META.yml" or self.filename.startswith(".") or + self.filename.endswith(".headers") or self.type_flag == "support" or self.in_non_test_dir()) diff --git a/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py index 57a175cae91..ad59055de73 100644 --- a/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py +++ b/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py @@ -36,6 +36,7 @@ def items(s): "foo/resources/test.html", "foo/support/test.html", "foo/test-support.html", + "foo/foo-manual.html.headers", "css/common/test.html", "css/CSS2/archive/test.html", ]) @@ -64,6 +65,7 @@ def test_not_name_is_non_test(rel_path): @pytest.mark.parametrize("rel_path", [ + "foo/foo-manual.html", "html/test-manual.html", "html/test-manual.xhtml", "html/test-manual.https.html", diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py index 741ab0bcb74..e49c8287c59 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py @@ -75,7 +75,7 @@ class TestUsingServer(unittest.TestCase): req.add_data(body) if auth is not None: - req.add_header("Authorization", b"Basic %s" % base64.b64encode(("%s:%s" % auth).encode("utf-8"))) + req.add_header("Authorization", "Basic %s" % base64.b64encode('%s:%s' % auth)) return urlopen(req) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py index 759a096b799..7ac410abfee 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py @@ -88,16 +88,19 @@ class TestFileHandler(TestUsingServer): self.request("/document.txt", headers={"Range":"bytes=%i-%i" % (len(expected), len(expected) + 10)}) self.assertEqual(cm.exception.code, 416) + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_config(self): resp = self.request("/sub.sub.txt") expected = b"localhost localhost %i" % self.server.port assert resp.read().rstrip() == expected + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_headers(self): resp = self.request("/sub_headers.sub.txt", headers={"X-Test": "PASS"}) expected = b"PASS" assert resp.read().rstrip() == expected + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_params(self): resp = self.request("/sub_params.sub.txt", query="test=PASS") expected = b"PASS" diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py index 7739af5e26e..83b2c621641 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py @@ -57,35 +57,40 @@ class TestSlice(TestUsingServer): self.assertEqual(resp.read(), expected[:10]) class TestSub(TestUsingServer): + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_config(self): resp = self.request("/sub.txt", query="pipe=sub") - expected = b"localhost localhost %i" % self.server.port + expected = "localhost localhost %i" % self.server.port self.assertEqual(resp.read().rstrip(), expected) @pytest.mark.xfail(sys.platform == "win32", reason="https://github.com/web-platform-tests/wpt/issues/12949") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_file_hash(self): resp = self.request("/sub_file_hash.sub.txt") - expected = b""" + expected = """ md5: JmI1W8fMHfSfCarYOSxJcw== sha1: nqpWqEw4IW8NjD6R375gtrQvtTo= sha224: RqQ6fMmta6n9TuA/vgTZK2EqmidqnrwBAmQLRQ== sha256: G6Ljg1uPejQxqFmvFOcV/loqnjPTW5GSOePOfM/u0jw= sha384: lkXHChh1BXHN5nT5BYhi1x67E1CyYbPKRKoF2LTm5GivuEFpVVYtvEBHtPr74N9E -sha512: r8eLGRTc7ZznZkFjeVLyo6/FyQdra9qmlYCwKKxm3kfQAswRS9+3HsYk3thLUhcFmmWhK4dXaICzJwGFonfXwg==""" +sha512: r8eLGRTc7ZznZkFjeVLyo6/FyQdra9qmlYCwKKxm3kfQAswRS9+3HsYk3thLUhcFmmWhK4dXaICz +JwGFonfXwg==""" self.assertEqual(resp.read().rstrip(), expected.strip()) def test_sub_file_hash_unrecognized(self): with self.assertRaises(urllib.error.HTTPError): self.request("/sub_file_hash_unrecognized.sub.txt") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_headers(self): resp = self.request("/sub_headers.txt", query="pipe=sub", headers={"X-Test": "PASS"}) - expected = b"PASS" + expected = "PASS" self.assertEqual(resp.read().rstrip(), expected) @pytest.mark.xfail(sys.platform == "win32", reason="https://github.com/web-platform-tests/wpt/issues/12949") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_location(self): resp = self.request("/sub_location.sub.txt?query_string") expected = """ @@ -96,27 +101,30 @@ pathname: /sub_location.sub.txt port: {0} query: ?query_string scheme: http -server: http://localhost:{0}""".format(self.server.port).encode("ascii") +server: http://localhost:{0}""".format(self.server.port) self.assertEqual(resp.read().rstrip(), expected.strip()) + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_params(self): resp = self.request("/sub_params.txt", query="test=PASS&pipe=sub") - expected = b"PASS" + expected = "PASS" self.assertEqual(resp.read().rstrip(), expected) + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_url_base(self): resp = self.request("/sub_url_base.sub.txt") - self.assertEqual(resp.read().rstrip(), b"Before / After") + self.assertEqual(resp.read().rstrip(), "Before / After") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_uuid(self): resp = self.request("/sub_uuid.sub.txt") - self.assertRegexpMatches(resp.read().rstrip(), b"Before [a-f0-9-]+ After") + self.assertRegexpMatches(resp.read().rstrip(), r"Before [a-f0-9-]+ After") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_sub_var(self): resp = self.request("/sub_var.sub.txt") port = self.server.port - print(port, type(port)) - expected = b"localhost %d A %d B localhost C" % (port, port) + expected = "localhost %s A %s B localhost C" % (port, port) self.assertEqual(resp.read().rstrip(), expected) class TestTrickle(TestUsingServer): @@ -136,10 +144,12 @@ class TestTrickle(TestUsingServer): self.assertEqual(resp.info()["Expires"], "0") class TestPipesWithVariousHandlers(TestUsingServer): + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_with_python_file_handler(self): resp = self.request("/test_string.py", query="pipe=slice(null,2)") - self.assertEqual(resp.read(), b"PA") + self.assertEqual(resp.read(), "PA") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_with_python_func_handler(self): @wptserve.handlers.handler def handler(request, response): @@ -147,8 +157,9 @@ class TestPipesWithVariousHandlers(TestUsingServer): route = ("GET", "/test/test_pipes_1/", handler) self.server.router.register(*route) resp = self.request(route[1], query="pipe=slice(null,2)") - self.assertEqual(resp.read(), b"PA") + self.assertEqual(resp.read(), "PA") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_with_python_func_handler_using_response_writer(self): @wptserve.handlers.handler def handler(request, response): @@ -157,8 +168,9 @@ class TestPipesWithVariousHandlers(TestUsingServer): self.server.router.register(*route) resp = self.request(route[1], query="pipe=slice(null,2)") # slice has not been applied to the response, because response.writer was used. - self.assertEqual(resp.read(), b"PASS") + self.assertEqual(resp.read(), "PASS") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_header_pipe_with_python_func_using_response_writer(self): @wptserve.handlers.handler def handler(request, response): @@ -168,8 +180,9 @@ class TestPipesWithVariousHandlers(TestUsingServer): resp = self.request(route[1], query="pipe=header(X-TEST,FAIL)") # header pipe was ignored, because response.writer was used. self.assertFalse(resp.info().get("X-TEST")) - self.assertEqual(resp.read(), b"CONTENT") + self.assertEqual(resp.read(), "CONTENT") + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_with_json_handler(self): @wptserve.handlers.json_handler def handler(request, response): @@ -177,29 +190,32 @@ class TestPipesWithVariousHandlers(TestUsingServer): route = ("GET", "/test/test_pipes_2/", handler) self.server.router.register(*route) resp = self.request(route[1], query="pipe=slice(null,2)") - self.assertEqual(resp.read(), b'"{') + self.assertEqual(resp.read(), '"{') + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_slice_with_as_is_handler(self): resp = self.request("/test.asis", query="pipe=slice(null,2)") self.assertEqual(202, resp.getcode()) self.assertEqual("Giraffe", resp.msg) self.assertEqual("PASS", resp.info()["X-Test"]) # slice has not been applied to the response, because response.writer was used. - self.assertEqual(b"Content", resp.read()) + self.assertEqual("Content", resp.read()) + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_headers_with_as_is_handler(self): resp = self.request("/test.asis", query="pipe=header(X-TEST,FAIL)") self.assertEqual(202, resp.getcode()) self.assertEqual("Giraffe", resp.msg) # header pipe was ignored. self.assertEqual("PASS", resp.info()["X-TEST"]) - self.assertEqual(b"Content", resp.read()) + self.assertEqual("Content", resp.read()) + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_trickle_with_as_is_handler(self): t0 = time.time() resp = self.request("/test.asis", query="pipe=trickle(1:d2:5:d1:r2)") t1 = time.time() - self.assertTrue(b'Content' in resp.read()) + self.assertTrue('Content' in resp.read()) self.assertGreater(6, t1-t0) if __name__ == '__main__': diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_request.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_request.py index 983539260a5..096c0535b9a 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_request.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_request.py @@ -1,3 +1,5 @@ +import sys + import pytest wptserve = pytest.importorskip("wptserve") @@ -115,6 +117,7 @@ class TestRequest(TestUsingServer): class TestAuth(TestUsingServer): + @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_auth(self): @wptserve.handlers.handler def handler(request, response): @@ -124,4 +127,4 @@ class TestAuth(TestUsingServer): self.server.router.register(*route) resp = self.request(route[1], auth=("test", "PASS")) self.assertEqual(200, resp.getcode()) - self.assertEqual([b"test", b"PASS"], resp.read().split(b" ")) + self.assertEqual(["test", "PASS"], resp.read().split(" ")) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py index 33a43e1f06b..ad96f591a3a 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py @@ -1,6 +1,5 @@ from cgi import escape from collections import deque -import base64 import gzip as gzip_module import hashlib import os @@ -274,9 +273,8 @@ def slice(request, response, start, end=None): (spelled "null" in a query string) to indicate the end of the file. """ - content = resolve_content(response)[start:end] - response.content = content - response.headers.set("Content-Length", len(content)) + content = resolve_content(response) + response.content = content[start:end] return response @@ -394,7 +392,7 @@ class SubFunctions(object): @staticmethod def file_hash(request, algorithm, path): - assert isinstance(algorithm, text_type) + algorithm = algorithm.decode("ascii") if algorithm not in SubFunctions.supported_algorithms: raise ValueError("Unsupported encryption algorithm: '%s'" % algorithm) @@ -402,7 +400,7 @@ class SubFunctions(object): absolute_path = os.path.join(request.doc_root, path) try: - with open(absolute_path, "rb") as f: + with open(absolute_path) as f: hash_obj.update(f.read()) except IOError: # In this context, an unhandled IOError will be interpreted by the @@ -412,7 +410,7 @@ class SubFunctions(object): # the path to the file to be hashed is invalid. raise Exception('Cannot open file for hash computation: "%s"' % absolute_path) - return base64.b64encode(hash_obj.digest()).strip() + return hash_obj.digest().encode('base64').strip() def template(request, content, escape_type="html"): #TODO: There basically isn't any error handling here @@ -427,6 +425,7 @@ def template(request, content, escape_type="html"): tokens = deque(tokens) token_type, field = tokens.popleft() + field = field.decode("ascii") if token_type == "var": variable = field @@ -471,14 +470,14 @@ def template(request, content, escape_type="html"): raise Exception("Undefined template variable %s" % field) while tokens: - ttype, tfield = tokens.popleft() + ttype, field = tokens.popleft() if ttype == "index": - value = value[tfield] + value = value[field] elif ttype == "arguments": - value = value(request, *tfield) + value = value(request, *field) else: raise Exception( - "unexpected token type %s (token '%r'), expected ident or arguments" % (ttype, tfield) + "unexpected token type %s (token '%r'), expected ident or arguments" % (ttype, field) ) assert isinstance(value, (int, (binary_type, text_type))), tokens @@ -486,19 +485,12 @@ def template(request, content, escape_type="html"): if variable is not None: variables[variable] = value - if field == "GET" and not isinstance(value, str): - value = value.decode("utf-8") - escape_func = {"html": lambda x:escape(x, quote=True), "none": lambda x:x}[escape_type] #Should possibly support escaping for other contexts e.g. script #TODO: read the encoding of the response - if isinstance(value, binary_type): - value = value.decode("utf-8") - elif isinstance(value, int): - value = text_type(value) - return escape_func(value).encode("utf-8") + return escape_func(text_type(value)).encode("utf-8") template_regexp = re.compile(br"{{([^}]*)}}") new_content = template_regexp.sub(config_replacement, content) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py index 233ff151c28..cb575ccdba4 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py @@ -1,7 +1,7 @@ import base64 import cgi from six.moves.http_cookies import BaseCookie -from six import BytesIO, binary_type, text_type +from six import BytesIO import tempfile from six.moves.urllib.parse import parse_qsl, urlsplit @@ -318,8 +318,8 @@ class Request(object): def cookies(self): if self._cookies is None: parser = BaseCookie() - cookie_headers = self.headers.get("cookie", u"") - parser.load(cookie_headers.encode("utf-8")) + cookie_headers = self.headers.get("cookie", "") + parser.load(cookie_headers) cookies = Cookies() for key, value in parser.iteritems(): cookies[key] = CookieValue(value) @@ -355,16 +355,6 @@ class H2Request(Request): super(H2Request, self).__init__(request_handler) -def maybedecode(s): - if isinstance(s, text_type): - return s - - if isinstance(s, binary_type): - return s.decode("ascii") - - raise TypeError("Unexpected value in RequestHeaders: %r" % s) - - class RequestHeaders(dict): """Dictionary-like API for accessing request headers.""" def __init__(self, items): @@ -379,17 +369,15 @@ class RequestHeaders(dict): for value in values: # getallmatchingheaders returns raw header lines, so # split to get name, value - multiples.append(maybedecode(value).split(':', 1)[1].strip()) - headers = multiples + multiples.append(value.split(':', 1)[1].strip()) + dict.__setitem__(self, key, multiples) else: - headers = [maybedecode(items[header])] - dict.__setitem__(self, maybedecode(key), headers) + dict.__setitem__(self, key, [items[header]]) def __getitem__(self, key): """Get all headers of a certain (case-insensitive) name. If there is more than one, the values are returned comma separated""" - key = maybedecode(key) values = dict.__getitem__(self, key.lower()) if len(values) == 1: return values[0] @@ -415,7 +403,6 @@ class RequestHeaders(dict): def get_list(self, key, default=missing): """Get all the header values for a particular field name as a list""" - key = maybedecode(key) try: return dict.__getitem__(self, key.lower()) except KeyError: @@ -425,7 +412,6 @@ class RequestHeaders(dict): raise def __contains__(self, key): - key = maybedecode(key) return dict.__contains__(self, key.lower()) def iteritems(self): @@ -613,7 +599,6 @@ class Authentication(object): if "authorization" in headers: header = headers.get("authorization") - assert isinstance(header, text_type) auth_type, data = header.split(" ", 1) if auth_type in auth_schemes: self.username, self.password = auth_schemes[auth_type](data) @@ -621,6 +606,5 @@ class Authentication(object): raise HTTPException(400, "Unsupported authentication scheme %s" % auth_type) def decode_basic(self, data): - assert isinstance(data, text_type) - decoded_data = base64.decodestring(data.encode("utf-8")) - return decoded_data.decode("utf-8").split(":", 1) + decoded_data = base64.decodestring(data) + return decoded_data.split(":", 1) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py index 483265bf084..44299cc994e 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py @@ -183,10 +183,8 @@ class Response(object): True, the entire content of the file will be returned as a string facilitating non-streaming operations like template substitution. """ - if isinstance(self.content, binary_type): + if isinstance(self.content, (binary_type, text_type)): yield self.content - elif isinstance(self.content, text_type): - yield self.content.encode("utf-8") elif hasattr(self.content, "read"): if read_file: yield self.content.read() diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key.py index 2b3414c5ebf..cbfb5bcef43 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key.py @@ -16,6 +16,14 @@ def test_no_browsing_context(session, closed_window, key_chain): key_chain.key_up("a").perform() +def test_element_not_focused(session, test_actions_page, key_chain): + key_reporter = session.find.css("#keys", all=False) + + key_chain.key_down("a").key_up("a").perform() + + assert get_keys(key_reporter) == "" + + def test_backspace_erases_keys(session, key_reporter, key_chain): key_chain \ .send_keys("efcd") \ diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_modifiers.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_modifiers.py index 55dc9280c62..e8ea30dd3d7 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_modifiers.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_modifiers.py @@ -4,6 +4,19 @@ from tests.perform_actions.support.keys import Keys @pytest.mark.parametrize("modifier", [Keys.SHIFT, Keys.R_SHIFT]) +def test_shift_modifier_and_non_printable_keys(session, key_reporter, key_chain, modifier): + key_chain \ + .send_keys("foo") \ + .key_down(modifier) \ + .key_down(Keys.BACKSPACE) \ + .key_up(modifier) \ + .key_up(Keys.BACKSPACE) \ + .perform() + + assert key_reporter.property("value") == "fo" + + +@pytest.mark.parametrize("modifier", [Keys.SHIFT, Keys.R_SHIFT]) def test_shift_modifier_generates_capital_letters(session, key_reporter, key_chain, modifier): key_chain \ .send_keys("b") \ diff --git a/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension-helper.js new file mode 100644 index 00000000000..659ec59b8df --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension-helper.js @@ -0,0 +1,42 @@ +'use strict'; + +// Construct an RTCIceTransport instance. The instance will automatically be +// cleaned up when the test finishes. +function makeIceTransport(t) { + const iceTransport = new RTCIceTransport(); + t.add_cleanup(() => iceTransport.stop()); + return iceTransport; +} + +// Construct two RTCIceTransport instances, configure them to exchange +// candidates, then gather() them. +// Returns a 2-list: [ RTCIceTransport, RTCIceTransport ] +function makeAndGatherTwoIceTransports(t) { + const localTransport = makeIceTransport(t); + const remoteTransport = makeIceTransport(t); + localTransport.onicecandidate = e => { + if (e.candidate) { + remoteTransport.addRemoteCandidate(e.candidate); + } + }; + remoteTransport.onicecandidate = e => { + if (e.candidate) { + localTransport.addRemoteCandidate(e.candidate); + } + }; + localTransport.gather({}); + remoteTransport.gather({}); + return [ localTransport, remoteTransport ]; +} + +// Construct two RTCIceTransport instances, configure them to exchange +// candidates and parameters, then gather() and start() them. +// Returns a 2-list: +// [ controlling RTCIceTransport, +// controlled RTCIceTransport ] +function makeGatherAndStartTwoIceTransports(t) { + const [ localTransport, remoteTransport ] = makeAndGatherTwoIceTransports(t); + localTransport.start(remoteTransport.getLocalParameters(), 'controlling'); + remoteTransport.start(localTransport.getLocalParameters(), 'controlled'); + return [ localTransport, remoteTransport ]; +} diff --git a/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html index 9c6cec7e1e4..5adee9fbe61 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html @@ -3,12 +3,18 @@ <title>RTCIceTransport-extensions.https.html</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="RTCIceTransport-extension-helper.js"></script> <script> 'use strict'; // These tests are based on the following extension specification: // https://w3c.github.io/webrtc-ice/ +// The following helper functions are called from +// RTCIceTransport-extension-helper.js: +// makeIceTransport +// makeGatherAndStartTwoIceTransports + function makeIceTransport(t) { const iceTransport = new RTCIceTransport(); t.add_cleanup(() => iceTransport.stop()); @@ -240,22 +246,8 @@ test(t => { 'later called with different remote parameters'); promise_test(async t => { - const localTransport = makeIceTransport(t); - const remoteTransport = makeIceTransport(t); - localTransport.onicecandidate = e => { - if (e.candidate) { - remoteTransport.addRemoteCandidate(e.candidate); - } - }; - remoteTransport.onicecandidate = e => { - if (e.candidate) { - localTransport.addRemoteCandidate(e.candidate); - } - }; - localTransport.gather({}); - remoteTransport.gather({}); - localTransport.start(remoteTransport.getLocalParameters(), 'controlling'); - remoteTransport.start(localTransport.getLocalParameters(), 'controlled'); + const [ localTransport, remoteTransport ] = + makeGatherAndStartTwoIceTransports(t); const localWatcher = new EventWatcher(t, localTransport, 'statechange'); const remoteWatcher = new EventWatcher(t, remoteTransport, 'statechange'); await Promise.all([ diff --git a/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html b/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html index 1e08016d75a..33025451b25 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html @@ -3,6 +3,7 @@ <title>RTCQuicStream.https.html</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="RTCIceTransport-extension-helper.js"></script> <script src="RTCQuicTransport-helper.js"></script> <script> 'use strict'; @@ -11,10 +12,10 @@ // https://w3c.github.io/webrtc-quic/ // The following helper functions are called from RTCQuicTransport-helper.js: -// makeQuicTransport +// makeStandaloneQuicTransport -test(t => { - const quicTransport = makeQuicTransport(t, []); +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); const quicStream = quicTransport.createStream(); assert_equals(quicStream.transport, quicTransport, 'Expect transport to be set to the creating RTCQuicTransport.'); @@ -25,14 +26,14 @@ test(t => { 'Expect write buffered amount to be 0.'); }, 'createStream() returns an RTCQuicStream with initial properties set.'); -test(t => { - const quicTransport = makeQuicTransport(t, []); +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); quicTransport.stop(); assert_throws('InvalidStateError', () => quicTransport.createStream()); }, 'createStream() throws if the transport is closed.'); -test(t => { - const quicTransport = makeQuicTransport(t, []); +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); const firstQuicStream = quicTransport.createStream(); const secondQuicStream = quicTransport.createStream(); quicTransport.stop(); diff --git a/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport-helper.js index 50d9e6666a2..3ea19d7a78e 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport-helper.js +++ b/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport-helper.js @@ -1,10 +1,82 @@ 'use strict'; -function makeQuicTransport(t, certificates) { - const iceTransport = new RTCIceTransport(); - t.add_cleanup(() => iceTransport.stop()); +// This file depends on RTCIceTransport-extension-helper.js which should be +// loaded from the main HTML file. +// The following helper functions are called from +// RTCIceTransport-extension-helper.js: +// makeIceTransport +// makeGatherAndStartTwoIceTransports + +// Return a promise to generate an RTCCertificate with the given keygen +// algorithm or a default one if none provided. +function generateCertificate(keygenAlgorithm) { + return RTCPeerConnection.generateCertificate({ + name: 'ECDSA', + namedCurve: 'P-256', + ...keygenAlgorithm, + }); +} + +// Construct an RTCQuicTransport instance with the given RTCIceTransport +// instance and the given certificates. The RTCQuicTransport instance will be +// automatically cleaned up when the test finishes. +function makeQuicTransport(t, iceTransport, certificates) { const quicTransport = new RTCQuicTransport(iceTransport, certificates); t.add_cleanup(() => quicTransport.stop()); return quicTransport; } +// Construct an RTCQuicTransport instance with a new RTCIceTransport instance +// and a single, newly-generated certificate. The RTCQuicTransport and +// RTCIceTransport instances will be automatically cleaned up when the test +// finishes. +async function makeStandaloneQuicTransport(t) { + const certificate = await generateCertificate(); + return makeQuicTransport(t, makeIceTransport(t), [ certificate ]); +} + +// Construct two RTCQuicTransport instances and each call start() with the other +// transport's local parameters. +// Returns a 2-list: +// [ server RTCQuicTransport, +// client RTCQuicTransport ] +async function makeAndStartTwoQuicTransports(t) { + const [ localCertificate, remoteCertificate ] = + await Promise.all([ generateCertificate(), generateCertificate() ]); + const [ localIceTransport, remoteIceTransport ] = + makeGatherAndStartTwoIceTransports(t); + const localQuicTransport = + makeQuicTransport(t, localIceTransport, [ localCertificate ]); + const remoteQuicTransport = + makeQuicTransport(t, remoteIceTransport, [ remoteCertificate ]); + localQuicTransport.start(remoteQuicTransport.getLocalParameters()); + remoteQuicTransport.start(localQuicTransport.getLocalParameters()); + return [ localQuicTransport, remoteQuicTransport ]; +} + +// Construct two RTCQuicTransport instances and wait for them to connect. +// Returns a 2-list: +// [ server RTCQuicTransport, +// client RTCQuicTransport ] +async function makeTwoConnectedQuicTransports(t) { + // Returns a promise that resolves when the transport fires a 'statechange' + // event to 'connected'. + function waitForConnected(transport) { + return new Promise((resolve, reject) => { + const eventHandler = t.step_func(() => { + assert_equals(transport.state, 'connected'); + transport.removeEventListener('statechange', eventHandler, false); + resolve(); + }); + transport.addEventListener('statechange', eventHandler, false); + }); + } + const [ localQuicTransport, remoteQuicTransport ] = + await makeAndStartTwoQuicTransports(t); + await Promise.all([ + waitForConnected(localQuicTransport), + waitForConnected(remoteQuicTransport), + ]); + return [ localQuicTransport, remoteQuicTransport ]; +} + diff --git a/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport.https.html b/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport.https.html index 703f424a638..ec79bc228ad 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCQuicTransport.https.html @@ -3,6 +3,7 @@ <title>RTCQuicTransport.https.html</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="RTCIceTransport-extension-helper.js"></script> <script src="RTCQuicTransport-helper.js"></script> <script> 'use strict'; @@ -10,36 +11,31 @@ // These tests are based on the following specification: // https://w3c.github.io/webrtc-quic/ +// The following helper functions are called from +// RTCIceTransport-extension-helper.js: +// makeIceTransport +// makeAndGatherTwoIceTransports + // The following helper functions are called from RTCQuicTransport-helper.js: // makeQuicTransport +// makeStandaloneQuicTransport +// makeAndStartTwoQuicTransports +// makeTwoConnectedQuicTransports -function generateCertificate(keygenAlgorithm) { - return RTCPeerConnection.generateCertificate({ - name: 'ECDSA', - namedCurve: 'P-256', - ...keygenAlgorithm, - }); -} - -test(t => { - // Don't use the makeQuicTransport helper so that the transport property can - // be verified. - const iceTransport = new RTCIceTransport(); - const quicTransport = new RTCQuicTransport(iceTransport, []); - t.add_cleanup(() => { - quicTransport.stop(); - iceTransport.stop(); - }); +promise_test(async t => { + const certificate = await generateCertificate(); + const iceTransport = makeIceTransport(t); + const quicTransport = makeQuicTransport(t, iceTransport, [ certificate ]); assert_equals(quicTransport.transport, iceTransport, 'Expect transport to be the same as the one passed in the constructor.'); assert_equals(quicTransport.state, 'new', `Expect state to be 'new'.`); assert_object_equals(quicTransport.getLocalParameters(), - { role: 'auto', fingerprints: [] }, + { role: 'auto', fingerprints: certificate.getFingerprints() }, 'Expect local parameters to be initialized.'); assert_equals(quicTransport.getRemoteParameters(), null, 'Expect no remote parameters.'); - assert_array_equals(quicTransport.getCertificates(), [], - 'Expect not certificates.'); + assert_array_equals(quicTransport.getCertificates(), [ certificate ], + 'Expect one certificate.'); assert_array_equals(quicTransport.getRemoteCertificates(), [], 'Expect no remote certificates.'); }, 'RTCQuicTransport initial properties are set.'); @@ -48,7 +44,8 @@ promise_test(async t => { const [ firstCertificate, secondCertificate ] = await Promise.all([ generateCertificate(), generateCertificate() ]); const quicTransport = - makeQuicTransport(t, [ firstCertificate, secondCertificate ]); + makeQuicTransport(t, makeIceTransport(t), + [ firstCertificate, secondCertificate ]); assert_array_equals(quicTransport.getCertificates(), [ firstCertificate, secondCertificate ]); }, 'getCertificates() returns the certificates passed in the constructor.'); @@ -57,11 +54,13 @@ promise_test(async t => { const [ firstCertificate, secondCertificate ] = await Promise.all([ generateCertificate(), generateCertificate() ]); const quicTransport = - makeQuicTransport(t, [ firstCertificate, secondCertificate ]); + makeQuicTransport(t, makeIceTransport(t), + [ firstCertificate, secondCertificate ]); assert_object_equals(quicTransport.getLocalParameters(), { role: 'auto', - fingerprints: [ firstCertificate.getFingerprints()[0], - secondCertificate.getFingerprints()[0] ], + fingerprints: + [ firstCertificate.getFingerprints()[0], + secondCertificate.getFingerprints()[0] ], }); assert_array_equals(quicTransport.getCertificates(), [ firstCertificate, secondCertificate ]); @@ -71,21 +70,119 @@ promise_test(async t => { promise_test(async t => { const expiredCertificate = await generateCertificate({ expires: 0 }); assert_throws(new TypeError(), - () => makeQuicTransport(t, [ expiredCertificate ])); + () => makeQuicTransport(t, makeIceTransport(t), [ expiredCertificate ])); }, 'RTCQuicTransport constructor throws if passed an expired certificate.'); -test(t => { - const iceTransport = new RTCIceTransport(); +promise_test(async t => { + const certificate = await generateCertificate(); + const iceTransport = makeIceTransport(t); iceTransport.stop(); assert_throws('InvalidStateError', - () => new RTCQuicTransport(iceTransport, [])); + () => makeQuicTransport(t, iceTransport, [ certificate ])); }, 'RTCQuicTransport constructor throws if passed a closed RTCIceTransport.'); -test(t => { - const quicTransport = makeQuicTransport(t, []); +promise_test(async t => { + const certificate = await generateCertificate(); + const iceTransport = makeIceTransport(t); + const firstQuicTransport = + makeQuicTransport(t, iceTransport, [ certificate ]); + assert_throws('InvalidStateError', + () => makeQuicTransport(t, iceTransport, [ certificate ])); +}, 'RTCQuicTransport constructor throws if passed an RTCIceTransport that ' + + 'already has an active RTCQuicTransport.'); + +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); quicTransport.stop(); assert_equals(quicTransport.state, 'closed'); }, `stop() changes state to 'closed'.`); +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); + quicTransport.transport.stop(); + assert_equals(quicTransport.state, 'closed'); +}, `RTCIceTransport.stop() changes RTCQuicTransport.state to 'closed'.`); + +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); + quicTransport.start(quicTransport.getLocalParameters()); + assert_equals(quicTransport.state, 'new'); +}, 'start() with a non-started RTCIceTransport does not change state.'); + +promise_test(async t => { + const certificate = await generateCertificate(); + const [ localIceTransport, remoteIceTransport ] = + makeAndGatherTwoIceTransports(t); + const quicTransport = + makeQuicTransport(t, localIceTransport, [ certificate ]); + quicTransport.start(quicTransport.getLocalParameters()); + const iceTransportWatcher = + new EventWatcher(t, remoteIceTransport, 'icecandidate'); + await iceTransportWatcher.wait_for('icecandidate'); + localIceTransport.start(remoteIceTransport.getLocalParameters(), + 'controlling'); + assert_equals(quicTransport.state, 'connecting'); +}, 'start() with a non-started RTCIceTransport later changes state to ' + + `'connecting' once the RTCIceTransport.start() is called.`); + +promise_test(async t => { + const certificate = await generateCertificate(); + const [ localIceTransport, remoteIceTransport ] = + makeAndGatherTwoIceTransports(t); + const quicTransport = + makeQuicTransport(t, localIceTransport, [ certificate ]); + const iceTransportWatcher = + new EventWatcher(t, remoteIceTransport, 'icecandidate'); + await iceTransportWatcher.wait_for('icecandidate'); + localIceTransport.start(remoteIceTransport.getLocalParameters()); + quicTransport.start(quicTransport.getLocalParameters()); + assert_equals(quicTransport.state, 'connecting'); +}, `start() with a started RTCIceTransport changes state to 'connecting'.`); + +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); + quicTransport.stop(); + assert_throws('InvalidStateError', + () => quicTransport.start(quicTransport.getLocalParameters())); +}, 'start() throws if called after stop().'); + +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); + quicTransport.transport.stop(); + assert_throws('InvalidStateError', + () => quicTransport.start(quicTransport.getLocalParameters())); +}, 'start() throws if called after the RTCIceTransport has stopped.'); + +promise_test(async t => { + const quicTransport = await makeStandaloneQuicTransport(t); + quicTransport.start(quicTransport.getLocalParameters()); + assert_throws('InvalidStateError', + () => quicTransport.start(quicTransport.getLocalParameters())); +}, 'start() throws if called twice.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeAndStartTwoQuicTransports(t); + const localWatcher = new EventWatcher(t, localQuicTransport, 'statechange'); + const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'statechange'); + await Promise.all([ + localWatcher.wait_for('statechange').then(() => { + assert_equals(localQuicTransport.state, 'connected'); + }), + remoteWatcher.wait_for('statechange').then(() => { + assert_equals(remoteQuicTransport.state, 'connected'); + }), + ]); +}, 'Two RTCQuicTransports connect to each other.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + localQuicTransport.stop(); + const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'statechange'); + await remoteWatcher.wait_for('statechange'); + assert_equals(remoteQuicTransport.state, 'closed'); +}, `stop() fires a statechange event to 'closed' on the remote transport`); + </script> diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini index b2ef943c060..bdd647de65c 100644 --- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini @@ -14,3 +14,6 @@ [WebGL test #44: could not create image (SVG)] expected: FAIL + [WebGL test #588: could not create image (SVG)] + expected: FAIL + |