mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Implement Document#elementFromPoint
This commit is contained in:
parent
3701edbf2b
commit
76678bbdae
9 changed files with 60 additions and 88 deletions
|
@ -60,7 +60,7 @@ use dom::keyboardevent::KeyboardEvent;
|
||||||
use dom::location::Location;
|
use dom::location::Location;
|
||||||
use dom::messageevent::MessageEvent;
|
use dom::messageevent::MessageEvent;
|
||||||
use dom::mouseevent::MouseEvent;
|
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::nodeiterator::NodeIterator;
|
||||||
use dom::nodelist::NodeList;
|
use dom::nodelist::NodeList;
|
||||||
use dom::processinginstruction::ProcessingInstruction;
|
use dom::processinginstruction::ProcessingInstruction;
|
||||||
|
@ -76,6 +76,7 @@ use dom::window::{ReflowReason, Window};
|
||||||
use euclid::point::Point2D;
|
use euclid::point::Point2D;
|
||||||
use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks, QuirksMode};
|
use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks, QuirksMode};
|
||||||
use ipc_channel::ipc::{self, IpcSender};
|
use ipc_channel::ipc::{self, IpcSender};
|
||||||
|
use js::jsapi::JS_GetRuntime;
|
||||||
use js::jsapi::{JSContext, JSObject, JSRuntime};
|
use js::jsapi::{JSContext, JSObject, JSRuntime};
|
||||||
use layout_interface::{HitTestResponse, MouseOverResponse};
|
use layout_interface::{HitTestResponse, MouseOverResponse};
|
||||||
use layout_interface::{LayoutChan, Msg, ReflowQueryType};
|
use layout_interface::{LayoutChan, Msg, ReflowQueryType};
|
||||||
|
@ -2474,6 +2475,35 @@ impl DocumentMethods for Document {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#handler-onreadystatechange
|
// https://html.spec.whatwg.org/multipage/#handler-onreadystatechange
|
||||||
event_handler!(readystatechange, GetOnreadystatechange, SetOnreadystatechange);
|
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 {
|
fn is_scheme_host_port_tuple(url: &Url) -> bool {
|
||||||
|
|
|
@ -180,3 +180,8 @@ partial interface Document {
|
||||||
|
|
||||||
TouchList createTouchList(Touch... touches);
|
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]
|
[CaretPosition-001.htm]
|
||||||
type: testharness
|
type: testharness
|
||||||
[getBox]
|
[getBox]
|
||||||
expected: FAIL
|
disabled: https://github.com/servo/servo/issues/9805
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
[elementFromPoint-001.htm]
|
[elementFromPoint-001.htm]
|
||||||
type: testharness
|
type: testharness
|
||||||
expected: TIMEOUT
|
[CSSOM View - 5 - extensions to the Document interface]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,5 @@
|
||||||
[elementFromPosition.htm]
|
[elementFromPosition.htm]
|
||||||
type: testharness
|
type: testharness
|
||||||
[document.elementFromPoint]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[document.elementFromPoint is a Function]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test some point of the element: top left corner]
|
[test some point of the element: top left corner]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -33,18 +27,3 @@
|
||||||
[test some point of the element: botom right corner]
|
[test some point of the element: botom right corner]
|
||||||
expected: FAIL
|
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
|
|
||||||
|
|
||||||
|
|
20
tests/wpt/metadata/cssom-view/elementFromPoint.html.ini
Normal file
20
tests/wpt/metadata/cssom-view/elementFromPoint.html.ini
Normal file
|
@ -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)]
|
[CARRIGAGE RETURN: "2\\r2\\r10\\r10" (rect)]
|
||||||
expected: FAIL
|
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)]
|
[abc between numbers: "2a2b20c20,2,10,10" (rect)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -48,15 +39,6 @@
|
||||||
[leading SEMICOLON: ";2,2,10,10" (rect)]
|
[leading SEMICOLON: ";2,2,10,10" (rect)]
|
||||||
expected: FAIL
|
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)]
|
[PERCENT: "2%,2%,10%,10%" (rect)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -78,18 +60,6 @@
|
||||||
[non-ascii garbage: "“2,2,10,10\\"" (rect)]
|
[non-ascii garbage: "“2,2,10,10\\"" (rect)]
|
||||||
expected: FAIL
|
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)]
|
[several consecutive separators: ",,2;,;2,;,10 \\t\\r\\n10;;" (rect)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,8 @@
|
||||||
[area-processing.html]
|
[area-processing.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
[too few numbers: "2,2,10" (rect)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[negative: "-10,-10,10,10" (rect)]
|
[negative: "-10,-10,10,10" (rect)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[empty string: "" (rect)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[omitted coords: null (rect)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[first > third: "10,2,2,10" (rect)]
|
[first > third: "10,2,2,10" (rect)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -24,18 +15,6 @@
|
||||||
[negative: "-10,-10,-10,-10" (default)]
|
[negative: "-10,-10,-10,-10" (default)]
|
||||||
expected: FAIL
|
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)]
|
[one too many numbers: "100,100,120,100,100,120,300" (poly)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,6 @@
|
||||||
[missing value default: "2,2,10,10" (null)]
|
[missing value default: "2,2,10,10" (null)]
|
||||||
expected: FAIL
|
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)]
|
[invalid value default: "2,2,10,10" (foobar invalid)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -33,12 +27,6 @@
|
||||||
[simple: "20,40,10" (CIRC)]
|
[simple: "20,40,10" (CIRC)]
|
||||||
expected: FAIL
|
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)]
|
[simple: "100,100,120,100,100,120" (poly)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue