diff --git a/components/script/dom/bindings/mod.rs b/components/script/dom/bindings/mod.rs index 67f89d92c725..70738f7918c7 100644 --- a/components/script/dom/bindings/mod.rs +++ b/components/script/dom/bindings/mod.rs @@ -208,6 +208,7 @@ pub mod codegen { include!(concat!(env!("OUT_DIR"), "/RegisterBindings.rs")); }*/ #[allow( + dead_code, non_camel_case_types, unused_imports, unused_variables, diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 06251743595e..73aa3d9b8653 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -4,6 +4,7 @@ //! Various utilities to glue JavaScript and the DOM implementation together. +use std::cell::Ref; use std::ffi::CString; use std::os::raw::{c_char, c_void}; use std::ptr::NonNull; @@ -35,6 +36,7 @@ use js::rust::{ }; use js::JS_CALLEE; use malloc_size_of::MallocSizeOfOps; +use servo_media::audio::buffer_source_node::AudioBuffer as ServoMediaAudioBuffer; pub use script_bindings::utils::*; use crate::dom::bindings::codegen::PrototypeList::{MAX_PROTO_CHAIN_LENGTH, PROTO_OR_IFACE_LENGTH}; @@ -42,10 +44,17 @@ use crate::dom::bindings::codegen::{InterfaceObjectMap, PrototypeList}; use crate::dom::bindings::conversions::{ jsstring_to_str, private_from_proto_check, PrototypeCheck, }; -use crate::dom::bindings::error::throw_invalid_this; +use crate::dom::bindings::error::{throw_invalid_this, throw_dom_exception}; use crate::dom::bindings::inheritance::TopTypeId; +use crate::dom::bindings::proxyhandler::report_cross_origin_denial; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::trace_object; +use crate::dom::globalscope::GlobalScope; +use crate::dom::promise::Promise; +use crate::dom::readablestream::ReadableStream; +use crate::dom::testbinding::TestBinding; +use crate::dom::webgl2renderingcontext::WebGL2RenderingContext; +use crate::dom::window::Window; use crate::dom::windowproxy::WindowProxyHandler; use crate::script_runtime::JSContext as SafeJSContext; @@ -664,3 +673,147 @@ pub unsafe fn exception_to_promise(cx: *mut JSContext, rval: RawMutableHandleVal } } */ + +impl script_bindings::DomHelpers for crate::DomTypeHolder { + fn throw_dom_exception( + cx: SafeJSContext, + global: &::GlobalScope, + result: script_bindings::error::Error, + ) { + throw_dom_exception(cx, global, result) + } + + unsafe fn global_scope_from_object( + obj: *mut js::jsapi::JSObject, + ) -> crate::dom::bindings::root::DomRoot< + ::GlobalScope, + > { + GlobalScope::from_object(obj) + } + + fn global_scope_origin( + global: &::GlobalScope, + ) -> &servo_url::MutableOrigin { + global.origin() + } + + fn Window_create_named_properties_object( + cx: crate::script_runtime::JSContext, + proto: js::rust::HandleObject, + object: js::rust::MutableHandleObject, + ) { + Window::create_named_properties_object(cx, proto, object) + } + + fn Promise_new_resolved( + global: &::GlobalScope, + cx: crate::script_runtime::JSContext, + value: js::rust::HandleValue, + ) -> crate::dom::bindings::error::Fallible< + std::rc::Rc<::Promise>, + > { + Promise::new_resolved(global, cx, value) + } + + unsafe fn GlobalScope_from_object_maybe_wrapped( + obj: *mut js::jsapi::JSObject, + cx: *mut js::jsapi::JSContext, + ) -> crate::dom::bindings::root::DomRoot< + ::GlobalScope, + > { + GlobalScope::from_object_maybe_wrapped(obj, cx) + } + + fn GlobalScope_incumbent() -> Option< + crate::dom::bindings::root::DomRoot< + ::GlobalScope, + >, + > { + GlobalScope::incumbent() + } + + fn GlobalScope_get_cx() -> crate::script_runtime::JSContext { + GlobalScope::get_cx() + } + + unsafe fn GlobalScope_from_context( + cx: *mut js::jsapi::JSContext, + in_realm: crate::realms::InRealm, + ) -> crate::dom::bindings::root::DomRoot< + ::GlobalScope, + > { + GlobalScope::from_context(cx, in_realm) + } + + fn GlobalScope_from_reflector( + reflector: &impl script_bindings::reflector::DomObject, + realm: &script_bindings::realms::AlreadyInRealm, + ) -> crate::dom::bindings::root::DomRoot< + ::GlobalScope, + > { + GlobalScope::from_reflector(reflector, &realm.into()) + } + + fn GlobalScope_report_an_error( + global: &::GlobalScope, + info: crate::dom::bindings::error::ErrorInfo, + value: js::rust::HandleValue, + ) { + global.report_an_error(info, value) + } + + fn TestBinding_condition_satisfied( + cx: crate::script_runtime::JSContext, + obj: js::rust::HandleObject, + ) -> bool { + TestBinding::condition_satisfied(cx, obj) + } + fn TestBinding_condition_unsatisfied( + cx: crate::script_runtime::JSContext, + obj: js::rust::HandleObject, + ) -> bool { + TestBinding::condition_unsatisfied(cx, obj) + } + fn WebGL2RenderingContext_is_webgl2_enabled( + cx: crate::script_runtime::JSContext, + obj: js::rust::HandleObject, + ) -> bool { + WebGL2RenderingContext::is_webgl2_enabled(cx, obj) + } + + fn perform_a_microtask_checkpoint( + global: &::GlobalScope, + ) { + global.perform_a_microtask_checkpoint() + } + + unsafe fn ReadableStream_from_js( + cx: crate::script_runtime::JSContext, + obj: *mut js::jsapi::JSObject, + in_realm: crate::realms::InRealm, + ) -> Result< + crate::dom::bindings::root::DomRoot< + ::ReadableStream, + >, + (), + > { + ReadableStream::from_js(cx, obj, in_realm) + } + + fn DOMException_stringifier( + exception: &::DOMException, + ) -> crate::dom::bindings::str::DOMString { + exception.stringifier() + } + + fn get_map() -> &'static phf::Map< + &'static [u8], + fn(crate::script_runtime::JSContext, js::rust::HandleObject), + > { + &InterfaceObjectMap::MAP + } + + fn AudioBuffer_get_channels(buffer: &::AudioBuffer) -> Ref> { + buffer.get_channels() + } +} diff --git a/components/script/lib.rs b/components/script/lib.rs index 977b9e09a725..6a6bbadcf1c9 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -96,10 +96,6 @@ mod webdriver_handlers; #[warn(deprecated)] mod window_named_properties; -use std::cell::Ref; - -use servo_media::audio::buffer_source_node::AudioBuffer as ServoMediaAudioBuffer; - pub use init::init; // export traits to be available for derive macros pub use script_bindings::inheritance::HasParent; @@ -108,145 +104,3 @@ pub use script_bindings::trace::{CustomTraceable, JSTraceable}; pub use script_runtime::JSEngineSetup; pub use crate::dom::bindings::codegen::DomTypeHolder::DomTypeHolder; - -impl script_bindings::DomHelpers for crate::DomTypeHolder { - fn throw_dom_exception( - cx: crate::script_runtime::JSContext, - global: &::GlobalScope, - result: script_bindings::error::Error, - ) { - todo!() - } - - unsafe fn global_scope_from_object( - obj: *mut js::jsapi::JSObject, - ) -> crate::dom::bindings::root::DomRoot< - ::GlobalScope, - > { - todo!() - } - - fn global_scope_origin( - global: &::GlobalScope, - ) -> &servo_url::MutableOrigin { - todo!() - } - - fn report_cross_origin_denial( - cx: crate::script_runtime::JSContext, - id: js::jsapi::HandleId, - access: &str, - ) -> bool { - todo!() - } - - fn Window_create_named_properties_object( - cx: crate::script_runtime::JSContext, - proto: js::rust::HandleObject, - object: js::rust::MutableHandleObject, - ) { - todo!() - } - - fn Promise_new_resolved( - global: &::GlobalScope, - cx: crate::script_runtime::JSContext, - value: js::rust::HandleValue, - ) -> crate::dom::bindings::error::Fallible< - std::rc::Rc<::Promise>, - > { - todo!() - } - - unsafe fn GlobalScope_from_object_maybe_wrapped( - obj: *mut js::jsapi::JSObject, - cx: *mut js::jsapi::JSContext, - ) -> crate::dom::bindings::root::DomRoot< - ::GlobalScope, - > { - todo!() - } - - fn GlobalScope_incumbent() -> Option< - crate::dom::bindings::root::DomRoot< - ::GlobalScope, - >, - > { - todo!() - } - - fn GlobalScope_get_cx() -> crate::script_runtime::JSContext { - todo!() - } - - fn GlobalScope_from_context( - cx: *mut js::jsapi::JSContext, - in_realm: crate::realms::InRealm, - ) -> crate::dom::bindings::root::DomRoot< - ::GlobalScope, - > { - todo!() - } - - fn GlobalScope_report_an_error( - info: crate::dom::bindings::error::ErrorInfo, - value: js::rust::HandleValue, - ) { - todo!() - } - - fn TestBinding_condition_satisfied( - cx: crate::script_runtime::JSContext, - obj: js::rust::HandleObject, - ) -> bool { - todo!() - } - fn TestBinding_condition_unsatisfied( - cx: crate::script_runtime::JSContext, - obj: js::rust::HandleObject, - ) -> bool { - todo!() - } - fn WebGL2RenderingContext_is_webgl2_enabled( - cx: crate::script_runtime::JSContext, - obj: js::rust::HandleObject, - ) -> bool { - todo!() - } - - fn perform_a_microtask_checkpoint( - global: &::GlobalScope, - ) { - todo!() - } - - fn ReadableStream_from_js( - cx: crate::script_runtime::JSContext, - obj: *mut js::jsapi::JSObject, - in_realm: crate::realms::InRealm, - ) -> Result< - crate::dom::bindings::root::DomRoot< - ::ReadableStream, - >, - (), - > { - todo!() - } - - fn DOMException_stringifier( - exception: &::DOMException, - ) -> crate::dom::bindings::str::DOMString { - todo!() - } - - fn get_map() -> &'static phf::Map< - &'static [u8], - fn(crate::script_runtime::JSContext, js::rust::HandleObject), - > { - todo!() - } - - fn AudioBuffer_get_channels(buffer: &::AudioBuffer) -> Ref> { - todo!() - } -} diff --git a/components/script/realms.rs b/components/script/realms.rs index 3f5d171b0a15..b9a7ba7893e2 100644 --- a/components/script/realms.rs +++ b/components/script/realms.rs @@ -9,7 +9,13 @@ use crate::dom::bindings::reflector::DomObject; use crate::dom::globalscope::GlobalScope; use crate::script_runtime::JSContext; -pub struct AlreadyInRealm; +pub struct AlreadyInRealm(()); + +impl<'a> From<&'a script_bindings::realms::AlreadyInRealm> for AlreadyInRealm { + fn from(_realm: &'a script_bindings::realms::AlreadyInRealm) -> Self { + Self(()) + } +} impl AlreadyInRealm { #![allow(unsafe_code)] diff --git a/components/script_bindings/codegen/CodegenRust.py b/components/script_bindings/codegen/CodegenRust.py index 9bcf2520a73b..c553870f86dd 100644 --- a/components/script_bindings/codegen/CodegenRust.py +++ b/components/script_bindings/codegen/CodegenRust.py @@ -5943,7 +5943,7 @@ def getBody(self): set += dedent( """ if !proxyhandler::is_platform_object_same_origin(cx, proxy) { - return >::report_cross_origin_denial(cx, id, "define"); + return report_cross_origin_denial::(cx, id, "define"); } // Safe to enter the Realm of proxy now. @@ -6002,7 +6002,7 @@ def getBody(self): set += dedent( """ if !proxyhandler::is_platform_object_same_origin(cx, proxy) { - return >::report_cross_origin_denial(cx, id, "delete"); + return report_cross_origin_denial::(cx, id, "delete"); } // Safe to enter the Realm of proxy now. diff --git a/components/script_bindings/error.rs b/components/script_bindings/error.rs index 39500a4865c6..94e186a31e5b 100644 --- a/components/script_bindings/error.rs +++ b/components/script_bindings/error.rs @@ -311,7 +311,7 @@ pub unsafe fn report_pending_exception( if dispatch_event { let global = >::GlobalScope_from_context(cx, realm); - D::GlobalScope_report_an_error(error_info, value.handle()); + D::GlobalScope_report_an_error(&global, error_info, value.handle()); } } diff --git a/components/script_bindings/lib.rs b/components/script_bindings/lib.rs index 994761f3be83..cbd737bbd46b 100644 --- a/components/script_bindings/lib.rs +++ b/components/script_bindings/lib.rs @@ -321,7 +321,7 @@ pub mod dom { }; pub use crate::dom::bindings::proxyhandler; pub use crate::dom::bindings::proxyhandler::{ - ensure_expando_object, get_expando_object, set_property_descriptor, + ensure_expando_object, get_expando_object, set_property_descriptor, report_cross_origin_denial }; pub use crate::dom::bindings::record::Record; pub use crate::dom::bindings::reflector::{ diff --git a/components/script_bindings/reflector.rs b/components/script_bindings/reflector.rs index 2427bfc1653e..1fbe373e6548 100644 --- a/components/script_bindings/reflector.rs +++ b/components/script_bindings/reflector.rs @@ -130,9 +130,8 @@ pub trait DomGlobal: DomObject { where Self: Sized, { - /*let realm = AlreadyInRealm::assert_for_cx(GlobalScope::get_cx()); - GlobalScope::from_reflector(self, &realm)*/ - todo!() + let realm = AlreadyInRealm::assert_for_cx(>::GlobalScope_get_cx()); + >::GlobalScope_from_reflector(self, &realm) } } diff --git a/components/script_bindings/utils.rs b/components/script_bindings/utils.rs index c75ada1c8b49..4fd23f3f5e2a 100644 --- a/components/script_bindings/utils.rs +++ b/components/script_bindings/utils.rs @@ -682,12 +682,6 @@ pub trait DomHelpers { fn global_scope_origin(global: &D::GlobalScope) -> &servo_url::MutableOrigin; - fn report_cross_origin_denial( - cx: crate::script_runtime::JSContext, - id: RawHandleId, - access: &str, - ) -> bool; - fn Window_create_named_properties_object( cx: SafeJSContext, proto: HandleObject, @@ -709,12 +703,21 @@ pub trait DomHelpers { fn GlobalScope_get_cx() -> crate::script_runtime::JSContext; - fn GlobalScope_from_context( + unsafe fn GlobalScope_from_context( cx: *mut JSContext, in_realm: crate::realms::InRealm, ) -> crate::root::DomRoot; - fn GlobalScope_report_an_error(info: crate::error::ErrorInfo, value: HandleValue); + fn GlobalScope_from_reflector( + reflector: &impl crate::reflector::DomObject, + realm: &crate::realms::AlreadyInRealm, + ) -> crate::root::DomRoot; + + fn GlobalScope_report_an_error( + global: &D::GlobalScope, + info: crate::error::ErrorInfo, + value: HandleValue, + ); fn TestBinding_condition_satisfied( cx: crate::script_runtime::JSContext, @@ -731,7 +734,7 @@ pub trait DomHelpers { fn perform_a_microtask_checkpoint(global: &D::GlobalScope); - fn ReadableStream_from_js( + unsafe fn ReadableStream_from_js( cx: crate::script_runtime::JSContext, obj: *mut JSObject, in_realm: crate::realms::InRealm,