diff options
author | Simon Wülker <simon.wuelker@arcor.de> | 2025-03-18 10:35:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-18 09:35:24 +0000 |
commit | 2113e548196d89617820f6b63966ddb7b9fae316 (patch) | |
tree | d9cc96288c2eb8cef0eedcb696ccb3a8d65267d9 /components/script/dom/mouseevent.rs | |
parent | bcdd34e2aabefcde9c486d02dfdc3be1f9c6d38e (diff) | |
download | servo-2113e548196d89617820f6b63966ddb7b9fae316.tar.gz servo-2113e548196d89617820f6b63966ddb7b9fae316.zip |
Set composed flag for mouse events dispatched by the UA (#36010)
* Add doc comments to mouse event methods
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Make MouseEvents composed by default
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
---------
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
Diffstat (limited to 'components/script/dom/mouseevent.rs')
-rw-r--r-- | components/script/dom/mouseevent.rs | 110 |
1 files changed, 90 insertions, 20 deletions
diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index 2e769972ab2..71792fcec2b 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -9,6 +9,7 @@ use dom_struct::dom_struct; use euclid::default::Point2D; use js::rust::HandleObject; use servo_config::pref; +use webrender_traits::CompositorHitTestResult; use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods; use crate::dom::bindings::codegen::Bindings::MouseEventBinding; @@ -26,25 +27,49 @@ use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use crate::script_runtime::CanGc; +/// <https://w3c.github.io/uievents/#interface-mouseevent> #[dom_struct] pub(crate) struct MouseEvent { uievent: UIEvent, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-screenx> screen_x: Cell<i32>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-screeny> screen_y: Cell<i32>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-clientx> client_x: Cell<i32>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-clienty> client_y: Cell<i32>, + page_x: Cell<i32>, page_y: Cell<i32>, x: Cell<i32>, y: Cell<i32>, offset_x: Cell<i32>, offset_y: Cell<i32>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-ctrlkey> ctrl_key: Cell<bool>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-shiftkey> shift_key: Cell<bool>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-altkey> alt_key: Cell<bool>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-metakey> meta_key: Cell<bool>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-button> button: Cell<i16>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-buttons> buttons: Cell<u16>, + + /// <https://w3c.github.io/uievents/#dom-mouseevent-relatedtarget> related_target: MutNullableDom<EventTarget>, #[no_trace] point_in_target: Cell<Option<Point2D<f32>>>, @@ -237,10 +262,55 @@ impl MouseEvent { pub(crate) fn point_in_target(&self) -> Option<Point2D<f32>> { self.point_in_target.get() } + + /// Create a [MouseEvent] triggered by the embedder + pub(crate) fn for_platform_mouse_event( + event: embedder_traits::MouseButtonEvent, + pressed_mouse_buttons: u16, + window: &Window, + hit_test_result: &CompositorHitTestResult, + can_gc: CanGc, + ) -> DomRoot<Self> { + let mouse_event_type_string = match event.action { + embedder_traits::MouseButtonAction::Click => "click", + embedder_traits::MouseButtonAction::Up => "mouseup", + embedder_traits::MouseButtonAction::Down => "mousedown", + }; + + let client_x = hit_test_result.point_in_viewport.x as i32; + let client_y = hit_test_result.point_in_viewport.y as i32; + let click_count = 1; + let mouse_event = MouseEvent::new( + window, + mouse_event_type_string.into(), + EventBubbles::Bubbles, + EventCancelable::Cancelable, + Some(window), + click_count, + client_x, + client_y, + client_x, + client_y, // TODO: Get real screen coordinates? + false, + false, + false, + false, + event.button.into(), + pressed_mouse_buttons, + None, + Some(hit_test_result.point_relative_to_item), + can_gc, + ); + + mouse_event.upcast::<Event>().set_trusted(true); + mouse_event.upcast::<Event>().set_composed(true); + + mouse_event + } } impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { - // https://w3c.github.io/uievents/#dom-mouseevent-mouseevent + /// <https://w3c.github.io/uievents/#dom-mouseevent-mouseevent> fn Constructor( window: &Window, proto: Option<HandleObject>, @@ -275,27 +345,27 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { Ok(event) } - // https://w3c.github.io/uievents/#widl-MouseEvent-screenX + /// <https://w3c.github.io/uievents/#widl-MouseEvent-screenX> fn ScreenX(&self) -> i32 { self.screen_x.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-screenY + /// <https://w3c.github.io/uievents/#widl-MouseEvent-screenY> fn ScreenY(&self) -> i32 { self.screen_y.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-clientX + /// <https://w3c.github.io/uievents/#widl-MouseEvent-clientX> fn ClientX(&self) -> i32 { self.client_x.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-clientY + /// <https://w3c.github.io/uievents/#widl-MouseEvent-clientY> fn ClientY(&self) -> i32 { self.client_y.get() } - // https://drafts.csswg.org/cssom-view/#dom-mouseevent-pagex + /// <https://drafts.csswg.org/cssom-view/#dom-mouseevent-pagex> fn PageX(&self) -> i32 { if self.upcast::<Event>().dispatching() { self.page_x.get() @@ -306,7 +376,7 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { } } - // https://drafts.csswg.org/cssom-view/#dom-mouseevent-pagey + /// <https://drafts.csswg.org/cssom-view/#dom-mouseevent-pagey> fn PageY(&self) -> i32 { if self.upcast::<Event>().dispatching() { self.page_y.get() @@ -317,17 +387,17 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { } } - // https://drafts.csswg.org/cssom-view/#dom-mouseevent-x + /// <https://drafts.csswg.org/cssom-view/#dom-mouseevent-x> fn X(&self) -> i32 { self.client_x.get() } - // https://drafts.csswg.org/cssom-view/#dom-mouseevent-y + /// <https://drafts.csswg.org/cssom-view/#dom-mouseevent-y> fn Y(&self) -> i32 { self.client_y.get() } - // https://drafts.csswg.org/cssom-view/#dom-mouseevent-offsetx + /// <https://drafts.csswg.org/cssom-view/#dom-mouseevent-offsetx> fn OffsetX(&self, can_gc: CanGc) -> i32 { let event = self.upcast::<Event>(); if event.dispatching() { @@ -347,7 +417,7 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { } } - // https://drafts.csswg.org/cssom-view/#dom-mouseevent-offsety + /// <https://drafts.csswg.org/cssom-view/#dom-mouseevent-offsety> fn OffsetY(&self, can_gc: CanGc) -> i32 { let event = self.upcast::<Event>(); if event.dispatching() { @@ -367,37 +437,37 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { } } - // https://w3c.github.io/uievents/#widl-MouseEvent-ctrlKey + /// <https://w3c.github.io/uievents/#dom-mouseevent-ctrlkey> fn CtrlKey(&self) -> bool { self.ctrl_key.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-shiftKey + /// <https://w3c.github.io/uievents/#dom-mouseevent-shiftkey> fn ShiftKey(&self) -> bool { self.shift_key.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-altKey + /// <https://w3c.github.io/uievents/#dom-mouseevent-altkey> fn AltKey(&self) -> bool { self.alt_key.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-metaKey + /// <https://w3c.github.io/uievents/#dom-mouseevent-metakey> fn MetaKey(&self) -> bool { self.meta_key.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-button + /// <https://w3c.github.io/uievents/#dom-mouseevent-button> fn Button(&self) -> i16 { self.button.get() } - // https://w3c.github.io/uievents/#dom-mouseevent-buttons + /// <https://w3c.github.io/uievents/#dom-mouseevent-buttons> fn Buttons(&self) -> u16 { self.buttons.get() } - // https://w3c.github.io/uievents/#widl-MouseEvent-relatedTarget + /// <https://w3c.github.io/uievents/#widl-MouseEvent-relatedTarget> fn GetRelatedTarget(&self) -> Option<DomRoot<EventTarget>> { self.related_target.get() } @@ -415,7 +485,7 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { } } - // https://w3c.github.io/uievents/#widl-MouseEvent-initMouseEvent + /// <https://w3c.github.io/uievents/#widl-MouseEvent-initMouseEvent> fn InitMouseEvent( &self, type_arg: DOMString, @@ -457,7 +527,7 @@ impl MouseEventMethods<crate::DomTypeHolder> for MouseEvent { self.related_target.set(related_target_arg); } - // https://dom.spec.whatwg.org/#dom-event-istrusted + /// <https://dom.spec.whatwg.org/#dom-event-istrusted> fn IsTrusted(&self) -> bool { self.uievent.IsTrusted() } |