aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-06-20 12:54:20 -0500
committerGitHub <noreply@github.com>2016-06-20 12:54:20 -0500
commitee8c5c5a67e1181eca163d3cd1189866d230b8f0 (patch)
treed3eccfea7359634f5e01f3cdbe27dc6817d3c143 /components/script/dom/node.rs
parent33bda9c207001b1f4f0676cbab3222218e94e987 (diff)
parentb56821a01f8ec8f28c37cb46568340ecb145834c (diff)
downloadservo-ee8c5c5a67e1181eca163d3cd1189866d230b8f0.tar.gz
servo-ee8c5c5a67e1181eca163d3cd1189866d230b8f0.zip
Auto merge of #11754 - Ms2ger:wrapper-traits-prep2, r=nox
Move ServoLayoutNode and related structs to script. <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/11754) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r--components/script/dom/node.rs114
1 files changed, 76 insertions, 38 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index a3289cca56e..53a3f355b9d 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -5,7 +5,6 @@
//! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements.
use app_units::Au;
-use core::nonzero::NonZero;
use devtools_traits::NodeInfo;
use document_loader::DocumentLoader;
use dom::attr::Attr;
@@ -22,8 +21,8 @@ use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::conversions::{self, DerivedFrom};
use dom::bindings::error::{Error, ErrorResult, Fallible};
use dom::bindings::global::GlobalRef;
-use dom::bindings::inheritance::{Castable, CharacterDataTypeId};
-use dom::bindings::inheritance::{EventTargetTypeId, NodeTypeId};
+use dom::bindings::inheritance::{Castable, CharacterDataTypeId, ElementTypeId};
+use dom::bindings::inheritance::{EventTargetTypeId, HTMLElementTypeId, NodeTypeId};
use dom::bindings::js::Root;
use dom::bindings::js::RootedReference;
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap};
@@ -38,7 +37,7 @@ use dom::documenttype::DocumentType;
use dom::element::{Element, ElementCreator};
use dom::eventtarget::EventTarget;
use dom::htmlbodyelement::HTMLBodyElement;
-use dom::htmlcanvaselement::{LayoutHTMLCanvasElementHelpers, HTMLCanvasData};
+use dom::htmlcanvaselement::LayoutHTMLCanvasElementHelpers;
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElement;
use dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementLayoutMethods};
@@ -57,11 +56,13 @@ use euclid::size::Size2D;
use heapsize::{HeapSizeOf, heap_size_of};
use html5ever::tree_builder::QuirksMode;
use js::jsapi::{JSContext, JSObject, JSRuntime};
-use layout_interface::Msg;
use libc::{self, c_void, uintptr_t};
use msg::constellation_msg::PipelineId;
use parse::html::parse_html_fragment;
use ref_slice::ref_slice;
+use script_layout_interface::message::Msg;
+use script_layout_interface::{HTMLCanvasData, OpaqueStyleAndLayoutData};
+use script_layout_interface::{LayoutNodeType, LayoutElementType, TrustedNodeAddress};
use script_traits::UntrustedNodeAddress;
use selectors::matching::matches;
use selectors::parser::Selector;
@@ -74,6 +75,7 @@ use std::iter::{self, FilterMap, Peekable};
use std::mem;
use std::ops::Range;
use string_cache::{Atom, Namespace, QualName};
+use style::dom::OpaqueNode;
use style::selector_impl::ServoSelectorImpl;
use url::Url;
use util::thread_state;
@@ -171,7 +173,7 @@ impl NodeFlags {
impl Drop for Node {
#[allow(unsafe_code)]
fn drop(&mut self) {
- self.style_and_layout_data.get().map(|d| d.dispose(self));
+ self.style_and_layout_data.get().map(|d| self.dispose(d));
}
}
@@ -184,29 +186,15 @@ enum SuppressObserver {
Unsuppressed
}
-#[derive(Copy, Clone, HeapSizeOf)]
-pub struct OpaqueStyleAndLayoutData {
- #[ignore_heap_size_of = "TODO(#6910) Box value that should be counted but \
- the type lives in layout"]
- pub ptr: NonZero<*mut ()>
-}
-
-#[allow(unsafe_code)]
-unsafe impl Send for OpaqueStyleAndLayoutData {}
-
-no_jsmanaged_fields!(OpaqueStyleAndLayoutData);
-
-impl OpaqueStyleAndLayoutData {
+impl Node {
/// Sends the style and layout data, if any, back to the layout thread to be destroyed.
- pub fn dispose(self, node: &Node) {
+ pub fn dispose(&self, data: OpaqueStyleAndLayoutData) {
debug_assert!(thread_state::get().is_script());
- let win = window_from_node(node);
- node.style_and_layout_data.set(None);
- win.layout_chan().send(Msg::ReapStyleAndLayoutData(self)).unwrap();
+ let win = window_from_node(self);
+ self.style_and_layout_data.set(None);
+ win.layout_chan().send(Msg::ReapStyleAndLayoutData(data)).unwrap();
}
-}
-impl Node {
/// Adds a new child to the end of this node's list of children.
///
/// Fails unless `new_child` is disconnected from the tree.
@@ -292,7 +280,7 @@ impl Node {
for node in child.traverse_preorder() {
node.set_flag(IS_IN_DOC, false);
vtable_for(&&*node).unbind_from_tree(&context);
- node.style_and_layout_data.get().map(|d| d.dispose(&node));
+ node.style_and_layout_data.get().map(|d| node.dispose(d));
}
self.owner_doc().content_and_heritage_changed(self, NodeDamage::OtherNodeDamage);
@@ -340,7 +328,7 @@ impl<'a> Iterator for QuerySelectorIterator {
impl Node {
pub fn teardown(&self) {
- self.style_and_layout_data.get().map(|d| d.dispose(self));
+ self.style_and_layout_data.get().map(|d| self.dispose(d));
for kid in self.children() {
kid.teardown();
}
@@ -974,6 +962,7 @@ pub trait LayoutNodeHelpers {
fn image_url(&self) -> Option<Url>;
fn canvas_data(&self) -> Option<HTMLCanvasData>;
fn iframe_pipeline_id(&self) -> PipelineId;
+ fn opaque(&self) -> OpaqueNode;
}
impl LayoutNodeHelpers for LayoutJS<Node> {
@@ -1114,6 +1103,13 @@ impl LayoutNodeHelpers for LayoutJS<Node> {
.expect("not an iframe element!");
iframe_element.pipeline_id().unwrap()
}
+
+ #[allow(unsafe_code)]
+ fn opaque(&self) -> OpaqueNode {
+ unsafe {
+ OpaqueNode(self.get_jsobject() as usize)
+ }
+ }
}
@@ -2413,17 +2409,6 @@ impl NodeMethods for Node {
}
}
-
-
-/// The address of a node known to be valid. These are sent from script to layout,
-/// and are also used in the HTML parser interface.
-
-#[derive(Clone, PartialEq, Eq, Copy)]
-pub struct TrustedNodeAddress(pub *const c_void);
-
-#[allow(unsafe_code)]
-unsafe impl Send for TrustedNodeAddress {}
-
pub fn document_from_node<T: DerivedFrom<Node> + Reflectable>(derived: &T) -> Root<Document> {
derived.upcast().owner_doc()
}
@@ -2648,3 +2633,56 @@ impl UniqueId {
}
}
}
+
+impl Into<LayoutNodeType> for NodeTypeId {
+ #[inline(always)]
+ fn into(self) -> LayoutNodeType {
+ match self {
+ NodeTypeId::CharacterData(CharacterDataTypeId::Comment) =>
+ LayoutNodeType::Comment,
+ NodeTypeId::Document(..) =>
+ LayoutNodeType::Document,
+ NodeTypeId::DocumentFragment =>
+ LayoutNodeType::DocumentFragment,
+ NodeTypeId::DocumentType =>
+ LayoutNodeType::DocumentType,
+ NodeTypeId::Element(e) =>
+ LayoutNodeType::Element(e.into()),
+ NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) =>
+ LayoutNodeType::ProcessingInstruction,
+ NodeTypeId::CharacterData(CharacterDataTypeId::Text) =>
+ LayoutNodeType::Text,
+ }
+ }
+}
+
+impl Into<LayoutElementType> for ElementTypeId {
+ #[inline(always)]
+ fn into(self) -> LayoutElementType {
+ match self {
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLCanvasElement) =>
+ LayoutElementType::HTMLCanvasElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLIFrameElement) =>
+ LayoutElementType::HTMLIFrameElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLImageElement) =>
+ LayoutElementType::HTMLImageElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement) =>
+ LayoutElementType::HTMLInputElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLObjectElement) =>
+ LayoutElementType::HTMLObjectElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableCellElement(_)) =>
+ LayoutElementType::HTMLTableCellElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableColElement) =>
+ LayoutElementType::HTMLTableColElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableElement) =>
+ LayoutElementType::HTMLTableElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableRowElement) =>
+ LayoutElementType::HTMLTableRowElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableSectionElement) =>
+ LayoutElementType::HTMLTableSectionElement,
+ ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement) =>
+ LayoutElementType::HTMLTextAreaElement,
+ _ => LayoutElementType::Element,
+ }
+ }
+}