chrome-devtools-frontend 1.0.1524741 → 1.0.1526203
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/docs/policy/slow-close.md +22 -19
- package/front_end/core/common/Settings.ts +1 -1
- package/front_end/core/sdk/PreloadingModel.ts +3 -0
- package/front_end/core/sdk/ResourceTreeModel.ts +1 -1
- package/front_end/{models/source_map_scopes → core/sdk}/ScopeTreeCache.ts +8 -7
- package/front_end/core/sdk/SourceMapScopesInfo.ts +57 -0
- package/front_end/core/sdk/sdk.ts +2 -0
- package/front_end/entrypoints/formatter_worker/FormatterActions.ts +7 -0
- package/front_end/entrypoints/formatter_worker/ScopeParser.ts +15 -12
- package/front_end/generated/InspectorBackendCommands.js +4 -4
- package/front_end/generated/SupportedCSSProperties.js +0 -19
- package/front_end/generated/protocol-mapping.d.ts +1 -1
- package/front_end/generated/protocol-proxy-api.d.ts +1 -1
- package/front_end/generated/protocol.ts +9 -8
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +43 -8
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +50 -32
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +29 -29
- package/front_end/models/formatter/FormatterWorkerPool.ts +1 -1
- package/front_end/models/javascript_metadata/NativeFunctions.js +3 -8
- package/front_end/models/source_map_scopes/NamesResolver.ts +1 -3
- package/front_end/models/source_map_scopes/source_map_scopes.ts +0 -2
- package/front_end/models/trace/handlers/UserTimingsHandler.ts +1 -1
- package/front_end/models/trace/insights/CLSCulprits.ts +2 -1
- package/front_end/models/trace/insights/Cache.ts +2 -1
- package/front_end/models/trace/insights/DOMSize.ts +2 -1
- package/front_end/models/trace/insights/DocumentLatency.ts +2 -1
- package/front_end/models/trace/insights/DuplicatedJavaScript.ts +2 -1
- package/front_end/models/trace/insights/FontDisplay.ts +2 -1
- package/front_end/models/trace/insights/ForcedReflow.ts +2 -1
- package/front_end/models/trace/insights/INPBreakdown.ts +2 -1
- package/front_end/models/trace/insights/ImageDelivery.ts +2 -1
- package/front_end/models/trace/insights/LCPBreakdown.ts +2 -1
- package/front_end/models/trace/insights/LCPDiscovery.ts +2 -1
- package/front_end/models/trace/insights/LegacyJavaScript.ts +2 -1
- package/front_end/models/trace/insights/ModernHTTP.ts +2 -1
- package/front_end/models/trace/insights/NetworkDependencyTree.ts +2 -1
- package/front_end/models/trace/insights/RenderBlocking.ts +2 -1
- package/front_end/models/trace/insights/SlowCSSSelector.ts +2 -1
- package/front_end/models/trace/insights/ThirdParties.ts +2 -1
- package/front_end/models/trace/insights/Viewport.ts +2 -1
- package/front_end/models/trace/insights/types.ts +2 -1
- package/front_end/panels/application/ReportingApiView.ts +8 -7
- package/front_end/panels/application/StorageView.ts +2 -1
- package/front_end/panels/application/preloading/components/PreloadingString.ts +2 -0
- package/front_end/panels/changes/ChangesSidebar.ts +10 -3
- package/front_end/panels/changes/ChangesView.ts +69 -69
- package/front_end/panels/changes/CombinedDiffView.ts +1 -1
- package/front_end/panels/changes/changesView.css +4 -0
- package/front_end/panels/console/ConsolePrompt.ts +24 -4
- package/front_end/panels/lighthouse/LighthouseController.ts +5 -0
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +43 -46
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +254 -153
- package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +28 -21
- package/front_end/panels/timeline/TimelinePanel.ts +10 -8
- package/front_end/panels/timeline/components/ExportTraceOptions.ts +1 -1
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/buttons/Button.ts +17 -0
- package/front_end/ui/components/docs/linear_memory_inspector/basic.ts +21 -9
- package/front_end/ui/components/highlighting/HighlightManager.ts +21 -1
- package/front_end/ui/components/tooltips/Tooltip.ts +22 -5
- package/front_end/ui/legacy/SearchableView.ts +1 -1
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +48 -5
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -2
- package/front_end/ui/legacy/components/source_frame/JSONView.ts +28 -0
- package/front_end/ui/legacy/components/source_frame/StreamingContentHexView.ts +18 -20
- package/package.json +22 -22
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Copyright 2020 The Chromium Authors
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
|
-
/* eslint-disable rulesdir/no-lit-render-outside-of-view */
|
|
5
4
|
|
|
6
5
|
import './LinearMemoryValueInterpreter.js';
|
|
7
6
|
import './LinearMemoryHighlightChipList.js';
|
|
@@ -9,6 +8,7 @@ import './LinearMemoryViewer.js';
|
|
|
9
8
|
|
|
10
9
|
import * as Common from '../../../core/common/common.js';
|
|
11
10
|
import * as i18n from '../../../core/i18n/i18n.js';
|
|
11
|
+
import * as UI from '../../../ui/legacy/legacy.js';
|
|
12
12
|
import {html, nothing, render} from '../../../ui/lit/lit.js';
|
|
13
13
|
|
|
14
14
|
import type {DeleteMemoryHighlightEvent, JumpToHighlightedMemoryEvent} from './LinearMemoryHighlightChipList.js';
|
|
@@ -119,8 +119,151 @@ class AddressHistoryEntry implements Common.SimpleHistoryManager.HistoryEntry {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
export
|
|
123
|
-
|
|
122
|
+
export interface ViewInput {
|
|
123
|
+
memory: Uint8Array;
|
|
124
|
+
address: number;
|
|
125
|
+
memoryOffset: number;
|
|
126
|
+
outerMemoryLength: number;
|
|
127
|
+
valueTypes: Set<ValueType>;
|
|
128
|
+
valueTypeModes: Map<ValueType, ValueTypeMode>;
|
|
129
|
+
endianness: Endianness;
|
|
130
|
+
highlightInfo?: HighlightInfo;
|
|
131
|
+
hideValueInspector: boolean;
|
|
132
|
+
currentNavigatorMode: Mode;
|
|
133
|
+
currentNavigatorAddressLine: string;
|
|
134
|
+
canGoBackInHistory: boolean;
|
|
135
|
+
canGoForwardInHistory: boolean;
|
|
136
|
+
onRefreshRequest: () => void;
|
|
137
|
+
onAddressChange: (e: AddressInputChangedEvent) => void;
|
|
138
|
+
onNavigatePage: (e: PageNavigationEvent) => void;
|
|
139
|
+
onNavigateHistory: (e: HistoryNavigationEvent) => boolean;
|
|
140
|
+
onJumpToAddress: (e: JumpToPointerAddressEvent|JumpToHighlightedMemoryEvent) => void;
|
|
141
|
+
onByteSelected: (e: ByteSelectedEvent) => void;
|
|
142
|
+
onResize: (e: ResizeEvent) => void;
|
|
143
|
+
onValueTypeToggled: (e: ValueTypeToggledEvent) => void;
|
|
144
|
+
onValueTypeModeChanged: (e: ValueTypeModeChangedEvent) => void;
|
|
145
|
+
onEndiannessChanged: (e: EndiannessChangedEvent) => void;
|
|
146
|
+
memorySlice: Uint8Array<ArrayBuffer>;
|
|
147
|
+
viewerStart: number;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export const DEFAULT_VIEW = (input: ViewInput, _output: Record<string, unknown>, target: HTMLElement): void => {
|
|
151
|
+
const navigatorAddressToShow =
|
|
152
|
+
input.currentNavigatorMode === Mode.SUBMITTED ? formatAddress(input.address) : input.currentNavigatorAddressLine;
|
|
153
|
+
const navigatorAddressIsValid = isValidAddress(navigatorAddressToShow, input.outerMemoryLength);
|
|
154
|
+
|
|
155
|
+
const invalidAddressMsg = i18nString(
|
|
156
|
+
UIStrings.addressHasToBeANumberBetweenSAnd, {PH1: formatAddress(0), PH2: formatAddress(input.outerMemoryLength)});
|
|
157
|
+
|
|
158
|
+
const errorMsg = navigatorAddressIsValid ? undefined : invalidAddressMsg;
|
|
159
|
+
|
|
160
|
+
const highlightedMemoryAreas = input.highlightInfo ? [input.highlightInfo] : [];
|
|
161
|
+
const focusedMemoryHighlight = getSmallestEnclosingMemoryHighlight(highlightedMemoryAreas, input.address);
|
|
162
|
+
// Disabled until https://crbug.com/1079231 is fixed.
|
|
163
|
+
// clang-format off
|
|
164
|
+
render(html`
|
|
165
|
+
<style>${linearMemoryInspectorStyles}</style>
|
|
166
|
+
<div class="view">
|
|
167
|
+
<devtools-linear-memory-inspector-navigator
|
|
168
|
+
.data=${
|
|
169
|
+
{
|
|
170
|
+
address: navigatorAddressToShow,
|
|
171
|
+
valid: navigatorAddressIsValid,
|
|
172
|
+
mode: input.currentNavigatorMode,
|
|
173
|
+
error: errorMsg,
|
|
174
|
+
canGoBackInHistory: input.canGoBackInHistory,
|
|
175
|
+
canGoForwardInHistory: input.canGoForwardInHistory,
|
|
176
|
+
}}
|
|
177
|
+
@refreshrequested=${input.onRefreshRequest}
|
|
178
|
+
@addressinputchanged=${input.onAddressChange}
|
|
179
|
+
@pagenavigation=${input.onNavigatePage}
|
|
180
|
+
@historynavigation=${input.onNavigateHistory}></devtools-linear-memory-inspector-navigator>
|
|
181
|
+
<devtools-linear-memory-highlight-chip-list
|
|
182
|
+
.data=${{highlightInfos: highlightedMemoryAreas, focusedMemoryHighlight}}
|
|
183
|
+
@jumptohighlightedmemory=${input.onJumpToAddress}>
|
|
184
|
+
</devtools-linear-memory-highlight-chip-list>
|
|
185
|
+
<devtools-linear-memory-inspector-viewer
|
|
186
|
+
.data=${
|
|
187
|
+
{
|
|
188
|
+
memory: input.memorySlice,
|
|
189
|
+
address: input.address,
|
|
190
|
+
memoryOffset: input.viewerStart,
|
|
191
|
+
focus: input.currentNavigatorMode === Mode.SUBMITTED,
|
|
192
|
+
highlightInfo: input.highlightInfo,
|
|
193
|
+
focusedMemoryHighlight,
|
|
194
|
+
}}
|
|
195
|
+
@byteselected=${input.onByteSelected}
|
|
196
|
+
@resize=${input.onResize}>
|
|
197
|
+
</devtools-linear-memory-inspector-viewer>
|
|
198
|
+
</div>
|
|
199
|
+
${
|
|
200
|
+
input.hideValueInspector ? nothing : html`
|
|
201
|
+
<div class="value-interpreter">
|
|
202
|
+
<devtools-linear-memory-inspector-interpreter
|
|
203
|
+
.data=${
|
|
204
|
+
{
|
|
205
|
+
value: input.memory
|
|
206
|
+
.slice(
|
|
207
|
+
input.address - input.memoryOffset,
|
|
208
|
+
input.address + VALUE_INTEPRETER_MAX_NUM_BYTES,
|
|
209
|
+
)
|
|
210
|
+
.buffer,
|
|
211
|
+
valueTypes: input.valueTypes,
|
|
212
|
+
valueTypeModes: input.valueTypeModes,
|
|
213
|
+
endianness: input.endianness,
|
|
214
|
+
memoryLength: input.outerMemoryLength,
|
|
215
|
+
}}
|
|
216
|
+
@valuetypetoggled=${input.onValueTypeToggled}
|
|
217
|
+
@valuetypemodechanged=${input.onValueTypeModeChanged}
|
|
218
|
+
@endiannesschanged=${input.onEndiannessChanged}
|
|
219
|
+
@jumptopointeraddress=${input.onJumpToAddress}
|
|
220
|
+
>
|
|
221
|
+
</devtools-linear-memory-inspector-interpreter/>
|
|
222
|
+
</div>`}
|
|
223
|
+
`,
|
|
224
|
+
target);
|
|
225
|
+
// clang-format on
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
function getPageRangeForAddress(
|
|
229
|
+
address: number, numBytesPerPage: number, outerMemoryLength: number): {start: number, end: number} {
|
|
230
|
+
const pageNumber = Math.floor(address / numBytesPerPage);
|
|
231
|
+
const pageStartAddress = pageNumber * numBytesPerPage;
|
|
232
|
+
const pageEndAddress = Math.min(pageStartAddress + numBytesPerPage, outerMemoryLength);
|
|
233
|
+
return {start: pageStartAddress, end: pageEndAddress};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function isValidAddress(address: string, outerMemoryLength: number): boolean {
|
|
237
|
+
const newAddress = parseAddress(address);
|
|
238
|
+
return newAddress !== undefined && newAddress >= 0 && newAddress < outerMemoryLength;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Returns the highlightInfo with the smallest size property that encloses the provided address.
|
|
242
|
+
// If there are multiple smallest enclosing highlights, we pick the one appearing the earliest in highlightedMemoryAreas.
|
|
243
|
+
// If no such highlightInfo exists, it returns undefined.
|
|
244
|
+
//
|
|
245
|
+
// Selecting the smallest enclosing memory highlight is a heuristic that aims to pick the
|
|
246
|
+
// most specific highlight given a provided address. This way, objects contained in other objects are
|
|
247
|
+
// potentially still accessible.
|
|
248
|
+
function getSmallestEnclosingMemoryHighlight(highlightedMemoryAreas: HighlightInfo[], address: number): HighlightInfo|
|
|
249
|
+
undefined {
|
|
250
|
+
let smallestEnclosingHighlight;
|
|
251
|
+
for (const highlightedMemory of highlightedMemoryAreas) {
|
|
252
|
+
if (highlightedMemory.startAddress <= address &&
|
|
253
|
+
address < highlightedMemory.startAddress + highlightedMemory.size) {
|
|
254
|
+
if (!smallestEnclosingHighlight) {
|
|
255
|
+
smallestEnclosingHighlight = highlightedMemory;
|
|
256
|
+
} else if (highlightedMemory.size < smallestEnclosingHighlight.size) {
|
|
257
|
+
smallestEnclosingHighlight = highlightedMemory;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return smallestEnclosingHighlight;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export type View = typeof DEFAULT_VIEW;
|
|
265
|
+
|
|
266
|
+
export class LinearMemoryInspector extends UI.Widget.Widget {
|
|
124
267
|
readonly #history = new Common.SimpleHistoryManager.SimpleHistoryManager(10);
|
|
125
268
|
|
|
126
269
|
#memory = new Uint8Array();
|
|
@@ -140,102 +283,109 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
140
283
|
#endianness = Endianness.LITTLE;
|
|
141
284
|
|
|
142
285
|
#hideValueInspector = false;
|
|
286
|
+
#view: View;
|
|
143
287
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
288
|
+
constructor(element?: HTMLElement, view?: View) {
|
|
289
|
+
super(element);
|
|
290
|
+
this.#view = view ?? DEFAULT_VIEW;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
set memory(value: Uint8Array<ArrayBuffer>) {
|
|
294
|
+
this.#memory = value;
|
|
295
|
+
void this.requestUpdate();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
set memoryOffset(value: number) {
|
|
299
|
+
this.#memoryOffset = value;
|
|
300
|
+
void this.requestUpdate();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
set outerMemoryLength(value: number) {
|
|
304
|
+
this.#outerMemoryLength = value;
|
|
305
|
+
void this.requestUpdate();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
set highlightInfo(value: HighlightInfo|undefined) {
|
|
309
|
+
this.#highlightInfo = value;
|
|
310
|
+
void this.requestUpdate();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
set valueTypeModes(value: Map<ValueType, ValueTypeMode>) {
|
|
314
|
+
this.#valueTypeModes = value;
|
|
315
|
+
void this.requestUpdate();
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
set valueTypes(value: Set<ValueType>) {
|
|
319
|
+
this.#valueTypes = value;
|
|
320
|
+
void this.requestUpdate();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
set endianness(value: Endianness) {
|
|
324
|
+
this.#endianness = value;
|
|
325
|
+
void this.requestUpdate();
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
set hideValueInspector(value: boolean) {
|
|
329
|
+
this.#hideValueInspector = value;
|
|
330
|
+
void this.requestUpdate();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
get hideValueInspector(): boolean {
|
|
334
|
+
return this.#hideValueInspector;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
override performUpdate(): void {
|
|
338
|
+
const {start, end} = getPageRangeForAddress(this.#address, this.#numBytesPerPage, this.#outerMemoryLength);
|
|
339
|
+
|
|
340
|
+
if (start < this.#memoryOffset || end > this.#memoryOffset + this.#memory.length) {
|
|
341
|
+
this.contentElement.dispatchEvent(new MemoryRequestEvent(start, end, this.#address));
|
|
342
|
+
return;
|
|
147
343
|
}
|
|
148
344
|
|
|
149
|
-
if (
|
|
150
|
-
|
|
345
|
+
if (this.#address < this.#memoryOffset || this.#address > this.#memoryOffset + this.#memory.length ||
|
|
346
|
+
this.#address < 0) {
|
|
347
|
+
throw new Error('Address is out of bounds.');
|
|
151
348
|
}
|
|
152
349
|
|
|
153
|
-
if (
|
|
154
|
-
if (
|
|
350
|
+
if (this.#highlightInfo) {
|
|
351
|
+
if (this.#highlightInfo.size < 0) {
|
|
352
|
+
this.#highlightInfo = undefined;
|
|
155
353
|
throw new Error('Object size has to be greater than or equal to zero');
|
|
156
354
|
}
|
|
157
|
-
if (
|
|
355
|
+
if (this.#highlightInfo.startAddress < 0 || this.#highlightInfo.startAddress >= this.#outerMemoryLength) {
|
|
356
|
+
this.#highlightInfo = undefined;
|
|
158
357
|
throw new Error('Object start address is out of bounds.');
|
|
159
358
|
}
|
|
160
359
|
}
|
|
161
360
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const highlightedMemoryAreas = this.#highlightInfo ? [this.#highlightInfo] : [];
|
|
191
|
-
const focusedMemoryHighlight = this.#getSmallestEnclosingMemoryHighlight(highlightedMemoryAreas, this.#address);
|
|
192
|
-
// Disabled until https://crbug.com/1079231 is fixed.
|
|
193
|
-
// clang-format off
|
|
194
|
-
render(html`
|
|
195
|
-
<style>${linearMemoryInspectorStyles}</style>
|
|
196
|
-
<div class="view">
|
|
197
|
-
<devtools-linear-memory-inspector-navigator
|
|
198
|
-
.data=${{address: navigatorAddressToShow, valid: navigatorAddressIsValid, mode: this.#currentNavigatorMode, error: errorMsg, canGoBackInHistory, canGoForwardInHistory}}
|
|
199
|
-
@refreshrequested=${this.#onRefreshRequest}
|
|
200
|
-
@addressinputchanged=${this.#onAddressChange}
|
|
201
|
-
@pagenavigation=${this.#navigatePage}
|
|
202
|
-
@historynavigation=${this.#navigateHistory}></devtools-linear-memory-inspector-navigator>
|
|
203
|
-
<devtools-linear-memory-highlight-chip-list
|
|
204
|
-
.data=${{highlightInfos: highlightedMemoryAreas, focusedMemoryHighlight }}
|
|
205
|
-
@jumptohighlightedmemory=${this.#onJumpToAddress}>
|
|
206
|
-
</devtools-linear-memory-highlight-chip-list>
|
|
207
|
-
<devtools-linear-memory-inspector-viewer
|
|
208
|
-
.data=${{
|
|
209
|
-
memory: this.#memory.slice(start - this.#memoryOffset,
|
|
210
|
-
end - this.#memoryOffset),
|
|
211
|
-
address: this.#address, memoryOffset: start,
|
|
212
|
-
focus: this.#currentNavigatorMode === Mode.SUBMITTED,
|
|
213
|
-
highlightInfo: this.#highlightInfo,
|
|
214
|
-
focusedMemoryHighlight }}
|
|
215
|
-
@byteselected=${this.#onByteSelected}
|
|
216
|
-
@resize=${this.#resize}>
|
|
217
|
-
</devtools-linear-memory-inspector-viewer>
|
|
218
|
-
</div>
|
|
219
|
-
${this.#hideValueInspector ? nothing : html`
|
|
220
|
-
<div class="value-interpreter">
|
|
221
|
-
<devtools-linear-memory-inspector-interpreter
|
|
222
|
-
.data=${{
|
|
223
|
-
value: this.#memory.slice(this.#address - this.#memoryOffset, this.#address + VALUE_INTEPRETER_MAX_NUM_BYTES).buffer,
|
|
224
|
-
valueTypes: this.#valueTypes,
|
|
225
|
-
valueTypeModes: this.#valueTypeModes,
|
|
226
|
-
endianness: this.#endianness,
|
|
227
|
-
memoryLength: this.#outerMemoryLength }}
|
|
228
|
-
@valuetypetoggled=${this.#onValueTypeToggled}
|
|
229
|
-
@valuetypemodechanged=${this.#onValueTypeModeChanged}
|
|
230
|
-
@endiannesschanged=${this.#onEndiannessChanged}
|
|
231
|
-
@jumptopointeraddress=${this.#onJumpToAddress}
|
|
232
|
-
>
|
|
233
|
-
</devtools-linear-memory-inspector-interpreter/>
|
|
234
|
-
</div>`}
|
|
235
|
-
`, this.#shadow, {
|
|
236
|
-
host: this,
|
|
237
|
-
});
|
|
238
|
-
// clang-format on
|
|
361
|
+
const viewInput: ViewInput = {
|
|
362
|
+
memory: this.#memory,
|
|
363
|
+
address: this.#address,
|
|
364
|
+
memoryOffset: this.#memoryOffset,
|
|
365
|
+
outerMemoryLength: this.#outerMemoryLength,
|
|
366
|
+
valueTypes: this.#valueTypes,
|
|
367
|
+
valueTypeModes: this.#valueTypeModes,
|
|
368
|
+
endianness: this.#endianness,
|
|
369
|
+
highlightInfo: this.#highlightInfo,
|
|
370
|
+
hideValueInspector: this.#hideValueInspector,
|
|
371
|
+
currentNavigatorMode: this.#currentNavigatorMode,
|
|
372
|
+
currentNavigatorAddressLine: this.#currentNavigatorAddressLine,
|
|
373
|
+
canGoBackInHistory: this.#history.canRollback(),
|
|
374
|
+
canGoForwardInHistory: this.#history.canRollover(),
|
|
375
|
+
onRefreshRequest: this.#onRefreshRequest.bind(this),
|
|
376
|
+
onAddressChange: this.#onAddressChange.bind(this),
|
|
377
|
+
onNavigatePage: this.#navigatePage.bind(this),
|
|
378
|
+
onNavigateHistory: this.#navigateHistory.bind(this),
|
|
379
|
+
onJumpToAddress: this.#onJumpToAddress.bind(this),
|
|
380
|
+
onByteSelected: this.#onByteSelected.bind(this),
|
|
381
|
+
onResize: this.#resize.bind(this),
|
|
382
|
+
onValueTypeToggled: this.#onValueTypeToggled.bind(this),
|
|
383
|
+
onValueTypeModeChanged: this.#onValueTypeModeChanged.bind(this),
|
|
384
|
+
onEndiannessChanged: this.#onEndiannessChanged.bind(this),
|
|
385
|
+
memorySlice: this.#memory.slice(start - this.#memoryOffset, end - this.#memoryOffset),
|
|
386
|
+
viewerStart: start,
|
|
387
|
+
};
|
|
388
|
+
this.#view(viewInput, {}, this.contentElement);
|
|
239
389
|
}
|
|
240
390
|
|
|
241
391
|
#onJumpToAddress(e: JumpToPointerAddressEvent|JumpToHighlightedMemoryEvent): void {
|
|
@@ -247,8 +397,8 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
247
397
|
}
|
|
248
398
|
|
|
249
399
|
#onRefreshRequest(): void {
|
|
250
|
-
const {start, end} =
|
|
251
|
-
this.dispatchEvent(new MemoryRequestEvent(start, end, this.#address));
|
|
400
|
+
const {start, end} = getPageRangeForAddress(this.#address, this.#numBytesPerPage, this.#outerMemoryLength);
|
|
401
|
+
this.contentElement.dispatchEvent(new MemoryRequestEvent(start, end, this.#address));
|
|
252
402
|
}
|
|
253
403
|
|
|
254
404
|
#onByteSelected(e: ByteSelectedEvent): void {
|
|
@@ -263,18 +413,13 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
263
413
|
|
|
264
414
|
#onEndiannessChanged(e: EndiannessChangedEvent): void {
|
|
265
415
|
this.#endianness = e.data;
|
|
266
|
-
this.dispatchEvent(new SettingsChangedEvent(this.#createSettings()));
|
|
267
|
-
this
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
#isValidAddress(address: string): boolean {
|
|
271
|
-
const newAddress = parseAddress(address);
|
|
272
|
-
return newAddress !== undefined && newAddress >= 0 && newAddress < this.#outerMemoryLength;
|
|
416
|
+
this.contentElement.dispatchEvent(new SettingsChangedEvent(this.#createSettings()));
|
|
417
|
+
void this.requestUpdate();
|
|
273
418
|
}
|
|
274
419
|
|
|
275
420
|
#onAddressChange(e: AddressInputChangedEvent): void {
|
|
276
421
|
const {address, mode} = e.data;
|
|
277
|
-
const isValid =
|
|
422
|
+
const isValid = isValidAddress(address, this.#outerMemoryLength);
|
|
278
423
|
const newAddress = parseAddress(address);
|
|
279
424
|
this.#currentNavigatorAddressLine = address;
|
|
280
425
|
|
|
@@ -290,7 +435,7 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
290
435
|
this.#currentNavigatorMode = Mode.EDIT;
|
|
291
436
|
}
|
|
292
437
|
|
|
293
|
-
this
|
|
438
|
+
void this.requestUpdate();
|
|
294
439
|
}
|
|
295
440
|
|
|
296
441
|
#onValueTypeToggled(e: ValueTypeToggledEvent): void {
|
|
@@ -300,16 +445,16 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
300
445
|
} else {
|
|
301
446
|
this.#valueTypes.delete(type);
|
|
302
447
|
}
|
|
303
|
-
this.dispatchEvent(new SettingsChangedEvent(this.#createSettings()));
|
|
304
|
-
this
|
|
448
|
+
this.contentElement.dispatchEvent(new SettingsChangedEvent(this.#createSettings()));
|
|
449
|
+
void this.requestUpdate();
|
|
305
450
|
}
|
|
306
451
|
|
|
307
452
|
#onValueTypeModeChanged(e: ValueTypeModeChangedEvent): void {
|
|
308
453
|
e.stopImmediatePropagation();
|
|
309
454
|
const {type, mode} = e.data;
|
|
310
455
|
this.#valueTypeModes.set(type, mode);
|
|
311
|
-
this.dispatchEvent(new SettingsChangedEvent(this.#createSettings()));
|
|
312
|
-
this
|
|
456
|
+
this.contentElement.dispatchEvent(new SettingsChangedEvent(this.#createSettings()));
|
|
457
|
+
void this.requestUpdate();
|
|
313
458
|
}
|
|
314
459
|
|
|
315
460
|
#navigateHistory(e: HistoryNavigationEvent): boolean {
|
|
@@ -328,32 +473,16 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
328
473
|
console.warn(`Specified address is out of bounds: ${address}`);
|
|
329
474
|
return;
|
|
330
475
|
}
|
|
331
|
-
this
|
|
332
|
-
this
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
#getPageRangeForAddress(address: number, numBytesPerPage: number): {start: number, end: number} {
|
|
336
|
-
const pageNumber = Math.floor(address / numBytesPerPage);
|
|
337
|
-
const pageStartAddress = pageNumber * numBytesPerPage;
|
|
338
|
-
const pageEndAddress = Math.min(pageStartAddress + numBytesPerPage, this.#outerMemoryLength);
|
|
339
|
-
return {start: pageStartAddress, end: pageEndAddress};
|
|
476
|
+
this.address = address;
|
|
477
|
+
void this.requestUpdate();
|
|
340
478
|
}
|
|
341
479
|
|
|
342
480
|
#resize(event: ResizeEvent): void {
|
|
343
481
|
this.#numBytesPerPage = event.data;
|
|
344
|
-
this
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
#update(): void {
|
|
348
|
-
const {start, end} = this.#getPageRangeForAddress(this.#address, this.#numBytesPerPage);
|
|
349
|
-
if (start < this.#memoryOffset || end > this.#memoryOffset + this.#memory.length) {
|
|
350
|
-
this.dispatchEvent(new MemoryRequestEvent(start, end, this.#address));
|
|
351
|
-
} else {
|
|
352
|
-
this.#render();
|
|
353
|
-
}
|
|
482
|
+
void this.requestUpdate();
|
|
354
483
|
}
|
|
355
484
|
|
|
356
|
-
|
|
485
|
+
set address(address: number) {
|
|
357
486
|
// If we are already showing the address that is requested, no need to act upon it.
|
|
358
487
|
if (this.#address === address) {
|
|
359
488
|
return;
|
|
@@ -361,40 +490,12 @@ export class LinearMemoryInspector extends HTMLElement {
|
|
|
361
490
|
const historyEntry = new AddressHistoryEntry(address, () => this.#jumpToAddress(address));
|
|
362
491
|
this.#history.push(historyEntry);
|
|
363
492
|
this.#address = address;
|
|
364
|
-
this.dispatchEvent(new AddressChangedEvent(this.#address));
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
// Returns the highlightInfo with the smallest size property that encloses the provided address.
|
|
368
|
-
// If there are multiple smallest enclosing highlights, we pick the one appearing the earliest in highlightedMemoryAreas.
|
|
369
|
-
// If no such highlightInfo exists, it returns undefined.
|
|
370
|
-
//
|
|
371
|
-
// Selecting the smallest enclosing memory highlight is a heuristic that aims to pick the
|
|
372
|
-
// most specific highlight given a provided address. This way, objects contained in other objects are
|
|
373
|
-
// potentially still accessible.
|
|
374
|
-
#getSmallestEnclosingMemoryHighlight(highlightedMemoryAreas: HighlightInfo[], address: number): HighlightInfo
|
|
375
|
-
|undefined {
|
|
376
|
-
let smallestEnclosingHighlight;
|
|
377
|
-
for (const highlightedMemory of highlightedMemoryAreas) {
|
|
378
|
-
if (highlightedMemory.startAddress <= address &&
|
|
379
|
-
address < highlightedMemory.startAddress + highlightedMemory.size) {
|
|
380
|
-
if (!smallestEnclosingHighlight) {
|
|
381
|
-
smallestEnclosingHighlight = highlightedMemory;
|
|
382
|
-
} else if (highlightedMemory.size < smallestEnclosingHighlight.size) {
|
|
383
|
-
smallestEnclosingHighlight = highlightedMemory;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
return smallestEnclosingHighlight;
|
|
493
|
+
this.contentElement.dispatchEvent(new AddressChangedEvent(this.#address));
|
|
494
|
+
void this.requestUpdate();
|
|
388
495
|
}
|
|
389
496
|
}
|
|
390
497
|
|
|
391
|
-
customElements.define('devtools-linear-memory-inspector-inspector', LinearMemoryInspector);
|
|
392
|
-
|
|
393
498
|
declare global {
|
|
394
|
-
interface HTMLElementTagNameMap {
|
|
395
|
-
'devtools-linear-memory-inspector-inspector': LinearMemoryInspector;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
499
|
interface HTMLElementEventMap {
|
|
399
500
|
memoryrequest: MemoryRequestEvent;
|
|
400
501
|
addresschanged: AddressChangedEvent;
|
|
@@ -4,29 +4,36 @@
|
|
|
4
4
|
* found in the LICENSE file.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
@scope to (devtools-widget > *) {
|
|
8
|
+
:scope {
|
|
9
|
+
flex: auto;
|
|
10
|
+
display: flex;
|
|
11
|
+
}
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
flex-direction: column;
|
|
17
|
-
font-family: var(--monospace-font-family);
|
|
18
|
-
font-size: var(--monospace-font-size);
|
|
19
|
-
padding: 9px 12px 9px 7px;
|
|
20
|
-
}
|
|
13
|
+
* {
|
|
14
|
+
min-width: unset;
|
|
15
|
+
box-sizing: content-box;
|
|
16
|
+
}
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
.view {
|
|
19
|
+
width: 100%;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex: 1;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
font-family: var(--monospace-font-family);
|
|
24
|
+
font-size: var(--monospace-font-size);
|
|
25
|
+
padding: 9px 12px 9px 7px;
|
|
26
|
+
}
|
|
25
27
|
|
|
26
|
-
devtools-linear-memory-inspector-
|
|
27
|
-
|
|
28
|
-
}
|
|
28
|
+
devtools-linear-memory-inspector-viewer {
|
|
29
|
+
justify-content: center;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
devtools-linear-memory-inspector-navigator + devtools-linear-memory-inspector-viewer {
|
|
33
|
+
margin-top: 12px;
|
|
34
|
+
}
|
|
29
35
|
|
|
30
|
-
.value-interpreter {
|
|
31
|
-
|
|
36
|
+
.value-interpreter {
|
|
37
|
+
display: flex;
|
|
38
|
+
}
|
|
32
39
|
}
|
|
@@ -310,7 +310,7 @@ let isNode: boolean;
|
|
|
310
310
|
|
|
311
311
|
/**
|
|
312
312
|
* Represents the states that the timeline panel can be in.
|
|
313
|
-
* If you need to change the panel's view, use the {@
|
|
313
|
+
* If you need to change the panel's view, use the {@link TimelinePanel.#changeView} method.
|
|
314
314
|
* Note that we do not represent the "Loading/Processing" view here. The
|
|
315
315
|
* StatusPane is managed in the code that handles file import/recording, and
|
|
316
316
|
* when it is visible it is rendered on top of the UI so obscures what is behind
|
|
@@ -787,8 +787,8 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
787
787
|
}
|
|
788
788
|
|
|
789
789
|
/**
|
|
790
|
-
* Determine if two view modes are equivalent. Useful because if
|
|
791
|
-
*
|
|
790
|
+
* Determine if two view modes are equivalent. Useful because if
|
|
791
|
+
* {@link TimelinePanel.#changeView} gets called and the new mode is identical to the current,
|
|
792
792
|
* we can bail without doing any UI updates.
|
|
793
793
|
*/
|
|
794
794
|
#viewModesEquivalent(m1: ViewMode, m2: ViewMode): boolean {
|
|
@@ -2087,14 +2087,14 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
2087
2087
|
|
|
2088
2088
|
/**
|
|
2089
2089
|
* Called when we update the active trace that is being shown to the user.
|
|
2090
|
-
* This is called from {@
|
|
2090
|
+
* This is called from {@link TimelinePanel.#changeView} when we change the UI to show a
|
|
2091
2091
|
* trace - either one the user has just recorded/imported, or one they have
|
|
2092
2092
|
* navigated to via the dropdown.
|
|
2093
2093
|
*
|
|
2094
2094
|
* If you need code to execute whenever the active trace changes, this is the method to use.
|
|
2095
|
-
* If you need code to execute ONLY ON NEW TRACES, then use {@
|
|
2095
|
+
* If you need code to execute ONLY ON NEW TRACES, then use {@link TimelinePanel.loadingComplete}
|
|
2096
2096
|
* You should not call this method directly if you want the UI to update; use
|
|
2097
|
-
* {@
|
|
2097
|
+
* {@link TimelinePanel.#changeView} to control what is shown to the user.
|
|
2098
2098
|
*/
|
|
2099
2099
|
#setModelForActiveTrace(): void {
|
|
2100
2100
|
if (this.#viewMode.mode !== 'VIEWING_TRACE') {
|
|
@@ -2249,8 +2249,10 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
2249
2249
|
}
|
|
2250
2250
|
}
|
|
2251
2251
|
|
|
2252
|
-
|
|
2253
|
-
|
|
2252
|
+
if (parsedTrace.metadata.dataOrigin !== Trace.Types.File.DataOrigin.CPU_PROFILE) {
|
|
2253
|
+
UI.Context.Context.instance().setFlavor(
|
|
2254
|
+
AiAssistanceModel.AgentFocus, AiAssistanceModel.AgentFocus.fromParsedTrace(parsedTrace));
|
|
2255
|
+
}
|
|
2254
2256
|
}
|
|
2255
2257
|
|
|
2256
2258
|
#onAnnotationModifiedEvent(e: Event): void {
|
|
@@ -235,7 +235,7 @@ export class ExportTraceOptions extends HTMLElement {
|
|
|
235
235
|
${checkboxesWithInfoDialog.has(checkboxId) ? html`
|
|
236
236
|
<devtools-button
|
|
237
237
|
aria-details=${`export-trace-tooltip-${checkboxId}`}
|
|
238
|
-
|
|
238
|
+
.accessibleLabel=${this.#accessibleLabelForInfoCheckbox(checkboxId)}
|
|
239
239
|
class="pen-icon"
|
|
240
240
|
.iconName=${'info'}
|
|
241
241
|
.variant=${Buttons.Button.Variant.ICON}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Name: Dependencies sourced from the upstream `chromium` repository
|
|
2
2
|
URL: https://source.chromium.org/chromium/chromium/src/+/main:components/variations/proto/devtools/
|
|
3
3
|
Version: N/A
|
|
4
|
-
Revision:
|
|
4
|
+
Revision: 871199b5845026663e1efbe7e1dcc69c6ec1dfb7
|
|
5
5
|
Update Mechanism: Manual (https://crbug.com/428069060)
|
|
6
6
|
License: BSD-3-Clause
|
|
7
7
|
License File: LICENSE
|