aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAli Sabil <ali.sabil@gmail.com>2015-07-23 23:04:48 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2015-09-13 23:55:40 +0200
commitea655ada10cca75423dc5380ee26779e09c26883 (patch)
treed74848c4508e94ab94350d6cda49707df835c958
parentcba885630903cc58fe31b8651ea4e5a37c4bcf8d (diff)
downloadservo-ea655ada10cca75423dc5380ee26779e09c26883.tar.gz
servo-ea655ada10cca75423dc5380ee26779e09c26883.zip
Cache the `id` attribute on Element
-rw-r--r--components/script/dom/element.rs38
-rw-r--r--tests/unit/script/size_of.rs8
2 files changed, 22 insertions, 24 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 87804d373fd..0ca9c3c3f90 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -95,6 +95,7 @@ pub struct Element {
namespace: Namespace,
prefix: Option<DOMString>,
attrs: DOMRefCell<Vec<JS<Attr>>>,
+ id_attribute: DOMRefCell<Option<Atom>>,
style_attribute: DOMRefCell<Option<PropertyDeclarationBlock>>,
attr_list: MutNullableHeap<JS<NamedNodeMap>>,
class_list: MutNullableHeap<JS<DOMTokenList>>,
@@ -149,6 +150,7 @@ impl Element {
attrs: DOMRefCell::new(vec!()),
attr_list: Default::default(),
class_list: Default::default(),
+ id_attribute: DOMRefCell::new(None),
style_attribute: DOMRefCell::new(None),
}
}
@@ -1466,6 +1468,15 @@ impl VirtualMethods for Element {
NodeDamage::NodeStyleDamaged
},
&atom!(id) => {
+ *self.id_attribute.borrow_mut() =
+ mutation.new_value(attr).and_then(|value| {
+ let value = value.as_atom();
+ if value != &atom!("") {
+ Some(value.clone())
+ } else {
+ None
+ }
+ });
if node.is_in_doc() {
let value = attr.value().as_atom().clone();
match mutation {
@@ -1512,13 +1523,9 @@ impl VirtualMethods for Element {
if !tree_in_doc { return; }
- if let Some(ref attr) = self.get_attribute(&ns!(""), &atom!("id")) {
- let value = attr.value();
- if !value.is_empty() {
- let doc = document_from_node(self);
- let value = Atom::from_slice(&value);
- doc.register_named_element(self, value.to_owned());
- }
+ if let Some(ref value) = *self.id_attribute.borrow() {
+ let doc = document_from_node(self);
+ doc.register_named_element(self, value.clone());
}
}
@@ -1529,13 +1536,9 @@ impl VirtualMethods for Element {
if !tree_in_doc { return; }
- if let Some(ref attr) = self.get_attribute(&ns!(""), &atom!("id")) {
- let value = attr.value();
- if !value.is_empty() {
- let doc = document_from_node(self);
- let value = Atom::from_slice(&value);
- doc.unregister_named_element(self, value.to_owned());
- }
+ if let Some(ref value) = *self.id_attribute.borrow() {
+ let doc = document_from_node(self);
+ doc.unregister_named_element(self, value.clone());
}
}
}
@@ -1621,12 +1624,7 @@ impl<'a> ::selectors::Element for Root<Element> {
node.get_focus_state()
}
fn get_id(&self) -> Option<Atom> {
- self.get_attribute(&ns!(""), &atom!("id")).map(|attr| {
- match *attr.r().value() {
- AttrValue::Atom(ref val) => val.clone(),
- _ => panic!("`id` attribute should be AttrValue::Atom"),
- }
- })
+ self.id_attribute.borrow().clone()
}
fn get_disabled_state(&self) -> bool {
let node = NodeCast::from_ref(&**self);
diff --git a/tests/unit/script/size_of.rs b/tests/unit/script/size_of.rs
index 1b34e462470..7eec6699f19 100644
--- a/tests/unit/script/size_of.rs
+++ b/tests/unit/script/size_of.rs
@@ -40,9 +40,9 @@ macro_rules! sizeof_checker (
// Update the sizes here
sizeof_checker!(size_event_target, EventTarget, 40);
sizeof_checker!(size_node, Node, 168);
-sizeof_checker!(size_element, Element, 280);
-sizeof_checker!(size_htmlelement, HTMLElement, 296);
-sizeof_checker!(size_div, HTMLDivElement, 296);
-sizeof_checker!(size_span, HTMLSpanElement, 296);
+sizeof_checker!(size_element, Element, 304);
+sizeof_checker!(size_htmlelement, HTMLElement, 320);
+sizeof_checker!(size_div, HTMLDivElement, 320);
+sizeof_checker!(size_span, HTMLSpanElement, 320);
sizeof_checker!(size_text, Text, 200);
sizeof_checker!(size_characterdata, CharacterData, 200);