aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorKingsley Yung <kingsley@kkoyung.dev>2025-04-05 16:38:02 +0800
committerGitHub <noreply@github.com>2025-04-05 08:38:02 +0000
commit3f24b44e1581af01a3fb51c031663d1dd99a790c (patch)
tree73da220126a5bd2b56eac31cf5c4b3be34ba1855 /components/script/dom
parentaef8537d7537cd886ce0a03e2c845b1c8dd54b6d (diff)
downloadservo-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.rs18
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())
}
}