aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalisa Smith <malisa.tsmith@gmail.com>2016-09-08 15:50:22 -0700
committerKeith Yeung <kungfukeith11@gmail.com>2016-09-28 22:10:53 -0700
commita5e5cd0e9e1de50f9f62b431ddd1e28e6eb3a36b (patch)
tree89533bcffb0dec2531c73ca50ff7211b0382ad86
parent6a0c70a22269cbec6b72cfa8db499838bb00a0c3 (diff)
downloadservo-a5e5cd0e9e1de50f9f62b431ddd1e28e6eb3a36b.tar.gz
servo-a5e5cd0e9e1de50f9f62b431ddd1e28e6eb3a36b.zip
impl Body mixin for dom::Response and dom::Request
-rw-r--r--components/script/body.rs164
-rw-r--r--components/script/dom/request.rs81
-rw-r--r--components/script/dom/response.rs84
-rw-r--r--components/script/dom/webidls/Body.webidl9
-rw-r--r--components/script/dom/webidls/Response.webidl3
-rw-r--r--components/script/dom/xmlhttprequest.rs2
-rw-r--r--components/script/lib.rs1
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini15
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-consume.html.ini33
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-disturbed.html.ini13
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-error.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-headers.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-init-002.html.ini20
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-init-003.sub.html.ini9
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-structure.html.ini12
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini15
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-consume.html.ini18
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-init-002.html.ini12
18 files changed, 332 insertions, 167 deletions
diff --git a/components/script/body.rs b/components/script/body.rs
new file mode 100644
index 00000000000..7777ef62a4e
--- /dev/null
+++ b/components/script/body.rs
@@ -0,0 +1,164 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::codegen::Bindings::FormDataBinding::FormDataMethods;
+use dom::bindings::error::{Error, Fallible};
+use dom::bindings::global::GlobalRef;
+use dom::bindings::js::Root;
+use dom::bindings::reflector::Reflectable;
+use dom::bindings::str::USVString;
+use dom::blob::{Blob, BlobImpl};
+use dom::formdata::FormData;
+use dom::promise::Promise;
+use encoding::all::UTF_8;
+use encoding::types::{DecoderTrap, Encoding};
+use js::jsapi::JSContext;
+use js::jsapi::JS_ClearPendingException;
+use js::jsapi::JS_ParseJSON;
+use js::jsapi::Value as JSValue;
+use js::jsval::UndefinedValue;
+use mime::{Mime, TopLevel, SubLevel};
+use std::rc::Rc;
+use std::str;
+use style::refcell::Ref;
+use url::form_urlencoded;
+
+pub enum BodyType {
+ ArrayBuffer,
+ Blob,
+ FormData,
+ Json,
+ Text
+}
+
+pub enum FetchedData {
+ Text(String),
+ Json(JSValue),
+ BlobData(Root<Blob>),
+ FormData(Root<FormData>),
+}
+
+// https://fetch.spec.whatwg.org/#concept-body-consume-body
+#[allow(unrooted_must_root)]
+pub fn consume_body<T: BodyOperations + Reflectable>(object: &T, body_type: BodyType) -> Rc<Promise> {
+ let promise = Promise::new(object.global().r());
+
+ // Step 1
+ if object.get_body_used() || object.is_locked() {
+ promise.reject_error(promise.global().r().get_cx(), Error::Type(
+ "The response's stream is disturbed or locked".to_string()));
+ }
+
+ // Steps 2-4
+ // TODO: Body does not yet have a stream.
+
+ // Step 5
+ let pkg_data_results = run_package_data_algorithm(object,
+ object.take_body(),
+ body_type,
+ object.get_mime_type());
+
+ let cx = promise.global().r().get_cx();
+ match pkg_data_results {
+ Ok(results) => {
+ match results {
+ FetchedData::Text(s) => promise.resolve_native(cx, &USVString(s)),
+ FetchedData::Json(j) => promise.resolve_native(cx, &j),
+ FetchedData::BlobData(b) => promise.resolve_native(cx, &b),
+ FetchedData::FormData(f) => promise.resolve_native(cx, &f),
+ };
+ },
+ Err(err) => promise.reject_error(cx, err),
+ }
+ promise
+}
+
+// https://fetch.spec.whatwg.org/#concept-body-package-data
+#[allow(unsafe_code)]
+fn run_package_data_algorithm<T: BodyOperations + Reflectable>(object: &T,
+ bytes: Option<Vec<u8>>,
+ body_type: BodyType,
+ mime_type: Ref<Vec<u8>>)
+ -> Fallible<FetchedData> {
+ let bytes = match bytes {
+ Some(b) => b,
+ _ => vec![],
+ };
+ let cx = object.global().r().get_cx();
+ let mime = &*mime_type;
+ match body_type {
+ BodyType::Text => run_text_data_algorithm(bytes),
+ BodyType::Json => run_json_data_algorithm(cx, bytes),
+ BodyType::Blob => run_blob_data_algorithm(object.global().r(), bytes, mime),
+ BodyType::FormData => run_form_data_algorithm(object.global().r(), bytes, mime),
+ _ => Err(Error::Type("Unable to process body type".to_string()))
+ }
+}
+
+fn run_text_data_algorithm(bytes: Vec<u8>) -> Fallible<FetchedData> {
+ let text = UTF_8.decode(&bytes, DecoderTrap::Replace).unwrap();
+ Ok(FetchedData::Text(text))
+}
+
+#[allow(unsafe_code)]
+fn run_json_data_algorithm(cx: *mut JSContext,
+ bytes: Vec<u8>) -> Fallible<FetchedData> {
+ let json_text = UTF_8.decode(&bytes, DecoderTrap::Replace).unwrap();
+ let json_text: Vec<u16> = json_text.encode_utf16().collect();
+ rooted!(in(cx) let mut rval = UndefinedValue());
+ unsafe {
+ if !JS_ParseJSON(cx,
+ json_text.as_ptr(),
+ json_text.len() as u32,
+ rval.handle_mut()) {
+ JS_ClearPendingException(cx);
+ // TODO: See issue #13464. Exception should be thrown instead of cleared.
+ return Err(Error::Type("Failed to parse JSON".to_string()));
+ }
+ Ok(FetchedData::Json(rval.get()))
+ }
+}
+
+fn run_blob_data_algorithm(root: GlobalRef,
+ bytes: Vec<u8>,
+ mime: &[u8]) -> Fallible<FetchedData> {
+ let mime_string = if let Ok(s) = String::from_utf8(mime.to_vec()) {
+ s
+ } else {
+ "".to_string()
+ };
+ let blob = Blob::new(root, BlobImpl::new_from_bytes(bytes), mime_string);
+ Ok(FetchedData::BlobData(blob))
+}
+
+fn run_form_data_algorithm(root: GlobalRef, bytes: Vec<u8>, mime: &[u8]) -> Fallible<FetchedData> {
+ let mime_str = if let Ok(s) = str::from_utf8(mime) {
+ s
+ } else {
+ ""
+ };
+ let mime: Mime = try!(mime_str.parse().map_err(
+ |_| Error::Type("Inappropriate MIME-type for Body".to_string())));
+ match mime {
+ // TODO
+ // ... Parser for Mime(TopLevel::Multipart, SubLevel::FormData, _)
+ // ... is not fully determined yet.
+ Mime(TopLevel::Application, SubLevel::WwwFormUrlEncoded, _) => {
+ let entries = form_urlencoded::parse(&bytes);
+ let formdata = FormData::new(None, root);
+ for (k, e) in entries {
+ formdata.Append(USVString(k.into_owned()), USVString(e.into_owned()));
+ }
+ return Ok(FetchedData::FormData(formdata));
+ },
+ _ => return Err(Error::Type("Inappropriate MIME-type for Body".to_string())),
+ }
+}
+
+pub trait BodyOperations {
+ fn get_body_used(&self) -> bool;
+ fn take_body(&self) -> Option<Vec<u8>>;
+ fn is_locked(&self) -> bool;
+ fn get_mime_type(&self) -> Ref<Vec<u8>>;
+}
diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs
index 149c61c96ee..3cb802a84f9 100644
--- a/components/script/dom/request.rs
+++ b/components/script/dom/request.rs
@@ -2,8 +2,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+use body::{BodyOperations, BodyType, consume_body};
use dom::bindings::cell::DOMRefCell;
-use dom::bindings::codegen::Bindings::HeadersBinding::HeadersInit;
+use dom::bindings::codegen::Bindings::HeadersBinding::{HeadersInit, HeadersMethods};
use dom::bindings::codegen::Bindings::RequestBinding;
use dom::bindings::codegen::Bindings::RequestBinding::ReferrerPolicy;
use dom::bindings::codegen::Bindings::RequestBinding::RequestCache;
@@ -21,6 +22,8 @@ use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::str::{ByteString, DOMString, USVString};
use dom::headers::{Guard, Headers};
+use dom::promise::Promise;
+use dom::xmlhttprequest::Extractable;
use hyper;
use msg::constellation_msg::ReferrerPolicy as MsgReferrerPolicy;
use net_traits::request::{Origin, Window};
@@ -33,6 +36,9 @@ use net_traits::request::Request as NetTraitsRequest;
use net_traits::request::RequestMode as NetTraitsRequestMode;
use net_traits::request::Type as NetTraitsRequestType;
use std::cell::Cell;
+use std::mem;
+use std::rc::Rc;
+use style::refcell::Ref;
use url::Url;
#[dom_struct]
@@ -340,7 +346,7 @@ impl Request {
try!(r.Headers().fill(Some(HeadersInit::Headers(headers_copy))));
// Step 32
- let input_body = if let RequestInfo::Request(ref input_request) = input {
+ let mut input_body = if let RequestInfo::Request(ref input_request) = input {
let input_request_request = input_request.request.borrow();
let body = input_request_request.body.borrow();
body.clone()
@@ -365,6 +371,20 @@ impl Request {
// Step 34
// TODO: `ReadableStream` object is not implemented in Servo yet.
+ if let Some(Some(ref init_body)) = init.body {
+ // Step 34.2
+ let extracted_body_tmp = init_body.extract();
+ input_body = Some(extracted_body_tmp.0);
+ let content_type = extracted_body_tmp.1;
+
+ // Step 34.3
+ if let Some(contents) = content_type {
+ if !r.Headers().Has(ByteString::new(b"Content-Type".to_vec())).unwrap() {
+ try!(r.Headers().Append(ByteString::new(b"Content-Type".to_vec()),
+ ByteString::new(contents.as_bytes().to_vec())));
+ }
+ }
+ }
// Step 35
{
@@ -382,6 +402,13 @@ impl Request {
// Step 38
Ok(r)
}
+
+ // https://fetch.spec.whatwg.org/#concept-body-locked
+ fn locked(&self) -> bool {
+ // TODO: ReadableStream is unimplemented. Just return false
+ // for now.
+ false
+ }
}
impl Request {
@@ -602,6 +629,56 @@ impl RequestMethods for Request {
// Step 2
Ok(Request::clone_from(self))
}
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-text
+ fn Text(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::Text)
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-blob
+ fn Blob(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::Blob)
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-formdata
+ fn FormData(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::FormData)
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-json
+ fn Json(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::Json)
+ }
+}
+
+impl BodyOperations for Request {
+ fn get_body_used(&self) -> bool {
+ self.BodyUsed()
+ }
+
+ fn is_locked(&self) -> bool {
+ self.locked()
+ }
+
+ fn take_body(&self) -> Option<Vec<u8>> {
+ let ref mut net_traits_req = *self.request.borrow_mut();
+ let body: Option<Vec<u8>> = mem::replace(&mut *net_traits_req.body.borrow_mut(), None);
+ match body {
+ Some(_) => {
+ self.body_used.set(true);
+ body
+ },
+ _ => None,
+ }
+ }
+
+ fn get_mime_type(&self) -> Ref<Vec<u8>> {
+ self.mime_type.borrow()
+ }
}
impl Into<NetTraitsRequestCache> for RequestCache {
diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs
index acfc181283a..d020f932f37 100644
--- a/components/script/dom/response.rs
+++ b/components/script/dom/response.rs
@@ -2,11 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+use body::{BodyOperations, BodyType, consume_body};
use core::cell::Cell;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::HeadersBinding::HeadersMethods;
use dom::bindings::codegen::Bindings::ResponseBinding;
use dom::bindings::codegen::Bindings::ResponseBinding::{ResponseMethods, ResponseType as DOMResponseType};
+use dom::bindings::codegen::Bindings::XMLHttpRequestBinding::BodyInit;
use dom::bindings::error::{Error, Fallible};
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, MutNullableHeap, Root};
@@ -14,9 +16,14 @@ use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::str::{ByteString, USVString};
use dom::headers::{Headers, Guard};
use dom::headers::{is_vchar, is_obs_text};
+use dom::promise::Promise;
+use dom::xmlhttprequest::Extractable;
use hyper::status::StatusCode;
use net_traits::response::{ResponseBody as NetTraitsResponseBody};
+use std::mem;
+use std::rc::Rc;
use std::str::FromStr;
+use style::refcell::Ref;
use url::Position;
use url::Url;
@@ -33,8 +40,7 @@ pub struct Response {
response_type: DOMRefCell<DOMResponseType>,
url: DOMRefCell<Option<Url>>,
url_list: DOMRefCell<Vec<Url>>,
- // For now use the existing NetTraitsResponseBody enum, until body
- // is implemented.
+ // For now use the existing NetTraitsResponseBody enum
body: DOMRefCell<NetTraitsResponseBody>,
}
@@ -59,7 +65,7 @@ impl Response {
reflect_dom_object(box Response::new_inherited(), global, ResponseBinding::Wrap)
}
- pub fn Constructor(global: GlobalRef, _body: Option<USVString>, init: &ResponseBinding::ResponseInit)
+ pub fn Constructor(global: GlobalRef, body: Option<BodyInit>, init: &ResponseBinding::ResponseInit)
-> Fallible<Root<Response>> {
// Step 1
if init.status < 200 || init.status > 599 {
@@ -86,11 +92,6 @@ impl Response {
// Step 6
if let Some(ref headers_member) = init.headers {
// Step 6.1
- // TODO: Figure out how/if we should make r's response's
- // header list and r's Headers object the same thing. For
- // now just working with r's Headers object. Also, the
- // header list should already be empty so this step may be
- // unnecessary.
r.Headers().empty_header_list();
// Step 6.2
@@ -98,23 +99,22 @@ impl Response {
}
// Step 7
- if let Some(_) = _body {
+ if let Some(ref body) = body {
// Step 7.1
if is_null_body_status(init.status) {
return Err(Error::Type(
"Body is non-null but init's status member is a null body status".to_string()));
};
- // Step 7.2
- let content_type: Option<ByteString> = None;
-
// Step 7.3
- // TODO: Extract body and implement step 7.3.
+ let (extracted_body, content_type) = body.extract();
+ *r.body.borrow_mut() = NetTraitsResponseBody::Done(extracted_body);
// Step 7.4
if let Some(content_type_contents) = content_type {
if !r.Headers().Has(ByteString::new(b"Content-Type".to_vec())).unwrap() {
- try!(r.Headers().Append(ByteString::new(b"Content-Type".to_vec()), content_type_contents));
+ try!(r.Headers().Append(ByteString::new(b"Content-Type".to_vec()),
+ ByteString::new(content_type_contents.as_bytes().to_vec())));
}
};
}
@@ -178,6 +178,38 @@ impl Response {
// Step 7
Ok(r)
}
+
+ // https://fetch.spec.whatwg.org/#concept-body-locked
+ fn locked(&self) -> bool {
+ // TODO: ReadableStream is unimplemented. Just return false
+ // for now.
+ false
+ }
+}
+
+impl BodyOperations for Response {
+ fn get_body_used(&self) -> bool {
+ self.BodyUsed()
+ }
+
+ fn is_locked(&self) -> bool {
+ self.locked()
+ }
+
+ fn take_body(&self) -> Option<Vec<u8>> {
+ let body: NetTraitsResponseBody = mem::replace(&mut *self.body.borrow_mut(), NetTraitsResponseBody::Empty);
+ match body {
+ NetTraitsResponseBody::Done(bytes) | NetTraitsResponseBody::Receiving(bytes) => {
+ self.body_used.set(true);
+ Some(bytes)
+ },
+ _ => None,
+ }
+ }
+
+ fn get_mime_type(&self) -> Ref<Vec<u8>> {
+ self.mime_type.borrow()
+ }
}
// https://fetch.spec.whatwg.org/#redirect-status
@@ -283,6 +315,30 @@ impl ResponseMethods for Response {
fn BodyUsed(&self) -> bool {
self.body_used.get()
}
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-text
+ fn Text(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::Text)
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-blob
+ fn Blob(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::Blob)
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-formdata
+ fn FormData(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::FormData)
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://fetch.spec.whatwg.org/#dom-body-json
+ fn Json(&self) -> Rc<Promise> {
+ consume_body(self, BodyType::Json)
+ }
}
fn serialize_without_fragment(url: &Url) -> &str {
diff --git a/components/script/dom/webidls/Body.webidl b/components/script/dom/webidls/Body.webidl
index a020228a01d..bb7aa5c6859 100644
--- a/components/script/dom/webidls/Body.webidl
+++ b/components/script/dom/webidls/Body.webidl
@@ -10,10 +10,9 @@
interface Body {
readonly attribute boolean bodyUsed;
- // Servo does not support Promise at this moment.
// [NewObject] Promise<ArrayBuffer> arrayBuffer();
- // [NewObject] Promise<Blob> blob();
- // [NewObject] Promise<FormData> formData();
- // [NewObject] Promise<JSON> json();
- // [NewObject] Promise<USVString> text();
+ [NewObject] Promise<Blob> blob();
+ [NewObject] Promise<FormData> formData();
+ [NewObject] Promise<any> json();
+ [NewObject] Promise<USVString> text();
};
diff --git a/components/script/dom/webidls/Response.webidl b/components/script/dom/webidls/Response.webidl
index 2052f5c6371..a1b3cf7dd9a 100644
--- a/components/script/dom/webidls/Response.webidl
+++ b/components/script/dom/webidls/Response.webidl
@@ -4,8 +4,7 @@
// https://fetch.spec.whatwg.org/#response-class
-// TODO: pass 'optional ResponseBodyInit? body = null' to constructor in place of USVString
- [Constructor(optional USVString? body = null, optional ResponseInit init),
+ [Constructor(optional BodyInit? body = null, optional ResponseInit init),
Exposed=(Window,Worker)]
interface Response {
[NewObject] static Response error();
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index 24ee2c28d36..2a193cea77a 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -1364,7 +1364,7 @@ impl XHRTimeoutCallback {
}
}
-trait Extractable {
+pub trait Extractable {
fn extract(&self) -> (Vec<u8>, Option<DOMString>);
}
impl Extractable for BodyInit {
diff --git a/components/script/lib.rs b/components/script/lib.rs
index 840e078d93f..3fc5343fbfa 100644
--- a/components/script/lib.rs
+++ b/components/script/lib.rs
@@ -92,6 +92,7 @@ extern crate websocket;
extern crate xml5ever;
pub mod bluetooth_blacklist;
+mod body;
pub mod clipboard_provider;
mod devtools;
pub mod document_loader;
diff --git a/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini b/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini
index adf5eaeb232..367e9eef15b 100644
--- a/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini
@@ -1,17 +1,8 @@
[request-consume-empty.html]
type: testharness
- [Consume request's body as text]
- expected: FAIL
-
- [Consume request's body as blob]
- expected: FAIL
-
[Consume request's body as arrayBuffer]
expected: FAIL
- [Consume request's body as json]
- expected: FAIL
-
[Consume request's body as formData]
expected: FAIL
@@ -21,9 +12,3 @@
[Consume empty text request body as arrayBuffer]
expected: FAIL
- [Consume empty blob request body as text]
- expected: FAIL
-
- [Consume empty text request body as text]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/request/request-consume.html.ini b/tests/wpt/metadata/fetch/api/request/request-consume.html.ini
index 9dae0fc7a1b..e714de76f6d 100644
--- a/tests/wpt/metadata/fetch/api/request/request-consume.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-consume.html.ini
@@ -1,11 +1,5 @@
[request-consume.html]
type: testharness
- [Consume String request's body as text]
- expected: FAIL
-
- [Consume String request's body as blob]
- expected: FAIL
-
[Consume String request's body as arrayBuffer]
expected: FAIL
@@ -15,30 +9,9 @@
[Consume String request's body as formData]
expected: FAIL
- [Consume blob response's body as blob]
- expected: FAIL
-
- [Consume blob response's body as text]
- expected: FAIL
-
- [Consume blob response's body as json]
- expected: FAIL
-
[Consume blob response's body as arrayBuffer]
expected: FAIL
- [Consume JSON from text: '"null"']
- expected: FAIL
-
- [Consume JSON from text: '"1"']
- expected: FAIL
-
- [Consume JSON from text: '"true"']
- expected: FAIL
-
- [Consume JSON from text: '"\\"string\\""']
- expected: FAIL
-
[Trying to consume bad JSON text as JSON: 'undefined']
expected: FAIL
@@ -51,9 +24,6 @@
[Trying to consume bad JSON text as JSON: '[']
expected: FAIL
- [Consume String request's body as JSON]
- expected: FAIL
-
[Consume ArrayBuffer request's body as text]
expected: FAIL
@@ -117,6 +87,3 @@
[Consume FormData request's body as FormData]
expected: FAIL
- [Consume blob response's body as blob (empty blob as input)]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/request/request-disturbed.html.ini b/tests/wpt/metadata/fetch/api/request/request-disturbed.html.ini
index 2eed840f857..60d69c8caef 100644
--- a/tests/wpt/metadata/fetch/api/request/request-disturbed.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-disturbed.html.ini
@@ -1,3 +1,14 @@
[request-disturbed.html]
type: testharness
- expected: ERROR
+ [Check cloning a disturbed request]
+ expected: FAIL
+
+ [Check creating a new request from a disturbed request]
+ expected: FAIL
+
+ [Input request used for creating new request became disturbed]
+ expected: FAIL
+
+ [Request construction failure should not set "bodyUsed"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-error.html.ini b/tests/wpt/metadata/fetch/api/request/request-error.html.ini
deleted file mode 100644
index 4d1b73005ca..00000000000
--- a/tests/wpt/metadata/fetch/api/request/request-error.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[request-error.html]
- type: testharness
- [Request should get its content-type from the body if none is provided]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/request/request-headers.html.ini b/tests/wpt/metadata/fetch/api/request/request-headers.html.ini
index abd624770bf..3f2673c143d 100644
--- a/tests/wpt/metadata/fetch/api/request/request-headers.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-headers.html.ini
@@ -1,8 +1,5 @@
[request-headers.html]
type: testharness
- [Request should get its content-type from the body if none is provided]
- expected: FAIL
-
[Testing request header creations with various objects]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/request/request-init-002.html.ini b/tests/wpt/metadata/fetch/api/request/request-init-002.html.ini
deleted file mode 100644
index 903c3bbdba3..00000000000
--- a/tests/wpt/metadata/fetch/api/request/request-init-002.html.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-[request-init-002.html]
- type: testharness
- [Initialize Request's body with undefined]
- expected: FAIL
-
- [Initialize Request's body with null]
- expected: FAIL
-
- [Initialize Request's body with application/octet-binary]
- expected: FAIL
-
- [Initialize Request's body with multipart/form-data]
- expected: FAIL
-
- [Initialize Request's body with text/plain;charset=UTF-8]
- expected: FAIL
-
- [Initialize Request's body with application/x-www-form-urlencoded;charset=UTF-8]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/request/request-init-003.sub.html.ini b/tests/wpt/metadata/fetch/api/request/request-init-003.sub.html.ini
index e5e3d9856c6..c4f52961261 100644
--- a/tests/wpt/metadata/fetch/api/request/request-init-003.sub.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-init-003.sub.html.ini
@@ -1,14 +1,5 @@
[request-init-003.sub.html]
type: testharness
- [Check request values when initialized from Request]
- expected: FAIL
-
- [Check request values when initialized from Request and init values]
- expected: FAIL
-
[Check request values when initialized from url string]
expected: FAIL
- [Check request values when initialized from url and init values]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/request/request-structure.html.ini b/tests/wpt/metadata/fetch/api/request/request-structure.html.ini
index 31e9c7b713d..c07e5b03246 100644
--- a/tests/wpt/metadata/fetch/api/request/request-structure.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-structure.html.ini
@@ -3,18 +3,6 @@
[Request has arrayBuffer method]
expected: FAIL
- [Request has blob method]
- expected: FAIL
-
- [Request has formData method]
- expected: FAIL
-
- [Request has json method]
- expected: FAIL
-
- [Request has text method]
- expected: FAIL
-
[Check referrer attribute]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini b/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini
index ad63d701eec..9ee927624fb 100644
--- a/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini
@@ -1,17 +1,8 @@
[response-consume-empty.html]
type: testharness
- [Consume response's body as text]
- expected: FAIL
-
- [Consume response's body as blob]
- expected: FAIL
-
[Consume response's body as arrayBuffer]
expected: FAIL
- [Consume response's body as json]
- expected: FAIL
-
[Consume response's body as formData]
expected: FAIL
@@ -21,9 +12,3 @@
[Consume empty text response body as arrayBuffer]
expected: FAIL
- [Consume empty blob response body as text]
- expected: FAIL
-
- [Consume empty text response body as text]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/response/response-consume.html.ini b/tests/wpt/metadata/fetch/api/response/response-consume.html.ini
index be3d40e5dea..63000272391 100644
--- a/tests/wpt/metadata/fetch/api/response/response-consume.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-consume.html.ini
@@ -1,29 +1,11 @@
[response-consume.html]
type: testharness
- [Consume response's body as text]
- expected: FAIL
-
- [Consume response's body as blob]
- expected: FAIL
-
[Consume response's body as arrayBuffer]
expected: FAIL
- [Consume response's body as json]
- expected: FAIL
-
[Consume response's body as formData]
expected: FAIL
- [Consume blob response's body as blob]
- expected: FAIL
-
- [Consume blob response's body as text]
- expected: FAIL
-
- [Consume blob response's body as json]
- expected: FAIL
-
[Consume blob response's body as arrayBuffer]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini b/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini
index 6fbd45bbb99..5d3edd80268 100644
--- a/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini
@@ -1,17 +1,5 @@
[response-init-002.html]
type: testharness
- [Initialize Response's body with application/octet-binary]
- expected: FAIL
-
- [Initialize Response's body with multipart/form-data]
- expected: FAIL
-
- [Initialize Response's body with application/x-www-form-urlencoded;charset=UTF-8]
- expected: FAIL
-
- [Initialize Response's body with text/plain;charset=UTF-8]
- expected: FAIL
-
[Read Response's body as readableStream]
expected: FAIL