stylo: Add ServoBundledURI abstraction for use when setting css::URLValues

MozReview-Commit-ID: 4QKKzJ1DVYP
This commit is contained in:
Manish Goregaokar 2017-02-09 17:43:52 -08:00 committed by Manish Goregaokar
parent 47ebeaa95c
commit e965b4e345
6 changed files with 63 additions and 29 deletions

View file

@ -383,6 +383,7 @@ mod bindings {
"PropertyValuePair",
"Runnable",
"ServoAttrSnapshot",
"ServoBundledURI",
"ServoElementSnapshot",
"SheetParsingMode",
"StaticRefPtr",
@ -523,6 +524,7 @@ mod bindings {
"FontFamilyList",
"FontFamilyType",
"Keyframe",
"ServoBundledURI",
"ServoElementSnapshot",
"SheetParsingMode",
"StyleBasicShape",

View file

@ -20,6 +20,7 @@ use gecko_bindings::structs::TraversalRootBehavior;
use gecko_bindings::structs::FontFamilyList;
use gecko_bindings::structs::FontFamilyType;
use gecko_bindings::structs::Keyframe;
use gecko_bindings::structs::ServoBundledURI;
use gecko_bindings::structs::ServoElementSnapshot;
use gecko_bindings::structs::SheetParsingMode;
use gecko_bindings::structs::StyleBasicShape;
@ -590,11 +591,7 @@ extern "C" {
}
extern "C" {
pub fn Gecko_SetListStyleImage(style_struct: *mut nsStyleList,
string_bytes: *const u8,
string_length: u32,
base_uri: *mut ThreadSafeURIHolder,
referrer: *mut ThreadSafeURIHolder,
principal: *mut ThreadSafePrincipalHolder);
uri: ServoBundledURI);
}
extern "C" {
pub fn Gecko_CopyListStyleImageFrom(dest: *mut nsStyleList,
@ -617,10 +614,7 @@ extern "C" {
}
extern "C" {
pub fn Gecko_SetMozBinding(style_struct: *mut nsStyleDisplay,
string_bytes: *const u8, string_length: u32,
base_uri: *mut ThreadSafeURIHolder,
referrer: *mut ThreadSafeURIHolder,
principal: *mut ThreadSafePrincipalHolder);
bundled_uri: ServoBundledURI);
}
extern "C" {
pub fn Gecko_CopyMozBindingFrom(des: *mut nsStyleDisplay,

View file

@ -25363,6 +25363,23 @@ pub mod root {
pub type ThreadSafePrincipalHolder =
root::nsMainThreadPtrHolder<root::nsIPrincipal>;
pub type ThreadSafeURIHolder = root::nsMainThreadPtrHolder<root::nsIURI>;
#[repr(C)]
#[derive(Debug, Copy)]
pub struct ServoBundledURI {
pub mURLString: *const u8,
pub mURLStringLength: u32,
pub mBaseURI: *mut root::ThreadSafeURIHolder,
pub mReferrer: *mut root::ThreadSafeURIHolder,
pub mPrincipal: *mut root::ThreadSafePrincipalHolder,
}
#[test]
fn bindgen_test_layout_ServoBundledURI() {
assert_eq!(::std::mem::size_of::<ServoBundledURI>() , 40usize);
assert_eq!(::std::mem::align_of::<ServoBundledURI>() , 8usize);
}
impl Clone for ServoBundledURI {
fn clone(&self) -> Self { *self }
}
pub type nsMediaFeatureValueGetter =
::std::option::Option<unsafe extern "C" fn(aPresContext:
*mut root::nsPresContext,

View file

@ -24719,6 +24719,23 @@ pub mod root {
pub type ThreadSafePrincipalHolder =
root::nsMainThreadPtrHolder<root::nsIPrincipal>;
pub type ThreadSafeURIHolder = root::nsMainThreadPtrHolder<root::nsIURI>;
#[repr(C)]
#[derive(Debug, Copy)]
pub struct ServoBundledURI {
pub mURLString: *const u8,
pub mURLStringLength: u32,
pub mBaseURI: *mut root::ThreadSafeURIHolder,
pub mReferrer: *mut root::ThreadSafeURIHolder,
pub mPrincipal: *mut root::ThreadSafePrincipalHolder,
}
#[test]
fn bindgen_test_layout_ServoBundledURI() {
assert_eq!(::std::mem::size_of::<ServoBundledURI>() , 40usize);
assert_eq!(::std::mem::align_of::<ServoBundledURI>() , 8usize);
}
impl Clone for ServoBundledURI {
fn clone(&self) -> Self { *self }
}
pub type nsMediaFeatureValueGetter =
::std::option::Option<unsafe extern "C" fn(aPresContext:
*mut root::nsPresContext,

View file

@ -1322,18 +1322,9 @@ fn static_assert() {
match v {
Either::Second(_none) => debug_assert!(self.gecko.mBinding.mRawPtr.is_null()),
Either::First(ref url) => {
let extra_data = url.extra_data();
let (ptr, len) = match url.as_slice_components() {
Ok(value) => value,
Err(_) => (ptr::null(), 0),
};
unsafe {
Gecko_SetMozBinding(&mut self.gecko,
ptr,
len as u32,
extra_data.base.get(),
extra_data.referrer.get(),
extra_data.principal.get());
Gecko_SetMozBinding(&mut self.gecko, url.for_ffi());
}
}
}
@ -2066,17 +2057,9 @@ fn static_assert() {
}
}
Either::First(ref url) => {
let (ptr, len) = match url.as_slice_components() {
Ok(value) | Err(value) => value
};
let extra_data = url.extra_data();
unsafe {
Gecko_SetListStyleImage(&mut self.gecko,
ptr,
len as u32,
extra_data.base.get(),
extra_data.referrer.get(),
extra_data.principal.get());
url.for_ffi());
}
// We don't need to record this struct as uncacheable, like when setting
// background-image to a url() value, since only properties in reset structs

View file

@ -6,6 +6,8 @@
use cssparser::{CssStringWriter, Parser};
#[cfg(feature = "gecko")]
use gecko_bindings::structs::ServoBundledURI;
#[cfg(feature = "gecko")]
use gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI};
use parser::{Parse, ParserContext};
#[cfg(feature = "gecko")]
@ -167,6 +169,25 @@ impl SpecifiedUrl {
extra_data: UrlExtraData {}
}
}
/// Create a bundled URI suitable for sending to Gecko
/// to be constructed into a css::URLValue
#[cfg(feature = "gecko")]
pub fn for_ffi(&self) -> ServoBundledURI {
use std::ptr;
let extra_data = self.extra_data();
let (ptr, len) = match self.as_slice_components() {
Ok(value) => value,
Err(_) => (ptr::null(), 0),
};
ServoBundledURI {
mURLString: ptr,
mURLStringLength: len as u32,
mBaseURI: extra_data.base.get(),
mReferrer: extra_data.referrer.get(),
mPrincipal: extra_data.principal.get(),
}
}
}
impl PartialEq for SpecifiedUrl {