mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
style: Add a Servo API to get the serialized style of a property.
This is intended to be used by GetComputedStyle when there's no layout dependency. Bug: 1467536 Reviewed-by: xidorn MozReview-Commit-ID: 3GAbjo1uQ34
This commit is contained in:
parent
5f74a15f38
commit
011cad2534
1 changed files with 66 additions and 27 deletions
|
@ -22,8 +22,7 @@ use std::cell::RefCell;
|
||||||
use std::fmt::{self, Write};
|
use std::fmt::{self, Write};
|
||||||
use std::mem::{self, ManuallyDrop};
|
use std::mem::{self, ManuallyDrop};
|
||||||
|
|
||||||
#[cfg(feature = "servo")] use cssparser::RGBA;
|
use cssparser::{Parser, RGBA, TokenSerializationType};
|
||||||
use cssparser::{Parser, TokenSerializationType};
|
|
||||||
use cssparser::ParserInput;
|
use cssparser::ParserInput;
|
||||||
#[cfg(feature = "servo")] use euclid::SideOffsets2D;
|
#[cfg(feature = "servo")] use euclid::SideOffsets2D;
|
||||||
use context::QuirksMode;
|
use context::QuirksMode;
|
||||||
|
@ -45,7 +44,6 @@ use shared_lock::StylesheetGuards;
|
||||||
use style_traits::{CssWriter, KeywordsCollectFn, ParseError, ParsingMode};
|
use style_traits::{CssWriter, KeywordsCollectFn, ParseError, ParsingMode};
|
||||||
use style_traits::{SpecifiedValueInfo, StyleParseErrorKind, ToCss};
|
use style_traits::{SpecifiedValueInfo, StyleParseErrorKind, ToCss};
|
||||||
use stylesheets::{CssRuleType, Origin, UrlExtraData};
|
use stylesheets::{CssRuleType, Origin, UrlExtraData};
|
||||||
#[cfg(feature = "servo")] use values::Either;
|
|
||||||
use values::generics::text::LineHeight;
|
use values::generics::text::LineHeight;
|
||||||
use values::computed;
|
use values::computed;
|
||||||
use values::computed::NonNegativeLength;
|
use values::computed::NonNegativeLength;
|
||||||
|
@ -834,13 +832,13 @@ bitflags! {
|
||||||
const APPLIES_TO_FIRST_LINE = 1 << 4;
|
const APPLIES_TO_FIRST_LINE = 1 << 4;
|
||||||
/// This longhand property applies to ::placeholder.
|
/// This longhand property applies to ::placeholder.
|
||||||
const APPLIES_TO_PLACEHOLDER = 1 << 5;
|
const APPLIES_TO_PLACEHOLDER = 1 << 5;
|
||||||
|
/// This property's getComputedStyle implementation requires layout
|
||||||
|
/// to be flushed.
|
||||||
|
const GETCS_NEEDS_LAYOUT_FLUSH = 1 << 6;
|
||||||
|
|
||||||
/* The following flags are currently not used in Rust code, they
|
/* The following flags are currently not used in Rust code, they
|
||||||
* only need to be listed in corresponding properties so that
|
* only need to be listed in corresponding properties so that
|
||||||
* they can be checked in the C++ side via ServoCSSPropList.h. */
|
* they can be checked in the C++ side via ServoCSSPropList.h. */
|
||||||
/// This property's getComputedStyle implementation requires layout
|
|
||||||
/// to be flushed.
|
|
||||||
const GETCS_NEEDS_LAYOUT_FLUSH = 0;
|
|
||||||
/// This property can be animated on the compositor.
|
/// This property can be animated on the compositor.
|
||||||
const CAN_ANIMATE_ON_COMPOSITOR = 0;
|
const CAN_ANIMATE_ON_COMPOSITOR = 0;
|
||||||
}
|
}
|
||||||
|
@ -2614,6 +2612,59 @@ impl ComputedValues {
|
||||||
pub fn custom_properties(&self) -> Option<<&Arc<::custom_properties::CustomPropertiesMap>> {
|
pub fn custom_properties(&self) -> Option<<&Arc<::custom_properties::CustomPropertiesMap>> {
|
||||||
self.custom_properties.as_ref()
|
self.custom_properties.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Writes the value of the given longhand as a string in `dest`.
|
||||||
|
///
|
||||||
|
/// Note that the value will usually be the computed value, except for
|
||||||
|
/// colors, where it's resolved.
|
||||||
|
pub fn get_longhand_property_value<W>(
|
||||||
|
&self,
|
||||||
|
property_id: LonghandId,
|
||||||
|
dest: &mut CssWriter<W>
|
||||||
|
) -> fmt::Result
|
||||||
|
where
|
||||||
|
W: Write,
|
||||||
|
{
|
||||||
|
// TODO(emilio): Is it worth to merge branches here just like
|
||||||
|
// PropertyDeclaration::to_css does?
|
||||||
|
//
|
||||||
|
// We'd need to get a concept of ~resolved value, which may not be worth
|
||||||
|
// it.
|
||||||
|
match property_id {
|
||||||
|
% for prop in data.longhands:
|
||||||
|
LonghandId::${prop.camel_case} => {
|
||||||
|
let style_struct =
|
||||||
|
self.get_${prop.style_struct.ident.strip("_")}();
|
||||||
|
let value =
|
||||||
|
style_struct
|
||||||
|
% if prop.logical:
|
||||||
|
.clone_${prop.ident}(self.writing_mode);
|
||||||
|
% else:
|
||||||
|
.clone_${prop.ident}();
|
||||||
|
% endif
|
||||||
|
|
||||||
|
% if prop.predefined_type == "Color":
|
||||||
|
let value = self.resolve_color(value);
|
||||||
|
% endif
|
||||||
|
|
||||||
|
value.to_css(dest)
|
||||||
|
}
|
||||||
|
% endfor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Resolves the currentColor keyword.
|
||||||
|
///
|
||||||
|
/// Any color value from computed values (except for the 'color' property
|
||||||
|
/// itself) should go through this method.
|
||||||
|
///
|
||||||
|
/// Usage example:
|
||||||
|
/// let top_color =
|
||||||
|
/// style.resolve_color(style.get_border().clone_border_top_color());
|
||||||
|
#[inline]
|
||||||
|
pub fn resolve_color(&self, color: computed::Color) -> RGBA {
|
||||||
|
color.to_rgba(self.get_color().clone_color())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "servo")]
|
#[cfg(feature = "servo")]
|
||||||
|
@ -2726,18 +2777,6 @@ impl ComputedValuesInner {
|
||||||
self.get_column().is_multicol()
|
self.get_column().is_multicol()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resolves the currentColor keyword.
|
|
||||||
///
|
|
||||||
/// Any color value from computed values (except for the 'color' property
|
|
||||||
/// itself) should go through this method.
|
|
||||||
///
|
|
||||||
/// Usage example:
|
|
||||||
/// let top_color = style.resolve_color(style.Border.border_top_color);
|
|
||||||
#[inline]
|
|
||||||
pub fn resolve_color(&self, color: computed::Color) -> RGBA {
|
|
||||||
color.to_rgba(self.get_color().color)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the logical computed inline size.
|
/// Get the logical computed inline size.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn content_inline_size(&self) -> computed::LengthOrPercentageOrAuto {
|
pub fn content_inline_size(&self) -> computed::LengthOrPercentageOrAuto {
|
||||||
|
@ -2902,19 +2941,19 @@ impl ComputedValuesInner {
|
||||||
/// Serializes the computed value of this property as a string.
|
/// Serializes the computed value of this property as a string.
|
||||||
pub fn computed_value_to_string(&self, property: PropertyDeclarationId) -> String {
|
pub fn computed_value_to_string(&self, property: PropertyDeclarationId) -> String {
|
||||||
match property {
|
match property {
|
||||||
% for style_struct in data.active_style_structs():
|
PropertyDeclarationId::Longhand(id) => {
|
||||||
% for longhand in style_struct.longhands:
|
let mut s = String::new();
|
||||||
PropertyDeclarationId::Longhand(LonghandId::${longhand.camel_case}) => {
|
self.get_longhand_property_value(
|
||||||
self.${style_struct.ident}.${longhand.ident}.to_css_string()
|
property,
|
||||||
|
&mut CssWriter::new(&mut s)
|
||||||
|
).unwrap();
|
||||||
|
s
|
||||||
}
|
}
|
||||||
% endfor
|
|
||||||
% endfor
|
|
||||||
PropertyDeclarationId::Custom(name) => {
|
PropertyDeclarationId::Custom(name) => {
|
||||||
self.custom_properties
|
self.custom_properties
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|map| map.get(name))
|
.and_then(|map| map.get(name))
|
||||||
.map(|value| value.to_css_string())
|
.map_or(String::new(), |value| value.to_css_string())
|
||||||
.unwrap_or(String::new())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue