From 3f24b44e1581af01a3fb51c031663d1dd99a790c Mon Sep 17 00:00:00 2001 From: Kingsley Yung Date: Sat, 5 Apr 2025 16:38:02 +0800 Subject: [PATCH] structuredclone::read throws a DataClone error on failure (#36361) In the structured clone writing API, the read function should throw a DataClone error on failure, just like the write function. Testing: It doesn't require tests. Fixes: #36217 Signed-off-by: Kingsley Yung --- .../script/dom/bindings/structuredclone.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index ee3f50315f4..d7ce192652c 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -566,7 +566,7 @@ pub(crate) fn read( global: &GlobalScope, mut data: StructuredSerializedData, rval: MutableHandleValue, -) -> Result>, ()> { +) -> Fallible>> { let cx = GlobalScope::get_cx(); let _ac = enter_realm(global); let mut sc_reader = StructuredDataReader { @@ -605,18 +605,16 @@ pub(crate) fn read( &STRUCTURED_CLONE_CALLBACKS, sc_reader_ptr as *mut raw::c_void, ); + if !result { + JS_ClearPendingException(*cx); + return Err(Error::DataClone); + } DeleteJSAutoStructuredCloneBuffer(scbuf); - if result { - // Any transfer-received port-impls should have been taken out. - assert!(sc_reader.port_impls.is_none()); + // Any transfer-received port-impls should have been taken out. + assert!(sc_reader.port_impls.is_none()); - match sc_reader.message_ports.take() { - Some(ports) => return Ok(ports), - None => return Ok(Vec::with_capacity(0)), - } - } - Err(()) + Ok(sc_reader.message_ports.take().unwrap_or_default()) } }