aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/mouseevent.rs
diff options
context:
space:
mode:
authorMicah Tigley <mtigley@mozilla.com>2019-10-18 16:04:18 -0400
committerMicah Tigley <mtigley@mozilla.com>2019-11-04 18:28:08 -0500
commit38b91c3501ce460dad52432a3cb2d4a859b04662 (patch)
treee4bf7ba940b532acbecc0c1458e56d810a42d7d6 /components/script/dom/mouseevent.rs
parent1d450ba1f30b970d5ae007f42139190f8d265ce1 (diff)
downloadservo-38b91c3501ce460dad52432a3cb2d4a859b04662.tar.gz
servo-38b91c3501ce460dad52432a3cb2d4a859b04662.zip
Implement MouseEvent's x/y and offsetX/offsetY attributes
Diffstat (limited to 'components/script/dom/mouseevent.rs')
-rw-r--r--components/script/dom/mouseevent.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs
index 48600f1155e..b6ba307af52 100644
--- a/components/script/dom/mouseevent.rs
+++ b/components/script/dom/mouseevent.rs
@@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods;
use crate::dom::bindings::codegen::Bindings::MouseEventBinding;
use crate::dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods;
use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
@@ -12,6 +13,7 @@ use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString;
use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget;
+use crate::dom::node::Node;
use crate::dom::uievent::UIEvent;
use crate::dom::window::Window;
use dom_struct::dom_struct;
@@ -29,6 +31,10 @@ pub struct MouseEvent {
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>,
ctrl_key: Cell<bool>,
shift_key: Cell<bool>,
alt_key: Cell<bool>,
@@ -49,6 +55,10 @@ impl MouseEvent {
client_y: Cell::new(0),
page_x: Cell::new(0),
page_y: Cell::new(0),
+ x: Cell::new(0),
+ y: Cell::new(0),
+ offset_x: Cell::new(0),
+ offset_y: Cell::new(0),
ctrl_key: Cell::new(false),
shift_key: Cell::new(false),
alt_key: Cell::new(false),
@@ -192,6 +202,56 @@ impl MouseEventMethods for MouseEvent {
}
}
+ // 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
+ fn Y(&self) -> i32 {
+ self.client_y.get()
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-mouseevent-offsetx
+ fn OffsetX(&self) -> i32 {
+ let event = self.upcast::<Event>();
+ if event.dispatching() {
+ match event.GetTarget() {
+ Some(target) => {
+ if let Some(node) = target.downcast::<Node>() {
+ let rect = node.client_rect();
+ self.client_x.get() - rect.origin.x
+ } else {
+ self.offset_x.get()
+ }
+ },
+ None => self.offset_x.get(),
+ }
+ } else {
+ self.PageX()
+ }
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-mouseevent-offsety
+ fn OffsetY(&self) -> i32 {
+ let event = self.upcast::<Event>();
+ if event.dispatching() {
+ match event.GetTarget() {
+ Some(target) => {
+ if let Some(node) = target.downcast::<Node>() {
+ let rect = node.client_rect();
+ self.client_y.get() - rect.origin.y
+ } else {
+ self.offset_y.get()
+ }
+ },
+ None => self.offset_y.get(),
+ }
+ } else {
+ self.PageY()
+ }
+ }
+
// https://w3c.github.io/uievents/#widl-MouseEvent-ctrlKey
fn CtrlKey(&self) -> bool {
self.ctrl_key.get()