aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/script/stylesheet_loader.rs4
-rw-r--r--components/style/gecko/url.rs64
-rw-r--r--components/style/servo/url.rs25
-rw-r--r--components/style/stylesheets/document_rule.rs6
-rw-r--r--components/style/stylesheets/import_rule.rs4
-rw-r--r--components/style/stylesheets/loader.rs4
-rw-r--r--components/style/stylesheets/rule_parser.rs14
-rw-r--r--components/style/values/mod.rs5
-rw-r--r--components/style/values/specified/image.rs3
9 files changed, 84 insertions, 45 deletions
diff --git a/components/script/stylesheet_loader.rs b/components/script/stylesheet_loader.rs
index 09b22913424..0c5e792ad6a 100644
--- a/components/script/stylesheet_loader.rs
+++ b/components/script/stylesheet_loader.rs
@@ -34,7 +34,7 @@ use style::shared_lock::{Locked, SharedRwLock};
use style::stylesheets::{CssRules, ImportRule, Namespaces, Stylesheet, StylesheetContents, Origin};
use style::stylesheets::StylesheetLoader as StyleStylesheetLoader;
use style::stylesheets::import_rule::ImportSheet;
-use style::values::specified::url::SpecifiedUrl;
+use style::values::CssUrl;
pub trait StylesheetOwner {
/// Returns whether this element was inserted by the parser (i.e., it should
@@ -276,7 +276,7 @@ impl<'a> StyleStylesheetLoader for StylesheetLoader<'a> {
/// the constructed `@import` rule.
fn request_stylesheet(
&self,
- url: SpecifiedUrl,
+ url: CssUrl,
source_location: SourceLocation,
context: &ParserContext,
lock: &SharedRwLock,
diff --git a/components/style/gecko/url.rs b/components/style/gecko/url.rs
index 9da274a3848..ba9605ae633 100644
--- a/components/style/gecko/url.rs
+++ b/components/style/gecko/url.rs
@@ -17,10 +17,10 @@ use servo_arc::{Arc, RawOffsetArc};
use std::mem;
use style_traits::ParseError;
-/// A specified url() value for gecko. Gecko does not eagerly resolve SpecifiedUrls.
+/// A CSS url() value for gecko.
#[css(function = "url")]
#[derive(Clone, Debug, PartialEq, ToCss)]
-pub struct SpecifiedUrl {
+pub struct CssUrl {
/// The URL in unresolved string form.
///
/// Refcounted since cloning this should be cheap and data: uris can be
@@ -31,9 +31,8 @@ pub struct SpecifiedUrl {
#[css(skip)]
pub extra_data: RefPtr<URLExtraData>,
}
-trivial_to_computed_value!(SpecifiedUrl);
-impl SpecifiedUrl {
+impl CssUrl {
/// Try to parse a URL from a string value that is a valid CSS token for a
/// URL.
///
@@ -41,7 +40,7 @@ impl SpecifiedUrl {
pub fn parse_from_string<'a>(url: String,
context: &ParserContext)
-> Result<Self, ParseError<'a>> {
- Ok(SpecifiedUrl {
+ Ok(CssUrl {
serialization: Arc::new(url),
extra_data: context.url_data.clone(),
})
@@ -55,9 +54,8 @@ impl SpecifiedUrl {
}
/// Convert from URLValueData to SpecifiedUrl.
- pub unsafe fn from_url_value_data(url: &URLValueData)
- -> Result<SpecifiedUrl, ()> {
- Ok(SpecifiedUrl {
+ unsafe fn from_url_value_data(url: &URLValueData) -> Result<Self, ()> {
+ Ok(CssUrl {
serialization: if url.mUsingRustString {
let arc_type = url.mStrings.mRustString.as_ref()
as *const _ as
@@ -102,16 +100,16 @@ impl SpecifiedUrl {
}
}
-impl Parse for SpecifiedUrl {
+impl Parse for CssUrl {
fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i>> {
let url = input.expect_url()?;
Self::parse_from_string(url.as_ref().to_owned(), context)
}
}
-impl Eq for SpecifiedUrl {}
+impl Eq for CssUrl {}
-impl MallocSizeOf for SpecifiedUrl {
+impl MallocSizeOf for CssUrl {
fn size_of(&self, _ops: &mut MallocSizeOfOps) -> usize {
// XXX: measure `serialization` once bug 1397971 lands
@@ -122,13 +120,47 @@ impl MallocSizeOf for SpecifiedUrl {
}
}
+/// A specified url() value for general usage.
+#[derive(Clone, Debug, PartialEq, Eq, MallocSizeOf, ToCss)]
+pub struct SpecifiedUrl {
+ /// The specified url value.
+ pub url: CssUrl,
+}
+trivial_to_computed_value!(SpecifiedUrl);
+
+impl SpecifiedUrl {
+ fn from_css_url(url: CssUrl) -> Self {
+ SpecifiedUrl { url }
+ }
+
+ /// Convert from URLValueData to SpecifiedUrl.
+ pub unsafe fn from_url_value_data(url: &URLValueData) -> Result<Self, ()> {
+ CssUrl::from_url_value_data(url).map(Self::from_css_url)
+ }
+
+ /// Create a bundled URI suitable for sending to Gecko
+ /// to be constructed into a css::URLValue.
+ ///
+ /// XXX This is added temporially. It would be removed once we store
+ /// URLValue in SpecifiedUrl directly.
+ pub fn for_ffi(&self) -> ServoBundledURI {
+ self.url.for_ffi()
+ }
+}
+
+impl Parse for SpecifiedUrl {
+ fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i>> {
+ CssUrl::parse(context, input).map(Self::from_css_url)
+ }
+}
+
/// A specified url() value for image.
///
/// This exists so that we can construct `ImageValue` and reuse it.
#[derive(Clone, Debug, ToCss)]
pub struct SpecifiedImageUrl {
/// The specified url value.
- pub url: SpecifiedUrl,
+ pub url: CssUrl,
/// Gecko's ImageValue so that we can reuse it while rematching a
/// property with this specified value.
#[css(skip)]
@@ -137,7 +169,7 @@ pub struct SpecifiedImageUrl {
trivial_to_computed_value!(SpecifiedImageUrl);
impl SpecifiedImageUrl {
- fn from_specified_url(url: SpecifiedUrl) -> Self {
+ fn from_css_url(url: CssUrl) -> Self {
let image_value = unsafe {
let ptr = bindings::Gecko_ImageValue_Create(url.for_ffi());
// We do not expect Gecko_ImageValue_Create returns null.
@@ -152,12 +184,12 @@ impl SpecifiedImageUrl {
url: String,
context: &ParserContext
) -> Result<Self, ParseError<'a>> {
- SpecifiedUrl::parse_from_string(url, context).map(Self::from_specified_url)
+ CssUrl::parse_from_string(url, context).map(Self::from_css_url)
}
/// Convert from URLValueData to SpecifiedUrl.
pub unsafe fn from_url_value_data(url: &URLValueData) -> Result<Self, ()> {
- SpecifiedUrl::from_url_value_data(url).map(Self::from_specified_url)
+ CssUrl::from_url_value_data(url).map(Self::from_css_url)
}
/// Convert from nsStyleImageRequest to SpecifiedUrl.
@@ -174,7 +206,7 @@ impl SpecifiedImageUrl {
impl Parse for SpecifiedImageUrl {
fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i>> {
- SpecifiedUrl::parse(context, input).map(Self::from_specified_url)
+ CssUrl::parse(context, input).map(Self::from_css_url)
}
}
diff --git a/components/style/servo/url.rs b/components/style/servo/url.rs
index fc461955cea..67b884c2bea 100644
--- a/components/style/servo/url.rs
+++ b/components/style/servo/url.rs
@@ -15,7 +15,7 @@ use std::sync::Arc;
use style_traits::{CssWriter, ParseError, ToCss};
use values::computed::{Context, ToComputedValue};
-/// A specified url() value for servo.
+/// A CSS url() value for servo.
///
/// Servo eagerly resolves SpecifiedUrls, which it can then take advantage of
/// when computing values. In contrast, Gecko uses a different URL backend, so
@@ -24,7 +24,7 @@ use values::computed::{Context, ToComputedValue};
/// However, this approach is still not necessarily optimal: See
/// <https://bugzilla.mozilla.org/show_bug.cgi?id=1347435#c6>
#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
-pub struct SpecifiedUrl {
+pub struct CssUrl {
/// The original URI. This might be optional since we may insert computed
/// values of images into the cascade directly, and we don't bother to
/// convert their serialization.
@@ -38,7 +38,7 @@ pub struct SpecifiedUrl {
resolved: Option<ServoUrl>,
}
-impl SpecifiedUrl {
+impl CssUrl {
/// Try to parse a URL from a string value that is a valid CSS token for a
/// URL. Never fails - the API is only fallible to be compatible with the
/// gecko version.
@@ -47,7 +47,7 @@ impl SpecifiedUrl {
-> Result<Self, ParseError<'a>> {
let serialization = Arc::new(url);
let resolved = context.url_data.join(&serialization).ok();
- Ok(SpecifiedUrl {
+ Ok(CssUrl {
original: Some(serialization),
resolved: resolved,
})
@@ -88,7 +88,7 @@ impl SpecifiedUrl {
/// Creates an already specified url value from an already resolved URL
/// for insertion in the cascade.
pub fn for_cascade(url: ServoUrl) -> Self {
- SpecifiedUrl {
+ CssUrl {
original: None,
resolved: Some(url),
}
@@ -96,21 +96,21 @@ impl SpecifiedUrl {
/// Gets a new url from a string for unit tests.
pub fn new_for_testing(url: &str) -> Self {
- SpecifiedUrl {
+ CssUrl {
original: Some(Arc::new(url.into())),
resolved: ServoUrl::parse(url).ok(),
}
}
}
-impl Parse for SpecifiedUrl {
+impl Parse for CssUrl {
fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i>> {
let url = input.expect_url()?;
Self::parse_from_string(url.as_ref().to_owned(), context)
}
}
-impl PartialEq for SpecifiedUrl {
+impl PartialEq for CssUrl {
fn eq(&self, other: &Self) -> bool {
// TODO(emilio): maybe we care about equality of the specified values if
// present? Seems not.
@@ -118,9 +118,9 @@ impl PartialEq for SpecifiedUrl {
}
}
-impl Eq for SpecifiedUrl {}
+impl Eq for CssUrl {}
-impl ToCss for SpecifiedUrl {
+impl ToCss for CssUrl {
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: Write,
@@ -142,6 +142,9 @@ impl ToCss for SpecifiedUrl {
}
}
+/// A specified url() value for servo.
+pub type SpecifiedUrl = CssUrl;
+
impl ToComputedValue for SpecifiedUrl {
type ComputedValue = ComputedUrl;
@@ -174,7 +177,7 @@ impl ToComputedValue for SpecifiedUrl {
}
/// A specified image url() value for servo.
-pub type SpecifiedImageUrl = SpecifiedUrl;
+pub type SpecifiedImageUrl = CssUrl;
/// The computed value of a CSS `url()`, resolved relative to the stylesheet URL.
#[derive(Clone, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
diff --git a/components/style/stylesheets/document_rule.rs b/components/style/stylesheets/document_rule.rs
index 8c9a3e21ee6..3edfbbb6362 100644
--- a/components/style/stylesheets/document_rule.rs
+++ b/components/style/stylesheets/document_rule.rs
@@ -17,7 +17,7 @@ use std::fmt::{self, Write};
use str::CssStringWriter;
use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use stylesheets::CssRules;
-use values::specified::url::SpecifiedUrl;
+use values::CssUrl;
#[derive(Debug)]
/// A @-moz-document rule
@@ -75,7 +75,7 @@ impl DeepCloneWithLock for DocumentRule {
pub enum UrlMatchingFunction {
/// Exact URL matching function. It evaluates to true whenever the
/// URL of the document being styled is exactly the URL given.
- Url(SpecifiedUrl),
+ Url(CssUrl),
/// URL prefix matching function. It evaluates to true whenever the
/// URL of the document being styled has the argument to the
/// function as an initial substring (which is true when the two
@@ -130,7 +130,7 @@ impl UrlMatchingFunction {
input.parse_nested_block(|input| {
Ok(UrlMatchingFunction::Regexp(input.expect_string()?.as_ref().to_owned()))
})
- } else if let Ok(url) = input.try(|input| SpecifiedUrl::parse(context, input)) {
+ } else if let Ok(url) = input.try(|input| CssUrl::parse(context, input)) {
Ok(UrlMatchingFunction::Url(url))
} else {
Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError))
diff --git a/components/style/stylesheets/import_rule.rs b/components/style/stylesheets/import_rule.rs
index c72800b4517..6b3c28621e5 100644
--- a/components/style/stylesheets/import_rule.rs
+++ b/components/style/stylesheets/import_rule.rs
@@ -13,7 +13,7 @@ use std::fmt::{self, Write};
use str::CssStringWriter;
use style_traits::{CssWriter, ToCss};
use stylesheets::{StylesheetContents, StylesheetInDocument};
-use values::specified::url::SpecifiedUrl;
+use values::CssUrl;
/// A sheet that is held from an import rule.
#[cfg(feature = "gecko")]
@@ -80,7 +80,7 @@ impl DeepCloneWithLock for ImportSheet {
#[derive(Debug)]
pub struct ImportRule {
/// The `<url>` this `@import` rule is loading.
- pub url: SpecifiedUrl,
+ pub url: CssUrl,
/// The stylesheet is always present.
///
diff --git a/components/style/stylesheets/loader.rs b/components/style/stylesheets/loader.rs
index 072c64e45ee..baab9df3838 100644
--- a/components/style/stylesheets/loader.rs
+++ b/components/style/stylesheets/loader.rs
@@ -11,7 +11,7 @@ use parser::ParserContext;
use servo_arc::Arc;
use shared_lock::{Locked, SharedRwLock};
use stylesheets::import_rule::ImportRule;
-use values::specified::url::SpecifiedUrl;
+use values::CssUrl;
/// The stylesheet loader is the abstraction used to trigger network requests
/// for `@import` rules.
@@ -20,7 +20,7 @@ pub trait StylesheetLoader {
/// the constructed `@import` rule.
fn request_stylesheet(
&self,
- url: SpecifiedUrl,
+ url: CssUrl,
location: SourceLocation,
context: &ParserContext,
lock: &SharedRwLock,
diff --git a/components/style/stylesheets/rule_parser.rs b/components/style/stylesheets/rule_parser.rs
index ecbfd3332b6..5bc3fb8f050 100644
--- a/components/style/stylesheets/rule_parser.rs
+++ b/components/style/stylesheets/rule_parser.rs
@@ -28,10 +28,8 @@ use stylesheets::keyframes_rule::parse_keyframe_list;
use stylesheets::stylesheet::Namespaces;
use stylesheets::supports_rule::SupportsCondition;
use stylesheets::viewport_rule;
-use values::CustomIdent;
-use values::KeyframesName;
+use values::{CssUrl, CustomIdent, KeyframesName};
use values::computed::font::FamilyName;
-use values::specified::url::SpecifiedUrl;
/// The parser for the top-level rules in a stylesheet.
pub struct TopLevelRuleParser<'a, R: 'a> {
@@ -134,7 +132,7 @@ pub enum AtRuleBlockPrelude {
/// A rule prelude for at-rule without block.
pub enum AtRuleNonBlockPrelude {
/// A @import rule prelude.
- Import(SpecifiedUrl, Arc<Locked<MediaList>>, SourceLocation),
+ Import(CssUrl, Arc<Locked<MediaList>>, SourceLocation),
/// A @namespace rule prelude.
Namespace(Option<Prefix>, Namespace, SourceLocation),
}
@@ -174,13 +172,13 @@ impl<'a, 'i, R: ParseErrorReporter> AtRuleParser<'i> for TopLevelRuleParser<'a,
}
let url_string = input.expect_url_or_string()?.as_ref().to_owned();
- let specified_url = SpecifiedUrl::parse_from_string(url_string, &self.context)?;
+ let url = CssUrl::parse_from_string(url_string, &self.context)?;
let media = parse_media_query_list(&self.context, input,
self.error_context.error_reporter);
let media = Arc::new(self.shared_lock.wrap(media));
- let prelude = AtRuleNonBlockPrelude::Import(specified_url, media, location);
+ let prelude = AtRuleNonBlockPrelude::Import(url, media, location);
return Ok(AtRuleType::WithoutBlock(prelude));
},
"namespace" => {
@@ -228,12 +226,12 @@ impl<'a, 'i, R: ParseErrorReporter> AtRuleParser<'i> for TopLevelRuleParser<'a,
#[inline]
fn rule_without_block(&mut self, prelude: AtRuleNonBlockPrelude) -> CssRule {
match prelude {
- AtRuleNonBlockPrelude::Import(specified_url, media, location) => {
+ AtRuleNonBlockPrelude::Import(url, media, location) => {
let loader =
self.loader.expect("Expected a stylesheet loader for @import");
let import_rule = loader.request_stylesheet(
- specified_url,
+ url,
location,
&self.context,
&self.shared_lock,
diff --git a/components/style/values/mod.rs b/components/style/values/mod.rs
index 5c85a7710e4..eec49faaa03 100644
--- a/components/style/values/mod.rs
+++ b/components/style/values/mod.rs
@@ -17,6 +17,11 @@ use std::hash;
use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::distance::{ComputeSquaredDistance, SquaredDistance};
+#[cfg(feature = "servo")]
+pub use servo::url::CssUrl;
+#[cfg(feature = "gecko")]
+pub use gecko::url::CssUrl;
+
pub mod animated;
pub mod computed;
pub mod distance;
diff --git a/components/style/values/specified/image.rs b/components/style/values/specified/image.rs
index 331b10be453..844e50cbf79 100644
--- a/components/style/values/specified/image.rs
+++ b/components/style/values/specified/image.rs
@@ -152,7 +152,8 @@ impl Image {
/// for insertion in the cascade.
#[cfg(feature = "servo")]
pub fn for_cascade(url: ServoUrl) -> Self {
- GenericImage::Url(SpecifiedUrl::for_cascade(url))
+ use values::CssUrl;
+ GenericImage::Url(CssUrl::for_cascade(url))
}
/// Parses a `-moz-element(# <element-id>)`.