chrome-devtools-frontend 1.0.1020771 → 1.0.1021097

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.
@@ -50,16 +50,18 @@ Issues in the untriaged queue should receive a meaningful response within a busi
50
50
  - Put proper `Platform>DevTools>XXX` component(s) on the issue and do an initial check-in regarding the priority.
51
51
  - Put one of the following labels on it and set the status to `Available`:
52
52
  - `Hotlist-DevTools-ProductReview` if it's controversial or clear that consensus needs to be built first.
53
- - `Hotlist-DevTools-BrowserAutomation-Backlog` if it's an issue related to ChromeDriver or puppeteer.
54
- - `Hotlist-DevTools-Debugging-Backlog` if it's a debugging issue.
55
- - `Hotlist-DevTools-DesignAccessibility-Backlog` if it's a design or accessibility issue.
56
- - `Hotlist-DevTools-Performance-Backlog` if the issue is related to our performance tooling (i.e. Performance panel, Lighthouse).
57
- - `Hotlist-DevTools-Backlog` if it's a general DevTools issue that is not specific to one of the core areas.
53
+ - `Team-DevTools-BrowserAutomation` if it's an issue related to ChromeDriver or puppeteer.
54
+ - `Team-DevTools-RuntimeDebugging` if it's a JavaScript or WebAssembly debugging issue.
55
+ - `Team-DevTools-WebDebugging` if it's a Web specific debugging issue (i.e. Network or Application panel).
56
+ - `Team-DevTools-DesignAccessibility` if it's a design or accessibility issue.
57
+ - `Team-DevTools-Performance` if the issue is related to our performance tooling (i.e. Performance panel, Lighthouse).
58
+ - `Team-DevTools-RecordReplay` if it's an issue with the recorder or puppeteer.
59
+ - No specific `Team` or `Hotlist` if it doesn't fit any specific team otherwise. Make sure to have the `Platform>DevTools` component (or a subcomponent) on it though.
58
60
  - Also remember to put the `Needs-UX` label on it, if help from a designer is likely to be required.
59
61
 
60
62
  ### Setting Assigned or Available
61
63
 
62
- Set issues to Available if they don’t need immediate action and nobody right now and in the short-term future (an iteration) needs to work on it.
64
+ Set issues to `Available` if they don’t need immediate action and nobody right now and in the short-term future (an iteration) needs to work on it.
63
65
 
64
66
  Issues that are handled by Microsoft have the label “Hotlist-DevTools-MS-Backlog” and “Hotlist-DevTools-MS-CurrentSprint” respectively and can be considered triaged.
65
67
 
@@ -107,7 +109,7 @@ The combination of the label “M-<milestone>” and “Release-Block-<channel>
107
109
 
108
110
  ### Managing the backlog
109
111
 
110
- [[Query]](https://bugs.chromium.org/p/chromium/issues/list?q=Hotlist%3DDevTools-Backlog)
112
+ [[Query]](https://bugs.chromium.org/p/chromium/issues/list?q=component%3APlatform%3EDevTools%20status%3AAvailable)
111
113
 
112
114
  Managing the backlog is out of scope for the triage rotation. The backlog will be groomed continuously by hablich@ for now. The SLA is that there should be a maximum of 50 issues in there.
113
115
 
@@ -12278,9 +12278,6 @@
12278
12278
  "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | noProperties": {
12279
12279
  "message": "No properties"
12280
12280
  },
12281
- "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | noPropertyGetter": {
12282
- "message": "No property getter"
12283
- },
12284
12281
  "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | showAllD": {
12285
12282
  "message": "Show all {PH1}"
12286
12283
  },
@@ -12293,8 +12290,11 @@
12293
12290
  "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | unknown": {
12294
12291
  "message": "unknown"
12295
12292
  },
12296
- "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | unreadable": {
12297
- "message": "<unreadable>"
12293
+ "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | valueNotAccessibleToTheDebugger": {
12294
+ "message": "Value is not accessible to the debugger"
12295
+ },
12296
+ "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | valueUnavailable": {
12297
+ "message": "<value unavailable>"
12298
12298
  },
12299
12299
  "ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts | empty": {
12300
12300
  "message": "empty"
@@ -12278,9 +12278,6 @@
12278
12278
  "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | noProperties": {
12279
12279
  "message": "N̂ó p̂ŕôṕêŕt̂íêś"
12280
12280
  },
12281
- "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | noPropertyGetter": {
12282
- "message": "N̂ó p̂ŕôṕêŕt̂ý ĝét̂t́êŕ"
12283
- },
12284
12281
  "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | showAllD": {
12285
12282
  "message": "Ŝh́ôẃ âĺl̂ {PH1}"
12286
12283
  },
@@ -12293,8 +12290,11 @@
12293
12290
  "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | unknown": {
12294
12291
  "message": "ûńk̂ńôẃn̂"
12295
12292
  },
12296
- "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | unreadable": {
12297
- "message": "<ûńr̂éâd́âb́l̂é>"
12293
+ "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | valueNotAccessibleToTheDebugger": {
12294
+ "message": "V̂ál̂úê íŝ ôt́ ćĉéŝśîb́l̂é t̂ó t̂h́ê d́êb́ûǵĝér̂"
12295
+ },
12296
+ "ui/legacy/components/object_ui/ObjectPropertiesSection.ts | valueUnavailable": {
12297
+ "message": "<v̂ál̂úê ún̂áv̂áîĺâb́l̂é>"
12298
12298
  },
12299
12299
  "ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts | empty": {
12300
12300
  "message": "êḿp̂t́ŷ"
@@ -313,7 +313,10 @@ export class CSSModel extends SDKModel<EventTypes> {
313
313
  return classNames || [];
314
314
  }
315
315
 
316
- getComputedStyle(nodeId: Protocol.DOM.NodeId): Promise<Map<string, string>|null> {
316
+ async getComputedStyle(nodeId: Protocol.DOM.NodeId): Promise<Map<string, string>|null> {
317
+ if (!this.isEnabled()) {
318
+ await this.enable();
319
+ }
317
320
  return this.#styleLoader.computedStylePromise(nodeId);
318
321
  }
319
322
 
@@ -683,7 +686,7 @@ export class CSSModel extends SDKModel<EventTypes> {
683
686
  // is different from the regular navigations. In this case, events about CSS
684
687
  // stylesheet has already been received and they are mixed with the previous page
685
688
  // stylesheets. Therefore, we re-enable the CSS agent to get fresh events.
686
- // For the regular navigatons, we can just clear the local data because events about
689
+ // For the regular navigations, we can just clear the local data because events about
687
690
  // stylesheets will arrive later.
688
691
  if (event.data.backForwardCacheDetails.restoredFromCache) {
689
692
  await this.suspendModel();
@@ -40,6 +40,7 @@ import {DebuggerWorkspaceBinding} from './DebuggerWorkspaceBinding.js';
40
40
  import type {LiveLocation} from './LiveLocation.js';
41
41
  import {LiveLocationPool} from './LiveLocation.js';
42
42
  import {DefaultScriptMapping} from './DefaultScriptMapping.js';
43
+ import {ResourceScriptMapping} from './ResourceScriptMapping.js';
43
44
 
44
45
  let breakpointManagerInstance: BreakpointManager;
45
46
 
@@ -170,12 +171,22 @@ export class BreakpointManager extends Common.ObjectWrapper.ObjectWrapper<EventT
170
171
  const isSnippet = script.sourceURL.startsWith('snippet://');
171
172
  const projectType = isSnippet ? Workspace.Workspace.projectTypes.Network : undefined;
172
173
 
173
- // Handle inline scripts without sourceURL comment separately:
174
+ // Some temporary workarounds that will probably be replaced by live locations.
175
+ // 1. Handle inline scripts without sourceURL comment separately:
174
176
  // The UISourceCode of inline scripts without sourceURLs will not be availabe
175
177
  // until a later point. Use the v8 script for setting the breakpoint.
178
+ // 2. Handle resources that have scripts differently: nowadays they don't use the
179
+ // sourceURL directly anymore, but are resolved relatively to the parents document's
180
+ // base URL; so resolve it before awaiting its uiSourceCode.
176
181
  const isInlineScriptWithoutSourceURL = script.isInlineScript() && !script.hasSourceURL;
177
- const sourceURL =
178
- isInlineScriptWithoutSourceURL ? DefaultScriptMapping.createV8ScriptURL(script) : script.sourceURL;
182
+ const hasResourceScriptMapping = !script.isLiveEdit() && script.sourceURL && script.hasSourceURL;
183
+ let sourceURL = script.sourceURL;
184
+ if (isInlineScriptWithoutSourceURL) {
185
+ sourceURL = DefaultScriptMapping.createV8ScriptURL(script);
186
+ } else if (hasResourceScriptMapping) {
187
+ sourceURL = ResourceScriptMapping.resolveRelativeSourceURL(script, script.sourceURL);
188
+ }
189
+
179
190
  const uiSourceCode =
180
191
  await Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURLPromise(sourceURL, projectType);
181
192
 
@@ -30,10 +30,10 @@
30
30
 
31
31
  import * as Common from '../../core/common/common.js';
32
32
  import * as i18n from '../../core/i18n/i18n.js';
33
- import type * as Platform from '../../core/platform/platform.js';
33
+ import * as Platform from '../../core/platform/platform.js';
34
34
  import * as SDK from '../../core/sdk/sdk.js';
35
- import * as Workspace from '../workspace/workspace.js';
36
35
  import * as Protocol from '../../generated/protocol.js';
36
+ import * as Workspace from '../workspace/workspace.js';
37
37
 
38
38
  import type {Breakpoint} from './BreakpointManager.js';
39
39
  import {BreakpointManager} from './BreakpointManager.js';
@@ -65,7 +65,7 @@ export class ResourceScriptMapping implements DebuggerSourceMapping {
65
65
  readonly debuggerWorkspaceBinding: DebuggerWorkspaceBinding;
66
66
  readonly #uiSourceCodeToScriptFile: Map<Workspace.UISourceCode.UISourceCode, ResourceScriptFile>;
67
67
  readonly #projects: Map<string, ContentProviderBasedProject>;
68
- #acceptedScripts: Set<SDK.Script.Script>;
68
+ readonly #scriptToUISourceCode: Map<SDK.Script.Script, Workspace.UISourceCode.UISourceCode>;
69
69
  readonly #eventListeners: Common.EventTarget.EventDescriptor[];
70
70
 
71
71
  constructor(
@@ -78,21 +78,30 @@ export class ResourceScriptMapping implements DebuggerSourceMapping {
78
78
 
79
79
  this.#projects = new Map();
80
80
 
81
- this.#acceptedScripts = new Set();
81
+ this.#scriptToUISourceCode = new Map();
82
82
  const runtimeModel = debuggerModel.runtimeModel();
83
83
  this.#eventListeners = [
84
84
  this.debuggerModel.addEventListener(
85
- SDK.DebuggerModel.Events.ParsedScriptSource,
86
- event => {
87
- void this.parsedScriptSource(event);
88
- },
89
- this),
85
+ SDK.DebuggerModel.Events.ParsedScriptSource, event => this.addScript(event.data), this),
90
86
  this.debuggerModel.addEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, this.globalObjectCleared, this),
91
87
  runtimeModel.addEventListener(
92
88
  SDK.RuntimeModel.Events.ExecutionContextDestroyed, this.executionContextDestroyed, this),
89
+ runtimeModel.target().targetManager().addEventListener(
90
+ SDK.TargetManager.Events.InspectedURLChanged, this.inspectedURLChanged, this),
93
91
  ];
94
92
  }
95
93
 
94
+ static resolveRelativeSourceURL(script: SDK.Script.Script, url: Platform.DevToolsPath.UrlString):
95
+ Platform.DevToolsPath.UrlString {
96
+ let target: SDK.Target.Target|null = script.debuggerModel.target();
97
+ while (target && target.type() !== SDK.Target.Type.Frame) {
98
+ target = target.parentTarget();
99
+ }
100
+ const baseURL = target?.inspectedURL() ?? Platform.DevToolsPath.EmptyUrlString;
101
+ url = Common.ParsedURL.ParsedURL.completeURL(baseURL, url) ?? url;
102
+ return url;
103
+ }
104
+
96
105
  private project(script: SDK.Script.Script): ContentProviderBasedProject {
97
106
  const prefix = script.isContentScript() ? 'js:extensions:' : 'js::';
98
107
  const projectId = prefix + this.debuggerModel.target().id() + ':' + script.frameId;
@@ -113,8 +122,7 @@ export class ResourceScriptMapping implements DebuggerSourceMapping {
113
122
  if (!script) {
114
123
  return null;
115
124
  }
116
- const project = this.project(script);
117
- const uiSourceCode = project.uiSourceCodeForURL(script.sourceURL);
125
+ const uiSourceCode = this.#scriptToUISourceCode.get(script);
118
126
  if (!uiSourceCode) {
119
127
  return null;
120
128
  }
@@ -147,41 +155,63 @@ export class ResourceScriptMapping implements DebuggerSourceMapping {
147
155
  return [this.debuggerModel.createRawLocation(script, lineNumber, columnNumber)];
148
156
  }
149
157
 
150
- private acceptsScript(script: SDK.Script.Script): boolean {
151
- if (!script.sourceURL || script.isLiveEdit() || (script.isInlineScript() && !script.hasSourceURL)) {
152
- return false;
153
- }
154
- // Filter out embedder injected content scripts.
155
- if (script.isContentScript() && !script.hasSourceURL) {
156
- const parsedURL = new Common.ParsedURL.ParsedURL(script.sourceURL);
157
- if (!parsedURL.isValid) {
158
- return false;
158
+ private inspectedURLChanged(event: Common.EventTarget.EventTargetEvent<SDK.Target.Target>): void {
159
+ for (let target: SDK.Target.Target|null = this.debuggerModel.target(); target !== event.data;
160
+ target = target.parentTarget()) {
161
+ if (target === null) {
162
+ return;
159
163
  }
160
164
  }
161
- return true;
165
+
166
+ // Just remove and readd all scripts to ensure their URLs are reflected correctly.
167
+ for (const script of Array.from(this.#scriptToUISourceCode.keys())) {
168
+ this.removeScript(script);
169
+ this.addScript(script);
170
+ }
162
171
  }
163
172
 
164
- private async parsedScriptSource(event: Common.EventTarget.EventTargetEvent<SDK.Script.Script>): Promise<void> {
165
- const script = event.data;
166
- if (!this.acceptsScript(script)) {
173
+ private addScript(script: SDK.Script.Script): void {
174
+ // Ignore live edit scripts here.
175
+ if (script.isLiveEdit()) {
167
176
  return;
168
177
  }
169
- this.#acceptedScripts.add(script);
170
- const originalContentProvider = script.originalContentProvider();
171
178
 
172
- const url = script.sourceURL;
173
- const project = this.project(script);
179
+ let url = script.sourceURL;
180
+ if (!url) {
181
+ return;
182
+ }
183
+
184
+ if (script.hasSourceURL) {
185
+ // Try to resolve `//# sourceURL=` annotations relative to
186
+ // the base URL, according to the sourcemap specification.
187
+ url = ResourceScriptMapping.resolveRelativeSourceURL(script, url);
188
+ } else {
189
+ // Ignore inline <script>s without `//# sourceURL` annotation here.
190
+ if (script.isInlineScript()) {
191
+ return;
192
+ }
193
+
194
+ // Filter out embedder injected content scripts.
195
+ if (script.isContentScript()) {
196
+ const parsedURL = new Common.ParsedURL.ParsedURL(url);
197
+ if (!parsedURL.isValid) {
198
+ return;
199
+ }
200
+ }
201
+ }
174
202
 
175
203
  // Remove previous UISourceCode, if any
204
+ const project = this.project(script);
176
205
  const oldUISourceCode = project.uiSourceCodeForURL(url);
177
206
  if (oldUISourceCode) {
178
- const scriptFile = this.#uiSourceCodeToScriptFile.get(oldUISourceCode);
179
- if (scriptFile && scriptFile.script) {
180
- await this.removeScript(scriptFile.script);
207
+ const oldScriptFile = this.#uiSourceCodeToScriptFile.get(oldUISourceCode);
208
+ if (oldScriptFile && oldScriptFile.script) {
209
+ this.removeScript(oldScriptFile.script);
181
210
  }
182
211
  }
183
212
 
184
213
  // Create UISourceCode.
214
+ const originalContentProvider = script.originalContentProvider();
185
215
  const uiSourceCode = project.createUISourceCode(url, originalContentProvider.contentType());
186
216
  NetworkProject.setInitialFrameAttribution(uiSourceCode, script.frameId);
187
217
  const metadata = metadataForURL(this.debuggerModel.target(), script.frameId, url);
@@ -189,61 +219,54 @@ export class ResourceScriptMapping implements DebuggerSourceMapping {
189
219
  // Bind UISourceCode to scripts.
190
220
  const scriptFile = new ResourceScriptFile(this, uiSourceCode, [script]);
191
221
  this.#uiSourceCodeToScriptFile.set(uiSourceCode, scriptFile);
222
+ this.#scriptToUISourceCode.set(script, uiSourceCode);
192
223
 
193
224
  const mimeType = script.isWasm() ? 'application/wasm' : 'text/javascript';
194
225
  project.addUISourceCodeWithProvider(uiSourceCode, originalContentProvider, metadata, mimeType);
195
- await this.debuggerWorkspaceBinding.updateLocations(script);
226
+ void this.debuggerWorkspaceBinding.updateLocations(script);
196
227
  }
197
228
 
198
229
  scriptFile(uiSourceCode: Workspace.UISourceCode.UISourceCode): ResourceScriptFile|null {
199
230
  return this.#uiSourceCodeToScriptFile.get(uiSourceCode) || null;
200
231
  }
201
232
 
202
- private async removeScript(script: SDK.Script.Script): Promise<void> {
203
- if (!this.#acceptedScripts.has(script)) {
233
+ private removeScript(script: SDK.Script.Script): void {
234
+ const uiSourceCode = this.#scriptToUISourceCode.get(script);
235
+ if (!uiSourceCode) {
204
236
  return;
205
237
  }
206
- this.#acceptedScripts.delete(script);
207
- const project = this.project(script);
208
- const uiSourceCode = (project.uiSourceCodeForURL(script.sourceURL) as Workspace.UISourceCode.UISourceCode);
209
238
  const scriptFile = this.#uiSourceCodeToScriptFile.get(uiSourceCode);
210
239
  if (scriptFile) {
211
240
  scriptFile.dispose();
212
241
  }
213
242
  this.#uiSourceCodeToScriptFile.delete(uiSourceCode);
214
- project.removeFile(script.sourceURL);
215
- await this.debuggerWorkspaceBinding.updateLocations(script);
243
+ this.#scriptToUISourceCode.delete(script);
244
+ const project = uiSourceCode.project() as ContentProviderBasedProject;
245
+ project.removeFile(uiSourceCode.url());
246
+ void this.debuggerWorkspaceBinding.updateLocations(script);
216
247
  }
217
248
 
218
249
  private executionContextDestroyed(event: Common.EventTarget.EventTargetEvent<SDK.RuntimeModel.ExecutionContext>):
219
250
  void {
220
251
  const executionContext = event.data;
221
- const scripts = this.debuggerModel.scriptsForExecutionContext(executionContext);
222
- for (const script of scripts) {
223
- void this.removeScript(script);
252
+ for (const script of this.debuggerModel.scriptsForExecutionContext(executionContext)) {
253
+ this.removeScript(script);
224
254
  }
225
255
  }
226
256
 
227
257
  private globalObjectCleared(): void {
228
- const scripts = Array.from(this.#acceptedScripts);
229
- for (const script of scripts) {
230
- void this.removeScript(script);
258
+ for (const script of this.#scriptToUISourceCode.keys()) {
259
+ this.removeScript(script);
231
260
  }
232
261
  }
233
262
 
234
263
  resetForTest(): void {
235
- const scripts = Array.from(this.#acceptedScripts);
236
- for (const script of scripts) {
237
- void this.removeScript(script);
238
- }
264
+ this.globalObjectCleared();
239
265
  }
240
266
 
241
267
  dispose(): void {
242
268
  Common.EventTarget.removeEventListeners(this.#eventListeners);
243
- const scripts = Array.from(this.#acceptedScripts);
244
- for (const script of scripts) {
245
- void this.removeScript(script);
246
- }
269
+ this.globalObjectCleared();
247
270
  for (const project of this.#projects.values()) {
248
271
  project.removeProject();
249
272
  }
@@ -11,6 +11,10 @@
11
11
  padding: 2px 0; /* adjust focus ring size */
12
12
  }
13
13
 
14
+ .devtools-link:focus-visible {
15
+ outline-width: unset;
16
+ }
17
+
14
18
  input.devtools-text-input[type="text"] {
15
19
  padding: 3px 6px;
16
20
  margin-left: 4px;
@@ -56,6 +56,7 @@ import {ElementsTreeElementHighlighter} from './ElementsTreeElementHighlighter.j
56
56
  import {ElementsTreeOutline} from './ElementsTreeOutline.js';
57
57
  import type {MarkerDecorator} from './MarkerDecorator.js';
58
58
  import {MetricsSidebarPane} from './MetricsSidebarPane.js';
59
+ import {LayoutSidebarPane} from './LayoutSidebarPane.js';
59
60
  import {Events as StylesSidebarPaneEvents, StylesSidebarPane} from './StylesSidebarPane.js';
60
61
  import type {StylesUpdateCompletedEvent} from './StylesSidebarPane.js';
61
62
 
@@ -1143,6 +1144,8 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
1143
1144
  if (treeElement) {
1144
1145
  void treeElement.updateStyleAdorners();
1145
1146
  }
1147
+
1148
+ LayoutSidebarPane.instance().update();
1146
1149
  }
1147
1150
  }
1148
1151
 
@@ -61,8 +61,6 @@ const gridNodesToElements = (nodes: SDK.DOMModel.DOMNode[]): ElementsComponents.
61
61
  });
62
62
  };
63
63
 
64
- let layoutSidebarPaneInstance: LayoutSidebarPane;
65
-
66
64
  const flexContainerNodesToElements = (nodes: SDK.DOMModel.DOMNode[]): ElementsComponents.LayoutPane.LayoutElement[] => {
67
65
  return nodes.map(node => {
68
66
  const layoutElement = nodeToLayoutElement(node);
@@ -86,6 +84,7 @@ const flexContainerNodesToElements = (nodes: SDK.DOMModel.DOMNode[]): ElementsCo
86
84
  });
87
85
  };
88
86
 
87
+ let layoutSidebarPaneInstance: LayoutSidebarPane;
89
88
  export class LayoutSidebarPane extends UI.ThrottledWidget.ThrottledWidget {
90
89
  private layoutPane: ElementsComponents.LayoutPane.LayoutPane;
91
90
  private readonly settings: string[];
@@ -83,15 +83,18 @@ const UIStrings = {
83
83
  */
84
84
  showAllD: 'Show all {PH1}',
85
85
  /**
86
- *@description Value element text content in Object Properties Section. Shown when the developer is
87
- *viewing a JavaScript object, but one of the properties is not readable and therefore can't be
88
- *displayed. This string should be translated.
86
+ * @description Value element text content in Object Properties Section. Shown when the developer is
87
+ * viewing a variable in the Scope view, whose value is not available (i.e. because it was optimized
88
+ * out) by the JavaScript engine, or inspecting a JavaScript object accessor property, which has no
89
+ * getter. This string should be translated.
89
90
  */
90
- unreadable: '<unreadable>',
91
+ valueUnavailable: '<value unavailable>',
91
92
  /**
92
- *@description Value element title in Object Properties Section
93
- */
94
- noPropertyGetter: 'No property getter',
93
+ * @description Tooltip for value elements in the Scope view that refer to variables whose values
94
+ * aren't accessible to the debugger (potentially due to being optimized out by the JavaScript
95
+ * engine), or for JavaScript object accessor properties which have no getter.
96
+ */
97
+ valueNotAccessibleToTheDebugger: 'Value is not accessible to the debugger',
95
98
  /**
96
99
  *@description A context menu item in the Watch Expressions Sidebar Pane of the Sources panel and Network pane request.
97
100
  */
@@ -1105,9 +1108,9 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1105
1108
  }, false);
1106
1109
  } else {
1107
1110
  this.valueElement = document.createElement('span');
1108
- this.valueElement.classList.add('object-value-undefined');
1109
- this.valueElement.textContent = i18nString(UIStrings.unreadable);
1110
- UI.Tooltip.Tooltip.install(this.valueElement, i18nString(UIStrings.noPropertyGetter));
1111
+ this.valueElement.classList.add('object-value-unavailable');
1112
+ this.valueElement.textContent = i18nString(UIStrings.valueUnavailable);
1113
+ UI.Tooltip.Tooltip.install(this.valueElement, i18nString(UIStrings.valueNotAccessibleToTheDebugger));
1111
1114
  }
1112
1115
 
1113
1116
  const valueText = this.valueElement.textContent;
@@ -65,6 +65,10 @@
65
65
  color: var(--color-text-disabled);
66
66
  }
67
67
 
68
+ .object-value-unavailable {
69
+ color: var(--color-syntax-2);
70
+ }
71
+
68
72
  .object-value-calculate-value-button:hover {
69
73
  text-decoration: underline;
70
74
  }
package/package.json CHANGED
@@ -55,5 +55,5 @@
55
55
  "unittest": "scripts/test/run_unittests.py --no-text-coverage",
56
56
  "watch": "vpython third_party/node/node.py --output scripts/watch_build.js"
57
57
  },
58
- "version": "1.0.1020771"
58
+ "version": "1.0.1021097"
59
59
  }