aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno.d@partner.samsung.com>2014-08-25 13:35:44 -0400
committerBruno de Oliveira Abinader <bruno.d@partner.samsung.com>2014-08-25 13:58:42 -0400
commitcaa55bf9edd425abe58336248a45a89c10d81eb0 (patch)
tree21d5eb716a589a14fb557e472ff7428fc8f7dd2e /src/components/script/dom
parentd17450106c3c55c42cbfc78fe7b13dc5e46c9060 (diff)
downloadservo-caa55bf9edd425abe58336248a45a89c10d81eb0.tar.gz
servo-caa55bf9edd425abe58336248a45a89c10d81eb0.zip
Implement DOMTokenList.contains
Diffstat (limited to 'src/components/script/dom')
-rw-r--r--src/components/script/dom/domtokenlist.rs23
-rw-r--r--src/components/script/dom/webidls/DOMTokenList.webidl5
2 files changed, 26 insertions, 2 deletions
diff --git a/src/components/script/dom/domtokenlist.rs b/src/components/script/dom/domtokenlist.rs
index cf44d5f7abc..3d252d36731 100644
--- a/src/components/script/dom/domtokenlist.rs
+++ b/src/components/script/dom/domtokenlist.rs
@@ -5,14 +5,16 @@
use dom::attr::{Attr, TokenListAttrValue};
use dom::bindings::codegen::Bindings::DOMTokenListBinding;
use dom::bindings::codegen::Bindings::DOMTokenListBinding::DOMTokenListMethods;
+use dom::bindings::error::{Fallible, InvalidCharacter, Syntax};
use dom::bindings::global::Window;
use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable};
use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object};
use dom::element::{Element, AttributeHandlers};
use dom::node::window_from_node;
+use servo_util::atom::Atom;
use servo_util::namespace::Null;
-use servo_util::str::DOMString;
+use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS};
#[deriving(Encodable)]
pub struct DOMTokenList {
@@ -47,6 +49,7 @@ impl Reflectable for DOMTokenList {
trait PrivateDOMTokenListHelpers {
fn attribute(&self) -> Option<Temporary<Attr>>;
+ fn check_token_exceptions<'a>(&self, token: &'a str) -> Fallible<&'a str>;
}
impl<'a> PrivateDOMTokenListHelpers for JSRef<'a, DOMTokenList> {
@@ -54,6 +57,14 @@ impl<'a> PrivateDOMTokenListHelpers for JSRef<'a, DOMTokenList> {
let element = self.element.root();
element.deref().get_attribute(Null, self.local_name)
}
+
+ fn check_token_exceptions<'a>(&self, token: &'a str) -> Fallible<&'a str> {
+ match token {
+ "" => Err(Syntax),
+ token if token.find(HTML_SPACE_CHARACTERS).is_some() => Err(InvalidCharacter),
+ token => Ok(token)
+ }
+ }
}
// http://dom.spec.whatwg.org/#domtokenlist
@@ -92,4 +103,14 @@ impl<'a> DOMTokenListMethods for JSRef<'a, DOMTokenList> {
*found = item.is_some();
item
}
+
+ // http://dom.spec.whatwg.org/#dom-domtokenlist-contains
+ fn Contains(&self, token: DOMString) -> Fallible<bool> {
+ self.check_token_exceptions(token.as_slice()).map(|slice| {
+ self.attribute().root().and_then(|attr| attr.value().tokens().map(|mut tokens| {
+ let atom = Atom::from_slice(slice);
+ tokens.any(|token| *token == atom)
+ })).unwrap_or(false)
+ })
+ }
}
diff --git a/src/components/script/dom/webidls/DOMTokenList.webidl b/src/components/script/dom/webidls/DOMTokenList.webidl
index 650d8abf6c6..bc32f4bf256 100644
--- a/src/components/script/dom/webidls/DOMTokenList.webidl
+++ b/src/components/script/dom/webidls/DOMTokenList.webidl
@@ -7,7 +7,10 @@
interface DOMTokenList {
readonly attribute unsigned long length;
getter DOMString? item(unsigned long index);
- //boolean contains(DOMString token);
+
+ [Throws]
+ boolean contains(DOMString token);
+
//void add(DOMString... tokens);
//void remove(DOMString... tokens);
//boolean toggle(DOMString token, optional boolean force);