diff --git a/components/style/binding_tools/regen.py b/components/style/binding_tools/regen.py index 53ade1bf1e7..d924d31d292 100755 --- a/components/style/binding_tools/regen.py +++ b/components/style/binding_tools/regen.py @@ -236,10 +236,12 @@ COMPILATION_TARGETS = { "target_dir": "../gecko_bindings", "blacklist_types": [ "nsACString_internal", + "nsAString_internal", ], "raw_lines": [ - "pub use nsstring::nsACString;", + "pub use nsstring::{nsACString, nsAString};", "type nsACString_internal = nsACString;", + "type nsAString_internal = nsAString;" ], "flags": [ "--ignore-methods", diff --git a/components/style/gecko_bindings/bindings.rs b/components/style/gecko_bindings/bindings.rs index e9cb580d217..f2a2c19f1a5 100644 --- a/components/style/gecko_bindings/bindings.rs +++ b/components/style/gecko_bindings/bindings.rs @@ -1,7 +1,8 @@ /* automatically generated by rust-bindgen */ -pub use nsstring::nsACString; +pub use nsstring::{nsACString, nsAString}; type nsACString_internal = nsACString; +type nsAString_internal = nsAString; pub type ServoComputedValuesStrong = ::gecko_bindings::sugar::ownership::Strong; pub type ServoComputedValuesBorrowedOrNull<'a> = Option<&'a ServoComputedValues>; pub type ServoComputedValuesBorrowed<'a> = &'a ServoComputedValues; @@ -936,6 +937,19 @@ extern "C" { RawServoDeclarationBlockBorrowed, buffer: *mut nsString); } +extern "C" { + pub fn Servo_DeclarationBlock_Count(declarations: + RawServoDeclarationBlockBorrowed) + -> u32; +} +extern "C" { + pub fn Servo_DeclarationBlock_GetNthProperty(declarations: + RawServoDeclarationBlockBorrowed, + index: u32, + result: + *mut nsAString_internal) + -> bool; +} extern "C" { pub fn Servo_CSSSupports(name: *const nsACString_internal, value: *const nsACString_internal) -> bool; diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index ba4a023b715..b266a4c7084 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -7,6 +7,7 @@ use cssparser::{Parser, ToCss}; use env_logger; use euclid::Size2D; use parking_lot::RwLock; +use std::fmt::Write; use std::mem::transmute; use std::sync::{Arc, Mutex}; use style::arc_ptr_eq; @@ -474,6 +475,25 @@ pub extern "C" fn Servo_DeclarationBlock_SerializeOneValue( } } +#[no_mangle] +pub extern "C" fn Servo_DeclarationBlock_Count(declarations: RawServoDeclarationBlockBorrowed) -> u32 { + let declarations = RwLock::::as_arc(&declarations); + declarations.read().declarations.len() as u32 +} + +#[no_mangle] +pub extern "C" fn Servo_DeclarationBlock_GetNthProperty(declarations: RawServoDeclarationBlockBorrowed, + index: u32, result: *mut nsAString) -> bool { + let declarations = RwLock::::as_arc(&declarations); + if let Some(&(ref decl, _)) = declarations.read().declarations.get(index as usize) { + let result = unsafe { result.as_mut().unwrap() }; + write!(result, "{}", decl.name()).unwrap(); + true + } else { + false + } +} + #[no_mangle] pub extern "C" fn Servo_CSSSupports(property: *const nsACString, value: *const nsACString) -> bool { let property = unsafe { property.as_ref().unwrap().as_str_unchecked() };