diff options
author | Kingsley Yung <kingsley@kkoyung.dev> | 2025-04-05 16:38:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-05 08:38:02 +0000 |
commit | 3f24b44e1581af01a3fb51c031663d1dd99a790c (patch) | |
tree | 73da220126a5bd2b56eac31cf5c4b3be34ba1855 /components/script/dom | |
parent | aef8537d7537cd886ce0a03e2c845b1c8dd54b6d (diff) | |
download | servo-3f24b44e1581af01a3fb51c031663d1dd99a790c.tar.gz servo-3f24b44e1581af01a3fb51c031663d1dd99a790c.zip |
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 <kingsley@kkoyung.dev>
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/structuredclone.rs | 18 |
1 files 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<Vec<DomRoot<MessagePort>>, ()> { +) -> Fallible<Vec<DomRoot<MessagePort>>> { 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()) } } |