|  | // 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); |