mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Add a new struct `LayoutBoxBase`, that will be used throughout the box tree. The idea of this struct is that we have a place to consistently store common layout information (style and node information) and also to cache layout results such as content sizes (inline and maybe later box sizes) and eventually layout results. In addition to the addition of this struct, `IndependentFormattingContext` is flattened slightly so that it directly holds the contents of both replaced and non-replaced elements. This is only added to independent formatting contexts, but will later be added to all block containers as well. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
98 lines
3.5 KiB
Rust
98 lines
3.5 KiB
Rust
/* 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 https://mozilla.org/MPL/2.0/. */
|
|
|
|
use log::warn;
|
|
use style::properties::longhands::list_style_type::computed_value::T as ListStyleType;
|
|
use style::properties::style_structs;
|
|
use style::values::computed::Image;
|
|
|
|
use crate::context::LayoutContext;
|
|
use crate::dom::NodeExt;
|
|
use crate::dom_traversal::{NodeAndStyleInfo, PseudoElementContentItem};
|
|
use crate::replaced::ReplacedContents;
|
|
|
|
/// <https://drafts.csswg.org/css-lists/#content-property>
|
|
pub(crate) fn make_marker<'dom, Node>(
|
|
context: &LayoutContext,
|
|
info: &NodeAndStyleInfo<Node>,
|
|
) -> Option<Vec<PseudoElementContentItem>>
|
|
where
|
|
Node: NodeExt<'dom>,
|
|
{
|
|
let style = info.style.get_list();
|
|
let node = match info.node {
|
|
Some(node) => node,
|
|
None => {
|
|
warn!("Tried to make a marker for an anonymous node!");
|
|
return None;
|
|
},
|
|
};
|
|
|
|
// https://drafts.csswg.org/css-lists/#marker-image
|
|
let marker_image = || match &style.list_style_image {
|
|
Image::Url(url) => Some(vec![
|
|
PseudoElementContentItem::Replaced(ReplacedContents::from_image_url(
|
|
node, context, url,
|
|
)?),
|
|
PseudoElementContentItem::Text(" ".into()),
|
|
]),
|
|
// XXX: Non-None image types unimplemented.
|
|
Image::ImageSet(..) |
|
|
Image::Gradient(..) |
|
|
Image::CrossFade(..) |
|
|
Image::PaintWorklet(..) |
|
|
Image::None => None,
|
|
};
|
|
marker_image().or_else(|| {
|
|
Some(vec![PseudoElementContentItem::Text(
|
|
marker_string(style)?.into(),
|
|
)])
|
|
})
|
|
}
|
|
|
|
/// <https://drafts.csswg.org/css-lists/#marker-string>
|
|
fn marker_string(style: &style_structs::List) -> Option<&'static str> {
|
|
match style.list_style_type {
|
|
ListStyleType::None => None,
|
|
// TODO: Using non-breaking space here is a bit of a hack to give a bit of margin to outside
|
|
// markers, but really we should be setting `white-space: pre` on them instead.
|
|
// See https://github.com/w3c/csswg-drafts/issues/4891.
|
|
ListStyleType::Disc => Some("•\u{00a0}"),
|
|
ListStyleType::Circle => Some("◦\u{00a0}"),
|
|
ListStyleType::Square => Some("▪\u{00a0}"),
|
|
ListStyleType::DisclosureOpen => Some("▾\u{00a0}"),
|
|
ListStyleType::DisclosureClosed => Some("‣\u{00a0}"),
|
|
ListStyleType::Decimal |
|
|
ListStyleType::LowerAlpha |
|
|
ListStyleType::UpperAlpha |
|
|
ListStyleType::ArabicIndic |
|
|
ListStyleType::Bengali |
|
|
ListStyleType::Cambodian |
|
|
ListStyleType::CjkDecimal |
|
|
ListStyleType::Devanagari |
|
|
ListStyleType::Gujarati |
|
|
ListStyleType::Gurmukhi |
|
|
ListStyleType::Kannada |
|
|
ListStyleType::Khmer |
|
|
ListStyleType::Lao |
|
|
ListStyleType::Malayalam |
|
|
ListStyleType::Mongolian |
|
|
ListStyleType::Myanmar |
|
|
ListStyleType::Oriya |
|
|
ListStyleType::Persian |
|
|
ListStyleType::Telugu |
|
|
ListStyleType::Thai |
|
|
ListStyleType::Tibetan |
|
|
ListStyleType::CjkEarthlyBranch |
|
|
ListStyleType::CjkHeavenlyStem |
|
|
ListStyleType::LowerGreek |
|
|
ListStyleType::Hiragana |
|
|
ListStyleType::HiraganaIroha |
|
|
ListStyleType::Katakana |
|
|
ListStyleType::KatakanaIroha => {
|
|
// TODO: Implement support for counters.
|
|
None
|
|
},
|
|
}
|
|
}
|