123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- <!DOCTYPE HTML>
- <html>
- <!--
- https://bugzilla.mozilla.org/show_bug.cgi?id=1170760
- -->
- <head>
- <meta charset="utf-8">
- <title>Test for Bug 1170760</title>
- <script type="application/javascript" 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(
- new Array(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(
- new Array(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) => {});
- Components.utils.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) => {});
- Components.utils.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>
|