aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/dom_traversal.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2020-02-20 11:45:26 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2020-02-25 10:47:48 +0100
commitbc66948f7cf7b1dcce3cca7af7b4a657ccd5806d (patch)
treea75627938a5ca89ba8ab32a35255ae588b727cc9 /components/layout_2020/dom_traversal.rs
parent32d8a1efbbe0089adeafdffc47803fda541719bc (diff)
downloadservo-bc66948f7cf7b1dcce3cca7af7b4a657ccd5806d.tar.gz
servo-bc66948f7cf7b1dcce3cca7af7b4a657ccd5806d.zip
Generate ::before and ::after string content for layout 2020
Diffstat (limited to 'components/layout_2020/dom_traversal.rs')
-rw-r--r--components/layout_2020/dom_traversal.rs46
1 files changed, 35 insertions, 11 deletions
diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs
index 5318a74f62e..9d0d25cd5e4 100644
--- a/components/layout_2020/dom_traversal.rs
+++ b/components/layout_2020/dom_traversal.rs
@@ -17,8 +17,10 @@ use std::sync::Arc;
use style::dom::{OpaqueNode, TNode};
use style::properties::ComputedValues;
use style::selector_parser::PseudoElement;
+use style::values::generics::counters::Content;
+use style::values::generics::counters::ContentItem;
-#[derive(Clone, Copy)]
+#[derive(Clone, Copy, Debug)]
pub enum WhichPseudoElement {
Before,
After,
@@ -244,29 +246,51 @@ impl NonReplacedContents {
}
fn pseudo_element_style<'dom, Node>(
- _which: WhichPseudoElement,
- _element: Node,
- _context: &LayoutContext,
+ which: WhichPseudoElement,
+ element: Node,
+ context: &LayoutContext,
) -> Option<ServoArc<ComputedValues>>
where
Node: NodeExt<'dom>,
{
- // FIXME: run the cascade, then return None for `content: normal` or `content: none`
- // https://drafts.csswg.org/css2/generate.html#content
- None
+ if let Some(pseudo_element) = match which {
+ WhichPseudoElement::Before => element.to_threadsafe().get_before_pseudo(),
+ WhichPseudoElement::After => element.to_threadsafe().get_after_pseudo(),
+ } {
+ 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,
+ pseudo_element_style: &ComputedValues,
_element: Node,
_context: &LayoutContext,
) -> Vec<PseudoElementContentItem>
where
Node: NodeExt<'dom>,
{
- let _ = PseudoElementContentItem::Text;
- let _ = PseudoElementContentItem::Replaced;
- unimplemented!()
+ match &pseudo_element_style.get_counters().content {
+ Content::Items(ref items) => {
+ let mut vec = vec![];
+ for item in items.iter() {
+ match item {
+ ContentItem::String(s) => {
+ vec.push(PseudoElementContentItem::Text(s.to_string()))
+ },
+ _ => unimplemented!(),
+ }
+ }
+ vec
+ },
+ _ => vec![],
+ }
}
pub struct BoxSlot<'dom> {