Bug 1346052 - Add Servo_AnimationValue_Compute for AnimationValue::FromString.

We need this FFI to compute the AnimationValue from a property id and a
string.
This commit is contained in:
Boris Chiou 2017-05-03 11:19:23 +08:00
parent 7b1006936a
commit a46960dbfa
2 changed files with 53 additions and 4 deletions

View file

@ -1074,10 +1074,6 @@ extern "C" {
pub fn Gecko_CSSValue_GetAbsoluteLength(css_value: nsCSSValueBorrowed) pub fn Gecko_CSSValue_GetAbsoluteLength(css_value: nsCSSValueBorrowed)
-> nscoord; -> nscoord;
} }
extern "C" {
pub fn Gecko_GetAppUnitsPerPhysicalInch(pres_context: RawGeckoPresContextBorrowed)
-> i32;
}
extern "C" { extern "C" {
pub fn Gecko_CSSValue_GetKeyword(aCSSValue: nsCSSValueBorrowed) pub fn Gecko_CSSValue_GetKeyword(aCSSValue: nsCSSValueBorrowed)
-> nsCSSKeyword; -> nsCSSKeyword;
@ -1172,6 +1168,11 @@ extern "C" {
font_size: nscoord, use_user_font_set: bool) font_size: nscoord, use_user_font_set: bool)
-> GeckoFontMetrics; -> GeckoFontMetrics;
} }
extern "C" {
pub fn Gecko_GetAppUnitsPerPhysicalInch(pres_context:
RawGeckoPresContextBorrowed)
-> i32;
}
extern "C" { extern "C" {
pub fn Gecko_GetMediaFeatures() -> *const nsMediaFeature; pub fn Gecko_GetMediaFeatures() -> *const nsMediaFeature;
} }
@ -1855,6 +1856,15 @@ extern "C" {
RawServoAnimationValueBorrowed) RawServoAnimationValueBorrowed)
-> RawServoDeclarationBlockStrong; -> RawServoDeclarationBlockStrong;
} }
extern "C" {
pub fn Servo_AnimationValue_Compute(declarations:
RawServoDeclarationBlockBorrowed,
style: ServoComputedValuesBorrowed,
parent_style:
ServoComputedValuesBorrowedOrNull,
raw_data: RawServoStyleSetBorrowed)
-> RawServoAnimationValueStrong;
}
extern "C" { extern "C" {
pub fn Servo_ParseStyleAttribute(data: *const nsACString, pub fn Servo_ParseStyleAttribute(data: *const nsACString,
extra_data: *mut RawGeckoURLExtraData) extra_data: *mut RawGeckoURLExtraData)

View file

@ -2066,6 +2066,45 @@ pub extern "C" fn Servo_GetComputedKeyframeValues(keyframes: RawGeckoKeyframeLis
} }
} }
#[no_mangle]
pub extern "C" fn Servo_AnimationValue_Compute(declarations: RawServoDeclarationBlockBorrowed,
style: ServoComputedValuesBorrowed,
parent_style: ServoComputedValuesBorrowedOrNull,
raw_data: RawServoStyleSetBorrowed)
-> RawServoAnimationValueStrong {
use style::values::computed::Context;
let data = PerDocumentStyleData::from_ffi(raw_data).borrow();
let style = ComputedValues::as_arc(&style);
let parent_style = parent_style.as_ref().map(|r| &**ComputedValues::as_arc(&r));
let default_values = data.default_computed_values();
let metrics = get_metrics_provider_for_product();
let mut context = Context {
is_root_element: false,
device: &data.stylist.device,
inherited_style: parent_style.unwrap_or(default_values),
layout_parent_style: parent_style.unwrap_or(default_values),
style: StyleBuilder::for_derived_style(&style),
font_metrics_provider: &metrics,
cached_system_font: None,
in_media_query: false,
quirks_mode: QuirksMode::NoQuirks,
};
let global_style_data = &*GLOBAL_STYLE_DATA;
let guard = global_style_data.shared_lock.read();
let declarations = Locked::<PropertyDeclarationBlock>::as_arc(&declarations);
// We only compute the first element in declarations.
match declarations.read_with(&guard).declarations().first() {
Some(&(ref decl, imp)) if imp == Importance::Normal => {
let animation = AnimationValue::from_declaration(decl, &mut context, default_values);
animation.map_or(RawServoAnimationValueStrong::null(), |value| {
Arc::new(value).into_strong()
})
},
_ => RawServoAnimationValueStrong::null()
}
}
#[no_mangle] #[no_mangle]
pub extern "C" fn Servo_AssertTreeIsClean(root: RawGeckoElementBorrowed) { pub extern "C" fn Servo_AssertTreeIsClean(root: RawGeckoElementBorrowed) {