promise-subclassing.js (1650B)
1 // |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue 2 3 let results = []; 4 5 class SubPromise extends Promise { 6 constructor(executor) { 7 results.push('SubPromise ctor called'); 8 super(executor); 9 } 10 then(res, rej) { 11 results.push('SubPromise#then called'); 12 return intermediatePromise = super.then(res, rej); 13 } 14 } 15 16 let subPromise = new SubPromise(function(res, rej) { 17 results.push('SubPromise ctor called executor'); 18 res('result'); 19 }); 20 21 let intermediatePromise; 22 let allSubPromise = SubPromise.all([subPromise]); 23 24 assertEq(subPromise instanceof SubPromise, true); 25 assertEq(allSubPromise instanceof SubPromise, true); 26 assertEq(intermediatePromise instanceof SubPromise, true); 27 28 expected = [ 29 'SubPromise ctor called', 30 'SubPromise ctor called executor', 31 'SubPromise ctor called', 32 'SubPromise#then called', 33 'SubPromise ctor called', 34 ]; 35 36 assertEq(results.length, expected.length); 37 expected.forEach((expected,i) => assertEq(results[i], expected)); 38 39 subPromise.then(val=>results.push('subPromise.then with val ' + val)); 40 allSubPromise.then(val=>results.push('allSubPromise.then with val ' + val)); 41 42 expected.forEach((expected,i) => assertEq(results[i], expected)); 43 expected = expected.concat([ 44 'SubPromise#then called', 45 'SubPromise ctor called', 46 'SubPromise#then called', 47 'SubPromise ctor called', 48 ]); 49 50 assertEq(results.length, expected.length); 51 expected.forEach((expected,i) => assertEq(results[i], expected)); 52 53 drainJobQueue(); 54 55 expected = expected.concat([ 56 'subPromise.then with val result', 57 'allSubPromise.then with val result', 58 ]); 59 60 assertEq(results.length, expected.length); 61 62 this.reportCompare && reportCompare(0, 0, "ok");