Skip to content

Commit 8975c3a

Browse files
committed
broaden which types are recognized by API-graphs
1 parent 2f3869f commit 8975c3a

File tree

2 files changed

+21
-39
lines changed

2 files changed

+21
-39
lines changed

javascript/ql/src/semmle/javascript/ApiGraphs.qll

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,8 @@ module API {
317317
tn.hasQualifiedName(moduleName, exportedName) and
318318
result = Impl::MkCanonicalNameUse(tn).(Node).getInstance()
319319
)
320+
or
321+
result = Impl::MkHasUnderlyingType(moduleName, exportedName)
320322
}
321323
}
322324

@@ -413,6 +415,13 @@ module API {
413415
not n.isRoot() and
414416
isUsed(n)
415417
} or
418+
/**
419+
* An instance of a TypeScript type, identified by name of the type-annotation.
420+
* This API node is exclusively used by `API::Node::ofType`.
421+
*/
422+
MkHasUnderlyingType(string moduleName, string exportName) {
423+
any(TypeAnnotation n).hasQualifiedName(moduleName, exportName)
424+
} or
416425
MkSyntheticCallbackArg(DataFlow::Node src, int bound, DataFlow::InvokeNode nd) {
417426
trackUseNode(src, true, bound).flowsTo(nd.getCalleeNode())
418427
}
@@ -423,7 +432,8 @@ module API {
423432
MkModuleExport or MkClassInstance or MkAsyncFuncResult or MkDef or MkCanonicalNameDef or
424433
MkSyntheticCallbackArg;
425434

426-
class TUse = MkModuleUse or MkModuleImport or MkUse or MkCanonicalNameUse;
435+
class TUse =
436+
MkModuleUse or MkModuleImport or MkUse or MkCanonicalNameUse or MkHasUnderlyingType;
427437

428438
private predicate hasSemantics(DataFlow::Node nd) { not nd.getTopLevel().isExterns() }
429439

@@ -678,6 +688,12 @@ module API {
678688
nd = MkUse(ref)
679689
or
680690
exists(CanonicalName n | nd = MkCanonicalNameUse(n) | ref.asExpr() = n.getAnAccess())
691+
or
692+
exists(string moduleName, string exportsName |
693+
nd = MkHasUnderlyingType(moduleName, exportsName)
694+
|
695+
ref.(DataFlow::SourceNode).hasUnderlyingType(moduleName, exportsName)
696+
)
681697
}
682698

683699
/** Holds if module `m` exports `rhs`. */

javascript/ql/src/semmle/javascript/frameworks/Puppeteer.qll

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,22 @@ module Puppeteer {
99
*/
1010
private API::Node puppeteer() { result = API::moduleImport(["puppeteer", "puppeteer-core"]) }
1111

12-
private class BrowserTypeEntryPoint extends API::EntryPoint {
13-
BrowserTypeEntryPoint() { this = "PuppeteerBrowserTypeEntryPoint" }
14-
15-
override DataFlow::SourceNode getAUse() { result.hasUnderlyingType("puppeteer", "Browser") }
16-
17-
override DataFlow::Node getARhs() { none() }
18-
}
19-
2012
/**
2113
* A reference to a `Browser` from puppeteer.
2214
*/
2315
private API::Node browser() {
24-
result = API::root().getASuccessor(any(BrowserTypeEntryPoint b))
16+
result = API::Node::ofType("puppeteer", "Browser")
2517
or
2618
result = puppeteer().getMember(["launch", "connect"]).getReturn().getPromised()
2719
or
2820
result = [page(), context(), target()].getMember("browser").getReturn()
2921
}
3022

31-
private class PageTypeEntryPoint extends API::EntryPoint {
32-
PageTypeEntryPoint() { this = "PuppeteerPageTypeEntryPoint" }
33-
34-
override DataFlow::SourceNode getAUse() { result.hasUnderlyingType("puppeteer", "Page") }
35-
36-
override DataFlow::Node getARhs() { none() }
37-
}
38-
3923
/**
4024
* A reference to a `Page` from puppeteer.
4125
*/
4226
API::Node page() {
43-
result = API::root().getASuccessor(any(PageTypeEntryPoint b))
27+
result = API::Node::ofType("puppeteer", "Page")
4428
or
4529
result = [browser(), context()].getMember("newPage").getReturn().getPromised()
4630
or
@@ -49,19 +33,11 @@ module Puppeteer {
4933
result = target().getMember("page").getReturn().getPromised()
5034
}
5135

52-
private class TargetTypeEntryPoint extends API::EntryPoint {
53-
TargetTypeEntryPoint() { this = "PuppeteerTargetTypeEntryPoint" }
54-
55-
override DataFlow::SourceNode getAUse() { result.hasUnderlyingType("puppeteer", "Target") }
56-
57-
override DataFlow::Node getARhs() { none() }
58-
}
59-
6036
/**
6137
* A reference to a `Target` from puppeteer.
6238
*/
6339
private API::Node target() {
64-
result = API::root().getASuccessor(any(TargetTypeEntryPoint b))
40+
result = API::Node::ofType("puppeteer", "Target")
6541
or
6642
result = [page(), browser()].getMember("target").getReturn()
6743
or
@@ -70,21 +46,11 @@ module Puppeteer {
7046
result = target().getMember("opener").getReturn()
7147
}
7248

73-
private class ContextTypeEntryPoint extends API::EntryPoint {
74-
ContextTypeEntryPoint() { this = "PuppeteerContextTypeEntryPoint" }
75-
76-
override DataFlow::SourceNode getAUse() {
77-
result.hasUnderlyingType("puppeteer", "BrowserContext")
78-
}
79-
80-
override DataFlow::Node getARhs() { none() }
81-
}
82-
8349
/**
8450
* A reference to a `BrowserContext` from puppeteer.
8551
*/
8652
private API::Node context() {
87-
result = API::root().getASuccessor(any(ContextTypeEntryPoint b))
53+
result = API::Node::ofType("puppeteer", "BrowserContext")
8854
or
8955
result = [page(), target()].getMember("browserContext").getReturn()
9056
or

0 commit comments

Comments
 (0)