зеркало из https://github.com/mozilla/gecko-dev.git
366 строки
10 KiB
HTML
366 строки
10 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=1170760
|
|
-->
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Test for Bug 1170760</title>
|
|
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="chrome://global/skin"/>
|
|
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1170760">Mozilla Bug 1170760</a>
|
|
<p id="display"></p>
|
|
<div id="content" style="display: none">
|
|
<iframe id="t" src="http://example.org/chrome/dom/promise/tests/file_promise_xrays.html"></iframe>
|
|
</div>
|
|
|
|
<pre id="test">
|
|
<script type="application/javascript">
|
|
|
|
var win = $("t").contentWindow;
|
|
|
|
/** Test for Bug 1170760 **/
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
function testLoadComplete() {
|
|
is(win.location.href, $("t").src, "Should have loaded the right thing");
|
|
nextTest();
|
|
}
|
|
|
|
function testHaveXray() {
|
|
is(typeof win.Promise.race, "function", "Should see a race() function");
|
|
var exception;
|
|
try {
|
|
win.Promise.wrappedJSObject.race;
|
|
} catch (e) {
|
|
exception = e;
|
|
}
|
|
is(exception, "Getting race", "Should have thrown the right exception");
|
|
is(win.wrappedJSObject.setupThrew, false, "Setup should not have thrown");
|
|
nextTest();
|
|
}
|
|
|
|
function testConstructor1() {
|
|
var p = new win.Promise(function(resolve, reject) { resolve(win.Promise.resolve(5)); });
|
|
p.then(
|
|
function(arg) {
|
|
is(arg, 5, "Content Promise constructor resolved with content promise should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Content Promise constructor resolved with content promise should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testConstructor2() {
|
|
var p = new win.Promise(function(resolve, reject) { resolve(Promise.resolve(5)); });
|
|
p.then(
|
|
function(arg) {
|
|
is(arg, 5, "Content Promise constructor resolved with chrome promise should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Content Promise constructor resolved with chrome promise should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testRace1() {
|
|
var p = win.Promise.race(new win.Array(1, 2));
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg == 1 || arg == 2,
|
|
"Should get the right value when racing content-side array");
|
|
},
|
|
function(e) {
|
|
ok(false, "testRace1 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testRace2() {
|
|
var p = win.Promise.race(
|
|
[win.Promise.resolve(1), win.Promise.resolve(2)]);
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg == 1 || arg == 2,
|
|
"Should get the right value when racing content-side array of explicit Promises");
|
|
},
|
|
function(e) {
|
|
ok(false, "testRace2 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testRace3() {
|
|
// This works with a chrome-side array because we do the iteration
|
|
// while still in the Xray compartment.
|
|
var p = win.Promise.race([1, 2]);
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg == 1 || arg == 2,
|
|
"Should get the right value when racing chrome-side array");
|
|
},
|
|
function(e) {
|
|
ok(false, "testRace3 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testRace4() {
|
|
// This works with both content-side and chrome-side Promises because we want
|
|
// it to and go to some lengths to make it work.
|
|
var p = win.Promise.race([Promise.resolve(1), win.Promise.resolve(2)]);
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg == 1 || arg == 2,
|
|
"Should get the right value when racing chrome-side promises");
|
|
},
|
|
function(e) {
|
|
ok(false, "testRace4 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testAll1() {
|
|
var p = win.Promise.all(new win.Array(1, 2));
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg instanceof win.Array, "Should get an Array from Promise.all (1)");
|
|
is(arg[0], 1, "First entry of Promise.all return value should be correct (1)");
|
|
is(arg[1], 2, "Second entry of Promise.all return value should be correct (1)");
|
|
},
|
|
function(e) {
|
|
ok(false, "testAll1 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testAll2() {
|
|
var p = win.Promise.all(
|
|
[win.Promise.resolve(1), win.Promise.resolve(2)]);
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg instanceof win.Array, "Should get an Array from Promise.all (2)");
|
|
is(arg[0], 1, "First entry of Promise.all return value should be correct (2)");
|
|
is(arg[1], 2, "Second entry of Promise.all return value should be correct (2)");
|
|
},
|
|
function(e) {
|
|
ok(false, "testAll2 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testAll3() {
|
|
// This works with a chrome-side array because we do the iteration
|
|
// while still in the Xray compartment.
|
|
var p = win.Promise.all([1, 2]);
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg instanceof win.Array, "Should get an Array from Promise.all (3)");
|
|
is(arg[0], 1, "First entry of Promise.all return value should be correct (3)");
|
|
is(arg[1], 2, "Second entry of Promise.all return value should be correct (3)");
|
|
},
|
|
function(e) {
|
|
ok(false, "testAll3 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testAll4() {
|
|
// This works with both content-side and chrome-side Promises because we want
|
|
// it to and go to some lengths to make it work.
|
|
var p = win.Promise.all([Promise.resolve(1), win.Promise.resolve(2)]);
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg instanceof win.Array, "Should get an Array from Promise.all (4)");
|
|
is(arg[0], 1, "First entry of Promise.all return value should be correct (4)");
|
|
is(arg[1], 2, "Second entry of Promise.all return value should be correct (4)");
|
|
},
|
|
function(e) {
|
|
ok(false, "testAll4 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testAll5() {
|
|
var p = win.Promise.all(new win.Array());
|
|
p.then(
|
|
function(arg) {
|
|
ok(arg instanceof win.Array, "Should get an Array from Promise.all (5)");
|
|
},
|
|
function(e) {
|
|
ok(false, "testAll5 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testResolve1() {
|
|
var p = win.Promise.resolve(5);
|
|
ok(p instanceof win.Promise, "Promise.resolve should return a promise");
|
|
p.then(
|
|
function(arg) {
|
|
is(arg, 5, "Should get correct Promise.resolve value");
|
|
},
|
|
function(e) {
|
|
ok(false, "testAll5 threw exception: " + e);
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testResolve2() {
|
|
var p = win.Promise.resolve(5);
|
|
var q = win.Promise.resolve(p);
|
|
is(q, p, "Promise.resolve should just pass through Promise values");
|
|
nextTest();
|
|
}
|
|
|
|
function testResolve3() {
|
|
var p = win.Promise.resolve(Promise.resolve(5));
|
|
p.then(
|
|
function(arg) {
|
|
is(arg, 5, "Promise.resolve with chrome Promise should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Promise.resolve with chrome Promise should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testResolve4() {
|
|
var p = new win.Promise((res, rej) => {});
|
|
Cu.getJSTestingFunctions().resolvePromise(p, 42);
|
|
p.then(
|
|
function(arg) {
|
|
is(arg, 42, "Resolving an Xray to a promise with TestingFunctions resolvePromise should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Resolving an Xray to a promise with TestingFunctions resolvePromise should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testReject1() {
|
|
var p = win.Promise.reject(5);
|
|
ok(p instanceof win.Promise, "Promise.reject should return a promise");
|
|
p.then(
|
|
function(arg) {
|
|
ok(false, "Promise should be rejected");
|
|
},
|
|
function(e) {
|
|
is(e, 5, "Should get correct Promise.reject value");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testReject2() {
|
|
var p = new win.Promise((res, rej) => {});
|
|
Cu.getJSTestingFunctions().rejectPromise(p, 42);
|
|
p.then(
|
|
function(arg) {
|
|
ok(false, "Rejecting an Xray to a promise with TestingFunctions rejectPromise should trigger catch handler");
|
|
},
|
|
function(e) {
|
|
is(e, 42, "Rejecting an Xray to a promise with TestingFunctions rejectPromise should work");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testThen1() {
|
|
var p = win.Promise.resolve(5);
|
|
var q = p.then((x) => x * x);
|
|
ok(q instanceof win.Promise,
|
|
"Promise.then should return a promise from the right global");
|
|
q.then(
|
|
function(arg) {
|
|
is(arg, 25, "Promise.then should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Promise.then should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testThen2() {
|
|
var p = win.Promise.resolve(5);
|
|
var q = p.then((x) => Promise.resolve(x * x));
|
|
ok(q instanceof win.Promise,
|
|
"Promise.then should return a promise from the right global");
|
|
q.then(
|
|
function(arg) {
|
|
is(arg, 25, "Promise.then resolved with chrome promise should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Promise.then resolved with chrome promise should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testCatch1() {
|
|
var p = win.Promise.reject(5);
|
|
ok(p instanceof win.Promise, "Promise.reject should return a promise");
|
|
var q = p.catch((x) => x * x);
|
|
ok(q instanceof win.Promise,
|
|
"Promise.catch should return a promise from the right global");
|
|
q.then(
|
|
function(arg) {
|
|
is(arg, 25, "Promise.catch should work");
|
|
},
|
|
function(e) {
|
|
ok(false, "Promise.catch should not fail");
|
|
}
|
|
).then(nextTest);
|
|
}
|
|
|
|
function testToStringTag1() {
|
|
is(win.Promise.prototype[Symbol.toStringTag], "Promise", "@@toStringTag was incorrect");
|
|
var p = win.Promise.resolve();
|
|
is(String(p), "[object Promise]", "String() result was incorrect");
|
|
is(p.toString(), "[object Promise]", "toString result was incorrect");
|
|
is(Object.prototype.toString.call(p), "[object Promise]", "second toString result was incorrect");
|
|
nextTest();
|
|
}
|
|
|
|
var tests = [
|
|
testLoadComplete,
|
|
testHaveXray,
|
|
testConstructor1,
|
|
testConstructor2,
|
|
testRace1,
|
|
testRace2,
|
|
testRace3,
|
|
testRace4,
|
|
testAll1,
|
|
testAll2,
|
|
testAll3,
|
|
testAll4,
|
|
testAll5,
|
|
testResolve1,
|
|
testResolve2,
|
|
testResolve3,
|
|
testResolve4,
|
|
testReject1,
|
|
testReject2,
|
|
testThen1,
|
|
testThen2,
|
|
testCatch1,
|
|
testToStringTag1,
|
|
];
|
|
|
|
function nextTest() {
|
|
if (tests.length == 0) {
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
tests.shift()();
|
|
}
|
|
|
|
addLoadEvent(nextTest);
|
|
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|