diff options
author | Samson <16504129+sagudev@users.noreply.github.com> | 2024-07-06 12:25:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-06 10:25:38 +0000 |
commit | 59d0f1fe1aec4bec736bf2839e43de886eaebf32 (patch) | |
tree | e0b42d69dadf2b0f945f5284ac7f52994aaf86a9 /components/script/dom/bindings/principals.rs | |
parent | 5a9dc98f07cbd13394142ccf578a951c742af286 (diff) | |
download | servo-59d0f1fe1aec4bec736bf2839e43de886eaebf32.tar.gz servo-59d0f1fe1aec4bec736bf2839e43de886eaebf32.zip |
script: Impl cloning of JSPrincipals (#32706)
* Impl cloning of JSPrincipals
* bincode as workspace dependency
* Update mozjs and cc
Diffstat (limited to 'components/script/dom/bindings/principals.rs')
-rw-r--r-- | components/script/dom/bindings/principals.rs | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/components/script/dom/bindings/principals.rs b/components/script/dom/bindings/principals.rs index f408f92cbc7..14a3a826f3a 100644 --- a/components/script/dom/bindings/principals.rs +++ b/components/script/dom/bindings/principals.rs @@ -11,10 +11,15 @@ use js::glue::{ CreateRustJSPrincipals, DestroyRustJSPrincipals, GetRustJSPrincipalsPrivate, JSPrincipalsCallbacks, }; -use js::jsapi::{JSPrincipals, JS_DropPrincipals, JS_HoldPrincipals}; +use js::jsapi::{ + JSContext, JSPrincipals, JSStructuredCloneReader, JSStructuredCloneWriter, JS_DropPrincipals, + JS_HoldPrincipals, JS_ReadUint32Pair, +}; use js::rust::Runtime; use servo_url::MutableOrigin; +use super::structuredclone::StructuredCloneTags; + /// An owned reference to Servo's `JSPrincipals` instance. #[repr(transparent)] pub struct ServoJSPrincipals(NonNull<JSPrincipals>); @@ -123,8 +128,60 @@ pub unsafe extern "C" fn destroy_servo_jsprincipal(principals: *mut JSPrincipals DestroyRustJSPrincipals(principals); } +pub unsafe extern "C" fn write_jsprincipal( + principal: *mut JSPrincipals, + _cx: *mut JSContext, + writer: *mut JSStructuredCloneWriter, +) -> bool { + let Some(principal) = NonNull::new(principal) else { + return false; + }; + let obj = ServoJSPrincipalsRef::from_raw_nonnull(principal); + let origin = obj.origin(); + let Ok(bytes_of_origin) = bincode::serialize(&origin) else { + return false; + }; + let Ok(len) = bytes_of_origin.len().try_into() else { + return false; + }; + if !js::jsapi::JS_WriteUint32Pair(writer, StructuredCloneTags::Principals as u32, len) { + return false; + } + if !js::jsapi::JS_WriteBytes(writer, bytes_of_origin.as_ptr() as _, len as usize) { + return false; + } + true +} + +pub unsafe extern "C" fn read_jsprincipal( + _cx: *mut JSContext, + reader: *mut JSStructuredCloneReader, + principals: *mut *mut JSPrincipals, +) -> bool { + let mut tag: u32 = 0; + let mut len: u32 = 0; + if !JS_ReadUint32Pair(reader, &mut tag as *mut u32, &mut len as *mut u32) { + return false; + } + if tag != StructuredCloneTags::Principals as u32 { + return false; + } + let mut bytes = vec![0u8; len as usize]; + if !js::jsapi::JS_ReadBytes(reader, bytes.as_mut_ptr() as _, len as usize) { + return false; + } + let Ok(origin) = bincode::deserialize(&bytes[..]) else { + return false; + }; + let principal = ServoJSPrincipals::new(&origin); + *principals = principal.as_raw(); + // we transferred ownership of principal to the caller + std::mem::forget(principal); + true +} + const PRINCIPALS_CALLBACKS: JSPrincipalsCallbacks = JSPrincipalsCallbacks { - write: None, + write: Some(write_jsprincipal), isSystemOrAddonPrincipal: Some(principals_is_system_or_addon_principal), }; |