mirror of
https://github.com/servo/servo.git
synced 2025-08-07 22:45:34 +01:00
Auto merge of #11556 - Manishearth:make-fetch-happen, r=jdm
Make fetch happen <!-- Please describe your changes on the following line: --> Moves XHR over to the fetch backend. Previous PR: https://github.com/servo/servo/pull/114 --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [ ] `./mach test-tidy` does not report any errors (Will fix later) <!-- Either: --> - [x] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/11556) <!-- Reviewable:end -->
This commit is contained in:
commit
0c11e8340b
33 changed files with 861 additions and 1085 deletions
|
@ -14,8 +14,9 @@ use hyper::server::{Request as HyperRequest, Response as HyperResponse};
|
|||
use hyper::status::StatusCode;
|
||||
use hyper::uri::RequestUri;
|
||||
use net::fetch::cors_cache::CORSCache;
|
||||
use net::fetch::methods::{fetch, fetch_async, fetch_with_cors_cache};
|
||||
use net_traits::AsyncFetchListener;
|
||||
use net::fetch::methods::{FetchContext, fetch, fetch_with_cors_cache};
|
||||
use net::http_loader::HttpState;
|
||||
use net_traits::FetchTaskTarget;
|
||||
use net_traits::request::{Origin, RedirectMode, Referer, Request, RequestMode};
|
||||
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
|
||||
use std::fs::File;
|
||||
|
@ -24,6 +25,7 @@ use std::rc::Rc;
|
|||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::sync::mpsc::{Sender, channel};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread;
|
||||
use time::{self, Duration};
|
||||
use unicase::UniCase;
|
||||
use url::{Origin as UrlOrigin, Url};
|
||||
|
@ -35,11 +37,32 @@ struct FetchResponseCollector {
|
|||
sender: Sender<Response>,
|
||||
}
|
||||
|
||||
impl AsyncFetchListener for FetchResponseCollector {
|
||||
fn response_available(&self, response: Response) {
|
||||
let _ = self.sender.send(response);
|
||||
fn new_fetch_context() -> FetchContext {
|
||||
FetchContext {
|
||||
state: HttpState::new(),
|
||||
user_agent: "Such Browser. Very Layout. Wow.".into(),
|
||||
}
|
||||
}
|
||||
impl FetchTaskTarget for FetchResponseCollector {
|
||||
fn process_request_body(&mut self, _: &Request) {}
|
||||
fn process_request_eof(&mut self, _: &Request) {}
|
||||
fn process_response(&mut self, _: &Response) {}
|
||||
fn process_response_chunk(&mut self, _: Vec<u8>) {}
|
||||
/// Fired when the response is fully fetched
|
||||
fn process_response_eof(&mut self, response: &Response) {
|
||||
self.sender.send(response.clone());
|
||||
}
|
||||
}
|
||||
|
||||
fn fetch_async(request: Request, target: Box<FetchTaskTarget + Send>) {
|
||||
thread::spawn(move || {
|
||||
fetch(Rc::new(request), &mut Some(target), new_fetch_context());
|
||||
});
|
||||
}
|
||||
|
||||
fn fetch_sync(request: Request) -> Response {
|
||||
fetch(Rc::new(request), &mut None, new_fetch_context())
|
||||
}
|
||||
|
||||
fn make_server<H: Handler + 'static>(handler: H) -> (Listening, Url) {
|
||||
// this is a Listening server because of handle_threads()
|
||||
|
@ -61,10 +84,8 @@ fn test_fetch_response_is_not_network_error() {
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
if fetch_response.is_network_error() {
|
||||
|
@ -82,10 +103,8 @@ fn test_fetch_response_body_matches_const_message() {
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
|
@ -104,10 +123,8 @@ fn test_fetch_aboutblank() {
|
|||
let url = Url::parse("about:blank").unwrap();
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
let fetch_response = fetch_sync(request);
|
||||
assert!(!fetch_response.is_network_error());
|
||||
assert!(*fetch_response.body.lock().unwrap() == ResponseBody::Done(vec![]));
|
||||
}
|
||||
|
@ -119,7 +136,7 @@ fn test_fetch_data() {
|
|||
let request = Request::new(url, Some(origin), false);
|
||||
request.same_origin_data.set(true);
|
||||
let expected_resp_body = "<p>Servo</p>".to_owned();
|
||||
let fetch_response = fetch(Rc::new(request));
|
||||
let fetch_response = fetch_sync(request);
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
assert_eq!(fetch_response.headers.len(), 1);
|
||||
|
@ -148,7 +165,7 @@ fn test_fetch_file() {
|
|||
let request = Request::new(url, Some(origin), false);
|
||||
request.same_origin_data.set(true);
|
||||
|
||||
let fetch_response = fetch(Rc::new(request));
|
||||
let fetch_response = fetch_sync(request);
|
||||
assert!(!fetch_response.is_network_error());
|
||||
assert_eq!(fetch_response.headers.len(), 1);
|
||||
let content_type: &ContentType = fetch_response.headers.get().unwrap();
|
||||
|
@ -187,12 +204,10 @@ fn test_cors_preflight_fetch() {
|
|||
|
||||
let origin = Origin::Origin(UrlOrigin::new_opaque());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
request.use_cors_preflight = true;
|
||||
request.mode = RequestMode::CORSMode;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
|
@ -226,14 +241,14 @@ fn test_cors_preflight_cache_fetch() {
|
|||
|
||||
let origin = Origin::Origin(UrlOrigin::new_opaque());
|
||||
let mut request = Request::new(url.clone(), Some(origin.clone()), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
request.use_cors_preflight = true;
|
||||
request.mode = RequestMode::CORSMode;
|
||||
let wrapped_request0 = Rc::new(request.clone());
|
||||
let wrapped_request1 = Rc::new(request);
|
||||
|
||||
let fetch_response0 = fetch_with_cors_cache(wrapped_request0.clone(), &mut cache);
|
||||
let fetch_response1 = fetch_with_cors_cache(wrapped_request1.clone(), &mut cache);
|
||||
let fetch_response0 = fetch_with_cors_cache(wrapped_request0.clone(), &mut cache, &mut None, new_fetch_context());
|
||||
let fetch_response1 = fetch_with_cors_cache(wrapped_request1.clone(), &mut cache, &mut None, new_fetch_context());
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response0.is_network_error() && !fetch_response1.is_network_error());
|
||||
|
@ -276,12 +291,10 @@ fn test_cors_preflight_fetch_network_error() {
|
|||
let origin = Origin::Origin(UrlOrigin::new_opaque());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
*request.method.borrow_mut() = Method::Extension("CHICKEN".to_owned());
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
request.use_cors_preflight = true;
|
||||
request.mode = RequestMode::CORSMode;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(fetch_response.is_network_error());
|
||||
|
@ -301,10 +314,8 @@ fn test_fetch_response_is_basic_filtered() {
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
|
@ -348,11 +359,9 @@ fn test_fetch_response_is_cors_filtered() {
|
|||
// an origin mis-match will stop it from defaulting to a basic filtered response
|
||||
let origin = Origin::Origin(UrlOrigin::new_opaque());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
request.mode = RequestMode::CORSMode;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
|
@ -382,10 +391,8 @@ fn test_fetch_response_is_opaque_filtered() {
|
|||
// an origin mis-match will fall through to an Opaque filtered response
|
||||
let origin = Origin::Origin(UrlOrigin::new_opaque());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
|
@ -431,11 +438,9 @@ fn test_fetch_response_is_opaque_redirect_filtered() {
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
request.redirect_mode.set(RedirectMode::Manual);
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
|
||||
assert!(!fetch_response.is_network_error());
|
||||
|
@ -467,13 +472,12 @@ fn test_fetch_with_local_urls_only() {
|
|||
let do_fetch = |url: Url| {
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
|
||||
// Set the flag.
|
||||
request.local_urls_only = true;
|
||||
|
||||
let wrapped_request = Rc::new(request);
|
||||
fetch(wrapped_request)
|
||||
fetch_sync(request)
|
||||
};
|
||||
|
||||
let local_url = Url::parse("about:blank").unwrap();
|
||||
|
@ -509,10 +513,8 @@ fn setup_server_and_fetch(message: &'static [u8], redirect_cap: u32) -> Response
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let fetch_response = fetch(wrapped_request);
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
let fetch_response = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
fetch_response
|
||||
}
|
||||
|
@ -594,11 +596,10 @@ fn test_fetch_redirect_updates_method_runner(tx: Sender<bool>, status_code: Stat
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
*request.method.borrow_mut() = method;
|
||||
let wrapped_request = Rc::new(request);
|
||||
|
||||
let _ = fetch(wrapped_request);
|
||||
let _ = fetch_sync(request);
|
||||
let _ = server.close();
|
||||
}
|
||||
|
||||
|
@ -670,7 +671,7 @@ fn test_fetch_async_returns_complete_response() {
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
|
||||
let (tx, rx) = channel();
|
||||
let listener = Box::new(FetchResponseCollector {
|
||||
|
@ -695,7 +696,7 @@ fn test_opaque_filtered_fetch_async_returns_complete_response() {
|
|||
// an origin mis-match will fall through to an Opaque filtered response
|
||||
let origin = Origin::Origin(UrlOrigin::new_opaque());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
|
||||
let (tx, rx) = channel();
|
||||
let listener = Box::new(FetchResponseCollector {
|
||||
|
@ -735,7 +736,7 @@ fn test_opaque_redirect_filtered_fetch_async_returns_complete_response() {
|
|||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false);
|
||||
request.referer = Referer::NoReferer;
|
||||
*request.referer.borrow_mut() = Referer::NoReferer;
|
||||
request.redirect_mode.set(RedirectMode::Manual);
|
||||
|
||||
let (tx, rx) = channel();
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[send-authentication-basic-setrequestheader-existing-session.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: send() - "Basic" authenticated request using setRequestHeader() when there is an existing session]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[send-authentication-basic.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: send() - "Basic" authenticated requests with user name and password passed to open()]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
[send-conditional.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: send() - conditional requests (tag)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - conditional requests (date)]
|
||||
expected: FAIL
|
||||
|
|
@ -15,9 +15,12 @@
|
|||
[charset given but wrong, fix it (known MIME, bogus charset)]
|
||||
expected: FAIL
|
||||
|
||||
[charset given but wrong, fix it (known MIME, actual charset)]
|
||||
expected: FAIL
|
||||
|
||||
[If multiple charset parameters are given, all should be rewritten]
|
||||
expected: FAIL
|
||||
|
||||
[Correct text/plain MIME with charset]
|
||||
expected: FAIL
|
||||
|
||||
[charset given but wrong, fix it (known MIME, actual charset)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[send-entity-body-get-head.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: send() - non-empty data argument and GET/HEAD (HEAD)]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
[send-redirect-to-cors.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: send() - Redirect to CORS-enabled resource (301)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - Redirect to CORS-enabled resource (302)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - Redirect to CORS-enabled resource (303)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - Redirect to CORS-enabled resource (307)]
|
||||
expected: FAIL
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
[send-redirect-to-non-cors.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: send() - Redirect to cross-origin resource, not CORS-enabled (301)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - Redirect to cross-origin resource, not CORS-enabled (302)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - Redirect to cross-origin resource, not CORS-enabled (303)]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest: send() - Redirect to cross-origin resource, not CORS-enabled (307)]
|
||||
expected: FAIL
|
||||
|
|
@ -33,6 +33,3 @@
|
|||
[Allow origin: [tab\]http://web-platform.test:8000]
|
||||
expected: FAIL
|
||||
|
||||
[Disallow origin: http://web-platform.test:8000/]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -33,12 +33,3 @@
|
|||
[Allow origin: [tab\]http://web-platform.test:8000]
|
||||
expected: FAIL
|
||||
|
||||
[Disallow origin: http://web-platform.test:8000/]
|
||||
expected: FAIL
|
||||
|
||||
[Disallow multiple headers (, *)]
|
||||
expected: FAIL
|
||||
|
||||
[Disallow multiple headers (*, )]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,17 +1,8 @@
|
|||
[preflight-cache.htm]
|
||||
type: testharness
|
||||
[Test preflight]
|
||||
expected: FAIL
|
||||
|
||||
[preflight for x-print should be cached]
|
||||
expected: FAIL
|
||||
|
||||
[age = 0, should not be cached]
|
||||
expected: FAIL
|
||||
|
||||
[age = -1, should not be cached]
|
||||
expected: FAIL
|
||||
|
||||
[preflight first request, second from cache, wait, third should preflight again]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -62,24 +62,12 @@
|
|||
[local (*) to remote (http://web-platform.test:8000), expect origin=http://web-platform.test:8000]
|
||||
expected: FAIL
|
||||
|
||||
[local (*) to remote (null), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[local (*) to remote (none), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[local (http://web-platform.test:8000) to remote (*), expect origin=http://web-platform.test:8000]
|
||||
expected: FAIL
|
||||
|
||||
[local (http://web-platform.test:8000) to remote (http://web-platform.test:8000), expect origin=http://web-platform.test:8000]
|
||||
expected: FAIL
|
||||
|
||||
[local (http://web-platform.test:8000) to remote (null), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[local (http://web-platform.test:8000) to remote (none), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[local (null) to remote (*), expect origin=http://web-platform.test:8000]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -110,27 +98,3 @@
|
|||
[remote (http://web-platform.test:8000) to remote2 (null), expect origin=null]
|
||||
expected: FAIL
|
||||
|
||||
[remote (http://www1.web-platform.test:8000) to remote (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (null) to remote2 (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (none) to remote2 (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (none) to remote2 (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (null) to remote (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (none) to remote (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (none) to local (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
[remote (null) to local (*), expect to fail]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
[redirect-preflight-2.htm]
|
||||
type: testharness
|
||||
[Same-origin custom-header request, redirect to cross-origin succeeds after doing a preflight]
|
||||
expected: FAIL
|
||||
|
||||
[Same-origin custom-header request, redirect to cross-origin fails after doing a non-successful preflight]
|
||||
expected: FAIL
|
||||
|
|
@ -9,6 +9,3 @@
|
|||
[getResponse: don't expose x-nonexposed]
|
||||
expected: FAIL
|
||||
|
||||
[getAllResponseHeaders: don't expose x-nonexposed]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
const NUM_TESTS = 128;
|
||||
|
||||
function encode(n) {
|
||||
if (n === 0x20) {
|
||||
return "\x2B";
|
||||
|
@ -13,27 +15,34 @@ function encode(n) {
|
|||
return "%" + (s.length === 2 ? s : '0' + s);
|
||||
}
|
||||
|
||||
function do_test(n) {
|
||||
async_test(function() {
|
||||
var x = new XMLHttpRequest();
|
||||
x.onload = this.step_func_done(function(e) {
|
||||
assert_equals(x.response, "a=" + encode(n))
|
||||
});
|
||||
x.onerror = this.unreached_func();
|
||||
x.open("POST", "resources/content.py");
|
||||
var usp = new URLSearchParams();
|
||||
usp.append("a", String.fromCharCode(n));
|
||||
x.send(usp)
|
||||
}, "XMLHttpRequest.send(URLSearchParams) (" + n + ")");
|
||||
}
|
||||
|
||||
function run_test() {
|
||||
var i = 0;
|
||||
add_result_callback(function() {
|
||||
if (++i === 128) {
|
||||
return;
|
||||
var tests = [];
|
||||
var overall_test = async_test("Overall fetch with URLSearchParams");
|
||||
for (var i = 0; i < NUM_TESTS; i++) {
|
||||
// Multiple subtests so that failures can be fine-grained
|
||||
tests[i] = async_test("XMLHttpRequest.send(URLSearchParams) (" + i + ")");
|
||||
}
|
||||
|
||||
// We use a single XHR since this test tends to time out
|
||||
// with 128 consecutive fetches when run in parallel
|
||||
// with many other WPT tests.
|
||||
var x = new XMLHttpRequest();
|
||||
x.onload = overall_test.step_func(function() {
|
||||
var response_split = x.response.split("&");
|
||||
overall_test.done();
|
||||
for (var i = 0; i < NUM_TESTS; i++) {
|
||||
tests[i].step(function() {
|
||||
assert_equals(response_split[i], "a" + i + "="+encode(i));
|
||||
tests[i].done();
|
||||
});
|
||||
}
|
||||
do_test(i);
|
||||
});
|
||||
do_test(i);
|
||||
x.onerror = overall_test.unreached_func();
|
||||
|
||||
x.open("POST", "resources/content.py");
|
||||
var usp = new URLSearchParams();
|
||||
for (var i = 0; i < NUM_TESTS; i++) {
|
||||
usp.append("a" + i, String.fromCharCode(i));
|
||||
}
|
||||
x.send(usp)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue