diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index d2d37e5c32a..ed53c70ae39 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -90,6 +90,12 @@ malloc_size_of_is_0!(UntrustedNodeAddress); #[allow(unsafe_code)] unsafe impl Send for UntrustedNodeAddress {} +impl From for UntrustedNodeAddress { + fn from(o: style_traits::dom::OpaqueNode) -> Self { + UntrustedNodeAddress(o.0 as *const c_void) + } +} + impl Serialize for UntrustedNodeAddress { fn serialize(&self, s: S) -> Result { (self.0 as usize).serialize(s) diff --git a/components/style/dom.rs b/components/style/dom.rs index 74067e225c8..7629bb11e18 100644 --- a/components/style/dom.rs +++ b/components/style/dom.rs @@ -32,26 +32,7 @@ use std::fmt::Debug; use std::hash::Hash; use std::ops::Deref; -/// An opaque handle to a node, which, unlike UnsafeNode, cannot be transformed -/// back into a non-opaque representation. The only safe operation that can be -/// performed on this node is to compare it to another opaque handle or to another -/// OpaqueNode. -/// -/// Layout and Graphics use this to safely represent nodes for comparison purposes. -/// Because the script task's GC does not trace layout, node data cannot be safely stored in layout -/// data structures. Also, layout code tends to be faster when the DOM is not being accessed, for -/// locality reasons. Using `OpaqueNode` enforces this invariant. -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -#[cfg_attr(feature = "servo", derive(MallocSizeOf, Deserialize, Serialize))] -pub struct OpaqueNode(pub usize); - -impl OpaqueNode { - /// Returns the address of this node, for debugging purposes. - #[inline] - pub fn id(&self) -> usize { - self.0 - } -} +pub use style_traits::dom::OpaqueNode; /// Simple trait to provide basic information about the type of an element. /// diff --git a/components/style_traits/dom.rs b/components/style_traits/dom.rs new file mode 100644 index 00000000000..f9844519279 --- /dev/null +++ b/components/style_traits/dom.rs @@ -0,0 +1,26 @@ +/* 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/. */ + +//! Types used to access the DOM from style calculation. + +/// An opaque handle to a node, which, unlike UnsafeNode, cannot be transformed +/// back into a non-opaque representation. The only safe operation that can be +/// performed on this node is to compare it to another opaque handle or to another +/// OpaqueNode. +/// +/// Layout and Graphics use this to safely represent nodes for comparison purposes. +/// Because the script task's GC does not trace layout, node data cannot be safely stored in layout +/// data structures. Also, layout code tends to be faster when the DOM is not being accessed, for +/// locality reasons. Using `OpaqueNode` enforces this invariant. +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +#[cfg_attr(feature = "servo", derive(MallocSizeOf, Deserialize, Serialize))] +pub struct OpaqueNode(pub usize); + +impl OpaqueNode { + /// Returns the address of this node, for debugging purposes. + #[inline] + pub fn id(&self) -> usize { + self.0 + } +} diff --git a/components/style_traits/lib.rs b/components/style_traits/lib.rs index 3fb17743c13..516e7b6efba 100644 --- a/components/style_traits/lib.rs +++ b/components/style_traits/lib.rs @@ -86,6 +86,7 @@ pub enum CSSPixel {} // / desktop_zoom => CSSPixel pub mod arc_slice; +pub mod dom; pub mod specified_value_info; #[macro_use] pub mod values;