diff --git a/components/style/build_gecko.rs b/components/style/build_gecko.rs index 15ca0d55c3e..503d9edb933 100644 --- a/components/style/build_gecko.rs +++ b/components/style/build_gecko.rs @@ -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", diff --git a/components/style/gecko_bindings/bindings.rs b/components/style/gecko_bindings/bindings.rs index 46b7fe63bab..1ad73f8f340 100644 --- a/components/style/gecko_bindings/bindings.rs +++ b/components/style/gecko_bindings/bindings.rs @@ -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, diff --git a/components/style/gecko_bindings/structs_debug.rs b/components/style/gecko_bindings/structs_debug.rs index cf1c9ce517b..302aa8bb0a1 100644 --- a/components/style/gecko_bindings/structs_debug.rs +++ b/components/style/gecko_bindings/structs_debug.rs @@ -25363,6 +25363,23 @@ pub mod root { pub type ThreadSafePrincipalHolder = root::nsMainThreadPtrHolder; pub type ThreadSafeURIHolder = root::nsMainThreadPtrHolder; + #[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::() , 40usize); + assert_eq!(::std::mem::align_of::() , 8usize); + } + impl Clone for ServoBundledURI { + fn clone(&self) -> Self { *self } + } pub type nsMediaFeatureValueGetter = ::std::option::Option; pub type ThreadSafeURIHolder = root::nsMainThreadPtrHolder; + #[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::() , 40usize); + assert_eq!(::std::mem::align_of::() , 8usize); + } + impl Clone for ServoBundledURI { + fn clone(&self) -> Self { *self } + } pub type nsMediaFeatureValueGetter = ::std::option::Option 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 diff --git a/components/style/values/specified/url.rs b/components/style/values/specified/url.rs index 41af5a16dea..719a176f439 100644 --- a/components/style/values/specified/url.rs +++ b/components/style/values/specified/url.rs @@ -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 {