aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2014-12-25 02:27:43 -0700
committerbors-servo <metajack+bors@gmail.com>2014-12-25 02:27:43 -0700
commit0e6304dcf7fd6712f4455151b55a361de857359d (patch)
tree43e2213c1c6b68027f719b14e58cb441b9fbdb7e /components/script/dom/element.rs
parent57b6dc939734553287a02e3a42241715266995d5 (diff)
parent919f2217f0b67290b8dafd7d9ce53547f61f3d08 (diff)
downloadservo-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.rs48
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())
}