From 7a7129edd731c5f28b62caf435dc77b796bf5878 Mon Sep 17 00:00:00 2001 From: Gae24 <96017547+Gae24@users.noreply.github.com> Date: Mon, 29 Sep 2025 11:08:12 +0200 Subject: [PATCH] script: when fetching a worker script abort if response status is not ok (#39468) According to [spec](https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-classic-worker-script) we should abort if the response status is not ok. Testing: Check tests listed inside issue are not intermittent anymore Fixes: #39413 Fixes: #22991 --------- Signed-off-by: Gae24 <96017547+Gae24@users.noreply.github.com> --- .../script/dom/dedicatedworkerglobalscope.rs | 30 ++++++++++++------- .../initiator-type/workers.html.ini | 1 - 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 85ad4a92a56..c089448d755 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -506,6 +506,18 @@ impl DedicatedWorkerGlobalScope { global_scope.set_https_state(current_global_https_state); + let send_error = || { + parent_event_loop_sender + .send(CommonScriptMsg::Task( + WorkerEvent, + Box::new(SimpleWorkerErrorHandler::new(worker.clone())), + Some(pipeline_id), + TaskSourceName::DOMManipulation, + )) + .unwrap(); + scope.clear_js_runtime(); + }; + let (metadata, bytes) = match load_whole_resource( request, &global_scope.resource_threads().sender(), @@ -518,18 +530,16 @@ impl DedicatedWorkerGlobalScope { ) { Err(e) => { error!("error loading script {} ({:?})", serialized_worker_url, e); - parent_event_loop_sender - .send(CommonScriptMsg::Task( - WorkerEvent, - Box::new(SimpleWorkerErrorHandler::new(worker)), - Some(pipeline_id), - TaskSourceName::DOMManipulation, - )) - .unwrap(); - scope.clear_js_runtime(); + send_error(); return; }, - Ok((metadata, bytes)) => (metadata, bytes), + Ok((metadata, bytes)) => { + if !metadata.status.is_success() { + send_error(); + return; + } + (metadata, bytes) + }, }; scope.set_url(metadata.final_url.clone()); Self::initialize_policy_container_for_worker_global_scope( diff --git a/tests/wpt/meta/resource-timing/initiator-type/workers.html.ini b/tests/wpt/meta/resource-timing/initiator-type/workers.html.ini index 8f9c2c66c62..d796807f3df 100644 --- a/tests/wpt/meta/resource-timing/initiator-type/workers.html.ini +++ b/tests/wpt/meta/resource-timing/initiator-type/workers.html.ini @@ -1,5 +1,4 @@ [workers.html] - expected: ERROR [The initiator type for classic worker must be 'other'] expected: FAIL