| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| // Test that Promises use @@species appropriately |
| |
| // Another constructor with no species will not be instantiated |
| var test = new Promise(function(){}); |
| var bogoCount = 0; |
| function bogusConstructor() { bogoCount++; } |
| test.constructor = bogusConstructor; |
| assertTrue(Promise.resolve(test) instanceof Promise); |
| assertFalse(Promise.resolve(test) instanceof bogusConstructor); |
| // Tests that chromium:575314 is fixed thoroughly |
| Promise.resolve(test).catch(e => %AbortJS("Error " + e)).then(() => { |
| if (bogoCount != 0) %AbortJS("bogoCount was " + bogoCount + " should be 0"); |
| }); |
| |
| // If there is a species, it will be instantiated |
| // @@species will be read exactly once, and the constructor is called with a |
| // function |
| var count = 0; |
| var params; |
| class MyPromise extends Promise { |
| constructor(...args) { |
| super(...args); |
| params = args; |
| } |
| static get [Symbol.species]() { |
| count++ |
| return this; |
| } |
| } |
| |
| var myPromise = MyPromise.resolve().then(); |
| assertEquals(1, count); |
| assertEquals(1, params.length); |
| assertEquals('function', typeof(params[0])); |
| assertTrue(myPromise instanceof MyPromise); |
| assertTrue(myPromise instanceof Promise); |