mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
hidden field named _charset_ now appears in FormData as UTF-8 to fix #25150
This commit is contained in:
parent
e8d677ad26
commit
7f41b1b294
4 changed files with 44 additions and 18 deletions
|
@ -55,7 +55,7 @@ impl FormData {
|
||||||
form: Option<&HTMLFormElement>,
|
form: Option<&HTMLFormElement>,
|
||||||
) -> Fallible<DomRoot<FormData>> {
|
) -> Fallible<DomRoot<FormData>> {
|
||||||
if let Some(opt_form) = form {
|
if let Some(opt_form) = form {
|
||||||
return match opt_form.get_form_dataset(None) {
|
return match opt_form.get_form_dataset(None, None) {
|
||||||
Some(form_datums) => Ok(FormData::new(Some(form_datums), global)),
|
Some(form_datums) => Ok(FormData::new(Some(form_datums), global)),
|
||||||
None => Err(Error::InvalidState),
|
None => Err(Error::InvalidState),
|
||||||
};
|
};
|
||||||
|
|
|
@ -357,7 +357,7 @@ impl HTMLFormElement {
|
||||||
let encoding = self.pick_encoding();
|
let encoding = self.pick_encoding();
|
||||||
|
|
||||||
// Step 9
|
// Step 9
|
||||||
let mut form_data = match self.get_form_dataset(Some(submitter)) {
|
let mut form_data = match self.get_form_dataset(Some(submitter), Some(encoding)) {
|
||||||
Some(form_data) => form_data,
|
Some(form_data) => form_data,
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
@ -645,8 +645,14 @@ impl HTMLFormElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set>
|
/// <https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set>
|
||||||
|
/// terminology note: "form data set" = "entry list"
|
||||||
/// Steps range from 3 to 5
|
/// Steps range from 3 to 5
|
||||||
fn get_unclean_dataset(&self, submitter: Option<FormSubmitter>) -> Vec<FormDatum> {
|
/// 5.x substeps are mostly handled inside element-specific methods
|
||||||
|
fn get_unclean_dataset(
|
||||||
|
&self,
|
||||||
|
submitter: Option<FormSubmitter>,
|
||||||
|
encoding: Option<&'static Encoding>,
|
||||||
|
) -> Vec<FormDatum> {
|
||||||
let controls = self.controls.borrow();
|
let controls = self.controls.borrow();
|
||||||
let mut data_set = Vec::new();
|
let mut data_set = Vec::new();
|
||||||
for child in controls.iter() {
|
for child in controls.iter() {
|
||||||
|
@ -668,7 +674,7 @@ impl HTMLFormElement {
|
||||||
HTMLElementTypeId::HTMLInputElement => {
|
HTMLElementTypeId::HTMLInputElement => {
|
||||||
let input = child.downcast::<HTMLInputElement>().unwrap();
|
let input = child.downcast::<HTMLInputElement>().unwrap();
|
||||||
|
|
||||||
data_set.append(&mut input.form_datums(submitter));
|
data_set.append(&mut input.form_datums(submitter, encoding));
|
||||||
},
|
},
|
||||||
HTMLElementTypeId::HTMLButtonElement => {
|
HTMLElementTypeId::HTMLButtonElement => {
|
||||||
let button = child.downcast::<HTMLButtonElement>().unwrap();
|
let button = child.downcast::<HTMLButtonElement>().unwrap();
|
||||||
|
@ -705,7 +711,11 @@ impl HTMLFormElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set>
|
/// <https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set>
|
||||||
pub fn get_form_dataset(&self, submitter: Option<FormSubmitter>) -> Option<Vec<FormDatum>> {
|
pub fn get_form_dataset(
|
||||||
|
&self,
|
||||||
|
submitter: Option<FormSubmitter>,
|
||||||
|
encoding: Option<&'static Encoding>,
|
||||||
|
) -> Option<Vec<FormDatum>> {
|
||||||
fn clean_crlf(s: &str) -> DOMString {
|
fn clean_crlf(s: &str) -> DOMString {
|
||||||
// Step 4
|
// Step 4
|
||||||
let mut buf = "".to_owned();
|
let mut buf = "".to_owned();
|
||||||
|
@ -746,7 +756,7 @@ impl HTMLFormElement {
|
||||||
self.constructing_entry_list.set(true);
|
self.constructing_entry_list.set(true);
|
||||||
|
|
||||||
// Step 3-6
|
// Step 3-6
|
||||||
let mut ret = self.get_unclean_dataset(submitter);
|
let mut ret = self.get_unclean_dataset(submitter, encoding);
|
||||||
for datum in &mut ret {
|
for datum in &mut ret {
|
||||||
match &*datum.ty {
|
match &*datum.ty {
|
||||||
"file" | "textarea" => (), // TODO
|
"file" | "textarea" => (), // TODO
|
||||||
|
|
|
@ -49,6 +49,7 @@ use crate::textinput::{Direction, SelectionDirection, TextInput, UTF16CodeUnits,
|
||||||
use caseless::compatibility_caseless_match_str;
|
use caseless::compatibility_caseless_match_str;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use embedder_traits::FilterPattern;
|
use embedder_traits::FilterPattern;
|
||||||
|
use encoding_rs::Encoding;
|
||||||
use html5ever::{LocalName, Prefix};
|
use html5ever::{LocalName, Prefix};
|
||||||
use msg::constellation_msg::InputMethodType;
|
use msg::constellation_msg::InputMethodType;
|
||||||
use net_traits::blob_url_store::get_blob_origin;
|
use net_traits::blob_url_store::get_blob_origin;
|
||||||
|
@ -929,14 +930,18 @@ impl HTMLInputElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set>
|
/// <https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set>
|
||||||
/// Steps range from 3.1 to 3.7 (specific to HTMLInputElement)
|
/// Steps range from 5.1 to 5.10 (specific to HTMLInputElement)
|
||||||
pub fn form_datums(&self, submitter: Option<FormSubmitter>) -> Vec<FormDatum> {
|
pub fn form_datums(
|
||||||
|
&self,
|
||||||
|
submitter: Option<FormSubmitter>,
|
||||||
|
encoding: Option<&'static Encoding>,
|
||||||
|
) -> Vec<FormDatum> {
|
||||||
// 3.1: disabled state check is in get_unclean_dataset
|
// 3.1: disabled state check is in get_unclean_dataset
|
||||||
|
|
||||||
// Step 3.2
|
// Step 5.2
|
||||||
let ty = self.Type();
|
let ty = self.Type();
|
||||||
|
|
||||||
// Step 3.4
|
// Step 5.4
|
||||||
let name = self.Name();
|
let name = self.Name();
|
||||||
let is_submitter = match submitter {
|
let is_submitter = match submitter {
|
||||||
Some(FormSubmitter::InputElement(s)) => self == s,
|
Some(FormSubmitter::InputElement(s)) => self == s,
|
||||||
|
@ -944,12 +949,12 @@ impl HTMLInputElement {
|
||||||
};
|
};
|
||||||
|
|
||||||
match self.input_type() {
|
match self.input_type() {
|
||||||
// Step 3.1: it's a button but it is not submitter.
|
// Step 5.1: it's a button but it is not submitter.
|
||||||
InputType::Submit | InputType::Button | InputType::Reset if !is_submitter => {
|
InputType::Submit | InputType::Button | InputType::Reset if !is_submitter => {
|
||||||
return vec![];
|
return vec![];
|
||||||
},
|
},
|
||||||
|
|
||||||
// Step 3.1: it's the "Checkbox" or "Radio Button" and whose checkedness is false.
|
// Step 5.1: it's the "Checkbox" or "Radio Button" and whose checkedness is false.
|
||||||
InputType::Radio | InputType::Checkbox => {
|
InputType::Radio | InputType::Checkbox => {
|
||||||
if !self.Checked() || name.is_empty() {
|
if !self.Checked() || name.is_empty() {
|
||||||
return vec![];
|
return vec![];
|
||||||
|
@ -959,7 +964,7 @@ impl HTMLInputElement {
|
||||||
InputType::File => {
|
InputType::File => {
|
||||||
let mut datums = vec![];
|
let mut datums = vec![];
|
||||||
|
|
||||||
// Step 3.2-3.7
|
// Step 5.2-5.7
|
||||||
let name = self.Name();
|
let name = self.Name();
|
||||||
|
|
||||||
match self.GetFiles() {
|
match self.GetFiles() {
|
||||||
|
@ -988,7 +993,21 @@ impl HTMLInputElement {
|
||||||
|
|
||||||
InputType::Image => return vec![], // Unimplemented
|
InputType::Image => return vec![], // Unimplemented
|
||||||
|
|
||||||
// Step 3.1: it's not the "Image Button" and doesn't have a name attribute.
|
// Step 5.10: it's a hidden field named _charset_
|
||||||
|
InputType::Hidden => {
|
||||||
|
if name == "_charset_" {
|
||||||
|
return vec![FormDatum {
|
||||||
|
ty: ty.clone(),
|
||||||
|
name: name,
|
||||||
|
value: FormDatumValue::String(match encoding {
|
||||||
|
None => DOMString::from("UTF-8"),
|
||||||
|
Some(enc) => DOMString::from(enc.name()),
|
||||||
|
}),
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Step 5.1: it's not the "Image Button" and doesn't have a name attribute.
|
||||||
_ => {
|
_ => {
|
||||||
if name.is_empty() {
|
if name.is_empty() {
|
||||||
return vec![];
|
return vec![];
|
||||||
|
@ -996,7 +1015,7 @@ impl HTMLInputElement {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 3.9
|
// Step 5.12
|
||||||
vec![FormDatum {
|
vec![FormDatum {
|
||||||
ty: ty.clone(),
|
ty: ty.clone(),
|
||||||
name: name,
|
name: name,
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
[constructing-form-data-set.html]
|
[constructing-form-data-set.html]
|
||||||
[FormData constructor always produces UTF-8 _charset_ value.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[_charset_ control sets the expected encoding name.]
|
[_charset_ control sets the expected encoding name.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue