diff options
author | Xidorn Quan <me@upsuper.org> | 2017-04-03 13:32:21 +1000 |
---|---|---|
committer | Xidorn Quan <me@upsuper.org> | 2017-04-03 14:30:33 +1000 |
commit | 0a97a0df0cd7f73e46be467ac58667a8ac0eb7cd (patch) | |
tree | 40bb827fbab1d6270c0086826a80b532e86e946a | |
parent | a31271b07ff1372e48d8b363a1f4a16b8ff6f98d (diff) | |
download | servo-0a97a0df0cd7f73e46be467ac58667a8ac0eb7cd.tar.gz servo-0a97a0df0cd7f73e46be467ac58667a8ac0eb7cd.zip |
Create URLExtraData for holding base uri, referrer, and principal.
-rw-r--r-- | components/style/build_gecko.rs | 6 | ||||
-rw-r--r-- | components/style/gecko/url.rs | 22 | ||||
-rw-r--r-- | components/style/gecko_bindings/sugar/refptr.rs | 16 | ||||
-rw-r--r-- | components/style/parser.rs | 27 | ||||
-rw-r--r-- | components/style/properties/longhand/box.mako.rs | 3 | ||||
-rw-r--r-- | components/style/properties/longhand/inherited_svg.mako.rs | 3 | ||||
-rw-r--r-- | components/style/properties/longhand/list.mako.rs | 1 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 35 | ||||
-rw-r--r-- | ports/geckolib/stylesheet_loader.rs | 4 |
9 files changed, 35 insertions, 82 deletions
diff --git a/components/style/build_gecko.rs b/components/style/build_gecko.rs index 287698adc52..fa7142b69a2 100644 --- a/components/style/build_gecko.rs +++ b/components/style/build_gecko.rs @@ -367,7 +367,6 @@ mod bindings { "nsCursorImage", "nsFont", "nsIAtom", - "nsIURI", "nsMainThreadPtrHandle", "nsMainThreadPtrHolder", "nsMargin", @@ -604,10 +603,8 @@ mod bindings { "RawGeckoPresContext", "RawGeckoPresContextOwned", "RawGeckoStyleAnimationList", - "GeckoParserExtraData", + "RawGeckoURLExtraData", "RefPtr", - "ThreadSafeURIHolder", - "ThreadSafePrincipalHolder", "CSSPseudoClassType", "TraversalRootBehavior", "FontFamilyList", @@ -630,7 +627,6 @@ mod bindings { "nsCursorImage", "nsFont", "nsIAtom", - "nsIURI", "nsMediaFeature", "nsRestyleHint", "nsStyleBackground", diff --git a/components/style/gecko/url.rs b/components/style/gecko/url.rs index b1550486cdf..f6d1e0ce244 100644 --- a/components/style/gecko/url.rs +++ b/components/style/gecko/url.rs @@ -5,8 +5,8 @@ //! Common handling for the specified value CSS url() values. use cssparser::CssStringWriter; -use gecko_bindings::structs::ServoBundledURI; -use gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI}; +use gecko_bindings::structs::{ServoBundledURI, URLExtraData}; +use gecko_bindings::sugar::refptr::RefPtr; use parser::ParserContext; use std::borrow::Cow; use std::fmt::{self, Write}; @@ -22,12 +22,8 @@ pub struct SpecifiedUrl { /// really large. serialization: Arc<String>, - /// The base URI. - pub base: GeckoArcURI, - /// The referrer. - pub referrer: GeckoArcURI, - /// The principal that originated this URI. - pub principal: GeckoArcPrincipal, + /// The URL extra data. + pub extra_data: RefPtr<URLExtraData>, } impl SpecifiedUrl { @@ -39,7 +35,7 @@ impl SpecifiedUrl { context: &ParserContext) -> Result<Self, ()> { let extra = &context.extra_data; - if extra.base.is_none() || extra.referrer.is_none() || extra.principal.is_none() { + if extra.data.is_none() { // FIXME(heycam) should ensure we always have a principal, etc., // when parsing style attributes and re-parsing due to CSS // Variables. @@ -49,9 +45,7 @@ impl SpecifiedUrl { Ok(SpecifiedUrl { serialization: Arc::new(url.into_owned()), - base: extra.base.as_ref().unwrap().clone(), - referrer: extra.referrer.as_ref().unwrap().clone(), - principal: extra.principal.as_ref().unwrap().clone(), + extra_data: extra.data.as_ref().unwrap().clone(), }) } @@ -88,9 +82,7 @@ impl SpecifiedUrl { ServoBundledURI { mURLString: ptr, mURLStringLength: len as u32, - mBaseURI: self.base.get(), - mReferrer: self.referrer.get(), - mPrincipal: self.principal.get(), + mExtraData: self.extra_data.get(), } } } diff --git a/components/style/gecko_bindings/sugar/refptr.rs b/components/style/gecko_bindings/sugar/refptr.rs index 5953652f3a5..3713ea09266 100644 --- a/components/style/gecko_bindings/sugar/refptr.rs +++ b/components/style/gecko_bindings/sugar/refptr.rs @@ -261,12 +261,9 @@ macro_rules! impl_threadsafe_refcount { ); } -impl_threadsafe_refcount!(::gecko_bindings::structs::ThreadSafePrincipalHolder, - Gecko_AddRefPrincipalArbitraryThread, - Gecko_ReleasePrincipalArbitraryThread); -impl_threadsafe_refcount!(::gecko_bindings::structs::ThreadSafeURIHolder, - Gecko_AddRefURIArbitraryThread, - Gecko_ReleaseURIArbitraryThread); +impl_threadsafe_refcount!(::gecko_bindings::structs::RawGeckoURLExtraData, + Gecko_AddRefURLExtraDataArbitraryThread, + Gecko_ReleaseURLExtraDataArbitraryThread); impl_threadsafe_refcount!(::gecko_bindings::structs::nsStyleQuoteValues, Gecko_AddRefQuoteValuesArbitraryThread, Gecko_ReleaseQuoteValuesArbitraryThread); @@ -276,10 +273,3 @@ impl_threadsafe_refcount!(::gecko_bindings::structs::nsCSSValueSharedList, impl_threadsafe_refcount!(::gecko_bindings::structs::mozilla::css::URLValue, Gecko_AddRefCSSURLValueArbitraryThread, Gecko_ReleaseCSSURLValueArbitraryThread); -/// A Gecko `ThreadSafePrincipalHolder` wrapped in a safe refcounted pointer, to -/// use during stylesheet parsing and style computation. -pub type GeckoArcPrincipal = RefPtr<::gecko_bindings::structs::ThreadSafePrincipalHolder>; - -/// A Gecko `ThreadSafeURIHolder` wrapped in a safe refcounted pointer, to use -/// during stylesheet parsing and style computation. -pub type GeckoArcURI = RefPtr<::gecko_bindings::structs::ThreadSafeURIHolder>; diff --git a/components/style/parser.rs b/components/style/parser.rs index 8a8628d2d89..f4d52ffbfdd 100644 --- a/components/style/parser.rs +++ b/components/style/parser.rs @@ -9,7 +9,9 @@ use cssparser::{Parser, SourcePosition, UnicodeRange}; use error_reporting::ParseErrorReporter; #[cfg(feature = "gecko")] -use gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI}; +use gecko_bindings::structs::URLExtraData; +#[cfg(feature = "gecko")] +use gecko_bindings::sugar::refptr::RefPtr; use servo_url::ServoUrl; use style_traits::OneOrMoreCommaSeparated; use stylesheets::Origin; @@ -21,12 +23,8 @@ pub struct ParserContextExtraData; /// Extra data that the style backend may need to parse stylesheets. #[cfg(feature = "gecko")] pub struct ParserContextExtraData { - /// The base URI. - pub base: Option<GeckoArcURI>, - /// The referrer URI. - pub referrer: Option<GeckoArcURI>, - /// The principal that loaded this stylesheet. - pub principal: Option<GeckoArcPrincipal>, + /// The URL extra data. + pub data: Option<RefPtr<URLExtraData>>, } #[cfg(not(feature = "gecko"))] @@ -39,7 +37,7 @@ impl Default for ParserContextExtraData { #[cfg(feature = "gecko")] impl Default for ParserContextExtraData { fn default() -> Self { - ParserContextExtraData { base: None, referrer: None, principal: None } + ParserContextExtraData { data: None } } } @@ -48,15 +46,10 @@ 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()), - }} + pub unsafe fn new(data: *mut URLExtraData) -> Self { + ParserContextExtraData { + data: Some(RefPtr::new(data)), + } } } /// The data that the parser needs from outside in order to parse a stylesheet. diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index d05a5ed4a1e..244a0e4a186 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -2158,8 +2158,7 @@ ${helpers.predefined_type("-moz-binding", "UrlOrNone", "Either::Second(None_)", animatable="False", gecko_ffi_name="mBinding", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-binding)", - disable_when_testing="True", - boxed=True)} + disable_when_testing="True")} ${helpers.single_keyword("-moz-orient", "inline block horizontal vertical", diff --git a/components/style/properties/longhand/inherited_svg.mako.rs b/components/style/properties/longhand/inherited_svg.mako.rs index 31d393f13fc..241a08905b4 100644 --- a/components/style/properties/longhand/inherited_svg.mako.rs +++ b/components/style/properties/longhand/inherited_svg.mako.rs @@ -121,19 +121,16 @@ ${helpers.single_keyword("clip-rule", "nonzero evenodd", ${helpers.predefined_type("marker-start", "UrlOrNone", "Either::Second(None_)", products="gecko", - boxed = product == "gecko", animatable="False", spec="https://www.w3.org/TR/SVG2/painting.html#VertexMarkerProperties")} ${helpers.predefined_type("marker-mid", "UrlOrNone", "Either::Second(None_)", products="gecko", - boxed = product == "gecko", animatable="False", spec="https://www.w3.org/TR/SVG2/painting.html#VertexMarkerProperties")} ${helpers.predefined_type("marker-end", "UrlOrNone", "Either::Second(None_)", products="gecko", - boxed = product == "gecko", animatable="False", spec="https://www.w3.org/TR/SVG2/painting.html#VertexMarkerProperties")} diff --git a/components/style/properties/longhand/list.mako.rs b/components/style/properties/longhand/list.mako.rs index 8049c06d05c..81ce62a32e1 100644 --- a/components/style/properties/longhand/list.mako.rs +++ b/components/style/properties/longhand/list.mako.rs @@ -38,7 +38,6 @@ ${helpers.single_keyword("list-style-type", """ spec="https://drafts.csswg.org/css-lists/#propdef-list-style-type")} ${helpers.predefined_type("list-style-image", "UrlOrNone", "Either::Second(None_)", - boxed = product == "gecko", initial_specified_value="Either::Second(None_)", animatable=False, spec="https://drafts.csswg.org/css-lists/#propdef-list-style-image")} diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 455aaaf41d2..00580613e2d 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -54,16 +54,15 @@ use style::gecko_bindings::bindings::nsTimingFunctionBorrowed; use style::gecko_bindings::bindings::nsTimingFunctionBorrowedMut; use style::gecko_bindings::structs; use style::gecko_bindings::structs::{SheetParsingMode, nsIAtom, nsCSSPropertyID}; -use style::gecko_bindings::structs::{ThreadSafePrincipalHolder, ThreadSafeURIHolder}; use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint, nsCSSFontFaceRule}; use style::gecko_bindings::structs::Loader; use style::gecko_bindings::structs::RawGeckoPresContextOwned; use style::gecko_bindings::structs::ServoStyleSheet; +use style::gecko_bindings::structs::URLExtraData; use style::gecko_bindings::structs::nsCSSValueSharedList; use style::gecko_bindings::structs::nsresult; use style::gecko_bindings::sugar::ownership::{FFIArcHelpers, HasFFI, HasArcFFI, HasBoxFFI}; use style::gecko_bindings::sugar::ownership::{HasSimpleFFI, Strong}; -use style::gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI}; use style::gecko_properties::{self, style_structs}; use style::keyframes::KeyframesStepValue; use style::media_queries::{MediaList, parse_media_query_list}; @@ -331,9 +330,7 @@ pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes(loader: *mut Loader, data: *const nsACString, mode: SheetParsingMode, base_url: *const nsACString, - base: *mut ThreadSafeURIHolder, - referrer: *mut ThreadSafeURIHolder, - principal: *mut ThreadSafePrincipalHolder) + extra_data: *mut URLExtraData) -> RawServoStyleSheetStrong { let global_style_data = &*GLOBAL_STYLE_DATA; let input = unsafe { data.as_ref().unwrap().as_str_unchecked() }; @@ -346,11 +343,7 @@ pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes(loader: *mut Loader, let base_str = unsafe { base_url.as_ref().unwrap().as_str_unchecked() }; let 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 extra_data = unsafe { ParserContextExtraData::new(extra_data) }; let loader = if loader.is_null() { None } else { @@ -375,16 +368,10 @@ pub extern "C" fn Servo_StyleSheet_ClearAndUpdate(stylesheet: RawServoStyleSheet loader: *mut Loader, gecko_stylesheet: *mut ServoStyleSheet, data: *const nsACString, - base: *mut ThreadSafeURIHolder, - referrer: *mut ThreadSafeURIHolder, - principal: *mut ThreadSafePrincipalHolder) + extra_data: *mut URLExtraData) { let input = unsafe { data.as_ref().unwrap().as_str_unchecked() }; - let extra_data = unsafe { ParserContextExtraData { - base: Some(GeckoArcURI::new(base)), - referrer: Some(GeckoArcURI::new(referrer)), - principal: Some(GeckoArcPrincipal::new(principal)), - }}; + let extra_data = unsafe { ParserContextExtraData::new(extra_data) }; let loader = if loader.is_null() { None @@ -792,7 +779,7 @@ macro_rules! make_context { #[no_mangle] pub extern "C" fn Servo_ParseProperty(property: *const nsACString, value: *const nsACString, base: *const nsACString, - data: *const structs::GeckoParserExtraData) + data: *mut URLExtraData) -> RawServoDeclarationBlockStrong { let name = unsafe { property.as_ref().unwrap().as_str_unchecked() }; let id = if let Ok(id) = PropertyId::parse(name.into()) { @@ -824,7 +811,7 @@ pub extern "C" fn Servo_ParseProperty(property: *const nsACString, value: *const #[no_mangle] pub extern "C" fn Servo_ParseEasing(easing: *const nsAString, base: *const nsACString, - data: *const structs::GeckoParserExtraData, + data: *mut URLExtraData, output: nsTimingFunctionBorrowedMut) -> bool { use style::properties::longhands::transition_timing_function; @@ -845,7 +832,7 @@ pub extern "C" fn Servo_ParseEasing(easing: *const nsAString, #[no_mangle] pub extern "C" fn Servo_ParseStyleAttribute(data: *const nsACString, base: *const nsACString, - raw_extra_data: *const structs::GeckoParserExtraData) + raw_extra_data: *mut URLExtraData) -> RawServoDeclarationBlockStrong { let global_style_data = &*GLOBAL_STYLE_DATA; let value = unsafe { data.as_ref().unwrap().as_str_unchecked() }; @@ -965,7 +952,7 @@ pub extern "C" fn Servo_DeclarationBlock_GetPropertyIsImportant(declarations: Ra fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId, value: *const nsACString, is_important: bool, - base: *const nsACString, data: *const structs::GeckoParserExtraData) -> bool { + base: *const nsACString, data: *mut URLExtraData) -> bool { let value = unsafe { value.as_ref().unwrap().as_str_unchecked() }; make_context!((base, data) => (base_url, extra_data)); @@ -985,7 +972,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetProperty(declarations: RawServoDecla property: *const nsACString, value: *const nsACString, is_important: bool, base: *const nsACString, - data: *const structs::GeckoParserExtraData) -> bool { + data: *mut URLExtraData) -> bool { set_property(declarations, get_property_id_from_property!(property, false), value, is_important, base, data) } @@ -995,7 +982,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetPropertyById(declarations: RawServoD property: nsCSSPropertyID, value: *const nsACString, is_important: bool, base: *const nsACString, - data: *const structs::GeckoParserExtraData) -> bool { + data: *mut URLExtraData) -> bool { set_property(declarations, get_property_id_from_nscsspropertyid!(property, false), value, is_important, base, data) } diff --git a/ports/geckolib/stylesheet_loader.rs b/ports/geckolib/stylesheet_loader.rs index cc81a267b48..78a859cc64e 100644 --- a/ports/geckolib/stylesheet_loader.rs +++ b/ports/geckolib/stylesheet_loader.rs @@ -44,13 +44,13 @@ impl StyleStylesheetLoader for StylesheetLoader { // so this raw pointer will still be valid. let (spec_bytes, spec_len): (*const u8, usize) = import.url.as_slice_components(); - let base_uri = import.url.base.mRawPtr; + let base_url_data = import.url.extra_data.get(); let arc = make_arc(import); unsafe { Gecko_LoadStyleSheet(self.0, self.1, HasArcFFI::arc_as_borrowed(&arc), - base_uri, + base_url_data, spec_bytes, spec_len as u32, media_string.as_bytes().as_ptr(), |