@memlab/core 1.1.12 → 1.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/__tests__/parser/HeapParser.test.d.ts +1 -1
- package/dist/__tests__/parser/HeapParser.test.js +2 -2
- package/dist/__tests__/parser/NodeHeap.test.d.ts +1 -1
- package/dist/__tests__/parser/NodeHeap.test.js +1 -1
- package/dist/__tests__/parser/StringNode.test.d.ts +1 -1
- package/dist/__tests__/parser/StringNode.test.js +1 -1
- package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.d.ts +1 -1
- package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.js +1 -1
- package/dist/__tests__/utils/utils.test.d.ts +1 -1
- package/dist/__tests__/utils/utils.test.js +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +7 -2
- package/dist/lib/BaseOption.d.ts +1 -1
- package/dist/lib/BaseOption.js +1 -1
- package/dist/lib/BrowserInfo.d.ts +1 -1
- package/dist/lib/BrowserInfo.js +1 -1
- package/dist/lib/Config.d.ts +11 -2
- package/dist/lib/Config.js +36 -3
- package/dist/lib/Console.d.ts +1 -1
- package/dist/lib/Console.js +1 -1
- package/dist/lib/Constant.d.ts +1 -1
- package/dist/lib/Constant.js +1 -1
- package/dist/lib/FileManager.d.ts +5 -3
- package/dist/lib/FileManager.js +13 -5
- package/dist/lib/HeapAnalyzer.d.ts +1 -1
- package/dist/lib/HeapAnalyzer.js +1 -1
- package/dist/lib/HeapParser.d.ts +1 -1
- package/dist/lib/HeapParser.js +1 -1
- package/dist/lib/InternalValueSetter.d.ts +1 -1
- package/dist/lib/InternalValueSetter.js +1 -1
- package/dist/lib/NodeHeap.d.ts +1 -1
- package/dist/lib/NodeHeap.js +1 -1
- package/dist/lib/PackageInfoLoader.js +1 -1
- package/dist/lib/ProcessManager.d.ts +1 -1
- package/dist/lib/ProcessManager.js +1 -1
- package/dist/lib/Serializer.d.ts +1 -1
- package/dist/lib/Serializer.js +22 -7
- package/dist/lib/StringLoader.d.ts +1 -1
- package/dist/lib/StringLoader.js +1 -1
- package/dist/lib/Types.d.ts +33 -1
- package/dist/lib/Types.js +1 -1
- package/dist/lib/Utils.d.ts +3 -1
- package/dist/lib/Utils.js +62 -5
- package/dist/lib/heap-data/HeapEdge.d.ts +1 -1
- package/dist/lib/heap-data/HeapEdge.js +1 -1
- package/dist/lib/heap-data/HeapLocation.d.ts +3 -2
- package/dist/lib/heap-data/HeapLocation.js +8 -1
- package/dist/lib/heap-data/HeapNode.d.ts +1 -1
- package/dist/lib/heap-data/HeapNode.js +2 -2
- package/dist/lib/heap-data/HeapSnapshot.d.ts +1 -1
- package/dist/lib/heap-data/HeapSnapshot.js +1 -1
- package/dist/lib/heap-data/HeapStringNode.d.ts +1 -1
- package/dist/lib/heap-data/HeapStringNode.js +1 -1
- package/dist/lib/heap-data/HeapUtils.d.ts +1 -1
- package/dist/lib/heap-data/HeapUtils.js +1 -1
- package/dist/lib/heap-data/MemLabTagStore.d.ts +1 -1
- package/dist/lib/heap-data/MemLabTagStore.js +1 -1
- package/dist/lib/leak-filters/BaseLeakFilter.rule.d.ts +1 -1
- package/dist/lib/leak-filters/BaseLeakFilter.rule.js +1 -1
- package/dist/lib/leak-filters/LeakFilterRuleList.d.ts +1 -1
- package/dist/lib/leak-filters/LeakFilterRuleList.js +1 -1
- package/dist/lib/leak-filters/LeakObjectFilter.d.ts +1 -1
- package/dist/lib/leak-filters/LeakObjectFilter.js +1 -1
- package/dist/lib/leak-filters/rules/FilterByExternalFilter.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterByExternalFilter.rule.js +1 -1
- package/dist/lib/leak-filters/rules/FilterDetachedDOMElement.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterDetachedDOMElement.rule.js +1 -1
- package/dist/lib/leak-filters/rules/FilterHermesNode.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterHermesNode.rule.js +1 -1
- package/dist/lib/leak-filters/rules/FilterOverSizedNodeAsLeak.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterOverSizedNodeAsLeak.rule.js +1 -1
- package/dist/lib/leak-filters/rules/FilterStackTraceFrame.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterStackTraceFrame.rule.js +1 -1
- package/dist/lib/leak-filters/rules/FilterTrivialNode.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterTrivialNode.rule.js +1 -1
- package/dist/lib/leak-filters/rules/FilterUnmountedFiberNode.rule.d.ts +1 -1
- package/dist/lib/leak-filters/rules/FilterUnmountedFiberNode.rule.js +1 -1
- package/dist/logger/LeakClusterLogger.d.ts +1 -1
- package/dist/logger/LeakClusterLogger.js +1 -1
- package/dist/logger/LeakTraceDetailsLogger.d.ts +1 -1
- package/dist/logger/LeakTraceDetailsLogger.js +1 -1
- package/dist/modes/BaseMode.d.ts +1 -1
- package/dist/modes/BaseMode.js +1 -1
- package/dist/modes/InteractionTestMode.d.ts +1 -1
- package/dist/modes/InteractionTestMode.js +1 -1
- package/dist/modes/MeasureMode.d.ts +1 -1
- package/dist/modes/MeasureMode.js +1 -1
- package/dist/modes/RunningModes.d.ts +1 -1
- package/dist/modes/RunningModes.js +1 -1
- package/dist/paths/TraceFinder.d.ts +1 -1
- package/dist/paths/TraceFinder.js +1 -1
- package/dist/trace-cluster/ClusterUtils.d.ts +16 -2
- package/dist/trace-cluster/ClusterUtils.js +43 -1
- package/dist/trace-cluster/ClusterUtilsHelper.d.ts +1 -1
- package/dist/trace-cluster/ClusterUtilsHelper.js +1 -1
- package/dist/trace-cluster/ClusteringHeuristics.d.ts +1 -1
- package/dist/trace-cluster/ClusteringHeuristics.js +1 -1
- package/dist/trace-cluster/EvalutationMetric.d.ts +1 -1
- package/dist/trace-cluster/EvalutationMetric.js +1 -1
- package/dist/trace-cluster/MultiIterationSeqClustering.d.ts +21 -0
- package/dist/trace-cluster/MultiIterationSeqClustering.js +112 -0
- package/dist/trace-cluster/SequentialClustering.d.ts +1 -1
- package/dist/trace-cluster/SequentialClustering.js +1 -1
- package/dist/trace-cluster/TraceBucket.d.ts +1 -1
- package/dist/trace-cluster/TraceBucket.js +4 -4
- package/dist/trace-cluster/TraceElement.d.ts +1 -1
- package/dist/trace-cluster/TraceElement.js +1 -1
- package/dist/trace-cluster/strategies/MLTraceSimilarityStrategy.d.ts +1 -1
- package/dist/trace-cluster/strategies/MLTraceSimilarityStrategy.js +1 -1
- package/dist/trace-cluster/strategies/TraceAsClusterStrategy.d.ts +1 -1
- package/dist/trace-cluster/strategies/TraceAsClusterStrategy.js +1 -1
- package/dist/trace-cluster/strategies/TraceSimilarityStrategy.d.ts +1 -1
- package/dist/trace-cluster/strategies/TraceSimilarityStrategy.js +1 -1
- package/dist/trace-cluster/strategies/machine-learning/DistanceMatrix.d.ts +1 -1
- package/dist/trace-cluster/strategies/machine-learning/DistanceMatrix.js +1 -1
- package/dist/trace-cluster/strategies/machine-learning/HAC.d.ts +1 -1
- package/dist/trace-cluster/strategies/machine-learning/HAC.js +1 -1
- package/dist/trace-cluster/strategies/machine-learning/Ngram.d.ts +1 -1
- package/dist/trace-cluster/strategies/machine-learning/Ngram.js +1 -1
- package/dist/trace-cluster/strategies/machine-learning/TfidfVectorizer.d.ts +1 -1
- package/dist/trace-cluster/strategies/machine-learning/TfidfVectorizer.js +1 -1
- package/package.json +4 -4
package/dist/lib/Serializer.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -136,11 +136,18 @@ function JSONifyNodeOneLevel(node) {
|
|
|
136
136
|
});
|
|
137
137
|
return info;
|
|
138
138
|
}
|
|
139
|
-
|
|
139
|
+
// double check when you try to call JSONify methods
|
|
140
|
+
// other than JSONifyNodeShallow and JSONifyNodeInShort inside this method
|
|
141
|
+
// as it may trigger infinite recursion
|
|
142
|
+
function JSONifyNodeShallow(node, options = {}) {
|
|
140
143
|
const info = Object.create(null);
|
|
144
|
+
options.processedNodeId = options.processedNodeId || new Set();
|
|
145
|
+
options.processedNodeId.add(node.id);
|
|
141
146
|
iterateSelectedEdges(node, (edge) => {
|
|
147
|
+
var _a;
|
|
142
148
|
const key = JSONifyEdgeNameAndType(edge);
|
|
143
|
-
if (
|
|
149
|
+
if (!((_a = options.processedNodeId) === null || _a === void 0 ? void 0 : _a.has(edge.toNode.id)) &&
|
|
150
|
+
objectNodeUsefulProps.has(edge.name_or_index)) {
|
|
144
151
|
info[key] = JSONifyNodeShallow(edge.toNode);
|
|
145
152
|
}
|
|
146
153
|
else {
|
|
@@ -148,6 +155,7 @@ function JSONifyNodeShallow(node) {
|
|
|
148
155
|
}
|
|
149
156
|
return null;
|
|
150
157
|
});
|
|
158
|
+
options.processedNodeId.delete(node.id);
|
|
151
159
|
return info;
|
|
152
160
|
}
|
|
153
161
|
const fiberNodeUsefulProps = new Set([
|
|
@@ -266,7 +274,7 @@ function JSONifyCode(node, args, options) {
|
|
|
266
274
|
}
|
|
267
275
|
function JSONifyContext(node, args, options) {
|
|
268
276
|
const info = Object.create(null);
|
|
269
|
-
const key = 'variables in scope (used by nested closures)';
|
|
277
|
+
const key = 'variables in defining scope (used by nested closures)';
|
|
270
278
|
const closure_vars = (info[key] = Object.create(null));
|
|
271
279
|
iterateSelectedEdges(node, (edge) => {
|
|
272
280
|
const key = filterJSONPropName(edge.name_or_index);
|
|
@@ -324,9 +332,15 @@ function JSONifyNode(node, args, options) {
|
|
|
324
332
|
return {};
|
|
325
333
|
}
|
|
326
334
|
let info;
|
|
335
|
+
// defense against infinite recursion
|
|
336
|
+
if (options.processedNodeId.has(node.id)) {
|
|
337
|
+
info = JSONifyNodeShallow(node);
|
|
338
|
+
return info;
|
|
339
|
+
}
|
|
340
|
+
options.processedNodeId.add(node.id);
|
|
327
341
|
const depths = options.forceJSONifyDepth;
|
|
328
342
|
if (Utils_1.default.isDetachedDOMNode(node) && depths !== 0) {
|
|
329
|
-
info = JSONifyDetachedHTMLElement(node, args, EMPTY_JSONIFY_OPTIONS);
|
|
343
|
+
info = JSONifyDetachedHTMLElement(node, args, Object.assign(Object.assign({}, EMPTY_JSONIFY_OPTIONS), { processedNodeId: options.processedNodeId }));
|
|
330
344
|
}
|
|
331
345
|
else if (Utils_1.default.isFiberNode(node) && depths !== 0) {
|
|
332
346
|
info = JSONifyFiberNode(node, args, options);
|
|
@@ -349,6 +363,7 @@ function JSONifyNode(node, args, options) {
|
|
|
349
363
|
else {
|
|
350
364
|
info = JSONifyOrdinaryValue(node, args, options);
|
|
351
365
|
}
|
|
366
|
+
options.processedNodeId.delete(node.id);
|
|
352
367
|
if (node.location) {
|
|
353
368
|
info[`${filterJSONPropName('allocation location (extra)')}`] = {
|
|
354
369
|
script_id: node.location.script_id,
|
|
@@ -376,7 +391,7 @@ function JSONifyPath(path, _snapshot, args) {
|
|
|
376
391
|
let idx = 0;
|
|
377
392
|
let encounterDetachedNode = false;
|
|
378
393
|
ret['$tabsOrder:' + JSONifyTabsOrder()] = '';
|
|
379
|
-
ret[`${idx++}: ${getNodeNameInJSON(path.node, args)}`] = JSONifyNode(path.node, args, EMPTY_JSONIFY_OPTIONS);
|
|
394
|
+
ret[`${idx++}: ${getNodeNameInJSON(path.node, args)}`] = JSONifyNode(path.node, args, Object.assign(Object.assign({}, EMPTY_JSONIFY_OPTIONS), { processedNodeId: new Set() }));
|
|
380
395
|
let pathItem = path;
|
|
381
396
|
while (pathItem === null || pathItem === void 0 ? void 0 : pathItem.edge) {
|
|
382
397
|
const edge = pathItem.edge;
|
|
@@ -386,7 +401,7 @@ function JSONifyPath(path, _snapshot, args) {
|
|
|
386
401
|
nextNode.highlight = true;
|
|
387
402
|
}
|
|
388
403
|
const edgeRetainSize = pathItem.edgeRetainSize;
|
|
389
|
-
ret[`${idx++}: ${getEdgeNameInJSON(edge, edgeRetainSize)}${getNodeNameInJSON(nextNode, args)}`] = JSONifyNode(nextNode, args, EMPTY_JSONIFY_OPTIONS);
|
|
404
|
+
ret[`${idx++}: ${getEdgeNameInJSON(edge, edgeRetainSize)}${getNodeNameInJSON(nextNode, args)}`] = JSONifyNode(nextNode, args, Object.assign(Object.assign({}, EMPTY_JSONIFY_OPTIONS), { processedNodeId: new Set() }));
|
|
390
405
|
pathItem = pathItem.next;
|
|
391
406
|
}
|
|
392
407
|
return ret;
|
package/dist/lib/StringLoader.js
CHANGED
package/dist/lib/Types.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
* @format
|
|
8
|
-
* @oncall
|
|
8
|
+
* @oncall web_perf_infra
|
|
9
9
|
*/
|
|
10
10
|
import { ParsedArgs } from 'minimist';
|
|
11
11
|
import type { LaunchOptions, Page } from 'puppeteer';
|
|
@@ -413,6 +413,34 @@ export interface IScenario {
|
|
|
413
413
|
* ```
|
|
414
414
|
*/
|
|
415
415
|
cookies?: () => Cookies;
|
|
416
|
+
/**
|
|
417
|
+
* `beforeInitialPageLoad` is the callback function that will be called only
|
|
418
|
+
* once before the initial page load. This callback can be used to set up
|
|
419
|
+
* the HTTP headers or to prepare data before loading the web page.
|
|
420
|
+
*
|
|
421
|
+
* * **Parameters**:
|
|
422
|
+
* * page: `Page` | the puppeteer [`Page`](https://pptr.dev/api/puppeteer.page)
|
|
423
|
+
* object, which provides APIs to interact with the web browser
|
|
424
|
+
*
|
|
425
|
+
* * **Examples**:
|
|
426
|
+
* ```typescript
|
|
427
|
+
* const scenario = {
|
|
428
|
+
* url: () => 'https://www.npmjs.com/',
|
|
429
|
+
* beforeInitialPageLoad: async (page) => {
|
|
430
|
+
* // before the initial page load
|
|
431
|
+
* },
|
|
432
|
+
* action: async (page) => {
|
|
433
|
+
* await page.click('a[href="/link"]');
|
|
434
|
+
* },
|
|
435
|
+
* back: async (page) => {
|
|
436
|
+
* await page.click('a[href="/back"]');
|
|
437
|
+
* },
|
|
438
|
+
* }
|
|
439
|
+
*
|
|
440
|
+
* module.exports = scenario;
|
|
441
|
+
* ```
|
|
442
|
+
*/
|
|
443
|
+
beforeInitialPageLoad?: InteractionsCallback;
|
|
416
444
|
/**
|
|
417
445
|
* String value of the initial url of the page.
|
|
418
446
|
*
|
|
@@ -1092,6 +1120,10 @@ export interface IHeapLocation {
|
|
|
1092
1120
|
* get the {@link IHeapSnapshot} containing this location instance
|
|
1093
1121
|
*/
|
|
1094
1122
|
snapshot: IHeapSnapshot;
|
|
1123
|
+
/**
|
|
1124
|
+
* get the heap object this location this location represents
|
|
1125
|
+
*/
|
|
1126
|
+
node: Nullable<IHeapNode>;
|
|
1095
1127
|
/**
|
|
1096
1128
|
* get the script ID of the source file
|
|
1097
1129
|
*/
|
package/dist/lib/Types.js
CHANGED
package/dist/lib/Utils.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
* @format
|
|
8
|
-
* @oncall
|
|
8
|
+
* @oncall web_perf_infra
|
|
9
9
|
*/
|
|
10
10
|
import type { HaltOrThrowOptions } from './Types';
|
|
11
11
|
import type { Browser, Page } from 'puppeteer';
|
|
@@ -121,6 +121,7 @@ declare function haltOrThrow(errorInfo: string | Error, options?: HaltOrThrowOpt
|
|
|
121
121
|
declare function getError(maybeError: unknown): Error;
|
|
122
122
|
declare function isNodeDominatedByDeletionsArray(node: IHeapNode): boolean;
|
|
123
123
|
declare function getUniqueID(): string;
|
|
124
|
+
declare function getClosureSourceUrl(node: IHeapNode): Nullable<string>;
|
|
124
125
|
declare const _default: {
|
|
125
126
|
applyToNodes: typeof applyToNodes;
|
|
126
127
|
callAsync: typeof callAsync;
|
|
@@ -136,6 +137,7 @@ declare const _default: {
|
|
|
136
137
|
extractHTMLElementNodeInfo: typeof extractHTMLElementNodeInfo;
|
|
137
138
|
filterNodesInPlace: typeof filterNodesInPlace;
|
|
138
139
|
getAllDominators: typeof getAllDominators;
|
|
140
|
+
getClosureSourceUrl: typeof getClosureSourceUrl;
|
|
139
141
|
getConditionalDominatorIds: typeof getConditionalDominatorIds;
|
|
140
142
|
getError: typeof getError;
|
|
141
143
|
getEdgeByNameAndType: typeof getEdgeByNameAndType;
|
package/dist/lib/Utils.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
12
|
if (k2 === undefined) k2 = k;
|
|
@@ -484,7 +484,10 @@ function checkScenarioInstance(s) {
|
|
|
484
484
|
(s.repeat && typeof s.repeat !== 'function') ||
|
|
485
485
|
(s.isPageLoaded && typeof s.isPageLoaded !== 'function') ||
|
|
486
486
|
(s.leakFilter && typeof s.leakFilter !== 'function') ||
|
|
487
|
-
(s.beforeLeakFilter && typeof s.beforeLeakFilter !== 'function')
|
|
487
|
+
(s.beforeLeakFilter && typeof s.beforeLeakFilter !== 'function') ||
|
|
488
|
+
(s.beforeInitialPageLoad &&
|
|
489
|
+
typeof s.beforeInitialPageLoad !== 'function') ||
|
|
490
|
+
(s.setup && typeof s.setup !== 'function')) {
|
|
488
491
|
throw new Error('Invalid senario');
|
|
489
492
|
}
|
|
490
493
|
return s;
|
|
@@ -537,7 +540,10 @@ function getScenarioName(scenario) {
|
|
|
537
540
|
if (!scenario.name) {
|
|
538
541
|
return Constant_1.default.namePrefixForScenarioFromFile;
|
|
539
542
|
}
|
|
540
|
-
|
|
543
|
+
if (Constant_1.default.namePrefixForScenarioFromFile.length > 0) {
|
|
544
|
+
return Constant_1.default.namePrefixForScenarioFromFile + '-' + scenario.name();
|
|
545
|
+
}
|
|
546
|
+
return scenario.name();
|
|
541
547
|
}
|
|
542
548
|
function handleSnapshotError(e) {
|
|
543
549
|
haltOrThrow(e, {
|
|
@@ -818,8 +824,11 @@ function extractHTMLElementNodeInfo(node) {
|
|
|
818
824
|
return `${node.name} ${extractFiberNodeInfo(reactFiberEdge.toNode)}`;
|
|
819
825
|
}
|
|
820
826
|
function hasOnlyWeakReferrers(node) {
|
|
821
|
-
const referrer = node.findAnyReferrer(
|
|
822
|
-
|
|
827
|
+
const referrer = node.findAnyReferrer(
|
|
828
|
+
// shortcut references are added by JS engine
|
|
829
|
+
// GC won't consider shortcut as a retaining edge
|
|
830
|
+
(edge) => edge.type !== 'weak' && edge.type !== 'shortcut');
|
|
831
|
+
return referrer == null;
|
|
823
832
|
}
|
|
824
833
|
function getRunMetaFilePath() {
|
|
825
834
|
return Config_1.default.useExternalSnapshot
|
|
@@ -886,6 +895,11 @@ function isInterestingPath(p) {
|
|
|
886
895
|
if (Config_1.default.hideBrowserLeak && styleEngineRetainsDetachedElement(p)) {
|
|
887
896
|
return false;
|
|
888
897
|
}
|
|
898
|
+
// if the path has pattern: Pending activitiies -> DetachedElement
|
|
899
|
+
if (Config_1.default.hideBrowserLeak &&
|
|
900
|
+
pendingActivitiesRetainsDetachedElementChain(p)) {
|
|
901
|
+
return false;
|
|
902
|
+
}
|
|
889
903
|
return true;
|
|
890
904
|
}
|
|
891
905
|
// return true if the heap node represents JS object or closure
|
|
@@ -965,6 +979,29 @@ function styleEngineRetainsDetachedElement(path) {
|
|
|
965
979
|
// check if the InternalNode is pointing to a detached element
|
|
966
980
|
return !!p && isDetachedDOMNode(p.node);
|
|
967
981
|
}
|
|
982
|
+
function pendingActivitiesRetainsDetachedElementChain(path) {
|
|
983
|
+
let p = path;
|
|
984
|
+
// find the Pending activities
|
|
985
|
+
while (p && p.node && !isPendingActivityNode(p.node)) {
|
|
986
|
+
p = p.next;
|
|
987
|
+
if (!p) {
|
|
988
|
+
return false;
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
p = p.next;
|
|
992
|
+
if (!p || !p.node) {
|
|
993
|
+
return false;
|
|
994
|
+
}
|
|
995
|
+
// all the following reference chain is detached DOM elements
|
|
996
|
+
// pointing to other detached DOM elements
|
|
997
|
+
while (p && p.node) {
|
|
998
|
+
if (!isDetachedDOMNode(p.node)) {
|
|
999
|
+
return false;
|
|
1000
|
+
}
|
|
1001
|
+
p = p.next;
|
|
1002
|
+
}
|
|
1003
|
+
return true;
|
|
1004
|
+
}
|
|
968
1005
|
function pathHasDetachedHTMLNode(path) {
|
|
969
1006
|
if (!path) {
|
|
970
1007
|
return false;
|
|
@@ -1695,6 +1732,25 @@ let uindex = 1;
|
|
|
1695
1732
|
function getUniqueID() {
|
|
1696
1733
|
return `${process_1.default.pid}-${Date.now()}-${uindex++}`;
|
|
1697
1734
|
}
|
|
1735
|
+
// try to get the url that defines the closure function
|
|
1736
|
+
// this is particular to heap snapshot taken from V8 in Chromium
|
|
1737
|
+
function getClosureSourceUrl(node) {
|
|
1738
|
+
var _a, _b;
|
|
1739
|
+
if (node.type !== 'closure') {
|
|
1740
|
+
return null;
|
|
1741
|
+
}
|
|
1742
|
+
const shared = node.getReferenceNode('shared', 'internal');
|
|
1743
|
+
if (!shared) {
|
|
1744
|
+
return null;
|
|
1745
|
+
}
|
|
1746
|
+
const debug = shared.getReferenceNode('script_or_debug_info', 'internal');
|
|
1747
|
+
if (!debug) {
|
|
1748
|
+
return null;
|
|
1749
|
+
}
|
|
1750
|
+
const urlNode = debug.getReferenceNode('name', 'internal');
|
|
1751
|
+
const url = (_b = (_a = urlNode === null || urlNode === void 0 ? void 0 : urlNode.toStringNode()) === null || _a === void 0 ? void 0 : _a.stringValue) !== null && _b !== void 0 ? _b : null;
|
|
1752
|
+
return url;
|
|
1753
|
+
}
|
|
1698
1754
|
exports.default = {
|
|
1699
1755
|
applyToNodes,
|
|
1700
1756
|
callAsync,
|
|
@@ -1710,6 +1766,7 @@ exports.default = {
|
|
|
1710
1766
|
extractHTMLElementNodeInfo,
|
|
1711
1767
|
filterNodesInPlace,
|
|
1712
1768
|
getAllDominators,
|
|
1769
|
+
getClosureSourceUrl,
|
|
1713
1770
|
getConditionalDominatorIds,
|
|
1714
1771
|
getError,
|
|
1715
1772
|
getEdgeByNameAndType,
|
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @format
|
|
8
8
|
* @lightSyntaxTransform
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
|
-
import type { IHeapLocation } from '../Types';
|
|
11
|
+
import type { IHeapLocation, IHeapNode, Nullable } from '../Types';
|
|
12
12
|
import type HeapSnapshot from './HeapSnapshot';
|
|
13
13
|
export default class HeapLocation implements IHeapLocation {
|
|
14
14
|
private heapSnapshot;
|
|
15
15
|
private idx;
|
|
16
16
|
constructor(heapSnapshot: HeapSnapshot, idx: number);
|
|
17
17
|
get snapshot(): HeapSnapshot;
|
|
18
|
+
get node(): Nullable<IHeapNode>;
|
|
18
19
|
get script_id(): number;
|
|
19
20
|
get line(): number;
|
|
20
21
|
get column(): number;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @format
|
|
8
8
|
* @lightSyntaxTransform
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
'use strict';
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -18,6 +18,13 @@ class HeapLocation {
|
|
|
18
18
|
get snapshot() {
|
|
19
19
|
return this.heapSnapshot;
|
|
20
20
|
}
|
|
21
|
+
get node() {
|
|
22
|
+
const heapSnapshot = this.heapSnapshot;
|
|
23
|
+
const locations = heapSnapshot.snapshot.locations;
|
|
24
|
+
const locationFieldsCount = heapSnapshot._locationFieldsCount;
|
|
25
|
+
const objectIndex = locations[this.idx * locationFieldsCount + heapSnapshot._locationObjectIndexOffset];
|
|
26
|
+
return heapSnapshot.nodes.get(objectIndex);
|
|
27
|
+
}
|
|
21
28
|
get script_id() {
|
|
22
29
|
const heapSnapshot = this.heapSnapshot;
|
|
23
30
|
const locations = heapSnapshot.snapshot.locations;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @format
|
|
8
8
|
* @lightSyntaxTransform
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
'use strict';
|
|
12
12
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
@@ -257,7 +257,7 @@ class HeapNode {
|
|
|
257
257
|
get location() {
|
|
258
258
|
const heapSnapshot = this.heapSnapshot;
|
|
259
259
|
const locationIdx = heapSnapshot._nodeIdx2LocationIdx[this.idx];
|
|
260
|
-
if (locationIdx
|
|
260
|
+
if (locationIdx == null) {
|
|
261
261
|
return null;
|
|
262
262
|
}
|
|
263
263
|
return new HeapLocation_1.default(heapSnapshot, locationIdx);
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @format
|
|
8
8
|
* @lightSyntaxTransform
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
import type { IHeapNode, IHeapNodes, IHeapEdges, IHeapSnapshot, HeapNodeTypes, HeapEdgeTypes, HeapSnapshotMeta, RawHeapSnapshot, NumericDictionary, Nullable } from '../Types';
|
|
12
12
|
import HeapNode from './HeapNode';
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
|
-
* @oncall
|
|
9
|
+
* @oncall web_perf_infra
|
|
10
10
|
*/
|
|
11
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|