aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/opaque_node.rs
diff options
context:
space:
mode:
authorDan Fox <iamdanfox@gmail.com>2015-03-03 17:49:10 +0000
committerDan Fox <iamdanfox@gmail.com>2015-03-03 17:49:10 +0000
commitb424de2092b818c9ed76679ffcd6ecfa621e62ef (patch)
tree04f83b0d3fcbefdaa8fe079723e4cd10251ee36f /components/layout/opaque_node.rs
parent417a932e306438b5cda7a7071412a34d3e503f94 (diff)
downloadservo-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.rs63
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)
+ }
+}