diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index f987d73747c..e8c23b5994c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -594,7 +594,7 @@ impl Document { EventCancelable::Cancelable, Some(&self.window), clickCount, - x, y, x, y, + x, y, x, y, // TODO: Get real screen coordinates? false, false, false, false, 0i16, None); @@ -723,13 +723,18 @@ impl Document { }, }; let target = el.upcast::(); - - let x = Finite::wrap(point.x as f64); - let y = Finite::wrap(point.y as f64); - let window = self.window.root(); - let touch = Touch::new(window.r(), identifier, target, x, y, x, y); + let client_x = Finite::wrap(point.x as f64); + let client_y = Finite::wrap(point.y as f64); + let page_x = Finite::wrap(point.x as f64 + window.PageXOffset() as f64); + let page_y = Finite::wrap(point.y as f64 + window.PageYOffset() as f64); + + let touch = Touch::new(window.r(), identifier, target, + client_x, client_y, // TODO: Get real screen coordinates? + client_x, client_y, + page_x, page_y); + let mut touches = RootedVec::new(); touches.push(JS::from_rooted(&touch)); let touches = TouchList::new(window.r(), touches.r()); @@ -1414,6 +1419,21 @@ impl DocumentMethods for Document { NodeIterator::new(self, root, whatToShow, filter) } + // https://w3c.github.io/touch-events/#idl-def-Document + fn CreateTouch(&self, + window: &Window, + target: &EventTarget, + identifier: i32, + pageX: Finite, + pageY: Finite, + screenX: Finite, + screenY: Finite) + -> Root { + let clientX = Finite::wrap(*pageX - window.PageXOffset() as f64); + let clientY = Finite::wrap(*pageY - window.PageYOffset() as f64); + Touch::new(window, identifier, target, screenX, screenY, clientX, clientY, pageX, pageY) + } + // https://dom.spec.whatwg.org/#dom-document-createtreewalker fn CreateTreeWalker(&self, root: &Node, whatToShow: u32, filter: Option>) -> Root { diff --git a/components/script/dom/touch.rs b/components/script/dom/touch.rs index 7fc9f42e23d..9e25dacf422 100644 --- a/components/script/dom/touch.rs +++ b/components/script/dom/touch.rs @@ -20,12 +20,15 @@ pub struct Touch { screen_y: f64, client_x: f64, client_y: f64, + page_x: f64, + page_y: f64, } impl Touch { fn new_inherited(identifier: i32, target: &EventTarget, screen_x: Finite, screen_y: Finite, - client_x: Finite, client_y: Finite) -> Touch { + client_x: Finite, client_y: Finite, + page_x: Finite, page_y: Finite) -> Touch { Touch { reflector_: Reflector::new(), identifier: identifier, @@ -34,15 +37,19 @@ impl Touch { screen_y: *screen_y, client_x: *client_x, client_y: *client_y, + page_x: *page_x, + page_y: *page_y, } } pub fn new(window: &Window, identifier: i32, target: &EventTarget, screen_x: Finite, screen_y: Finite, - client_x: Finite, client_y: Finite) -> Root { + client_x: Finite, client_y: Finite, + page_x: Finite, page_y: Finite) -> Root { reflect_dom_object(box Touch::new_inherited(identifier, target, screen_x, screen_y, - client_x, client_y), + client_x, client_y, + page_x, page_y), GlobalRef::Window(window), TouchBinding::Wrap) } } @@ -77,4 +84,14 @@ impl TouchMethods for Touch { fn ClientY(&self) -> Finite { Finite::wrap(self.client_y) } + + /// https://w3c.github.io/touch-events/#widl-Touch-clientX + fn PageX(&self) -> Finite { + Finite::wrap(self.page_x) + } + + /// https://w3c.github.io/touch-events/#widl-Touch-clientY + fn PageY(&self) -> Finite { + Finite::wrap(self.page_y) + } } diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index edf2fb59b06..5ccd72d087d 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -159,3 +159,16 @@ partial interface Document { // Tracking issue for document.all: https://github.com/servo/servo/issues/7396 // readonly attribute HTMLAllCollection all; }; + +// http://w3c.github.io/touch-events/#idl-def-Document +partial interface Document { + Touch createTouch(Window/*Proxy*/ view, + EventTarget target, + long identifier, + double pageX, + double pageY, + double screenX, + double screenY); + // FIXME (#8159): + // TouchList createTouchList(Touch... touches); +}; diff --git a/components/script/dom/webidls/Touch.webidl b/components/script/dom/webidls/Touch.webidl index 2504c11a2bf..9805121446e 100644 --- a/components/script/dom/webidls/Touch.webidl +++ b/components/script/dom/webidls/Touch.webidl @@ -12,8 +12,8 @@ interface Touch { readonly attribute double screenY; readonly attribute double clientX; readonly attribute double clientY; - // readonly attribute double pageX; - // readonly attribute double pageY; + readonly attribute double pageX; + readonly attribute double pageY; // readonly attribute float radiusX; // readonly attribute float radiusY; // readonly attribute float rotationAngle; diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini index d59d547498b..6e061ea725e 100644 --- a/tests/wpt/include.ini +++ b/tests/wpt/include.ini @@ -15,6 +15,8 @@ skip: true skip: false [url] skip: false +[touch-events] + skip: false [workers] skip: false [XMLHttpRequest] diff --git a/tests/wpt/metadata/touch-events/create-touch-touchlist.html.ini b/tests/wpt/metadata/touch-events/create-touch-touchlist.html.ini new file mode 100644 index 00000000000..35632d4a9e0 --- /dev/null +++ b/tests/wpt/metadata/touch-events/create-touch-touchlist.html.ini @@ -0,0 +1,10 @@ +[create-touch-touchlist.html] + type: testharness + [document.createTouchList exists and correctly creates a TouchList from zero Touch objects] + expected: FAIL + + [document.createTouchList exists and correctly creates a TouchList from a single Touch] + expected: FAIL + + [document.createTouchList exists and correctly creates a TouchList from two Touch objects] + expected: FAIL