diff options
author | yvt <i@yvt.jp> | 2021-07-11 23:30:40 +0900 |
---|---|---|
committer | yvt <i@yvt.jp> | 2021-07-11 23:30:40 +0900 |
commit | bfa2026220c34f2adb461c7759609c16a04f4a3a (patch) | |
tree | 6ed09b6efd20be9ab61e43d33add02bc9954cdb1 /components/script/dom/bindings/utils.rs | |
parent | 40fbe6b722cc91486a088f950e1629cf9ddde830 (diff) | |
download | servo-bfa2026220c34f2adb461c7759609c16a04f4a3a.tar.gz servo-bfa2026220c34f2adb461c7759609c16a04f4a3a.zip |
feat(script): remove the call to `JS_SetWrapObjectCallbacks`
We don't make CCWs anymore.
Diffstat (limited to 'components/script/dom/bindings/utils.rs')
-rw-r--r-- | components/script/dom/bindings/utils.rs | 176 |
1 files changed, 8 insertions, 168 deletions
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index f8bb6ec1a91..114422f61b1 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -4,57 +4,40 @@ //! Various utilities to glue JavaScript and the DOM implementation together. -use crate::dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionBinding::DOMExceptionMethods; -use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::InterfaceObjectMap; use crate::dom::bindings::codegen::PrototypeList; use crate::dom::bindings::codegen::PrototypeList::{MAX_PROTO_CHAIN_LENGTH, PROTO_OR_IFACE_LENGTH}; use crate::dom::bindings::conversions::{ jsstring_to_str, private_from_proto_check, PrototypeCheck, }; -use crate::dom::bindings::error::{throw_dom_exception, throw_invalid_this, Error}; +use crate::dom::bindings::error::throw_invalid_this; use crate::dom::bindings::inheritance::TopTypeId; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::trace_object; -use crate::dom::globalscope::GlobalScope; use crate::dom::windowproxy; -use crate::realms::AlreadyInRealm; -use crate::realms::InRealm; use crate::script_runtime::JSContext as SafeJSContext; use js::conversions::ToJSValConvertible; -use js::glue::SetIsFrameIdCallback; -use js::glue::SetThrowDOMExceptionCallback; +use js::glue::JS_GetReservedSlot; use js::glue::{CallJitGetterOp, CallJitMethodOp, CallJitSetterOp, IsWrapper}; -use js::glue::{ - CreateCrossOriginWrapper, GetCrossCompartmentWrapper, GetOpaqueWrapper, GetSecurityWrapper, - JS_GetReservedSlot, WrapperNew, -}; -use js::glue::{ - CreateRustJSPrincipals, CreateWrapperProxyHandler, GetRustJSPrincipalsPrivate, - JSPrincipalsCallbacks, UncheckedUnwrapObject, -}; +use js::glue::{CreateRustJSPrincipals, GetRustJSPrincipalsPrivate, JSPrincipalsCallbacks}; use js::glue::{UnwrapObjectDynamic, UnwrapObjectStatic, RUST_JSID_TO_INT, RUST_JSID_TO_STRING}; use js::glue::{ RUST_FUNCTION_VALUE_TO_JITINFO, RUST_JSID_IS_INT, RUST_JSID_IS_STRING, RUST_JSID_IS_VOID, }; -use js::jsapi::jsid; use js::jsapi::HandleId as RawHandleId; use js::jsapi::HandleObject as RawHandleObject; +use js::jsapi::JSPrincipals; use js::jsapi::MutableHandleIdVector as RawMutableHandleIdVector; -use js::jsapi::MutableHandleObject as RawMutableHandleObject; -use js::jsapi::RootedId; use js::jsapi::{AtomToLinearString, GetLinearStringCharAt, GetLinearStringLength}; use js::jsapi::{CallArgs, DOMCallbacks, GetNonCCWObjectGlobal}; -use js::jsapi::{Heap, JSAutoRealm, JSContext, JS_FreezeObject}; +use js::jsapi::{Heap, JSContext, JS_FreezeObject}; use js::jsapi::{JSAtom, JS_IsExceptionPending, JS_IsGlobalObject}; -use js::jsapi::{JSJitInfo, JSObject, JSTracer, JSWrapObjectCallbacks}; -use js::jsapi::{JSPrincipals, JS_GetClass, JS_GetCompartmentPrincipals}; +use js::jsapi::{JSJitInfo, JSObject, JSTracer}; use js::jsapi::{ JS_DeprecatedStringHasLatin1Chars, JS_ResolveStandardClass, ObjectOpResult, StringIsArrayIndex, }; use js::jsapi::{JS_EnumerateStandardClasses, JS_GetLatin1StringCharsAndLength}; use js::jsval::{JSVal, UndefinedValue}; -use js::rust::is_window; use js::rust::wrappers::JS_DeletePropertyById; use js::rust::wrappers::JS_ForwardGetPropertyTo; use js::rust::wrappers::JS_GetProperty; @@ -62,14 +45,13 @@ use js::rust::wrappers::JS_GetPrototype; use js::rust::wrappers::JS_HasProperty; use js::rust::wrappers::JS_HasPropertyById; use js::rust::wrappers::JS_SetProperty; -use js::rust::{get_context_compartment, get_object_compartment}; -use js::rust::{get_object_class, is_dom_class, GCMethods, ToString, ToWindowProxyIfWindow}; +use js::rust::{get_object_class, is_dom_class, GCMethods, ToString}; use js::rust::{Handle, HandleId, HandleObject, HandleValue, MutableHandleValue}; use js::typedarray::{CreateWith, Float32Array}; use js::JS_CALLEE; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use servo_url::MutableOrigin; -use std::ffi::{CStr, CString}; +use std::ffi::CString; use std::os::raw::{c_char, c_void}; use std::ptr; use std::slice; @@ -114,70 +96,6 @@ unsafe extern "C" fn principals_is_system_or_addon_principal(_: *mut JSPrincipal false } -#[derive(Debug, PartialEq)] -enum WrapperType { - CrossCompartment, - CrossOrigin, - Opaque, -} - -/* this is duplicate code. there's some in C in jsglue.cpp. - * TODO decide what to do about this - */ -#[derive(Debug, PartialEq)] -enum CrossOriginObjectType { - CrossOriginWindow, - CrossOriginLocation, - CrossOriginOpaque, -} - -unsafe fn identify_cross_origin_object(obj: RawHandleObject) -> CrossOriginObjectType { - let obj = UncheckedUnwrapObject(obj.get(), /* stopAtWindowProxy = */ 0); - let obj_class = JS_GetClass(obj); - let name = str::from_utf8(CStr::from_ptr((*obj_class).name).to_bytes()) - .unwrap() - .to_owned(); - match &*name { - "Location" => CrossOriginObjectType::CrossOriginLocation, - "Window" => CrossOriginObjectType::CrossOriginWindow, - _ => CrossOriginObjectType::CrossOriginOpaque, - } -} - -unsafe fn target_subsumes_obj(cx: *mut JSContext, obj: RawHandleObject) -> bool { - //step 1 get compartment - let obj_c = get_object_compartment(obj.get()); - let ctx_c = get_context_compartment(cx); - - //step 2 get principals - let obj_p = JS_GetCompartmentPrincipals(obj_c); - let ctx_p = JS_GetCompartmentPrincipals(ctx_c); - - //TODO determine what subsumes check is sufficient - subsumes(obj_p, ctx_p) - //step 3 check document.domain - - //step 4 - - //step 5 if nested, get base uri - - //step 6 compare schemes. if files, return false unless identical - - //step 7 compare hosts - - //step 8 compare ports - //false -} - -unsafe fn get_opaque_wrapper() -> *const ::libc::c_void { - //GetSecurityWrapper() - GetOpaqueWrapper() -} - -unsafe fn get_cross_origin_wrapper() -> *const ::libc::c_void { - CreateCrossOriginWrapper() -} - //TODO is same_origin_domain equivalent to subsumes for our purposes pub unsafe extern "C" fn subsumes(obj: *mut JSPrincipals, other: *mut JSPrincipals) -> bool { let obj = &ServoJSPrincipal(obj); @@ -187,19 +105,6 @@ pub unsafe extern "C" fn subsumes(obj: *mut JSPrincipals, other: *mut JSPrincipa obj_origin.same_origin_domain(&other_origin) } -unsafe fn select_wrapper(cx: *mut JSContext, obj: RawHandleObject) -> *const libc::c_void { - let security_wrapper = !target_subsumes_obj(cx, obj); - if !security_wrapper { - return GetCrossCompartmentWrapper(); - }; - - if identify_cross_origin_object(obj) != CrossOriginObjectType::CrossOriginOpaque { - return get_cross_origin_wrapper(); - }; - - get_opaque_wrapper() -} - #[derive(JSTraceable, MallocSizeOf)] /// Static data associated with a global object. pub struct GlobalStaticData { @@ -611,71 +516,6 @@ pub unsafe extern "C" fn resolve_global( true } -unsafe extern "C" fn wrap( - cx: *mut JSContext, - _existing: RawHandleObject, - obj: RawHandleObject, -) -> *mut JSObject { - // FIXME terrible idea. need security wrappers - // https://github.com/servo/servo/issues/2382 - let wrapper = select_wrapper(cx, obj); - WrapperNew(cx, obj, wrapper, ptr::null(), false) -} - -unsafe extern "C" fn throw_dom_exception_callback(cx: *mut JSContext) { - //TODO it might not always be a SecurityError? - let cx = SafeJSContext::from_ptr(cx); - let in_realm_proof = AlreadyInRealm::assert_for_cx(cx); - throw_dom_exception( - cx, - &GlobalScope::from_context(*cx, InRealm::in_realm(&in_realm_proof)), - Error::Security, - ); -} - -unsafe extern "C" fn is_frame_id(cx: *mut JSContext, obj: *mut JSObject, id_arg: jsid) -> bool { - // println!("is frame id"); - /*if IsWrapper(obj) { - return false; - } - //let id = RootedId{_base: cx, ptr: idArg}; - - //will this work for window and dissimilaroriginwindow? probs not - if !is_window(obj) { - return false; - } - let win = obj as Window; - - let col = win.Frames(); - println!("{:?}", col); - //let clasp = get_object_class(obj); - //let name = str::from_utf8(CStr::from_ptr((*clasp).name).to_bytes()).unwrap().to_owned(); - //println!("{:?}", name);*/ - false -} - -unsafe extern "C" fn pre_wrap( - cx: *mut JSContext, - _scope: RawHandleObject, - _orig_obj: RawHandleObject, - obj: RawHandleObject, - _object_passed_to_wrap: RawHandleObject, - rval: RawMutableHandleObject, -) { - SetThrowDOMExceptionCallback(Some(throw_dom_exception_callback)); - SetIsFrameIdCallback(Some(is_frame_id)); - let _ac = JSAutoRealm::new(cx, obj.get()); - let obj = ToWindowProxyIfWindow(obj.get()); - assert!(!obj.is_null()); - rval.set(obj) -} - -/// Callback table for use with JS_SetWrapObjectCallbacks -pub static WRAP_CALLBACKS: JSWrapObjectCallbacks = JSWrapObjectCallbacks { - wrap: Some(wrap), - preWrap: Some(pre_wrap), -}; - /// Deletes the property `id` from `object`. pub unsafe fn delete_property_by_id( cx: *mut JSContext, |