Skip to content

Commit

Permalink
stylo: Pass parser URL data in Servo_DeclarationBlock_SetProperty*
Browse files Browse the repository at this point in the history
MozReview-Commit-ID: EVk4aEoyiXv
  • Loading branch information
Manishearth committed Mar 9, 2017
1 parent 14d8eb9 commit eda6a4f
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 25 deletions.
2 changes: 2 additions & 0 deletions components/style/build_gecko.rs
Expand Up @@ -317,6 +317,7 @@ mod bindings {
"FontFamilyType",
"FragmentOrURL",
"FrameRequestCallback",
"GeckoParserExtraData",
"gfxAlternateValue",
"gfxFontFeature",
"gfxFontVariation",
Expand Down Expand Up @@ -538,6 +539,7 @@ mod bindings {
"RawServoDeclarationBlock",
"RawGeckoPresContext",
"RawGeckoPresContextOwned",
"GeckoParserExtraData",
"RefPtr",
"ThreadSafeURIHolder",
"ThreadSafePrincipalHolder",
Expand Down
21 changes: 15 additions & 6 deletions components/style/gecko_bindings/bindings.rs
Expand Up @@ -14,6 +14,7 @@ use gecko_bindings::structs::RawServoAnimationValue;
use gecko_bindings::structs::RawServoDeclarationBlock;
use gecko_bindings::structs::RawGeckoPresContext;
use gecko_bindings::structs::RawGeckoPresContextOwned;
use gecko_bindings::structs::GeckoParserExtraData;
use gecko_bindings::structs::RefPtr;
use gecko_bindings::structs::ThreadSafeURIHolder;
use gecko_bindings::structs::ThreadSafePrincipalHolder;
Expand Down Expand Up @@ -1339,10 +1340,8 @@ extern "C" {
extern "C" {
pub fn Servo_ParseProperty(property: *const nsACString_internal,
value: *const nsACString_internal,
base_url: *const nsACString_internal,
base: *mut ThreadSafeURIHolder,
referrer: *mut ThreadSafeURIHolder,
principal: *mut ThreadSafePrincipalHolder)
base: *const nsACString_internal,
data: *const GeckoParserExtraData)
-> RawServoDeclarationBlockStrong;
}
extern "C" {
Expand Down Expand Up @@ -1466,15 +1465,25 @@ extern "C" {
*const nsACString_internal,
value:
*const nsACString_internal,
is_important: bool) -> bool;
is_important: bool,
base:
*const nsACString_internal,
data:
*const GeckoParserExtraData)
-> bool;
}
extern "C" {
pub fn Servo_DeclarationBlock_SetPropertyById(declarations:
RawServoDeclarationBlockBorrowed,
property: nsCSSPropertyID,
value:
*const nsACString_internal,
is_important: bool) -> bool;
is_important: bool,
base:
*const nsACString_internal,
data:
*const GeckoParserExtraData)
-> bool;
}
extern "C" {
pub fn Servo_DeclarationBlock_RemoveProperty(declarations:
Expand Down
34 changes: 34 additions & 0 deletions components/style/gecko_bindings/structs_debug.rs
Expand Up @@ -25749,6 +25749,40 @@ pub mod root {
impl Clone for ServoBundledURI {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug)]
pub struct GeckoParserExtraData {
pub mBaseURI: root::RefPtr<root::nsMainThreadPtrHolder<root::nsIURI>>,
pub mReferrer: root::RefPtr<root::nsMainThreadPtrHolder<root::nsIURI>>,
pub mPrincipal: root::RefPtr<root::nsMainThreadPtrHolder<root::nsIPrincipal>>,
}
#[test]
fn bindgen_test_layout_GeckoParserExtraData() {
assert_eq!(::std::mem::size_of::<GeckoParserExtraData>() , 24usize ,
concat ! (
"Size of: " , stringify ! ( GeckoParserExtraData ) ));
assert_eq! (::std::mem::align_of::<GeckoParserExtraData>() , 8usize ,
concat ! (
"Alignment of " , stringify ! ( GeckoParserExtraData ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoParserExtraData ) ) . mBaseURI
as * const _ as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! (
GeckoParserExtraData ) , "::" , stringify ! ( mBaseURI )
));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoParserExtraData ) ) . mReferrer
as * const _ as usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! (
GeckoParserExtraData ) , "::" , stringify ! ( mReferrer )
));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoParserExtraData ) ) . mPrincipal
as * const _ as usize } , 16usize , concat ! (
"Alignment of field: " , stringify ! (
GeckoParserExtraData ) , "::" , stringify ! ( mPrincipal )
));
}
pub type nsMediaFeatureValueGetter =
::std::option::Option<unsafe extern "C" fn(aPresContext:
*mut root::nsPresContext,
Expand Down
34 changes: 34 additions & 0 deletions components/style/gecko_bindings/structs_release.rs
Expand Up @@ -25148,6 +25148,40 @@ pub mod root {
impl Clone for ServoBundledURI {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug)]
pub struct GeckoParserExtraData {
pub mBaseURI: root::RefPtr<root::nsMainThreadPtrHolder<root::nsIURI>>,
pub mReferrer: root::RefPtr<root::nsMainThreadPtrHolder<root::nsIURI>>,
pub mPrincipal: root::RefPtr<root::nsMainThreadPtrHolder<root::nsIPrincipal>>,
}
#[test]
fn bindgen_test_layout_GeckoParserExtraData() {
assert_eq!(::std::mem::size_of::<GeckoParserExtraData>() , 24usize ,
concat ! (
"Size of: " , stringify ! ( GeckoParserExtraData ) ));
assert_eq! (::std::mem::align_of::<GeckoParserExtraData>() , 8usize ,
concat ! (
"Alignment of " , stringify ! ( GeckoParserExtraData ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoParserExtraData ) ) . mBaseURI
as * const _ as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! (
GeckoParserExtraData ) , "::" , stringify ! ( mBaseURI )
));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoParserExtraData ) ) . mReferrer
as * const _ as usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! (
GeckoParserExtraData ) , "::" , stringify ! ( mReferrer )
));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoParserExtraData ) ) . mPrincipal
as * const _ as usize } , 16usize , concat ! (
"Alignment of field: " , stringify ! (
GeckoParserExtraData ) , "::" , stringify ! ( mPrincipal )
));
}
pub type nsMediaFeatureValueGetter =
::std::option::Option<unsafe extern "C" fn(aPresContext:
*mut root::nsPresContext,
Expand Down
16 changes: 16 additions & 0 deletions components/style/parser.rs
Expand Up @@ -43,6 +43,22 @@ impl Default for ParserContextExtraData {
}
}

#[cfg(feature = "gecko")]
impl ParserContextExtraData {
/// Construct from a GeckoParserExtraData
///
/// GeckoParserExtraData must live longer than this call
pub unsafe fn new(data: *const ::gecko_bindings::structs::GeckoParserExtraData) -> Self {
// the to_safe calls are safe since we trust that we have references to
// real Gecko refptrs. The dereferencing of data is safe because this function
// is expected to be called with a `data` living longer than this function.
unsafe { ParserContextExtraData {
base: Some((*data).mBaseURI.to_safe()),
referrer: Some((*data).mReferrer.to_safe()),
principal: Some((*data).mPrincipal.to_safe()),
}}
}
}
/// The data that the parser needs from outside in order to parse a stylesheet.
pub struct ParserContext<'a> {
/// The `Origin` of the stylesheet, whether it's a user, author or
Expand Down
50 changes: 31 additions & 19 deletions ports/geckolib/glue.rs
Expand Up @@ -681,11 +681,21 @@ pub extern "C" fn Servo_StyleSet_Drop(data: RawServoStyleSetOwned) -> () {
let _ = data.into_box::<PerDocumentStyleData>();
}

// Must be a macro since we need to store the base_url on the stack somewhere
/// Initializes the data needed for constructing a ParserContext from
/// Gecko-side values
macro_rules! make_context {
(($base:ident, $data:ident) => ($base_url:ident, $extra_data:ident)) => {
let base_str = unsafe { $base.as_ref().unwrap().as_str_unchecked() };
let $base_url = ServoUrl::parse(base_str).unwrap();
let $extra_data = unsafe { ParserContextExtraData::new($data) };
}
}

#[no_mangle]
pub extern "C" fn Servo_ParseProperty(property: *const nsACString, value: *const nsACString,
base_url: *const nsACString, base: *mut ThreadSafeURIHolder,
referrer: *mut ThreadSafeURIHolder,
principal: *mut ThreadSafePrincipalHolder)
base: *const nsACString,
data: *const structs::GeckoParserExtraData)
-> RawServoDeclarationBlockStrong {
let name = unsafe { property.as_ref().unwrap().as_str_unchecked() };
let id = if let Ok(id) = PropertyId::parse(name.into()) {
Expand All @@ -694,15 +704,11 @@ pub extern "C" fn Servo_ParseProperty(property: *const nsACString, value: *const
return RawServoDeclarationBlockStrong::null()
};
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
let base_str = unsafe { base_url.as_ref().unwrap().as_str_unchecked() };
let base_url = ServoUrl::parse(base_str).unwrap();
let extra_data = unsafe { ParserContextExtraData {
base: Some(GeckoArcURI::new(base)),
referrer: Some(GeckoArcURI::new(referrer)),
principal: Some(GeckoArcPrincipal::new(principal)),
}};

let context = ParserContext::new_with_extra_data(Origin::Author, &base_url,
make_context!((base, data) => (base_url, extra_data));

let context = ParserContext::new_with_extra_data(Origin::Author,
&base_url,
Box::new(StdoutErrorReporter),
extra_data);

Expand Down Expand Up @@ -819,11 +825,11 @@ pub extern "C" fn Servo_DeclarationBlock_GetPropertyIsImportant(declarations: Ra
}

fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId,
value: *const nsACString, is_important: bool) -> bool {
value: *const nsACString, is_important: bool,
base: *const nsACString, data: *const structs::GeckoParserExtraData) -> bool {
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
// FIXME Needs real URL and ParserContextExtraData.
let base_url = &*DUMMY_BASE_URL;
let extra_data = ParserContextExtraData::default();

make_context!((base, data) => (base_url, extra_data));
if let Ok(parsed) = parse_one_declaration(property_id, value, &base_url,
Box::new(StdoutErrorReporter), extra_data) {
let mut declarations = RwLock::<PropertyDeclarationBlock>::as_arc(&declarations).write();
Expand All @@ -841,15 +847,21 @@ fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: Pro
#[no_mangle]
pub extern "C" fn Servo_DeclarationBlock_SetProperty(declarations: RawServoDeclarationBlockBorrowed,
property: *const nsACString, value: *const nsACString,
is_important: bool) -> bool {
set_property(declarations, get_property_id_from_property!(property, false), value, is_important)
is_important: bool,
base: *const nsACString,
data: *const structs::GeckoParserExtraData) -> bool {
set_property(declarations, get_property_id_from_property!(property, false),
value, is_important, base, data)
}

#[no_mangle]
pub extern "C" fn Servo_DeclarationBlock_SetPropertyById(declarations: RawServoDeclarationBlockBorrowed,
property: nsCSSPropertyID, value: *const nsACString,
is_important: bool) -> bool {
set_property(declarations, get_property_id_from_nscsspropertyid!(property, false), value, is_important)
is_important: bool,
base: *const nsACString,
data: *const structs::GeckoParserExtraData) -> bool {
set_property(declarations, get_property_id_from_nscsspropertyid!(property, false),
value, is_important, base, data)
}

fn remove_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId) {
Expand Down

0 comments on commit eda6a4f

Please sign in to comment.