diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-08-19 17:04:39 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-08-19 17:04:39 +0200 |
commit | 1c1216de5c3907796e109a61d3a796f75a9bcb99 (patch) | |
tree | d391386e2a5e8c9bc53e26d9b523bf2bfd429fd7 /src/components/script/dom/element.rs | |
parent | 30c66debb05cfc84cb8b0d53b6b174ce0af10879 (diff) | |
parent | 1b543144f19372476d50b9b1a1730c276f2b462c (diff) | |
download | servo-1c1216de5c3907796e109a61d3a796f75a9bcb99.tar.gz servo-1c1216de5c3907796e109a61d3a796f75a9bcb99.zip |
Merge pull request #3099 from Ms2ger/attr-local_name-atom
Make Attr::local_name an Atom; r=abinader
Diffstat (limited to 'src/components/script/dom/element.rs')
-rw-r--r-- | src/components/script/dom/element.rs | 92 |
1 files changed, 48 insertions, 44 deletions
diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index cdb2f4f1f2b..425529fe6d4 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -178,7 +178,8 @@ impl RawLayoutElementHelpers for Element { let attrs: *const Vec<JS<Attr>> = mem::transmute(&self.attrs); (*attrs).iter().find(|attr: & &JS<Attr>| { let attr = attr.unsafe_get(); - name == (*attr).local_name.as_slice() && (*attr).namespace == *namespace + name == (*attr).local_name().as_slice() && + (*attr).namespace == *namespace }).map(|attr| { let attr = attr.unsafe_get(); (*attr).value_ref_forever() @@ -192,7 +193,8 @@ impl RawLayoutElementHelpers for Element { let attrs: *const Vec<JS<Attr>> = mem::transmute(&self.attrs); (*attrs).iter().find(|attr: & &JS<Attr>| { let attr = attr.unsafe_get(); - name == (*attr).local_name.as_slice() && (*attr).namespace == *namespace + name == (*attr).local_name().as_slice() && + (*attr).namespace == *namespace }).and_then(|attr| { let attr = attr.unsafe_get(); (*attr).value_atom_forever() @@ -238,18 +240,18 @@ impl<'a> ElementHelpers for JSRef<'a, Element> { pub trait AttributeHandlers { fn get_attribute(&self, namespace: Namespace, name: &str) -> Option<Temporary<Attr>>; - fn set_attribute_from_parser(&self, local_name: DOMString, + fn set_attribute_from_parser(&self, local_name: Atom, value: DOMString, namespace: Namespace, prefix: Option<DOMString>); fn set_attribute(&self, name: &str, value: AttrValue); - fn do_set_attribute(&self, local_name: DOMString, value: AttrValue, + fn do_set_attribute(&self, local_name: Atom, value: AttrValue, name: Atom, namespace: Namespace, prefix: Option<DOMString>, cb: |&JSRef<Attr>| -> bool); - fn parse_attribute(&self, namespace: &Namespace, local_name: &str, + fn parse_attribute(&self, namespace: &Namespace, local_name: &Atom, value: DOMString) -> AttrValue; fn remove_attribute(&self, namespace: Namespace, name: &str); - fn notify_attribute_changed(&self, local_name: DOMString); + fn notify_attribute_changed(&self, local_name: &Atom); fn has_class(&self, name: &str) -> bool; fn set_atomic_attribute(&self, name: &str, value: DOMString); @@ -269,27 +271,26 @@ pub trait AttributeHandlers { impl<'a> AttributeHandlers for JSRef<'a, Element> { fn get_attribute(&self, namespace: Namespace, name: &str) -> Option<Temporary<Attr>> { let element: &Element = self.deref(); - let is_html_element = self.html_element_in_html_document(); - + let local_name = match self.html_element_in_html_document() { + true => Atom::from_slice(name.to_ascii_lower().as_slice()), + false => Atom::from_slice(name) + }; element.attrs.borrow().iter().map(|attr| attr.root()).find(|attr| { - let same_name = if is_html_element { - name.to_ascii_lower() == attr.local_name - } else { - name == attr.local_name.as_slice() - }; - - same_name && attr.namespace == namespace + *attr.local_name() == local_name && attr.namespace == namespace }).map(|x| Temporary::from_rooted(&*x)) } - fn set_attribute_from_parser(&self, local_name: DOMString, + fn set_attribute_from_parser(&self, local_name: Atom, value: DOMString, namespace: Namespace, prefix: Option<DOMString>) { let name = match prefix { - None => Atom::from_slice(local_name.as_slice()), - Some(ref prefix) => Atom::from_slice(format!("{:s}:{:s}", *prefix, local_name).as_slice()), + None => local_name.clone(), + Some(ref prefix) => { + let name = format!("{:s}:{:s}", *prefix, local_name.as_slice()); + Atom::from_slice(name.as_slice()) + }, }; - let value = self.parse_attribute(&namespace, local_name.as_slice(), value); + let value = self.parse_attribute(&namespace, &local_name, value); self.do_set_attribute(local_name, value, name, namespace, prefix, |_| false) } @@ -300,12 +301,12 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { let node: &JSRef<Node> = NodeCast::from_ref(self); node.wait_until_safe_to_modify_dom(); - self.do_set_attribute(name.to_string(), value, Atom::from_slice(name), - namespace::Null, None, - |attr| attr.deref().local_name.as_slice() == name); + let name = Atom::from_slice(name); + self.do_set_attribute(name.clone(), value, name.clone(), + namespace::Null, None, |attr| *attr.local_name() == name); } - fn do_set_attribute(&self, local_name: DOMString, value: AttrValue, + fn do_set_attribute(&self, local_name: Atom, value: AttrValue, name: Atom, namespace: Namespace, prefix: Option<DOMString>, cb: |&JSRef<Attr>| -> bool) { let idx = self.deref().attrs.borrow().iter() @@ -315,7 +316,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { Some(idx) => (idx, ReplacedAttr), None => { let window = window_from_node(self).root(); - let attr = Attr::new(&*window, local_name.clone(), value.clone(), + let attr = Attr::new(&*window, local_name, value.clone(), name, namespace.clone(), prefix, self); self.deref().attrs.borrow_mut().push_unrooted(&attr); (self.deref().attrs.borrow().len() - 1, FirstSetAttr) @@ -325,11 +326,11 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { (*self.deref().attrs.borrow())[idx].root().set_value(set_type, value); } - fn parse_attribute(&self, namespace: &Namespace, local_name: &str, + fn parse_attribute(&self, namespace: &Namespace, local_name: &Atom, value: DOMString) -> AttrValue { if *namespace == namespace::Null { vtable_for(NodeCast::from_ref(self)) - .parse_plain_attribute(local_name, value) + .parse_plain_attribute(local_name.as_slice(), value) } else { StringAttrValue(value) } @@ -337,9 +338,10 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { fn remove_attribute(&self, namespace: Namespace, name: &str) { let (_, local_name) = get_attribute_parts(name); + let local_name = Atom::from_slice(local_name); let idx = self.deref().attrs.borrow().iter().map(|attr| attr.root()).position(|attr| { - attr.local_name.as_slice() == local_name + *attr.local_name() == local_name }); match idx { @@ -353,7 +355,8 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { if namespace == namespace::Null { let removed_raw_value = (*self.deref().attrs.borrow())[idx].root().Value(); vtable_for(NodeCast::from_ref(self)) - .before_remove_attr(local_name.to_string(), removed_raw_value); + .before_remove_attr(&local_name, + removed_raw_value); } self.deref().attrs.borrow_mut().remove(idx); @@ -361,7 +364,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { }; } - fn notify_attribute_changed(&self, local_name: DOMString) { + fn notify_attribute_changed(&self, local_name: &Atom) { let node: &JSRef<Node> = NodeCast::from_ref(self); if node.is_in_doc() { let damage = match local_name.as_slice() { @@ -387,11 +390,11 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { fn has_attribute(&self, name: &str) -> bool { let name = match self.html_element_in_html_document() { - true => name.to_ascii_lower(), - false => name.to_string() + true => Atom::from_slice(name.to_ascii_lower().as_slice()), + false => Atom::from_slice(name) }; self.deref().attrs.borrow().iter().map(|attr| attr.root()).any(|attr| { - name == attr.local_name && attr.namespace == Null + *attr.local_name() == name && attr.namespace == Null }) } @@ -586,10 +589,10 @@ impl<'a> ElementMethods for JSRef<'a, Element> { }; // Step 3-5. - let value = self.parse_attribute(&namespace::Null, name.as_slice(), value); - let name_atom = Atom::from_slice(name.as_slice()); - self.do_set_attribute(name.clone(), value, name_atom.clone(), namespace::Null, None, |attr| { - attr.deref().name == name_atom + let name = Atom::from_slice(name.as_slice()); + let value = self.parse_attribute(&namespace::Null, &name, value); + self.do_set_attribute(name.clone(), value, name.clone(), namespace::Null, None, |attr| { + attr.deref().name.as_slice() == name.as_slice() }); Ok(()) } @@ -639,6 +642,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { } let name = Atom::from_slice(name.as_slice()); + let local_name = Atom::from_slice(local_name); let xmlns = Atom::from_slice("xmlns"); // TODO: Make this a static atom type // Step 7a. @@ -652,12 +656,12 @@ impl<'a> ElementMethods for JSRef<'a, Element> { } // Step 9. - let value = self.parse_attribute(&namespace, local_name.as_slice(), value); - self.do_set_attribute(local_name.to_string(), value, name, + let value = self.parse_attribute(&namespace, &local_name, value); + self.do_set_attribute(local_name.clone(), value, name, namespace.clone(), prefix.map(|s| s.to_string()), |attr| { - attr.deref().local_name.as_slice() == local_name && - attr.deref().namespace == namespace + *attr.local_name() == local_name && + attr.namespace == namespace }); Ok(()) } @@ -803,9 +807,9 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { Some(node as &VirtualMethods) } - fn after_set_attr(&self, name: DOMString, value: DOMString) { + fn after_set_attr(&self, name: &Atom, value: DOMString) { match self.super_type() { - Some(ref s) => s.after_set_attr(name.clone(), value.clone()), + Some(ref s) => s.after_set_attr(name, value.clone()), _ => (), } @@ -829,9 +833,9 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { self.notify_attribute_changed(name); } - fn before_remove_attr(&self, name: DOMString, value: DOMString) { + fn before_remove_attr(&self, name: &Atom, value: DOMString) { match self.super_type() { - Some(ref s) => s.before_remove_attr(name.clone(), value.clone()), + Some(ref s) => s.before_remove_attr(name, value.clone()), _ => (), } |