aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/principals.rs
diff options
context:
space:
mode:
authorSamson <16504129+sagudev@users.noreply.github.com>2024-07-06 12:25:38 +0200
committerGitHub <noreply@github.com>2024-07-06 10:25:38 +0000
commit59d0f1fe1aec4bec736bf2839e43de886eaebf32 (patch)
treee0b42d69dadf2b0f945f5284ac7f52994aaf86a9 /components/script/dom/bindings/principals.rs
parent5a9dc98f07cbd13394142ccf578a951c742af286 (diff)
downloadservo-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.rs61
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),
};