aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2025-01-03 19:55:01 +0100
committerGitHub <noreply@github.com>2025-01-03 18:55:01 +0000
commite8f75c9aea37d49d988f209281169af1fed05d8e (patch)
treefeb84b30238157c296b83c8a04394c853d5052f6 /components/script/dom/node.rs
parent621ddd749c7655a93547f52a438f2e2941d7df15 (diff)
downloadservo-e8f75c9aea37d49d988f209281169af1fed05d8e.tar.gz
servo-e8f75c9aea37d49d988f209281169af1fed05d8e.zip
script: Expose node helpers as `NodeTraits` and give more descriptive names (#34832)
This puts a few commonly used `Node` helpers into a trait (`NodeTraits`) and gives them more descriptive names and documentation. The renames: - `document_from_node` -> `NodeTraits::owner_document` - `window_from_node` -> `NodeTraits::owner_window` - `stylesheets_owner_from_node<T:` -> `NodeTraits::stylesheet_list_owner` - `containing_shadow_root` -> `NodeTraits::containing_shadow_root` Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r--components/script/dom/node.rs76
1 files changed, 46 insertions, 30 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 93064696ea6..09684c5d9e9 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -413,7 +413,7 @@ impl Node {
// Spec says the choice of which global to create
// the mouse event on is not well-defined,
// and refers to heycam/webidl#135
- let win = window_from_node(self);
+ let win = self.owner_window();
let mouse_event = MouseEvent::new(
&win, // ambiguous in spec
@@ -813,7 +813,7 @@ impl Node {
/// Returns the rendered bounding content box if the element is rendered,
/// and none otherwise.
pub fn bounding_content_box(&self, can_gc: CanGc) -> Option<Rect<Au>> {
- window_from_node(self).content_box_query(self, can_gc)
+ self.owner_window().content_box_query(self, can_gc)
}
pub fn bounding_content_box_or_zero(&self, can_gc: CanGc) -> Rect<Au> {
@@ -821,11 +821,11 @@ impl Node {
}
pub fn content_boxes(&self, can_gc: CanGc) -> Vec<Rect<Au>> {
- window_from_node(self).content_boxes_query(self, can_gc)
+ self.owner_window().content_boxes_query(self, can_gc)
}
pub fn client_rect(&self, can_gc: CanGc) -> Rect<i32> {
- window_from_node(self).client_rect_query(self, can_gc)
+ self.owner_window().client_rect_query(self, can_gc)
}
/// <https://drafts.csswg.org/cssom-view/#dom-element-scrollwidth>
@@ -1044,7 +1044,7 @@ impl Node {
/// <https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall>
#[allow(unsafe_code)]
pub fn query_selector_all(&self, selectors: DOMString) -> Fallible<DomRoot<NodeList>> {
- let window = window_from_node(self);
+ let window = self.owner_window();
let iter = self.query_selector_iter(selectors)?;
Ok(NodeList::new_simple_list(&window, iter))
}
@@ -1296,7 +1296,10 @@ impl Node {
}
pub fn style(&self, can_gc: CanGc) -> Option<Arc<ComputedValues>> {
- if !window_from_node(self).layout_reflow(QueryMsg::StyleQuery, can_gc) {
+ if !self
+ .owner_window()
+ .layout_reflow(QueryMsg::StyleQuery, can_gc)
+ {
return None;
}
self.style_data
@@ -2018,8 +2021,7 @@ impl Node {
};
// Step 4.
- let document = document_from_node(parent);
- Node::adopt(node, &document);
+ Node::adopt(node, &parent.owner_document());
// Step 5.
Node::insert(
@@ -2216,7 +2218,7 @@ impl Node {
if string.len() == 0 {
Node::replace_all(None, parent);
} else {
- let text = Text::new(string, &document_from_node(parent), can_gc);
+ let text = Text::new(string, &parent.owner_document(), can_gc);
Node::replace_all(Some(text.upcast::<Node>()), parent);
};
}
@@ -2574,7 +2576,7 @@ impl Node {
/// <https://html.spec.whatwg.org/multipage/#fragment-serializing-algorithm-steps>
pub fn fragment_serialization_algorithm(&self, require_well_formed: bool) -> DOMString {
// Step 1. Let context document be node's node document.
- let context_document = document_from_node(self);
+ let context_document = self.owner_document();
// Step 2. If context document is an HTML document, return the result of HTML fragment serialization algorithm
// with node, false, and « ».
@@ -2894,7 +2896,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
let previous_sibling = child.GetPreviousSibling();
// Step 10.
- let document = document_from_node(self);
+ let document = self.owner_document();
Node::adopt(node, &document);
let removed_child = if node != child {
@@ -3310,30 +3312,44 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
}
}
-pub fn document_from_node<T: DerivedFrom<Node> + DomObject>(derived: &T) -> DomRoot<Document> {
- derived.upcast().owner_doc()
+pub(crate) trait NodeTraits {
+ /// Get the [`Document`] that owns this node. Note that this may differ from the
+ /// [`Document`] that the node was created in if it was adopted by a different
+ /// [`Document`] (the owner).
+ fn owner_document(&self) -> DomRoot<Document>;
+ /// Get the [`Window`] of the [`Document`] that owns this node. Note that this may
+ /// differ from the [`Document`] that the node was created in if it was adopted by a
+ /// different [`Document`] (the owner).
+ fn owner_window(&self) -> DomRoot<Window>;
+ /// If this [`Node`] is contained in a [`ShadowRoot`] return it, otherwise `None`.
+ fn containing_shadow_root(&self) -> Option<DomRoot<ShadowRoot>>;
+ /// Get the stylesheet owner for this node: either the [`Document`] or the [`ShadowRoot`]
+ /// of the node.
+ #[allow(crown::unrooted_must_root)]
+ fn stylesheet_list_owner(&self) -> StyleSheetListOwner;
}
-pub fn containing_shadow_root<T: DerivedFrom<Node> + DomObject>(
- derived: &T,
-) -> Option<DomRoot<ShadowRoot>> {
- derived.upcast().containing_shadow_root()
-}
+impl<T: DerivedFrom<Node> + DomObject> NodeTraits for T {
+ fn owner_document(&self) -> DomRoot<Document> {
+ self.upcast().owner_doc()
+ }
-#[allow(crown::unrooted_must_root)]
-pub fn stylesheets_owner_from_node<T: DerivedFrom<Node> + DomObject>(
- derived: &T,
-) -> StyleSheetListOwner {
- if let Some(shadow_root) = containing_shadow_root(derived) {
- StyleSheetListOwner::ShadowRoot(Dom::from_ref(&*shadow_root))
- } else {
- StyleSheetListOwner::Document(Dom::from_ref(&*document_from_node(derived)))
+ fn owner_window(&self) -> DomRoot<Window> {
+ DomRoot::from_ref(self.owner_document().window())
}
-}
-pub fn window_from_node<T: DerivedFrom<Node> + DomObject>(derived: &T) -> DomRoot<Window> {
- let document = document_from_node(derived);
- DomRoot::from_ref(document.window())
+ fn containing_shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
+ Node::containing_shadow_root(self.upcast())
+ }
+
+ #[allow(crown::unrooted_must_root)]
+ fn stylesheet_list_owner(&self) -> StyleSheetListOwner {
+ self.containing_shadow_root()
+ .map(|shadow_root| StyleSheetListOwner::ShadowRoot(Dom::from_ref(&*shadow_root)))
+ .unwrap_or_else(|| {
+ StyleSheetListOwner::Document(Dom::from_ref(&*self.owner_document()))
+ })
+ }
}
impl VirtualMethods for Node {