diff options
author | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2015-01-12 10:50:45 -0400 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2015-01-12 17:38:13 -0400 |
commit | 9da761fc64a31b7a45fa21fad0fd43669366dcc2 (patch) | |
tree | 00376bb40bbeb661b8ac576fe28ac606349a34eb /components/script | |
parent | a227faa41610cdc826da4ec8d25839c2ec3061db (diff) | |
download | servo-9da761fc64a31b7a45fa21fad0fd43669366dcc2.tar.gz servo-9da761fc64a31b7a45fa21fad0fd43669366dcc2.zip |
Check quirks mode in {Document,Element}::getElementsByClassName
Fixes #4604.
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/element.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index df99f4dc91d..129756c1575 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -55,6 +55,8 @@ use style::{IntegerAttribute, LengthAttribute, ParserContext, matches}; use servo_util::namespace; use servo_util::str::{DOMString, LengthOrPercentageOrAuto}; +use html5ever::tree_builder::{NoQuirks, LimitedQuirks, Quirks}; + use cssparser::RGBA; use std::ascii::AsciiExt; use std::cell::{Ref, RefMut}; @@ -571,7 +573,7 @@ pub trait AttributeHandlers { value: DOMString) -> AttrValue; fn remove_attribute(self, namespace: Namespace, name: &str); - fn has_class(&self, name: &Atom) -> bool; + fn has_class(self, name: &Atom) -> bool; fn set_atomic_attribute(self, name: &Atom, value: DOMString); @@ -713,10 +715,19 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { }; } - fn has_class(&self, name: &Atom) -> bool { + fn has_class(self, name: &Atom) -> bool { + let quirks_mode = { + let node: JSRef<Node> = NodeCast::from_ref(self); + let owner_doc = node.owner_doc().root(); + owner_doc.r().quirks_mode() + }; + let is_equal = |lhs: &Atom, rhs: &Atom| match quirks_mode { + NoQuirks | LimitedQuirks => lhs == rhs, + Quirks => lhs.as_slice().eq_ignore_ascii_case(rhs.as_slice()) + }; self.get_attribute(ns!(""), &atom!("class")).root().map(|attr| { attr.r().value().tokens().map(|tokens| { - tokens.iter().any(|atom| atom == name) + tokens.iter().any(|atom| is_equal(name, atom)) }).unwrap_or(false) }).unwrap_or(false) } |