From 2fbe16876cfb3a0f11e1392acb07dc2aa91009e5 Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Sun, 8 Dec 2024 18:06:36 +0900 Subject: [PATCH] script: add `initialize_ui_event` method (#34524) * retire UIEvent::InitUIEvent Signed-off-by: Jay Wang * fix fmt Signed-off-by: Jay Wang * remove unused changes Signed-off-by: Jay Wang * reimplement the spec and reuse wherever we can Signed-off-by: Jay Wang * fix lint Signed-off-by: Jay Wang --------- Signed-off-by: Jay Wang --- components/script/dom/event.rs | 4 ++++ components/script/dom/uievent.rs | 38 +++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 52b8b838787..ed3e19184e6 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -126,6 +126,10 @@ impl Event { self.cancelable.set(cancelable); } + pub fn set_target(&self, target_: Option<&EventTarget>) { + self.target.set(target_); + } + /// // TODO: shadow roots put special flags in the path, // and it will stop just being a list of bare EventTargets diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index a868f0e9588..a40ca46aaab 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -9,15 +9,19 @@ use dom_struct::dom_struct; use js::rust::HandleObject; use servo_atoms::Atom; +use super::node::document_from_node; use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::UIEventBinding; use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; +use crate::dom::bindings::codegen::Bindings::WindowBinding::Window_Binding::WindowMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::reflect_dom_object_with_proto; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; +use crate::dom::element::Element; use crate::dom::event::{Event, EventBubbles, EventCancelable}; +use crate::dom::eventtarget::EventTarget; use crate::dom::window::Window; use crate::script_runtime::CanGc; @@ -76,15 +80,39 @@ impl UIEvent { can_gc: CanGc, ) -> DomRoot { let ev = UIEvent::new_uninitialized_with_proto(window, proto, can_gc); - ev.InitUIEvent( + ev.initialize_ui_event( type_, - bool::from(can_bubble), - bool::from(cancelable), - view, - detail, + view.map(|window| window.upcast::()), + can_bubble, + cancelable, ); + ev.detail.set(detail); ev } + + /// + pub fn initialize_ui_event( + &self, + type_: DOMString, + target_: Option<&EventTarget>, + bubbles: EventBubbles, + cancelable: EventCancelable, + ) { + // 1. Initialize the base Event attributes: + self.event + .init_event(type_.into(), bool::from(bubbles), bool::from(cancelable)); + self.event.set_target(target_); + // 2. Initialize view/detail: + if let Some(target_) = target_ { + let element = target_.downcast::(); + let document = match element { + Some(element) => document_from_node(element), + None => target_.downcast::().unwrap().Document(), + }; + self.view.set(Some(document.window())); + } + self.detail.set(0_i32); + } } impl UIEventMethods for UIEvent {