aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/layout_2020/dom_traversal.rs10
-rw-r--r--components/layout_2020/replaced.rs36
-rw-r--r--components/style/values/specified/counters.rs2
3 files changed, 46 insertions, 2 deletions
diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs
index b5b76b1f92e..e67f06eb7f9 100644
--- a/components/layout_2020/dom_traversal.rs
+++ b/components/layout_2020/dom_traversal.rs
@@ -271,10 +271,11 @@ where
})
}
+/// https://www.w3.org/TR/CSS2/generate.html#propdef-content
fn generate_pseudo_element_content<'dom, Node>(
pseudo_element_style: &ComputedValues,
element: Node,
- _context: &LayoutContext,
+ context: &LayoutContext,
) -> Vec<PseudoElementContentItem>
where
Node: NodeExt<'dom>,
@@ -298,6 +299,13 @@ where
attr_val.map_or("".to_string(), |s| s.to_string()),
));
},
+ ContentItem::Url(image_url) => {
+ if let Some(replaced_content) =
+ ReplacedContent::from_image_url(element, context, image_url)
+ {
+ vec.push(PseudoElementContentItem::Replaced(replaced_content));
+ }
+ },
_ => (),
}
}
diff --git a/components/layout_2020/replaced.rs b/components/layout_2020/replaced.rs
index 19c4652ca4b..b9e53bec772 100644
--- a/components/layout_2020/replaced.rs
+++ b/components/layout_2020/replaced.rs
@@ -2,6 +2,7 @@
* 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 crate::context::LayoutContext;
use crate::dom_traversal::NodeExt;
use crate::fragments::{DebugId, Fragment, ImageFragment};
use crate::geom::flow_relative::{Rect, Vec2};
@@ -10,9 +11,11 @@ use crate::sizing::ContentSizes;
use crate::style_ext::ComputedValuesExt;
use crate::ContainingBlock;
use net_traits::image::base::Image;
+use net_traits::image_cache::{ImageOrMetadataAvailable, UsePlaceholder};
use servo_arc::Arc as ServoArc;
use std::sync::Arc;
use style::properties::ComputedValues;
+use style::servo::url::ComputedUrl;
use style::values::computed::{Length, LengthOrAuto};
use style::values::CSSFloat;
use style::Zero;
@@ -70,6 +73,39 @@ impl ReplacedContent {
None
}
+ pub fn from_image_url<'dom>(
+ element: impl NodeExt<'dom>,
+ context: &LayoutContext,
+ image_url: &ComputedUrl,
+ ) -> Option<Self> {
+ if let ComputedUrl::Valid(image_url) = image_url {
+ let (image, width, height) = match context.get_or_request_image_or_meta(
+ element.as_opaque(),
+ image_url.clone(),
+ UsePlaceholder::No,
+ ) {
+ Some(ImageOrMetadataAvailable::ImageAvailable(image, _)) => {
+ (Some(image.clone()), image.width as f32, image.height as f32)
+ },
+ Some(ImageOrMetadataAvailable::MetadataAvailable(metadata)) => {
+ (None, metadata.width as f32, metadata.height as f32)
+ },
+ None => return None,
+ };
+
+ return Some(Self {
+ kind: ReplacedContentKind::Image(image),
+ intrinsic: IntrinsicSizes {
+ width: Some(Length::new(width)),
+ height: Some(Length::new(height)),
+ // FIXME https://github.com/w3c/csswg-drafts/issues/4572
+ ratio: Some(width / height),
+ },
+ });
+ }
+ None
+ }
+
fn flow_relative_intrinsic_size(&self, style: &ComputedValues) -> Vec2<Option<Length>> {
let intrinsic_size = PhysicalSize::new(self.intrinsic.width, self.intrinsic.height);
Vec2::from_physical_size(&intrinsic_size, style.writing_mode)
diff --git a/components/style/values/specified/counters.rs b/components/style/values/specified/counters.rs
index 2b31ccc1a07..0ecc79fb041 100644
--- a/components/style/values/specified/counters.rs
+++ b/components/style/values/specified/counters.rs
@@ -134,7 +134,7 @@ impl Parse for Content {
let mut content = vec![];
let mut has_alt_content = false;
loop {
- #[cfg(feature = "gecko")]
+ #[cfg(any(feature = "gecko", feature = "servo-layout-2020"))]
{
if let Ok(url) = input.try(|i| SpecifiedImageUrl::parse(context, i)) {
content.push(generics::ContentItem::Url(url));