diff options
author | Ali Sabil <ali.sabil@gmail.com> | 2015-07-23 23:04:48 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-13 23:55:40 +0200 |
commit | ea655ada10cca75423dc5380ee26779e09c26883 (patch) | |
tree | d74848c4508e94ab94350d6cda49707df835c958 | |
parent | cba885630903cc58fe31b8651ea4e5a37c4bcf8d (diff) | |
download | servo-ea655ada10cca75423dc5380ee26779e09c26883.tar.gz servo-ea655ada10cca75423dc5380ee26779e09c26883.zip |
Cache the `id` attribute on Element
-rw-r--r-- | components/script/dom/element.rs | 38 | ||||
-rw-r--r-- | tests/unit/script/size_of.rs | 8 |
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); |