mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Implement CSSKeyframesRule and CSSKeyframeRule for stylo.
This commit is contained in:
parent
32a10073c1
commit
462cc49e42
4 changed files with 165 additions and 19 deletions
|
@ -8,20 +8,23 @@
|
|||
|
||||
#![allow(non_snake_case, missing_docs)]
|
||||
|
||||
use gecko_bindings::bindings::{RawServoMediaList, RawServoMediaRule, RawServoNamespaceRule, RawServoPageRule};
|
||||
use gecko_bindings::bindings::{RawServoKeyframe, RawServoKeyframesRule};
|
||||
use gecko_bindings::bindings::{RawServoMediaList, RawServoMediaRule};
|
||||
use gecko_bindings::bindings::{RawServoNamespaceRule, RawServoPageRule};
|
||||
use gecko_bindings::bindings::{RawServoRuleNode, RawServoRuleNodeStrong, RawServoDocumentRule};
|
||||
use gecko_bindings::bindings::{RawServoStyleSheet, RawServoImportRule, RawServoSupportsRule};
|
||||
use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules};
|
||||
use gecko_bindings::structs::{RawServoDeclarationBlock, RawServoStyleRule};
|
||||
use gecko_bindings::structs::RawServoAnimationValue;
|
||||
use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI};
|
||||
use keyframes::Keyframe;
|
||||
use media_queries::MediaList;
|
||||
use properties::{ComputedValues, PropertyDeclarationBlock};
|
||||
use properties::animated_properties::AnimationValue;
|
||||
use rule_tree::StrongRuleNode;
|
||||
use shared_lock::Locked;
|
||||
use std::{mem, ptr};
|
||||
use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, MediaRule};
|
||||
use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, KeyframesRule, MediaRule};
|
||||
use stylesheets::{NamespaceRule, PageRule, SupportsRule, DocumentRule};
|
||||
|
||||
macro_rules! impl_arc_ffi {
|
||||
|
@ -64,6 +67,12 @@ impl_arc_ffi!(Locked<ImportRule> => RawServoImportRule
|
|||
impl_arc_ffi!(AnimationValue => RawServoAnimationValue
|
||||
[Servo_AnimationValue_AddRef, Servo_AnimationValue_Release]);
|
||||
|
||||
impl_arc_ffi!(Locked<Keyframe> => RawServoKeyframe
|
||||
[Servo_Keyframe_AddRef, Servo_Keyframe_Release]);
|
||||
|
||||
impl_arc_ffi!(Locked<KeyframesRule> => RawServoKeyframesRule
|
||||
[Servo_KeyframesRule_AddRef, Servo_KeyframesRule_Release]);
|
||||
|
||||
impl_arc_ffi!(Locked<MediaList> => RawServoMediaList
|
||||
[Servo_MediaList_AddRef, Servo_MediaList_Release]);
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ impl KeyframePercentage {
|
|||
|
||||
/// A keyframes selector is a list of percentages or from/to symbols, which are
|
||||
/// converted at parse time to percentages.
|
||||
#[derive(Debug, PartialEq)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct KeyframeSelector(Vec<KeyframePercentage>);
|
||||
|
||||
impl ToCss for KeyframeSelector {
|
||||
|
|
|
@ -25,7 +25,7 @@ pub use gecko::rules::{CounterStyleRule, FontFaceRule};
|
|||
use gecko_bindings::structs::URLExtraData;
|
||||
#[cfg(feature = "gecko")]
|
||||
use gecko_bindings::sugar::refptr::RefPtr;
|
||||
use keyframes::{Keyframe, parse_keyframe_list};
|
||||
use keyframes::{Keyframe, KeyframeSelector, parse_keyframe_list};
|
||||
use media_queries::{Device, MediaList, parse_media_query_list};
|
||||
use parking_lot::RwLock;
|
||||
use parser::{PARSING_MODE_DEFAULT, Parse, ParserContext, log_css_error};
|
||||
|
@ -586,6 +586,24 @@ impl ToCssWithGuard for KeyframesRule {
|
|||
}
|
||||
}
|
||||
|
||||
impl KeyframesRule {
|
||||
/// Returns the index of the last keyframe that matches the given selector.
|
||||
/// If the selector is not valid, or no keyframe is found, returns None.
|
||||
///
|
||||
/// Related spec:
|
||||
/// https://drafts.csswg.org/css-animations-1/#interface-csskeyframesrule-findrule
|
||||
pub fn find_rule(&self, guard: &SharedRwLockReadGuard, selector: &str) -> Option<usize> {
|
||||
if let Ok(selector) = Parser::new(selector).parse_entirely(KeyframeSelector::parse) {
|
||||
for (i, keyframe) in self.keyframes.iter().enumerate().rev() {
|
||||
if keyframe.read_with(guard).selector == selector {
|
||||
return Some(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(missing_docs)]
|
||||
#[derive(Debug)]
|
||||
pub struct MediaRule {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue