diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2020-02-20 16:09:40 +0100 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2020-02-25 10:47:48 +0100 |
commit | 5b2d6c81b27dec9abfab5540f8562e2d5314b87c (patch) | |
tree | ffaba5c931d98b56d7bd53996317be1df7439ad3 /components/layout_2020 | |
parent | bc66948f7cf7b1dcce3cca7af7b4a657ccd5806d (diff) | |
download | servo-5b2d6c81b27dec9abfab5540f8562e2d5314b87c.tar.gz servo-5b2d6c81b27dec9abfab5540f8562e2d5314b87c.zip |
Generate ::before and ::after content from attr() for layout 2020
Diffstat (limited to 'components/layout_2020')
-rw-r--r-- | components/layout_2020/Cargo.toml | 1 | ||||
-rw-r--r-- | components/layout_2020/dom_traversal.rs | 33 |
2 files changed, 24 insertions, 10 deletions
diff --git a/components/layout_2020/Cargo.toml b/components/layout_2020/Cargo.toml index 8d4a6d62f63..51c08c19e34 100644 --- a/components/layout_2020/Cargo.toml +++ b/components/layout_2020/Cargo.toml @@ -21,6 +21,7 @@ euclid = "0.20" fnv = "1.0" gfx = {path = "../gfx"} gfx_traits = {path = "../gfx_traits"} +html5ever = "0.25" ipc-channel = "0.14" libc = "0.2" msg = {path = "../msg"} diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs index 9d0d25cd5e4..ad58f70c65a 100644 --- a/components/layout_2020/dom_traversal.rs +++ b/components/layout_2020/dom_traversal.rs @@ -9,8 +9,11 @@ use crate::replaced::ReplacedContent; use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside, DisplayOutside}; use crate::wrapper::GetRawData; use atomic_refcell::{AtomicRefCell, AtomicRefMut}; +use html5ever::LocalName; use net_traits::image::base::Image as NetImage; -use script_layout_interface::wrapper_traits::{LayoutNode, ThreadSafeLayoutNode}; +use script_layout_interface::wrapper_traits::{ + LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode, +}; use servo_arc::Arc as ServoArc; use std::marker::PhantomData as marker; use std::sync::Arc; @@ -253,24 +256,23 @@ fn pseudo_element_style<'dom, Node>( where Node: NodeExt<'dom>, { - if let Some(pseudo_element) = match which { + match which { WhichPseudoElement::Before => element.to_threadsafe().get_before_pseudo(), WhichPseudoElement::After => element.to_threadsafe().get_after_pseudo(), - } { + } + .and_then(|pseudo_element| { let style = pseudo_element.style(context.shared_context()); if style.ineffective_content_property() { None } else { Some(style) } - } else { - None - } + }) } fn generate_pseudo_element_content<'dom, Node>( pseudo_element_style: &ComputedValues, - _element: Node, + element: Node, _context: &LayoutContext, ) -> Vec<PseudoElementContentItem> where @@ -282,14 +284,25 @@ where for item in items.iter() { match item { ContentItem::String(s) => { - vec.push(PseudoElementContentItem::Text(s.to_string())) + vec.push(PseudoElementContentItem::Text(s.to_string())); + }, + ContentItem::Attr(attr) => { + let element = element + .to_threadsafe() + .as_element() + .expect("Expected an element"); + let attr_val = element + .get_attr(&attr.namespace_url, &LocalName::from(&*attr.attribute)); + vec.push(PseudoElementContentItem::Text( + attr_val.map_or("".to_string(), |s| s.to_string()), + )); }, - _ => unimplemented!(), + _ => (), } } vec }, - _ => vec![], + Content::Normal | Content::None => unreachable!(), } } |