aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorJonathan Kingston <jonathan@jooped.co.uk>2018-06-21 02:01:02 +0100
committerJonathan Kingston <jonathan@jooped.co.uk>2018-06-21 02:06:32 +0100
commita271c615f7239bbede05b29d80474ad5323af362 (patch)
treebae0e984a2682bf2018a122b46ca668958ce46ad /components/script
parent0226a1a4add1bc2b79a0bdba1f725e00ce854937 (diff)
downloadservo-a271c615f7239bbede05b29d80474ad5323af362.tar.gz
servo-a271c615f7239bbede05b29d80474ad5323af362.zip
Implement support for Element.toggleAttribute
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/element.rs37
-rw-r--r--components/script/dom/webidls/Element.webidl2
2 files changed, 39 insertions, 0 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 00a2fee7513..547367e2f36 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -1680,6 +1680,43 @@ impl ElementMethods for Element {
self.get_attribute(namespace, &LocalName::from(local_name))
}
+ // https://dom.spec.whatwg.org/#dom-element-toggleattribute
+ fn ToggleAttribute(&self, name: DOMString, force: Option<bool>) -> Fallible<bool> {
+ // Step 1.
+ if xml_name_type(&name) == InvalidXMLName {
+ return Err(Error::InvalidCharacter);
+ }
+
+ // Step 3.
+ let attribute = self.GetAttribute(name.clone());
+
+ // Step 2.
+ let name = self.parsed_name(name);
+ match attribute {
+ // Step 4
+ None => match force {
+ // Step 4.1.
+ None | Some(true) => {
+ self.set_first_matching_attribute(
+ name.clone(), AttrValue::String(String::new()), name.clone(), ns!(), None,
+ |attr| *attr.name() == name);
+ Ok(true)
+ },
+ // Step 4.2.
+ Some(false) => Ok(false),
+ },
+ Some(_index) => match force {
+ // Step 5.
+ None | Some(false) => {
+ self.remove_attribute_by_name(&name);
+ Ok(false)
+ },
+ // Step 6.
+ Some(true) => Ok(true),
+ },
+ }
+ }
+
// https://dom.spec.whatwg.org/#dom-element-setattribute
fn SetAttribute(&self, name: DOMString, value: DOMString) -> ErrorResult {
// Step 1.
diff --git a/components/script/dom/webidls/Element.webidl b/components/script/dom/webidls/Element.webidl
index 5233bcf2cc9..48f7f25414e 100644
--- a/components/script/dom/webidls/Element.webidl
+++ b/components/script/dom/webidls/Element.webidl
@@ -41,6 +41,8 @@ interface Element : Node {
[Pure]
DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
[CEReactions, Throws]
+ boolean toggleAttribute(DOMString name, optional boolean force);
+ [CEReactions, Throws]
void setAttribute(DOMString name, DOMString value);
[CEReactions, Throws]
void setAttributeNS(DOMString? namespace, DOMString name, DOMString value);