aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/main/css/matching.rs32
-rw-r--r--src/components/main/layout/box_.rs11
-rw-r--r--src/components/main/layout/construct.rs4
-rw-r--r--src/components/main/layout/wrapper.rs51
-rw-r--r--src/components/style/node.rs5
-rw-r--r--src/components/style/selector_matching.rs141
6 files changed, 110 insertions, 134 deletions
diff --git a/src/components/main/css/matching.rs b/src/components/main/css/matching.rs
index 72f2936312f..03d676045df 100644
--- a/src/components/main/css/matching.rs
+++ b/src/components/main/css/matching.rs
@@ -216,18 +216,17 @@ impl StyleSharingCandidate {
let mut style = Some(style);
let mut parent_style = Some(parent_style);
- node.with_element(|element| {
- if element.style_attribute().is_some() {
- return None
- }
+ let element = node.as_element();
+ if element.style_attribute().is_some() {
+ return None
+ }
- Some(StyleSharingCandidate {
- style: style.take_unwrap(),
- parent_style: parent_style.take_unwrap(),
- local_name: element.get_local_name().to_str(),
- class: element.get_attr(&Null, "class")
- .map(|string| string.to_str()),
- })
+ Some(StyleSharingCandidate {
+ style: style.take_unwrap(),
+ parent_style: parent_style.take_unwrap(),
+ local_name: element.get_local_name().to_str(),
+ class: element.get_attr(&Null, "class")
+ .map(|string| string.to_str()),
})
}
@@ -401,7 +400,7 @@ impl<'ln> PrivateMatchMethods for LayoutNode<'ln> {
}
// Check tag names, classes, etc.
- if !self.with_element(|element| candidate.can_share_style_with(element)) {
+ if !candidate.can_share_style_with(&self.as_element()) {
return None
}
@@ -419,9 +418,7 @@ impl<'ln> MatchMethods for LayoutNode<'ln> {
stylist: &Stylist,
applicable_declarations: &mut ApplicableDeclarations,
shareable: &mut bool) {
- let style_attribute = self.with_element(|element| {
- element.style_attribute().as_ref()
- });
+ let style_attribute = self.as_element().style_attribute().as_ref();
applicable_declarations.normal_shareable =
stylist.push_applicable_declarations(self,
@@ -448,9 +445,10 @@ impl<'ln> MatchMethods for LayoutNode<'ln> {
if !self.is_element() {
return CannotShare(false)
}
- let ok = self.with_element(|element| {
+ let ok = {
+ let element = self.as_element();
element.style_attribute().is_none() && element.get_attr(&Null, "id").is_none()
- });
+ };
if !ok {
return CannotShare(false)
}
diff --git a/src/components/main/layout/box_.rs b/src/components/main/layout/box_.rs
index 11078ccef17..f6540c3f1b8 100644
--- a/src/components/main/layout/box_.rs
+++ b/src/components/main/layout/box_.rs
@@ -132,12 +132,11 @@ impl ImageBoxInfo {
local_image_cache: MutexArc<LocalImageCache>)
-> ImageBoxInfo {
fn convert_length(node: &ThreadSafeLayoutNode, name: &str) -> Option<Au> {
- node.with_element(|element| {
- element.get_attr(&namespace::Null, name).and_then(|string| {
- let n: Option<int> = FromStr::from_str(string);
- n
- }).and_then(|pixels| Some(Au::from_px(pixels)))
- })
+ let element = node.as_element();
+ element.get_attr(&namespace::Null, name).and_then(|string| {
+ let n: Option<int> = FromStr::from_str(string);
+ n
+ }).and_then(|pixels| Some(Au::from_px(pixels)))
}
ImageBoxInfo {
diff --git a/src/components/main/layout/construct.rs b/src/components/main/layout/construct.rs
index 2c0a7093690..8ae7c06a2d1 100644
--- a/src/components/main/layout/construct.rs
+++ b/src/components/main/layout/construct.rs
@@ -851,8 +851,8 @@ trait ObjectElement {
impl<'ln> ObjectElement for ThreadSafeLayoutNode<'ln> {
fn get_type_and_data(&self) -> (Option<&'static str>, Option<&'static str>) {
- (self.with_element(|e| { e.get_attr(&namespace::Null, "type") } ),
- self.with_element(|e| { e.get_attr(&namespace::Null, "data") } ))
+ let elem = self.as_element();
+ (elem.get_attr(&namespace::Null, "type"), elem.get_attr(&namespace::Null, "data"))
}
fn has_object_data(&self) -> bool {
diff --git a/src/components/main/layout/wrapper.rs b/src/components/main/layout/wrapper.rs
index 94b9f45bd1d..d6c80900052 100644
--- a/src/components/main/layout/wrapper.rs
+++ b/src/components/main/layout/wrapper.rs
@@ -34,7 +34,7 @@
//! `html_element_in_html_document_for_layout()`.
use extra::url::Url;
-use script::dom::bindings::codegen::InheritTypes::{ElementDerived, HTMLIFrameElementDerived};
+use script::dom::bindings::codegen::InheritTypes::{HTMLIFrameElementDerived};
use script::dom::bindings::codegen::InheritTypes::{HTMLImageElementDerived, TextDerived};
use script::dom::bindings::js::JS;
use script::dom::element::{Element, HTMLAreaElementTypeId, HTMLAnchorElementTypeId};
@@ -228,16 +228,13 @@ impl<'ln> TNode<LayoutElement<'ln>> for LayoutNode<'ln> {
/// If this is an element, accesses the element data. Fails if this is not an element node.
#[inline]
- fn with_element<R>(&self, f: |&LayoutElement<'ln>| -> R) -> R {
+ fn as_element(&self) -> LayoutElement<'ln> {
unsafe {
- if !self.node.is_element() {
- fail!("not an element!")
- }
let elem: JS<Element> = self.node.transmute_copy();
let element = elem.get();
- f(&LayoutElement {
+ LayoutElement {
element: cast::transmute_region(element),
- })
+ }
}
}
@@ -250,23 +247,22 @@ impl<'ln> TNode<LayoutElement<'ln>> for LayoutNode<'ln> {
}
fn match_attr(&self, attr: &AttrSelector, test: |&str| -> bool) -> bool {
- self.with_element(|element| {
- let name = unsafe {
- if element.element.html_element_in_html_document_for_layout() {
- attr.lower_name.as_slice()
- } else {
- attr.name.as_slice()
- }
- };
- match attr.namespace {
- SpecificNamespace(ref ns) => {
- element.get_attr(ns, name)
- .map_or(false, |attr| test(attr))
- },
- // FIXME: https://github.com/mozilla/servo/issues/1558
- AnyNamespace => false,
+ let element = self.as_element();
+ let name = unsafe {
+ if element.element.html_element_in_html_document_for_layout() {
+ attr.lower_name.as_slice()
+ } else {
+ attr.name.as_slice()
}
- })
+ };
+ match attr.namespace {
+ SpecificNamespace(ref ns) => {
+ element.get_attr(ns, name)
+ .map_or(false, |attr| test(attr))
+ },
+ // FIXME: https://github.com/mozilla/servo/issues/1558
+ AnyNamespace => false,
+ }
}
}
@@ -433,18 +429,15 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
/// If this is an element, accesses the element data. Fails if this is not an element node.
#[inline]
- pub fn with_element<R>(&self, f: |&ThreadSafeLayoutElement| -> R) -> R {
+ pub fn as_element(&self) -> ThreadSafeLayoutElement {
unsafe {
- if !self.node.is_element() {
- fail!("not an element!")
- }
let elem: JS<Element> = self.node.transmute_copy();
let element = elem.unsafe_get();
// FIXME(pcwalton): Workaround until Rust gets multiple lifetime parameters on
// implementations.
- f(&ThreadSafeLayoutElement {
+ ThreadSafeLayoutElement {
element: cast::transmute::<*mut Element,&mut Element>(element),
- })
+ }
}
}
diff --git a/src/components/style/node.rs b/src/components/style/node.rs
index 86021d9c895..d53bffe66c6 100644
--- a/src/components/style/node.rs
+++ b/src/components/style/node.rs
@@ -15,10 +15,7 @@ pub trait TNode<E:TElement> : Clone {
fn next_sibling(&self) -> Option<Self>;
fn is_document(&self) -> bool;
fn is_element(&self) -> bool;
-
- /// FIXME(pcwalton): This should not use the `with` pattern.
- fn with_element<'a, R>(&self, f: |&E| -> R) -> R;
-
+ fn as_element(&self) -> E;
fn match_attr(&self, attr: &AttrSelector, test: |&str| -> bool) -> bool;
}
diff --git a/src/components/style/selector_matching.rs b/src/components/style/selector_matching.rs
index 650300f00bb..926bcc1ea58 100644
--- a/src/components/style/selector_matching.rs
+++ b/src/components/style/selector_matching.rs
@@ -117,44 +117,43 @@ impl SelectorMap {
// At the end, we're going to sort the rules that we added, so remember where we began.
let init_len = matching_rules_list.len();
- node.with_element(|element: &E| {
- match element.get_attr(&namespace::Null, "id") {
- Some(id) => {
- SelectorMap::get_matching_rules_from_hash(node,
- &self.id_hash,
- id,
- matching_rules_list,
- shareable)
- }
- None => {}
+ let element = node.as_element();
+ match element.get_attr(&namespace::Null, "id") {
+ Some(id) => {
+ SelectorMap::get_matching_rules_from_hash(node,
+ &self.id_hash,
+ id,
+ matching_rules_list,
+ shareable)
}
+ None => {}
+ }
- match element.get_attr(&namespace::Null, "class") {
- Some(ref class_attr) => {
- for class in class_attr.split(SELECTOR_WHITESPACE) {
- SelectorMap::get_matching_rules_from_hash(node,
- &self.class_hash,
- class,
- matching_rules_list,
- shareable);
- }
+ match element.get_attr(&namespace::Null, "class") {
+ Some(ref class_attr) => {
+ for class in class_attr.split(SELECTOR_WHITESPACE) {
+ SelectorMap::get_matching_rules_from_hash(node,
+ &self.class_hash,
+ class,
+ matching_rules_list,
+ shareable);
}
- None => {}
}
+ None => {}
+ }
- // HTML elements in HTML documents must be matched case-insensitively.
- // TODO(pradeep): Case-sensitivity depends on the document type.
- SelectorMap::get_matching_rules_from_hash_ignoring_case(node,
- &self.element_hash,
- element.get_local_name(),
- matching_rules_list,
- shareable);
-
- SelectorMap::get_matching_rules(node,
- self.universal_rules,
- matching_rules_list,
- shareable);
- });
+ // HTML elements in HTML documents must be matched case-insensitively.
+ // TODO(pradeep): Case-sensitivity depends on the document type.
+ SelectorMap::get_matching_rules_from_hash_ignoring_case(node,
+ &self.element_hash,
+ element.get_local_name(),
+ matching_rules_list,
+ shareable);
+
+ SelectorMap::get_matching_rules(node,
+ self.universal_rules,
+ matching_rules_list,
+ shareable);
// Sort only the rules we just added.
sort::quicksort(matching_rules_list.mut_slice_from(init_len));
@@ -582,36 +581,32 @@ fn matches_simple_selector<E:TElement,
// TODO: case-sensitivity depends on the document type
// TODO: intern element names
LocalNameSelector(ref name) => {
- element.with_element(|element: &E| {
- element.get_local_name().eq_ignore_ascii_case(name.as_slice())
- })
+ let element = element.as_element();
+ element.get_local_name().eq_ignore_ascii_case(name.as_slice())
}
NamespaceSelector(ref namespace) => {
*shareable = false;
- element.with_element(|element: &E| {
- element.get_namespace() == namespace
- })
+ let element = element.as_element();
+ element.get_namespace() == namespace
}
// TODO: case-sensitivity depends on the document type and quirks mode
// TODO: cache and intern IDs on elements.
IDSelector(ref id) => {
*shareable = false;
- element.with_element(|element: &E| {
- element.get_attr(&namespace::Null, "id")
- .map_or(false, |attr| {
- attr == *id
- })
+ let element = element.as_element();
+ element.get_attr(&namespace::Null, "id")
+ .map_or(false, |attr| {
+ attr == *id
})
}
// TODO: cache and intern class names on elements.
ClassSelector(ref class) => {
- element.with_element(|element: &E| {
- element.get_attr(&namespace::Null, "class")
- .map_or(false, |attr| {
- // TODO: case-sensitivity depends on the document type and quirks mode
- attr.split(SELECTOR_WHITESPACE).any(|c| c == class.as_slice())
- })
+ let element = element.as_element();
+ element.get_attr(&namespace::Null, "class")
+ .map_or(false, |attr| {
+ // TODO: case-sensitivity depends on the document type and quirks mode
+ attr.split(SELECTOR_WHITESPACE).any(|c| c == class.as_slice())
})
}
@@ -663,34 +658,30 @@ fn matches_simple_selector<E:TElement,
AnyLink => {
*shareable = false;
- element.with_element(|element: &E| {
- element.get_link().is_some()
- })
+ let element = element.as_element();
+ element.get_link().is_some()
}
Link => {
*shareable = false;
- element.with_element(|element: &E| {
- match element.get_link() {
- Some(url) => !url_is_visited(url),
- None => false,
- }
- })
+ let elem = element.as_element();
+ match elem.get_link() {
+ Some(url) => !url_is_visited(url),
+ None => false,
+ }
}
Visited => {
*shareable = false;
- element.with_element(|element: &E| {
- match element.get_link() {
- Some(url) => url_is_visited(url),
- None => false,
- }
- })
+ let elem = element.as_element();
+ match elem.get_link() {
+ Some(url) => url_is_visited(url),
+ None => false,
+ }
}
Hover => {
*shareable = false;
- element.with_element(|element: &E| {
- element.get_hover_state()
- })
+ let elem = element.as_element();
+ elem.get_hover_state()
},
FirstChild => {
*shareable = false;
@@ -791,14 +782,12 @@ fn matches_generic_nth_child<'a,
if node.is_element() {
if is_of_type {
- element.with_element(|element: &E| {
- node.with_element(|node: &E| {
- if element.get_local_name() == node.get_local_name() &&
- element.get_namespace() == node.get_namespace() {
- index += 1;
- }
- })
- })
+ let element = element.as_element();
+ let node = node.as_element();
+ if element.get_local_name() == node.get_local_name() &&
+ element.get_namespace() == node.get_namespace() {
+ index += 1;
+ }
} else {
index += 1;
}