diff options
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 016ba9a87c1..f69392a4126 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -28,7 +28,8 @@ use dom::bindings::codegen::InheritTypes::HTMLFormElementDerived; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::error::Error::{NamespaceError, InvalidCharacter, Syntax}; use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable}; -use dom::bindings::js::{OptionalRootable, Root}; +use dom::bindings::js::OptionalRootable; +use dom::bindings::trace::RootedVec; use dom::bindings::utils::xml_name_type; use dom::bindings::utils::XMLName::{QName, Name, InvalidXMLName}; use dom::create::create_element; @@ -566,7 +567,7 @@ impl<'a> ElementHelpers<'a> for JSRef<'a, Element> { declarations.normal .iter() .chain(declarations.important.iter()) - .find(|decl| decl.matches(property.as_slice())) + .find(|decl| decl.matches(&property)) .map(|decl| decl.clone()) }) } @@ -576,7 +577,7 @@ impl<'a> ElementHelpers<'a> for JSRef<'a, Element> { inline_declarations.as_ref().and_then(|declarations| { declarations.important .iter() - .find(|decl| decl.matches(property.as_slice())) + .find(|decl| decl.matches(&property)) .map(|decl| decl.clone()) }) } @@ -679,7 +680,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { None => qname.local.clone(), Some(ref prefix) => { let name = format!("{}:{}", *prefix, qname.local.as_slice()); - Atom::from_slice(name.as_slice()) + Atom::from_slice(&name) }, }; let value = self.parse_attribute(&qname.ns, &qname.local, value); @@ -687,8 +688,8 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } fn set_attribute(self, name: &Atom, value: AttrValue) { - assert!(name.as_slice() == name.as_slice().to_ascii_lowercase().as_slice()); - assert!(!name.as_slice().contains(":")); + assert!(name.as_slice() == name.to_ascii_lowercase()); + assert!(!name.contains(":")); self.do_set_attribute(name.clone(), value, name.clone(), ns!(""), None, |attr| attr.local_name() == name); @@ -697,7 +698,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { // 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()) { + match xml_name_type(&name) { InvalidXMLName => return Err(InvalidCharacter), _ => {} } @@ -784,7 +785,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { }; 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()) + Quirks => lhs.eq_ignore_ascii_case(&rhs) }; self.get_attribute(ns!(""), &atom!("class")).root().map(|attr| { // FIXME(https://github.com/rust-lang/rust/issues/23338) @@ -797,13 +798,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } fn set_atomic_attribute(self, name: &Atom, value: DOMString) { - assert!(name.as_slice().eq_ignore_ascii_case(name.as_slice())); + assert!(name.as_slice() == name.to_ascii_lowercase()); let value = AttrValue::from_atomic(value); self.set_attribute(name, value); } fn has_attribute(self, name: &Atom) -> bool { - assert!(name.as_slice().bytes().all(|b| b.to_ascii_lowercase() == b)); + assert!(name.bytes().all(|b| b.to_ascii_lowercase() == b)); // FIXME(https://github.com/rust-lang/rust/issues/23338) let attrs = self.attrs.borrow(); attrs.iter().map(|attr| attr.root()).any(|attr| { @@ -820,12 +821,12 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { if value { self.set_string_attribute(name, String::new()); } else { - self.remove_attribute(ns!(""), name.as_slice()); + self.remove_attribute(ns!(""), &name); } } fn get_url_attribute(self, name: &Atom) -> DOMString { - assert!(name.as_slice() == name.as_slice().to_ascii_lowercase().as_slice()); + assert!(name.as_slice() == name.to_ascii_lowercase()); if !self.has_attribute(name) { return "".to_owned(); } @@ -834,7 +835,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { let base = doc.r().url(); // https://html.spec.whatwg.org/multipage/infrastructure.html#reflect // XXXManishearth this doesn't handle `javascript:` urls properly - match UrlParser::new().base_url(&base).parse(url.as_slice()) { + match UrlParser::new().base_url(&base).parse(&url) { Ok(parsed) => parsed.serialize(), Err(_) => "".to_owned() } @@ -850,7 +851,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } } fn set_string_attribute(self, name: &Atom, value: DOMString) { - assert!(name.as_slice() == name.as_slice().to_ascii_lowercase().as_slice()); + assert!(name.as_slice() == name.to_ascii_lowercase()); self.set_attribute(name, AttrValue::String(value)); } @@ -866,17 +867,17 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } fn set_tokenlist_attribute(self, name: &Atom, value: DOMString) { - assert!(name.as_slice() == name.as_slice().to_ascii_lowercase().as_slice()); + assert!(name.as_slice() == name.to_ascii_lowercase()); self.set_attribute(name, AttrValue::from_serialized_tokenlist(value)); } fn set_atomic_tokenlist_attribute(self, name: &Atom, tokens: Vec<Atom>) { - assert!(name.as_slice() == name.as_slice().to_ascii_lowercase().as_slice()); + assert!(name.as_slice() == name.to_ascii_lowercase()); self.set_attribute(name, AttrValue::from_atomic_tokens(tokens)); } fn get_uint_attribute(self, name: &Atom) -> u32 { - assert!(name.as_slice().chars().all(|ch| { + assert!(name.chars().all(|ch| { !ch.is_ascii() || ch.to_ascii_lowercase() == ch })); let attribute = self.get_attribute(ns!(""), name).root(); @@ -892,7 +893,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } } fn set_uint_attribute(self, name: &Atom, value: u32) { - assert!(name.as_slice() == name.as_slice().to_ascii_lowercase().as_slice()); + assert!(name.as_slice() == name.to_ascii_lowercase()); self.set_attribute(name, AttrValue::UInt(value.to_string(), value)); } } @@ -1114,17 +1115,18 @@ impl<'a> ElementMethods for JSRef<'a, Element> { fn GetClientRects(self) -> Temporary<DOMRectList> { let win = window_from_node(self).root(); let node: JSRef<Node> = NodeCast::from_ref(self); - let rects = node.get_content_boxes(); - let rects: Vec<Root<DOMRect>> = rects.iter().map(|r| { - DOMRect::new( - win.r(), - r.origin.y, - r.origin.y + r.size.height, - r.origin.x, - r.origin.x + r.size.width).root() - }).collect(); + let raw_rects = node.get_content_boxes(); + let mut rects = RootedVec::new(); + for rect in raw_rects.iter() { + let rect = DOMRect::new(win.r(), + rect.origin.y, + rect.origin.y + rect.size.height, + rect.origin.x, + rect.origin.x + rect.size.width); + rects.push(JS::from_rooted(rect)); + } - DOMRectList::new(win.r(), rects.iter().map(|rect| rect.r()).collect()) + DOMRectList::new(win.r(), &rects) } // http://dev.w3.org/csswg/cssom-view/#dom-element-getboundingclientrect @@ -1380,7 +1382,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { let doc = document_from_node(*self).root(); let value = attr.r().Value(); if !value.is_empty() { - let value = Atom::from_slice(value.as_slice()); + let value = Atom::from_slice(&value); doc.r().register_named_element(*self, value); } } @@ -1397,7 +1399,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { let doc = document_from_node(*self).root(); let value = attr.r().Value(); if !value.is_empty() { - let value = Atom::from_slice(value.as_slice()); + let value = Atom::from_slice(&value); doc.r().unregister_named_element(*self, value); } } |