Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Document#elementFromPoint #8932

Merged
merged 1 commit into from Feb 29, 2016
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -60,7 +60,7 @@ use dom::keyboardevent::KeyboardEvent;
use dom::location::Location;
use dom::messageevent::MessageEvent;
use dom::mouseevent::MouseEvent;
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage};
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node};
use dom::nodeiterator::NodeIterator;
use dom::nodelist::NodeList;
use dom::processinginstruction::ProcessingInstruction;
@@ -76,6 +76,7 @@ use dom::window::{ReflowReason, Window};
use euclid::point::Point2D;
use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks, QuirksMode};
use ipc_channel::ipc::{self, IpcSender};
use js::jsapi::JS_GetRuntime;
use js::jsapi::{JSContext, JSObject, JSRuntime};
use layout_interface::{HitTestResponse, MouseOverResponse};
use layout_interface::{LayoutChan, Msg, ReflowQueryType};
@@ -2474,6 +2475,35 @@ impl DocumentMethods for Document {

// https://html.spec.whatwg.org/multipage/#handler-onreadystatechange
event_handler!(readystatechange, GetOnreadystatechange, SetOnreadystatechange);

#[allow(unsafe_code)]
// https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint
fn ElementFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Option<Root<Element>> {
let x = *x as f32;
let y = *y as f32;
let point = &Point2D { x: x, y: y };
let window = window_from_node(self);
let viewport = window.window_size().unwrap().visible_viewport;

if x < 0.0 || y < 0.0 || x > viewport.width.get() || y > viewport.height.get() {
return None;
}

let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) };

match self.hit_test(point) {
Some(untrusted_node_address) => {
let node = node::from_untrusted_node_address(js_runtime, untrusted_node_address);
let parent_node = node.GetParentNode().unwrap();
let element_ref = node.downcast::<Element>().unwrap_or_else(|| {
parent_node.downcast::<Element>().unwrap()
});

Some(Root::from_ref(element_ref))
},
None => self.GetDocumentElement()
}
}
}

fn is_scheme_host_port_tuple(url: &Url) -> bool {
@@ -180,3 +180,8 @@ partial interface Document {

TouchList createTouchList(Touch... touches);
};

// https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint
partial interface Document {
Element? elementFromPoint(double x, double y);
};
@@ -1,5 +1,4 @@
[CaretPosition-001.htm]
type: testharness
[getBox]
expected: FAIL

disabled: https://github.com/servo/servo/issues/9805
@@ -1,3 +1,5 @@
[elementFromPoint-001.htm]
type: testharness
expected: TIMEOUT
[CSSOM View - 5 - extensions to the Document interface]
expected: FAIL

@@ -1,11 +1,5 @@
[elementFromPosition.htm]
type: testharness
[document.elementFromPoint]
expected: FAIL

[document.elementFromPoint is a Function]
expected: FAIL

[test some point of the element: top left corner]
expected: FAIL

@@ -33,18 +27,3 @@
[test some point of the element: botom right corner]
expected: FAIL

[Point (0, 0), return root element(HTML)]
expected: FAIL

[ test negative x ]
expected: FAIL

[ test nagetive y ]
expected: FAIL

[test outside of viewport]
expected: FAIL

[test the top of layer]
expected: FAIL

@@ -0,0 +1,20 @@
[elementFromPoint.html]
type: testharness
[co-ordinates larger than the viewport from in iframe]
expected: FAIL

[SVG element at x,y]
expected: FAIL

[transformed element at x,y]
expected: FAIL

[no hit target at x,y]
expected: FAIL

[No viewport available]
expected: FAIL

[Image Maps]
expected: FAIL

@@ -21,15 +21,6 @@
[CARRIGAGE RETURN: "2\\r2\\r10\\r10" (rect)]
expected: FAIL

[LINE TABULATION: "2\\v2\\v10\\v10" (rect)]
expected: FAIL

[LINE NEXT: "2…2…10…10" (rect)]
expected: FAIL

[EN QUAD: "2 2 10 10" (rect)]
expected: FAIL

[abc between numbers: "2a2b20c20,2,10,10" (rect)]
expected: FAIL

@@ -48,15 +39,6 @@
[leading SEMICOLON: ";2,2,10,10" (rect)]
expected: FAIL

[trailing COMMA: "2,2,10," (rect)]
expected: FAIL

[trailing SPACE: "2,2,10 " (rect)]
expected: FAIL

[trailing SEMICOLON: "2,2,10;" (rect)]
expected: FAIL

[PERCENT: "2%,2%,10%,10%" (rect)]
expected: FAIL

@@ -78,18 +60,6 @@
[non-ascii garbage: "“2,2,10,10\\"" (rect)]
expected: FAIL
[URL garbage with number: "2,2,10ls/spain/holidays/regions/10/Canary+Islands/Canary+Islands.html" (rect)]
expected: FAIL
[consecutive COMMAs: "2,,10,10" (rect)]
expected: FAIL
[consecutive SPACEs: "2 10,10" (rect)]
expected: FAIL
[consecutive SEMICOLONs: "2;;10,10" (rect)]
expected: FAIL

[several consecutive separators: ",,2;,;2,;,10 \\t\\r\\n10;;" (rect)]
expected: FAIL

@@ -1,17 +1,8 @@
[area-processing.html]
type: testharness
[too few numbers: "2,2,10" (rect)]
expected: FAIL

[negative: "-10,-10,10,10" (rect)]
expected: FAIL

[empty string: "" (rect)]
expected: FAIL

[omitted coords: null (rect)]
expected: FAIL

[first > third: "10,2,2,10" (rect)]
expected: FAIL

@@ -24,18 +15,6 @@
[negative: "-10,-10,-10,-10" (default)]
expected: FAIL

[too few numbers: "20,40" (circle)]
expected: FAIL

[negative radius: "20,40,-10" (circle)]
expected: FAIL

[zero radius: "20,40,0" (circle)]
expected: FAIL

[too few numbers: "100,100,120,100,100" (poly)]
expected: FAIL

[one too many numbers: "100,100,120,100,100,120,300" (poly)]
expected: FAIL

@@ -3,12 +3,6 @@
[missing value default: "2,2,10,10" (null)]
expected: FAIL

[missing value default: "20,40,10" (null)]
expected: FAIL

[missing value default: null (null)]
expected: FAIL

[invalid value default: "2,2,10,10" (foobar invalid)]
expected: FAIL

@@ -33,12 +27,6 @@
[simple: "20,40,10" (CIRC)]
expected: FAIL

[LATIN CAPITAL LETTER I WITH DOT ABOVE: "20,40,10" (CİRCLE)]
expected: FAIL

[LATIN SMALL LETTER DOTLESS I: "20,40,10" (cırcle)]
expected: FAIL

[simple: "100,100,120,100,100,120" (poly)]
expected: FAIL

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.