mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Introduce LayoutNodeType and LayoutElementType enums.
This commit is contained in:
parent
afc7118a67
commit
6b847eb93a
4 changed files with 137 additions and 66 deletions
|
@ -34,9 +34,8 @@ use list_item::{ListItemFlow, ListStyleTypeContent};
|
||||||
use multicol::{MulticolFlow, MulticolColumnFlow};
|
use multicol::{MulticolFlow, MulticolColumnFlow};
|
||||||
use parallel;
|
use parallel;
|
||||||
use script::layout_interface::is_image_data;
|
use script::layout_interface::is_image_data;
|
||||||
use script::layout_interface::{CharacterDataTypeId, ElementTypeId};
|
|
||||||
use script::layout_interface::{HTMLElementTypeId, NodeTypeId};
|
|
||||||
use script_layout_interface::restyle_damage::{BUBBLE_ISIZES, RECONSTRUCT_FLOW, RestyleDamage};
|
use script_layout_interface::restyle_damage::{BUBBLE_ISIZES, RECONSTRUCT_FLOW, RestyleDamage};
|
||||||
|
use script_layout_interface::{LayoutNodeType, LayoutElementType};
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::collections::LinkedList;
|
use std::collections::LinkedList;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
@ -304,44 +303,35 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode>
|
||||||
/// Builds the fragment for the given block or subclass thereof.
|
/// Builds the fragment for the given block or subclass thereof.
|
||||||
fn build_fragment_for_block(&mut self, node: &ConcreteThreadSafeLayoutNode) -> Fragment {
|
fn build_fragment_for_block(&mut self, node: &ConcreteThreadSafeLayoutNode) -> Fragment {
|
||||||
let specific_fragment_info = match node.type_id() {
|
let specific_fragment_info = match node.type_id() {
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLIFrameElement)) => {
|
||||||
HTMLElementTypeId::HTMLIFrameElement))) => {
|
|
||||||
SpecificFragmentInfo::Iframe(IframeFragmentInfo::new(node))
|
SpecificFragmentInfo::Iframe(IframeFragmentInfo::new(node))
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLImageElement)) => {
|
||||||
HTMLElementTypeId::HTMLImageElement))) => {
|
|
||||||
let image_info = box ImageFragmentInfo::new(node,
|
let image_info = box ImageFragmentInfo::new(node,
|
||||||
node.image_url(),
|
node.image_url(),
|
||||||
&self.layout_context);
|
&self.layout_context);
|
||||||
SpecificFragmentInfo::Image(image_info)
|
SpecificFragmentInfo::Image(image_info)
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLObjectElement)) => {
|
||||||
HTMLElementTypeId::HTMLObjectElement))) => {
|
|
||||||
let image_info = box ImageFragmentInfo::new(node,
|
let image_info = box ImageFragmentInfo::new(node,
|
||||||
node.object_data(),
|
node.object_data(),
|
||||||
&self.layout_context);
|
&self.layout_context);
|
||||||
SpecificFragmentInfo::Image(image_info)
|
SpecificFragmentInfo::Image(image_info)
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLTableElement)) => {
|
||||||
HTMLElementTypeId::HTMLTableElement))) => {
|
|
||||||
SpecificFragmentInfo::TableWrapper
|
SpecificFragmentInfo::TableWrapper
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLTableColElement)) => {
|
||||||
HTMLElementTypeId::HTMLTableColElement))) => {
|
|
||||||
SpecificFragmentInfo::TableColumn(TableColumnFragmentInfo::new(node))
|
SpecificFragmentInfo::TableColumn(TableColumnFragmentInfo::new(node))
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLTableCellElement)) => {
|
||||||
HTMLElementTypeId::HTMLTableCellElement(_)))) => {
|
|
||||||
SpecificFragmentInfo::TableCell
|
SpecificFragmentInfo::TableCell
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLTableRowElement)) |
|
||||||
HTMLElementTypeId::HTMLTableRowElement))) |
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLTableSectionElement)) => {
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
|
||||||
HTMLElementTypeId::HTMLTableSectionElement))) => {
|
|
||||||
SpecificFragmentInfo::TableRow
|
SpecificFragmentInfo::TableRow
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLCanvasElement)) => {
|
||||||
HTMLElementTypeId::HTMLCanvasElement))) => {
|
|
||||||
let data = node.canvas_data().unwrap();
|
let data = node.canvas_data().unwrap();
|
||||||
SpecificFragmentInfo::Canvas(box CanvasFragmentInfo::new(node, data, self.layout_context))
|
SpecificFragmentInfo::Canvas(box CanvasFragmentInfo::new(node, data, self.layout_context))
|
||||||
}
|
}
|
||||||
|
@ -690,16 +680,13 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode>
|
||||||
-> ConstructionResult {
|
-> ConstructionResult {
|
||||||
let mut initial_fragments = IntermediateInlineFragments::new();
|
let mut initial_fragments = IntermediateInlineFragments::new();
|
||||||
let node_is_input_or_text_area =
|
let node_is_input_or_text_area =
|
||||||
node.type_id() == Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
node.type_id() == Some(LayoutNodeType::Element(LayoutElementType::HTMLInputElement)) ||
|
||||||
HTMLElementTypeId::HTMLInputElement))) ||
|
node.type_id() == Some(LayoutNodeType::Element(LayoutElementType::HTMLTextAreaElement));
|
||||||
node.type_id() == Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
|
||||||
HTMLElementTypeId::HTMLTextAreaElement)));
|
|
||||||
if node.get_pseudo_element_type().is_replaced_content() ||
|
if node.get_pseudo_element_type().is_replaced_content() ||
|
||||||
node_is_input_or_text_area {
|
node_is_input_or_text_area {
|
||||||
// A TextArea's text contents are displayed through the input text
|
// A TextArea's text contents are displayed through the input text
|
||||||
// box, so don't construct them.
|
// box, so don't construct them.
|
||||||
if node.type_id() == Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
if node.type_id() == Some(LayoutNodeType::Element(LayoutElementType::HTMLTextAreaElement)) {
|
||||||
HTMLElementTypeId::HTMLTextAreaElement))) {
|
|
||||||
for kid in node.children() {
|
for kid in node.children() {
|
||||||
self.set_flow_construction_result(&kid, ConstructionResult::None)
|
self.set_flow_construction_result(&kid, ConstructionResult::None)
|
||||||
}
|
}
|
||||||
|
@ -971,7 +958,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode>
|
||||||
// fragment that needs to be generated for this inline node.
|
// fragment that needs to be generated for this inline node.
|
||||||
let mut fragments = IntermediateInlineFragments::new();
|
let mut fragments = IntermediateInlineFragments::new();
|
||||||
match (node.get_pseudo_element_type(), node.type_id()) {
|
match (node.get_pseudo_element_type(), node.type_id()) {
|
||||||
(_, Some(NodeTypeId::CharacterData(CharacterDataTypeId::Text))) => {
|
(_, Some(LayoutNodeType::Text)) => {
|
||||||
self.create_fragments_for_node_text_content(&mut fragments, node, &style)
|
self.create_fragments_for_node_text_content(&mut fragments, node, &style)
|
||||||
}
|
}
|
||||||
(PseudoElementType::Normal, _) => {
|
(PseudoElementType::Normal, _) => {
|
||||||
|
@ -1525,7 +1512,7 @@ impl<'a, ConcreteThreadSafeLayoutNode> PostorderNodeMutTraversal<ConcreteThreadS
|
||||||
};
|
};
|
||||||
(display, style.get_box().float, style.get_box().position)
|
(display, style.get_box().float, style.get_box().position)
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::Element(_)) => {
|
Some(LayoutNodeType::Element(_)) => {
|
||||||
let style = node.style(self.style_context());
|
let style = node.style(self.style_context());
|
||||||
let original_display = style.get_box()._servo_display_for_hypothetical_box;
|
let original_display = style.get_box()._servo_display_for_hypothetical_box;
|
||||||
let munged_display = match original_display {
|
let munged_display = match original_display {
|
||||||
|
@ -1534,13 +1521,13 @@ impl<'a, ConcreteThreadSafeLayoutNode> PostorderNodeMutTraversal<ConcreteThreadS
|
||||||
};
|
};
|
||||||
(munged_display, style.get_box().float, style.get_box().position)
|
(munged_display, style.get_box().float, style.get_box().position)
|
||||||
}
|
}
|
||||||
Some(NodeTypeId::CharacterData(CharacterDataTypeId::Text)) =>
|
Some(LayoutNodeType::Text) =>
|
||||||
(display::T::inline, float::T::none, position::T::static_),
|
(display::T::inline, float::T::none, position::T::static_),
|
||||||
Some(NodeTypeId::CharacterData(CharacterDataTypeId::Comment)) |
|
Some(LayoutNodeType::Comment) |
|
||||||
Some(NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction)) |
|
Some(LayoutNodeType::ProcessingInstruction) |
|
||||||
Some(NodeTypeId::DocumentType) |
|
Some(LayoutNodeType::DocumentType) |
|
||||||
Some(NodeTypeId::DocumentFragment) |
|
Some(LayoutNodeType::DocumentFragment) |
|
||||||
Some(NodeTypeId::Document(_)) => {
|
Some(LayoutNodeType::Document) => {
|
||||||
(display::T::none, float::T::none, position::T::static_)
|
(display::T::none, float::T::none, position::T::static_)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1679,19 +1666,17 @@ impl<ConcreteThreadSafeLayoutNode> NodeUtils for ConcreteThreadSafeLayoutNode
|
||||||
where ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode {
|
where ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode {
|
||||||
fn is_replaced_content(&self) -> bool {
|
fn is_replaced_content(&self) -> bool {
|
||||||
match self.type_id() {
|
match self.type_id() {
|
||||||
Some(NodeTypeId::CharacterData(_)) |
|
Some(LayoutNodeType::Comment) |
|
||||||
Some(NodeTypeId::DocumentType) |
|
Some(LayoutNodeType::ProcessingInstruction) |
|
||||||
Some(NodeTypeId::DocumentFragment) |
|
Some(LayoutNodeType::Text) |
|
||||||
Some(NodeTypeId::Document(_)) |
|
Some(LayoutNodeType::DocumentType) |
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::DocumentFragment) |
|
||||||
HTMLElementTypeId::HTMLImageElement))) |
|
Some(LayoutNodeType::Document) |
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLImageElement)) |
|
||||||
HTMLElementTypeId::HTMLIFrameElement))) |
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLIFrameElement)) |
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLCanvasElement)) => true,
|
||||||
HTMLElementTypeId::HTMLCanvasElement))) => true,
|
Some(LayoutNodeType::Element(LayoutElementType::HTMLObjectElement)) => self.has_object_data(),
|
||||||
Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
|
Some(LayoutNodeType::Element(_)) => false,
|
||||||
HTMLElementTypeId::HTMLObjectElement))) => self.has_object_data(),
|
|
||||||
Some(NodeTypeId::Element(_)) => false,
|
|
||||||
None => self.get_pseudo_element_type().is_replaced_content(),
|
None => self.get_pseudo_element_type().is_replaced_content(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ use script::layout_interface::{HTMLCanvasData, HTMLElementTypeId, LayoutCharacte
|
||||||
use script::layout_interface::{LayoutDocumentHelpers, LayoutElementHelpers, LayoutJS};
|
use script::layout_interface::{LayoutDocumentHelpers, LayoutElementHelpers, LayoutJS};
|
||||||
use script::layout_interface::{LayoutNodeHelpers, Node, NodeTypeId};
|
use script::layout_interface::{LayoutNodeHelpers, Node, NodeTypeId};
|
||||||
use script::layout_interface::{RawLayoutElementHelpers, Text, TrustedNodeAddress};
|
use script::layout_interface::{RawLayoutElementHelpers, Text, TrustedNodeAddress};
|
||||||
|
use script_layout_interface::LayoutNodeType;
|
||||||
use script_layout_interface::restyle_damage::RestyleDamage;
|
use script_layout_interface::restyle_damage::RestyleDamage;
|
||||||
use script_layout_interface::{OpaqueStyleAndLayoutData, PartialStyleAndLayoutData};
|
use script_layout_interface::{OpaqueStyleAndLayoutData, PartialStyleAndLayoutData};
|
||||||
use selectors::matching::{DeclarationBlock, ElementFlags};
|
use selectors::matching::{DeclarationBlock, ElementFlags};
|
||||||
|
@ -77,7 +78,7 @@ pub trait LayoutNode: TNode {
|
||||||
fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode;
|
fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode;
|
||||||
|
|
||||||
/// Returns the type ID of this node.
|
/// Returns the type ID of this node.
|
||||||
fn type_id(&self) -> NodeTypeId;
|
fn type_id(&self) -> LayoutNodeType;
|
||||||
|
|
||||||
fn get_style_data(&self) -> Option<&RefCell<PartialStyleAndLayoutData>>;
|
fn get_style_data(&self) -> Option<&RefCell<PartialStyleAndLayoutData>>;
|
||||||
|
|
||||||
|
@ -130,6 +131,12 @@ impl<'ln> ServoLayoutNode<'ln> {
|
||||||
chain: self.chain,
|
chain: self.chain,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn script_type_id(&self) -> NodeTypeId {
|
||||||
|
unsafe {
|
||||||
|
self.node.type_id_for_layout()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ln> TNode for ServoLayoutNode<'ln> {
|
impl<'ln> TNode for ServoLayoutNode<'ln> {
|
||||||
|
@ -151,7 +158,7 @@ impl<'ln> TNode for ServoLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_text_node(&self) -> bool {
|
fn is_text_node(&self) -> bool {
|
||||||
self.type_id() == NodeTypeId::CharacterData(CharacterDataTypeId::Text)
|
self.script_type_id() == NodeTypeId::CharacterData(CharacterDataTypeId::Text)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_element(&self) -> bool {
|
fn is_element(&self) -> bool {
|
||||||
|
@ -288,10 +295,8 @@ impl<'ln> LayoutNode for ServoLayoutNode<'ln> {
|
||||||
ServoThreadSafeLayoutNode::new(self)
|
ServoThreadSafeLayoutNode::new(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_id(&self) -> NodeTypeId {
|
fn type_id(&self) -> LayoutNodeType {
|
||||||
unsafe {
|
self.script_type_id().into()
|
||||||
self.node.type_id_for_layout()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_style_data(&self) -> Option<&RefCell<PartialStyleAndLayoutData>> {
|
fn get_style_data(&self) -> Option<&RefCell<PartialStyleAndLayoutData>> {
|
||||||
|
@ -375,7 +380,7 @@ impl<'ln> ServoLayoutNode<'ln> {
|
||||||
|
|
||||||
fn debug_str(self) -> String {
|
fn debug_str(self) -> String {
|
||||||
format!("{:?}: changed={} dirty={} dirty_descendants={}",
|
format!("{:?}: changed={} dirty={} dirty_descendants={}",
|
||||||
self.type_id(), self.has_changed(), self.is_dirty(), self.has_dirty_descendants())
|
self.script_type_id(), self.has_changed(), self.is_dirty(), self.has_dirty_descendants())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the interior of this node as a `LayoutJS`. This is highly unsafe for layout to
|
/// Returns the interior of this node as a `LayoutJS`. This is highly unsafe for layout to
|
||||||
|
@ -526,7 +531,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
match self.as_node().parent_node() {
|
match self.as_node().parent_node() {
|
||||||
None => false,
|
None => false,
|
||||||
Some(node) => {
|
Some(node) => {
|
||||||
match node.type_id() {
|
match node.script_type_id() {
|
||||||
NodeTypeId::Document(_) => true,
|
NodeTypeId::Document(_) => true,
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
|
@ -535,7 +540,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_empty(&self) -> bool {
|
fn is_empty(&self) -> bool {
|
||||||
self.as_node().children().all(|node| match node.type_id() {
|
self.as_node().children().all(|node| match node.script_type_id() {
|
||||||
NodeTypeId::Element(..) => false,
|
NodeTypeId::Element(..) => false,
|
||||||
NodeTypeId::CharacterData(CharacterDataTypeId::Text) => unsafe {
|
NodeTypeId::CharacterData(CharacterDataTypeId::Text) => unsafe {
|
||||||
node.node.downcast().unwrap().data_for_layout().is_empty()
|
node.node.downcast().unwrap().data_for_layout().is_empty()
|
||||||
|
@ -559,7 +564,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
// https://github.com/servo/servo/issues/8718
|
// https://github.com/servo/servo/issues/8718
|
||||||
NonTSPseudoClass::Link |
|
NonTSPseudoClass::Link |
|
||||||
NonTSPseudoClass::AnyLink => unsafe {
|
NonTSPseudoClass::AnyLink => unsafe {
|
||||||
match self.as_node().type_id() {
|
match self.as_node().script_type_id() {
|
||||||
// https://html.spec.whatwg.org/multipage/#selector-link
|
// https://html.spec.whatwg.org/multipage/#selector-link
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) |
|
||||||
|
@ -708,16 +713,16 @@ pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq {
|
||||||
|
|
||||||
/// Returns the type ID of this node.
|
/// Returns the type ID of this node.
|
||||||
/// Returns `None` if this is a pseudo-element; otherwise, returns `Some`.
|
/// Returns `None` if this is a pseudo-element; otherwise, returns `Some`.
|
||||||
fn type_id(&self) -> Option<NodeTypeId>;
|
fn type_id(&self) -> Option<LayoutNodeType>;
|
||||||
|
|
||||||
/// Returns the type ID of this node, without discarding pseudo-elements as
|
/// Returns the type ID of this node, without discarding pseudo-elements as
|
||||||
/// `type_id` does.
|
/// `type_id` does.
|
||||||
fn type_id_without_excluding_pseudo_elements(&self) -> NodeTypeId;
|
fn type_id_without_excluding_pseudo_elements(&self) -> LayoutNodeType;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_element_or_elements_pseudo(&self) -> bool {
|
fn is_element_or_elements_pseudo(&self) -> bool {
|
||||||
match self.type_id_without_excluding_pseudo_elements() {
|
match self.type_id_without_excluding_pseudo_elements() {
|
||||||
NodeTypeId::Element(..) => true,
|
LayoutNodeType::Element(..) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -728,7 +733,7 @@ pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq {
|
||||||
fn children(&self) -> Self::ChildrenIterator;
|
fn children(&self) -> Self::ChildrenIterator;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_element(&self) -> bool { if let Some(NodeTypeId::Element(_)) = self.type_id() { true } else { false } }
|
fn is_element(&self) -> bool { if let Some(LayoutNodeType::Element(_)) = self.type_id() { true } else { false } }
|
||||||
|
|
||||||
/// If this is an element, accesses the element data. Fails if this is not an element node.
|
/// If this is an element, accesses the element data. Fails if this is not an element node.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -909,7 +914,7 @@ pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq {
|
||||||
/// `empty_cells` per CSS 2.1 § 17.6.1.1.
|
/// `empty_cells` per CSS 2.1 § 17.6.1.1.
|
||||||
fn is_content(&self) -> bool {
|
fn is_content(&self) -> bool {
|
||||||
match self.type_id() {
|
match self.type_id() {
|
||||||
Some(NodeTypeId::Element(..)) | Some(NodeTypeId::CharacterData(CharacterDataTypeId::Text)) => true,
|
Some(LayoutNodeType::Element(..)) | Some(LayoutNodeType::Text) => true,
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1075,7 +1080,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
|
||||||
OpaqueNodeMethods::from_jsmanaged(unsafe { self.get_jsmanaged() })
|
OpaqueNodeMethods::from_jsmanaged(unsafe { self.get_jsmanaged() })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_id(&self) -> Option<NodeTypeId> {
|
fn type_id(&self) -> Option<LayoutNodeType> {
|
||||||
if self.pseudo != PseudoElementType::Normal {
|
if self.pseudo != PseudoElementType::Normal {
|
||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
|
@ -1084,7 +1089,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn type_id_without_excluding_pseudo_elements(&self) -> NodeTypeId {
|
fn type_id_without_excluding_pseudo_elements(&self) -> LayoutNodeType {
|
||||||
self.node.type_id()
|
self.node.type_id()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,8 @@ use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||||
use dom::bindings::conversions::{self, DerivedFrom};
|
use dom::bindings::conversions::{self, DerivedFrom};
|
||||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::global::GlobalRef;
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::{Castable, CharacterDataTypeId};
|
use dom::bindings::inheritance::{Castable, CharacterDataTypeId, ElementTypeId};
|
||||||
use dom::bindings::inheritance::{EventTargetTypeId, NodeTypeId};
|
use dom::bindings::inheritance::{EventTargetTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::js::RootedReference;
|
use dom::bindings::js::RootedReference;
|
||||||
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap};
|
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap};
|
||||||
|
@ -62,6 +62,7 @@ use msg::constellation_msg::PipelineId;
|
||||||
use parse::html::parse_html_fragment;
|
use parse::html::parse_html_fragment;
|
||||||
use ref_slice::ref_slice;
|
use ref_slice::ref_slice;
|
||||||
use script_layout_interface::OpaqueStyleAndLayoutData;
|
use script_layout_interface::OpaqueStyleAndLayoutData;
|
||||||
|
use script_layout_interface::{LayoutNodeType, LayoutElementType};
|
||||||
use script_traits::UntrustedNodeAddress;
|
use script_traits::UntrustedNodeAddress;
|
||||||
use selectors::matching::matches;
|
use selectors::matching::matches;
|
||||||
use selectors::parser::Selector;
|
use selectors::parser::Selector;
|
||||||
|
@ -2634,3 +2635,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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -42,3 +42,30 @@ pub struct OpaqueStyleAndLayoutData {
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe impl Send for OpaqueStyleAndLayoutData {}
|
unsafe impl Send for OpaqueStyleAndLayoutData {}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub enum LayoutNodeType {
|
||||||
|
Comment,
|
||||||
|
Document,
|
||||||
|
DocumentFragment,
|
||||||
|
DocumentType,
|
||||||
|
Element(LayoutElementType),
|
||||||
|
ProcessingInstruction,
|
||||||
|
Text,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub enum LayoutElementType {
|
||||||
|
Element,
|
||||||
|
HTMLCanvasElement,
|
||||||
|
HTMLIFrameElement,
|
||||||
|
HTMLImageElement,
|
||||||
|
HTMLInputElement,
|
||||||
|
HTMLObjectElement,
|
||||||
|
HTMLTableCellElement,
|
||||||
|
HTMLTableColElement,
|
||||||
|
HTMLTableElement,
|
||||||
|
HTMLTableRowElement,
|
||||||
|
HTMLTableSectionElement,
|
||||||
|
HTMLTextAreaElement,
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue