aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlformelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlformelement.rs')
-rw-r--r--components/script/dom/htmlformelement.rs92
1 files changed, 37 insertions, 55 deletions
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index bf59dc0280b..adbb790a181 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -62,10 +62,10 @@ use mime::{self, Mime};
use net_traits::http_percent_encode;
use net_traits::request::Referrer;
use script_traits::{HistoryEntryReplacement, LoadData, LoadOrigin};
+use servo_atoms::Atom;
use servo_rand::random;
use std::borrow::ToOwned;
use std::cell::Cell;
-use style::attr::AttrValue;
use style::str::split_html_space_chars;
use crate::dom::bindings::codegen::UnionTypes::RadioNodeListOrElement;
@@ -86,7 +86,7 @@ pub struct HTMLFormElement {
elements: DomOnceCell<HTMLFormControlsCollection>,
generation_id: Cell<GenerationId>,
controls: DomRefCell<Vec<Dom<Element>>>,
- past_names_map: DomRefCell<HashMap<DOMString, (Dom<Element>, Tm)>>,
+ past_names_map: DomRefCell<HashMap<Atom, (Dom<Element>, Tm)>>,
}
impl HTMLFormElement {
@@ -119,7 +119,7 @@ impl HTMLFormElement {
)
}
- fn filter_for_radio_list(mode: RadioListMode, child: &Element, name: &DOMString) -> bool {
+ fn filter_for_radio_list(mode: RadioListMode, child: &Element, name: &Atom) -> bool {
if let Some(child) = child.downcast::<Element>() {
match mode {
RadioListMode::ControlsExceptImageInputs => {
@@ -127,10 +127,8 @@ impl HTMLFormElement {
.downcast::<HTMLElement>()
.map_or(false, |c| c.is_listed_element())
{
- if (child.has_attribute(&local_name!("id")) &&
- child.get_string_attribute(&local_name!("id")) == *name) ||
- (child.has_attribute(&local_name!("name")) &&
- child.get_string_attribute(&local_name!("name")) == *name)
+ if child.get_id().map_or(false, |i| i == *name) ||
+ child.get_name().map_or(false, |n| n == *name)
{
if let Some(inp) = child.downcast::<HTMLInputElement>() {
// input, only return it if it's not image-button state
@@ -144,16 +142,9 @@ impl HTMLFormElement {
return false;
},
RadioListMode::Images => {
- if child.is::<HTMLImageElement>() {
- if (child.has_attribute(&local_name!("id")) &&
- child.get_string_attribute(&local_name!("id")) == *name) ||
- (child.has_attribute(&local_name!("name")) &&
- child.get_string_attribute(&local_name!("name")) == *name)
- {
- return true;
- }
- }
- return false;
+ return child.is::<HTMLImageElement>() &&
+ (child.get_id().map_or(false, |i| i == *name) ||
+ child.get_name().map_or(false, |n| n == *name));
},
}
}
@@ -164,7 +155,7 @@ impl HTMLFormElement {
&self,
index: u32,
mode: RadioListMode,
- name: &DOMString,
+ name: &Atom,
) -> Option<DomRoot<Node>> {
self.controls
.borrow()
@@ -174,7 +165,7 @@ impl HTMLFormElement {
.and_then(|n| Some(DomRoot::from_ref(n.upcast::<Node>())))
}
- pub fn count_for_radio_list(&self, mode: RadioListMode, name: &DOMString) -> u32 {
+ pub fn count_for_radio_list(&self, mode: RadioListMode, name: &Atom) -> u32 {
self.controls
.borrow()
.iter()
@@ -333,14 +324,15 @@ impl HTMLFormElementMethods for HTMLFormElement {
fn NamedGetter(&self, name: DOMString) -> Option<RadioNodeListOrElement> {
let window = window_from_node(self);
+ let name = Atom::from(name);
+
// Step 1
- let mut candidates =
- RadioNodeList::new_controls_except_image_inputs(&window, self, name.clone());
+ let mut candidates = RadioNodeList::new_controls_except_image_inputs(&window, self, &name);
let mut candidates_length = candidates.Length();
// Step 2
if candidates_length == 0 {
- candidates = RadioNodeList::new_images(&window, self, name.clone());
+ candidates = RadioNodeList::new_images(&window, self, &name);
candidates_length = candidates.Length();
}
@@ -399,12 +391,12 @@ impl HTMLFormElementMethods for HTMLFormElement {
}
struct SourcedName {
- name: DOMString,
+ name: Atom,
element: DomRoot<Element>,
source: SourcedNameSource,
}
- let mut sourcedNamesVec: Vec<SourcedName> = Vec::new();
+ let mut sourced_names_vec: Vec<SourcedName> = Vec::new();
let controls = self.controls.borrow();
@@ -414,21 +406,21 @@ impl HTMLFormElementMethods for HTMLFormElement {
.downcast::<HTMLElement>()
.map_or(false, |c| c.is_listed_element())
{
- if child.has_attribute(&local_name!("id")) {
+ if let Some(id_atom) = child.get_id() {
let entry = SourcedName {
- name: child.get_string_attribute(&local_name!("id")),
+ name: id_atom,
element: DomRoot::from_ref(&*child),
source: SourcedNameSource::Id,
};
- sourcedNamesVec.push(entry);
+ sourced_names_vec.push(entry);
}
- if child.has_attribute(&local_name!("name")) {
+ if let Some(name_atom) = child.get_name() {
let entry = SourcedName {
- name: child.get_string_attribute(&local_name!("name")),
+ name: name_atom,
element: DomRoot::from_ref(&*child),
source: SourcedNameSource::Name,
};
- sourcedNamesVec.push(entry);
+ sourced_names_vec.push(entry);
}
}
}
@@ -436,21 +428,21 @@ impl HTMLFormElementMethods for HTMLFormElement {
// Step 3
for child in controls.iter() {
if child.is::<HTMLImageElement>() {
- if child.has_attribute(&local_name!("id")) {
+ if let Some(id_atom) = child.get_id() {
let entry = SourcedName {
- name: child.get_string_attribute(&local_name!("id")),
+ name: id_atom,
element: DomRoot::from_ref(&*child),
source: SourcedNameSource::Id,
};
- sourcedNamesVec.push(entry);
+ sourced_names_vec.push(entry);
}
- if child.has_attribute(&local_name!("name")) {
+ if let Some(name_atom) = child.get_name() {
let entry = SourcedName {
- name: child.get_string_attribute(&local_name!("name")),
+ name: name_atom,
element: DomRoot::from_ref(&*child),
source: SourcedNameSource::Name,
};
- sourcedNamesVec.push(entry);
+ sourced_names_vec.push(entry);
}
}
}
@@ -463,7 +455,7 @@ impl HTMLFormElementMethods for HTMLFormElement {
element: DomRoot::from_ref(&*val.0),
source: SourcedNameSource::Past(now() - val.1), // calculate difference now()-val.1 to find age
};
- sourcedNamesVec.push(entry);
+ sourced_names_vec.push(entry);
}
// Step 5
@@ -477,7 +469,7 @@ impl HTMLFormElementMethods for HTMLFormElement {
// (this can be checked by bitwise operations) then b would follow a in tree order and
// Ordering::Less should be returned in the closure else Ordering::Greater
- sourcedNamesVec.sort_by(|a, b| {
+ sourced_names_vec.sort_by(|a, b| {
if a.element
.upcast::<Node>()
.CompareDocumentPosition(b.element.upcast::<Node>()) ==
@@ -503,21 +495,21 @@ impl HTMLFormElementMethods for HTMLFormElement {
});
// Step 6
- sourcedNamesVec.retain(|sn| !sn.name.to_string().is_empty());
+ sourced_names_vec.retain(|sn| !sn.name.to_string().is_empty());
// Step 7-8
- let mut namesVec: Vec<DOMString> = Vec::new();
- for elem in sourcedNamesVec.iter() {
- if namesVec
+ let mut names_vec: Vec<DOMString> = Vec::new();
+ for elem in sourced_names_vec.iter() {
+ if names_vec
.iter()
- .find(|name| name.to_string() == elem.name.to_string())
+ .find(|name| &**name == &*elem.name)
.is_none()
{
- namesVec.push(elem.name.clone());
+ names_vec.push(DOMString::from(&*elem.name));
}
}
- return namesVec;
+ return names_vec;
}
}
@@ -1519,16 +1511,6 @@ impl VirtualMethods for HTMLFormElement {
Some(self.upcast::<HTMLElement>() as &dyn VirtualMethods)
}
- fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
- match name {
- &local_name!("name") => AttrValue::from_atomic(value.into()),
- _ => self
- .super_type()
- .unwrap()
- .parse_plain_attribute(name, value),
- }
- }
-
fn unbind_from_tree(&self, context: &UnbindContext) {
self.super_type().unwrap().unbind_from_tree(context);