Update web-platform-tests to revision 0d318188757a9c996e20b82db201fd04de5aa255

This commit is contained in:
James Graham 2015-03-27 09:15:38 +00:00
parent b2a5225831
commit 1a81b18b9f
12321 changed files with 544385 additions and 6 deletions

View file

@ -0,0 +1,21 @@
<!--
postMessage('å');
/*
-->
<!doctype html>
<title>encoding, dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new Worker('#');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '\u00e5');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1 @@
Content-Type: text/html; charset=windows-1252

View file

@ -0,0 +1,23 @@
<!--
onconnect = function(e) {
e.ports[0].postMessage('å');
}
/*
-->
<!doctype html>
<title>encoding, shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new SharedWorker('#', '');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '\u00e5');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1 @@
Content-Type: text/html; charset=windows-1252

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
def main(request, response):
return "PASS" if request.GET.first('x') == 'å' else "FAIL"

View file

@ -0,0 +1,26 @@
<!--
var xhr = new XMLHttpRequest();
xhr.open('GET', '003-1.py?x=å', false);
xhr.send();
var passed = xhr.responseText == 'PASS';
postMessage(passed);
/*
-->
<!doctype html>
<title>URL encoding, dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new Worker('#');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,27 @@
<!--
onconnect = function(e) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '003-1.py?x=å', false);
xhr.send();
var passed = xhr.responseText == 'PASS';
e.ports[0].postMessage(passed);
}
/*
-->
<!doctype html>
<title>URL encoding, shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new SharedWorker('#');
worker.port.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,48 @@
importScripts("/resources/testharness.js");
var expected = [
"WorkerGlobalScope",
"EventTarget",
"DedicatedWorkerGlobalScope",
"ErrorEvent",
"Event",
"Worker",
"DOMException",
"SharedWorker",
"MessagePort",
"MessageEvent",
"WorkerNavigator",
"MessageChannel",
"WorkerLocation",
"ImageData",
"File",
"Blob",
"FileList",
"XMLHttpRequest",
"ProgressEvent",
"FormData",
"ArrayBuffer",
"Int8Array",
"Uint8Array",
"Uint8ClampedArray",
"Int16Array",
"Uint16Array",
"Int32Array",
"Uint32Array",
"Float32Array",
"Float64Array",
"DataView",
"CanvasProxy",
"ImageBitmap",
"CanvasRenderingContext2D",
"DrawingStyle",
"CanvasGradient",
"CanvasPattern",
"Path",
"TextMetrics"
];
for (var i = 0; i < expected.length; ++i) {
test(function () {
assert_own_property(self, expected[i]);
}, "The " + expected[i] + " interface object should be exposed.");
}
done();

View file

@ -0,0 +1,18 @@
importScripts("/resources/testharness.js");
var unexpected = [
"AbstractView",
"AbstractWorker",
"ApplicationCache",
"Location",
"Navigator",
"DOMImplementation",
"Audio",
"HTMLCanvasElement",
"MouseEvent",
];
for (var i = 0; i < unexpected.length; ++i) {
test(function () {
assert_false(unexpected[i] in self);
}, "The " + unexpected[i] + " interface object should not be exposed.");
}
done();

View file

@ -0,0 +1,30 @@
<!--
onconnect = function(e) {
var expected = 'ApplicationCache WorkerGlobalScope EventTarget ErrorEvent Event Worker DOMException SharedWorker MessagePort MessageEvent WorkerNavigator MessageChannel WorkerLocation Database ImageData File Blob FileList XMLHttpRequest ProgressEvent FormData ArrayBuffer Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array DataView CanvasProxy ImageBitmap CanvasRenderingContext2d DrawingStyle CanvasGradient CanvasPattern Path TextMetrics'.split(' ');
var log = [];
for (var i = 0; i < expected.length; ++i) {
if (!(expected[i] in self))
log.push(expected[i]);
}
e.ports[0].postMessage(log.join(', '));
}
/*
-->
<!doctype html>
<title>available interface objects in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new SharedWorker('#');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '', 'these interface objects were missing');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,30 @@
<!--
onconnect = function(e) {
var unexpected = 'AbstractView AbstractWorker Location Navigator DOMImplementation Audio HTMLCanvasElement MouseEvent'.split(' ');
var log = [];
for (var i = 0; i < unexpected.length; ++i) {
if (unexpected[i] in self)
log.push(unexpected[i]);
}
e.ports[0].postMessage(log.join(', '));
}
/*
-->
<!doctype html>
<title>unavailable interface objects in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new SharedWorker('#');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '', 'these interface objects were not expected');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,41 @@
<!--
if ('onmessage' in self) { // dedicated worker
onmessage = function(e) {
postMessage(e.data);
}
} else { // shared worker
onconnect = function(e) {
e.ports[0].onmessage = function(e) {
this.postMessage(e.data);
}
}
}
/*
-->
<!doctype html>
<title>dedicated and shared worker in same page</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new Worker('#');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 'dedicated');
this.done();
});
worker.postMessage('dedicated');
}, 'dedicated');
async_test(function() {
var shared = new SharedWorker('#', '');
shared.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, 'shared');
this.done();
});
shared.port.postMessage('shared');
}, 'shared');
</script>
<!--
*/
//-->

View file

@ -0,0 +1,28 @@
<!--
postMessage(1);
/*
-->
<!doctype html>
<title>creating 3 sibling dedicated workers</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function(t) {
var w1 = new Worker('#');
var w2 = new Worker('#');
var w3 = new Worker('#');
var got = [false, false, false];
var check_done = t.step_func(function() {
if (got.every(function(x) {return x})) {
t.done();
}
});
w1.onmessage = t.step_func(function(e) {got[0] = true; check_done()});
w2.onmessage = t.step_func(function(e) {got[1] = true; check_done()});
w3.onmessage = t.step_func(function(e) {got[2] = true; check_done()});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,34 @@
<!--
if (location.hash == '#1') {
var w2 = new Worker('#2');
w2.onmessage = function(e) {
postMessage('1'+e.data);
}
} else if (location.hash == '#2') {
var w3 = new Worker('#3');
w3.onmessage = function(e) {
postMessage('2'+e.data);
}
} else {
postMessage('3');
}
/*
-->
<!doctype html>
<title>creating 3 nested dedicated workers</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var w1 = new Worker('#1');
w1.onmessage = this.step_func(function(e) {
assert_equals(e.data, '123');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,7 @@
<!doctype html>
<title></title>
<script>
window.onload = function() {
var w=new SharedWorker('004-2.js', 'x');
};
</script>

View file

@ -0,0 +1,6 @@
var port;
onconnect = function(e) {
if (!port)
port = e.ports[0];
port.postMessage(1);
}

View file

@ -0,0 +1,34 @@
<!doctype html>
<title>shared worker with multiple documents</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var i = 0;
var load_count = 0;
var w1 = new SharedWorker('004-2.js', 'x');
w1.port.onmessage = function(e) {
i++;
check_result();
};
function iframe_loaded() {
load_count++;
check_result();
}
function check_result() {
//timeout to allow for extra, unexpected, messages to arrive
if (i == 3 && load_count == 2) {
setTimeout(function() {
assert_equals(load_count, 2);
assert_equals(i, 3);
done();
}, 500);
}
}
</script>
<iframe src=004-1.html onload="iframe_loaded()"></iframe>
<iframe src=004-1.html onload="iframe_loaded()"></iframe>

View file

@ -0,0 +1,37 @@
<!--
if (location.hash == '#1') {
var w2 = new SharedWorker('#2');
w2.port.onmessage = function(e) {
postMessage('1'+e.data);
}
} else if (location.hash == '#2') {
onconnect = function(e) {
var port = e.ports[0];
var w3 = new Worker('#3');
w3.onmessage = function(e) {
port.postMessage('2'+e.data);
}
}
} else {
postMessage('3');
}
/*
-->
<!doctype html>
<title>dedicated worker in shared worker in dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var w1 = new Worker('#1');
w1.onmessage = this.step_func(function(e) {
assert_equals(e.data, '123');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,3 @@
onconnect = function(e) {
e.ports[0].postMessage('3');
}

View file

@ -0,0 +1,35 @@
<!--
if (location.hash == '#1') {
onconnect = function(e) {
var port = e.ports[0];
var w2 = new Worker('#2');
w2.onmessage = function(e) {
port.postMessage('1'+e.data);
}
}
} else if (location.hash == '#2') {
var w3 = new SharedWorker('006-1.js');
w3.port.onmessage = function(e) {
postMessage('2'+e.data);
}
}
/*
-->
<!doctype html>
<title>shared worker in dedicated worker in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var w1 = new SharedWorker('#1');
w1.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '123');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,39 @@
<!--
if (location.hash == '#1') {
onconnect = function(e) {
var port = e.ports[0];
var w2 = new Worker('#2');
w2.onmessage = function(e) {
port.postMessage('1'+e.data);
}
}
} else if (location.hash == '#2') {
var w3 = new SharedWorker('#3');
w3.port.onmessage = function(e) {
postMessage('2'+e.data);
}
} else {
onconnect = function(e) {
e.ports[0].postMessage('3');
}
}
/*
-->
<!doctype html>
<title>shared worker in dedicated worker in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var w1 = new SharedWorker('#1');
w1.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '123');
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,8 @@
<!doctype html>
<title>008-1</title>
<script>
var w1 = new SharedWorker('008.html#');
w1.port.onmessage = function(e) {
e.ports[0].postMessage(2);
}
</script>

View file

@ -0,0 +1,31 @@
<!--
var channel = new MessageChannel();
var i = 0;
onconnect = function(e) {
i++;
e.ports[0].postMessage(1, [channel['port' + i]]);
}
/*
-->
<!doctype html>
<title>messagechannel in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<iframe src=008-1.html></iframe>
<script>
var t = async_test();
onload = t.step_func(function() {
var w1 = new SharedWorker('#');
w1.port.onmessage = this.step_func(function(e) {
e.ports[0].onmessage = this.step_func(function(e) {
assert_equals(e.data, 2);
this.done();
});
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,23 @@
<!--
setInterval(function() { postMessage(new Date()) }, 10)
/*
-->
<!doctype html>
<title>001-1</title>
<script>
onload = function() {
var worker = new Worker('#');
worker.onmessage = function(e) {
var started = !!parent.date;
parent.date = e.data;
if (!started) {
parent.start_test()
}
}
}
</script>
<a href='data:text/html,<title>foo</title><script>onload=function(){parent.after_load()}</script>'>link</a>
<!--
*/
//-->

View file

@ -0,0 +1,37 @@
<!--
/*
-->
<!doctype html>
<title>navigating</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var date;
var newDate;
</script>
<iframe></iframe>
<script>
var t = async_test();
var iframe = document.querySelector('iframe');
onload = t.step_func(function() {
iframe.src = "001-1.html?" + Math.random();
});
var start_test = t.step_func(function() {
window[0].document.links[0].click();
});
var after_load = t.step_func(function() {
history.back();
newDate = new Date();
setTimeout(this.step_func(function() {
assert_greater_than(Number(date), Number(newDate));
assert_equals(window[0].document.title, '001-1');
this.done();
}), 500);
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,36 @@
<!--
/*
-->
<!doctype html>
<title>navigating 2</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var date;
var newDate;
</script>
<iframe></iframe>
<script>
var t = async_test();
var iframe = document.querySelector('iframe');
onload = t.step_func(function() {
iframe.src = "001-1.html?" + Math.random();
});
var start_test = t.step_func(function() {
window[0].document.links[0].click();
});
var after_load = t.step_func(function() {
newDate = new Date();
setTimeout(this.step_func(function() {
assert_less_than(Number(date), Number(newDate));
assert_equals(window[0].document.title, 'foo');
this.done();
}), 500);
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,53 @@
<!--
var port;
var timeout;
onerror = function(a,b,c,d,e) {
// will return undefined, thus the error is "not handled"
// so error should be reported to the user, but this test doesn't check
// that.
// just make sure that this method is invoked with five arguments
clearTimeout(timeout);
var log = '';
if (arguments.length != 5)
log += 'got ' + arguments.length + ' arguments, expected 5. ';
if (typeof a != 'string')
log += 'first argument wasn\'t a string. ';
if (b != location.href)
log += 'second argument was ' + b + ', expected ' + location.href + '. ';
if (typeof c != 'number')
log += 'third argument wasn\'t a number. ';
if (typeof d != 'number')
log += 'fourth argument wasn\'t a number. ';
if (e != 42)
log += 'fifth argument wasn\'t the thrown exception. ';
port.postMessage(log);
}
onconnect = function (e) {
port = e.ports[0];
timeout = setTimeout(function() { port.postMessage('self.onerror was not invoked'); }, 250);
throw 42; // will "report the error"
}
/*
-->
<!doctype html>
<title>shared worker, not handled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
setup({allow_uncaught_exception:true});
async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('window.onerror invoked: ' + a);
});
var worker = new SharedWorker('#', '');
worker.port.onmessage = this.step_func_done(function(e) {
assert_equals(e.data, '');
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,59 @@
<!--
var port;
var timeout;
addEventListener('error', function(e) {
// event is not canceled, thus the error is "not handled"
// so error should be reported to the user, but this test doesn't check
// that.
// just make sure that this event has the right properties
clearTimeout(timeout);
var log = '';
if (!self.ErrorEvent || Object.getPrototypeOf(e) != ErrorEvent.prototype)
log += 'event should be an ErrorEvent. ';
if (e.bubbles)
log += 'event should not bubble. ';
if (!e.cancelable)
log += 'event should be cancelable. ';
if (!e.isTrusted)
log += 'event should be trusted. ';
if (typeof e.message != 'string')
log += 'message wasn\'t a string. ';
if (e.filename != location.href)
log += 'filename was ' + e.filename + ', expected ' + location.href + '. ';
if (typeof e.lineno != 'number')
log += 'lineno wasn\'t a number. ';
if (typeof e.colno != 'number')
log += 'colno argument wasn\'t a number. ';
if (e.error != 42)
log += 'fifth argument wasn\'t the thrown exception. ';
port.postMessage(log);
}, false);
onconnect = function (e) {
port = e.ports[0];
timeout = setTimeout(function() { port.postMessage('No error event fired'); }, 250);
throw 42; // will "report the error"
}
/*
-->
<!doctype html>
<title>shared worker, addEventListener</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
setup({allow_uncaught_exception:true});
async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('window.onerror invoked: ' + a);
});
var worker = new SharedWorker('#', '');
worker.port.onmessage = this.step_func_done(function(e) {
assert_equals(e.data, '');
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,39 @@
<!--
onconnect = function (e) {
setTimeout(function() { e.ports[0].postMessage(''); }, 250);
y(); // will "report the error"
// onerror is null so it'll be "not handled", and the error should be
// reported to the user, although we don't test that here
// make sure we don't fire an error event on the message port or the
// SharedWorker object
}
/*
-->
<!doctype html>
<title>shared worker, no error event on worker or port</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
setup({allow_uncaught_exception:true});
async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('window.onerror invoked: ' + a);
});
var worker = new SharedWorker('#', '');
worker.addEventListener('error', this.step_func(function(e) {
assert_unreached('error on worker');
}), false);
worker.port.addEventListener('error', this.step_func(function(e) {
assert_unreached('error on port');
}), false);
worker.port.onmessage = this.step_func_done(function(e) {
assert_equals(e.data, '');
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,18 @@
<!doctype html>
<script>
parent.t.step(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('(inner) window.onerror invoked: ' + a);
});
var worker = new SharedWorker('004.html#', '');
worker.addEventListener('error', this.step_func(function(e) {
parent.assert_unreached('(inner) error on worker');
}), false);
worker.port.addEventListener('error', this.step_func(function(e) {
parent.assert_unreached('(inner) error on port');
}), false);
worker.port.onmessage = this.step_func_done(function(e) {
parent.assert_equals(e.data, 2);
});
});
</script>

View file

@ -0,0 +1,39 @@
<!--
var i = 0;
onconnect = function (e) {
i++;
setTimeout(function() { e.ports[0].postMessage(i); }, 250);
y(); // will "report the error"
}
/*
-->
<!doctype html>
<title>shared worker in two documents and window.onerror</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
setup({allow_uncaught_exception:true});
var t = async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('(outer) window.onerror invoked: ' + a);
});
var worker = new SharedWorker('#', '');
worker.addEventListener('error', this.step_func(function(e) {
assert_unreached('(outer) error on worker');
}), false);
worker.port.addEventListener('error', this.step_func(function(e) {
assert_unreached('(outer) error on port');
}), false);
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, 1);
var iframe = document.createElement('iframe');
iframe.src = '004-1.html';
document.body.appendChild(iframe);
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,22 @@
<!--
postMessage(this === self);
/*
-->
<!doctype html>
<title>worker global scope, dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new Worker('#');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,24 @@
<!--
var passed = this === self;
onconnect = function(e) {
e.ports[0].postMessage(passed);
}
/*
-->
<!doctype html>
<title>worker global scope, shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
async_test(function() {
var worker = new SharedWorker('#');
worker.port.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
</script>
<!--
*/
//-->

View file

@ -0,0 +1,27 @@
<!--
/*
-->
<!doctype html>
<title>handling for 404 response</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
setup({allow_uncaught_exception: true});
async_test(function() {
var worker = new Worker('404_worker');
worker.onerror = this.step_func(function(e) { this.done(); });
}, 'worker', {timeout:500});
async_test(function() {
var shared = new SharedWorker('404_shared');
// NOTE: this handler will not fire, as runtime scripting errors
// are not forwarded to SharedWorker objects, but instead reported to the user directly.
shared.onerror = this.step_func(function(e) { assert_unreached(); }, shared, 'error');
setTimeout(this.step_func(function() { this.done(); }), 500);
}, 'shared');
</script>
<!--
*/
//-->

View file

@ -0,0 +1,596 @@
function createWorker(msg) {
// `type` is defined in the test case itself
if (type == 'dedicated')
return new Worker('dedicated.js#'+encodeURIComponent(msg));
else if (type == 'shared')
return (new SharedWorker('shared.js#'+encodeURIComponent(msg))).port;
else
assert_unreached('invalid or missing `type`');
}
function check(msg, input, callback, test_obj) {
if (!test_obj)
test_obj = async_test(msg);
test_obj.step(function() {
var w = createWorker(msg);
if (typeof input === 'function')
input = this.step(input);
w.postMessage(input);
w.onmessage = this.step_func(function(ev) { callback(ev.data, input, this); });
});
}
function compare_primitive(actual, input, test_obj) {
assert_equals(actual, input);
if (test_obj)
test_obj.done();
}
function compare_Array(callback, callback_is_async) {
return function(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Array, 'instanceof Array');
assert_not_equals(actual, input);
assert_equals(actual.length, input.length, 'length');
callback(actual, input);
if (test_obj && !callback_is_async)
test_obj.done();
}
}
function compare_Object(callback, callback_is_async) {
return function(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Object, 'instanceof Object');
assert_false(actual instanceof Array, 'instanceof Array');
assert_not_equals(actual, input);
callback(actual, input);
if (test_obj && !callback_is_async)
test_obj.done();
}
}
function enumerate_props(compare_func, test_obj) {
return function(actual, input) {
for (var x in input) {
compare_func(actual[x], input[x], test_obj);
}
};
}
check('primitive undefined', undefined, compare_primitive);
check('primitive null', null, compare_primitive);
check('primitive true', true, compare_primitive);
check('primitive false', false, compare_primitive);
check('primitive string, empty string', '', compare_primitive);
check('primitive string, lone high surrogate', '\uD800', compare_primitive);
check('primitive string, lone low surrogate', '\uDC00', compare_primitive);
check('primitive string, NUL', '\u0000', compare_primitive);
check('primitive string, astral character', '\uDBFF\uDFFD', compare_primitive);
check('primitive number, 0.2', 0.2, compare_primitive);
check('primitive number, 0', 0, compare_primitive);
check('primitive number, -0', -0, compare_primitive);
check('primitive number, NaN', NaN, compare_primitive);
check('primitive number, Infinity', Infinity, compare_primitive);
check('primitive number, -Infinity', -Infinity, compare_primitive);
check('primitive number, 9007199254740992', 9007199254740992, compare_primitive);
check('primitive number, -9007199254740992', -9007199254740992, compare_primitive);
check('primitive number, 9007199254740994', 9007199254740994, compare_primitive);
check('primitive number, -9007199254740994', -9007199254740994, compare_primitive);
check('Array primitives', [undefined,
null,
true,
false,
'',
'\uD800',
'\uDC00',
'\u0000',
'\uDBFF\uDFFD',
0.2,
0,
-0,
NaN,
Infinity,
-Infinity,
9007199254740992,
-9007199254740992,
9007199254740994,
-9007199254740994], compare_Array(enumerate_props(compare_primitive)));
check('Object primitives', {'undefined':undefined,
'null':null,
'true':true,
'false':false,
'empty':'',
'high surrogate':'\uD800',
'low surrogate':'\uDC00',
'nul':'\u0000',
'astral':'\uDBFF\uDFFD',
'0.2':0.2,
'0':0,
'-0':-0,
'NaN':NaN,
'Infinity':Infinity,
'-Infinity':-Infinity,
'9007199254740992':9007199254740992,
'-9007199254740992':-9007199254740992,
'9007199254740994':9007199254740994,
'-9007199254740994':-9007199254740994}, compare_Object(enumerate_props(compare_primitive)));
function compare_Boolean(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Boolean, 'instanceof Boolean');
assert_equals(String(actual), String(input), 'converted to primitive');
assert_not_equals(actual, input);
if (test_obj)
test_obj.done();
}
check('Boolean true', new Boolean(true), compare_Boolean);
check('Boolean false', new Boolean(false), compare_Boolean);
check('Array Boolean objects', [new Boolean(true), new Boolean(false)], compare_Array(enumerate_props(compare_Boolean)));
check('Object Boolean objects', {'true':new Boolean(true), 'false':new Boolean(false)}, compare_Object(enumerate_props(compare_Boolean)));
function compare_obj(what) {
var Type = window[what];
return function(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Type, 'instanceof '+what);
assert_equals(Type(actual), Type(input), 'converted to primitive');
assert_not_equals(actual, input);
if (test_obj)
test_obj.done();
};
}
check('String empty string', new String(''), compare_obj('String'));
check('String lone high surrogate', new String('\uD800'), compare_obj('String'));
check('String lone low surrogate', new String('\uDC00'), compare_obj('String'));
check('String NUL', new String('\u0000'), compare_obj('String'));
check('String astral character', new String('\uDBFF\uDFFD'), compare_obj('String'));
check('Array String objects', [new String(''),
new String('\uD800'),
new String('\uDC00'),
new String('\u0000'),
new String('\uDBFF\uDFFD')], compare_Array(enumerate_props(compare_obj('String'))));
check('Object String objects', {'empty':new String(''),
'high surrogate':new String('\uD800'),
'low surrogate':new String('\uDC00'),
'nul':new String('\u0000'),
'astral':new String('\uDBFF\uDFFD')}, compare_Object(enumerate_props(compare_obj('String'))));
check('Number 0.2', new Number(0.2), compare_obj('Number'));
check('Number 0', new Number(0), compare_obj('Number'));
check('Number -0', new Number(-0), compare_obj('Number'));
check('Number NaN', new Number(NaN), compare_obj('Number'));
check('Number Infinity', new Number(Infinity), compare_obj('Number'));
check('Number -Infinity', new Number(-Infinity), compare_obj('Number'));
check('Number 9007199254740992', new Number(9007199254740992), compare_obj('Number'));
check('Number -9007199254740992', new Number(-9007199254740992), compare_obj('Number'));
check('Number 9007199254740994', new Number(9007199254740994), compare_obj('Number'));
check('Number -9007199254740994', new Number(-9007199254740994), compare_obj('Number'));
check('Array Number objects', [new Number(0.2),
new Number(0),
new Number(-0),
new Number(NaN),
new Number(Infinity),
new Number(-Infinity),
new Number(9007199254740992),
new Number(-9007199254740992),
new Number(9007199254740994),
new Number(-9007199254740994)], compare_Array(enumerate_props(compare_obj('Number'))));
check('Object Number objects', {'0.2':new Number(0.2),
'0':new Number(0),
'-0':new Number(-0),
'NaN':new Number(NaN),
'Infinity':new Number(Infinity),
'-Infinity':new Number(-Infinity),
'9007199254740992':new Number(9007199254740992),
'-9007199254740992':new Number(-9007199254740992),
'9007199254740994':new Number(9007199254740994),
'-9007199254740994':new Number(-9007199254740994)}, compare_Object(enumerate_props(compare_obj('Number'))));
function compare_Date(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Date, 'instanceof Date');
assert_equals(Number(actual), Number(input), 'converted to primitive');
assert_not_equals(actual, input);
if (test_obj)
test_obj.done();
}
check('Date 0', new Date(0), compare_Date);
check('Date -0', new Date(-0), compare_Date);
check('Date -8.64e15', new Date(-8.64e15), compare_Date);
check('Date 8.64e15', new Date(8.64e15), compare_Date);
check('Array Date objects', [new Date(0),
new Date(-0),
new Date(-8.64e15),
new Date(8.64e15)], compare_Array(enumerate_props(compare_Date)));
check('Object Date objects', {'0':new Date(0),
'-0':new Date(-0),
'-8.64e15':new Date(-8.64e15),
'8.64e15':new Date(8.64e15)}, compare_Object(enumerate_props(compare_Date)));
function compare_RegExp(expected_source) {
// XXX ES6 spec doesn't define exact serialization for `source` (it allows several ways to escape)
return function(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof RegExp, 'instanceof RegExp');
assert_equals(actual.global, input.global, 'global');
assert_equals(actual.ignoreCase, input.ignoreCase, 'ignoreCase');
assert_equals(actual.multiline, input.multiline, 'multiline');
assert_equals(actual.source, expected_source, 'source');
assert_equals(actual.sticky, input.sticky, 'sticky');
assert_equals(actual.unicode, input.unicode, 'unicode');
assert_equals(actual.lastIndex, 0, 'lastIndex');
assert_not_equals(actual, input);
if (test_obj)
test_obj.done();
}
}
function func_RegExp_flags_lastIndex() {
var r = /foo/gim;
r.lastIndex = 2;
return r;
}
function func_RegExp_sticky() {
return new RegExp('foo', 'y');
}
function func_RegExp_unicode() {
return new RegExp('foo', 'u');
}
check('RegExp flags and lastIndex', func_RegExp_flags_lastIndex, compare_RegExp('foo'));
check('RegExp sticky flag', func_RegExp_sticky, compare_RegExp('foo'));
check('RegExp unicode flag', func_RegExp_unicode, compare_RegExp('foo'));
check('RegExp empty', new RegExp(''), compare_RegExp('(?:)'));
check('RegExp slash', new RegExp('/'), compare_RegExp('\\/'));
check('RegExp new line', new RegExp('\n'), compare_RegExp('\\n'));
check('Array RegExp object, RegExp flags and lastIndex', [func_RegExp_flags_lastIndex()], compare_Array(enumerate_props(compare_RegExp('foo'))));
check('Array RegExp object, RegExp sticky flag', function() { return [func_RegExp_sticky()]; }, compare_Array(enumerate_props(compare_RegExp('foo'))));
check('Array RegExp object, RegExp unicode flag', function() { return [func_RegExp_unicode()]; }, compare_Array(enumerate_props(compare_RegExp('foo'))));
check('Array RegExp object, RegExp empty', [new RegExp('')], compare_Array(enumerate_props(compare_RegExp('(?:)'))));
check('Array RegExp object, RegExp slash', [new RegExp('/')], compare_Array(enumerate_props(compare_RegExp('\\/'))));
check('Array RegExp object, RegExp new line', [new RegExp('\n')], compare_Array(enumerate_props(compare_RegExp('\\n'))));
check('Object RegExp object, RegExp flags and lastIndex', {'x':func_RegExp_flags_lastIndex()}, compare_Object(enumerate_props(compare_RegExp('foo'))));
check('Object RegExp object, RegExp sticky flag', function() { return {'x':func_RegExp_sticky()}; }, compare_Object(enumerate_props(compare_RegExp('foo'))));
check('Object RegExp object, RegExp unicode flag', function() { return {'x':func_RegExp_unicode()}; }, compare_Object(enumerate_props(compare_RegExp('foo'))));
check('Object RegExp object, RegExp empty', {'x':new RegExp('')}, compare_Object(enumerate_props(compare_RegExp('(?:)'))));
check('Object RegExp object, RegExp slash', {'x':new RegExp('/')}, compare_Object(enumerate_props(compare_RegExp('\\/'))));
check('Object RegExp object, RegExp new line', {'x':new RegExp('\n')}, compare_Object(enumerate_props(compare_RegExp('\\n'))));
function compare_Blob(actual, input, test_obj, expect_File) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Blob, 'instanceof Blob');
if (!expect_File)
assert_false(actual instanceof File, 'instanceof File');
assert_equals(actual.size, input.size, 'size');
assert_equals(actual.type, input.type, 'type');
assert_not_equals(actual, input);
var ev_reader = new FileReader();
var input_reader = new FileReader();
var read_count = 0;
var read_done = test_obj.step_func(function() {
read_count++;
if (read_count == 2) {
var ev_result = ev_reader.result;
var input_result = input_reader.result;
assert_equals(ev_result.byteLength, input_result.byteLength, 'byteLength');
var ev_view = new DataView(ev_result);
var input_view = new DataView(input_result);
for (var i = 0; i < ev_result.byteLength; ++i) {
assert_equals(ev_view.getUint8(i), input_view.getUint8(i), 'getUint8('+i+')');
}
if (test_obj)
test_obj.done();
}
});
var read_error = test_obj.step_func(function() { assert_unreached('FileReader error'); });
ev_reader.readAsArrayBuffer(actual);
ev_reader.onload = read_done;
ev_reader.onabort = ev_reader.onerror = read_error;
input_reader.readAsArrayBuffer(input);
input_reader.onload = read_done;
input_reader.onabort = input_reader.onerror = read_error;
}
function func_Blob_basic() {
return new Blob(['foo'], {type:'text/x-bar'});
}
check('Blob basic', func_Blob_basic, compare_Blob);
function b(str) {
return parseInt(str, 2);
}
function encode_cesu8(codeunits) {
// http://www.unicode.org/reports/tr26/ section 2.2
// only the 3-byte form is supported
var rv = [];
codeunits.forEach(function(codeunit) {
rv.push(b('11100000') + ((codeunit & b('1111000000000000')) >> 12));
rv.push(b('10000000') + ((codeunit & b('0000111111000000')) >> 6));
rv.push(b('10000000') + (codeunit & b('0000000000111111')));
});
return rv;
}
function func_Blob_bytes(arr) {
return function() {
var buffer = new ArrayBuffer(arr.length);
var view = new DataView(buffer);
for (var i = 0; i < arr.length; ++i) {
view.setUint8(i, arr[i]);
}
return new Blob([view]);
};
}
check('Blob unpaired high surrogate (invalid utf-8)', func_Blob_bytes(encode_cesu8([0xD800])), compare_Blob);
check('Blob unpaired low surrogate (invalid utf-8)', func_Blob_bytes(encode_cesu8([0xDC00])), compare_Blob);
check('Blob paired surrogates (invalid utf-8)', func_Blob_bytes(encode_cesu8([0xD800, 0xDC00])), compare_Blob);
function func_Blob_empty() {
return new Blob(['']);
}
check('Blob empty', func_Blob_empty , compare_Blob);
function func_Blob_NUL() {
return new Blob(['\u0000']);
}
check('Blob NUL', func_Blob_NUL, compare_Blob);
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_Blob_basic)], compare_Array(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Array Blob object, Blob basic');
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_Blob_bytes([0xD800]))], compare_Array(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Array Blob object, Blob unpaired high surrogate (invalid utf-8)');
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_Blob_bytes([0xDC00]))], compare_Array(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Array Blob object, Blob unpaired low surrogate (invalid utf-8)');
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_Blob_bytes([0xD800, 0xDC00]))], compare_Array(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Array Blob object, Blob paired surrogates (invalid utf-8)');
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_Blob_empty)], compare_Array(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Array Blob object, Blob empty');
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_Blob_NUL)], compare_Array(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Array Blob object, Blob NUL');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_Blob_basic)}, compare_Object(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Object Blob object, Blob basic');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_Blob_bytes([0xD800]))}, compare_Object(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Object Blob object, Blob unpaired high surrogate (invalid utf-8)');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_Blob_bytes([0xDC00]))}, compare_Object(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Object Blob object, Blob unpaired low surrogate (invalid utf-8)');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_Blob_bytes([0xD800, 0xDC00]))}, compare_Object(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Object Blob object, Blob paired surrogates (invalid utf-8)');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_Blob_empty)}, compare_Object(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Object Blob object, Blob empty');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_Blob_NUL)}, compare_Object(enumerate_props(compare_Blob, test_obj), true), test_obj);
}, 'Object Blob object, Blob NUL');
function compare_File(actual, input, test_obj) {
assert_true(actual instanceof File, 'instanceof File');
assert_equals(actual.name, input.name, 'name');
assert_equals(actual.lastModified, input.lastModified, 'lastModified');
compare_Blob(actual, input, test_obj, true);
}
function func_File_basic() {
return new File(['foo'], 'bar', {type:'text/x-bar', lastModified:42});
}
check('File basic', func_File_basic, compare_File);
function compare_FileList(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof FileList, 'instanceof FileList');
assert_equals(actual.length, input.length, 'length');
assert_not_equals(actual, input);
// XXX when there's a way to populate or construct a FileList,
// check the items in the FileList
if (test_obj)
test_obj.done();
}
function func_FileList_empty() {
var input = document.createElement('input');
input.type = 'file';
return input.files;
}
check('FileList empty', func_FileList_empty, compare_FileList);
check('Array FileList object, FileList empty', [func_FileList_empty], compare_Array(enumerate_props(compare_FileList)));
check('Object FileList object, FileList empty', {'x':func_FileList_empty}, compare_Object(enumerate_props(compare_FileList)));
function compare_ArrayBufferView(view) {
var Type = window[view];
return function(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_true(actual instanceof Type, 'instanceof '+view);
assert_equals(actual.length, input.length, 'length');
assert_not_equals(actual.buffer, input.buffer, 'buffer');
for (var i = 0; i < actual.length; ++i) {
assert_equals(actual[i], input[i], 'actual['+i+']');
}
if (test_obj)
test_obj.done();
};
}
function compare_ImageData(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_equals(actual.width, input.width, 'width');
assert_equals(actual.height, input.height, 'height');
assert_not_equals(actual.data, input.data, 'data');
compare_ArrayBufferView('Uint8ClampedArray')(actual.data, input.data, null);
if (test_obj)
test_obj.done();
}
function func_ImageData_1x1_transparent_black() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
return ctx.createImageData(1, 1);
}
check('ImageData 1x1 transparent black', func_ImageData_1x1_transparent_black, compare_ImageData);
function func_ImageData_1x1_non_transparent_non_black() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var imagedata = ctx.createImageData(1, 1);
imagedata.data[0] = 100;
imagedata.data[1] = 101;
imagedata.data[2] = 102;
imagedata.data[3] = 103;
return imagedata;
}
check('ImageData 1x1 non-transparent non-black', func_ImageData_1x1_non_transparent_non_black, compare_ImageData);
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_ImageData_1x1_transparent_black)], compare_Array(enumerate_props(compare_ImageData)), test_obj);
}, 'Array ImageData object, ImageData 1x1 transparent black');
async_test(function(test_obj) {
check(test_obj.name, [test_obj.step(func_ImageData_1x1_non_transparent_non_black)], compare_Array(enumerate_props(compare_ImageData)), test_obj);
}, 'Array ImageData object, ImageData 1x1 non-transparent non-black');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_ImageData_1x1_transparent_black)}, compare_Object(enumerate_props(compare_ImageData)), test_obj);
}, 'Object ImageData object, ImageData 1x1 transparent black');
async_test(function(test_obj) {
check(test_obj.name, {'x':test_obj.step(func_ImageData_1x1_non_transparent_non_black)}, compare_Object(enumerate_props(compare_ImageData)), test_obj);
}, 'Object ImageData object, ImageData 1x1 non-transparent non-black');
function compare_ImageBitmap(actual, input, test_obj) {
if (typeof actual === 'string')
assert_unreached(actual);
assert_equals(actual instanceof ImageBitmap, 'instanceof ImageBitmap');
assert_not_equals(actual, input);
// XXX paint the ImageBitmap on a canvas and check the data
if (test_obj)
test_obj.done();
}
function get_canvas_1x1_transparent_black() {
var canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
return canvas;
}
async_test(function(test_obj) {
var canvas = get_canvas_1x1_transparent_black();
createImageBitmap(canvas, function(image) { check(test_obj.name, image, compare_ImageBitmap, test_obj); });
}, 'ImageBitmap 1x1 transparent black');
function get_canvas_1x1_non_transparent_non_black() {
var canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
var ctx = canvas.getContext('2d');
var imagedata = ctx.getImageData(0, 0, 1, 1);
imagedata.data[0] = 100;
imagedata.data[1] = 101;
imagedata.data[2] = 102;
imagedata.data[3] = 103;
return canvas;
}
async_test(function(test_obj) {
var canvas = get_canvas_1x1_non_transparent_non_black();
createImageBitmap(canvas, function(image) { check(test_obj.name, image, compare_ImageBitmap, test_obj); });
}, 'ImageBitmap 1x1 non-transparent non-black');
async_test(function(test_obj) {
var canvas = get_canvas_1x1_transparent_black();
createImageBitmap(canvas, function(image) { check(test_obj.name, [image], compare_Array(enumerate_props(compare_ImageBitmap)), test_obj); });
}, 'Array ImageBitmap object, ImageBitmap 1x1 transparent black');
async_test(function(test_obj) {
var canvas = get_canvas_1x1_non_transparent_non_black();
createImageBitmap(canvas, function(image) { check(test_obj.name, [image], compare_Array(enumerate_props(compare_ImageBitmap)), test_obj); });
}, 'Array ImageBitmap object, ImageBitmap 1x1 non-transparent non-black');
async_test(function(test_obj) {
var canvas = get_canvas_1x1_transparent_black();
createImageBitmap(canvas, function(image) { check(test_obj.name, {'x':image}, compare_Object(enumerate_props(compare_ImageBitmap)), test_obj); });
}, 'Object ImageBitmap object, ImageBitmap 1x1 transparent black');
async_test(function(test_obj) {
var canvas = get_canvas_1x1_non_transparent_non_black();
createImageBitmap(canvas, function(image) { check(test_obj.name, {'x':image}, compare_Object(enumerate_props(compare_ImageBitmap)), test_obj); });
}, 'Object ImageBitmap object, ImageBitmap 1x1 non-transparent non-black');
check('Array sparse', new Array(10), compare_Array(enumerate_props(compare_primitive)));
check('Array with non-index property', function() {
var rv = [];
rv.foo = 'bar';
return rv;
}, compare_Array(enumerate_props(compare_primitive)));
check('Object with index property and length', {'0':'foo', 'length':1}, compare_Object(enumerate_props(compare_primitive)));
function check_circular_property(prop) {
return function(actual) {
assert_equals(actual[prop], actual);
};
}
check('Array with circular reference', function() {
var rv = [];
rv[0] = rv;
return rv;
}, compare_Array(check_circular_property('0')));
check('Object with circular reference', function() {
var rv = {};
rv['x'] = rv;
return rv;
}, compare_Object(check_circular_property('x')));
function check_identical_property_values(prop1, prop2) {
return function(actual) {
assert_equals(actual[prop1], actual[prop2]);
};
}
check('Array with identical property values', function() {
var obj = {}
return [obj, obj];
}, compare_Array(check_identical_property_values('0', '1')));
check('Object with identical property values', function() {
var obj = {}
return {'x':obj, 'y':obj};
}, compare_Object(check_identical_property_values('x', 'y')));
function check_absent_property(prop) {
return function(actual) {
assert_false(prop in actual);
};
}
check('Object with property on prototype', function() {
var Foo = function() {};
Foo.prototype = {'foo':'bar'};
return new Foo();
}, compare_Object(check_absent_property('foo')));
check('Object with non-enumerable property', function() {
var rv = {};
Object.defineProperty(rv, 'foo', {value:'bar', enumerable:false, writable:true, configurable:true});
return rv;
}, compare_Object(check_absent_property('foo')));
function check_writable_property(prop) {
return function(actual, input) {
assert_equals(actual[prop], input[prop]);
actual[prop] += ' baz';
assert_equals(actual[prop], input[prop] + ' baz');
};
}
check('Object with non-writable property', function() {
var rv = {};
Object.defineProperty(rv, 'foo', {value:'bar', enumerable:true, writable:false, configurable:true});
return rv;
}, compare_Object(check_writable_property('foo')));
function check_configurable_property(prop) {
return function(actual, input) {
assert_equals(actual[prop], input[prop]);
delete actual[prop];
assert_false('prop' in actual);
};
}
check('Object with non-configurable property', function() {
var rv = {};
Object.defineProperty(rv, 'foo', {value:'bar', enumerable:true, writable:true, configurable:false});
return rv;
}, compare_Object(check_configurable_property('foo')));

View file

@ -0,0 +1,9 @@
<!doctype html>
<title>structured clone to dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var type = 'dedicated';
</script>
<script src="common.js"></script>

View file

@ -0,0 +1,4 @@
importScripts('worker-common.js');
onmessage = function(ev) {
check(ev.data, self);
};

View file

@ -0,0 +1,9 @@
<!doctype html>
<title>structured clone to shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var type = 'shared';
</script>
<script src="common.js"></script>

View file

@ -0,0 +1,6 @@
importScripts('worker-common.js');
onconnect = function(connect_ev) {
connect_ev.ports[0].onmessage = function(message_ev) {
check(message_ev.data, this);
};
};

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
<x>foo</x>

View file

@ -0,0 +1,35 @@
<!--
var xhr = new XMLHttpRequest();
var log = '';
xhr.onreadystatechange = function(e) {
if (this.readyState == 4) {
if (this.responseXML != null)
log += 'responseXML was not null. ';
if (this.responseText != '<x>foo</x>')
log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
postMessage(log);
}
}
xhr.open('GET', '001-1.xml', true);
xhr.send();
/*
-->
<!doctype html>
<title>async XMLHttpRequest in dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test();
function runtest() {
var worker = new Worker('#');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
<!--
*/
//-->

View file

@ -0,0 +1,32 @@
<!--
var xhr = new XMLHttpRequest();
var log = '';
xhr.open('GET', '001-1.xml', false);
xhr.send();
if (xhr.responseXML != null)
log += 'responseXML was not null. ';
if (xhr.responseText != '<x>foo</x>')
log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
postMessage(log);
/*
-->
<!doctype html>
<title>sync XMLHttpRequest in dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test();
function runtest() {
var worker = new Worker('#');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
<!--
*/
//-->

View file

@ -0,0 +1,41 @@
<!--
onconnect = function(e) {
var xhr = new XMLHttpRequest();
var log = '';
var port = e.ports[0];
var postMessage = port.postMessage;
xhr.onreadystatechange = function(e) {
if (this.readyState == 4) {
if (this.responseXML != null)
log += 'responseXML was not null. ';
if (this.responseText && this.responseText != '<x>foo</x>')
log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
postMessage.call(port, log);
}
}
xhr.open('GET', '001-1.xml', true);
xhr.send();
}
/*
-->
<!doctype html>
<title>async XMLHttpRequest in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test();
function runtest() {
var worker = new SharedWorker('#', '');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
<!--
*/
//-->

View file

@ -0,0 +1,36 @@
<!--
onconnect = function(e) {
var xhr = new XMLHttpRequest();
var log = '';
xhr.open('GET', '001-1.xml', false);
xhr.send();
if (xhr.responseXML != null)
log += 'responseXML was not null. ';
if (xhr.responseText != '<x>foo</x>')
log += 'responseText was ' + xhr.responseText + ', expected <x>foo</x>. ';
e.ports[0].postMessage(log);
}
/*
-->
<!doctype html>
<title>sync XMLHttpRequest in shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test();
function runtest() {
var worker = new SharedWorker('#', '');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
<!--
*/
//-->

View file

@ -0,0 +1,21 @@
<!doctype html>
<title>base url, dedicated worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test();
var i = 0;
function runtest() {
i++;
if (i != 2)
return;
var worker = new Worker('support/005-1.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
<iframe src=support/001-1.xml onload="t.step(runtest);"></iframe>

View file

@ -0,0 +1,21 @@
<!doctype html>
<title>base url, shared worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test();
var i = 0;
function runtest() {
i++;
if (i != 2)
return;
var worker = new SharedWorker('support/006-1.js','');
worker.port.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
<iframe src=support/001-1.xml onload="t.step(runtest);"></iframe>

View file

@ -0,0 +1 @@
<x>bar</x>

View file

@ -0,0 +1,5 @@
var xhr = new XMLHttpRequest();
xhr.open('GET', '001-1.xml', false);
xhr.send();
var passed = xhr.responseText == '<x>bar</x>';
postMessage(passed);

View file

@ -0,0 +1,7 @@
onconnect = function(e) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '001-1.xml', false);
xhr.send();
var passed = xhr.responseText == '<x>bar</x>';
e.ports[0].postMessage(passed);
}