chrome-devtools-frontend 1.0.951864 → 1.0.952784
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/config/gni/devtools_grd_files.gni +3 -0
- package/front_end/.eslintrc.js +6 -0
- package/front_end/core/host/UserMetrics.ts +2 -1
- package/front_end/core/i18n/locales/en-US.json +3 -0
- package/front_end/core/i18n/locales/en-XL.json +3 -0
- package/front_end/core/root/Runtime.ts +4 -12
- package/front_end/core/sdk/PageResourceLoader.ts +2 -1
- package/front_end/entrypoints/formatter_worker/AcornTokenizer.ts +39 -39
- package/front_end/entrypoints/formatter_worker/CSSFormatter.ts +54 -54
- package/front_end/entrypoints/formatter_worker/ESTreeWalker.ts +20 -20
- package/front_end/entrypoints/formatter_worker/FormattedContentBuilder.ts +54 -54
- package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +145 -144
- package/front_end/entrypoints/formatter_worker/JavaScriptFormatter.ts +40 -40
- package/front_end/entrypoints/heap_snapshot_worker/AllocationProfile.ts +64 -69
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +202 -200
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotLoader.ts +109 -108
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.ts +17 -17
- package/front_end/entrypoints/inspector_main/InspectorMain.ts +30 -30
- package/front_end/entrypoints/inspector_main/RenderingOptions.ts +25 -25
- package/front_end/entrypoints/main/ExecutionContextSelector.ts +52 -55
- package/front_end/entrypoints/main/MainImpl.ts +49 -49
- package/front_end/entrypoints/node_app/NodeConnectionsPanel.ts +43 -43
- package/front_end/entrypoints/node_app/NodeMain.ts +38 -38
- package/front_end/generated/InspectorBackendCommands.js +5 -1
- package/front_end/generated/protocol.d.ts +16 -0
- package/front_end/legacy/legacy-defs.d.ts +0 -21
- package/front_end/models/heap_snapshot_model/HeapSnapshotModel.ts +1 -1
- package/front_end/models/issues_manager/ClientHintIssue.ts +95 -0
- package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +6 -6
- package/front_end/models/issues_manager/ContrastCheckTrigger.ts +15 -15
- package/front_end/models/issues_manager/CorsIssue.ts +9 -9
- package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +5 -5
- package/front_end/models/issues_manager/DeprecationIssue.ts +7 -7
- package/front_end/models/issues_manager/GenericIssue.ts +5 -5
- package/front_end/models/issues_manager/HeavyAdIssue.ts +5 -5
- package/front_end/models/issues_manager/Issue.ts +10 -10
- package/front_end/models/issues_manager/IssueResolver.ts +11 -10
- package/front_end/models/issues_manager/IssuesManager.ts +61 -56
- package/front_end/models/issues_manager/LowTextContrastIssue.ts +4 -4
- package/front_end/models/issues_manager/MixedContentIssue.ts +7 -7
- package/front_end/models/issues_manager/NavigatorUserAgentIssue.ts +7 -7
- package/front_end/models/issues_manager/QuirksModeIssue.ts +4 -4
- package/front_end/models/issues_manager/SameSiteCookieIssue.ts +16 -16
- package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +5 -5
- package/front_end/models/issues_manager/SourceFrameIssuesManager.ts +32 -31
- package/front_end/models/issues_manager/TrustedWebActivityIssue.ts +5 -5
- package/front_end/models/issues_manager/WasmCrossOriginModuleSharingIssue.ts +5 -5
- package/front_end/models/issues_manager/descriptions/clientHintMetaTagAllowListInvalidOrigin.md +4 -0
- package/front_end/models/issues_manager/descriptions/clientHintMetaTagModifiedHTML.md +4 -0
- package/front_end/models/issues_manager/issues_manager.ts +2 -0
- package/front_end/panels/application/components/BackForwardCacheView.ts +33 -33
- package/front_end/panels/application/components/EndpointsGrid.ts +12 -12
- package/front_end/panels/application/components/FrameDetailsView.ts +108 -110
- package/front_end/panels/application/components/OriginTrialTreeView.ts +45 -45
- package/front_end/panels/application/components/PermissionsPolicySection.ts +19 -19
- package/front_end/panels/application/components/ReportsGrid.ts +30 -30
- package/front_end/panels/application/components/StackTrace.ts +48 -47
- package/front_end/panels/application/components/TrustTokensView.ts +31 -31
- package/front_end/panels/console/ConsoleView.ts +1 -1
- package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +41 -52
- package/front_end/panels/css_overview/CSSOverviewController.ts +2 -2
- package/front_end/panels/css_overview/CSSOverviewPanel.ts +18 -27
- package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +2 -2
- package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +6 -6
- package/front_end/panels/css_overview/components/CSSOverviewStartView.ts +4 -4
- package/front_end/panels/elements/components/AccessibilityTreeNode.ts +17 -17
- package/front_end/panels/elements/components/AdornerManager.ts +21 -21
- package/front_end/panels/elements/components/AdornerSettingsPane.ts +14 -14
- package/front_end/panels/elements/components/CSSQuery.ts +16 -16
- package/front_end/panels/elements/components/ComputedStyleProperty.ts +14 -14
- package/front_end/panels/elements/components/ComputedStyleTrace.ts +15 -15
- package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +78 -78
- package/front_end/panels/elements/components/ElementsPanelLink.ts +16 -16
- package/front_end/panels/elements/components/LayoutPane.ts +47 -47
- package/front_end/panels/elements/components/NodeText.ts +18 -18
- package/front_end/panels/elements/components/QueryContainer.ts +40 -40
- package/front_end/panels/elements/components/StylePropertyEditor.ts +18 -18
- package/front_end/panels/emulation/components/DeviceSizeInputElement.ts +4 -4
- package/front_end/panels/issues/AffectedBlockedByResponseView.ts +4 -4
- package/front_end/panels/issues/AffectedCookiesView.ts +4 -5
- package/front_end/panels/issues/AffectedDirectivesView.ts +19 -19
- package/front_end/panels/issues/AffectedDocumentsInQuirksModeView.ts +7 -8
- package/front_end/panels/issues/AffectedElementsView.ts +4 -4
- package/front_end/panels/issues/AffectedElementsWithLowContrastView.ts +7 -8
- package/front_end/panels/issues/AffectedHeavyAdView.ts +8 -8
- package/front_end/panels/issues/AffectedResourcesView.ts +25 -26
- package/front_end/panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts +8 -8
- package/front_end/panels/issues/AffectedSourcesView.ts +4 -4
- package/front_end/panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts +4 -4
- package/front_end/panels/issues/AttributionReportingIssueDetailsView.ts +17 -17
- package/front_end/panels/issues/CSPViolationsListView.ts +22 -23
- package/front_end/panels/issues/CSPViolationsView.ts +17 -17
- package/front_end/panels/issues/ComboBoxOfCheckBoxes.ts +13 -13
- package/front_end/panels/issues/CorsIssueDetailsView.ts +23 -23
- package/front_end/panels/issues/GenericIssueDetailsView.ts +4 -4
- package/front_end/panels/issues/HiddenIssuesRow.ts +7 -7
- package/front_end/panels/issues/IssueAggregator.ts +95 -95
- package/front_end/panels/issues/IssueKindView.ts +14 -14
- package/front_end/panels/issues/IssueView.ts +98 -98
- package/front_end/panels/issues/IssuesPane.ts +102 -102
- package/front_end/panels/issues/WasmCrossOriginModuleSharingAffectedResourcesView.ts +5 -5
- package/front_end/panels/issues/components/HideIssuesMenu.ts +10 -10
- package/front_end/panels/media/PlayerListView.ts +160 -97
- package/front_end/panels/media/PlayerMessagesView.ts +1 -0
- package/front_end/panels/media/playerListView.css +58 -0
- package/front_end/panels/network/NetworkLogView.ts +2 -6
- package/front_end/panels/network/NetworkWaterfallColumn.ts +2 -4
- package/front_end/panels/network/components/RequestTrustTokensView.ts +40 -40
- package/front_end/panels/network/components/WebBundleInfoView.ts +9 -9
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +92 -37
- package/front_end/panels/performance_monitor/performanceMonitor.css +32 -0
- package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +2 -2
- package/front_end/panels/settings/components/SyncSection.ts +14 -14
- package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +96 -96
- package/front_end/panels/sources/BreakpointEditDialog.ts +4 -3
- package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -1
- package/front_end/panels/timeline/TimelineTreeView.ts +1 -1
- package/front_end/panels/timeline/components/WebVitalsLane.ts +77 -76
- package/front_end/panels/timeline/components/WebVitalsTimeline.ts +133 -133
- package/front_end/panels/timeline/components/WebVitalsTooltip.ts +9 -9
- package/front_end/panels/webauthn/WebauthnPane.ts +203 -205
- package/front_end/third_party/diff/DiffWrapper.ts +7 -0
- package/front_end/ui/components/adorners/Adorner.ts +2 -2
- package/front_end/ui/components/buttons/Button.ts +9 -9
- package/front_end/ui/components/data_grid/DataGrid.ts +64 -64
- package/front_end/ui/components/data_grid/DataGridController.ts +22 -22
- package/front_end/ui/components/data_grid/DataGridUtils.ts +3 -0
- package/front_end/ui/components/diff_view/DiffView.ts +6 -6
- package/front_end/ui/components/expandable_list/ExpandableList.ts +5 -5
- package/front_end/ui/components/icon_button/Icon.ts +4 -4
- package/front_end/ui/components/icon_button/IconButton.ts +4 -4
- package/front_end/ui/components/issue_counter/IssueCounter.ts +3 -3
- package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +11 -11
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryInspector.ts +50 -50
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryInspectorController.ts +6 -6
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryInspectorPane.ts +4 -4
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryNavigator.ts +12 -12
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryValueInterpreter.ts +11 -11
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryViewer.ts +40 -39
- package/front_end/ui/components/linear_memory_inspector/ValueInterpreterDisplay.ts +18 -18
- package/front_end/ui/components/linear_memory_inspector/ValueInterpreterSettings.ts +6 -6
- package/front_end/ui/components/linkifier/LinkifierImpl.ts +4 -4
- package/front_end/ui/components/markdown_view/MarkdownImage.ts +5 -5
- package/front_end/ui/components/markdown_view/MarkdownLink.ts +2 -2
- package/front_end/ui/components/markdown_view/MarkdownView.ts +4 -4
- package/front_end/ui/components/panel_feedback/FeedbackButton.ts +2 -2
- package/front_end/ui/components/panel_feedback/PanelFeedback.ts +2 -2
- package/front_end/ui/components/panel_feedback/PreviewToggle.ts +4 -4
- package/front_end/ui/components/render_coordinator/RenderCoordinator.ts +22 -22
- package/front_end/ui/components/report_view/ReportView.ts +16 -16
- package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +14 -14
- package/front_end/ui/components/settings/SettingCheckbox.ts +5 -5
- package/front_end/ui/components/survey_link/SurveyLink.ts +8 -8
- package/front_end/ui/components/text_editor/TextEditor.ts +9 -9
- package/front_end/ui/components/text_prompt/TextPrompt.ts +18 -18
- package/front_end/ui/components/tree_outline/TreeOutline.ts +69 -70
- package/front_end/ui/legacy/SearchableView.ts +13 -4
- package/front_end/ui/legacy/components/source_frame/JSONView.ts +1 -1
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +13 -12
- package/front_end/ui/legacy/components/source_frame/XMLView.ts +2 -2
- package/front_end/ui/legacy/themeColors.css +2 -0
- package/front_end/ui/legacy/theme_support/theme_support_impl.ts +34 -7
- package/package.json +1 -1
- package/scripts/eslint_rules/lib/use_private_class_members.js +41 -0
- package/scripts/eslint_rules/tests/use_private_class_members_test.js +62 -0
- package/scripts/migration/class-fields/migrate.js +2 -3
- package/scripts/migration/class-fields/migrate.sh +1 -3
- package/scripts/migration/class-fields/package.json +1 -1
- package/config/gni/all_devtools_files.gni +0 -255
- package/scripts/build/devtools_file_hashes.py +0 -82
- package/scripts/devtools_run/devtools_run_cli +0 -49
- package/scripts/devtools_run/package.json +0 -13
- package/scripts/unzip.py +0 -20
- package/scripts/visualize_deps/jquery_svg.html +0 -57
- package/scripts/visualize_deps/run_visualize.js +0 -119
|
@@ -36,30 +36,30 @@ import {ESTreeWalker} from './ESTreeWalker.js';
|
|
|
36
36
|
import type {FormattedContentBuilder} from './FormattedContentBuilder.js';
|
|
37
37
|
|
|
38
38
|
export class JavaScriptFormatter {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
readonly #builder: FormattedContentBuilder;
|
|
40
|
+
#tokenizer!: AcornTokenizer;
|
|
41
|
+
#content!: string;
|
|
42
|
+
#fromOffset!: number;
|
|
43
|
+
#lastLineNumber!: number;
|
|
44
|
+
#toOffset?: number;
|
|
45
45
|
constructor(builder: FormattedContentBuilder) {
|
|
46
|
-
this
|
|
46
|
+
this.#builder = builder;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
format(text: string, lineEndings: number[], fromOffset: number, toOffset: number): void {
|
|
50
|
-
this
|
|
51
|
-
this
|
|
52
|
-
this
|
|
53
|
-
this
|
|
54
|
-
this
|
|
55
|
-
const ast = Acorn.parse(this
|
|
50
|
+
this.#fromOffset = fromOffset;
|
|
51
|
+
this.#toOffset = toOffset;
|
|
52
|
+
this.#content = text.substring(this.#fromOffset, this.#toOffset);
|
|
53
|
+
this.#lastLineNumber = 0;
|
|
54
|
+
this.#tokenizer = new AcornTokenizer(this.#content);
|
|
55
|
+
const ast = Acorn.parse(this.#content, {
|
|
56
56
|
ranges: false,
|
|
57
57
|
preserveParens: true,
|
|
58
58
|
allowImportExportEverywhere: true,
|
|
59
59
|
ecmaVersion: ECMA_VERSION,
|
|
60
60
|
allowHashBang: true,
|
|
61
61
|
});
|
|
62
|
-
const walker = new ESTreeWalker(this
|
|
62
|
+
const walker = new ESTreeWalker(this.#beforeVisit.bind(this), this.#afterVisit.bind(this));
|
|
63
63
|
// @ts-ignore Technically, the acorn Node type is a subclass of Acorn.ESTree.Node.
|
|
64
64
|
// However, the acorn package currently exports its type without specifying
|
|
65
65
|
// this relationship. So while this is allowed on runtime, we can't properly
|
|
@@ -67,55 +67,55 @@ export class JavaScriptFormatter {
|
|
|
67
67
|
walker.walk(ast);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
#push(token: Acorn.Token|Acorn.Comment|null, format: string): void {
|
|
71
71
|
for (let i = 0; i < format.length; ++i) {
|
|
72
72
|
if (format[i] === 's') {
|
|
73
|
-
this
|
|
73
|
+
this.#builder.addSoftSpace();
|
|
74
74
|
} else if (format[i] === 'S') {
|
|
75
|
-
this
|
|
75
|
+
this.#builder.addHardSpace();
|
|
76
76
|
} else if (format[i] === 'n') {
|
|
77
|
-
this
|
|
77
|
+
this.#builder.addNewLine();
|
|
78
78
|
} else if (format[i] === '>') {
|
|
79
|
-
this
|
|
79
|
+
this.#builder.increaseNestingLevel();
|
|
80
80
|
} else if (format[i] === '<') {
|
|
81
|
-
this
|
|
81
|
+
this.#builder.decreaseNestingLevel();
|
|
82
82
|
} else if (format[i] === 't') {
|
|
83
|
-
if (this
|
|
84
|
-
this
|
|
83
|
+
if (this.#tokenizer.tokenLineStart() - this.#lastLineNumber > 1) {
|
|
84
|
+
this.#builder.addNewLine(true);
|
|
85
85
|
}
|
|
86
|
-
this
|
|
86
|
+
this.#lastLineNumber = this.#tokenizer.tokenLineEnd();
|
|
87
87
|
if (token) {
|
|
88
|
-
this
|
|
88
|
+
this.#builder.addToken(this.#content.substring(token.start, token.end), this.#fromOffset + token.start);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
#beforeVisit(node: Acorn.ESTree.Node): undefined {
|
|
95
95
|
if (!node.parent) {
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
98
|
let token;
|
|
99
|
-
while ((token = this
|
|
100
|
-
const token = (this
|
|
99
|
+
while ((token = this.#tokenizer.peekToken()) && token.start < node.start) {
|
|
100
|
+
const token = (this.#tokenizer.nextToken() as TokenOrComment);
|
|
101
101
|
// @ts-ignore Same reason as above about Acorn types and ESTree types
|
|
102
|
-
const format = this
|
|
103
|
-
this
|
|
102
|
+
const format = this.#formatToken(node.parent, token);
|
|
103
|
+
this.#push(token, format);
|
|
104
104
|
}
|
|
105
105
|
return;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
#afterVisit(node: Acorn.ESTree.Node): void {
|
|
109
109
|
let token;
|
|
110
|
-
while ((token = this
|
|
111
|
-
const token = (this
|
|
112
|
-
const format = this
|
|
113
|
-
this
|
|
110
|
+
while ((token = this.#tokenizer.peekToken()) && token.start < node.end) {
|
|
111
|
+
const token = (this.#tokenizer.nextToken() as TokenOrComment);
|
|
112
|
+
const format = this.#formatToken(node, token);
|
|
113
|
+
this.#push(token, format);
|
|
114
114
|
}
|
|
115
|
-
this
|
|
115
|
+
this.#push(null, this.#finishNode(node));
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
#inForLoopHeader(node: Acorn.ESTree.Node): boolean {
|
|
119
119
|
const parent = node.parent;
|
|
120
120
|
if (!parent) {
|
|
121
121
|
return false;
|
|
@@ -131,7 +131,7 @@ export class JavaScriptFormatter {
|
|
|
131
131
|
return false;
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
#formatToken(node: Acorn.ESTree.Node, tokenOrComment: TokenOrComment): string {
|
|
135
135
|
const AT = AcornTokenizer;
|
|
136
136
|
if (AT.lineComment(tokenOrComment)) {
|
|
137
137
|
return 'tn';
|
|
@@ -241,7 +241,7 @@ export class JavaScriptFormatter {
|
|
|
241
241
|
// it exists. We can't fix that, unless we use proper typechecking
|
|
242
242
|
allVariablesInitialized = allVariablesInitialized && Boolean(declarations[i].init);
|
|
243
243
|
}
|
|
244
|
-
return !this
|
|
244
|
+
return !this.#inForLoopHeader(node) && allVariablesInitialized ? 'nSSts' : 'ts';
|
|
245
245
|
}
|
|
246
246
|
} else if (node.type === 'PropertyDefinition') {
|
|
247
247
|
if (AT.punctuator(token, '=')) {
|
|
@@ -356,13 +356,13 @@ export class JavaScriptFormatter {
|
|
|
356
356
|
return AT.keyword(token) && !AT.keyword(token, 'this') ? 'ts' : 't';
|
|
357
357
|
}
|
|
358
358
|
|
|
359
|
-
|
|
359
|
+
#finishNode(node: Acorn.ESTree.Node): string {
|
|
360
360
|
if (node.type === 'WithStatement') {
|
|
361
361
|
if (node.body && node.body.type !== 'BlockStatement') {
|
|
362
362
|
return 'n<';
|
|
363
363
|
}
|
|
364
364
|
} else if (node.type === 'VariableDeclaration') {
|
|
365
|
-
if (!this
|
|
365
|
+
if (!this.#inForLoopHeader(node)) {
|
|
366
366
|
return 'n';
|
|
367
367
|
}
|
|
368
368
|
} else if (node.type === 'ForStatement' || node.type === 'ForOfStatement' || node.type === 'ForInStatement') {
|
|
@@ -33,43 +33,38 @@ import * as HeapSnapshotModel from '../../models/heap_snapshot_model/heap_snapsh
|
|
|
33
33
|
export class AllocationProfile {
|
|
34
34
|
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
|
|
35
35
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
private readonly idToTopDownNode: {[x: number]: TopDownAllocationNode};
|
|
44
|
-
private collapsedTopNodeIdToFunctionInfo: {[x: number]: FunctionAllocationInfo};
|
|
45
|
-
private traceTops: HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode[]|null;
|
|
46
|
-
private readonly traceTree: TopDownAllocationNode;
|
|
36
|
+
readonly #strings: any;
|
|
37
|
+
#nextNodeId: number;
|
|
38
|
+
#functionInfos: FunctionAllocationInfo[];
|
|
39
|
+
#idToNode: {[x: number]: BottomUpAllocationNode|null};
|
|
40
|
+
readonly #idToTopDownNode: {[x: number]: TopDownAllocationNode};
|
|
41
|
+
#collapsedTopNodeIdToFunctionInfo: {[x: number]: FunctionAllocationInfo};
|
|
42
|
+
#traceTops: HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode[]|null;
|
|
47
43
|
|
|
48
44
|
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
|
|
49
45
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
46
|
constructor(profile: any, liveObjectStats: any) {
|
|
51
|
-
this
|
|
52
|
-
this.liveObjectStats = liveObjectStats;
|
|
47
|
+
this.#strings = profile.strings;
|
|
53
48
|
|
|
54
|
-
this
|
|
55
|
-
this
|
|
49
|
+
this.#nextNodeId = 1;
|
|
50
|
+
this.#functionInfos = [];
|
|
56
51
|
|
|
57
|
-
this
|
|
52
|
+
this.#idToNode = {};
|
|
58
53
|
|
|
59
|
-
this
|
|
54
|
+
this.#idToTopDownNode = {};
|
|
60
55
|
|
|
61
|
-
this
|
|
56
|
+
this.#collapsedTopNodeIdToFunctionInfo = {};
|
|
62
57
|
|
|
63
|
-
this
|
|
58
|
+
this.#traceTops = null;
|
|
64
59
|
|
|
65
|
-
this
|
|
66
|
-
this
|
|
60
|
+
this.#buildFunctionAllocationInfos(profile);
|
|
61
|
+
this.#buildAllocationTree(profile, liveObjectStats);
|
|
67
62
|
}
|
|
68
63
|
|
|
69
64
|
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
|
|
70
65
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
-
|
|
72
|
-
const strings = this
|
|
66
|
+
#buildFunctionAllocationInfos(profile: any): void {
|
|
67
|
+
const strings = this.#strings;
|
|
73
68
|
|
|
74
69
|
const functionInfoFields = profile.snapshot.meta.trace_function_info_fields;
|
|
75
70
|
const functionNameOffset = functionInfoFields.indexOf('name');
|
|
@@ -81,7 +76,7 @@ export class AllocationProfile {
|
|
|
81
76
|
|
|
82
77
|
const rawInfos = profile.trace_function_infos;
|
|
83
78
|
const infoLength = rawInfos.length;
|
|
84
|
-
const functionInfos = this
|
|
79
|
+
const functionInfos = this.#functionInfos = new Array(infoLength / functionInfoFieldCount);
|
|
85
80
|
let index = 0;
|
|
86
81
|
for (let i = 0; i < infoLength; i += functionInfoFieldCount) {
|
|
87
82
|
functionInfos[index++] = new FunctionAllocationInfo(
|
|
@@ -92,10 +87,10 @@ export class AllocationProfile {
|
|
|
92
87
|
|
|
93
88
|
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
|
|
94
89
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
-
|
|
90
|
+
#buildAllocationTree(profile: any, liveObjectStats: any): TopDownAllocationNode {
|
|
96
91
|
const traceTreeRaw = profile.trace_tree;
|
|
97
|
-
const functionInfos = this
|
|
98
|
-
const idToTopDownNode = this
|
|
92
|
+
const functionInfos = this.#functionInfos;
|
|
93
|
+
const idToTopDownNode = this.#idToTopDownNode;
|
|
99
94
|
|
|
100
95
|
const traceNodeFields = profile.snapshot.meta.trace_node_fields;
|
|
101
96
|
const nodeIdOffset = traceNodeFields.indexOf('id');
|
|
@@ -132,22 +127,22 @@ export class AllocationProfile {
|
|
|
132
127
|
}
|
|
133
128
|
|
|
134
129
|
serializeTraceTops(): HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode[] {
|
|
135
|
-
if (this
|
|
136
|
-
return this
|
|
130
|
+
if (this.#traceTops) {
|
|
131
|
+
return this.#traceTops;
|
|
137
132
|
}
|
|
138
133
|
|
|
139
|
-
const result: HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode[] = this
|
|
140
|
-
const functionInfos = this
|
|
134
|
+
const result: HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode[] = this.#traceTops = [];
|
|
135
|
+
const functionInfos = this.#functionInfos;
|
|
141
136
|
for (let i = 0; i < functionInfos.length; i++) {
|
|
142
137
|
const info = functionInfos[i];
|
|
143
138
|
if (info.totalCount === 0) {
|
|
144
139
|
continue;
|
|
145
140
|
}
|
|
146
|
-
const nodeId = this
|
|
141
|
+
const nodeId = this.#nextNodeId++;
|
|
147
142
|
const isRoot = i === 0;
|
|
148
|
-
result.push(this
|
|
143
|
+
result.push(this.#serializeNode(
|
|
149
144
|
nodeId, info, info.totalCount, info.totalSize, info.totalLiveCount, info.totalLiveSize, !isRoot));
|
|
150
|
-
this
|
|
145
|
+
this.#collapsedTopNodeIdToFunctionInfo[nodeId] = info;
|
|
151
146
|
}
|
|
152
147
|
result.sort(function(a, b) {
|
|
153
148
|
return b.size - a.size;
|
|
@@ -156,24 +151,24 @@ export class AllocationProfile {
|
|
|
156
151
|
}
|
|
157
152
|
|
|
158
153
|
serializeCallers(nodeId: number): HeapSnapshotModel.HeapSnapshotModel.AllocationNodeCallers {
|
|
159
|
-
let node = this
|
|
154
|
+
let node = this.#ensureBottomUpNode(nodeId);
|
|
160
155
|
const nodesWithSingleCaller = [];
|
|
161
156
|
while (node.callers().length === 1) {
|
|
162
157
|
node = node.callers()[0];
|
|
163
|
-
nodesWithSingleCaller.push(this
|
|
158
|
+
nodesWithSingleCaller.push(this.#serializeCaller(node));
|
|
164
159
|
}
|
|
165
160
|
|
|
166
161
|
const branchingCallers = [];
|
|
167
162
|
const callers = node.callers();
|
|
168
163
|
for (let i = 0; i < callers.length; i++) {
|
|
169
|
-
branchingCallers.push(this
|
|
164
|
+
branchingCallers.push(this.#serializeCaller(callers[i]));
|
|
170
165
|
}
|
|
171
166
|
|
|
172
167
|
return new HeapSnapshotModel.HeapSnapshotModel.AllocationNodeCallers(nodesWithSingleCaller, branchingCallers);
|
|
173
168
|
}
|
|
174
169
|
|
|
175
170
|
serializeAllocationStack(traceNodeId: number): HeapSnapshotModel.HeapSnapshotModel.AllocationStackFrame[] {
|
|
176
|
-
let node: (TopDownAllocationNode|null)|TopDownAllocationNode = this
|
|
171
|
+
let node: (TopDownAllocationNode|null)|TopDownAllocationNode = this.#idToTopDownNode[traceNodeId];
|
|
177
172
|
const result = [];
|
|
178
173
|
while (node) {
|
|
179
174
|
const functionInfo = node.functionInfo;
|
|
@@ -186,29 +181,29 @@ export class AllocationProfile {
|
|
|
186
181
|
}
|
|
187
182
|
|
|
188
183
|
traceIds(allocationNodeId: number): number[] {
|
|
189
|
-
return this
|
|
184
|
+
return this.#ensureBottomUpNode(allocationNodeId).traceTopIds;
|
|
190
185
|
}
|
|
191
186
|
|
|
192
|
-
|
|
193
|
-
let node = this
|
|
187
|
+
#ensureBottomUpNode(nodeId: number): BottomUpAllocationNode {
|
|
188
|
+
let node = this.#idToNode[nodeId];
|
|
194
189
|
if (!node) {
|
|
195
|
-
const functionInfo = this
|
|
190
|
+
const functionInfo = this.#collapsedTopNodeIdToFunctionInfo[nodeId];
|
|
196
191
|
node = functionInfo.bottomUpRoot();
|
|
197
|
-
delete this
|
|
198
|
-
this
|
|
192
|
+
delete this.#collapsedTopNodeIdToFunctionInfo[nodeId];
|
|
193
|
+
this.#idToNode[nodeId] = node;
|
|
199
194
|
}
|
|
200
195
|
return node as BottomUpAllocationNode;
|
|
201
196
|
}
|
|
202
197
|
|
|
203
|
-
|
|
204
|
-
const callerId = this
|
|
205
|
-
this
|
|
206
|
-
return this
|
|
198
|
+
#serializeCaller(node: BottomUpAllocationNode): HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode {
|
|
199
|
+
const callerId = this.#nextNodeId++;
|
|
200
|
+
this.#idToNode[callerId] = node;
|
|
201
|
+
return this.#serializeNode(
|
|
207
202
|
callerId, node.functionInfo, node.allocationCount, node.allocationSize, node.liveCount, node.liveSize,
|
|
208
203
|
node.hasCallers());
|
|
209
204
|
}
|
|
210
205
|
|
|
211
|
-
|
|
206
|
+
#serializeNode(
|
|
212
207
|
nodeId: number, functionInfo: FunctionAllocationInfo, count: number, size: number, liveCount: number,
|
|
213
208
|
liveSize: number, hasChildren: boolean): HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode {
|
|
214
209
|
return new HeapSnapshotModel.HeapSnapshotModel.SerializedAllocationNode(
|
|
@@ -248,7 +243,7 @@ export class BottomUpAllocationNode {
|
|
|
248
243
|
liveCount: number;
|
|
249
244
|
liveSize: number;
|
|
250
245
|
traceTopIds: number[];
|
|
251
|
-
|
|
246
|
+
readonly #callersInternal: BottomUpAllocationNode[];
|
|
252
247
|
constructor(functionInfo: FunctionAllocationInfo) {
|
|
253
248
|
this.functionInfo = functionInfo;
|
|
254
249
|
this.allocationCount = 0;
|
|
@@ -258,14 +253,14 @@ export class BottomUpAllocationNode {
|
|
|
258
253
|
|
|
259
254
|
this.traceTopIds = [];
|
|
260
255
|
|
|
261
|
-
this
|
|
256
|
+
this.#callersInternal = [];
|
|
262
257
|
}
|
|
263
258
|
|
|
264
259
|
addCaller(traceNode: TopDownAllocationNode): BottomUpAllocationNode {
|
|
265
260
|
const functionInfo = traceNode.functionInfo;
|
|
266
261
|
let result;
|
|
267
|
-
for (let i = 0; i < this
|
|
268
|
-
const caller = this
|
|
262
|
+
for (let i = 0; i < this.#callersInternal.length; i++) {
|
|
263
|
+
const caller = this.#callersInternal[i];
|
|
269
264
|
if (caller.functionInfo === functionInfo) {
|
|
270
265
|
result = caller;
|
|
271
266
|
break;
|
|
@@ -273,17 +268,17 @@ export class BottomUpAllocationNode {
|
|
|
273
268
|
}
|
|
274
269
|
if (!result) {
|
|
275
270
|
result = new BottomUpAllocationNode(functionInfo);
|
|
276
|
-
this
|
|
271
|
+
this.#callersInternal.push(result);
|
|
277
272
|
}
|
|
278
273
|
return result;
|
|
279
274
|
}
|
|
280
275
|
|
|
281
276
|
callers(): BottomUpAllocationNode[] {
|
|
282
|
-
return this
|
|
277
|
+
return this.#callersInternal;
|
|
283
278
|
}
|
|
284
279
|
|
|
285
280
|
hasCallers(): boolean {
|
|
286
|
-
return this
|
|
281
|
+
return this.#callersInternal.length > 0;
|
|
287
282
|
}
|
|
288
283
|
}
|
|
289
284
|
|
|
@@ -297,8 +292,8 @@ export class FunctionAllocationInfo {
|
|
|
297
292
|
totalSize: number;
|
|
298
293
|
totalLiveCount: number;
|
|
299
294
|
totalLiveSize: number;
|
|
300
|
-
|
|
301
|
-
|
|
295
|
+
#traceTops: TopDownAllocationNode[];
|
|
296
|
+
#bottomUpTree?: BottomUpAllocationNode;
|
|
302
297
|
constructor(functionName: string, scriptName: string, scriptId: number, line: number, column: number) {
|
|
303
298
|
this.functionName = functionName;
|
|
304
299
|
this.scriptName = scriptName;
|
|
@@ -310,14 +305,14 @@ export class FunctionAllocationInfo {
|
|
|
310
305
|
this.totalLiveCount = 0;
|
|
311
306
|
this.totalLiveSize = 0;
|
|
312
307
|
|
|
313
|
-
this
|
|
308
|
+
this.#traceTops = [];
|
|
314
309
|
}
|
|
315
310
|
|
|
316
311
|
addTraceTopNode(node: TopDownAllocationNode): void {
|
|
317
312
|
if (node.allocationCount === 0) {
|
|
318
313
|
return;
|
|
319
314
|
}
|
|
320
|
-
this
|
|
315
|
+
this.#traceTops.push(node);
|
|
321
316
|
this.totalCount += node.allocationCount;
|
|
322
317
|
this.totalSize += node.allocationSize;
|
|
323
318
|
this.totalLiveCount += node.liveCount;
|
|
@@ -325,21 +320,21 @@ export class FunctionAllocationInfo {
|
|
|
325
320
|
}
|
|
326
321
|
|
|
327
322
|
bottomUpRoot(): BottomUpAllocationNode|null {
|
|
328
|
-
if (!this
|
|
323
|
+
if (!this.#traceTops.length) {
|
|
329
324
|
return null;
|
|
330
325
|
}
|
|
331
|
-
if (!this
|
|
332
|
-
this
|
|
326
|
+
if (!this.#bottomUpTree) {
|
|
327
|
+
this.#buildAllocationTraceTree();
|
|
333
328
|
}
|
|
334
|
-
return this
|
|
329
|
+
return this.#bottomUpTree as BottomUpAllocationNode;
|
|
335
330
|
}
|
|
336
331
|
|
|
337
|
-
|
|
338
|
-
this
|
|
332
|
+
#buildAllocationTraceTree(): void {
|
|
333
|
+
this.#bottomUpTree = new BottomUpAllocationNode(this);
|
|
339
334
|
|
|
340
|
-
for (let i = 0; i < this
|
|
341
|
-
let node: (TopDownAllocationNode|null)|TopDownAllocationNode = this
|
|
342
|
-
let bottomUpNode: BottomUpAllocationNode = this
|
|
335
|
+
for (let i = 0; i < this.#traceTops.length; i++) {
|
|
336
|
+
let node: (TopDownAllocationNode|null)|TopDownAllocationNode = this.#traceTops[i];
|
|
337
|
+
let bottomUpNode: BottomUpAllocationNode = this.#bottomUpTree;
|
|
343
338
|
const count = node.allocationCount;
|
|
344
339
|
const size = node.allocationSize;
|
|
345
340
|
const liveCount = node.liveCount;
|