chrome-devtools-frontend 1.0.930109 → 1.0.930993
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 +2 -1
- package/front_end/core/host/InspectorFrontendHost.ts +8 -1
- package/front_end/core/host/InspectorFrontendHostAPI.ts +12 -0
- 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/protocol_client/InspectorBackend.ts +71 -71
- package/front_end/core/sdk/NetworkManager.ts +6 -2
- package/front_end/devtools_compatibility.js +8 -0
- package/front_end/legacy_test_runner/sources_test_runner/DebuggerTestRunner.js +2 -2
- package/front_end/legacy_test_runner/test_runner/TestRunner.js +2 -3
- package/front_end/models/bindings/BreakpointManager.ts +158 -154
- package/front_end/models/bindings/CSSWorkspaceBinding.ts +64 -56
- package/front_end/models/bindings/CompilerScriptMapping.ts +70 -70
- package/front_end/models/bindings/ContentProviderBasedProject.ts +20 -20
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +132 -132
- package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +73 -72
- package/front_end/models/bindings/DefaultScriptMapping.ts +22 -22
- package/front_end/models/bindings/FileUtils.ts +81 -81
- package/front_end/models/bindings/IgnoreListManager.ts +17 -17
- package/front_end/models/bindings/LiveLocation.ts +21 -21
- package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +28 -28
- package/front_end/models/bindings/ResourceMapping.ts +50 -50
- package/front_end/models/bindings/ResourceScriptMapping.ts +71 -71
- package/front_end/models/bindings/SASSSourceMapping.ts +32 -32
- package/front_end/models/bindings/StylesSourceMapping.ts +57 -57
- package/front_end/models/bindings/TempFile.ts +34 -34
- package/front_end/models/emulation/DeviceModeModel.ts +208 -203
- package/front_end/models/emulation/EmulatedDevices.ts +34 -34
- package/front_end/panels/console/ConsoleView.ts +2 -1
- package/front_end/panels/console/ConsoleViewMessage.ts +3 -3
- package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +133 -133
- package/front_end/panels/css_overview/CSSOverviewModel.ts +16 -16
- package/front_end/panels/css_overview/CSSOverviewPanel.ts +77 -77
- package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +5 -5
- package/front_end/panels/css_overview/components/CSSOverviewStartView.ts +4 -4
- package/front_end/panels/elements/ElementsTreeElement.ts +6 -10
- package/front_end/panels/elements/ElementsTreeOutline.ts +3 -1
- package/front_end/panels/elements/components/LayoutPane.ts +6 -0
- package/front_end/panels/elements/elementsPanel.css +0 -1
- package/front_end/panels/elements/elementsTreeOutline.css +0 -4
- package/front_end/panels/lighthouse/LighthouseProtocolService.ts +7 -2
- package/front_end/panels/network/BlockedURLsPane.ts +8 -5
- package/front_end/panels/network/blockedURLsPane.css +0 -1
- package/front_end/panels/search/SearchView.ts +0 -2
- package/front_end/panels/sources/BreakpointEditDialog.ts +98 -81
- package/front_end/panels/sources/DebuggerPlugin.ts +15 -14
- package/front_end/ui/components/code_highlighter/CodeHighlighter.ts +18 -2
- package/front_end/ui/components/text_editor/config.ts +6 -0
- package/front_end/ui/components/text_editor/cursor_tooltip.ts +70 -0
- package/front_end/ui/components/text_editor/javascript.ts +590 -0
- package/front_end/ui/components/text_editor/text_editor.ts +1 -0
- package/front_end/ui/components/text_editor/theme.ts +11 -0
- package/front_end/ui/components/tree_outline/TreeOutline.ts +3 -1
- package/front_end/ui/legacy/ARIAUtils.ts +24 -8
- package/front_end/ui/legacy/components/text_editor/cmdevtools.css +1 -0
- package/front_end/ui/legacy/components/text_editor/text_editor-legacy.ts +0 -3
- package/front_end/ui/legacy/components/text_editor/text_editor.ts +0 -2
- package/package.json +1 -1
- package/scripts/migration/class-fields/migrate.js +15 -2
- package/scripts/migration/class-fields/migrate.sh +10 -0
- package/front_end/ui/legacy/components/text_editor/SyntaxHighlighter.ts +0 -62
|
@@ -16,7 +16,7 @@ import {NetworkProject} from './NetworkProject.js';
|
|
|
16
16
|
|
|
17
17
|
const UIStrings = {
|
|
18
18
|
/**
|
|
19
|
-
*@description Error message that is displayed in the Console when language plugins report errors
|
|
19
|
+
*@description Error message that is displayed in the Console when language #plugins report errors
|
|
20
20
|
*@example {File not found} PH1
|
|
21
21
|
*/
|
|
22
22
|
errorInDebuggerLanguagePlugin: 'Error in debugger language plugin: {PH1}',
|
|
@@ -115,7 +115,7 @@ class SourceType {
|
|
|
115
115
|
/**
|
|
116
116
|
* Generates the raw module ID for a script, which is used
|
|
117
117
|
* to uniquely identify the debugging data for a script on
|
|
118
|
-
* the responsible language plugin.
|
|
118
|
+
* the responsible language #plugin.
|
|
119
119
|
*
|
|
120
120
|
* @param script the unique raw module ID for the script.
|
|
121
121
|
*/
|
|
@@ -169,7 +169,7 @@ export class ValueNode extends SDK.RemoteObject.RemoteObjectImpl {
|
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
// Debugger language plugins present source-language values as trees with mixed dynamic and static structural
|
|
172
|
+
// Debugger language #plugins present source-language values as trees with mixed dynamic and static structural
|
|
173
173
|
// information. The static structure is defined by the variable's static type in the source language. Formatters are
|
|
174
174
|
// able to present source-language values in an arbitrary user-friendly way, which contributes the dynamic structural
|
|
175
175
|
// information. The classes StaticallyTypedValue and FormatedValueNode respectively implement the static and dynamic
|
|
@@ -234,7 +234,7 @@ async function getValueTreeForExpression(
|
|
|
234
234
|
return new StaticallyTypedValueNode(callFrame, plugin, sourceType, base, [], evalOptions, address);
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
-
/** Run the formatter for the value defined by the pair of base and fieldChain.
|
|
237
|
+
/** Run the formatter for the value defined by the pair of #base and #fieldChain.
|
|
238
238
|
*/
|
|
239
239
|
async function formatSourceValue(
|
|
240
240
|
callFrame: SDK.DebuggerModel.CallFrame, plugin: DebuggerLanguagePlugin, sourceType: SourceType,
|
|
@@ -318,13 +318,13 @@ async function formatSourceValue(
|
|
|
318
318
|
// StaticallyTypedValueNodes. The class hooks into the creation of RemoteObjects for properties to check whether a
|
|
319
319
|
// property is a marker.
|
|
320
320
|
class FormattedValueNode extends ValueNode {
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
readonly #plugin: DebuggerLanguagePlugin;
|
|
322
|
+
readonly #sourceType: SourceType;
|
|
323
323
|
formatterTag: {
|
|
324
324
|
className: string,
|
|
325
325
|
symbol: string,
|
|
326
326
|
}|null;
|
|
327
|
-
|
|
327
|
+
readonly #evalOptions: SDK.RuntimeModel.EvaluationOptions;
|
|
328
328
|
constructor(
|
|
329
329
|
callFrame: SDK.DebuggerModel.CallFrame, sourceType: SourceType, plugin: DebuggerLanguagePlugin,
|
|
330
330
|
object: Protocol.Runtime.RemoteObject, formatterTag: {
|
|
@@ -336,13 +336,13 @@ class FormattedValueNode extends ValueNode {
|
|
|
336
336
|
callFrame, object.objectId, object.type, object.subtype, object.value, inspectableAddress,
|
|
337
337
|
object.unserializableValue, object.description, object.preview, object.customPreview, object.className);
|
|
338
338
|
|
|
339
|
-
this
|
|
340
|
-
this
|
|
339
|
+
this.#plugin = plugin;
|
|
340
|
+
this.#sourceType = sourceType;
|
|
341
341
|
|
|
342
342
|
// The tag describes how to identify a marker by its className and its identifier symbol's object id.
|
|
343
343
|
this.formatterTag = formatterTag;
|
|
344
344
|
|
|
345
|
-
this
|
|
345
|
+
this.#evalOptions = evalOptions;
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
async findProperties(...properties: string[]): Promise<{
|
|
@@ -370,24 +370,24 @@ class FormattedValueNode extends ValueNode {
|
|
|
370
370
|
const base = await this.getEvalBaseFromObject(newObject);
|
|
371
371
|
if (!base) {
|
|
372
372
|
return new FormattedValueNode(
|
|
373
|
-
this.callFrame, this
|
|
373
|
+
this.callFrame, this.#sourceType, this.#plugin, newObject, this.formatterTag, this.#evalOptions, undefined);
|
|
374
374
|
}
|
|
375
375
|
|
|
376
376
|
// Property is a marker, check if it's just static type information or if we need to run formatters for the value.
|
|
377
|
-
const newSourceType = this
|
|
377
|
+
const newSourceType = this.#sourceType.typeMap.get(base.rootType.typeId);
|
|
378
378
|
if (!newSourceType) {
|
|
379
379
|
throw new Error('Unknown typeId in eval base');
|
|
380
380
|
}
|
|
381
381
|
// The marker refers to a value that needs to be formatted, so run the formatter.
|
|
382
382
|
if (base.rootType.hasValue && !base.rootType.canExpand && base) {
|
|
383
|
-
return formatSourceValue(this.callFrame, this
|
|
383
|
+
return formatSourceValue(this.callFrame, this.#plugin, newSourceType, base, [], this.#evalOptions);
|
|
384
384
|
}
|
|
385
385
|
|
|
386
386
|
// The marker is just static information, so start a new subtree with a static type info root.
|
|
387
387
|
const address =
|
|
388
|
-
await StaticallyTypedValueNode.getInspectableAddress(this.callFrame, this
|
|
388
|
+
await StaticallyTypedValueNode.getInspectableAddress(this.callFrame, this.#plugin, base, [], this.#evalOptions);
|
|
389
389
|
return new StaticallyTypedValueNode(
|
|
390
|
-
this.callFrame, this
|
|
390
|
+
this.callFrame, this.#plugin, newSourceType, base, [], this.#evalOptions, address);
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
/**
|
|
@@ -418,8 +418,8 @@ class FormattedValueNode extends ValueNode {
|
|
|
418
418
|
|
|
419
419
|
// The object is a marker, so pull the static type information from its symbol property. The symbol property is not
|
|
420
420
|
// a formatted value per se, but we wrap it as one to be able to call `findProperties`.
|
|
421
|
-
const baseObject =
|
|
422
|
-
|
|
421
|
+
const baseObject = new FormattedValueNode(
|
|
422
|
+
this.callFrame, this.#sourceType, this.#plugin, result, null, this.#evalOptions, undefined);
|
|
423
423
|
const {payload, rootType} = await baseObject.findProperties('payload', 'rootType');
|
|
424
424
|
if (typeof payload === 'undefined' || typeof rootType === 'undefined') {
|
|
425
425
|
return null;
|
|
@@ -430,7 +430,7 @@ class FormattedValueNode extends ValueNode {
|
|
|
430
430
|
return null;
|
|
431
431
|
}
|
|
432
432
|
|
|
433
|
-
const newSourceType = this
|
|
433
|
+
const newSourceType = this.#sourceType.typeMap.get(typeId.value);
|
|
434
434
|
if (!newSourceType) {
|
|
435
435
|
return null;
|
|
436
436
|
}
|
|
@@ -463,16 +463,16 @@ class FormattingError extends Error {
|
|
|
463
463
|
}
|
|
464
464
|
|
|
465
465
|
// This class implements a `RemoteObject` for source language value whose immediate properties are defined purely by
|
|
466
|
-
// static type information. Static type information is expressed by an `EvalBase` together with a
|
|
466
|
+
// static type information. Static type information is expressed by an `EvalBase` together with a `#fieldChain`. The
|
|
467
467
|
// latter is necessary to express navigating through type members. We don't know how to make sense of an `EvalBase`'s
|
|
468
|
-
// payload here, which is why member navigation is relayed to the formatter via the
|
|
468
|
+
// payload here, which is why member navigation is relayed to the formatter via the `#fieldChain`.
|
|
469
469
|
class StaticallyTypedValueNode extends ValueNode {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
470
|
+
readonly #variableType: string;
|
|
471
|
+
readonly #plugin: DebuggerLanguagePlugin;
|
|
472
|
+
readonly #sourceType: SourceType;
|
|
473
|
+
readonly #base: Chrome.DevTools.EvalBase|null;
|
|
474
|
+
readonly #fieldChain: Chrome.DevTools.FieldInfo[];
|
|
475
|
+
readonly #evalOptions: SDK.RuntimeModel.EvaluationOptions;
|
|
476
476
|
|
|
477
477
|
constructor(
|
|
478
478
|
callFrame: SDK.DebuggerModel.CallFrame, plugin: DebuggerLanguagePlugin, sourceType: SourceType,
|
|
@@ -486,29 +486,29 @@ class StaticallyTypedValueNode extends ValueNode {
|
|
|
486
486
|
/* type=*/ variableType,
|
|
487
487
|
/* subtype=*/ undefined, /* value=*/ null, inspectableAddress, /* unserializableValue=*/ undefined,
|
|
488
488
|
/* description=*/ typeName, /* preview=*/ undefined, /* customPreview=*/ undefined, /* className=*/ typeName);
|
|
489
|
-
this
|
|
490
|
-
this
|
|
491
|
-
this
|
|
492
|
-
this
|
|
493
|
-
this
|
|
489
|
+
this.#variableType = variableType;
|
|
490
|
+
this.#plugin = plugin;
|
|
491
|
+
this.#sourceType = sourceType;
|
|
492
|
+
this.#base = base;
|
|
493
|
+
this.#fieldChain = fieldChain;
|
|
494
494
|
this.hasChildrenInternal = true;
|
|
495
|
-
this
|
|
495
|
+
this.#evalOptions = evalOptions;
|
|
496
496
|
}
|
|
497
497
|
|
|
498
498
|
get type(): string {
|
|
499
|
-
return this
|
|
499
|
+
return this.#variableType;
|
|
500
500
|
}
|
|
501
501
|
|
|
502
502
|
private async expandMember(sourceType: SourceType, fieldInfo: Chrome.DevTools.FieldInfo):
|
|
503
503
|
Promise<SDK.RemoteObject.RemoteObject> {
|
|
504
|
-
const fieldChain = this
|
|
505
|
-
if (sourceType.typeInfo.hasValue && !sourceType.typeInfo.canExpand && this
|
|
506
|
-
return formatSourceValue(this.callFrame, this
|
|
504
|
+
const fieldChain = this.#fieldChain.concat(fieldInfo);
|
|
505
|
+
if (sourceType.typeInfo.hasValue && !sourceType.typeInfo.canExpand && this.#base) {
|
|
506
|
+
return formatSourceValue(this.callFrame, this.#plugin, sourceType, this.#base, fieldChain, this.#evalOptions);
|
|
507
507
|
}
|
|
508
508
|
|
|
509
509
|
const address = this.inspectableAddress !== undefined ? this.inspectableAddress + fieldInfo.offset : undefined;
|
|
510
510
|
return new StaticallyTypedValueNode(
|
|
511
|
-
this.callFrame, this
|
|
511
|
+
this.callFrame, this.#plugin, sourceType, this.#base, fieldChain, this.#evalOptions, address);
|
|
512
512
|
}
|
|
513
513
|
|
|
514
514
|
static async getInspectableAddress(
|
|
@@ -555,7 +555,7 @@ class StaticallyTypedValueNode extends ValueNode {
|
|
|
555
555
|
|
|
556
556
|
async doGetProperties(_ownProperties: boolean, accessorPropertiesOnly: boolean, _generatePreview: boolean):
|
|
557
557
|
Promise<SDK.RemoteObject.GetPropertiesResult> {
|
|
558
|
-
const {typeInfo} = this
|
|
558
|
+
const {typeInfo} = this.#sourceType;
|
|
559
559
|
if (accessorPropertiesOnly || !typeInfo.canExpand) {
|
|
560
560
|
return {properties: [], internalProperties: []} as SDK.RemoteObject.GetPropertiesResult;
|
|
561
561
|
}
|
|
@@ -563,9 +563,9 @@ class StaticallyTypedValueNode extends ValueNode {
|
|
|
563
563
|
if (typeInfo.members.length > 0) {
|
|
564
564
|
// This value doesn't have a formatter, but we can eagerly expand arrays in the frontend if the size is known.
|
|
565
565
|
if (typeInfo.arraySize > 0) {
|
|
566
|
-
const {typeId} = this
|
|
566
|
+
const {typeId} = this.#sourceType.typeInfo.members[0];
|
|
567
567
|
const properties: SDK.RemoteObject.RemoteObjectProperty[] = [];
|
|
568
|
-
const elementTypeInfo = this
|
|
568
|
+
const elementTypeInfo = this.#sourceType.members[0];
|
|
569
569
|
for (let i = 0; i < typeInfo.arraySize; ++i) {
|
|
570
570
|
const name = `${i}`;
|
|
571
571
|
const elementField = {name, typeId, offset: elementTypeInfo.typeInfo.size * i};
|
|
@@ -579,8 +579,8 @@ class StaticallyTypedValueNode extends ValueNode {
|
|
|
579
579
|
}
|
|
580
580
|
|
|
581
581
|
// The node is expanded, just make remote objects for its members
|
|
582
|
-
const members = Promise.all(this
|
|
583
|
-
const fieldInfo = this
|
|
582
|
+
const members = Promise.all(this.#sourceType.members.map(async (memberTypeInfo, idx) => {
|
|
583
|
+
const fieldInfo = this.#sourceType.typeInfo.members[idx];
|
|
584
584
|
const propertyObject = await this.expandMember(memberTypeInfo, fieldInfo);
|
|
585
585
|
const name = fieldInfo.name || '';
|
|
586
586
|
return new SDK.RemoteObject.RemoteObjectProperty(
|
|
@@ -612,17 +612,17 @@ class NamespaceObject extends SDK.RemoteObject.LocalJSONObject {
|
|
|
612
612
|
|
|
613
613
|
class SourceScopeRemoteObject extends SDK.RemoteObject.RemoteObjectImpl {
|
|
614
614
|
variables: Chrome.DevTools.Variable[];
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
615
|
+
#callFrame: SDK.DebuggerModel.CallFrame;
|
|
616
|
+
#plugin: DebuggerLanguagePlugin;
|
|
617
|
+
readonly #location: Chrome.DevTools.RawLocation;
|
|
618
618
|
|
|
619
619
|
constructor(
|
|
620
620
|
callFrame: SDK.DebuggerModel.CallFrame, plugin: DebuggerLanguagePlugin, location: Chrome.DevTools.RawLocation) {
|
|
621
621
|
super(callFrame.debuggerModel.runtimeModel(), undefined, 'object', undefined, null);
|
|
622
622
|
this.variables = [];
|
|
623
|
-
this
|
|
624
|
-
this
|
|
625
|
-
this
|
|
623
|
+
this.#callFrame = callFrame;
|
|
624
|
+
this.#plugin = plugin;
|
|
625
|
+
this.#location = location;
|
|
626
626
|
}
|
|
627
627
|
|
|
628
628
|
async doGetProperties(ownProperties: boolean, accessorPropertiesOnly: boolean, _generatePreview: boolean):
|
|
@@ -645,7 +645,7 @@ class SourceScopeRemoteObject extends SDK.RemoteObject.RemoteObjectImpl {
|
|
|
645
645
|
for (const variable of this.variables) {
|
|
646
646
|
let sourceVar;
|
|
647
647
|
try {
|
|
648
|
-
sourceVar = await getValueTreeForExpression(this
|
|
648
|
+
sourceVar = await getValueTreeForExpression(this.#callFrame, this.#plugin, variable.name, ({
|
|
649
649
|
generatePreview: false,
|
|
650
650
|
includeCommandLineAPI: true,
|
|
651
651
|
objectGroup: 'backtrace',
|
|
@@ -686,33 +686,33 @@ class SourceScopeRemoteObject extends SDK.RemoteObject.RemoteObjectImpl {
|
|
|
686
686
|
}
|
|
687
687
|
|
|
688
688
|
export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
689
|
+
readonly #callFrameInternal: SDK.DebuggerModel.CallFrame;
|
|
690
|
+
readonly #typeInternal: string;
|
|
691
|
+
readonly #typeNameInternal: string;
|
|
692
|
+
readonly #iconInternal: string|undefined;
|
|
693
|
+
readonly #objectInternal: SourceScopeRemoteObject;
|
|
694
|
+
readonly #nameInternal: string;
|
|
695
|
+
readonly #startLocationInternal: SDK.DebuggerModel.Location|null;
|
|
696
|
+
readonly #endLocationInternal: SDK.DebuggerModel.Location|null;
|
|
697
697
|
constructor(
|
|
698
698
|
callFrame: SDK.DebuggerModel.CallFrame, type: string, typeName: string, icon: string|undefined,
|
|
699
699
|
plugin: DebuggerLanguagePlugin, location: Chrome.DevTools.RawLocation) {
|
|
700
|
-
this
|
|
701
|
-
this
|
|
702
|
-
this
|
|
703
|
-
this
|
|
704
|
-
this
|
|
705
|
-
this
|
|
706
|
-
this
|
|
707
|
-
this
|
|
700
|
+
this.#callFrameInternal = callFrame;
|
|
701
|
+
this.#typeInternal = type;
|
|
702
|
+
this.#typeNameInternal = typeName;
|
|
703
|
+
this.#iconInternal = icon;
|
|
704
|
+
this.#objectInternal = new SourceScopeRemoteObject(callFrame, plugin, location);
|
|
705
|
+
this.#nameInternal = type;
|
|
706
|
+
this.#startLocationInternal = null;
|
|
707
|
+
this.#endLocationInternal = null;
|
|
708
708
|
}
|
|
709
709
|
|
|
710
710
|
async getVariableValue(name: string): Promise<SDK.RemoteObject.RemoteObject|null> {
|
|
711
|
-
for (let v = 0; v < this
|
|
712
|
-
if (this
|
|
711
|
+
for (let v = 0; v < this.#objectInternal.variables.length; ++v) {
|
|
712
|
+
if (this.#objectInternal.variables[v].name !== name) {
|
|
713
713
|
continue;
|
|
714
714
|
}
|
|
715
|
-
const properties = await this
|
|
715
|
+
const properties = await this.#objectInternal.getAllProperties(false, false);
|
|
716
716
|
if (!properties.properties) {
|
|
717
717
|
continue;
|
|
718
718
|
}
|
|
@@ -725,15 +725,15 @@ export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
|
725
725
|
}
|
|
726
726
|
|
|
727
727
|
callFrame(): SDK.DebuggerModel.CallFrame {
|
|
728
|
-
return this
|
|
728
|
+
return this.#callFrameInternal;
|
|
729
729
|
}
|
|
730
730
|
|
|
731
731
|
type(): string {
|
|
732
|
-
return this
|
|
732
|
+
return this.#typeInternal;
|
|
733
733
|
}
|
|
734
734
|
|
|
735
735
|
typeName(): string {
|
|
736
|
-
return this
|
|
736
|
+
return this.#typeNameInternal;
|
|
737
737
|
}
|
|
738
738
|
|
|
739
739
|
name(): string|undefined {
|
|
@@ -741,15 +741,15 @@ export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
|
741
741
|
}
|
|
742
742
|
|
|
743
743
|
startLocation(): SDK.DebuggerModel.Location|null {
|
|
744
|
-
return this
|
|
744
|
+
return this.#startLocationInternal;
|
|
745
745
|
}
|
|
746
746
|
|
|
747
747
|
endLocation(): SDK.DebuggerModel.Location|null {
|
|
748
|
-
return this
|
|
748
|
+
return this.#endLocationInternal;
|
|
749
749
|
}
|
|
750
750
|
|
|
751
751
|
object(): SourceScopeRemoteObject {
|
|
752
|
-
return this
|
|
752
|
+
return this.#objectInternal;
|
|
753
753
|
}
|
|
754
754
|
|
|
755
755
|
description(): string {
|
|
@@ -757,17 +757,17 @@ export class SourceScope implements SDK.DebuggerModel.ScopeChainEntry {
|
|
|
757
757
|
}
|
|
758
758
|
|
|
759
759
|
icon(): string|undefined {
|
|
760
|
-
return this
|
|
760
|
+
return this.#iconInternal;
|
|
761
761
|
}
|
|
762
762
|
}
|
|
763
763
|
|
|
764
764
|
export class DebuggerLanguagePluginManager implements
|
|
765
765
|
SDK.TargetManager.SDKModelObserver<SDK.DebuggerModel.DebuggerModel> {
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
766
|
+
readonly #workspace: Workspace.Workspace.WorkspaceImpl;
|
|
767
|
+
readonly #debuggerWorkspaceBinding: DebuggerWorkspaceBinding;
|
|
768
|
+
#plugins: DebuggerLanguagePlugin[];
|
|
769
|
+
readonly #debuggerModelToData: Map<SDK.DebuggerModel.DebuggerModel, ModelData>;
|
|
770
|
+
readonly #rawModuleHandles: Map<string, {
|
|
771
771
|
rawModuleId: string,
|
|
772
772
|
plugin: DebuggerLanguagePlugin,
|
|
773
773
|
scripts: Array<SDK.Script.Script>,
|
|
@@ -777,15 +777,15 @@ export class DebuggerLanguagePluginManager implements
|
|
|
777
777
|
constructor(
|
|
778
778
|
targetManager: SDK.TargetManager.TargetManager, workspace: Workspace.Workspace.WorkspaceImpl,
|
|
779
779
|
debuggerWorkspaceBinding: DebuggerWorkspaceBinding) {
|
|
780
|
-
this
|
|
781
|
-
this
|
|
780
|
+
this.#workspace = workspace;
|
|
781
|
+
this.#debuggerWorkspaceBinding = debuggerWorkspaceBinding;
|
|
782
782
|
|
|
783
|
-
this
|
|
783
|
+
this.#plugins = [];
|
|
784
784
|
|
|
785
|
-
this
|
|
785
|
+
this.#debuggerModelToData = new Map();
|
|
786
786
|
targetManager.observeModels(SDK.DebuggerModel.DebuggerModel, this);
|
|
787
787
|
|
|
788
|
-
this
|
|
788
|
+
this.#rawModuleHandles = new Map();
|
|
789
789
|
}
|
|
790
790
|
|
|
791
791
|
private async evaluateOnCallFrame(
|
|
@@ -842,7 +842,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
842
842
|
}
|
|
843
843
|
|
|
844
844
|
modelAdded(debuggerModel: SDK.DebuggerModel.DebuggerModel): void {
|
|
845
|
-
this
|
|
845
|
+
this.#debuggerModelToData.set(debuggerModel, new ModelData(debuggerModel, this.#workspace));
|
|
846
846
|
debuggerModel.addEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, this.globalObjectCleared, this);
|
|
847
847
|
debuggerModel.addEventListener(SDK.DebuggerModel.Events.ParsedScriptSource, this.parsedScriptSource, this);
|
|
848
848
|
debuggerModel.setEvaluateOnCallFrameCallback(this.evaluateOnCallFrame.bind(this));
|
|
@@ -854,19 +854,19 @@ export class DebuggerLanguagePluginManager implements
|
|
|
854
854
|
debuggerModel.removeEventListener(SDK.DebuggerModel.Events.ParsedScriptSource, this.parsedScriptSource, this);
|
|
855
855
|
debuggerModel.setEvaluateOnCallFrameCallback(null);
|
|
856
856
|
debuggerModel.setExpandCallFramesCallback(null);
|
|
857
|
-
const modelData = this
|
|
857
|
+
const modelData = this.#debuggerModelToData.get(debuggerModel);
|
|
858
858
|
if (modelData) {
|
|
859
859
|
modelData.dispose();
|
|
860
|
-
this
|
|
860
|
+
this.#debuggerModelToData.delete(debuggerModel);
|
|
861
861
|
}
|
|
862
|
-
this
|
|
862
|
+
this.#rawModuleHandles.forEach((rawModuleHandle, rawModuleId) => {
|
|
863
863
|
const scripts = rawModuleHandle.scripts.filter(script => script.debuggerModel !== debuggerModel);
|
|
864
864
|
if (scripts.length === 0) {
|
|
865
865
|
rawModuleHandle.plugin.removeRawModule(rawModuleId).catch(error => {
|
|
866
866
|
Common.Console.Console.instance().error(
|
|
867
867
|
i18nString(UIStrings.errorInDebuggerLanguagePlugin, {PH1: error.message}));
|
|
868
868
|
});
|
|
869
|
-
this
|
|
869
|
+
this.#rawModuleHandles.delete(rawModuleId);
|
|
870
870
|
} else {
|
|
871
871
|
rawModuleHandle.scripts = scripts;
|
|
872
872
|
}
|
|
@@ -880,8 +880,8 @@ export class DebuggerLanguagePluginManager implements
|
|
|
880
880
|
}
|
|
881
881
|
|
|
882
882
|
addPlugin(plugin: DebuggerLanguagePlugin): void {
|
|
883
|
-
this
|
|
884
|
-
for (const debuggerModel of this
|
|
883
|
+
this.#plugins.push(plugin);
|
|
884
|
+
for (const debuggerModel of this.#debuggerModelToData.keys()) {
|
|
885
885
|
for (const script of debuggerModel.scripts()) {
|
|
886
886
|
if (this.hasPluginForScript(script)) {
|
|
887
887
|
continue;
|
|
@@ -892,24 +892,24 @@ export class DebuggerLanguagePluginManager implements
|
|
|
892
892
|
}
|
|
893
893
|
|
|
894
894
|
removePlugin(plugin: DebuggerLanguagePlugin): void {
|
|
895
|
-
this
|
|
895
|
+
this.#plugins = this.#plugins.filter(p => p !== plugin);
|
|
896
896
|
const scripts = new Set<SDK.Script.Script>();
|
|
897
|
-
this
|
|
897
|
+
this.#rawModuleHandles.forEach((rawModuleHandle, rawModuleId) => {
|
|
898
898
|
if (rawModuleHandle.plugin !== plugin) {
|
|
899
899
|
return;
|
|
900
900
|
}
|
|
901
901
|
rawModuleHandle.scripts.forEach(script => scripts.add(script));
|
|
902
|
-
this
|
|
902
|
+
this.#rawModuleHandles.delete(rawModuleId);
|
|
903
903
|
});
|
|
904
904
|
for (const script of scripts) {
|
|
905
|
-
const modelData = (this
|
|
905
|
+
const modelData = (this.#debuggerModelToData.get(script.debuggerModel) as ModelData);
|
|
906
906
|
modelData.removeScript(script);
|
|
907
907
|
|
|
908
|
-
// Let's see if we have another plugin that's happy to
|
|
908
|
+
// Let's see if we have another #plugin that's happy to
|
|
909
909
|
// take this orphaned script now. This is important to
|
|
910
|
-
// get right, since the same plugin might race during
|
|
910
|
+
// get right, since the same #plugin might race during
|
|
911
911
|
// unregister/register and we might already have the
|
|
912
|
-
// new instance of the plugin added before we remove
|
|
912
|
+
// new instance of the #plugin added before we remove
|
|
913
913
|
// the previous instance.
|
|
914
914
|
this.parsedScriptSource({data: script});
|
|
915
915
|
}
|
|
@@ -917,27 +917,27 @@ export class DebuggerLanguagePluginManager implements
|
|
|
917
917
|
|
|
918
918
|
hasPluginForScript(script: SDK.Script.Script): boolean {
|
|
919
919
|
const rawModuleId = rawModuleIdForScript(script);
|
|
920
|
-
const rawModuleHandle = this
|
|
920
|
+
const rawModuleHandle = this.#rawModuleHandles.get(rawModuleId);
|
|
921
921
|
return rawModuleHandle !== undefined && rawModuleHandle.scripts.includes(script);
|
|
922
922
|
}
|
|
923
923
|
|
|
924
924
|
/**
|
|
925
|
-
* Returns the responsible language plugin and the raw module ID for a script.
|
|
925
|
+
* Returns the responsible language #plugin and the raw module ID for a script.
|
|
926
926
|
*
|
|
927
927
|
* This ensures that the `addRawModule` call finishes first such that the
|
|
928
|
-
* caller can immediately issue calls to the returned plugin without the
|
|
929
|
-
* risk of racing with the `addRawModule` call. The returned plugin will be
|
|
930
|
-
* set to undefined to indicate that there's no plugin for the script.
|
|
928
|
+
* caller can immediately issue calls to the returned #plugin without the
|
|
929
|
+
* risk of racing with the `addRawModule` call. The returned #plugin will be
|
|
930
|
+
* set to undefined to indicate that there's no #plugin for the script.
|
|
931
931
|
*/
|
|
932
932
|
private async rawModuleIdAndPluginForScript(script: SDK.Script.Script): Promise<{
|
|
933
933
|
rawModuleId: string,
|
|
934
934
|
plugin: DebuggerLanguagePlugin|null,
|
|
935
935
|
}> {
|
|
936
936
|
const rawModuleId = rawModuleIdForScript(script);
|
|
937
|
-
const rawModuleHandle = this
|
|
937
|
+
const rawModuleHandle = this.#rawModuleHandles.get(rawModuleId);
|
|
938
938
|
if (rawModuleHandle) {
|
|
939
939
|
await rawModuleHandle.addRawModulePromise;
|
|
940
|
-
if (rawModuleHandle === this
|
|
940
|
+
if (rawModuleHandle === this.#rawModuleHandles.get(rawModuleId)) {
|
|
941
941
|
return {rawModuleId, plugin: rawModuleHandle.plugin};
|
|
942
942
|
}
|
|
943
943
|
}
|
|
@@ -946,7 +946,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
946
946
|
|
|
947
947
|
uiSourceCodeForURL(debuggerModel: SDK.DebuggerModel.DebuggerModel, url: string): Workspace.UISourceCode.UISourceCode
|
|
948
948
|
|null {
|
|
949
|
-
const modelData = this
|
|
949
|
+
const modelData = this.#debuggerModelToData.get(debuggerModel);
|
|
950
950
|
if (modelData) {
|
|
951
951
|
return modelData.getProject().uiSourceCodeForURL(url);
|
|
952
952
|
}
|
|
@@ -966,7 +966,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
966
966
|
|
|
967
967
|
const pluginLocation = {
|
|
968
968
|
rawModuleId,
|
|
969
|
-
// RawLocation
|
|
969
|
+
// RawLocation.#columnNumber is the byte offset in the full raw wasm module. Plugins expect the offset in the code
|
|
970
970
|
// section, so subtract the offset of the code section in the module here.
|
|
971
971
|
codeOffset: rawLocation.columnNumber - (script.codeOffset() || 0),
|
|
972
972
|
inlineFrameIndex: rawLocation.inlineFrameIndex,
|
|
@@ -979,7 +979,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
979
979
|
if (!uiSourceCode) {
|
|
980
980
|
continue;
|
|
981
981
|
}
|
|
982
|
-
// Absence of column information is indicated by the value `-1` in talking to language plugins.
|
|
982
|
+
// Absence of column information is indicated by the value `-1` in talking to language #plugins.
|
|
983
983
|
return uiSourceCode.uiLocation(
|
|
984
984
|
sourceLocation.lineNumber, sourceLocation.columnNumber >= 0 ? sourceLocation.columnNumber : undefined);
|
|
985
985
|
}
|
|
@@ -1002,7 +1002,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1002
1002
|
}[]>[] = [];
|
|
1003
1003
|
this.scriptsForUISourceCode(uiSourceCode).forEach(script => {
|
|
1004
1004
|
const rawModuleId = rawModuleIdForScript(script);
|
|
1005
|
-
const rawModuleHandle = this
|
|
1005
|
+
const rawModuleHandle = this.#rawModuleHandles.get(rawModuleId);
|
|
1006
1006
|
if (!rawModuleHandle) {
|
|
1007
1007
|
return;
|
|
1008
1008
|
}
|
|
@@ -1051,7 +1051,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1051
1051
|
}
|
|
1052
1052
|
|
|
1053
1053
|
scriptsForUISourceCode(uiSourceCode: Workspace.UISourceCode.UISourceCode): SDK.Script.Script[] {
|
|
1054
|
-
for (const modelData of this
|
|
1054
|
+
for (const modelData of this.#debuggerModelToData.values()) {
|
|
1055
1055
|
const scripts = modelData.uiSourceCodeToScripts.get(uiSourceCode);
|
|
1056
1056
|
if (scripts) {
|
|
1057
1057
|
return scripts;
|
|
@@ -1066,12 +1066,12 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1066
1066
|
return;
|
|
1067
1067
|
}
|
|
1068
1068
|
|
|
1069
|
-
for (const plugin of this
|
|
1069
|
+
for (const plugin of this.#plugins) {
|
|
1070
1070
|
if (!plugin.handleScript(script)) {
|
|
1071
1071
|
return;
|
|
1072
1072
|
}
|
|
1073
1073
|
const rawModuleId = rawModuleIdForScript(script);
|
|
1074
|
-
let rawModuleHandle = this
|
|
1074
|
+
let rawModuleHandle = this.#rawModuleHandles.get(rawModuleId);
|
|
1075
1075
|
if (!rawModuleHandle) {
|
|
1076
1076
|
const sourceFileURLsPromise = (async(): Promise<string[]> => {
|
|
1077
1077
|
const console = Common.Console.Console.instance();
|
|
@@ -1089,7 +1089,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1089
1089
|
// `rawModuleHandle` below will run before this code because of the `await` in the preceding
|
|
1090
1090
|
// line. This is primarily to avoid logging the message below, which would give the developer
|
|
1091
1091
|
// the misleading information that we're done, while in reality it was a stale call that finished.
|
|
1092
|
-
if (rawModuleHandle !== this
|
|
1092
|
+
if (rawModuleHandle !== this.#rawModuleHandles.get(rawModuleId)) {
|
|
1093
1093
|
return [];
|
|
1094
1094
|
}
|
|
1095
1095
|
if (sourceFileURLs.length === 0) {
|
|
@@ -1102,27 +1102,27 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1102
1102
|
} catch (error) {
|
|
1103
1103
|
console.error(
|
|
1104
1104
|
i18nString(UIStrings.failedToLoadDebugSymbolsFor, {PH1: plugin.name, PH2: url, PH3: error.message}));
|
|
1105
|
-
this
|
|
1105
|
+
this.#rawModuleHandles.delete(rawModuleId);
|
|
1106
1106
|
return [];
|
|
1107
1107
|
}
|
|
1108
1108
|
})();
|
|
1109
1109
|
rawModuleHandle = {rawModuleId, plugin, scripts: [script], addRawModulePromise: sourceFileURLsPromise};
|
|
1110
|
-
this
|
|
1110
|
+
this.#rawModuleHandles.set(rawModuleId, rawModuleHandle);
|
|
1111
1111
|
} else {
|
|
1112
1112
|
rawModuleHandle.scripts.push(script);
|
|
1113
1113
|
}
|
|
1114
1114
|
|
|
1115
1115
|
// Wait for the addRawModule call to finish and
|
|
1116
|
-
// update the project. It's important to check
|
|
1116
|
+
// update the #project. It's important to check
|
|
1117
1117
|
// for the DebuggerModel again, which may disappear
|
|
1118
1118
|
// in the meantime...
|
|
1119
1119
|
rawModuleHandle.addRawModulePromise.then(sourceFileURLs => {
|
|
1120
1120
|
// The script might have disappeared meanwhile...
|
|
1121
1121
|
if (script.debuggerModel.scriptForId(script.scriptId) === script) {
|
|
1122
|
-
const modelData = this
|
|
1122
|
+
const modelData = this.#debuggerModelToData.get(script.debuggerModel);
|
|
1123
1123
|
if (modelData) { // The DebuggerModel could have disappeared meanwhile...
|
|
1124
1124
|
modelData.addSourceFiles(script, sourceFileURLs);
|
|
1125
|
-
this
|
|
1125
|
+
this.#debuggerWorkspaceBinding.updateLocations(script);
|
|
1126
1126
|
}
|
|
1127
1127
|
}
|
|
1128
1128
|
});
|
|
@@ -1205,7 +1205,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1205
1205
|
|
|
1206
1206
|
const pluginLocation = {
|
|
1207
1207
|
rawModuleId,
|
|
1208
|
-
// RawLocation
|
|
1208
|
+
// RawLocation.#columnNumber is the byte offset in the full raw wasm module. Plugins expect the offset in the code
|
|
1209
1209
|
// section, so subtract the offset of the code section in the module here.
|
|
1210
1210
|
codeOffset: rawLocation.columnNumber - (script.codeOffset() || 0),
|
|
1211
1211
|
};
|
|
@@ -1242,7 +1242,7 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1242
1242
|
|
|
1243
1243
|
const pluginLocation = {
|
|
1244
1244
|
rawModuleId,
|
|
1245
|
-
// RawLocation
|
|
1245
|
+
// RawLocation.#columnNumber is the byte offset in the full raw wasm module. Plugins expect the offset in the code
|
|
1246
1246
|
// section, so subtract the offset of the code section in the module here.
|
|
1247
1247
|
codeOffset: rawLocation.columnNumber - (script.codeOffset() || 0),
|
|
1248
1248
|
};
|
|
@@ -1292,11 +1292,11 @@ export class DebuggerLanguagePluginManager implements
|
|
|
1292
1292
|
}
|
|
1293
1293
|
|
|
1294
1294
|
class ModelData {
|
|
1295
|
-
|
|
1295
|
+
readonly #debuggerModel: SDK.DebuggerModel.DebuggerModel;
|
|
1296
1296
|
project: ContentProviderBasedProject;
|
|
1297
1297
|
readonly uiSourceCodeToScripts: Map<Workspace.UISourceCode.UISourceCode, SDK.Script.Script[]>;
|
|
1298
1298
|
constructor(debuggerModel: SDK.DebuggerModel.DebuggerModel, workspace: Workspace.Workspace.WorkspaceImpl) {
|
|
1299
|
-
this
|
|
1299
|
+
this.#debuggerModel = debuggerModel;
|
|
1300
1300
|
this.project = new ContentProviderBasedProject(
|
|
1301
1301
|
workspace, 'language_plugins::' + debuggerModel.target().id(), Workspace.Workspace.projectTypes.Network, '',
|
|
1302
1302
|
false /* isServiceProject */);
|
|
@@ -1314,7 +1314,7 @@ class ModelData {
|
|
|
1314
1314
|
NetworkProject.setInitialFrameAttribution(uiSourceCode, script.frameId);
|
|
1315
1315
|
|
|
1316
1316
|
// Bind the uiSourceCode to the script first before we add the
|
|
1317
|
-
// uiSourceCode to the project and thereby notify the rest of
|
|
1317
|
+
// uiSourceCode to the #project and thereby notify the rest of
|
|
1318
1318
|
// the system about the new source file.
|
|
1319
1319
|
// https://crbug.com/1150295 is an example where the breakpoint
|
|
1320
1320
|
// resolution logic kicks in right after adding the uiSourceCode
|
|
@@ -1371,21 +1371,21 @@ export class DebuggerLanguagePlugin {
|
|
|
1371
1371
|
dispose(): void {
|
|
1372
1372
|
}
|
|
1373
1373
|
|
|
1374
|
-
/** Notify the plugin about a new script
|
|
1374
|
+
/** Notify the #plugin about a new script
|
|
1375
1375
|
*/
|
|
1376
1376
|
async addRawModule(_rawModuleId: string, _symbolsURL: string, _rawModule: Chrome.DevTools.RawModule):
|
|
1377
1377
|
Promise<string[]> {
|
|
1378
1378
|
throw new Error('Not implemented yet');
|
|
1379
1379
|
}
|
|
1380
1380
|
|
|
1381
|
-
/** Find locations in raw modules from a location in a source file
|
|
1381
|
+
/** Find #locations in raw modules from a #location in a source file
|
|
1382
1382
|
*/
|
|
1383
1383
|
async sourceLocationToRawLocation(_sourceLocation: Chrome.DevTools.SourceLocation):
|
|
1384
1384
|
Promise<Chrome.DevTools.RawLocationRange[]> {
|
|
1385
1385
|
throw new Error('Not implemented yet');
|
|
1386
1386
|
}
|
|
1387
1387
|
|
|
1388
|
-
/** Find locations in source files from a location in a raw module
|
|
1388
|
+
/** Find #locations in source files from a #location in a raw module
|
|
1389
1389
|
*/
|
|
1390
1390
|
async rawLocationToSourceLocation(_rawLocation: Chrome.DevTools.RawLocation):
|
|
1391
1391
|
Promise<Chrome.DevTools.SourceLocation[]> {
|
|
@@ -1398,14 +1398,14 @@ export class DebuggerLanguagePlugin {
|
|
|
1398
1398
|
throw new Error('Not implemented yet');
|
|
1399
1399
|
}
|
|
1400
1400
|
|
|
1401
|
-
/** List all variables in lexical scope at a given location in a raw module
|
|
1401
|
+
/** List all variables in lexical scope at a given #location in a raw module
|
|
1402
1402
|
*/
|
|
1403
1403
|
async listVariablesInScope(_rawLocation: Chrome.DevTools.RawLocation): Promise<Chrome.DevTools.Variable[]> {
|
|
1404
1404
|
throw new Error('Not implemented yet');
|
|
1405
1405
|
}
|
|
1406
1406
|
|
|
1407
1407
|
/**
|
|
1408
|
-
* Notifies the plugin that a script is removed.
|
|
1408
|
+
* Notifies the #plugin that a script is removed.
|
|
1409
1409
|
*/
|
|
1410
1410
|
removeRawModule(_rawModuleId: string): Promise<void> {
|
|
1411
1411
|
throw new Error('Not implemented yet');
|
|
@@ -1439,7 +1439,7 @@ export class DebuggerLanguagePlugin {
|
|
|
1439
1439
|
}
|
|
1440
1440
|
|
|
1441
1441
|
/**
|
|
1442
|
-
* Find locations in source files from a location in a raw module
|
|
1442
|
+
* Find #locations in source files from a #location in a raw module
|
|
1443
1443
|
*/
|
|
1444
1444
|
async getFunctionInfo(_rawLocation: Chrome.DevTools.RawLocation): Promise<{
|
|
1445
1445
|
frames: Array<Chrome.DevTools.FunctionInfo>,
|
|
@@ -1449,7 +1449,7 @@ export class DebuggerLanguagePlugin {
|
|
|
1449
1449
|
}
|
|
1450
1450
|
|
|
1451
1451
|
/**
|
|
1452
|
-
* Find locations in raw modules corresponding to the inline function
|
|
1452
|
+
* Find #locations in raw modules corresponding to the inline function
|
|
1453
1453
|
* that rawLocation is in. Used for stepping out of an inline function.
|
|
1454
1454
|
*/
|
|
1455
1455
|
async getInlinedFunctionRanges(_rawLocation: Chrome.DevTools.RawLocation):
|
|
@@ -1458,7 +1458,7 @@ export class DebuggerLanguagePlugin {
|
|
|
1458
1458
|
}
|
|
1459
1459
|
|
|
1460
1460
|
/**
|
|
1461
|
-
* Find locations in raw modules corresponding to inline functions
|
|
1461
|
+
* Find #locations in raw modules corresponding to inline functions
|
|
1462
1462
|
* called by the function or inline frame that rawLocation is in.
|
|
1463
1463
|
* Used for stepping over inline functions.
|
|
1464
1464
|
*/
|