From 7070adb96fd3755b39b42a39f1bdd71f9efa8800 Mon Sep 17 00:00:00 2001 From: Uzlopak <5059100+Uzlopak@users.noreply.github.com> Date: Sat, 19 Apr 2025 00:18:23 +0000 Subject: [PATCH 1/2] chore: update WPT --- .../wpt/fetch/api/body/mime-type.any.js | 2 +- .../fetch/api/resources/keepalive-helper.js | 2 +- test/fixtures/wpt/fetch/http-cache/README.md | 2 +- .../wpt/fetch/http-cache/http-cache.js | 3 ++ .../no-vary-search.tentative.any.js | 33 ++++++++++++ ...markup-mitigation-allowed-apis.https.html} | 46 ++++++++++------ test/fixtures/wpt/interfaces/dom.idl | 13 ++++- test/fixtures/wpt/interfaces/fedcm.idl | 2 +- test/fixtures/wpt/interfaces/html.idl | 4 ++ .../secure-payment-confirmation.idl | 10 +++- test/fixtures/wpt/interfaces/speech-api.idl | 22 +++++++- .../wpt/resources/chromium/webxr-test.js | 9 ++++ test/fixtures/wpt/resources/testdriver.js | 52 ++++++++++++++++++- test/fixtures/wpt/resources/testharness.js | 4 +- .../claim-using-registration.https.html | 2 +- .../resources/testharness-helpers.js | 2 +- ...er-immediately-before-installed.https.html | 4 +- .../unregister-immediately.https.html | 2 +- 18 files changed, 183 insertions(+), 31 deletions(-) create mode 100644 test/fixtures/wpt/fetch/http-cache/no-vary-search.tentative.any.js rename test/fixtures/wpt/fetch/security/dangling-markup/{dangling-markup-mitigation-allowed-apis.tentative.https.html => dangling-markup-mitigation-allowed-apis.https.html} (62%) diff --git a/test/fixtures/wpt/fetch/api/body/mime-type.any.js b/test/fixtures/wpt/fetch/api/body/mime-type.any.js index 67c9af7da2d..ed19309bdb2 100644 --- a/test/fixtures/wpt/fetch/api/body/mime-type.any.js +++ b/test/fixtures/wpt/fetch/api/body/mime-type.any.js @@ -87,7 +87,7 @@ [ () => new Request("about:blank", { method: "POST", body: new Blob([""], { type: "Text/Plain" }), headers: [["Content-Type", "Text/Html"]] }), - () => new Response(new Blob([""], { type: "Text/Plain" }, { headers: [["Content-Type", "Text/Html"]] })) + () => new Response(new Blob([""], { type: "Text/Plain" }), { headers: [["Content-Type", "Text/Html"]] }) ].forEach(bodyContainerCreator => { const bodyContainer = bodyContainerCreator(); const cloned = bodyContainer.clone(); diff --git a/test/fixtures/wpt/fetch/api/resources/keepalive-helper.js b/test/fixtures/wpt/fetch/api/resources/keepalive-helper.js index 1e75c060aea..ad0e9bfa06c 100644 --- a/test/fixtures/wpt/fetch/api/resources/keepalive-helper.js +++ b/test/fixtures/wpt/fetch/api/resources/keepalive-helper.js @@ -117,7 +117,7 @@ function assertStashedTokenAsync( * * `unloadIframe` to unload the iframe before verifying stashed token to * simulate the situation that unloads after fetching. Note that this test is - * different from `keepaliveRedirectInUnloadTest()` in that the the latter + * different from `keepaliveRedirectInUnloadTest()` in that the latter * performs fetch() call directly in `unload` event handler, while this test * does it in `load`. */ diff --git a/test/fixtures/wpt/fetch/http-cache/README.md b/test/fixtures/wpt/fetch/http-cache/README.md index 512c422e108..f3815aabfd9 100644 --- a/test/fixtures/wpt/fetch/http-cache/README.md +++ b/test/fixtures/wpt/fetch/http-cache/README.md @@ -62,6 +62,7 @@ Possible members of a request object: - expected_response_headers - An array of `[header_name_string, header_value_string]` representing headers to check the response for. See also response_headers. - expected_response_text - A string to check the response body against. If not present, `response_body` will be checked if present and non-null; otherwise the response body will be checked for the test uuid (unless the status code disallows a body). Set to `null` to disable all response body checking. +- url_params - A string of url parameters that will be appended to the end of the url, separated by "&" and without leading "&". Some headers in `response_headers` are treated specially: @@ -69,4 +70,3 @@ Some headers in `response_headers` are treated specially: * For URL-carrying headers, the value will be appended as a query parameter for `target`. See the source for exact details. - diff --git a/test/fixtures/wpt/fetch/http-cache/http-cache.js b/test/fixtures/wpt/fetch/http-cache/http-cache.js index 0ca5fcc2bc0..e2234736910 100644 --- a/test/fixtures/wpt/fetch/http-cache/http-cache.js +++ b/test/fixtures/wpt/fetch/http-cache/http-cache.js @@ -255,6 +255,9 @@ function makeTestUrl (uuid, config) { if ('query_arg' in config) { arg = `&target=${config.query_arg}` } + if ('url_params' in config) { + arg = `${arg}&${config.url_params}` + } return `${base_url}resources/http-cache.py?dispatch=test&uuid=${uuid}${arg}` } diff --git a/test/fixtures/wpt/fetch/http-cache/no-vary-search.tentative.any.js b/test/fixtures/wpt/fetch/http-cache/no-vary-search.tentative.any.js new file mode 100644 index 00000000000..379da6a0594 --- /dev/null +++ b/test/fixtures/wpt/fetch/http-cache/no-vary-search.tentative.any.js @@ -0,0 +1,33 @@ +// META: global=window,worker +// META: title=NoVarySearch HTTP Cache +// META: timeout=long +// META: script=/common/utils.js +// META: script=/common/get-host-info.sub.js +// META: script=http-cache.js +/* +NOTE for testing No-Vary-Search-Header: +If `params` is set to true, `expect=("dispatch" "uuid")` must be specified. +Otherwise: +- The same HTTP Cache will be used by other tests, which are supposed + to be distinguished by uuid. +- The test utility cannot get the server's states because UA will use the HTTP + Cache instead of sending a new request to server to ask for the latest state. +*/ +var tests = [ + { + name: "When params is set to true, URL differs only by their parameters (other than `dispatch` and `uuid`) should not be cached as different entries.", + requests: [ + { + url_params: "a=1&b=2", + response_headers: [ + ["Cache-Control", "max-age=10000"], + ["No-Vary-Search", "params, except=(\"dispatch\" \"uuid\")"], + ], + }, + { + expected_type: "cached" + } + ] + } +]; +run_tests(tests); diff --git a/test/fixtures/wpt/fetch/security/dangling-markup/dangling-markup-mitigation-allowed-apis.tentative.https.html b/test/fixtures/wpt/fetch/security/dangling-markup/dangling-markup-mitigation-allowed-apis.https.html similarity index 62% rename from test/fixtures/wpt/fetch/security/dangling-markup/dangling-markup-mitigation-allowed-apis.tentative.https.html rename to test/fixtures/wpt/fetch/security/dangling-markup/dangling-markup-mitigation-allowed-apis.https.html index 428decfc583..62804283075 100644 --- a/test/fixtures/wpt/fetch/security/dangling-markup/dangling-markup-mitigation-allowed-apis.tentative.https.html +++ b/test/fixtures/wpt/fetch/security/dangling-markup/dangling-markup-mitigation-allowed-apis.https.html @@ -11,13 +11,18 @@ `location.replace(\`${dangling_url}\`)`, ]; - function get_requests(worker, expected) { - return new Promise(resolve => { + function get_requests(test, worker, expected) { + return new Promise((resolve, reject) => { + let didTimeout = false; + test.step_timeout(() => { + didTimeout = true; + reject("get_requests timed out"); + }, 1000); navigator.serviceWorker.addEventListener('message', function onMsg(evt) { if (evt.data.size >= expected) { navigator.serviceWorker.removeEventListener('message', onMsg); resolve(evt.data); - } else { + } else if (!didTimeout) { worker.postMessage(""); } }); @@ -40,6 +45,7 @@ }); const dangling_resource = "404?type=text/javascript&\n<" + const dangling_resource_expected = "404?type=text/javascript&%3C" const api_calls = [ [`const xhr = new XMLHttpRequest(); xhr.open("GET", \`${"xhr" + dangling_resource}\`); @@ -54,22 +60,30 @@ ]; - navigator.serviceWorker.register('service-worker.js'); - const iframe = document.createElement('iframe'); - iframe.src = "resources/empty.html"; - document.body.appendChild(iframe); + let iframe, registration; + promise_test(async t => { + iframe = document.createElement('iframe'); + iframe.src = "resources/empty.html"; + document.body.appendChild(iframe); + await new Promise(resolve => iframe.onload = resolve); + registration = await navigator.serviceWorker.register('service-worker.js'); + if (!iframe.contentWindow.navigator.serviceWorker.controller) + await new Promise(resolve => iframe.contentWindow.navigator.serviceWorker.oncontrollerchange = resolve); + }, "Setup controlled frame"); + + let number_api_calls = 0; api_calls.forEach(call => { - promise_test(t => { - return new Promise(resolve => { - navigator.serviceWorker.ready.then(t.step_func(registration => { - iframe.contentWindow.eval(call[0]); - get_requests(registration.active, 0).then(t.step_func(requests => { - resolve(assert_true(requests.has(call[1] + dangling_resource))); - })); - })); - }); + promise_test(async t => { + iframe.contentWindow.eval(call[0]); + const requests = await get_requests(t, registration.active, number_api_calls + 1); + assert_equals(Array.from(requests)[number_api_calls], call[1] + dangling_resource_expected); + number_api_calls++; }, `Does not block ${call[1]}`); }); + promise_test(async () => { + iframe.remove(); + registration.unregister(); + }, "Clean up iframe"); async_test(t => { let url = new URL(location.origin + "/" + dangling_url); diff --git a/test/fixtures/wpt/interfaces/dom.idl b/test/fixtures/wpt/interfaces/dom.idl index 7b4fcb920e2..253e7bf913e 100644 --- a/test/fixtures/wpt/interfaces/dom.idl +++ b/test/fixtures/wpt/interfaces/dom.idl @@ -110,6 +110,7 @@ Document includes NonElementParentNode; DocumentFragment includes NonElementParentNode; interface mixin DocumentOrShadowRoot { + readonly attribute CustomElementRegistry? customElementRegistry; }; Document includes DocumentOrShadowRoot; ShadowRoot includes DocumentOrShadowRoot; @@ -293,7 +294,7 @@ interface Document : Node { [NewObject] Comment createComment(DOMString data); [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data); - [CEReactions, NewObject] Node importNode(Node node, optional boolean subtree = false); + [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false); [CEReactions] Node adoptNode(Node node); [NewObject] Attr createAttribute(DOMString localName); @@ -312,9 +313,15 @@ interface Document : Node { interface XMLDocument : Document {}; dictionary ElementCreationOptions { + CustomElementRegistry customElementRegistry; DOMString is; }; +dictionary ImportNodeOptions { + CustomElementRegistry customElementRegistry; + boolean selfOnly = false; +}; + [Exposed=Window] interface DOMImplementation { [NewObject] DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, DOMString systemId); @@ -344,6 +351,7 @@ interface ShadowRoot : DocumentFragment { readonly attribute boolean clonable; readonly attribute boolean serializable; readonly attribute Element host; + attribute EventHandler onslotchange; }; @@ -384,6 +392,8 @@ interface Element : Node { ShadowRoot attachShadow(ShadowRootInit init); readonly attribute ShadowRoot? shadowRoot; + readonly attribute CustomElementRegistry? customElementRegistry; + Element? closest(DOMString selectors); boolean matches(DOMString selectors); boolean webkitMatchesSelector(DOMString selectors); // legacy alias of .matches @@ -402,6 +412,7 @@ dictionary ShadowRootInit { SlotAssignmentMode slotAssignment = "named"; boolean clonable = false; boolean serializable = false; + CustomElementRegistry customElementRegistry; }; [Exposed=Window, diff --git a/test/fixtures/wpt/interfaces/fedcm.idl b/test/fixtures/wpt/interfaces/fedcm.idl index c26e2b14c73..215f375432e 100644 --- a/test/fixtures/wpt/interfaces/fedcm.idl +++ b/test/fixtures/wpt/interfaces/fedcm.idl @@ -74,7 +74,7 @@ dictionary IdentityProviderBranding { dictionary IdentityProviderAPIConfig { required USVString accounts_endpoint; - required USVString client_metadata_endpoint; + USVString client_metadata_endpoint; required USVString id_assertion_endpoint; required USVString login_url; USVString disconnect_endpoint; diff --git a/test/fixtures/wpt/interfaces/html.idl b/test/fixtures/wpt/interfaces/html.idl index 61378c801d4..102149c4dfa 100644 --- a/test/fixtures/wpt/interfaces/html.idl +++ b/test/fixtures/wpt/interfaces/html.idl @@ -1261,6 +1261,7 @@ interface HTMLTemplateElement : HTMLElement { [CEReactions] attribute boolean shadowRootDelegatesFocus; [CEReactions] attribute boolean shadowRootClonable; [CEReactions] attribute boolean shadowRootSerializable; + [CEReactions] attribute DOMString shadowRootCustomElementRegistry; }; [Exposed=Window] @@ -1629,11 +1630,14 @@ OffscreenCanvasRenderingContext2D includes CanvasPath; [Exposed=Window] interface CustomElementRegistry { + constructor(); + [CEReactions] undefined define(DOMString name, CustomElementConstructor constructor, optional ElementDefinitionOptions options = {}); (CustomElementConstructor or undefined) get(DOMString name); DOMString? getName(CustomElementConstructor constructor); Promise whenDefined(DOMString name); [CEReactions] undefined upgrade(Node root); + undefined initialize(Node root); }; callback CustomElementConstructor = HTMLElement (); diff --git a/test/fixtures/wpt/interfaces/secure-payment-confirmation.idl b/test/fixtures/wpt/interfaces/secure-payment-confirmation.idl index bec599d7a23..5b67ca62678 100644 --- a/test/fixtures/wpt/interfaces/secure-payment-confirmation.idl +++ b/test/fixtures/wpt/interfaces/secure-payment-confirmation.idl @@ -16,8 +16,16 @@ dictionary SecurePaymentConfirmationRequest { boolean showOptOut; }; +enum SecurePaymentConfirmationAvailability { + "available", + "unavailable-unknown-reason", + "unavailable-feature-not-enabled", + "unavailable-no-permission-policy", + "unavailable-no-user-verifying-platform-authenticator", +}; + partial interface PaymentRequest { - static Promise isSecurePaymentConfirmationAvailable(); + static Promise securePaymentConfirmationAvailability(); }; partial dictionary AuthenticationExtensionsClientInputs { diff --git a/test/fixtures/wpt/interfaces/speech-api.idl b/test/fixtures/wpt/interfaces/speech-api.idl index 5bc9df337dd..0e07b4619a5 100644 --- a/test/fixtures/wpt/interfaces/speech-api.idl +++ b/test/fixtures/wpt/interfaces/speech-api.idl @@ -13,6 +13,7 @@ interface SpeechRecognition : EventTarget { attribute boolean interimResults; attribute unsigned long maxAlternatives; attribute SpeechRecognitionMode mode; + attribute SpeechRecognitionPhraseList phrases; // methods to drive the speech interaction undefined start(); @@ -43,7 +44,8 @@ enum SpeechRecognitionErrorCode { "network", "not-allowed", "service-not-allowed", - "language-not-supported" + "language-not-supported", + "phrases-not-supported" }; enum SpeechRecognitionMode { @@ -106,6 +108,24 @@ dictionary SpeechRecognitionEventInit : EventInit { required SpeechRecognitionResultList results; }; +// The object representing a phrase for contextual biasing. +[Exposed=Window] +interface SpeechRecognitionPhrase { + constructor(DOMString phrase, optional float boost = 1.0); + readonly attribute DOMString phrase; + readonly attribute float boost; +}; + +// The object representing a list of phrases for contextual biasing. +[Exposed=Window] +interface SpeechRecognitionPhraseList { + constructor(sequence phrases); + readonly attribute unsigned long length; + SpeechRecognitionPhrase item(unsigned long index); + undefined addItem(SpeechRecognitionPhrase item); + undefined removeItem(unsigned long index); +}; + [Exposed=Window] interface SpeechSynthesis : EventTarget { readonly attribute boolean pending; diff --git a/test/fixtures/wpt/resources/chromium/webxr-test.js b/test/fixtures/wpt/resources/chromium/webxr-test.js index 15d015debb1..41340aa27e0 100644 --- a/test/fixtures/wpt/resources/chromium/webxr-test.js +++ b/test/fixtures/wpt/resources/chromium/webxr-test.js @@ -1207,6 +1207,11 @@ class MockRuntime { this.enabledFeatures_ = enabled_features; + let selectedDepthType; + if (sessionOptions.depthOptions && sessionOptions.depthOptions.depthTypeRequest.length != 0) { + selectedDepthType = sessionOptions.depthOptions.depthTypeRequest[0]; + } + return Promise.resolve({ session: { submitFrameSink: submit_frame_sink, @@ -1219,9 +1224,12 @@ class MockRuntime { depthConfiguration: enabled_features.includes( xrSessionMojom.XRSessionFeature.DEPTH) ? { + // TODO(https://crbug.com/409806803): Update support via + // a webxr-test-api method. depthUsage: xrSessionMojom.XRDepthUsage.kCPUOptimized, depthDataFormat: xrSessionMojom.XRDepthDataFormat.kLuminanceAlpha, + depthType: selectedDepthType, } : null, views: this._getDefaultViews(), @@ -1251,6 +1259,7 @@ class MockRuntime { switch (feature) { case xrSessionMojom.XRSessionFeature.DEPTH: // This matches what Chrome can currently support. + // TODO(https://crbug.com/409806803): Add a webxr-test-api for this. return options.depthOptions && (options.depthOptions.usagePreferences.length == 0 || options.depthOptions.usagePreferences.includes( diff --git a/test/fixtures/wpt/resources/testdriver.js b/test/fixtures/wpt/resources/testdriver.js index 460f879878f..f127e2b2c8d 100644 --- a/test/fixtures/wpt/resources/testdriver.js +++ b/test/fixtures/wpt/resources/testdriver.js @@ -629,7 +629,7 @@ /** * Minimizes the browser window. * - * Matches the the behaviour of the `Minimize + * Matches the behaviour of the `Minimize * `_ * WebDriver command * @@ -1497,6 +1497,48 @@ */ set_protected_audience_k_anonymity: function(owner, name, hashes, context = null) { return window.test_driver_internal.set_protected_audience_k_anonymity(owner, name, hashes, context); + }, + + /** + * Overrides the display features provided by the hardware so the viewport segments + * can be emulated. + * + * Matches the `Set display features + * `_ + * WebDriver command. + * + * @param {Array} features - An array of `DisplayFeatureOverride + * `. + * @param {WindowProxy} [context=null] - Browsing context in which to + * run the call, or null for the + * current browsing context. + * + * @returns {Promise} Fulfilled when the display features are set. + * Rejected in case the WebDriver command errors out + * (including if the array is malformed). + */ + set_display_features: function(features, context=null) { + return window.test_driver_internal.set_display_features(features, context); + }, + + /** + * Removes display features override and returns the control + * back to hardware. + * + * Matches the `Clear display features + * `_ + * WebDriver command. + * + * @param {WindowProxy} [context=null] - Browsing context in which to + * run the call, or null for the + * current browsing context. + * + * @returns {Promise} Fulfilled after the display features override has + * been removed. Rejected in case the WebDriver + * command errors out. + */ + clear_display_features: function(context=null) { + return window.test_driver_internal.clear_display_features(context); } }; @@ -1758,6 +1800,14 @@ async set_protected_audience_k_anonymity(owner, name, hashes, context=null) { throw new Error("set_protected_audience_k_anonymity() is not implemented by testdriver-vendor.js"); + }, + + async set_display_features(features, context=null) { + throw new Error("set_display_features() is not implemented by testdriver-vendor.js"); + }, + + async clear_display_features(context=null) { + throw new Error("clear_display_features() is not implemented by testdriver-vendor.js"); } }; })(); diff --git a/test/fixtures/wpt/resources/testharness.js b/test/fixtures/wpt/resources/testharness.js index bd668be20f8..8ef0574f1f0 100644 --- a/test/fixtures/wpt/resources/testharness.js +++ b/test/fixtures/wpt/resources/testharness.js @@ -1011,13 +1011,13 @@ /** * Stop listening for events */ - function stop_watching() { + this.stop_watching = function() { for (var i = 0; i < eventTypes.length; i++) { watchedNode.removeEventListener(eventTypes[i], eventHandler, false); } }; - test._add_cleanup(stop_watching); + test._add_cleanup(this.stop_watching); return this; } diff --git a/test/fixtures/wpt/service-workers/service-worker/claim-using-registration.https.html b/test/fixtures/wpt/service-workers/service-worker/claim-using-registration.https.html index 8a2a6ff25c8..a02f8e9ca6f 100644 --- a/test/fixtures/wpt/service-workers/service-worker/claim-using-registration.https.html +++ b/test/fixtures/wpt/service-workers/service-worker/claim-using-registration.https.html @@ -97,7 +97,7 @@ .then(function() { frame.remove(); }); - }, 'Test for the waiting worker claims a client which is using the the ' + + }, 'Test for the waiting worker claims a client which is using the ' + 'same registration'); diff --git a/test/fixtures/wpt/service-workers/service-worker/resources/testharness-helpers.js b/test/fixtures/wpt/service-workers/service-worker/resources/testharness-helpers.js index b1a5b960e06..5f93a25438a 100644 --- a/test/fixtures/wpt/service-workers/service-worker/resources/testharness-helpers.js +++ b/test/fixtures/wpt/service-workers/service-worker/resources/testharness-helpers.js @@ -14,7 +14,7 @@ // 2.1 |a.p| is weakly equal to |b.p| for all own properties |p| of |a|. // 2.2 Every own property of |b| is an own property of |a|. // -// This is a replacement for the the version of assert_object_equals() in +// This is a replacement for the version of assert_object_equals() in // testharness.js. The latter doesn't handle own properties correctly. I.e. if // |a.p| is not an own property, it still requires that |b.p| be an own // property. diff --git a/test/fixtures/wpt/service-workers/service-worker/unregister-immediately-before-installed.https.html b/test/fixtures/wpt/service-workers/service-worker/unregister-immediately-before-installed.https.html index 79cdaf062dc..c56674c0fb1 100644 --- a/test/fixtures/wpt/service-workers/service-worker/unregister-immediately-before-installed.https.html +++ b/test/fixtures/wpt/service-workers/service-worker/unregister-immediately-before-installed.https.html @@ -16,7 +16,7 @@ // worker's state to 'redundant'. promise_test(async test => { - // This test keeps the the service worker in the 'parsed' state by using a + // This test keeps the service worker in the 'parsed' state by using a // script with an infinite loop. const script_url = 'resources/onparse-infiniteloop-worker.js'; const scope_url = @@ -34,7 +34,7 @@ }, 'Clear-Site-Data must abort service worker registration.'); promise_test(async test => { - // This test keeps the the service worker in the 'installing' state by using a + // This test keeps the service worker in the 'installing' state by using a // script with an install event waitUntil() promise that never resolves. const script_url = 'resources/oninstall-waituntil-forever.js'; const scope_url = diff --git a/test/fixtures/wpt/service-workers/service-worker/unregister-immediately.https.html b/test/fixtures/wpt/service-workers/service-worker/unregister-immediately.https.html index 54be40a5452..c6a91f8e235 100644 --- a/test/fixtures/wpt/service-workers/service-worker/unregister-immediately.https.html +++ b/test/fixtures/wpt/service-workers/service-worker/unregister-immediately.https.html @@ -16,7 +16,7 @@ // active worker's controlled clients to unload. promise_test(async test => { - // This test keeps the the service worker in the 'activating' state by using a + // This test keeps the service worker in the 'activating' state by using a // script with an activate event waitUntil() promise that never resolves. const script_url = 'resources/onactivate-waituntil-forever.js'; const scope_url = From 16e15bac8534431d2c438c1207da5671cd2a7533 Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Sun, 20 Apr 2025 03:23:54 +0000 Subject: [PATCH 2/2] fix wpt failures --- test/wpt/status/fetch.status.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/wpt/status/fetch.status.json b/test/wpt/status/fetch.status.json index 081b693493c..07040863968 100644 --- a/test/wpt/status/fetch.status.json +++ b/test/wpt/status/fetch.status.json @@ -104,14 +104,6 @@ ] } }, - "body": { - "mime-type.any.js": { - "note": "fails on all platforms, https://wpt.fyi/results/fetch/api/body/mime-type.any.html?label=master&label=experimental&product=chrome&product=firefox&product=safari&product=node.js&product=deno&aligned", - "fail": [ - "Response: Extract a MIME type with clone" - ] - } - }, "cors": { "note": "undici doesn't implement CORs", "skip": true