diff options
author | Dan Fox <iamdanfox@gmail.com> | 2015-03-03 17:49:10 +0000 |
---|---|---|
committer | Dan Fox <iamdanfox@gmail.com> | 2015-03-03 17:49:10 +0000 |
commit | b424de2092b818c9ed76679ffcd6ecfa621e62ef (patch) | |
tree | 04f83b0d3fcbefdaa8fe079723e4cd10251ee36f /components/layout/opaque_node.rs | |
parent | 417a932e306438b5cda7a7071412a34d3e503f94 (diff) | |
download | servo-b424de2092b818c9ed76679ffcd6ecfa621e62ef.tar.gz servo-b424de2092b818c9ed76679ffcd6ecfa621e62ef.zip |
Extract OpaqueNodeMethods to own file
Diffstat (limited to 'components/layout/opaque_node.rs')
-rw-r--r-- | components/layout/opaque_node.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/components/layout/opaque_node.rs b/components/layout/opaque_node.rs new file mode 100644 index 00000000000..e40538251de --- /dev/null +++ b/components/layout/opaque_node.rs @@ -0,0 +1,63 @@ +/* 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 http://mozilla.org/MPL/2.0/. */ + +#![allow(unsafe_blocks)] + +use gfx::display_list::OpaqueNode; +use libc::{c_void, uintptr_t}; +use script::dom::bindings::js::LayoutJS; +use script::dom::node::Node; +use script::layout_interface::{TrustedNodeAddress}; +use script_traits::UntrustedNodeAddress; +use wrapper::{LayoutNode, TLayoutNode, ThreadSafeLayoutNode}; + +pub trait OpaqueNodeMethods { + /// Converts a DOM node (layout view) to an `OpaqueNode`. + fn from_layout_node(node: &LayoutNode) -> Self; + + /// Converts a thread-safe DOM node (layout view) to an `OpaqueNode`. + fn from_thread_safe_layout_node(node: &ThreadSafeLayoutNode) -> Self; + + /// Converts a DOM node (script view) to an `OpaqueNode`. + fn from_script_node(node: TrustedNodeAddress) -> Self; + + /// Converts a DOM node to an `OpaqueNode'. + fn from_jsmanaged(node: &LayoutJS<Node>) -> Self; + + /// Converts this node to an `UntrustedNodeAddress`. An `UntrustedNodeAddress` is just the type + /// of node that script expects to receive in a hit test. + fn to_untrusted_node_address(&self) -> UntrustedNodeAddress; +} + +impl OpaqueNodeMethods for OpaqueNode { + fn from_layout_node(node: &LayoutNode) -> OpaqueNode { + unsafe { + OpaqueNodeMethods::from_jsmanaged(node.get_jsmanaged()) + } + } + + fn from_thread_safe_layout_node(node: &ThreadSafeLayoutNode) -> OpaqueNode { + unsafe { + OpaqueNodeMethods::from_jsmanaged(node.get_jsmanaged()) + } + } + + fn from_script_node(node: TrustedNodeAddress) -> OpaqueNode { + unsafe { + OpaqueNodeMethods::from_jsmanaged(&LayoutJS::from_trusted_node_address(node)) + } + } + + fn from_jsmanaged(node: &LayoutJS<Node>) -> OpaqueNode { + unsafe { + let ptr: uintptr_t = node.get_jsobject() as uintptr_t; + OpaqueNode(ptr) + } + } + + fn to_untrusted_node_address(&self) -> UntrustedNodeAddress { + let OpaqueNode(addr) = *self; + UntrustedNodeAddress(addr as *const c_void) + } +} |