diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 6468aca641c..9ecb10641b4 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -299,13 +299,27 @@ impl AttributeHandlers for JS { // http://dom.spec.whatwg.org/#dom-element-setattribute fn SetAttribute(&mut self, name: DOMString, value: DOMString) -> ErrorResult { - // FIXME: If name does not match the Name production in XML, throw an "InvalidCharacterError" exception. + let node: JS = NodeCast::from(self); + node.get().wait_until_safe_to_modify_dom(); + + // Step 1. + match xml_name_type(name) { + InvalidXMLName => return Err(InvalidCharacter), + _ => {} + } + + // Step 2. let name = if self.get().html_element_in_html_document() { name.to_ascii_lower() } else { name }; - self.set_attr(name, value) + + // Step 3-5. + self.do_set_attribute(name.clone(), value, name.clone(), namespace::Null, None, |attr| { + attr.get().name == name + }); + Ok(()) } fn SetAttributeNS(&mut self, namespace_url: Option, diff --git a/src/test/content/test_element_attribute.html b/src/test/content/test_element_attribute.html index 8631138c767..7455f36bffb 100644 --- a/src/test/content/test_element_attribute.html +++ b/src/test/content/test_element_attribute.html @@ -41,6 +41,15 @@ is(r2, null, "test4-1, Element.removeAttribute()."); } + { + test.setAttribute("xml:lang", "en"); + + let r1 = test.hasAttribute("xml:lang"); + is(r1, true, "test5-0, Element.setAttribute('xml:lang')."); + let r2 = test.getAttribute("xml:lang"); + is_not(r2, null, "test5-1, Element.setAttribute('xml:lang')."); + } + finish();