mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
Miscellaneous build / tidy fixes.
This commit is contained in:
parent
5158f65810
commit
31e8e418ea
66 changed files with 566 additions and 294 deletions
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -1,5 +1,7 @@
|
||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "accountable-refcell"
|
name = "accountable-refcell"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
@ -1171,9 +1173,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cssparser"
|
name = "cssparser"
|
||||||
version = "0.27.2"
|
version = "0.28.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
|
checksum = "1db8599a9761b371751fbf13e076fa03c6e1a78f8c5288e6ab9467f10a2322c1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cssparser-macros",
|
"cssparser-macros",
|
||||||
"dtoa-short",
|
"dtoa-short",
|
||||||
|
@ -5214,7 +5216,6 @@ dependencies = [
|
||||||
"precomputed-hash",
|
"precomputed-hash",
|
||||||
"servo_arc",
|
"servo_arc",
|
||||||
"smallvec 1.6.1",
|
"smallvec 1.6.1",
|
||||||
"thin-slice",
|
|
||||||
"to_shmem",
|
"to_shmem",
|
||||||
"to_shmem_derive",
|
"to_shmem_derive",
|
||||||
]
|
]
|
||||||
|
|
|
@ -20,7 +20,7 @@ bitflags = "1.0"
|
||||||
byteorder = "1"
|
byteorder = "1"
|
||||||
canvas_traits = { path = "../canvas_traits" }
|
canvas_traits = { path = "../canvas_traits" }
|
||||||
crossbeam-channel = "0.4"
|
crossbeam-channel = "0.4"
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
euclid = "0.20"
|
euclid = "0.20"
|
||||||
font-kit = "0.10"
|
font-kit = "0.10"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
|
|
|
@ -16,7 +16,7 @@ xr-profile = ["webxr-api/profile", "time"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
crossbeam-channel = "0.4"
|
crossbeam-channel = "0.4"
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
euclid = "0.20"
|
euclid = "0.20"
|
||||||
ipc-channel = "0.14"
|
ipc-channel = "0.14"
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
|
|
|
@ -222,7 +222,12 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn map_type_params_in_path<F>(path: &Path, params: &[&TypeParam], self_type: &Path, f: &mut F) -> Path
|
fn map_type_params_in_path<F>(
|
||||||
|
path: &Path,
|
||||||
|
params: &[&TypeParam],
|
||||||
|
self_type: &Path,
|
||||||
|
f: &mut F,
|
||||||
|
) -> Path
|
||||||
where
|
where
|
||||||
F: FnMut(&Ident) -> Type,
|
F: FnMut(&Ident) -> Type,
|
||||||
{
|
{
|
||||||
|
@ -241,9 +246,9 @@ where
|
||||||
.iter()
|
.iter()
|
||||||
.map(|arg| match arg {
|
.map(|arg| match arg {
|
||||||
ty @ &GenericArgument::Lifetime(_) => ty.clone(),
|
ty @ &GenericArgument::Lifetime(_) => ty.clone(),
|
||||||
&GenericArgument::Type(ref data) => {
|
&GenericArgument::Type(ref data) => GenericArgument::Type(
|
||||||
GenericArgument::Type(map_type_params(data, params, self_type, f))
|
map_type_params(data, params, self_type, f),
|
||||||
},
|
),
|
||||||
&GenericArgument::Binding(ref data) => {
|
&GenericArgument::Binding(ref data) => {
|
||||||
GenericArgument::Binding(Binding {
|
GenericArgument::Binding(Binding {
|
||||||
ty: map_type_params(&data.ty, params, self_type, f),
|
ty: map_type_params(&data.ty, params, self_type, f),
|
||||||
|
|
|
@ -71,8 +71,8 @@ use style::logical_geometry::Direction;
|
||||||
use style::properties::ComputedValues;
|
use style::properties::ComputedValues;
|
||||||
use style::selector_parser::{PseudoElement, RestyleDamage};
|
use style::selector_parser::{PseudoElement, RestyleDamage};
|
||||||
use style::servo::restyle_damage::ServoRestyleDamage;
|
use style::servo::restyle_damage::ServoRestyleDamage;
|
||||||
|
use style::values::computed::Image;
|
||||||
use style::values::generics::counters::ContentItem;
|
use style::values::generics::counters::ContentItem;
|
||||||
use style::values::generics::url::UrlOrNone as ImageUrlOrNone;
|
|
||||||
|
|
||||||
/// The results of flow construction for a DOM node.
|
/// The results of flow construction for a DOM node.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
@ -1506,9 +1506,9 @@ where
|
||||||
) -> ConstructionResult {
|
) -> ConstructionResult {
|
||||||
let flotation = FloatKind::from_property(flotation);
|
let flotation = FloatKind::from_property(flotation);
|
||||||
let marker_fragments = match node.style(self.style_context()).get_list().list_style_image {
|
let marker_fragments = match node.style(self.style_context()).get_list().list_style_image {
|
||||||
ImageUrlOrNone::Url(ref url_value) => {
|
Image::Url(ref url_value) => {
|
||||||
let image_info = Box::new(ImageFragmentInfo::new(
|
let image_info = Box::new(ImageFragmentInfo::new(
|
||||||
url_value.url().map(|u| u.clone()),
|
url_value.url().cloned(),
|
||||||
None,
|
None,
|
||||||
node,
|
node,
|
||||||
&self.layout_context,
|
&self.layout_context,
|
||||||
|
@ -1519,7 +1519,13 @@ where
|
||||||
self.layout_context,
|
self.layout_context,
|
||||||
)]
|
)]
|
||||||
},
|
},
|
||||||
ImageUrlOrNone::None => match ListStyleTypeContent::from_list_style_type(
|
// XXX: Non-None image types unimplemented.
|
||||||
|
Image::ImageSet(..) |
|
||||||
|
Image::Rect(..) |
|
||||||
|
Image::Gradient(..) |
|
||||||
|
Image::PaintWorklet(..) |
|
||||||
|
Image::CrossFade(..) |
|
||||||
|
Image::None => match ListStyleTypeContent::from_list_style_type(
|
||||||
node.style(self.style_context()).get_list().list_style_type,
|
node.style(self.style_context()).get_list().list_style_type,
|
||||||
) {
|
) {
|
||||||
ListStyleTypeContent::None => Vec::new(),
|
ListStyleTypeContent::None => Vec::new(),
|
||||||
|
|
|
@ -792,6 +792,9 @@ impl Fragment {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Image::CrossFade(..) | Image::ImageSet(..) => {
|
||||||
|
unreachable!("Shouldn't be parsed by Servo for now")
|
||||||
|
},
|
||||||
Image::Rect(ref rect) => {
|
Image::Rect(ref rect) => {
|
||||||
// This is a (boxed) empty enum on non-Gecko
|
// This is a (boxed) empty enum on non-Gecko
|
||||||
match **rect {}
|
match **rect {}
|
||||||
|
|
|
@ -47,6 +47,7 @@ use style::properties::{
|
||||||
};
|
};
|
||||||
use style::selector_parser::PseudoElement;
|
use style::selector_parser::PseudoElement;
|
||||||
use style::shared_lock::SharedRwLock;
|
use style::shared_lock::SharedRwLock;
|
||||||
|
use style::stylesheets::{CssRuleType, Origin};
|
||||||
use style_traits::{CSSPixel, ParsingMode, ToCss};
|
use style_traits::{CSSPixel, ParsingMode, ToCss};
|
||||||
use webrender_api::ExternalScrollId;
|
use webrender_api::ExternalScrollId;
|
||||||
|
|
||||||
|
@ -762,10 +763,12 @@ fn create_font_declaration(
|
||||||
&mut declarations,
|
&mut declarations,
|
||||||
property.clone(),
|
property.clone(),
|
||||||
value,
|
value,
|
||||||
|
Origin::Author,
|
||||||
url_data,
|
url_data,
|
||||||
None,
|
None,
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
quirks_mode,
|
quirks_mode,
|
||||||
|
CssRuleType::Style,
|
||||||
);
|
);
|
||||||
let declarations = match result {
|
let declarations = match result {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
|
|
|
@ -16,7 +16,7 @@ doctest = false
|
||||||
app_units = "0.7"
|
app_units = "0.7"
|
||||||
atomic_refcell = "0.1.6"
|
atomic_refcell = "0.1.6"
|
||||||
canvas_traits = { path = "../canvas_traits" }
|
canvas_traits = { path = "../canvas_traits" }
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
embedder_traits = { path = "../embedder_traits" }
|
embedder_traits = { path = "../embedder_traits" }
|
||||||
euclid = "0.20"
|
euclid = "0.20"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
|
|
|
@ -474,6 +474,9 @@ impl<'a> BuilderForBoxFragment<'a> {
|
||||||
},
|
},
|
||||||
// Gecko-only value, represented as a (boxed) empty enum on non-Gecko.
|
// Gecko-only value, represented as a (boxed) empty enum on non-Gecko.
|
||||||
Image::Rect(ref rect) => match **rect {},
|
Image::Rect(ref rect) => match **rect {},
|
||||||
|
Image::ImageSet(..) | Image::CrossFade(..) => {
|
||||||
|
unreachable!("Shouldn't be parsed on Servo for now")
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ use crate::dom_traversal::{NodeAndStyleInfo, NodeExt, PseudoElementContentItem};
|
||||||
use crate::replaced::ReplacedContent;
|
use crate::replaced::ReplacedContent;
|
||||||
use style::properties::longhands::list_style_type::computed_value::T as ListStyleType;
|
use style::properties::longhands::list_style_type::computed_value::T as ListStyleType;
|
||||||
use style::properties::style_structs;
|
use style::properties::style_structs;
|
||||||
use style::values::computed::url::UrlOrNone;
|
use style::values::computed::Image;
|
||||||
|
|
||||||
/// https://drafts.csswg.org/css-lists/#content-property
|
/// https://drafts.csswg.org/css-lists/#content-property
|
||||||
pub(crate) fn make_marker<'dom, Node>(
|
pub(crate) fn make_marker<'dom, Node>(
|
||||||
|
@ -21,13 +21,18 @@ where
|
||||||
|
|
||||||
// https://drafts.csswg.org/css-lists/#marker-image
|
// https://drafts.csswg.org/css-lists/#marker-image
|
||||||
let marker_image = || match &style.list_style_image {
|
let marker_image = || match &style.list_style_image {
|
||||||
UrlOrNone::Url(url) => Some(vec![
|
Image::Url(url) => Some(vec![
|
||||||
PseudoElementContentItem::Replaced(ReplacedContent::from_image_url(
|
PseudoElementContentItem::Replaced(ReplacedContent::from_image_url(
|
||||||
info.node, context, url,
|
info.node, context, url,
|
||||||
)?),
|
)?),
|
||||||
PseudoElementContentItem::Text(" ".into()),
|
PseudoElementContentItem::Text(" ".into()),
|
||||||
]),
|
]),
|
||||||
UrlOrNone::None => None,
|
// XXX: Non-None image types unimplemented.
|
||||||
|
Image::ImageSet(..) |
|
||||||
|
Image::Rect(..) |
|
||||||
|
Image::Gradient(..) |
|
||||||
|
Image::CrossFade(..) |
|
||||||
|
Image::None => None,
|
||||||
};
|
};
|
||||||
marker_image().or_else(|| {
|
marker_image().or_else(|| {
|
||||||
Some(vec![PseudoElementContentItem::Text(
|
Some(vec![PseudoElementContentItem::Text(
|
||||||
|
|
|
@ -90,6 +90,7 @@ use style::shared_lock::{
|
||||||
};
|
};
|
||||||
use style::str::is_whitespace;
|
use style::str::is_whitespace;
|
||||||
use style::stylist::CascadeData;
|
use style::stylist::CascadeData;
|
||||||
|
use style::values::{AtomIdent, AtomString};
|
||||||
use style::CaseSensitivityExt;
|
use style::CaseSensitivityExt;
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
@ -500,8 +501,8 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_attr(&self, namespace: &Namespace, attr: &LocalName) -> bool {
|
fn has_attr(&self, namespace: &style::Namespace, attr: &style::LocalName) -> bool {
|
||||||
self.get_attr(namespace, attr).is_some()
|
self.get_attr(&**namespace, &**attr).is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -512,11 +513,11 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn each_class<F>(&self, mut callback: F)
|
fn each_class<F>(&self, mut callback: F)
|
||||||
where
|
where
|
||||||
F: FnMut(&Atom),
|
F: FnMut(&AtomIdent),
|
||||||
{
|
{
|
||||||
if let Some(ref classes) = self.element.get_classes_for_layout() {
|
if let Some(ref classes) = self.element.get_classes_for_layout() {
|
||||||
for class in *classes {
|
for class in *classes {
|
||||||
callback(class)
|
callback(AtomIdent::cast(class))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -640,7 +641,7 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
fn lang_attr(&self) -> Option<SelectorAttrValue> {
|
fn lang_attr(&self) -> Option<SelectorAttrValue> {
|
||||||
self.get_attr(&ns!(xml), &local_name!("lang"))
|
self.get_attr(&ns!(xml), &local_name!("lang"))
|
||||||
.or_else(|| self.get_attr(&ns!(), &local_name!("lang")))
|
.or_else(|| self.get_attr(&ns!(), &local_name!("lang")))
|
||||||
.map(|v| String::from(v as &str))
|
.map(|v| SelectorAttrValue::from(v as &str))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn match_element_lang(
|
fn match_element_lang(
|
||||||
|
@ -663,8 +664,8 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
// so we can decide when to fall back to the Content-Language check.
|
// so we can decide when to fall back to the Content-Language check.
|
||||||
let element_lang = match override_lang {
|
let element_lang = match override_lang {
|
||||||
Some(Some(lang)) => lang,
|
Some(Some(lang)) => lang,
|
||||||
Some(None) => String::new(),
|
Some(None) => AtomString::default(),
|
||||||
None => self.element.get_lang_for_layout(),
|
None => AtomString::from(&*self.element.get_lang_for_layout()),
|
||||||
};
|
};
|
||||||
extended_filtering(&element_lang, &*value)
|
extended_filtering(&element_lang, &*value)
|
||||||
}
|
}
|
||||||
|
@ -813,9 +814,9 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
|
|
||||||
fn attr_matches(
|
fn attr_matches(
|
||||||
&self,
|
&self,
|
||||||
ns: &NamespaceConstraint<&Namespace>,
|
ns: &NamespaceConstraint<&style::Namespace>,
|
||||||
local_name: &LocalName,
|
local_name: &style::LocalName,
|
||||||
operation: &AttrSelectorOperation<&String>,
|
operation: &AttrSelectorOperation<&AtomString>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match *ns {
|
match *ns {
|
||||||
NamespaceConstraint::Specific(ref ns) => self
|
NamespaceConstraint::Specific(ref ns) => self
|
||||||
|
@ -945,7 +946,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_id(&self, id: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_id(&self, id: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
unsafe {
|
unsafe {
|
||||||
(*self.element.id_attribute())
|
(*self.element.id_attribute())
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
@ -954,16 +955,16 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_part(&self, _name: &Atom) -> bool {
|
fn is_part(&self, _name: &AtomIdent) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn imported_part(&self, _: &Atom) -> Option<Atom> {
|
fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_class(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
self.element.has_class_for_layout(name, case_sensitivity)
|
self.element.has_class_for_layout(name, case_sensitivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1434,9 +1435,9 @@ impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> {
|
||||||
|
|
||||||
fn attr_matches(
|
fn attr_matches(
|
||||||
&self,
|
&self,
|
||||||
ns: &NamespaceConstraint<&Namespace>,
|
ns: &NamespaceConstraint<&style::Namespace>,
|
||||||
local_name: &LocalName,
|
local_name: &style::LocalName,
|
||||||
operation: &AttrSelectorOperation<&String>,
|
operation: &AttrSelectorOperation<&AtomString>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match *ns {
|
match *ns {
|
||||||
NamespaceConstraint::Specific(ref ns) => self
|
NamespaceConstraint::Specific(ref ns) => self
|
||||||
|
@ -1470,23 +1471,23 @@ impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_id(&self, _id: &Atom, _case_sensitivity: CaseSensitivity) -> bool {
|
fn has_id(&self, _id: &AtomIdent, _case_sensitivity: CaseSensitivity) -> bool {
|
||||||
debug!("ServoThreadSafeLayoutElement::has_id called");
|
debug!("ServoThreadSafeLayoutElement::has_id called");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_part(&self, _name: &Atom) -> bool {
|
fn is_part(&self, _name: &AtomIdent) -> bool {
|
||||||
debug!("ServoThreadSafeLayoutElement::is_part called");
|
debug!("ServoThreadSafeLayoutElement::is_part called");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn imported_part(&self, _: &Atom) -> Option<Atom> {
|
fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> {
|
||||||
debug!("ServoThreadSafeLayoutElement::imported_part called");
|
debug!("ServoThreadSafeLayoutElement::imported_part called");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_class(&self, _name: &Atom, _case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class(&self, _name: &AtomIdent, _case_sensitivity: CaseSensitivity) -> bool {
|
||||||
debug!("ServoThreadSafeLayoutElement::has_class called");
|
debug!("ServoThreadSafeLayoutElement::has_class called");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
@ -506,6 +506,7 @@ impl LayoutThread {
|
||||||
|
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
window_size.initial_viewport,
|
window_size.initial_viewport,
|
||||||
window_size.device_pixel_ratio,
|
window_size.device_pixel_ratio,
|
||||||
);
|
);
|
||||||
|
@ -1267,7 +1268,12 @@ impl LayoutThread {
|
||||||
};
|
};
|
||||||
|
|
||||||
let had_used_viewport_units = self.stylist.device().used_viewport_units();
|
let had_used_viewport_units = self.stylist.device().used_viewport_units();
|
||||||
let device = Device::new(MediaType::screen(), initial_viewport, device_pixel_ratio);
|
let device = Device::new(
|
||||||
|
MediaType::screen(),
|
||||||
|
self.stylist.quirks_mode(),
|
||||||
|
initial_viewport,
|
||||||
|
device_pixel_ratio,
|
||||||
|
);
|
||||||
let sheet_origins_affected_by_device_change = self.stylist.set_device(device, &guards);
|
let sheet_origins_affected_by_device_change = self.stylist.set_device(device, &guards);
|
||||||
|
|
||||||
self.stylist
|
self.stylist
|
||||||
|
|
|
@ -90,6 +90,7 @@ use style::shared_lock::{
|
||||||
};
|
};
|
||||||
use style::str::is_whitespace;
|
use style::str::is_whitespace;
|
||||||
use style::stylist::CascadeData;
|
use style::stylist::CascadeData;
|
||||||
|
use style::values::{AtomIdent, AtomString};
|
||||||
use style::CaseSensitivityExt;
|
use style::CaseSensitivityExt;
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
@ -508,7 +509,7 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_attr(&self, namespace: &Namespace, attr: &LocalName) -> bool {
|
fn has_attr(&self, namespace: &style::Namespace, attr: &style::LocalName) -> bool {
|
||||||
self.get_attr(namespace, attr).is_some()
|
self.get_attr(namespace, attr).is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,11 +521,11 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn each_class<F>(&self, mut callback: F)
|
fn each_class<F>(&self, mut callback: F)
|
||||||
where
|
where
|
||||||
F: FnMut(&Atom),
|
F: FnMut(&AtomIdent),
|
||||||
{
|
{
|
||||||
if let Some(ref classes) = self.element.get_classes_for_layout() {
|
if let Some(ref classes) = self.element.get_classes_for_layout() {
|
||||||
for class in *classes {
|
for class in *classes {
|
||||||
callback(class)
|
callback(AtomIdent::cast(class))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -648,7 +649,7 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
fn lang_attr(&self) -> Option<SelectorAttrValue> {
|
fn lang_attr(&self) -> Option<SelectorAttrValue> {
|
||||||
self.get_attr(&ns!(xml), &local_name!("lang"))
|
self.get_attr(&ns!(xml), &local_name!("lang"))
|
||||||
.or_else(|| self.get_attr(&ns!(), &local_name!("lang")))
|
.or_else(|| self.get_attr(&ns!(), &local_name!("lang")))
|
||||||
.map(|v| String::from(v as &str))
|
.map(|v| SelectorAttrValue::from(v as &str))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn match_element_lang(
|
fn match_element_lang(
|
||||||
|
@ -671,8 +672,8 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
// so we can decide when to fall back to the Content-Language check.
|
// so we can decide when to fall back to the Content-Language check.
|
||||||
let element_lang = match override_lang {
|
let element_lang = match override_lang {
|
||||||
Some(Some(lang)) => lang,
|
Some(Some(lang)) => lang,
|
||||||
Some(None) => String::new(),
|
Some(None) => AtomString::default(),
|
||||||
None => self.element.get_lang_for_layout(),
|
None => AtomString::from(&*self.element.get_lang_for_layout()),
|
||||||
};
|
};
|
||||||
extended_filtering(&element_lang, &*value)
|
extended_filtering(&element_lang, &*value)
|
||||||
}
|
}
|
||||||
|
@ -821,9 +822,9 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
|
|
||||||
fn attr_matches(
|
fn attr_matches(
|
||||||
&self,
|
&self,
|
||||||
ns: &NamespaceConstraint<&Namespace>,
|
ns: &NamespaceConstraint<&style::Namespace>,
|
||||||
local_name: &LocalName,
|
local_name: &style::LocalName,
|
||||||
operation: &AttrSelectorOperation<&String>,
|
operation: &AttrSelectorOperation<&AtomString>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match *ns {
|
match *ns {
|
||||||
NamespaceConstraint::Specific(ref ns) => self
|
NamespaceConstraint::Specific(ref ns) => self
|
||||||
|
@ -953,7 +954,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_id(&self, id: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_id(&self, id: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
unsafe {
|
unsafe {
|
||||||
(*self.element.id_attribute())
|
(*self.element.id_attribute())
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
@ -962,16 +963,16 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_part(&self, _name: &Atom) -> bool {
|
fn is_part(&self, _name: &AtomIdent) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn imported_part(&self, _: &Atom) -> Option<Atom> {
|
fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_class(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
self.element.has_class_for_layout(name, case_sensitivity)
|
self.element.has_class_for_layout(name, case_sensitivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1445,9 +1446,9 @@ impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> {
|
||||||
|
|
||||||
fn attr_matches(
|
fn attr_matches(
|
||||||
&self,
|
&self,
|
||||||
ns: &NamespaceConstraint<&Namespace>,
|
ns: &NamespaceConstraint<&style::Namespace>,
|
||||||
local_name: &LocalName,
|
local_name: &style::LocalName,
|
||||||
operation: &AttrSelectorOperation<&String>,
|
operation: &AttrSelectorOperation<&AtomString>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match *ns {
|
match *ns {
|
||||||
NamespaceConstraint::Specific(ref ns) => self
|
NamespaceConstraint::Specific(ref ns) => self
|
||||||
|
@ -1479,23 +1480,23 @@ impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_id(&self, _id: &Atom, _case_sensitivity: CaseSensitivity) -> bool {
|
fn has_id(&self, _id: &AtomIdent, _case_sensitivity: CaseSensitivity) -> bool {
|
||||||
debug!("ServoThreadSafeLayoutElement::has_id called");
|
debug!("ServoThreadSafeLayoutElement::has_id called");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_part(&self, _name: &Atom) -> bool {
|
fn is_part(&self, _name: &AtomIdent) -> bool {
|
||||||
debug!("ServoThreadSafeLayoutElement::is_part called");
|
debug!("ServoThreadSafeLayoutElement::is_part called");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn imported_part(&self, _: &Atom) -> Option<Atom> {
|
fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> {
|
||||||
debug!("ServoThreadSafeLayoutElement::imported_part called");
|
debug!("ServoThreadSafeLayoutElement::imported_part called");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_class(&self, _name: &Atom, _case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class(&self, _name: &AtomIdent, _case_sensitivity: CaseSensitivity) -> bool {
|
||||||
debug!("ServoThreadSafeLayoutElement::has_class called");
|
debug!("ServoThreadSafeLayoutElement::has_class called");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
@ -474,6 +474,7 @@ impl LayoutThread {
|
||||||
// but it will be set correctly when the initial reflow takes place.
|
// but it will be set correctly when the initial reflow takes place.
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
window_size.initial_viewport,
|
window_size.initial_viewport,
|
||||||
window_size.device_pixel_ratio,
|
window_size.device_pixel_ratio,
|
||||||
);
|
);
|
||||||
|
@ -952,7 +953,12 @@ impl LayoutThread {
|
||||||
ua_or_user: &ua_or_user_guard,
|
ua_or_user: &ua_or_user_guard,
|
||||||
};
|
};
|
||||||
|
|
||||||
let device = Device::new(MediaType::screen(), initial_viewport, device_pixel_ratio);
|
let device = Device::new(
|
||||||
|
MediaType::screen(),
|
||||||
|
self.stylist.quirks_mode(),
|
||||||
|
initial_viewport,
|
||||||
|
device_pixel_ratio,
|
||||||
|
);
|
||||||
let sheet_origins_affected_by_device_change = self.stylist.set_device(device, &guards);
|
let sheet_origins_affected_by_device_change = self.stylist.set_device(device, &guards);
|
||||||
|
|
||||||
self.stylist
|
self.stylist
|
||||||
|
|
|
@ -31,8 +31,8 @@ accountable-refcell = { version = "0.2.0", optional = true }
|
||||||
app_units = "0.7"
|
app_units = "0.7"
|
||||||
content-security-policy = { version = "0.4.0", features = ["serde"], optional = true }
|
content-security-policy = { version = "0.4.0", features = ["serde"], optional = true }
|
||||||
crossbeam-channel = { version = "0.4", optional = true }
|
crossbeam-channel = { version = "0.4", optional = true }
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
euclid = "0.22"
|
euclid = "0.20"
|
||||||
hashglobe = { path = "../hashglobe" }
|
hashglobe = { path = "../hashglobe" }
|
||||||
hyper = { version = "0.12", optional = true }
|
hyper = { version = "0.12", optional = true }
|
||||||
hyper_serde = { version = "0.11", optional = true }
|
hyper_serde = { version = "0.11", optional = true }
|
||||||
|
|
|
@ -42,7 +42,7 @@ chrono = "0.4"
|
||||||
content-security-policy = { version = "0.4.0", features = ["serde"] }
|
content-security-policy = { version = "0.4.0", features = ["serde"] }
|
||||||
cookie = "0.11"
|
cookie = "0.11"
|
||||||
crossbeam-channel = "0.4"
|
crossbeam-channel = "0.4"
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
data-url = "0.1.0"
|
data-url = "0.1.0"
|
||||||
deny_public_fields = { path = "../deny_public_fields" }
|
deny_public_fields = { path = "../deny_public_fields" }
|
||||||
devtools_traits = { path = "../devtools_traits" }
|
devtools_traits = { path = "../devtools_traits" }
|
||||||
|
|
|
@ -21,6 +21,7 @@ use servo_atoms::Atom;
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use style::attr::{AttrIdentifier, AttrValue};
|
use style::attr::{AttrIdentifier, AttrValue};
|
||||||
|
use style::values::GenericAtomIdent;
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#interface-attr
|
// https://dom.spec.whatwg.org/#interface-attr
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -46,10 +47,10 @@ impl Attr {
|
||||||
Attr {
|
Attr {
|
||||||
node_: Node::new_inherited(document),
|
node_: Node::new_inherited(document),
|
||||||
identifier: AttrIdentifier {
|
identifier: AttrIdentifier {
|
||||||
local_name: local_name,
|
local_name: GenericAtomIdent(local_name),
|
||||||
name: name,
|
name: GenericAtomIdent(name),
|
||||||
namespace: namespace,
|
namespace: GenericAtomIdent(namespace),
|
||||||
prefix: prefix,
|
prefix: prefix.map(GenericAtomIdent),
|
||||||
},
|
},
|
||||||
value: DomRefCell::new(value),
|
value: DomRefCell::new(value),
|
||||||
owner: MutNullableDom::new(owner),
|
owner: MutNullableDom::new(owner),
|
||||||
|
@ -75,17 +76,17 @@ impl Attr {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn name(&self) -> &LocalName {
|
pub fn name(&self) -> &LocalName {
|
||||||
&self.identifier.name
|
&self.identifier.name.0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn namespace(&self) -> &Namespace {
|
pub fn namespace(&self) -> &Namespace {
|
||||||
&self.identifier.namespace
|
&self.identifier.namespace.0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn prefix(&self) -> Option<&Prefix> {
|
pub fn prefix(&self) -> Option<&Prefix> {
|
||||||
self.identifier.prefix.as_ref()
|
Some(&self.identifier.prefix.as_ref()?.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +106,7 @@ impl AttrMethods for Attr {
|
||||||
// https://dom.spec.whatwg.org/#dom-attr-value
|
// https://dom.spec.whatwg.org/#dom-attr-value
|
||||||
fn SetValue(&self, value: DOMString) {
|
fn SetValue(&self, value: DOMString) {
|
||||||
if let Some(owner) = self.owner() {
|
if let Some(owner) = self.owner() {
|
||||||
let value = owner.parse_attribute(&self.identifier.namespace, self.local_name(), value);
|
let value = owner.parse_attribute(self.namespace(), self.local_name(), value);
|
||||||
self.set_value(value, &owner);
|
self.set_value(value, &owner);
|
||||||
} else {
|
} else {
|
||||||
*self.value.borrow_mut() = AttrValue::String(value.into());
|
*self.value.borrow_mut() = AttrValue::String(value.into());
|
||||||
|
@ -115,12 +116,12 @@ impl AttrMethods for Attr {
|
||||||
// https://dom.spec.whatwg.org/#dom-attr-name
|
// https://dom.spec.whatwg.org/#dom-attr-name
|
||||||
fn Name(&self) -> DOMString {
|
fn Name(&self) -> DOMString {
|
||||||
// FIXME(ajeffrey): convert directly from LocalName to DOMString
|
// FIXME(ajeffrey): convert directly from LocalName to DOMString
|
||||||
DOMString::from(&*self.identifier.name)
|
DOMString::from(&**self.name())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#dom-attr-namespaceuri
|
// https://dom.spec.whatwg.org/#dom-attr-namespaceuri
|
||||||
fn GetNamespaceURI(&self) -> Option<DOMString> {
|
fn GetNamespaceURI(&self) -> Option<DOMString> {
|
||||||
match self.identifier.namespace {
|
match *self.namespace() {
|
||||||
ns!() => None,
|
ns!() => None,
|
||||||
ref url => Some(DOMString::from(&**url)),
|
ref url => Some(DOMString::from(&**url)),
|
||||||
}
|
}
|
||||||
|
@ -170,7 +171,7 @@ impl Attr {
|
||||||
assert_eq!(Some(owner), self.owner().as_deref());
|
assert_eq!(Some(owner), self.owner().as_deref());
|
||||||
owner.will_mutate_attr(self);
|
owner.will_mutate_attr(self);
|
||||||
self.swap_value(&mut value);
|
self.swap_value(&mut value);
|
||||||
if self.identifier.namespace == ns!() {
|
if *self.namespace() == ns!() {
|
||||||
vtable_for(owner.upcast())
|
vtable_for(owner.upcast())
|
||||||
.attribute_mutated(self, AttributeMutation::Set(Some(&value)));
|
.attribute_mutated(self, AttributeMutation::Set(Some(&value)));
|
||||||
}
|
}
|
||||||
|
@ -196,7 +197,7 @@ impl Attr {
|
||||||
/// Sets the owner element. Should be called after the attribute is added
|
/// Sets the owner element. Should be called after the attribute is added
|
||||||
/// or removed from its older parent.
|
/// or removed from its older parent.
|
||||||
pub fn set_owner(&self, owner: Option<&Element>) {
|
pub fn set_owner(&self, owner: Option<&Element>) {
|
||||||
let ns = &self.identifier.namespace;
|
let ns = self.namespace();
|
||||||
match (self.owner(), owner) {
|
match (self.owner(), owner) {
|
||||||
(Some(old), None) => {
|
(Some(old), None) => {
|
||||||
// Already gone from the list of attributes of old owner.
|
// Already gone from the list of attributes of old owner.
|
||||||
|
@ -218,7 +219,7 @@ impl Attr {
|
||||||
|
|
||||||
pub fn summarize(&self) -> AttrInfo {
|
pub fn summarize(&self) -> AttrInfo {
|
||||||
AttrInfo {
|
AttrInfo {
|
||||||
namespace: (*self.identifier.namespace).to_owned(),
|
namespace: (**self.namespace()).to_owned(),
|
||||||
name: String::from(self.Name()),
|
name: String::from(self.Name()),
|
||||||
value: String::from(self.Value()),
|
value: String::from(self.Value()),
|
||||||
}
|
}
|
||||||
|
@ -263,11 +264,11 @@ impl<'dom> AttrHelpersForLayout<'dom> for LayoutDom<'dom, Attr> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn local_name(self) -> &'dom LocalName {
|
fn local_name(self) -> &'dom LocalName {
|
||||||
unsafe { &self.unsafe_get().identifier.local_name }
|
unsafe { &self.unsafe_get().identifier.local_name.0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn namespace(self) -> &'dom Namespace {
|
fn namespace(self) -> &'dom Namespace {
|
||||||
unsafe { &self.unsafe_get().identifier.namespace }
|
unsafe { &self.unsafe_get().identifier.namespace.0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ use dom_struct::dom_struct;
|
||||||
use style::context::QuirksMode;
|
use style::context::QuirksMode;
|
||||||
use style::parser::ParserContext;
|
use style::parser::ParserContext;
|
||||||
use style::stylesheets::supports_rule::{parse_condition_or_declaration, Declaration};
|
use style::stylesheets::supports_rule::{parse_condition_or_declaration, Declaration};
|
||||||
use style::stylesheets::CssRuleType;
|
use style::stylesheets::{CssRuleType, Origin};
|
||||||
use style_traits::ParsingMode;
|
use style_traits::ParsingMode;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -39,7 +39,8 @@ impl CSS {
|
||||||
decl.push_str(&value);
|
decl.push_str(&value);
|
||||||
let decl = Declaration(decl);
|
let decl = Declaration(decl);
|
||||||
let url = win.Document().url();
|
let url = win.Document().url();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Style),
|
Some(CssRuleType::Style),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
@ -60,7 +61,8 @@ impl CSS {
|
||||||
};
|
};
|
||||||
|
|
||||||
let url = win.Document().url();
|
let url = win.Document().url();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Style),
|
Some(CssRuleType::Style),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -18,7 +18,7 @@ use servo_arc::Arc;
|
||||||
use style::media_queries::MediaList as StyleMediaList;
|
use style::media_queries::MediaList as StyleMediaList;
|
||||||
use style::parser::ParserContext;
|
use style::parser::ParserContext;
|
||||||
use style::shared_lock::{Locked, ToCssWithGuard};
|
use style::shared_lock::{Locked, ToCssWithGuard};
|
||||||
use style::stylesheets::{CssRuleType, MediaRule};
|
use style::stylesheets::{CssRuleType, MediaRule, Origin};
|
||||||
use style_traits::{ParsingMode, ToCss};
|
use style_traits::{ParsingMode, ToCss};
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -82,7 +82,8 @@ impl CSSMediaRule {
|
||||||
let window = global.as_window();
|
let window = global.as_window();
|
||||||
let url = window.get_url();
|
let url = window.get_url();
|
||||||
let quirks_mode = window.Document().quirks_mode();
|
let quirks_mode = window.Document().quirks_mode();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -63,7 +63,7 @@ impl CSSNamespaceRuleMethods for CSSNamespaceRule {
|
||||||
// https://drafts.csswg.org/cssom/#dom-cssnamespacerule-namespaceuri
|
// https://drafts.csswg.org/cssom/#dom-cssnamespacerule-namespaceuri
|
||||||
fn NamespaceURI(&self) -> DOMString {
|
fn NamespaceURI(&self) -> DOMString {
|
||||||
let guard = self.cssrule.shared_lock().read();
|
let guard = self.cssrule.shared_lock().read();
|
||||||
(*self.namespacerule.read_with(&guard).url).into()
|
(**self.namespacerule.read_with(&guard).url).into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ use style::properties::{
|
||||||
};
|
};
|
||||||
use style::selector_parser::PseudoElement;
|
use style::selector_parser::PseudoElement;
|
||||||
use style::shared_lock::Locked;
|
use style::shared_lock::Locked;
|
||||||
|
use style::stylesheets::{CssRuleType, Origin};
|
||||||
use style_traits::ParsingMode;
|
use style_traits::ParsingMode;
|
||||||
|
|
||||||
// http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
|
// http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
|
||||||
|
@ -302,10 +303,12 @@ impl CSSStyleDeclaration {
|
||||||
&mut declarations,
|
&mut declarations,
|
||||||
id,
|
id,
|
||||||
&value,
|
&value,
|
||||||
|
Origin::Author,
|
||||||
&self.owner.base_url(),
|
&self.owner.base_url(),
|
||||||
window.css_error_reporter(),
|
window.css_error_reporter(),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
quirks_mode,
|
quirks_mode,
|
||||||
|
CssRuleType::Style,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Step 6
|
// Step 6
|
||||||
|
@ -461,6 +464,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
|
||||||
&self.owner.base_url(),
|
&self.owner.base_url(),
|
||||||
window.css_error_reporter(),
|
window.css_error_reporter(),
|
||||||
quirks_mode,
|
quirks_mode,
|
||||||
|
CssRuleType::Style,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ use servo_arc::Arc;
|
||||||
use style::parser::ParserContext;
|
use style::parser::ParserContext;
|
||||||
use style::shared_lock::{Locked, ToCssWithGuard};
|
use style::shared_lock::{Locked, ToCssWithGuard};
|
||||||
use style::stylesheets::supports_rule::SupportsCondition;
|
use style::stylesheets::supports_rule::SupportsCondition;
|
||||||
use style::stylesheets::{CssRuleType, SupportsRule};
|
use style::stylesheets::{CssRuleType, Origin, SupportsRule};
|
||||||
use style_traits::{ParsingMode, ToCss};
|
use style_traits::{ParsingMode, ToCss};
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -71,7 +71,8 @@ impl CSSSupportsRule {
|
||||||
let win = global.as_window();
|
let win = global.as_window();
|
||||||
let url = win.Document().url();
|
let url = win.Document().url();
|
||||||
let quirks_mode = win.Document().quirks_mode();
|
let quirks_mode = win.Document().quirks_mode();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Supports),
|
Some(CssRuleType::Supports),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -3454,7 +3454,12 @@ impl Document {
|
||||||
let window_size = self.window().window_size();
|
let window_size = self.window().window_size();
|
||||||
let viewport_size = window_size.initial_viewport;
|
let viewport_size = window_size.initial_viewport;
|
||||||
let device_pixel_ratio = window_size.device_pixel_ratio;
|
let device_pixel_ratio = window_size.device_pixel_ratio;
|
||||||
Device::new(MediaType::screen(), viewport_size, device_pixel_ratio)
|
Device::new(
|
||||||
|
MediaType::screen(),
|
||||||
|
self.quirks_mode(),
|
||||||
|
viewport_size,
|
||||||
|
device_pixel_ratio,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn salvageable(&self) -> bool {
|
pub fn salvageable(&self) -> bool {
|
||||||
|
@ -3551,8 +3556,9 @@ impl Document {
|
||||||
} else {
|
} else {
|
||||||
snapshot.other_attributes_changed = true;
|
snapshot.other_attributes_changed = true;
|
||||||
}
|
}
|
||||||
if !snapshot.changed_attrs.contains(attr.local_name()) {
|
let local_name = style::LocalName::cast(attr.local_name());
|
||||||
snapshot.changed_attrs.push(attr.local_name().clone());
|
if !snapshot.changed_attrs.contains(local_name) {
|
||||||
|
snapshot.changed_attrs.push(local_name.clone());
|
||||||
}
|
}
|
||||||
if snapshot.attrs.is_none() {
|
if snapshot.attrs.is_none() {
|
||||||
let attrs = el
|
let attrs = el
|
||||||
|
|
|
@ -129,9 +129,10 @@ use style::selector_parser::{
|
||||||
NonTSPseudoClass, PseudoElement, RestyleDamage, SelectorImpl, SelectorParser,
|
NonTSPseudoClass, PseudoElement, RestyleDamage, SelectorImpl, SelectorParser,
|
||||||
};
|
};
|
||||||
use style::shared_lock::{Locked, SharedRwLock};
|
use style::shared_lock::{Locked, SharedRwLock};
|
||||||
|
use style::stylesheets::CssRuleType;
|
||||||
use style::thread_state;
|
use style::thread_state;
|
||||||
use style::values::generics::NonNegative;
|
use style::values::generics::NonNegative;
|
||||||
use style::values::{computed, specified, CSSFloat};
|
use style::values::{computed, specified, AtomIdent, AtomString, CSSFloat};
|
||||||
use style::CaseSensitivityExt;
|
use style::CaseSensitivityExt;
|
||||||
use xml5ever::serialize as xmlSerialize;
|
use xml5ever::serialize as xmlSerialize;
|
||||||
use xml5ever::serialize::SerializeOpts as XmlSerializeOpts;
|
use xml5ever::serialize::SerializeOpts as XmlSerializeOpts;
|
||||||
|
@ -568,7 +569,7 @@ pub fn get_attr_for_layout<'dom>(
|
||||||
|
|
||||||
pub trait LayoutElementHelpers<'dom> {
|
pub trait LayoutElementHelpers<'dom> {
|
||||||
fn attrs(self) -> &'dom [LayoutDom<'dom, Attr>];
|
fn attrs(self) -> &'dom [LayoutDom<'dom, Attr>];
|
||||||
fn has_class_for_layout(self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool;
|
fn has_class_for_layout(self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool;
|
||||||
fn get_classes_for_layout(self) -> Option<&'dom [Atom]>;
|
fn get_classes_for_layout(self) -> Option<&'dom [Atom]>;
|
||||||
|
|
||||||
fn synthesize_presentational_hints_for_legacy_attributes<V>(self, hints: &mut V)
|
fn synthesize_presentational_hints_for_legacy_attributes<V>(self, hints: &mut V)
|
||||||
|
@ -616,7 +617,7 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn has_class_for_layout(self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class_for_layout(self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
get_attr_for_layout(self, &ns!(), &local_name!("class")).map_or(false, |attr| {
|
get_attr_for_layout(self, &ns!(), &local_name!("class")).map_or(false, |attr| {
|
||||||
attr.as_tokens()
|
attr.as_tokens()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -2851,6 +2852,7 @@ impl VirtualMethods for Element {
|
||||||
&doc.base_url(),
|
&doc.base_url(),
|
||||||
win.css_error_reporter(),
|
win.css_error_reporter(),
|
||||||
doc.quirks_mode(),
|
doc.quirks_mode(),
|
||||||
|
CssRuleType::Style,
|
||||||
)))
|
)))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3135,16 +3137,16 @@ impl<'a> SelectorsElement for DomRoot<Element> {
|
||||||
|
|
||||||
fn attr_matches(
|
fn attr_matches(
|
||||||
&self,
|
&self,
|
||||||
ns: &NamespaceConstraint<&Namespace>,
|
ns: &NamespaceConstraint<&style::Namespace>,
|
||||||
local_name: &LocalName,
|
local_name: &style::LocalName,
|
||||||
operation: &AttrSelectorOperation<&String>,
|
operation: &AttrSelectorOperation<&AtomString>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match *ns {
|
match *ns {
|
||||||
NamespaceConstraint::Specific(ref ns) => self
|
NamespaceConstraint::Specific(ref ns) => self
|
||||||
.get_attribute(ns, local_name)
|
.get_attribute(ns, local_name)
|
||||||
.map_or(false, |attr| attr.value().eval_selector(operation)),
|
.map_or(false, |attr| attr.value().eval_selector(operation)),
|
||||||
NamespaceConstraint::Any => self.attrs.borrow().iter().any(|attr| {
|
NamespaceConstraint::Any => self.attrs.borrow().iter().any(|attr| {
|
||||||
attr.local_name() == local_name && attr.value().eval_selector(operation)
|
*attr.local_name() == **local_name && attr.value().eval_selector(operation)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3240,23 +3242,23 @@ impl<'a> SelectorsElement for DomRoot<Element> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_id(&self, id: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_id(&self, id: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
self.id_attribute
|
self.id_attribute
|
||||||
.borrow()
|
.borrow()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_or(false, |atom| case_sensitivity.eq_atom(id, atom))
|
.map_or(false, |atom| case_sensitivity.eq_atom(&*id, atom))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_part(&self, _name: &Atom) -> bool {
|
fn is_part(&self, _name: &AtomIdent) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn imported_part(&self, _: &Atom) -> Option<Atom> {
|
fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_class(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
Element::has_class(&**self, name, case_sensitivity)
|
Element::has_class(&**self, &name, case_sensitivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_html_element_in_html_document(&self) -> bool {
|
fn is_html_element_in_html_document(&self) -> bool {
|
||||||
|
|
|
@ -39,7 +39,7 @@ use style::attr::AttrValue;
|
||||||
use style::media_queries::MediaList;
|
use style::media_queries::MediaList;
|
||||||
use style::parser::ParserContext as CssParserContext;
|
use style::parser::ParserContext as CssParserContext;
|
||||||
use style::str::HTML_SPACE_CHARACTERS;
|
use style::str::HTML_SPACE_CHARACTERS;
|
||||||
use style::stylesheets::{CssRuleType, Stylesheet};
|
use style::stylesheets::{CssRuleType, Origin, Stylesheet};
|
||||||
use style_traits::ParsingMode;
|
use style_traits::ParsingMode;
|
||||||
|
|
||||||
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
|
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
|
||||||
|
@ -310,7 +310,8 @@ impl HTMLLinkElement {
|
||||||
// FIXME(emilio): This looks somewhat fishy, since we use the context
|
// FIXME(emilio): This looks somewhat fishy, since we use the context
|
||||||
// only to parse the media query list, CssRuleType::Media doesn't make
|
// only to parse the media query list, CssRuleType::Media doesn't make
|
||||||
// much sense.
|
// much sense.
|
||||||
let context = CssParserContext::new_for_cssom(
|
let context = CssParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&doc_url,
|
&doc_url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -96,7 +96,8 @@ impl HTMLStyleElement {
|
||||||
.expect("Element.textContent must be a string");
|
.expect("Element.textContent must be a string");
|
||||||
let url = window.get_url();
|
let url = window.get_url();
|
||||||
let css_error_reporter = window.css_error_reporter();
|
let css_error_reporter = window.css_error_reporter();
|
||||||
let context = CssParserContext::new_for_cssom(
|
let context = CssParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -16,7 +16,7 @@ use style::media_queries::MediaList as StyleMediaList;
|
||||||
use style::media_queries::MediaQuery;
|
use style::media_queries::MediaQuery;
|
||||||
use style::parser::ParserContext;
|
use style::parser::ParserContext;
|
||||||
use style::shared_lock::{Locked, SharedRwLock};
|
use style::shared_lock::{Locked, SharedRwLock};
|
||||||
use style::stylesheets::CssRuleType;
|
use style::stylesheets::{CssRuleType, Origin};
|
||||||
use style_traits::{ParsingMode, ToCss};
|
use style_traits::{ParsingMode, ToCss};
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -81,7 +81,8 @@ impl MediaListMethods for MediaList {
|
||||||
let window = global.as_window();
|
let window = global.as_window();
|
||||||
let url = window.get_url();
|
let url = window.get_url();
|
||||||
let quirks_mode = window.Document().quirks_mode();
|
let quirks_mode = window.Document().quirks_mode();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
@ -122,7 +123,8 @@ impl MediaListMethods for MediaList {
|
||||||
let win = global.as_window();
|
let win = global.as_window();
|
||||||
let url = win.get_url();
|
let url = win.get_url();
|
||||||
let quirks_mode = win.Document().quirks_mode();
|
let quirks_mode = win.Document().quirks_mode();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
@ -159,7 +161,8 @@ impl MediaListMethods for MediaList {
|
||||||
let win = global.as_window();
|
let win = global.as_window();
|
||||||
let url = win.get_url();
|
let url = win.get_url();
|
||||||
let quirks_mode = win.Document().quirks_mode();
|
let quirks_mode = win.Document().quirks_mode();
|
||||||
let context = ParserContext::new_for_cssom(
|
let context = ParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -142,7 +142,7 @@ use style::properties::style_structs::Font;
|
||||||
use style::properties::{PropertyId, ShorthandId};
|
use style::properties::{PropertyId, ShorthandId};
|
||||||
use style::selector_parser::PseudoElement;
|
use style::selector_parser::PseudoElement;
|
||||||
use style::str::HTML_SPACE_CHARACTERS;
|
use style::str::HTML_SPACE_CHARACTERS;
|
||||||
use style::stylesheets::CssRuleType;
|
use style::stylesheets::{CssRuleType, Origin};
|
||||||
use style_traits::{CSSPixel, DevicePixel, ParsingMode};
|
use style_traits::{CSSPixel, DevicePixel, ParsingMode};
|
||||||
use url::Position;
|
use url::Position;
|
||||||
use webrender_api::units::{DeviceIntPoint, DeviceIntSize, LayoutPixel};
|
use webrender_api::units::{DeviceIntPoint, DeviceIntSize, LayoutPixel};
|
||||||
|
@ -1307,7 +1307,8 @@ impl WindowMethods for Window {
|
||||||
let mut parser = Parser::new(&mut input);
|
let mut parser = Parser::new(&mut input);
|
||||||
let url = self.get_url();
|
let url = self.get_url();
|
||||||
let quirks_mode = self.Document().quirks_mode();
|
let quirks_mode = self.Document().quirks_mode();
|
||||||
let context = CssParserContext::new_for_cssom(
|
let context = CssParserContext::new(
|
||||||
|
Origin::Author,
|
||||||
&url,
|
&url,
|
||||||
Some(CssRuleType::Media),
|
Some(CssRuleType::Media),
|
||||||
ParsingMode::DEFAULT,
|
ParsingMode::DEFAULT,
|
||||||
|
|
|
@ -19,7 +19,7 @@ bench = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.0"
|
bitflags = "1.0"
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
derive_more = "0.99"
|
derive_more = "0.99"
|
||||||
fxhash = "0.2"
|
fxhash = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
|
@ -908,12 +908,7 @@ where
|
||||||
let index = if let Some(i) = cache.as_mut().and_then(|c| c.lookup(element.opaque())) {
|
let index = if let Some(i) = cache.as_mut().and_then(|c| c.lookup(element.opaque())) {
|
||||||
i
|
i
|
||||||
} else {
|
} else {
|
||||||
let i = nth_child_index(
|
let i = nth_child_index(element, is_of_type, is_from_end, cache.as_deref_mut());
|
||||||
element,
|
|
||||||
is_of_type,
|
|
||||||
is_from_end,
|
|
||||||
cache.as_deref_mut(),
|
|
||||||
);
|
|
||||||
if let Some(c) = cache.as_mut() {
|
if let Some(c) = cache.as_mut() {
|
||||||
c.insert(element.opaque(), i)
|
c.insert(element.opaque(), i)
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,7 +353,12 @@ impl<Impl: SelectorImpl> SelectorList<Impl> {
|
||||||
where
|
where
|
||||||
P: Parser<'i, Impl = Impl>,
|
P: Parser<'i, Impl = Impl>,
|
||||||
{
|
{
|
||||||
Self::parse_with_state(parser, input, SelectorParsingState::empty(), ParseErrorRecovery::DiscardList)
|
Self::parse_with_state(
|
||||||
|
parser,
|
||||||
|
input,
|
||||||
|
SelectorParsingState::empty(),
|
||||||
|
ParseErrorRecovery::DiscardList,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -387,7 +392,7 @@ impl<Impl: SelectorImpl> SelectorList<Impl> {
|
||||||
Ok(&Token::Comma) => break,
|
Ok(&Token::Comma) => break,
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
debug_assert!(!was_ok, "Shouldn't have got a selector if getting here");
|
debug_assert!(!was_ok, "Shouldn't have got a selector if getting here");
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -490,7 +495,9 @@ where
|
||||||
// :where and :is OR their selectors, so we can't put any hash
|
// :where and :is OR their selectors, so we can't put any hash
|
||||||
// in the filter if there's more than one selector, as that'd
|
// in the filter if there's more than one selector, as that'd
|
||||||
// exclude elements that may match one of the other selectors.
|
// exclude elements that may match one of the other selectors.
|
||||||
if list.len() == 1 && !collect_ancestor_hashes(list[0].iter(), quirks_mode, hashes, len) {
|
if list.len() == 1 &&
|
||||||
|
!collect_ancestor_hashes(list[0].iter(), quirks_mode, hashes, len)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -1106,13 +1113,11 @@ impl<Impl: SelectorImpl> Component<Impl> {
|
||||||
Component::NonTSPseudoClass(..) => true,
|
Component::NonTSPseudoClass(..) => true,
|
||||||
Component::Negation(ref selectors) |
|
Component::Negation(ref selectors) |
|
||||||
Component::Is(ref selectors) |
|
Component::Is(ref selectors) |
|
||||||
Component::Where(ref selectors) => {
|
Component::Where(ref selectors) => selectors.iter().all(|selector| {
|
||||||
selectors.iter().all(|selector| {
|
selector
|
||||||
selector
|
.iter_raw_match_order()
|
||||||
.iter_raw_match_order()
|
.all(|c| c.maybe_allowed_after_pseudo_element())
|
||||||
.all(|c| c.maybe_allowed_after_pseudo_element())
|
}),
|
||||||
})
|
|
||||||
},
|
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1130,13 +1135,11 @@ impl<Impl: SelectorImpl> Component<Impl> {
|
||||||
*self
|
*self
|
||||||
);
|
);
|
||||||
match *self {
|
match *self {
|
||||||
Component::Negation(ref selectors) => {
|
Component::Negation(ref selectors) => !selectors.iter().all(|selector| {
|
||||||
!selectors.iter().all(|selector| {
|
selector
|
||||||
selector
|
.iter_raw_match_order()
|
||||||
.iter_raw_match_order()
|
.all(|c| c.matches_for_stateless_pseudo_element())
|
||||||
.all(|c| c.matches_for_stateless_pseudo_element())
|
}),
|
||||||
})
|
|
||||||
},
|
|
||||||
Component::Is(ref selectors) | Component::Where(ref selectors) => {
|
Component::Is(ref selectors) | Component::Where(ref selectors) => {
|
||||||
selectors.iter().any(|selector| {
|
selectors.iter().any(|selector| {
|
||||||
selector
|
selector
|
||||||
|
@ -2114,8 +2117,10 @@ where
|
||||||
let list = SelectorList::parse_with_state(
|
let list = SelectorList::parse_with_state(
|
||||||
parser,
|
parser,
|
||||||
input,
|
input,
|
||||||
state | SelectorParsingState::SKIP_DEFAULT_NAMESPACE | SelectorParsingState::DISALLOW_PSEUDOS,
|
state |
|
||||||
ParseErrorRecovery::DiscardList
|
SelectorParsingState::SKIP_DEFAULT_NAMESPACE |
|
||||||
|
SelectorParsingState::DISALLOW_PSEUDOS,
|
||||||
|
ParseErrorRecovery::DiscardList,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(Component::Negation(list.0.into_vec().into_boxed_slice()))
|
Ok(Component::Negation(list.0.into_vec().into_boxed_slice()))
|
||||||
|
@ -2179,8 +2184,8 @@ where
|
||||||
//
|
//
|
||||||
// (Similar quotes for :where() / :not())
|
// (Similar quotes for :where() / :not())
|
||||||
//
|
//
|
||||||
let ignore_default_ns =
|
let ignore_default_ns = state
|
||||||
state.intersects(SelectorParsingState::SKIP_DEFAULT_NAMESPACE) ||
|
.intersects(SelectorParsingState::SKIP_DEFAULT_NAMESPACE) ||
|
||||||
matches!(
|
matches!(
|
||||||
result,
|
result,
|
||||||
SimpleSelectorParseResult::SimpleSelector(Component::Host(..))
|
SimpleSelectorParseResult::SimpleSelector(Component::Host(..))
|
||||||
|
@ -2239,7 +2244,9 @@ where
|
||||||
let inner = SelectorList::parse_with_state(
|
let inner = SelectorList::parse_with_state(
|
||||||
parser,
|
parser,
|
||||||
input,
|
input,
|
||||||
state | SelectorParsingState::SKIP_DEFAULT_NAMESPACE | SelectorParsingState::DISALLOW_PSEUDOS,
|
state |
|
||||||
|
SelectorParsingState::SKIP_DEFAULT_NAMESPACE |
|
||||||
|
SelectorParsingState::DISALLOW_PSEUDOS,
|
||||||
parser.is_and_where_error_recovery(),
|
parser.is_and_where_error_recovery(),
|
||||||
)?;
|
)?;
|
||||||
Ok(component(inner.0.into_vec().into_boxed_slice()))
|
Ok(component(inner.0.into_vec().into_boxed_slice()))
|
||||||
|
@ -3038,13 +3045,12 @@ pub mod tests {
|
||||||
vec![
|
vec![
|
||||||
Component::DefaultNamespace(MATHML.into()),
|
Component::DefaultNamespace(MATHML.into()),
|
||||||
Component::Negation(
|
Component::Negation(
|
||||||
vec![
|
vec![Selector::from_vec(
|
||||||
Selector::from_vec(
|
vec![Component::Class(DummyAtom::from("cl"))],
|
||||||
vec![Component::Class(DummyAtom::from("cl"))],
|
specificity(0, 1, 0),
|
||||||
specificity(0, 1, 0),
|
Default::default(),
|
||||||
Default::default(),
|
)]
|
||||||
)
|
.into_boxed_slice()
|
||||||
].into_boxed_slice()
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
specificity(0, 1, 0),
|
specificity(0, 1, 0),
|
||||||
|
@ -3057,16 +3063,14 @@ pub mod tests {
|
||||||
vec![
|
vec![
|
||||||
Component::DefaultNamespace(MATHML.into()),
|
Component::DefaultNamespace(MATHML.into()),
|
||||||
Component::Negation(
|
Component::Negation(
|
||||||
vec![
|
vec![Selector::from_vec(
|
||||||
Selector::from_vec(
|
vec![
|
||||||
vec![
|
Component::DefaultNamespace(MATHML.into()),
|
||||||
Component::DefaultNamespace(MATHML.into()),
|
Component::ExplicitUniversalType,
|
||||||
Component::ExplicitUniversalType,
|
],
|
||||||
],
|
specificity(0, 0, 0),
|
||||||
specificity(0, 0, 0),
|
Default::default(),
|
||||||
Default::default(),
|
)]
|
||||||
)
|
|
||||||
]
|
|
||||||
.into_boxed_slice(),
|
.into_boxed_slice(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -3080,19 +3084,17 @@ pub mod tests {
|
||||||
vec![
|
vec![
|
||||||
Component::DefaultNamespace(MATHML.into()),
|
Component::DefaultNamespace(MATHML.into()),
|
||||||
Component::Negation(
|
Component::Negation(
|
||||||
vec![
|
vec![Selector::from_vec(
|
||||||
Selector::from_vec(
|
vec![
|
||||||
vec![
|
Component::DefaultNamespace(MATHML.into()),
|
||||||
Component::DefaultNamespace(MATHML.into()),
|
Component::LocalName(LocalName {
|
||||||
Component::LocalName(LocalName {
|
name: DummyAtom::from("e"),
|
||||||
name: DummyAtom::from("e"),
|
lower_name: DummyAtom::from("e"),
|
||||||
lower_name: DummyAtom::from("e"),
|
}),
|
||||||
}),
|
],
|
||||||
],
|
specificity(0, 0, 1),
|
||||||
specificity(0, 0, 1),
|
Default::default(),
|
||||||
Default::default(),
|
),]
|
||||||
),
|
|
||||||
]
|
|
||||||
.into_boxed_slice()
|
.into_boxed_slice()
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -3196,15 +3198,12 @@ pub mod tests {
|
||||||
parse_ns(":not(*)", &parser),
|
parse_ns(":not(*)", &parser),
|
||||||
Ok(SelectorList::from_vec(vec![Selector::from_vec(
|
Ok(SelectorList::from_vec(vec![Selector::from_vec(
|
||||||
vec![Component::Negation(
|
vec![Component::Negation(
|
||||||
vec![
|
vec![Selector::from_vec(
|
||||||
Selector::from_vec(
|
vec![Component::ExplicitUniversalType],
|
||||||
vec![
|
specificity(0, 0, 0),
|
||||||
Component::ExplicitUniversalType
|
Default::default(),
|
||||||
],
|
)]
|
||||||
specificity(0, 0, 0),
|
.into_boxed_slice()
|
||||||
Default::default(),
|
|
||||||
)
|
|
||||||
].into_boxed_slice()
|
|
||||||
)],
|
)],
|
||||||
specificity(0, 0, 0),
|
specificity(0, 0, 0),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
|
@ -3214,16 +3213,14 @@ pub mod tests {
|
||||||
parse_ns(":not(|*)", &parser),
|
parse_ns(":not(|*)", &parser),
|
||||||
Ok(SelectorList::from_vec(vec![Selector::from_vec(
|
Ok(SelectorList::from_vec(vec![Selector::from_vec(
|
||||||
vec![Component::Negation(
|
vec![Component::Negation(
|
||||||
vec![
|
vec![Selector::from_vec(
|
||||||
Selector::from_vec(
|
vec![
|
||||||
vec![
|
Component::ExplicitNoNamespace,
|
||||||
Component::ExplicitNoNamespace,
|
Component::ExplicitUniversalType,
|
||||||
Component::ExplicitUniversalType,
|
],
|
||||||
],
|
specificity(0, 0, 0),
|
||||||
specificity(0, 0, 0),
|
Default::default(),
|
||||||
Default::default(),
|
)]
|
||||||
)
|
|
||||||
]
|
|
||||||
.into_boxed_slice(),
|
.into_boxed_slice(),
|
||||||
)],
|
)],
|
||||||
specificity(0, 0, 0),
|
specificity(0, 0, 0),
|
||||||
|
@ -3236,15 +3233,12 @@ pub mod tests {
|
||||||
parse_ns_expected(":not(*|*)", &parser, Some(":not(*)")),
|
parse_ns_expected(":not(*|*)", &parser, Some(":not(*)")),
|
||||||
Ok(SelectorList::from_vec(vec![Selector::from_vec(
|
Ok(SelectorList::from_vec(vec![Selector::from_vec(
|
||||||
vec![Component::Negation(
|
vec![Component::Negation(
|
||||||
vec![
|
vec![Selector::from_vec(
|
||||||
Selector::from_vec(
|
vec![Component::ExplicitUniversalType],
|
||||||
vec![
|
specificity(0, 0, 0),
|
||||||
Component::ExplicitUniversalType
|
Default::default()
|
||||||
],
|
)]
|
||||||
specificity(0, 0, 0),
|
.into_boxed_slice()
|
||||||
Default::default()
|
|
||||||
)
|
|
||||||
].into_boxed_slice()
|
|
||||||
)],
|
)],
|
||||||
specificity(0, 0, 0),
|
specificity(0, 0, 0),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
|
|
|
@ -12,6 +12,7 @@ use crate::str::str_join;
|
||||||
use crate::str::{read_exponent, read_fraction, HTML_SPACE_CHARACTERS};
|
use crate::str::{read_exponent, read_fraction, HTML_SPACE_CHARACTERS};
|
||||||
use crate::str::{read_numbers, split_commas, split_html_space_chars};
|
use crate::str::{read_numbers, split_commas, split_html_space_chars};
|
||||||
use crate::values::specified::Length;
|
use crate::values::specified::Length;
|
||||||
|
use crate::values::AtomString;
|
||||||
use crate::{Atom, LocalName, Namespace, Prefix};
|
use crate::{Atom, LocalName, Namespace, Prefix};
|
||||||
use app_units::Au;
|
use app_units::Au;
|
||||||
use cssparser::{self, Color, RGBA};
|
use cssparser::{self, Color, RGBA};
|
||||||
|
@ -354,7 +355,7 @@ impl AttrValue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn eval_selector(&self, selector: &AttrSelectorOperation<&String>) -> bool {
|
pub fn eval_selector(&self, selector: &AttrSelectorOperation<&AtomString>) -> bool {
|
||||||
// FIXME(SimonSapin) this can be more efficient by matching on `(self, selector)` variants
|
// FIXME(SimonSapin) this can be more efficient by matching on `(self, selector)` variants
|
||||||
// and doing Atom comparisons instead of string comparisons where possible,
|
// and doing Atom comparisons instead of string comparisons where possible,
|
||||||
// with SelectorImpl::AttrValue changed to Atom.
|
// with SelectorImpl::AttrValue changed to Atom.
|
||||||
|
|
|
@ -16,7 +16,6 @@ use selectors::matching::{self, MatchingContext, MatchingMode};
|
||||||
use selectors::parser::{Combinator, Component, LocalName, SelectorImpl};
|
use selectors::parser::{Combinator, Component, LocalName, SelectorImpl};
|
||||||
use selectors::{Element, NthIndexCache, SelectorList};
|
use selectors::{Element, NthIndexCache, SelectorList};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::borrow::Borrow;
|
|
||||||
|
|
||||||
/// <https://dom.spec.whatwg.org/#dom-element-matches>
|
/// <https://dom.spec.whatwg.org/#dom-element-matches>
|
||||||
pub fn element_matches<E>(
|
pub fn element_matches<E>(
|
||||||
|
@ -354,11 +353,14 @@ where
|
||||||
ref name,
|
ref name,
|
||||||
ref lower_name,
|
ref lower_name,
|
||||||
} = *local_name;
|
} = *local_name;
|
||||||
if element.is_html_element_in_html_document() {
|
|
||||||
element.local_name() == lower_name.borrow()
|
let chosen_name = if element.is_html_element_in_html_document() {
|
||||||
|
lower_name
|
||||||
} else {
|
} else {
|
||||||
element.local_name() == name.borrow()
|
name
|
||||||
}
|
};
|
||||||
|
|
||||||
|
element.local_name() == &**chosen_name
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fast paths for querySelector with a single simple selector.
|
/// Fast paths for querySelector with a single simple selector.
|
||||||
|
|
|
@ -128,7 +128,7 @@ bitflags! {
|
||||||
/// https://html.spec.whatwg.org/multipage/#centered-alignment
|
/// https://html.spec.whatwg.org/multipage/#centered-alignment
|
||||||
const IN_MODAL_DIALOG_STATE = 1 << 53;
|
const IN_MODAL_DIALOG_STATE = 1 << 53;
|
||||||
|
|
||||||
/// https://html.spec.whatwg.org/multipage/interaction.html#inert-subtrees
|
/// https://html.spec.whatwg.org/multipage/#inert-subtrees
|
||||||
const IN_MOZINERT_STATE = 1 << 54;
|
const IN_MOZINERT_STATE = 1 << 54;
|
||||||
/// State for the topmost dialog element in top layer
|
/// State for the topmost dialog element in top layer
|
||||||
const IN_TOPMOST_MODAL_DIALOG_STATE = 1 << 55;
|
const IN_TOPMOST_MODAL_DIALOG_STATE = 1 << 55;
|
||||||
|
|
|
@ -307,7 +307,7 @@ fn eval_prefers_reduced_motion(device: &Device, query_value: Option<PrefersReduc
|
||||||
|
|
||||||
/// Possible values for prefers-contrast media query.
|
/// Possible values for prefers-contrast media query.
|
||||||
/// https://drafts.csswg.org/mediaqueries-5/#prefers-contrast
|
/// https://drafts.csswg.org/mediaqueries-5/#prefers-contrast
|
||||||
#[derive(Clone, Copy, Debug, FromPrimitive, PartialEq, Parse, ToCss)]
|
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, PartialEq, ToCss)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum PrefersContrast {
|
pub enum PrefersContrast {
|
||||||
/// More contrast is preferred. Corresponds to an accessibility theme
|
/// More contrast is preferred. Corresponds to an accessibility theme
|
||||||
|
@ -331,7 +331,7 @@ fn eval_prefers_contrast(device: &Device, query_value: Option<PrefersContrast>)
|
||||||
|
|
||||||
/// Possible values for the forced-colors media query.
|
/// Possible values for the forced-colors media query.
|
||||||
/// https://drafts.csswg.org/mediaqueries-5/#forced-colors
|
/// https://drafts.csswg.org/mediaqueries-5/#forced-colors
|
||||||
#[derive(Clone, Copy, Debug, FromPrimitive, PartialEq, Parse, ToCss)]
|
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, PartialEq, ToCss)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum ForcedColors {
|
pub enum ForcedColors {
|
||||||
/// Page colors are not being forced.
|
/// Page colors are not being forced.
|
||||||
|
|
|
@ -147,6 +147,13 @@ impl PartialEq for WeakAtom {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq<Atom> for WeakAtom {
|
||||||
|
#[inline]
|
||||||
|
fn eq(&self, other: &Atom) -> bool {
|
||||||
|
self == &**other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsafe impl Send for Atom {}
|
unsafe impl Send for Atom {}
|
||||||
unsafe impl Sync for Atom {}
|
unsafe impl Sync for Atom {}
|
||||||
unsafe impl Sync for WeakAtom {}
|
unsafe impl Sync for WeakAtom {}
|
||||||
|
|
|
@ -47,7 +47,7 @@ impl PrecomputedHash for Namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A Gecko WeakNamespace is a wrapped WeakAtom.
|
/// A Gecko WeakNamespace is a wrapped WeakAtom.
|
||||||
#[derive(Hash, Deref)]
|
#[derive(Deref, Hash)]
|
||||||
pub struct WeakNamespace(WeakAtom);
|
pub struct WeakNamespace(WeakAtom);
|
||||||
|
|
||||||
impl Deref for Namespace {
|
impl Deref for Namespace {
|
||||||
|
|
|
@ -66,7 +66,7 @@ impl Invalidation {
|
||||||
|
|
||||||
/// Whether we should invalidate just the element, or the whole subtree within
|
/// Whether we should invalidate just the element, or the whole subtree within
|
||||||
/// it.
|
/// it.
|
||||||
#[derive(Copy, Clone, Debug, Eq, MallocSizeOf, Ord, PartialEq, PartialOrd)]
|
#[derive(Clone, Copy, Debug, Eq, MallocSizeOf, Ord, PartialEq, PartialOrd)]
|
||||||
enum InvalidationKind {
|
enum InvalidationKind {
|
||||||
None = 0,
|
None = 0,
|
||||||
Element,
|
Element,
|
||||||
|
|
|
@ -138,15 +138,19 @@ pub type LocalName = crate::values::AtomIdent;
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
pub use crate::gecko_string_cache::Namespace;
|
pub use crate::gecko_string_cache::Namespace;
|
||||||
|
|
||||||
#[cfg(feature = "servo")]
|
|
||||||
pub use html5ever::LocalName;
|
|
||||||
#[cfg(feature = "servo")]
|
|
||||||
pub use html5ever::Namespace;
|
|
||||||
#[cfg(feature = "servo")]
|
|
||||||
pub use html5ever::Prefix;
|
|
||||||
#[cfg(feature = "servo")]
|
#[cfg(feature = "servo")]
|
||||||
pub use servo_atoms::Atom;
|
pub use servo_atoms::Atom;
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
pub type LocalName = crate::values::GenericAtomIdent<html5ever::LocalNameStaticSet>;
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
pub type Namespace = crate::values::GenericAtomIdent<html5ever::NamespaceStaticSet>;
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
pub type Prefix = crate::values::GenericAtomIdent<html5ever::PrefixStaticSet>;
|
||||||
|
|
||||||
pub use style_traits::arc_slice::ArcSlice;
|
pub use style_traits::arc_slice::ArcSlice;
|
||||||
pub use style_traits::owned_slice::OwnedSlice;
|
pub use style_traits::owned_slice::OwnedSlice;
|
||||||
pub use style_traits::owned_str::OwnedStr;
|
pub use style_traits::owned_str::OwnedStr;
|
||||||
|
|
|
@ -134,6 +134,23 @@ macro_rules! profiler_label {
|
||||||
($label_type:ident) => {};
|
($label_type:ident) => {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
macro_rules! local_name {
|
||||||
|
($s:tt) => {
|
||||||
|
$crate::values::GenericAtomIdent(html5ever::local_name!($s))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
macro_rules! ns {
|
||||||
|
() => {
|
||||||
|
$crate::values::GenericAtomIdent(html5ever::ns!())
|
||||||
|
};
|
||||||
|
($s:tt) => {
|
||||||
|
$crate::values::GenericAtomIdent(html5ever::ns!($s))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
macro_rules! local_name {
|
macro_rules! local_name {
|
||||||
($s:tt) => {
|
($s:tt) => {
|
||||||
|
|
|
@ -111,7 +111,7 @@ def main():
|
||||||
p.name: {"pref": getattr(p, pref_attr)}
|
p.name: {"pref": getattr(p, pref_attr)}
|
||||||
for prop in properties_list
|
for prop in properties_list
|
||||||
if prop.enabled_in_content()
|
if prop.enabled_in_content()
|
||||||
for p in [prop] + prop.alias
|
for p in [prop] + prop.aliases
|
||||||
}
|
}
|
||||||
for kind, properties_list in [
|
for kind, properties_list in [
|
||||||
("longhands", properties.longhands),
|
("longhands", properties.longhands),
|
||||||
|
|
|
@ -948,7 +948,8 @@
|
||||||
input.parse_entirely(|input| parse_value(context, input)).map(|longhands| {
|
input.parse_entirely(|input| parse_value(context, input)).map(|longhands| {
|
||||||
% for sub_property in shorthand.sub_properties:
|
% for sub_property in shorthand.sub_properties:
|
||||||
% if sub_property.may_be_disabled_in(shorthand, engine):
|
% if sub_property.may_be_disabled_in(shorthand, engine):
|
||||||
if NonCustomPropertyId::from(LonghandId::${sub_property.camel_case}).allowed_in_ignoring_rule_type(context) {
|
if NonCustomPropertyId::from(LonghandId::${sub_property.camel_case})
|
||||||
|
.allowed_in_ignoring_rule_type(context) {
|
||||||
% endif
|
% endif
|
||||||
declarations.push(PropertyDeclaration::${sub_property.camel_case}(
|
declarations.push(PropertyDeclaration::${sub_property.camel_case}(
|
||||||
longhands.${sub_property.ident}
|
longhands.${sub_property.ident}
|
||||||
|
@ -984,7 +985,10 @@
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<Longhands, ParseError<'i>> {
|
) -> Result<Longhands, ParseError<'i>> {
|
||||||
let parse_one = |c: &ParserContext, input: &mut Parser<'i, 't>| -> Result<crate::properties::longhands::${to_rust_ident(first_property)}::SpecifiedValue, ParseError<'i>> {
|
let parse_one = |c: &ParserContext, input: &mut Parser<'i, 't>| -> Result<
|
||||||
|
crate::properties::longhands::${to_rust_ident(first_property)}::SpecifiedValue,
|
||||||
|
ParseError<'i>
|
||||||
|
> {
|
||||||
${parser_function}(c, input)
|
${parser_function}(c, input)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1028,7 +1032,10 @@
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<Longhands, ParseError<'i>> {
|
) -> Result<Longhands, ParseError<'i>> {
|
||||||
let rect = Rect::parse_with(context, input, |c, i| -> Result<crate::properties::longhands::${to_rust_ident(sub_property_pattern % "top")}::SpecifiedValue, ParseError<'i>> {
|
let rect = Rect::parse_with(context, input, |c, i| -> Result<
|
||||||
|
crate::properties::longhands::${to_rust_ident(sub_property_pattern % "top")}::SpecifiedValue,
|
||||||
|
ParseError<'i>
|
||||||
|
> {
|
||||||
% if allow_quirks != "No":
|
% if allow_quirks != "No":
|
||||||
${parser_function}_quirky(c, i, specified::AllowQuirks::${allow_quirks})
|
${parser_function}_quirky(c, i, specified::AllowQuirks::${allow_quirks})
|
||||||
% else:
|
% else:
|
||||||
|
|
|
@ -37,7 +37,7 @@ ${helpers.single_keyword(
|
||||||
gecko_enum_prefix="StyleInert",
|
gecko_enum_prefix="StyleInert",
|
||||||
animation_value_type="discrete",
|
animation_value_type="discrete",
|
||||||
enabled_in="ua",
|
enabled_in="ua",
|
||||||
spec="Nonstandard (https://html.spec.whatwg.org/multipage/interaction.html#inert-subtrees)",
|
spec="Nonstandard (https://html.spec.whatwg.org/multipage/#inert-subtrees)",
|
||||||
)}
|
)}
|
||||||
|
|
||||||
${helpers.single_keyword(
|
${helpers.single_keyword(
|
||||||
|
|
|
@ -60,6 +60,7 @@ ${helpers.predefined_type(
|
||||||
initial_specified_value="specified::Image::None",
|
initial_specified_value="specified::Image::None",
|
||||||
animation_value_type="discrete",
|
animation_value_type="discrete",
|
||||||
spec="https://drafts.csswg.org/css-lists/#propdef-list-style-image",
|
spec="https://drafts.csswg.org/css-lists/#propdef-list-style-image",
|
||||||
|
boxed=engine == "servo-2013",
|
||||||
servo_restyle_damage="rebuild_and_reflow",
|
servo_restyle_damage="rebuild_and_reflow",
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,8 @@ pub use self::cascade::*;
|
||||||
|
|
||||||
<%!
|
<%!
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from data import Method, PropertyRestrictions, Keyword, to_rust_ident, to_camel_case, RULE_VALUES, SYSTEM_FONT_LONGHANDS
|
from data import Method, PropertyRestrictions, Keyword, to_rust_ident, \
|
||||||
|
to_camel_case, RULE_VALUES, SYSTEM_FONT_LONGHANDS
|
||||||
import os.path
|
import os.path
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
@ -1199,7 +1200,10 @@ impl LonghandId {
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<PropertyDeclaration, ParseError<'i>> {
|
) -> Result<PropertyDeclaration, ParseError<'i>> {
|
||||||
type ParsePropertyFn = for<'i, 't> fn(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<PropertyDeclaration, ParseError<'i>>;
|
type ParsePropertyFn = for<'i, 't> fn(
|
||||||
|
context: &ParserContext,
|
||||||
|
input: &mut Parser<'i, 't>,
|
||||||
|
) -> Result<PropertyDeclaration, ParseError<'i>>;
|
||||||
static PARSE_PROPERTY: [ParsePropertyFn; ${len(data.longhands)}] = [
|
static PARSE_PROPERTY: [ParsePropertyFn; ${len(data.longhands)}] = [
|
||||||
% for property in data.longhands:
|
% for property in data.longhands:
|
||||||
longhands::${property.ident}::parse_declared,
|
longhands::${property.ident}::parse_declared,
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
//! Servo's media-query device and expression representation.
|
//! Servo's media-query device and expression representation.
|
||||||
|
|
||||||
|
use crate::context::QuirksMode;
|
||||||
use crate::custom_properties::CssEnvironment;
|
use crate::custom_properties::CssEnvironment;
|
||||||
use crate::media_queries::media_feature::{AllowsRanges, ParsingRequirements};
|
use crate::media_queries::media_feature::{AllowsRanges, ParsingRequirements};
|
||||||
use crate::media_queries::media_feature::{Evaluator, MediaFeatureDescription};
|
use crate::media_queries::media_feature::{Evaluator, MediaFeatureDescription};
|
||||||
|
@ -33,6 +34,9 @@ pub struct Device {
|
||||||
viewport_size: Size2D<f32, CSSPixel>,
|
viewport_size: Size2D<f32, CSSPixel>,
|
||||||
/// The current device pixel ratio, from CSS pixels to device pixels.
|
/// The current device pixel ratio, from CSS pixels to device pixels.
|
||||||
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
|
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
|
||||||
|
/// The current quirks mode.
|
||||||
|
#[ignore_malloc_size_of = "Pure stack type"]
|
||||||
|
quirks_mode: QuirksMode,
|
||||||
|
|
||||||
/// The font size of the root element
|
/// The font size of the root element
|
||||||
/// This is set when computing the style of the root
|
/// This is set when computing the style of the root
|
||||||
|
@ -60,6 +64,7 @@ impl Device {
|
||||||
/// Trivially construct a new `Device`.
|
/// Trivially construct a new `Device`.
|
||||||
pub fn new(
|
pub fn new(
|
||||||
media_type: MediaType,
|
media_type: MediaType,
|
||||||
|
quirks_mode: QuirksMode,
|
||||||
viewport_size: Size2D<f32, CSSPixel>,
|
viewport_size: Size2D<f32, CSSPixel>,
|
||||||
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
|
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
|
||||||
) -> Device {
|
) -> Device {
|
||||||
|
@ -67,6 +72,7 @@ impl Device {
|
||||||
media_type,
|
media_type,
|
||||||
viewport_size,
|
viewport_size,
|
||||||
device_pixel_ratio,
|
device_pixel_ratio,
|
||||||
|
quirks_mode,
|
||||||
// FIXME(bz): Seems dubious?
|
// FIXME(bz): Seems dubious?
|
||||||
root_font_size: AtomicU32::new(FONT_MEDIUM_PX.to_bits()),
|
root_font_size: AtomicU32::new(FONT_MEDIUM_PX.to_bits()),
|
||||||
used_root_font_size: AtomicBool::new(false),
|
used_root_font_size: AtomicBool::new(false),
|
||||||
|
@ -101,6 +107,11 @@ impl Device {
|
||||||
.store(size.px().to_bits(), Ordering::Relaxed)
|
.store(size.px().to_bits(), Ordering::Relaxed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the quirks mode of the current device.
|
||||||
|
pub fn quirks_mode(&self) -> QuirksMode {
|
||||||
|
self.quirks_mode
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the body text color for the "inherit color from body" quirk.
|
/// Sets the body text color for the "inherit color from body" quirk.
|
||||||
///
|
///
|
||||||
/// <https://quirks.spec.whatwg.org/#the-tables-inherit-color-from-body-quirk>
|
/// <https://quirks.spec.whatwg.org/#the-tables-inherit-color-from-body-quirk>
|
||||||
|
|
|
@ -15,6 +15,7 @@ use crate::properties::longhands::display::computed_value::T as Display;
|
||||||
use crate::properties::{ComputedValues, PropertyFlags};
|
use crate::properties::{ComputedValues, PropertyFlags};
|
||||||
use crate::selector_parser::AttrValue as SelectorAttrValue;
|
use crate::selector_parser::AttrValue as SelectorAttrValue;
|
||||||
use crate::selector_parser::{PseudoElementCascadeType, SelectorParser};
|
use crate::selector_parser::{PseudoElementCascadeType, SelectorParser};
|
||||||
|
use crate::values::{AtomIdent, AtomString};
|
||||||
use crate::{Atom, CaseSensitivityExt, LocalName, Namespace, Prefix};
|
use crate::{Atom, CaseSensitivityExt, LocalName, Namespace, Prefix};
|
||||||
use cssparser::{serialize_identifier, CowRcStr, Parser as CssParser, SourceLocation, ToCss};
|
use cssparser::{serialize_identifier, CowRcStr, Parser as CssParser, SourceLocation, ToCss};
|
||||||
use fxhash::FxHashMap;
|
use fxhash::FxHashMap;
|
||||||
|
@ -66,10 +67,6 @@ pub enum PseudoElement {
|
||||||
/// The count of all pseudo-elements.
|
/// The count of all pseudo-elements.
|
||||||
pub const PSEUDO_COUNT: usize = PseudoElement::ServoInlineAbsolute as usize + 1;
|
pub const PSEUDO_COUNT: usize = PseudoElement::ServoInlineAbsolute as usize + 1;
|
||||||
|
|
||||||
impl ::selectors::parser::PseudoElement for PseudoElement {
|
|
||||||
type Impl = SelectorImpl;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToCss for PseudoElement {
|
impl ToCss for PseudoElement {
|
||||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
||||||
where
|
where
|
||||||
|
@ -96,6 +93,10 @@ impl ToCss for PseudoElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ::selectors::parser::PseudoElement for PseudoElement {
|
||||||
|
type Impl = SelectorImpl;
|
||||||
|
}
|
||||||
|
|
||||||
/// The number of eager pseudo-elements. Keep this in sync with cascade_type.
|
/// The number of eager pseudo-elements. Keep this in sync with cascade_type.
|
||||||
pub const EAGER_PSEUDO_COUNT: usize = 3;
|
pub const EAGER_PSEUDO_COUNT: usize = 3;
|
||||||
|
|
||||||
|
@ -344,7 +345,6 @@ impl ToCss for NonTSPseudoClass {
|
||||||
Fullscreen => ":fullscreen",
|
Fullscreen => ":fullscreen",
|
||||||
Hover => ":hover",
|
Hover => ":hover",
|
||||||
Indeterminate => ":indeterminate",
|
Indeterminate => ":indeterminate",
|
||||||
MozInert => ":-moz-inert",
|
|
||||||
Link => ":link",
|
Link => ":link",
|
||||||
PlaceholderShown => ":placeholder-shown",
|
PlaceholderShown => ":placeholder-shown",
|
||||||
ReadWrite => ":read-write",
|
ReadWrite => ":read-write",
|
||||||
|
@ -402,15 +402,13 @@ impl ::selectors::SelectorImpl for SelectorImpl {
|
||||||
type NonTSPseudoClass = NonTSPseudoClass;
|
type NonTSPseudoClass = NonTSPseudoClass;
|
||||||
|
|
||||||
type ExtraMatchingData = InvalidationMatchingData;
|
type ExtraMatchingData = InvalidationMatchingData;
|
||||||
type AttrValue = String;
|
type AttrValue = AtomString;
|
||||||
type Identifier = Atom;
|
type Identifier = AtomIdent;
|
||||||
type ClassName = Atom;
|
|
||||||
type PartName = Atom;
|
|
||||||
type LocalName = LocalName;
|
type LocalName = LocalName;
|
||||||
type NamespacePrefix = Prefix;
|
type NamespacePrefix = Prefix;
|
||||||
type NamespaceUrl = Namespace;
|
type NamespaceUrl = Namespace;
|
||||||
type BorrowedLocalName = LocalName;
|
type BorrowedLocalName = html5ever::LocalName;
|
||||||
type BorrowedNamespaceUrl = Namespace;
|
type BorrowedNamespaceUrl = html5ever::Namespace;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> {
|
impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> {
|
||||||
|
@ -434,7 +432,6 @@ impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> {
|
||||||
"fullscreen" => Fullscreen,
|
"fullscreen" => Fullscreen,
|
||||||
"hover" => Hover,
|
"hover" => Hover,
|
||||||
"indeterminate" => Indeterminate,
|
"indeterminate" => Indeterminate,
|
||||||
"-moz-inert" => MozInert,
|
|
||||||
"link" => Link,
|
"link" => Link,
|
||||||
"placeholder-shown" => PlaceholderShown,
|
"placeholder-shown" => PlaceholderShown,
|
||||||
"read-write" => ReadWrite,
|
"read-write" => ReadWrite,
|
||||||
|
@ -697,15 +694,15 @@ impl ElementSnapshot for ServoElementSnapshot {
|
||||||
.map(|v| v.as_atom())
|
.map(|v| v.as_atom())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_part(&self, _name: &Atom) -> bool {
|
fn is_part(&self, _name: &AtomIdent) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn imported_part(&self, _: &Atom) -> Option<Atom> {
|
fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_class(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool {
|
fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
|
||||||
self.get_attr(&ns!(), &local_name!("class"))
|
self.get_attr(&ns!(), &local_name!("class"))
|
||||||
.map_or(false, |v| {
|
.map_or(false, |v| {
|
||||||
v.as_tokens()
|
v.as_tokens()
|
||||||
|
@ -716,11 +713,11 @@ impl ElementSnapshot for ServoElementSnapshot {
|
||||||
|
|
||||||
fn each_class<F>(&self, mut callback: F)
|
fn each_class<F>(&self, mut callback: F)
|
||||||
where
|
where
|
||||||
F: FnMut(&Atom),
|
F: FnMut(&AtomIdent),
|
||||||
{
|
{
|
||||||
if let Some(v) = self.get_attr(&ns!(), &local_name!("class")) {
|
if let Some(v) = self.get_attr(&ns!(), &local_name!("class")) {
|
||||||
for class in v.as_tokens() {
|
for class in v.as_tokens() {
|
||||||
callback(class);
|
callback(AtomIdent::cast(class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -728,7 +725,7 @@ impl ElementSnapshot for ServoElementSnapshot {
|
||||||
fn lang_attr(&self) -> Option<SelectorAttrValue> {
|
fn lang_attr(&self) -> Option<SelectorAttrValue> {
|
||||||
self.get_attr(&ns!(xml), &local_name!("lang"))
|
self.get_attr(&ns!(xml), &local_name!("lang"))
|
||||||
.or_else(|| self.get_attr(&ns!(), &local_name!("lang")))
|
.or_else(|| self.get_attr(&ns!(), &local_name!("lang")))
|
||||||
.map(|v| String::from(v as &str))
|
.map(|v| SelectorAttrValue::from(v as &str))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -738,7 +735,7 @@ impl ServoElementSnapshot {
|
||||||
&self,
|
&self,
|
||||||
ns: &NamespaceConstraint<&Namespace>,
|
ns: &NamespaceConstraint<&Namespace>,
|
||||||
local_name: &LocalName,
|
local_name: &LocalName,
|
||||||
operation: &AttrSelectorOperation<&String>,
|
operation: &AttrSelectorOperation<&AtomString>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match *ns {
|
match *ns {
|
||||||
NamespaceConstraint::Specific(ref ns) => self
|
NamespaceConstraint::Specific(ref ns) => self
|
||||||
|
|
|
@ -107,11 +107,17 @@ impl CssUrl {
|
||||||
///
|
///
|
||||||
/// This is only for shape images and masks in Gecko, thus unimplemented for
|
/// This is only for shape images and masks in Gecko, thus unimplemented for
|
||||||
/// now so somebody notices when trying to do so.
|
/// now so somebody notices when trying to do so.
|
||||||
pub fn parse_with_cors_anonymous<'i, 't>(
|
pub fn parse_with_cors_mode<'i, 't>(
|
||||||
_context: &ParserContext,
|
context: &ParserContext,
|
||||||
_input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
|
cors_mode: CorsMode,
|
||||||
) -> Result<Self, ParseError<'i>> {
|
) -> Result<Self, ParseError<'i>> {
|
||||||
unimplemented!("Need to record somewhere that the request needs to be CORS-enabled")
|
let url = input.expect_url()?;
|
||||||
|
Ok(Self::parse_from_string(
|
||||||
|
url.as_ref().to_owned(),
|
||||||
|
context,
|
||||||
|
cors_mode,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,12 +126,7 @@ impl Parse for CssUrl {
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<Self, ParseError<'i>> {
|
) -> Result<Self, ParseError<'i>> {
|
||||||
let url = input.expect_url()?;
|
Self::parse_with_cors_mode(context, input, CorsMode::None)
|
||||||
Ok(Self::parse_from_string(
|
|
||||||
url.as_ref().to_owned(),
|
|
||||||
context,
|
|
||||||
CorsMode::None,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,3 +179,11 @@ pub type CssStringWriter = ::nsstring::nsACString;
|
||||||
/// needs to allocate a temporary string.
|
/// needs to allocate a temporary string.
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
pub type CssString = ::nsstring::nsCString;
|
pub type CssString = ::nsstring::nsCString;
|
||||||
|
|
||||||
|
/// String. The comments for the Gecko types explain the need for this abstraction.
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
pub type CssStringWriter = String;
|
||||||
|
|
||||||
|
/// String. The comments for the Gecko types explain the need for this abstraction.
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
pub type CssString = String;
|
||||||
|
|
|
@ -9,7 +9,6 @@ use crate::computed_value_flags::ComputedValueFlags;
|
||||||
use crate::dom::TElement;
|
use crate::dom::TElement;
|
||||||
use crate::properties::longhands::display::computed_value::T as Display;
|
use crate::properties::longhands::display::computed_value::T as Display;
|
||||||
use crate::properties::longhands::float::computed_value::T as Float;
|
use crate::properties::longhands::float::computed_value::T as Float;
|
||||||
use crate::properties::longhands::overflow_x::computed_value::T as Overflow;
|
|
||||||
use crate::properties::longhands::position::computed_value::T as Position;
|
use crate::properties::longhands::position::computed_value::T as Position;
|
||||||
use crate::properties::{self, ComputedValues, StyleBuilder};
|
use crate::properties::{self, ComputedValues, StyleBuilder};
|
||||||
|
|
||||||
|
@ -153,7 +152,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// https://html.spec.whatwg.org/multipage/interaction.html#inert-subtrees
|
/// https://html.spec.whatwg.org/multipage/#inert-subtrees
|
||||||
///
|
///
|
||||||
/// If -moz-inert is applied then add:
|
/// If -moz-inert is applied then add:
|
||||||
/// -moz-user-focus: none;
|
/// -moz-user-focus: none;
|
||||||
|
@ -168,6 +167,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> {
|
||||||
///
|
///
|
||||||
/// NOTE: If this or the pointer-events tweak is removed, then
|
/// NOTE: If this or the pointer-events tweak is removed, then
|
||||||
/// minimal-xul.css and the scrollbar style caching need to be tweaked.
|
/// minimal-xul.css and the scrollbar style caching need to be tweaked.
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
fn adjust_for_inert(&mut self) {
|
fn adjust_for_inert(&mut self) {
|
||||||
use crate::values::specified::ui::CursorKind;
|
use crate::values::specified::ui::CursorKind;
|
||||||
use crate::values::specified::ui::UserSelect;
|
use crate::values::specified::ui::UserSelect;
|
||||||
|
@ -529,6 +529,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> {
|
||||||
/// parent, but we need to make sure it's still scrollable.
|
/// parent, but we need to make sure it's still scrollable.
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
fn adjust_for_text_control_editing_root(&mut self) {
|
fn adjust_for_text_control_editing_root(&mut self) {
|
||||||
|
use crate::properties::longhands::overflow_x::computed_value::T as Overflow;
|
||||||
use crate::selector_parser::PseudoElement;
|
use crate::selector_parser::PseudoElement;
|
||||||
|
|
||||||
if self.style.pseudo != Some(&PseudoElement::MozTextControlEditingRoot) {
|
if self.style.pseudo != Some(&PseudoElement::MozTextControlEditingRoot) {
|
||||||
|
|
|
@ -510,10 +510,11 @@ trivial_to_computed_value!(u16);
|
||||||
trivial_to_computed_value!(u32);
|
trivial_to_computed_value!(u32);
|
||||||
trivial_to_computed_value!(usize);
|
trivial_to_computed_value!(usize);
|
||||||
trivial_to_computed_value!(Atom);
|
trivial_to_computed_value!(Atom);
|
||||||
|
trivial_to_computed_value!(crate::values::AtomIdent);
|
||||||
#[cfg(feature = "servo")]
|
#[cfg(feature = "servo")]
|
||||||
trivial_to_computed_value!(html5ever::Namespace);
|
trivial_to_computed_value!(crate::Namespace);
|
||||||
#[cfg(feature = "servo")]
|
#[cfg(feature = "servo")]
|
||||||
trivial_to_computed_value!(html5ever::Prefix);
|
trivial_to_computed_value!(crate::Prefix);
|
||||||
trivial_to_computed_value!(String);
|
trivial_to_computed_value!(String);
|
||||||
trivial_to_computed_value!(Box<str>);
|
trivial_to_computed_value!(Box<str>);
|
||||||
trivial_to_computed_value!(crate::OwnedStr);
|
trivial_to_computed_value!(crate::OwnedStr);
|
||||||
|
|
|
@ -117,7 +117,7 @@ pub use self::GenericCrossFadeElement as CrossFadeElement;
|
||||||
pub use self::GenericCrossFadeImage as CrossFadeImage;
|
pub use self::GenericCrossFadeImage as CrossFadeImage;
|
||||||
|
|
||||||
/// https://drafts.csswg.org/css-images-4/#image-set-notation
|
/// https://drafts.csswg.org/css-images-4/#image-set-notation
|
||||||
#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToResolvedValue, ToShmem, ToCss)]
|
#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss, ToResolvedValue, ToShmem)]
|
||||||
#[css(comma, function = "image-set")]
|
#[css(comma, function = "image-set")]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct GenericImageSet<Image, Resolution> {
|
pub struct GenericImageSet<Image, Resolution> {
|
||||||
|
|
|
@ -68,7 +68,7 @@ pub fn serialize_atom_identifier<Static, W>(
|
||||||
dest: &mut W,
|
dest: &mut W,
|
||||||
) -> fmt::Result
|
) -> fmt::Result
|
||||||
where
|
where
|
||||||
Static: ::string_cache::StaticAtomSet,
|
Static: string_cache::StaticAtomSet,
|
||||||
W: Write,
|
W: Write,
|
||||||
{
|
{
|
||||||
serialize_identifier(&ident, dest)
|
serialize_identifier(&ident, dest)
|
||||||
|
@ -90,7 +90,7 @@ pub fn serialize_atom_name<Static, W>(
|
||||||
dest: &mut W,
|
dest: &mut W,
|
||||||
) -> fmt::Result
|
) -> fmt::Result
|
||||||
where
|
where
|
||||||
Static: ::string_cache::StaticAtomSet,
|
Static: string_cache::StaticAtomSet,
|
||||||
W: Write,
|
W: Write,
|
||||||
{
|
{
|
||||||
serialize_name(&ident, dest)
|
serialize_name(&ident, dest)
|
||||||
|
@ -114,13 +114,27 @@ where
|
||||||
)]
|
)]
|
||||||
pub struct AtomString(pub Atom);
|
pub struct AtomString(pub Atom);
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl AsRef<str> for AtomString {
|
||||||
|
fn as_ref(&self) -> &str {
|
||||||
|
&*self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl cssparser::ToCss for AtomString {
|
impl cssparser::ToCss for AtomString {
|
||||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
||||||
where
|
where
|
||||||
W: Write,
|
W: Write,
|
||||||
{
|
{
|
||||||
self.0
|
#[cfg(feature = "servo")]
|
||||||
.with_str(|s| cssparser::CssStringWriter::new(dest).write_str(s))
|
{
|
||||||
|
cssparser::CssStringWriter::new(dest).write_str(self.as_ref())
|
||||||
|
}
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
|
{
|
||||||
|
self.0
|
||||||
|
.with_str(|s| cssparser::CssStringWriter::new(dest).write_str(s))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,24 +152,138 @@ impl<'a> From<&'a str> for AtomString {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A generic CSS `<ident>` stored as an `Atom`.
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
#[repr(transparent)]
|
||||||
|
#[derive(Deref)]
|
||||||
|
pub struct GenericAtomIdent<Set>(pub string_cache::Atom<Set>)
|
||||||
|
where
|
||||||
|
Set: string_cache::StaticAtomSet;
|
||||||
|
|
||||||
|
/// A generic CSS `<ident>` stored as an `Atom`, for the default atom set.
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
pub type AtomIdent = GenericAtomIdent<servo_atoms::AtomStaticSet>;
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> style_traits::SpecifiedValueInfo for GenericAtomIdent<Set> {}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> Default for GenericAtomIdent<Set> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self(string_cache::Atom::default())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> std::fmt::Debug for GenericAtomIdent<Set> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
self.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> std::hash::Hash for GenericAtomIdent<Set> {
|
||||||
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.0.hash(state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> Eq for GenericAtomIdent<Set> {}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> PartialEq for GenericAtomIdent<Set> {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.0 == other.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> Clone for GenericAtomIdent<Set> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Self(self.0.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> to_shmem::ToShmem for GenericAtomIdent<Set> {
|
||||||
|
fn to_shmem(&self, builder: &mut to_shmem::SharedMemoryBuilder) -> to_shmem::Result<Self> {
|
||||||
|
use std::mem::ManuallyDrop;
|
||||||
|
|
||||||
|
let atom = self.0.to_shmem(builder)?;
|
||||||
|
Ok(ManuallyDrop::new(Self(ManuallyDrop::into_inner(atom))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> malloc_size_of::MallocSizeOf for GenericAtomIdent<Set> {
|
||||||
|
fn size_of(&self, ops: &mut malloc_size_of::MallocSizeOfOps) -> usize {
|
||||||
|
self.0.size_of(ops)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> cssparser::ToCss for GenericAtomIdent<Set> {
|
||||||
|
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
||||||
|
where
|
||||||
|
W: Write,
|
||||||
|
{
|
||||||
|
serialize_atom_identifier(&self.0, dest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> PrecomputedHash for GenericAtomIdent<Set> {
|
||||||
|
#[inline]
|
||||||
|
fn precomputed_hash(&self) -> u32 {
|
||||||
|
self.0.precomputed_hash()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<'a, Set: string_cache::StaticAtomSet> From<&'a str> for GenericAtomIdent<Set> {
|
||||||
|
#[inline]
|
||||||
|
fn from(string: &str) -> Self {
|
||||||
|
Self(string_cache::Atom::from(string))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> std::borrow::Borrow<string_cache::Atom<Set>>
|
||||||
|
for GenericAtomIdent<Set>
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn borrow(&self) -> &string_cache::Atom<Set> {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
impl<Set: string_cache::StaticAtomSet> GenericAtomIdent<Set> {
|
||||||
|
/// Constructs a new GenericAtomIdent.
|
||||||
|
#[inline]
|
||||||
|
pub fn new(atom: string_cache::Atom<Set>) -> Self {
|
||||||
|
Self(atom)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Cast an atom ref to an AtomIdent ref.
|
||||||
|
#[inline]
|
||||||
|
pub fn cast<'a>(atom: &'a string_cache::Atom<Set>) -> &'a Self {
|
||||||
|
let ptr = atom as *const _ as *const Self;
|
||||||
|
// safety: repr(transparent)
|
||||||
|
unsafe { &*ptr }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A CSS `<ident>` stored as an `Atom`.
|
/// A CSS `<ident>` stored as an `Atom`.
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(
|
#[derive(
|
||||||
Clone,
|
Clone, Debug, Default, Deref, Eq, Hash, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToShmem,
|
||||||
Debug,
|
|
||||||
Default,
|
|
||||||
Deref,
|
|
||||||
Eq,
|
|
||||||
Hash,
|
|
||||||
MallocSizeOf,
|
|
||||||
PartialEq,
|
|
||||||
SpecifiedValueInfo,
|
|
||||||
ToComputedValue,
|
|
||||||
ToResolvedValue,
|
|
||||||
ToShmem,
|
|
||||||
)]
|
)]
|
||||||
pub struct AtomIdent(pub Atom);
|
pub struct AtomIdent(pub Atom);
|
||||||
|
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
impl cssparser::ToCss for AtomIdent {
|
impl cssparser::ToCss for AtomIdent {
|
||||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
fn to_css<W>(&self, dest: &mut W) -> fmt::Result
|
||||||
where
|
where
|
||||||
|
@ -165,6 +293,7 @@ impl cssparser::ToCss for AtomIdent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
impl PrecomputedHash for AtomIdent {
|
impl PrecomputedHash for AtomIdent {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn precomputed_hash(&self) -> u32 {
|
fn precomputed_hash(&self) -> u32 {
|
||||||
|
@ -172,6 +301,7 @@ impl PrecomputedHash for AtomIdent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
impl<'a> From<&'a str> for AtomIdent {
|
impl<'a> From<&'a str> for AtomIdent {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(string: &str) -> Self {
|
fn from(string: &str) -> Self {
|
||||||
|
@ -179,9 +309,15 @@ impl<'a> From<&'a str> for AtomIdent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
impl AtomIdent {
|
impl AtomIdent {
|
||||||
|
/// Constructs a new AtomIdent.
|
||||||
|
#[inline]
|
||||||
|
pub fn new(atom: Atom) -> Self {
|
||||||
|
Self(atom)
|
||||||
|
}
|
||||||
|
|
||||||
/// Like `Atom::with` but for `AtomIdent`.
|
/// Like `Atom::with` but for `AtomIdent`.
|
||||||
#[cfg(feature = "gecko")]
|
|
||||||
pub unsafe fn with<F, R>(ptr: *const crate::gecko_bindings::structs::nsAtom, callback: F) -> R
|
pub unsafe fn with<F, R>(ptr: *const crate::gecko_bindings::structs::nsAtom, callback: F) -> R
|
||||||
where
|
where
|
||||||
F: FnOnce(&Self) -> R,
|
F: FnOnce(&Self) -> R,
|
||||||
|
|
|
@ -74,14 +74,15 @@ trivial_to_resolved_value!(Box<str>);
|
||||||
trivial_to_resolved_value!(crate::OwnedStr);
|
trivial_to_resolved_value!(crate::OwnedStr);
|
||||||
trivial_to_resolved_value!(cssparser::RGBA);
|
trivial_to_resolved_value!(cssparser::RGBA);
|
||||||
trivial_to_resolved_value!(crate::Atom);
|
trivial_to_resolved_value!(crate::Atom);
|
||||||
|
trivial_to_resolved_value!(crate::values::AtomIdent);
|
||||||
trivial_to_resolved_value!(app_units::Au);
|
trivial_to_resolved_value!(app_units::Au);
|
||||||
trivial_to_resolved_value!(computed::url::ComputedUrl);
|
trivial_to_resolved_value!(computed::url::ComputedUrl);
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
trivial_to_resolved_value!(computed::url::ComputedImageUrl);
|
trivial_to_resolved_value!(computed::url::ComputedImageUrl);
|
||||||
#[cfg(feature = "servo")]
|
#[cfg(feature = "servo")]
|
||||||
trivial_to_resolved_value!(html5ever::Namespace);
|
trivial_to_resolved_value!(crate::Namespace);
|
||||||
#[cfg(feature = "servo")]
|
#[cfg(feature = "servo")]
|
||||||
trivial_to_resolved_value!(html5ever::Prefix);
|
trivial_to_resolved_value!(crate::Prefix);
|
||||||
trivial_to_resolved_value!(computed::LengthPercentage);
|
trivial_to_resolved_value!(computed::LengthPercentage);
|
||||||
trivial_to_resolved_value!(style_traits::values::specified::AllowedNumericType);
|
trivial_to_resolved_value!(style_traits::values::specified::AllowedNumericType);
|
||||||
|
|
||||||
|
|
|
@ -1144,15 +1144,6 @@ impl Parse for PaintWorklet {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MozImageRect {
|
impl MozImageRect {
|
||||||
#[cfg(not(feature = "gecko"))]
|
|
||||||
fn parse<'i, 't>(
|
|
||||||
_context: &ParserContext,
|
|
||||||
input: &mut Parser<'i, 't>,
|
|
||||||
_cors_mode: CorsMode,
|
|
||||||
) -> Result<Self, ParseError<'i>> {
|
|
||||||
Err(input.new_error_for_next_token())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
fn parse<'i, 't>(
|
fn parse<'i, 't>(
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
|
|
|
@ -12,7 +12,7 @@ use cssparser::{Parser, Token};
|
||||||
use style_traits::{ParseError, StyleParseErrorKind};
|
use style_traits::{ParseError, StyleParseErrorKind};
|
||||||
|
|
||||||
/// A specified resolution.
|
/// A specified resolution.
|
||||||
#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss, ToShmem, SpecifiedValueInfo)]
|
#[derive(Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)]
|
||||||
pub enum Resolution {
|
pub enum Resolution {
|
||||||
/// Dots per inch.
|
/// Dots per inch.
|
||||||
#[css(dimension)]
|
#[css(dimension)]
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
//! Specified types for CSS values related to tables.
|
//! Specified types for CSS values related to tables.
|
||||||
|
|
||||||
use crate::parser::ParserContext;
|
|
||||||
|
|
||||||
/// Specified values for the `caption-side` property.
|
/// Specified values for the `caption-side` property.
|
||||||
///
|
///
|
||||||
/// Note that despite having "physical" names, these are actually interpreted
|
/// Note that despite having "physical" names, these are actually interpreted
|
||||||
|
@ -15,7 +13,7 @@ use crate::parser::ParserContext;
|
||||||
///
|
///
|
||||||
/// https://drafts.csswg.org/css-tables/#propdef-caption-side
|
/// https://drafts.csswg.org/css-tables/#propdef-caption-side
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
fn caption_side_non_standard_enabled(_context: &ParserContext) -> bool {
|
fn caption_side_non_standard_enabled(_: &crate::parser::ParserContext) -> bool {
|
||||||
static_prefs::pref!("layout.css.caption-side-non-standard.enabled")
|
static_prefs::pref!("layout.css.caption-side-non-standard.enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ gecko = []
|
||||||
[dependencies]
|
[dependencies]
|
||||||
app_units = "0.7"
|
app_units = "0.7"
|
||||||
bitflags = "1.0"
|
bitflags = "1.0"
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
euclid = "0.20"
|
euclid = "0.20"
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
malloc_size_of = { path = "../malloc_size_of" }
|
malloc_size_of = { path = "../malloc_size_of" }
|
||||||
|
|
|
@ -118,6 +118,16 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ToCss for () {
|
||||||
|
#[inline]
|
||||||
|
fn to_css<W>(&self, _: &mut CssWriter<W>) -> fmt::Result
|
||||||
|
where
|
||||||
|
W: Write,
|
||||||
|
{
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A writer tailored for serialising CSS.
|
/// A writer tailored for serialising CSS.
|
||||||
///
|
///
|
||||||
/// Coupled with SequenceWriter, this allows callers to transparently handle
|
/// Coupled with SequenceWriter, this allows callers to transparently handle
|
||||||
|
|
|
@ -14,7 +14,7 @@ servo = ["cssparser/serde", "string_cache"]
|
||||||
gecko = []
|
gecko = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
servo_arc = { path = "../servo_arc" }
|
servo_arc = { path = "../servo_arc" }
|
||||||
smallbitvec = "2.1.1"
|
smallbitvec = "2.1.1"
|
||||||
smallvec = "1.0"
|
smallvec = "1.0"
|
||||||
|
|
|
@ -103,6 +103,10 @@ impl ServoUrl {
|
||||||
scheme == "about" || scheme == "blob" || scheme == "data"
|
scheme == "about" || scheme == "blob" || scheme == "data"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn chrome_rules_enabled(&self) -> bool {
|
||||||
|
self.is_chrome()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_chrome(&self) -> bool {
|
pub fn is_chrome(&self) -> bool {
|
||||||
self.scheme() == "chrome"
|
self.scheme() == "chrome"
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ doctest = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
app_units = "0.7"
|
app_units = "0.7"
|
||||||
cssparser = "0.27"
|
cssparser = "0.28"
|
||||||
euclid = "0.20"
|
euclid = "0.20"
|
||||||
html5ever = "0.25"
|
html5ever = "0.25"
|
||||||
rayon = "1"
|
rayon = "1"
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
use cssparser::{Parser, ParserInput};
|
use cssparser::{Parser, ParserInput};
|
||||||
use euclid::{Scale, Size2D};
|
use euclid::{Scale, Size2D};
|
||||||
use servo_arc::Arc;
|
use servo_arc::Arc;
|
||||||
|
use style::context::QuirksMode;
|
||||||
use style::custom_properties::{
|
use style::custom_properties::{
|
||||||
CustomPropertiesBuilder, CustomPropertiesMap, Name, SpecifiedValue,
|
CustomPropertiesBuilder, CustomPropertiesMap, Name, SpecifiedValue,
|
||||||
};
|
};
|
||||||
|
@ -30,6 +31,7 @@ fn cascade(
|
||||||
|
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
Size2D::new(800., 600.),
|
Size2D::new(800., 600.),
|
||||||
Scale::new(1.0),
|
Scale::new(1.0),
|
||||||
);
|
);
|
||||||
|
|
|
@ -12,7 +12,8 @@ fn parse_selector<'i, 't>(
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<SelectorList<SelectorImpl>, ParseError<'i>> {
|
) -> Result<SelectorList<SelectorImpl>, ParseError<'i>> {
|
||||||
let mut ns = Namespaces::default();
|
let mut ns = Namespaces::default();
|
||||||
ns.prefixes.insert("svg".into(), ns!(svg));
|
ns.prefixes
|
||||||
|
.insert("svg".into(), style::Namespace::new(ns!(svg)));
|
||||||
let parser = SelectorParser {
|
let parser = SelectorParser {
|
||||||
stylesheet_origin: Origin::UserAgent,
|
stylesheet_origin: Origin::UserAgent,
|
||||||
namespaces: &ns,
|
namespaces: &ns,
|
||||||
|
|
|
@ -214,6 +214,7 @@ fn test_insert() {
|
||||||
fn mock_stylist() -> Stylist {
|
fn mock_stylist() -> Stylist {
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
Size2D::new(0f32, 0f32),
|
Size2D::new(0f32, 0f32),
|
||||||
Scale::new(1.0),
|
Scale::new(1.0),
|
||||||
);
|
);
|
||||||
|
|
|
@ -113,6 +113,7 @@ macro_rules! viewport_length {
|
||||||
fn empty_viewport_rule() {
|
fn empty_viewport_rule() {
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
Size2D::new(800., 600.),
|
Size2D::new(800., 600.),
|
||||||
Scale::new(1.0),
|
Scale::new(1.0),
|
||||||
);
|
);
|
||||||
|
@ -140,6 +141,7 @@ macro_rules! assert_decl_eq {
|
||||||
fn simple_viewport_rules() {
|
fn simple_viewport_rules() {
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
Size2D::new(800., 600.),
|
Size2D::new(800., 600.),
|
||||||
Scale::new(1.0),
|
Scale::new(1.0),
|
||||||
);
|
);
|
||||||
|
@ -308,6 +310,7 @@ fn simple_meta_viewport_contents() {
|
||||||
fn cascading_within_viewport_rule() {
|
fn cascading_within_viewport_rule() {
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
Size2D::new(800., 600.),
|
Size2D::new(800., 600.),
|
||||||
Scale::new(1.0),
|
Scale::new(1.0),
|
||||||
);
|
);
|
||||||
|
@ -448,6 +451,7 @@ fn multiple_stylesheets_cascading() {
|
||||||
set_pref!(layout.viewport.enabled, true);
|
set_pref!(layout.viewport.enabled, true);
|
||||||
let device = Device::new(
|
let device = Device::new(
|
||||||
MediaType::screen(),
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
Size2D::new(800., 600.),
|
Size2D::new(800., 600.),
|
||||||
Scale::new(1.0),
|
Scale::new(1.0),
|
||||||
);
|
);
|
||||||
|
@ -539,7 +543,12 @@ fn constrain_viewport() {
|
||||||
}
|
}
|
||||||
|
|
||||||
let initial_viewport = Size2D::new(800., 600.);
|
let initial_viewport = Size2D::new(800., 600.);
|
||||||
let device = Device::new(MediaType::screen(), initial_viewport, Scale::new(1.0));
|
let device = Device::new(
|
||||||
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
|
initial_viewport,
|
||||||
|
Scale::new(1.0),
|
||||||
|
);
|
||||||
let mut input = ParserInput::new("");
|
let mut input = ParserInput::new("");
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
ViewportConstraints::maybe_new(&device, from_css!(input), QuirksMode::NoQuirks),
|
ViewportConstraints::maybe_new(&device, from_css!(input), QuirksMode::NoQuirks),
|
||||||
|
@ -597,7 +606,12 @@ fn constrain_viewport() {
|
||||||
);
|
);
|
||||||
|
|
||||||
let initial_viewport = Size2D::new(200., 150.);
|
let initial_viewport = Size2D::new(200., 150.);
|
||||||
let device = Device::new(MediaType::screen(), initial_viewport, Scale::new(1.0));
|
let device = Device::new(
|
||||||
|
MediaType::screen(),
|
||||||
|
QuirksMode::NoQuirks,
|
||||||
|
initial_viewport,
|
||||||
|
Scale::new(1.0),
|
||||||
|
);
|
||||||
let mut input = ParserInput::new("width: 320px auto");
|
let mut input = ParserInput::new("width: 320px auto");
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
ViewportConstraints::maybe_new(&device, from_css!(input), QuirksMode::NoQuirks),
|
ViewportConstraints::maybe_new(&device, from_css!(input), QuirksMode::NoQuirks),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue