aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/document.rs99
-rw-r--r--components/script/dom/macros.rs102
-rw-r--r--components/script/dom/webidls/Document.webidl14
-rw-r--r--components/script/dom/webidls/DocumentOrShadowRoot.webidl18
4 files changed, 124 insertions, 109 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index ed011c8029d..81bd243aab8 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -3299,11 +3299,8 @@ impl ProfilerMetadataFactory for Document {
}
impl DocumentMethods for Document {
- // https://drafts.csswg.org/cssom/#dom-document-stylesheets
- fn StyleSheets(&self) -> DomRoot<StyleSheetList> {
- self.stylesheet_list
- .or_init(|| StyleSheetList::new(&self.window, Dom::from_ref(&self)))
- }
+ // https://w3c.github.io/webcomponents/spec/shadow/#extensions-to-the-documentorshadowroot-mixin
+ impl_document_or_shadow_root!();
// https://dom.spec.whatwg.org/#dom-document-implementation
fn Implementation(&self) -> DomRoot<DOMImplementation> {
@@ -3315,20 +3312,6 @@ impl DocumentMethods for Document {
USVString(String::from(self.url().as_str()))
}
- // https://html.spec.whatwg.org/multipage/#dom-document-activeelement
- fn GetActiveElement(&self) -> Option<DomRoot<Element>> {
- // TODO: Step 2.
-
- match self.get_focused_element() {
- Some(element) => Some(element), // Step 3. and 4.
- None => match self.GetBody() {
- // Step 5.
- Some(body) => Some(DomRoot::upcast(body)),
- None => self.GetDocumentElement(),
- },
- }
- }
-
// https://html.spec.whatwg.org/multipage/#dom-document-hasfocus
fn HasFocus(&self) -> bool {
// Step 1-2.
@@ -4273,84 +4256,6 @@ impl DocumentMethods for Document {
SetOnreadystatechange
);
- #[allow(unsafe_code)]
- // https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint
- fn ElementFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Option<DomRoot<Element>> {
- let x = *x as f32;
- let y = *y as f32;
- let point = &Point2D::new(x, y);
- let window = window_from_node(self);
- let viewport = window.window_size().initial_viewport;
-
- if self.browsing_context().is_none() {
- return None;
- }
-
- if x < 0.0 || y < 0.0 || x > viewport.width || y > viewport.height {
- return None;
- }
-
- match self
- .nodes_from_point(point, NodesFromPointQueryType::Topmost)
- .first()
- {
- Some(address) => {
- let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) };
- let node = unsafe { node::from_untrusted_node_address(js_runtime, *address) };
- let parent_node = node.GetParentNode().unwrap();
- let element_ref = node
- .downcast::<Element>()
- .unwrap_or_else(|| parent_node.downcast::<Element>().unwrap());
-
- Some(DomRoot::from_ref(element_ref))
- },
- None => self.GetDocumentElement(),
- }
- }
-
- #[allow(unsafe_code)]
- // https://drafts.csswg.org/cssom-view/#dom-document-elementsfrompoint
- fn ElementsFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Vec<DomRoot<Element>> {
- let x = *x as f32;
- let y = *y as f32;
- let point = &Point2D::new(x, y);
- let window = window_from_node(self);
- let viewport = window.window_size().initial_viewport;
-
- if self.browsing_context().is_none() {
- return vec![];
- }
-
- // Step 2
- if x < 0.0 || y < 0.0 || x > viewport.width || y > viewport.height {
- return vec![];
- }
-
- let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) };
-
- // Step 1 and Step 3
- let nodes = self.nodes_from_point(point, NodesFromPointQueryType::All);
- let mut elements: Vec<DomRoot<Element>> = nodes
- .iter()
- .flat_map(|&untrusted_node_address| {
- let node = unsafe {
- node::from_untrusted_node_address(js_runtime, untrusted_node_address)
- };
- DomRoot::downcast::<Element>(node)
- })
- .collect();
-
- // Step 4
- if let Some(root_element) = self.GetDocumentElement() {
- if elements.last() != Some(&root_element) {
- elements.push(root_element);
- }
- }
-
- // Step 5
- elements
- }
-
// https://html.spec.whatwg.org/multipage/#dom-document-open
fn Open(
&self,
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index a566fee4fb6..94a0779732c 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -632,3 +632,105 @@ macro_rules! handle_potential_webgl_error {
handle_potential_webgl_error!($context, $call, ());
};
}
+
+macro_rules! impl_document_or_shadow_root {
+ () => (
+ #[allow(unsafe_code)]
+ // https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint
+ fn ElementFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Option<DomRoot<Element>> {
+ let x = *x as f32;
+ let y = *y as f32;
+ let point = &Point2D::new(x, y);
+ let window = window_from_node(self);
+ let viewport = window.window_size().initial_viewport;
+
+ if self.browsing_context().is_none() {
+ return None;
+ }
+
+ if x < 0.0 || y < 0.0 || x > viewport.width || y > viewport.height {
+ return None;
+ }
+
+ match self
+ .nodes_from_point(point, NodesFromPointQueryType::Topmost)
+ .first()
+ {
+ Some(address) => {
+ let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) };
+ let node = unsafe { node::from_untrusted_node_address(js_runtime, *address) };
+ let parent_node = node.GetParentNode().unwrap();
+ let element_ref = node
+ .downcast::<Element>()
+ .unwrap_or_else(|| parent_node.downcast::<Element>().unwrap());
+
+ Some(DomRoot::from_ref(element_ref))
+ },
+ None => self.GetDocumentElement(),
+ }
+ }
+
+ #[allow(unsafe_code)]
+ // https://drafts.csswg.org/cssom-view/#dom-document-elementsfrompoint
+ fn ElementsFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Vec<DomRoot<Element>> {
+ let x = *x as f32;
+ let y = *y as f32;
+ let point = &Point2D::new(x, y);
+ let window = window_from_node(self);
+ let viewport = window.window_size().initial_viewport;
+
+ if self.browsing_context().is_none() {
+ return vec![];
+ }
+
+ // Step 2
+ if x < 0.0 || y < 0.0 || x > viewport.width || y > viewport.height {
+ return vec![];
+ }
+
+ let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) };
+
+ // Step 1 and Step 3
+ let nodes = self.nodes_from_point(point, NodesFromPointQueryType::All);
+ let mut elements: Vec<DomRoot<Element>> = nodes
+ .iter()
+ .flat_map(|&untrusted_node_address| {
+ let node = unsafe {
+ node::from_untrusted_node_address(js_runtime, untrusted_node_address)
+ };
+ DomRoot::downcast::<Element>(node)
+ })
+ .collect();
+
+ // Step 4
+ if let Some(root_element) = self.GetDocumentElement() {
+ if elements.last() != Some(&root_element) {
+ elements.push(root_element);
+ }
+ }
+
+ // Step 5
+ elements
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-document-activeelement
+ fn GetActiveElement(&self) -> Option<DomRoot<Element>> {
+ // TODO: Step 2.
+
+ match self.get_focused_element() {
+ Some(element) => Some(element), // Step 3. and 4.
+ None => match self.GetBody() {
+ // Step 5.
+ Some(body) => Some(DomRoot::upcast(body)),
+ None => self.GetDocumentElement(),
+ },
+ }
+ }
+
+ // https://drafts.csswg.org/cssom/#dom-document-stylesheets
+ fn StyleSheets(&self) -> DomRoot<StyleSheetList> {
+ self.stylesheet_list
+ .or_init(|| StyleSheetList::new(&self.window, Dom::from_ref(&self)))
+ }
+ )
+}
diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl
index ccc3d339377..85c3362f42e 100644
--- a/components/script/dom/webidls/Document.webidl
+++ b/components/script/dom/webidls/Document.webidl
@@ -132,7 +132,6 @@ partial /*sealed*/ interface Document {
// user interaction
readonly attribute Window?/*Proxy?*/ defaultView;
- readonly attribute Element? activeElement;
boolean hasFocus();
// [CEReactions]
// attribute DOMString designMode;
@@ -199,17 +198,6 @@ 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);
- sequence<Element> elementsFromPoint(double x, double y);
-};
-
-// https://drafts.csswg.org/cssom/#extensions-to-the-document-interface
-partial interface Document {
- [SameObject] readonly attribute StyleSheetList styleSheets;
-};
-
// https://fullscreen.spec.whatwg.org/#api
partial interface Document {
[LenientSetter] readonly attribute boolean fullscreenEnabled;
@@ -221,3 +209,5 @@ partial interface Document {
attribute EventHandler onfullscreenchange;
attribute EventHandler onfullscreenerror;
};
+
+Document implements DocumentOrShadowRoot;
diff --git a/components/script/dom/webidls/DocumentOrShadowRoot.webidl b/components/script/dom/webidls/DocumentOrShadowRoot.webidl
new file mode 100644
index 00000000000..b5a1a1d0cee
--- /dev/null
+++ b/components/script/dom/webidls/DocumentOrShadowRoot.webidl
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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/. */
+/*
+ * The origin of this IDL file is
+ * https://dom.spec.whatwg.org/#documentorshadowroot
+ * https://w3c.github.io/webcomponents/spec/shadow/#extensions-to-the-documentorshadowroot-mixin
+ */
+
+[NoInterfaceObject]
+interface DocumentOrShadowRoot {
+ // Selection? getSelection();
+ Element? elementFromPoint (double x, double y);
+ sequence<Element> elementsFromPoint (double x, double y);
+ // CaretPosition? caretPositionFromPoint (double x, double y);
+ readonly attribute Element? activeElement;
+ readonly attribute StyleSheetList styleSheets;
+};