Skip to content

Commit bb1c971

Browse files
committed
add support for the when polyfill, and expand the defition of ES2015PromiseDefinition
1 parent e467ea2 commit bb1c971

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-4
lines changed

javascript/change-notes/2021-06-18-promises.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ lgtm,codescanning
66
[promise-polyfill](https://npmjs.com/package/promise-polyfill),
77
[rsvp](https://npmjs.com/package/rsvp),
88
[es6-promise](https://npmjs.com/package/es6-promise),
9-
[native-promise-only](https://npmjs.com/package/native-promise-only)
9+
[native-promise-only](https://npmjs.com/package/native-promise-only),
10+
[when](https://npmjs.com/package/when)

javascript/ql/src/semmle/javascript/Promises.qll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ private DataFlow::SourceNode getAPromiseObject() {
8181
result = DataFlow::moduleMember(["es6-promise", "rsvp"], "Promise")
8282
or
8383
result = DataFlow::moduleImport("native-promise-only")
84+
or
85+
result = DataFlow::moduleImport("when")
8486
}
8587

8688
/**
@@ -97,10 +99,11 @@ class PromiseCandidate extends DataFlow::InvokeNode {
9799
}
98100

99101
/**
100-
* A promise object created by the standard ECMAScript 2015 `Promise` constructor.
102+
* A promise object created by the standard ECMAScript 2015 `Promise` constructor,
103+
* or a polyfill implementing a superset of the ECMAScript 2015 `Promise` API.
101104
*/
102-
private class ES2015PromiseDefinition extends PromiseDefinition, DataFlow::NewNode {
103-
ES2015PromiseDefinition() { this = getAPromiseObject().getAnInstantiation() }
105+
private class ES2015PromiseDefinition extends PromiseDefinition, DataFlow::InvokeNode {
106+
ES2015PromiseDefinition() { this = getAPromiseObject().getAnInvocation() }
104107

105108
override DataFlow::FunctionNode getExecutor() { result = getCallback(0) }
106109
}

javascript/ql/test/library-tests/Promises/AdditionalPromises.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,4 @@
8181
| promises.js:79:19:79:41 | Promise ... source) |
8282
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) |
8383
| promises.js:112:17:112:62 | new RSV ... ct) {}) |
84+
| promises.js:124:19:124:30 | when(source) |

javascript/ql/test/library-tests/Promises/promises.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,9 @@
118118
var Promise = require('native-promise-only');
119119
Promise.resolve(source);
120120
})();
121+
122+
(function() {
123+
const when = require('when');
124+
const promise = when(source);
125+
const promise2 = when.resolve(source);
126+
})();

javascript/ql/test/library-tests/Promises/tests.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ test_ResolvedPromiseDefinition
4242
| promises.js:107:3:107:26 | Promise ... source) | promises.js:107:20:107:25 | source |
4343
| promises.js:114:3:114:25 | Promise ... source) | promises.js:114:19:114:24 | source |
4444
| promises.js:119:3:119:25 | Promise ... source) | promises.js:119:19:119:24 | source |
45+
| promises.js:125:20:125:39 | when.resolve(source) | promises.js:125:33:125:38 | source |
4546
test_PromiseDefinition_getARejectHandler
4647
| flow.js:26:2:26:49 | new Pro ... ource)) | flow.js:26:69:26:80 | y => sink(y) |
4748
| flow.js:32:2:32:49 | new Pro ... ource)) | flow.js:32:57:32:68 | x => sink(x) |
@@ -127,6 +128,7 @@ test_PromiseDefinition
127128
| promises.js:43:19:45:6 | Q.Promi ... \\n }) |
128129
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) |
129130
| promises.js:112:17:112:62 | new RSV ... ct) {}) |
131+
| promises.js:124:19:124:30 | when(source) |
130132
test_PromiseDefinition_getAResolveHandler
131133
| flow.js:24:2:24:49 | new Pro ... ource)) | flow.js:24:56:24:67 | x => sink(x) |
132134
| flow.js:26:2:26:49 | new Pro ... ource)) | flow.js:26:56:26:66 | x => foo(x) |
@@ -429,3 +431,5 @@ typetrack
429431
| promises.js:114:3:114:25 | Promise ... source) | promises.js:114:19:114:24 | source | store $PromiseResolveField$ |
430432
| promises.js:119:3:119:25 | Promise ... source) | promises.js:119:19:119:24 | source | copy $PromiseResolveField$ |
431433
| promises.js:119:3:119:25 | Promise ... source) | promises.js:119:19:119:24 | source | store $PromiseResolveField$ |
434+
| promises.js:125:20:125:39 | when.resolve(source) | promises.js:125:33:125:38 | source | copy $PromiseResolveField$ |
435+
| promises.js:125:20:125:39 | when.resolve(source) | promises.js:125:33:125:38 | source | store $PromiseResolveField$ |

0 commit comments

Comments
 (0)