diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/activation.rs | 1 | ||||
-rw-r--r-- | components/script/dom/document.rs | 108 | ||||
-rwxr-xr-x | components/script/dom/htmlinputelement.rs | 30 | ||||
-rw-r--r-- | components/script/dom/mouseevent.rs | 111 | ||||
-rw-r--r-- | components/script/dom/window.rs | 8 | ||||
-rw-r--r-- | components/script/script_thread.rs | 17 |
6 files changed, 155 insertions, 120 deletions
diff --git a/components/script/dom/activation.rs b/components/script/dom/activation.rs index 1b3355372dd..029e77ed449 100644 --- a/components/script/dom/activation.rs +++ b/components/script/dom/activation.rs @@ -93,6 +93,7 @@ pub fn synthetic_click_activation(element: &Element, alt_key, meta_key, 0, + None, None); let event = mouse.upcast::<Event>(); if source == ActivationSource::FromClick { diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 09212135dd2..2e018bd62f5 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -836,7 +836,8 @@ impl Document { _button: MouseButton, client_point: Point2D<f32>, mouse_event_type: MouseEventType, - node_address: Option<UntrustedNodeAddress> + node_address: Option<UntrustedNodeAddress>, + point_in_node: Option<Point2D<f32>> ) { let mouse_event_type_string = match mouse_event_type { MouseEventType::Click => "click".to_owned(), @@ -871,22 +872,25 @@ impl Document { let client_x = client_point.x as i32; let client_y = client_point.y as i32; let click_count = 1; - let event = MouseEvent::new(&self.window, - DOMString::from(mouse_event_type_string), - EventBubbles::Bubbles, - EventCancelable::Cancelable, - Some(&self.window), - click_count, - client_x, - client_y, - client_x, - client_y, // TODO: Get real screen coordinates? - false, - false, - false, - false, - 0i16, - None); + let event = MouseEvent::new( + &self.window, + DOMString::from(mouse_event_type_string), + EventBubbles::Bubbles, + EventCancelable::Cancelable, + Some(&self.window), + click_count, + client_x, + client_y, + client_x, + client_y, // TODO: Get real screen coordinates? + false, + false, + false, + false, + 0i16, + None, + point_in_node, + ); let event = event.upcast::<Event>(); // https://w3c.github.io/uievents/#trusted-events @@ -943,22 +947,25 @@ impl Document { let client_x = click_pos.x as i32; let client_y = click_pos.y as i32; - let event = MouseEvent::new(&self.window, - DOMString::from("dblclick"), - EventBubbles::Bubbles, - EventCancelable::Cancelable, - Some(&self.window), - click_count, - client_x, - client_y, - client_x, - client_y, - false, - false, - false, - false, - 0i16, - None); + let event = MouseEvent::new( + &self.window, + DOMString::from("dblclick"), + EventBubbles::Bubbles, + EventCancelable::Cancelable, + Some(&self.window), + click_count, + client_x, + client_y, + client_x, + client_y, + false, + false, + false, + false, + 0i16, + None, + None + ); event.upcast::<Event>().fire(target.upcast()); // When a double click occurs, self.last_click_info is left as None so that a @@ -1034,22 +1041,25 @@ impl Document { let client_x = client_point.x.to_i32().unwrap_or(0); let client_y = client_point.y.to_i32().unwrap_or(0); - let mouse_event = MouseEvent::new(&self.window, - DOMString::from(event_name), - EventBubbles::Bubbles, - EventCancelable::Cancelable, - Some(&self.window), - 0i32, - client_x, - client_y, - client_x, - client_y, - false, - false, - false, - false, - 0i16, - None); + let mouse_event = MouseEvent::new( + &self.window, + DOMString::from(event_name), + EventBubbles::Bubbles, + EventCancelable::Cancelable, + Some(&self.window), + 0i32, + client_x, + client_y, + client_x, + client_y, + false, + false, + false, + false, + 0i16, + None, + None + ); let event = mouse_event.upcast::<Event>(); event.fire(target); } diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 658c1917212..459633836d3 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -11,8 +11,6 @@ use dom::bindings::codegen::Bindings::FileListBinding::FileListMethods; use dom::bindings::codegen::Bindings::HTMLInputElementBinding; use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods; -use dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods; -use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::error::{Error, ErrorResult}; use dom::bindings::inheritance::Castable; use dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom, RootedReference}; @@ -1106,23 +1104,19 @@ impl VirtualMethods for HTMLInputElement { // dispatch_key_event (document.rs) triggers a click event when releasing // the space key. There's no nice way to catch this so let's use this for // now. - if !(mouse_event.ScreenX() == 0 && mouse_event.ScreenY() == 0 && - mouse_event.GetRelatedTarget().is_none()) { - let window = window_from_node(self); - let translated_x = mouse_event.ClientX() + window.PageXOffset(); - let translated_y = mouse_event.ClientY() + window.PageYOffset(); - let TextIndexResponse(index) = window.text_index_query( - self.upcast::<Node>().to_trusted_node_address(), - translated_x, - translated_y - ); - if let Some(i) = index { - self.textinput.borrow_mut().set_edit_point_index(i as usize); - // trigger redraw - self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); - event.PreventDefault(); - } + if let Some(point_in_target) = mouse_event.point_in_target() { + let window = window_from_node(self); + let TextIndexResponse(index) = window.text_index_query( + self.upcast::<Node>().to_trusted_node_address(), + point_in_target + ); + if let Some(i) = index { + self.textinput.borrow_mut().set_edit_point_index(i as usize); + // trigger redraw + self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); + event.PreventDefault(); } + } } } } else if event.type_() == atom!("keydown") && !event.DefaultPrevented() && diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index 7e6fbd52eb8..62ec6f16ed3 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -15,6 +15,7 @@ use dom::eventtarget::EventTarget; use dom::uievent::UIEvent; use dom::window::Window; use dom_struct::dom_struct; +use euclid::Point2D; use servo_config::prefs::PREFS; use std::cell::Cell; use std::default::Default; @@ -32,6 +33,7 @@ pub struct MouseEvent { meta_key: Cell<bool>, button: Cell<i16>, related_target: MutNullableDom<EventTarget>, + point_in_target: Cell<Option<Point2D<f32>>> } impl MouseEvent { @@ -48,6 +50,7 @@ impl MouseEvent { meta_key: Cell::new(false), button: Cell::new(0), related_target: Default::default(), + point_in_target: Cell::new(None), } } @@ -57,28 +60,34 @@ impl MouseEvent { MouseEventBinding::Wrap) } - pub fn new(window: &Window, - type_: DOMString, - can_bubble: EventBubbles, - cancelable: EventCancelable, - view: Option<&Window>, - detail: i32, - screen_x: i32, - screen_y: i32, - client_x: i32, - client_y: i32, - ctrl_key: bool, - alt_key: bool, - shift_key: bool, - meta_key: bool, - button: i16, - related_target: Option<&EventTarget>) -> DomRoot<MouseEvent> { + pub fn new( + window: &Window, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + screen_x: i32, + screen_y: i32, + client_x: i32, + client_y: i32, + ctrl_key: bool, + alt_key: bool, + shift_key: bool, + meta_key: bool, + button: i16, + related_target: Option<&EventTarget>, + point_in_target: Option<Point2D<f32>> + ) -> DomRoot<MouseEvent> { let ev = MouseEvent::new_uninitialized(window); - ev.InitMouseEvent(type_, bool::from(can_bubble), bool::from(cancelable), - view, detail, - screen_x, screen_y, client_x, client_y, - ctrl_key, alt_key, shift_key, meta_key, - button, related_target); + ev.InitMouseEvent( + type_, bool::from(can_bubble), bool::from(cancelable), + view, detail, + screen_x, screen_y, client_x, client_y, + ctrl_key, alt_key, shift_key, meta_key, + button, related_target, + ); + ev.point_in_target.set(point_in_target); ev } @@ -87,18 +96,24 @@ impl MouseEvent { init: &MouseEventBinding::MouseEventInit) -> Fallible<DomRoot<MouseEvent>> { let bubbles = EventBubbles::from(init.parent.parent.parent.bubbles); let cancelable = EventCancelable::from(init.parent.parent.parent.cancelable); - let event = MouseEvent::new(window, - type_, - bubbles, - cancelable, - init.parent.parent.view.r(), - init.parent.parent.detail, - init.screenX, init.screenY, - init.clientX, init.clientY, init.parent.ctrlKey, - init.parent.altKey, init.parent.shiftKey, init.parent.metaKey, - init.button, init.relatedTarget.r()); + let event = MouseEvent::new( + window, + type_, + bubbles, + cancelable, + init.parent.parent.view.r(), + init.parent.parent.detail, + init.screenX, init.screenY, + init.clientX, init.clientY, init.parent.ctrlKey, + init.parent.altKey, init.parent.shiftKey, init.parent.metaKey, + init.button, init.relatedTarget.r(), None + ); Ok(event) } + + pub fn point_in_target(&self) -> Option<Point2D<f32>> { + self.point_in_target.get() + } } impl MouseEventMethods for MouseEvent { @@ -166,22 +181,24 @@ impl MouseEventMethods for MouseEvent { } // https://w3c.github.io/uievents/#widl-MouseEvent-initMouseEvent - fn InitMouseEvent(&self, - type_arg: DOMString, - can_bubble_arg: bool, - cancelable_arg: bool, - view_arg: Option<&Window>, - detail_arg: i32, - screen_x_arg: i32, - screen_y_arg: i32, - client_x_arg: i32, - client_y_arg: i32, - ctrl_key_arg: bool, - alt_key_arg: bool, - shift_key_arg: bool, - meta_key_arg: bool, - button_arg: i16, - related_target_arg: Option<&EventTarget>) { + fn InitMouseEvent( + &self, + type_arg: DOMString, + can_bubble_arg: bool, + cancelable_arg: bool, + view_arg: Option<&Window>, + detail_arg: i32, + screen_x_arg: i32, + screen_y_arg: i32, + client_x_arg: i32, + client_y_arg: i32, + ctrl_key_arg: bool, + alt_key_arg: bool, + shift_key_arg: bool, + meta_key_arg: bool, + button_arg: i16, + related_target_arg: Option<&EventTarget>, + ) { if self.upcast::<Event>().dispatching() { return; } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 6a62e124b92..7746e637758 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1481,8 +1481,12 @@ impl Window { self.layout_rpc.margin_style() } - pub fn text_index_query(&self, node: TrustedNodeAddress, mouse_x: i32, mouse_y: i32) -> TextIndexResponse { - if !self.reflow(ReflowGoal::TextIndexQuery(node, mouse_x, mouse_y), ReflowReason::Query) { + pub fn text_index_query( + &self, + node: TrustedNodeAddress, + point_in_node: Point2D<f32> + ) -> TextIndexResponse { + if !self.reflow(ReflowGoal::TextIndexQuery(node, point_in_node), ReflowReason::Query) { return TextIndexResponse(None); } self.layout_rpc.text_index() diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e5a9a0401aa..354cc1928f7 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2191,8 +2191,15 @@ impl ScriptThread { self.handle_resize_event(pipeline_id, new_size, size_type); } - MouseButtonEvent(event_type, button, point, node_address) => { - self.handle_mouse_event(pipeline_id, event_type, button, point, node_address); + MouseButtonEvent(event_type, button, point, node_address, point_in_node) => { + self.handle_mouse_event( + pipeline_id, + event_type, + button, + point, + node_address, + point_in_node + ); } MouseMoveEvent(point, node_address) => { @@ -2303,7 +2310,8 @@ impl ScriptThread { mouse_event_type: MouseEventType, button: MouseButton, point: Point2D<f32>, - node_address: Option<UntrustedNodeAddress> + node_address: Option<UntrustedNodeAddress>, + point_in_node: Option<Point2D<f32>> ) { let document = match { self.documents.borrow().find_document(pipeline_id) } { Some(document) => document, @@ -2314,7 +2322,8 @@ impl ScriptThread { button, point, mouse_event_type, - node_address + node_address, + point_in_node ); } |