aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/activation.rs1
-rw-r--r--components/script/dom/document.rs108
-rwxr-xr-xcomponents/script/dom/htmlinputelement.rs30
-rw-r--r--components/script/dom/mouseevent.rs111
-rw-r--r--components/script/dom/window.rs8
-rw-r--r--components/script/script_thread.rs17
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
);
}