diff options
author | bors-servo <metajack+bors@gmail.com> | 2014-12-25 02:27:43 -0700 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2014-12-25 02:27:43 -0700 |
commit | 0e6304dcf7fd6712f4455151b55a361de857359d (patch) | |
tree | 43e2213c1c6b68027f719b14e58cb441b9fbdb7e /components/script/dom/element.rs | |
parent | 57b6dc939734553287a02e3a42241715266995d5 (diff) | |
parent | 919f2217f0b67290b8dafd7d9ce53547f61f3d08 (diff) | |
download | servo-0e6304dcf7fd6712f4455151b55a361de857359d.tar.gz servo-0e6304dcf7fd6712f4455151b55a361de857359d.zip |
auto merge of #4467 : servo/servo/dataset, r=Ms2ger
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index ca2d6109f12..52a16fc6ea4 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -465,6 +465,7 @@ pub enum StylePriority { pub trait ElementHelpers<'a> { fn html_element_in_html_document(self) -> bool; fn local_name(self) -> &'a Atom; + fn parsed_name(self, name: DOMString) -> DOMString; fn namespace(self) -> &'a Namespace; fn prefix(self) -> &'a Option<DOMString>; fn attrs(&self) -> Ref<Vec<JS<Attr>>>; @@ -488,6 +489,15 @@ impl<'a> ElementHelpers<'a> for JSRef<'a, Element> { &self.extended_deref().local_name } + // https://dom.spec.whatwg.org/#concept-element-attributes-get-by-name + fn parsed_name(self, name: DOMString) -> DOMString { + if self.html_element_in_html_document() { + name.as_slice().to_ascii_lower() + } else { + name + } + } + fn namespace(self) -> &'a Namespace { &self.extended_deref().namespace } @@ -626,6 +636,7 @@ pub trait AttributeHandlers { value: DOMString, prefix: Option<DOMString>); fn set_attribute(self, name: &Atom, value: AttrValue); + fn set_custom_attribute(self, name: DOMString, value: DOMString) -> ErrorResult; fn do_set_attribute(self, local_name: Atom, value: AttrValue, name: Atom, namespace: Namespace, prefix: Option<DOMString>, cb: |JSRef<Attr>| -> bool); @@ -695,6 +706,23 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { ns!(""), None, |attr| *attr.local_name() == *name); } + // https://html.spec.whatwg.org/multipage/dom.html#attr-data-* + fn set_custom_attribute(self, name: DOMString, value: DOMString) -> ErrorResult { + // Step 1. + match xml_name_type(name.as_slice()) { + InvalidXMLName => return Err(InvalidCharacter), + _ => {} + } + + // Steps 2-5. + let name = Atom::from_slice(name.as_slice()); + let value = self.parse_attribute(&ns!(""), &name, value); + self.do_set_attribute(name.clone(), value, name.clone(), ns!(""), None, |attr| { + *attr.name() == name && *attr.namespace() == ns!("") + }); + Ok(()) + } + fn do_set_attribute(self, local_name: Atom, value: AttrValue, name: Atom, namespace: Namespace, prefix: Option<DOMString>, cb: |JSRef<Attr>| -> bool) { @@ -919,11 +947,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dom.spec.whatwg.org/#dom-element-getattribute fn GetAttribute(self, name: DOMString) -> Option<DOMString> { - let name = if self.html_element_in_html_document() { - name.as_slice().to_ascii_lower() - } else { - name - }; + let name = self.parsed_name(name); self.get_attribute(ns!(""), &Atom::from_slice(name.as_slice())).root() .map(|s| s.Value()) } @@ -948,17 +972,13 @@ impl<'a> ElementMethods for JSRef<'a, Element> { } // Step 2. - let name = if self.html_element_in_html_document() { - name.as_slice().to_ascii_lower() - } else { - name - }; + let name = self.parsed_name(name); // Step 3-5. let name = Atom::from_slice(name.as_slice()); let value = self.parse_attribute(&ns!(""), &name, value); self.do_set_attribute(name.clone(), value, name.clone(), ns!(""), None, |attr| { - attr.name().as_slice() == name.as_slice() + *attr.name() == name }); Ok(()) } @@ -1029,11 +1049,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dom.spec.whatwg.org/#dom-element-removeattribute fn RemoveAttribute(self, name: DOMString) { - let name = if self.html_element_in_html_document() { - name.as_slice().to_ascii_lower() - } else { - name - }; + let name = self.parsed_name(name); self.remove_attribute(ns!(""), name.as_slice()) } |