aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXidorn Quan <me@upsuper.org>2017-04-03 13:32:21 +1000
committerXidorn Quan <me@upsuper.org>2017-04-03 14:30:33 +1000
commit0a97a0df0cd7f73e46be467ac58667a8ac0eb7cd (patch)
tree40bb827fbab1d6270c0086826a80b532e86e946a
parenta31271b07ff1372e48d8b363a1f4a16b8ff6f98d (diff)
downloadservo-0a97a0df0cd7f73e46be467ac58667a8ac0eb7cd.tar.gz
servo-0a97a0df0cd7f73e46be467ac58667a8ac0eb7cd.zip
Create URLExtraData for holding base uri, referrer, and principal.
-rw-r--r--components/style/build_gecko.rs6
-rw-r--r--components/style/gecko/url.rs22
-rw-r--r--components/style/gecko_bindings/sugar/refptr.rs16
-rw-r--r--components/style/parser.rs27
-rw-r--r--components/style/properties/longhand/box.mako.rs3
-rw-r--r--components/style/properties/longhand/inherited_svg.mako.rs3
-rw-r--r--components/style/properties/longhand/list.mako.rs1
-rw-r--r--ports/geckolib/glue.rs35
-rw-r--r--ports/geckolib/stylesheet_loader.rs4
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(),