diff options
author | Anthony Ramine <nox@nox.paris> | 2020-03-31 22:32:35 +0200 |
---|---|---|
committer | Anthony Ramine <nox@nox.paris> | 2020-04-01 11:40:34 +0200 |
commit | fc07a5147cd26fa3d8778b3366358f8ae5bcee36 (patch) | |
tree | a5a1c0768a3796b4ff33f1796fb1d21d7ffe414e /components/script/dom/node.rs | |
parent | f712b0bcf8ee2694170d3e92f03fb87539f81324 (diff) | |
download | servo-fc07a5147cd26fa3d8778b3366358f8ae5bcee36.tar.gz servo-fc07a5147cd26fa3d8778b3366358f8ae5bcee36.zip |
Make LayoutNodeHelpers::composed_parent_node_ref be safe
For clarity, I introduce <LayoutDom<Element>>::parent_node_ref to contain
the remaining unsafety bits out of composed_parent_node_ref which is more
complex than just a field access.
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r-- | components/script/dom/node.rs | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index a42f2371d3d..7348431d4f3 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1307,7 +1307,7 @@ pub unsafe fn from_untrusted_node_address( pub trait LayoutNodeHelpers<'dom> { fn type_id_for_layout(self) -> NodeTypeId; - unsafe fn composed_parent_node_ref(self) -> Option<LayoutDom<'dom, Node>>; + fn composed_parent_node_ref(self) -> Option<LayoutDom<'dom, Node>>; fn first_child_ref(self) -> Option<LayoutDom<'dom, Node>>; fn last_child_ref(self) -> Option<LayoutDom<'dom, Node>>; fn prev_sibling_ref(self) -> Option<LayoutDom<'dom, Node>>; @@ -1339,6 +1339,14 @@ pub trait LayoutNodeHelpers<'dom> { fn opaque(self) -> OpaqueNode; } +impl<'dom> LayoutDom<'dom, Node> { + #[inline] + #[allow(unsafe_code)] + fn parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { + unsafe { self.unsafe_get().parent_node.get_inner_as_layout() } + } +} + impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] @@ -1352,10 +1360,9 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { } #[inline] - #[allow(unsafe_code)] - unsafe fn composed_parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { - let parent = (*self.unsafe_get()).parent_node.get_inner_as_layout(); - if let Some(ref parent) = parent { + fn composed_parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { + let parent = self.parent_node_ref(); + if let Some(parent) = parent { if let Some(shadow_root) = parent.downcast::<ShadowRoot>() { return Some(shadow_root.get_host_for_layout().upcast()); } |