#![crate_name = "style_traits"]
#![crate_type = "rlib"]
#![deny(unsafe_code, missing_docs)]
#[macro_use]
extern crate malloc_size_of_derive;
#[macro_use]
extern crate serde;
#[macro_use]
extern crate to_shmem_derive;
#[cfg(feature = "servo")]
extern crate url;
use bitflags::bitflags;
use cssparser::{CowRcStr, Token};
use selectors::parser::SelectorParseErrorKind;
#[cfg(feature = "servo")]
use stylo_atoms::Atom;
#[derive(Clone, Copy, Debug)]
pub enum DevicePixel {}
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "servo", derive(Deserialize, Serialize, MallocSizeOf))]
pub struct PinchZoomFactor(f32);
impl PinchZoomFactor {
pub fn new(scale: f32) -> PinchZoomFactor {
PinchZoomFactor(scale)
}
pub fn get(&self) -> f32 {
self.0
}
}
#[derive(Clone, Copy, Debug)]
pub enum CSSPixel {}
pub mod arc_slice;
pub mod dom;
pub mod specified_value_info;
#[macro_use]
pub mod values;
pub mod owned_slice;
pub mod owned_str;
pub use crate::specified_value_info::{CssType, KeywordsCollectFn, SpecifiedValueInfo};
pub use crate::values::{
Comma, CommaWithSpace, CssString, CssStringWriter, CssWriter, NumericValue, OneOrMoreSeparated,
Separator, Space, ToCss, ToTyped, TypedValue,
};
pub type ParseError<'i> = cssparser::ParseError<'i, StyleParseErrorKind<'i>>;
pub type ValueParseError<'i> = cssparser::ParseError<'i, ValueParseErrorKind<'i>>;
#[derive(Clone, Debug, PartialEq)]
pub enum StyleParseErrorKind<'i> {
BadUrlInDeclarationValueBlock(CowRcStr<'i>),
BadStringInDeclarationValueBlock(CowRcStr<'i>),
UnbalancedCloseParenthesisInDeclarationValueBlock,
UnbalancedCloseSquareBracketInDeclarationValueBlock,
UnbalancedCloseCurlyBracketInDeclarationValueBlock,
PropertyDeclarationValueNotExhausted,
UnexpectedDimension(CowRcStr<'i>),
MediaQueryExpectedFeatureName(CowRcStr<'i>),
MediaQueryExpectedFeatureValue,
MediaQueryUnexpectedOperator,
RangedExpressionWithNoValue,
UnexpectedFunction(CowRcStr<'i>),
PropertySyntaxField(PropertySyntaxParseError),
PropertyInheritsField(PropertyInheritsParseError),
UnexpectedNamespaceRule,
UnexpectedImportRule,
DisallowedImportRule,
UnexpectedCharsetRule,
UnexpectedIdent(CowRcStr<'i>),
UnspecifiedError,
UnexpectedTokenWithinNamespace(Token<'i>),
ValueError(ValueParseErrorKind<'i>),
SelectorError(SelectorParseErrorKind<'i>),
UnknownProperty(CowRcStr<'i>),
ExperimentalProperty,
InvalidColor(CowRcStr<'i>, Token<'i>),
InvalidFilter(CowRcStr<'i>, Token<'i>),
OtherInvalidValue(CowRcStr<'i>),
UnexpectedImportantDeclaration,
}
impl<'i> From<ValueParseErrorKind<'i>> for StyleParseErrorKind<'i> {
fn from(this: ValueParseErrorKind<'i>) -> Self {
StyleParseErrorKind::ValueError(this)
}
}
impl<'i> From<SelectorParseErrorKind<'i>> for StyleParseErrorKind<'i> {
fn from(this: SelectorParseErrorKind<'i>) -> Self {
StyleParseErrorKind::SelectorError(this)
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum ValueParseErrorKind<'i> {
InvalidColor(Token<'i>),
InvalidFilter(Token<'i>),
}
impl<'i> StyleParseErrorKind<'i> {
pub fn new_invalid<S>(name: S, value_error: ParseError<'i>) -> ParseError<'i>
where
S: Into<CowRcStr<'i>>,
{
let name = name.into();
let variant = match value_error.kind {
cssparser::ParseErrorKind::Custom(StyleParseErrorKind::ValueError(e)) => match e {
ValueParseErrorKind::InvalidColor(token) => {
StyleParseErrorKind::InvalidColor(name, token)
},
ValueParseErrorKind::InvalidFilter(token) => {
StyleParseErrorKind::InvalidFilter(name, token)
},
},
_ => StyleParseErrorKind::OtherInvalidValue(name),
};
cssparser::ParseError {
kind: cssparser::ParseErrorKind::Custom(variant),
location: value_error.location,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum PropertySyntaxParseError {
NoSyntax,
EmptyInput,
ExpectedPipeBetweenComponents,
InvalidNameStart,
InvalidName,
UnclosedDataTypeName,
UnexpectedEOF,
UnknownDataTypeName,
}
#[derive(Clone, Debug, PartialEq)]
pub enum PropertyInheritsParseError {
NoInherits,
InvalidInherits,
}
bitflags! {
#[derive(Clone, Copy, Eq, PartialEq)]
#[repr(C)]
pub struct ParsingMode: u8 {
const DEFAULT = 0;
const ALLOW_UNITLESS_LENGTH = 1;
const ALLOW_ALL_NUMERIC_VALUES = 1 << 1;
const DISALLOW_COMPUTATIONALLY_DEPENDENT = 1 << 2;
}
}
impl ParsingMode {
#[inline]
pub fn allows_unitless_lengths(&self) -> bool {
self.intersects(ParsingMode::ALLOW_UNITLESS_LENGTH)
}
#[inline]
pub fn allows_all_numeric_values(&self) -> bool {
self.intersects(ParsingMode::ALLOW_ALL_NUMERIC_VALUES)
}
#[inline]
pub fn allows_computational_dependence(&self) -> bool {
!self.intersects(ParsingMode::DISALLOW_COMPUTATIONALLY_DEPENDENT)
}
}
#[cfg(feature = "servo")]
pub trait SpeculativePainter: Send + Sync {
fn speculatively_draw_a_paint_image(
&self,
properties: Vec<(Atom, String)>,
arguments: Vec<String>,
);
}