@@ -58,6 +58,22 @@ private predicate hasHandler(DataFlow::InvokeNode promise, string m, int i) {
5858 exists ( promise .getAMethodCall ( m ) .getCallback ( i ) )
5959}
6060
61+ /**
62+ * Gets a reference to the `Promise` object.
63+ * Either from the standard library, a polyfill import, or a polyfill that defines the global `Promise` variable.
64+ */
65+ private DataFlow:: SourceNode getAPromiseObject ( ) {
66+ // Standard library, or polyfills like [es6-shim](https://npmjs.org/package/es6-shim).
67+ result = DataFlow:: globalVarRef ( "Promise" )
68+ or
69+ // polyfills from the [`promise`](https://npmjs.org/package/promise) library.
70+ result =
71+ DataFlow:: moduleImport ( [
72+ "promise" , "promise/domains" , "promise/setimmediate" , "promise/lib/es6-extensions" ,
73+ "promise/domains/es6-extensions" , "promise/setimmediate/es6-extensions"
74+ ] )
75+ }
76+
6177/**
6278 * A call that looks like a Promise.
6379 *
@@ -75,7 +91,7 @@ class PromiseCandidate extends DataFlow::InvokeNode {
7591 * A promise object created by the standard ECMAScript 2015 `Promise` constructor.
7692 */
7793private class ES2015PromiseDefinition extends PromiseDefinition , DataFlow:: NewNode {
78- ES2015PromiseDefinition ( ) { this = DataFlow :: globalVarRef ( "Promise" ) .getAnInstantiation ( ) }
94+ ES2015PromiseDefinition ( ) { this = getAPromiseObject ( ) .getAnInstantiation ( ) }
7995
8096 override DataFlow:: FunctionNode getExecutor ( ) { result = getCallback ( 0 ) }
8197}
@@ -109,9 +125,7 @@ abstract class PromiseAllCreation extends PromiseCreationCall {
109125 * A resolved promise created by the standard ECMAScript 2015 `Promise.resolve` function.
110126 */
111127class ResolvedES2015PromiseDefinition extends ResolvedPromiseDefinition {
112- ResolvedES2015PromiseDefinition ( ) {
113- this = DataFlow:: globalVarRef ( "Promise" ) .getAMemberCall ( "resolve" )
114- }
128+ ResolvedES2015PromiseDefinition ( ) { this = getAPromiseObject ( ) .getAMemberCall ( "resolve" ) }
115129
116130 override DataFlow:: Node getValue ( ) { result = getArgument ( 0 ) }
117131}
@@ -121,8 +135,7 @@ class ResolvedES2015PromiseDefinition extends ResolvedPromiseDefinition {
121135 */
122136class AggregateES2015PromiseDefinition extends PromiseCreationCall {
123137 AggregateES2015PromiseDefinition ( ) {
124- exists ( string m | m = "all" or m = "race" or m = "any" |
125- this = DataFlow:: globalVarRef ( "Promise" ) .getAMemberCall ( m )
138+ this = getAPromiseObject ( ) .getAMemberCall ( m )
126139 )
127140 }
128141
0 commit comments