From b5722e50bb5f9c0bcd0cb3fb664b2756c849ee6d Mon Sep 17 00:00:00 2001 From: Keith Yeung Date: Sun, 9 Apr 2017 17:34:16 -0700 Subject: [PATCH 1/2] Provide MIME type data for File in formdata::get_file --- components/script/dom/bindings/structuredclone.rs | 2 +- components/script/dom/blob.rs | 2 +- components/script/dom/formdata.rs | 2 +- tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini | 3 --- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index ed3cf6aa6e2..b3a9df32695 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -87,7 +87,7 @@ unsafe fn write_blob(blob: Root, -> Result<(), ()> { let blob_vec = try!(blob.get_bytes()); let blob_length = blob_vec.len(); - let type_string_bytes = blob.get_type_string().as_bytes().to_vec(); + let type_string_bytes = blob.type_string().as_bytes().to_vec(); let type_string_length = type_string_bytes.len(); assert!(JS_WriteUint32Pair(w, StructuredCloneTags::DomBlob as u32, 0)); write_length(w, blob_length); diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index d8ed5fa1b64..cb61ced9e3a 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -164,7 +164,7 @@ impl Blob { } /// Get a copy of the type_string - pub fn get_type_string(&self) -> String { + pub fn type_string(&self) -> String { self.type_string.clone() } diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 2b8ca8f4d46..6c429c54743 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -153,7 +153,7 @@ impl FormData { let bytes = blob.get_bytes().unwrap_or(vec![]); - File::new(&self.global(), BlobImpl::new_from_bytes(bytes), name, None, "") + File::new(&self.global(), BlobImpl::new_from_bytes(bytes), name, None, &blob.type_string()) } pub fn datums(&self) -> Vec { diff --git a/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini b/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini index 32cb3afc3c5..b88e3c6de2d 100644 --- a/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini +++ b/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini @@ -3,6 +3,3 @@ [formdata with blob] expected: FAIL - [formdata with named blob] - expected: FAIL - From 912ac622e7d53d8524186778cc32107a9b7a0b45 Mon Sep 17 00:00:00 2001 From: Keith Yeung Date: Sun, 9 Apr 2017 23:30:40 -0700 Subject: [PATCH 2/2] Follow the spec in giving blobs a 'blob' name attribute --- components/script/dom/formdata.rs | 10 +++++++--- .../wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini | 5 ----- 2 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 6c429c54743..af4c692e7d9 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -7,6 +7,7 @@ use dom::bindings::codegen::Bindings::FormDataBinding::FormDataMethods; use dom::bindings::codegen::Bindings::FormDataBinding::FormDataWrap; use dom::bindings::codegen::UnionTypes::FileOrUSVString; use dom::bindings::error::Fallible; +use dom::bindings::inheritance::Castable; use dom::bindings::iterable::Iterable; use dom::bindings::js::Root; use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object}; @@ -79,7 +80,7 @@ impl FormDataMethods for FormData { let datum = FormDatum { ty: DOMString::from("file"), name: DOMString::from(name.0.clone()), - value: FormDatumValue::File(Root::from_ref(&*self.get_file(blob, filename))), + value: FormDatumValue::File(Root::from_ref(&*self.create_an_entry(blob, filename))), }; let mut data = self.data.borrow_mut(); @@ -137,7 +138,7 @@ impl FormDataMethods for FormData { self.data.borrow_mut().insert(LocalName::from(name.0.clone()), vec![FormDatum { ty: DOMString::from("file"), name: DOMString::from(name.0), - value: FormDatumValue::File(Root::from_ref(&*self.get_file(blob, filename))), + value: FormDatumValue::File(Root::from_ref(&*self.create_an_entry(blob, filename))), }]); } @@ -145,9 +146,12 @@ impl FormDataMethods for FormData { impl FormData { - fn get_file(&self, blob: &Blob, opt_filename: Option) -> Root { + // https://xhr.spec.whatwg.org/#create-an-entry + // Steps 3-4. + fn create_an_entry(&self, blob: &Blob, opt_filename: Option) -> Root { let name = match opt_filename { Some(filename) => DOMString::from(filename.0), + None if blob.downcast::().is_none() => DOMString::from("blob"), None => DOMString::from(""), }; diff --git a/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini b/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini deleted file mode 100644 index b88e3c6de2d..00000000000 --- a/tests/wpt/metadata/XMLHttpRequest/formdata-blob.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[formdata-blob.htm] - type: testharness - [formdata with blob] - expected: FAIL -