130 lines
3.6 KiB
HTML
130 lines
3.6 KiB
HTML
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Test a XMLHttpRequest request of a Blob URL responds appropriately.</title>
|
|
<meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
|
|
<script src="../../resources/testharness.js"></script>
|
|
<script src="../../resources/testharnessreport.js"></script>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
var array = new Int8Array([0, 1, 2, 3]);
|
|
var blob = new Blob(array);
|
|
var url = URL.createObjectURL(blob);
|
|
|
|
function test_allowed_method_sync(method) {
|
|
test (() => {
|
|
var req = new XMLHttpRequest;
|
|
var onLoad = false;
|
|
req.open(method, url, false);
|
|
|
|
req.onerror = function(evt) {
|
|
assert_unreached('Error callback called for synchronous ' + method + ' XHR');
|
|
}
|
|
|
|
req.onload = function() {
|
|
onLoad = true;
|
|
}
|
|
|
|
try {
|
|
req.send();
|
|
assert_true(onLoad);
|
|
}
|
|
catch(e) {
|
|
assert_unreached('Exception thrown for synchronous ' + method + ' XHR');
|
|
}
|
|
}, 'Synchronous XHR request should succeed with ' + method);
|
|
}
|
|
|
|
function test_notAllowed_method_sync(method) {
|
|
test (() => {
|
|
var req = new XMLHttpRequest;
|
|
var onError = false;
|
|
req.open(method, url, false);
|
|
|
|
req.onerror = function(evt) {
|
|
onError = true;
|
|
}
|
|
|
|
req.onload = function() {
|
|
assert_unreached('Exception should be thrown for synchronous ' + method + ' XHR');
|
|
}
|
|
|
|
assert_throws('NetworkError', () => { req.send(); }, 'Exception thrown for synchronous ' + method + ' XHR');
|
|
|
|
assert_false(onError, 'Error callback is called');
|
|
}, 'Synchronous XHR request should throw exception with ' + method);
|
|
}
|
|
|
|
function create_async_xhr_promise(method) {
|
|
return new Promise(function(resolve) {
|
|
var req = new XMLHttpRequest;
|
|
var status = { "onError" : false, "onLoad" : false };
|
|
|
|
req.open(method, url, true);
|
|
|
|
req.onerror = function(evt) {
|
|
status.onError = true;
|
|
}
|
|
|
|
req.onload = function() {
|
|
status.onLoad = true;
|
|
}
|
|
|
|
req.onloadend = function() {
|
|
resolve(status);
|
|
}
|
|
|
|
try {
|
|
req.send();
|
|
}
|
|
catch(e) {
|
|
assert_unreached('Exception thrown');
|
|
}
|
|
});
|
|
}
|
|
|
|
function test_method_async(method, shouldLoad) {
|
|
promise_test(() => {
|
|
return create_async_xhr_promise(method).then((res) => {
|
|
assert_equals(res.onError, !shouldLoad, 'XHR request calls onError callback');
|
|
assert_equals(res.onLoad, shouldLoad, 'XHR request is loaded');
|
|
})
|
|
}, 'Asynchronous XHR request should ' + (shouldLoad ? 'succeed' : 'calls onError callback') + ' with ' + method);
|
|
}
|
|
|
|
|
|
|
|
function test_forbidden_method(request) {
|
|
test(() => {
|
|
assert_throws('SecurityError', () => {
|
|
var req = new XMLHttpRequest;
|
|
req.open(request, url);
|
|
})
|
|
}, 'Exception should be thrown for ' + request + ' request');
|
|
}
|
|
test_forbidden_method('TRACE');
|
|
test_forbidden_method('TRACK');
|
|
test_forbidden_method('CONNECT');
|
|
|
|
test_allowed_method_sync('GET');
|
|
test_notAllowed_method_sync('OPTIONS');
|
|
test_notAllowed_method_sync('HEAD');
|
|
test_notAllowed_method_sync('PUT');
|
|
test_notAllowed_method_sync('DELETE');
|
|
test_notAllowed_method_sync('INVALID');
|
|
test_notAllowed_method_sync('POST');
|
|
|
|
test_method_async('GET', true);
|
|
test_method_async('OPTIONS',false);
|
|
test_method_async('HEAD',false);
|
|
test_method_async('PUT',false);
|
|
test_method_async('DELETE',false);
|
|
test_method_async('INVALID',false);
|
|
test_method_async('POST',false);
|
|
done()
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|