chrome-devtools-frontend 1.0.1558690 → 1.0.1561080

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.
Files changed (167) hide show
  1. package/front_end/Images/src/container.svg +4 -0
  2. package/front_end/core/common/Gzip.ts +15 -0
  3. package/front_end/core/host/InspectorFrontendHostStub.ts +0 -3
  4. package/front_end/core/platform/ArrayUtilities.ts +13 -0
  5. package/front_end/core/root/Runtime.ts +0 -5
  6. package/front_end/core/sdk/CSSMetadata.ts +6 -6
  7. package/front_end/core/sdk/CSSModel.ts +2 -2
  8. package/front_end/core/sdk/DOMModel.ts +15 -3
  9. package/front_end/core/sdk/NetworkManager.ts +4 -0
  10. package/front_end/core/sdk/NetworkRequest.ts +9 -0
  11. package/front_end/core/sdk/OverlayModel.ts +20 -9
  12. package/front_end/entrypoints/main/MainImpl.ts +2 -1
  13. package/front_end/generated/InspectorBackendCommands.ts +6 -3
  14. package/front_end/generated/SupportedCSSProperties.js +64 -32
  15. package/front_end/generated/protocol-mapping.d.ts +16 -0
  16. package/front_end/generated/protocol-proxy-api.d.ts +12 -0
  17. package/front_end/generated/protocol.ts +38 -1
  18. package/front_end/models/ai_assistance/agents/StylingAgent.ts +1 -1
  19. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +11 -7
  20. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +23 -22
  21. package/front_end/models/badges/UserBadges.ts +48 -16
  22. package/front_end/models/greendev/Prototypes.ts +6 -1
  23. package/front_end/models/trace/LanternComputationData.ts +4 -3
  24. package/front_end/models/trace/Processor.ts +6 -5
  25. package/front_end/models/trace/Styles.ts +10 -1
  26. package/front_end/models/trace/extras/TraceTree.ts +1 -1
  27. package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +2 -2
  28. package/front_end/models/trace/handlers/MetaHandler.ts +14 -0
  29. package/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +59 -34
  30. package/front_end/models/trace/helpers/Timing.ts +8 -1
  31. package/front_end/models/trace/insights/Common.ts +1 -1
  32. package/front_end/models/trace/insights/LCPBreakdown.ts +4 -4
  33. package/front_end/models/trace/insights/LCPDiscovery.ts +3 -3
  34. package/front_end/models/trace/insights/RenderBlocking.ts +1 -1
  35. package/front_end/models/trace/insights/types.ts +1 -1
  36. package/front_end/models/trace/types/TraceEvents.ts +62 -10
  37. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +11 -142
  38. package/front_end/panels/ai_assistance/PatchWidget.ts +90 -72
  39. package/front_end/panels/ai_assistance/ai_assistance.ts +1 -0
  40. package/front_end/panels/ai_assistance/components/ChatInput.ts +701 -0
  41. package/front_end/panels/ai_assistance/components/ChatView.ts +71 -1268
  42. package/front_end/panels/ai_assistance/components/UserActionRow.ts +514 -31
  43. package/front_end/panels/ai_assistance/components/chatInput.css +387 -0
  44. package/front_end/panels/ai_assistance/components/chatView.css +38 -599
  45. package/front_end/panels/ai_assistance/components/userActionRow.css +230 -0
  46. package/front_end/panels/autofill/AutofillView.ts +2 -2
  47. package/front_end/panels/changes/ChangesView.ts +15 -1
  48. package/front_end/panels/changes/changesView.css +6 -0
  49. package/front_end/panels/common/AiCodeGenerationTeaser.ts +48 -12
  50. package/front_end/panels/common/BadgeNotification.ts +44 -58
  51. package/front_end/panels/common/CopyChangesToPrompt.ts +233 -0
  52. package/front_end/panels/common/aiCodeGenerationTeaser.css +14 -0
  53. package/front_end/panels/common/common.ts +2 -1
  54. package/front_end/panels/console/consoleView.css +1 -1
  55. package/front_end/panels/elements/CSSRuleValidator.ts +38 -0
  56. package/front_end/panels/elements/ElementsTreeElement.ts +222 -377
  57. package/front_end/panels/elements/ElementsTreeOutline.ts +0 -23
  58. package/front_end/panels/elements/ShortcutTreeElement.ts +57 -50
  59. package/front_end/panels/elements/StylePropertiesSection.ts +1 -3
  60. package/front_end/panels/elements/StylesSidebarPane.ts +15 -4
  61. package/front_end/panels/elements/components/AdornerManager.ts +5 -149
  62. package/front_end/panels/issues/HiddenIssuesRow.ts +1 -2
  63. package/front_end/panels/issues/IssueKindView.ts +2 -4
  64. package/front_end/panels/issues/IssueView.ts +2 -4
  65. package/front_end/panels/network/NetworkDataGridNode.ts +65 -1
  66. package/front_end/panels/network/NetworkLogView.ts +2 -4
  67. package/front_end/panels/network/NetworkLogViewColumns.ts +9 -0
  68. package/front_end/panels/screencast/ScreencastApp.ts +1 -0
  69. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  70. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +14 -1
  71. package/front_end/panels/timeline/StatusDialog.ts +4 -3
  72. package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -4
  73. package/front_end/panels/timeline/TimelineController.ts +185 -3
  74. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +52 -25
  75. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +3 -16
  76. package/front_end/panels/timeline/TimelineFlameChartView.ts +65 -21
  77. package/front_end/panels/timeline/TimelinePanel.ts +86 -126
  78. package/front_end/panels/timeline/TimelineTreeView.ts +1 -0
  79. package/front_end/panels/timeline/TimelineUIUtils.ts +28 -2
  80. package/front_end/panels/timeline/TimingsTrackAppender.ts +3 -1
  81. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +1 -1
  82. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -2
  83. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +6 -4
  84. package/front_end/panels/timeline/components/insights/Table.ts +3 -3
  85. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +4 -0
  86. package/front_end/panels/timeline/timelinePanel.css +8 -1
  87. package/front_end/panels/timeline/utils/EntryNodes.ts +2 -1
  88. package/front_end/panels/whats_new/ReleaseNoteText.ts +15 -9
  89. package/front_end/panels/whats_new/resources/WNDT.md +6 -6
  90. package/front_end/third_party/chromium/README.chromium +1 -1
  91. package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
  92. package/front_end/third_party/lit/rebuild.sh +1 -1
  93. package/front_end/third_party/puppeteer/README.chromium +2 -2
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +2 -3
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js +9 -0
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts +3 -0
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js +9 -0
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts +3 -0
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js +10 -0
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +8 -4
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  118. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  120. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +10 -1
  123. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +13 -7
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +2 -3
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js +9 -0
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts +3 -0
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js +9 -0
  133. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts +3 -0
  135. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts.map +1 -1
  136. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js +10 -0
  137. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js.map +1 -1
  138. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +8 -4
  140. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
  142. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
  144. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  146. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  147. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/types.d.ts +10 -1
  151. package/front_end/third_party/puppeteer/package/package.json +3 -3
  152. package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -3
  153. package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +13 -0
  154. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +10 -0
  155. package/front_end/third_party/puppeteer/package/src/bidi/core/Request.ts +15 -0
  156. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +9 -4
  157. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  158. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  159. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  160. package/front_end/ui/components/adorners/Adorner.ts +8 -68
  161. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +70 -28
  162. package/front_end/ui/legacy/SearchableView.ts +11 -5
  163. package/front_end/ui/legacy/SplitWidget.ts +1 -1
  164. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  165. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +43 -9
  166. package/front_end/ui/visual_logging/KnownContextValues.ts +16 -0
  167. package/package.json +2 -1
@@ -372,7 +372,6 @@ export class DOMTreeWidget extends UI.Widget.Widget {
372
372
  */
373
373
  updateNodeAdorners(node: SDK.DOMModel.DOMNode): void {
374
374
  const element = this.#viewOutput.elementsTreeOutline?.findTreeElement(node);
375
- void element?.updateStyleAdorners();
376
375
  void element?.updateAdorners();
377
376
  }
378
377
 
@@ -1526,7 +1525,6 @@ export class ElementsTreeOutline extends
1526
1525
  domModel.addEventListener(SDK.DOMModel.Events.DocumentUpdated, this.documentUpdated, this);
1527
1526
  domModel.addEventListener(SDK.DOMModel.Events.ChildNodeCountUpdated, this.childNodeCountUpdated, this);
1528
1527
  domModel.addEventListener(SDK.DOMModel.Events.DistributedNodesChanged, this.distributedNodesChanged, this);
1529
- domModel.addEventListener(SDK.DOMModel.Events.ScrollableFlagUpdated, this.scrollableFlagUpdated, this);
1530
1528
  domModel.addEventListener(
1531
1529
  SDK.DOMModel.Events.AffectedByStartingStylesFlagUpdated, this.affectedByStartingStylesFlagUpdated, this);
1532
1530
  domModel.addEventListener(SDK.DOMModel.Events.AdoptedStyleSheetsModified, this.adoptedStyleSheetsModified, this);
@@ -1542,7 +1540,6 @@ export class ElementsTreeOutline extends
1542
1540
  domModel.removeEventListener(SDK.DOMModel.Events.DocumentUpdated, this.documentUpdated, this);
1543
1541
  domModel.removeEventListener(SDK.DOMModel.Events.ChildNodeCountUpdated, this.childNodeCountUpdated, this);
1544
1542
  domModel.removeEventListener(SDK.DOMModel.Events.DistributedNodesChanged, this.distributedNodesChanged, this);
1545
- domModel.removeEventListener(SDK.DOMModel.Events.ScrollableFlagUpdated, this.scrollableFlagUpdated, this);
1546
1543
  domModel.removeEventListener(
1547
1544
  SDK.DOMModel.Events.AffectedByStartingStylesFlagUpdated, this.affectedByStartingStylesFlagUpdated, this);
1548
1545
  domModel.removeEventListener(SDK.DOMModel.Events.AdoptedStyleSheetsModified, this.adoptedStyleSheetsModified, this);
@@ -1749,10 +1746,6 @@ export class ElementsTreeOutline extends
1749
1746
  treeElement.setCollapsible(false);
1750
1747
  }
1751
1748
 
1752
- if (node.hasAssignedSlot()) {
1753
- treeElement.createSlotLink(node.assignedSlot);
1754
- }
1755
-
1756
1749
  treeElement.selectable = Boolean(this.selectEnabled);
1757
1750
  return treeElement;
1758
1751
  }
@@ -2020,27 +2013,11 @@ export class ElementsTreeOutline extends
2020
2013
  }
2021
2014
  }
2022
2015
 
2023
- private scrollableFlagUpdated(event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode}>): void {
2024
- let {node} = event.data;
2025
- if (node.nodeName() === '#document') {
2026
- // We show the scroll badge of the document on the <html> element.
2027
- if (!node.ownerDocument?.documentElement) {
2028
- return;
2029
- }
2030
- node = node.ownerDocument.documentElement;
2031
- }
2032
- const treeElement = this.treeElementByNode.get(node);
2033
- if (treeElement && isOpeningTag(treeElement.tagTypeContext)) {
2034
- void treeElement.updateScrollAdorner();
2035
- }
2036
- }
2037
-
2038
2016
  private affectedByStartingStylesFlagUpdated(event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode}>):
2039
2017
  void {
2040
2018
  const {node} = event.data;
2041
2019
  const treeElement = this.treeElementByNode.get(node);
2042
2020
  if (treeElement && isOpeningTag(treeElement.tagTypeContext)) {
2043
- void treeElement.updateStyleAdorners();
2044
2021
  void treeElement.updateAdorners();
2045
2022
  }
2046
2023
  }
@@ -1,7 +1,6 @@
1
1
  // Copyright 2021 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 @devtools/no-imperative-dom-api */
5
4
 
6
5
  /*
7
6
  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
@@ -36,15 +35,16 @@
36
35
  import * as Common from '../../core/common/common.js';
37
36
  import * as i18n from '../../core/i18n/i18n.js';
38
37
  import type * as SDK from '../../core/sdk/sdk.js';
39
- import * as Adorners from '../../ui/components/adorners/adorners.js';
40
- import {createIcon} from '../../ui/kit/kit.js';
41
38
  import * as UI from '../../ui/legacy/legacy.js';
39
+ import * as Lit from '../../ui/lit/lit.js';
40
+ import * as VisualElements from '../../ui/visual_logging/visual_logging.js';
42
41
 
43
42
  import * as ElementsComponents from './components/components.js';
44
- import {ElementsPanel} from './ElementsPanel.js';
45
- import {ElementsTreeElement} from './ElementsTreeElement.js';
43
+ import {adornerRef, ElementsTreeElement} from './ElementsTreeElement.js';
46
44
  import {ElementsTreeOutline} from './ElementsTreeOutline.js';
47
45
 
46
+ const {html, render} = Lit;
47
+
48
48
  const UIStrings = {
49
49
  /**
50
50
  * @description Link text content in Elements Tree Outline of the Elements panel
@@ -54,56 +54,43 @@ const UIStrings = {
54
54
  const str_ = i18n.i18n.registerUIStrings('panels/elements/ShortcutTreeElement.ts', UIStrings);
55
55
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
56
56
 
57
+ interface ViewInput {
58
+ title: string;
59
+ onRevealAdornerClick: (e: Event) => void;
60
+ }
61
+
62
+ export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLElement): void => {
63
+ // clang-format off
64
+ render(html`
65
+ <div class="selection fill"></div>
66
+ <span class="elements-tree-shortcut-title">\u21AA ${input.title}</span>
67
+ <devtools-adorner
68
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}
69
+ class="adorner-reveal"
70
+ jslog=${VisualElements.adorner('reveal')}
71
+ aria-label=${i18nString(UIStrings.reveal)}
72
+ @click=${input.onRevealAdornerClick}
73
+ @mousedown=${(e: Event) => e.consume()}
74
+ ${adornerRef()}>
75
+ <span class="adorner-with-icon">
76
+ <devtools-icon name="select-element"></devtools-icon>
77
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}</span>
78
+ </span>
79
+ </devtools-adorner>
80
+ `, target);
81
+ // clang-format on
82
+ };
83
+
57
84
  export class ShortcutTreeElement extends UI.TreeOutline.TreeElement {
58
85
  private readonly nodeShortcut: SDK.DOMModel.DOMNodeShortcut;
59
86
  #hovered?: boolean;
60
- constructor(nodeShortcut: SDK.DOMModel.DOMNodeShortcut) {
87
+ #view: typeof DEFAULT_VIEW;
88
+
89
+ constructor(nodeShortcut: SDK.DOMModel.DOMNodeShortcut, view = DEFAULT_VIEW) {
61
90
  super('');
62
- this.listItemElement.createChild('div', 'selection fill');
63
- const title = this.listItemElement.createChild('span', 'elements-tree-shortcut-title');
64
- let text = nodeShortcut.nodeName.toLowerCase();
65
- if (nodeShortcut.nodeType === Node.ELEMENT_NODE) {
66
- text = '<' + text + '>';
67
- }
68
- title.textContent = '\u21AA ' + text;
69
91
  this.nodeShortcut = nodeShortcut;
70
- this.addRevealAdorner();
71
- }
72
-
73
- addRevealAdorner(): void {
74
- const adorner = new Adorners.Adorner.Adorner();
75
- adorner.classList.add('adorner-reveal');
76
- const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
77
- ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL);
78
- const name = config.name;
79
- const adornerContent = document.createElement('span');
80
- const linkIcon = createIcon('select-element');
81
- const slotText = document.createElement('span');
82
- slotText.textContent = name;
83
- adornerContent.append(linkIcon);
84
- adornerContent.append(slotText);
85
- adornerContent.classList.add('adorner-with-icon');
86
- adorner.data = {
87
- name,
88
- content: adornerContent,
89
- jslogContext: 'reveal',
90
- };
91
- this.listItemElement.appendChild(adorner);
92
- const onClick = ((() => {
93
- this.nodeShortcut.deferredNode.resolve(
94
- node => {
95
- void Common.Revealer.reveal(node);
96
- },
97
- );
98
- }) as EventListener);
99
- adorner.addInteraction(onClick, {
100
- isToggle: false,
101
- shouldPropagateOnKeydown: false,
102
- ariaLabelDefault: i18nString(UIStrings.reveal),
103
- ariaLabelActive: i18nString(UIStrings.reveal),
104
- });
105
- adorner.addEventListener('mousedown', e => e.consume(), false);
106
- ElementsPanel.instance().registerAdorner(adorner);
92
+ this.#view = view;
93
+ this.performUpdate();
107
94
  }
108
95
 
109
96
  get hovered(): boolean {
@@ -154,4 +141,24 @@ export class ShortcutTreeElement extends UI.TreeOutline.TreeElement {
154
141
  }
155
142
  return true;
156
143
  }
144
+
145
+ private onRevealAdornerClick(event: Event): void {
146
+ event.stopPropagation();
147
+ this.nodeShortcut.deferredNode.resolve(node => {
148
+ void Common.Revealer.reveal(node);
149
+ });
150
+ }
151
+
152
+ private performUpdate(): void {
153
+ let text = this.nodeShortcut.nodeName.toLowerCase();
154
+ if (this.nodeShortcut.nodeType === Node.ELEMENT_NODE) {
155
+ text = '<' + text + '>';
156
+ }
157
+ this.#view(
158
+ {
159
+ title: text,
160
+ onRevealAdornerClick: this.onRevealAdornerClick.bind(this),
161
+ },
162
+ undefined, this.listItemElement);
163
+ }
157
164
  }
@@ -810,9 +810,7 @@ export class StylePropertiesSection {
810
810
  ancestorRuleElement = this.createNestingElement(rule.nestingSelectors?.[nestingIndex++]);
811
811
  break;
812
812
  case Protocol.CSS.CSSRuleType.StartingStyleRule:
813
- if (Root.Runtime.hostConfig.devToolsStartingStyleDebugging?.enabled) {
814
- ancestorRuleElement = this.createStartingStyleElement();
815
- }
813
+ ancestorRuleElement = this.createStartingStyleElement();
816
814
  break;
817
815
  }
818
816
  if (ancestorRuleElement) {
@@ -482,6 +482,10 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
482
482
 
483
483
  private onFilterChanged(event: Common.EventTarget.EventTargetEvent<string>): void {
484
484
  const regex = event.data ? new RegExp(Platform.StringUtilities.escapeForRegExp(event.data), 'i') : null;
485
+ this.setFilter(regex);
486
+ }
487
+
488
+ setFilter(regex: RegExp|null): void {
485
489
  this.lastFilterChange = Date.now();
486
490
  this.#filterRegex = regex;
487
491
  this.updateFilter();
@@ -1036,6 +1040,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1036
1040
  let sectionIdx = 0;
1037
1041
  let lastParentNode: SDK.DOMModel.DOMNode|null = null;
1038
1042
 
1043
+ let lastLayerParent: SectionBlock|undefined;
1039
1044
  let lastLayers: SDK.CSSLayer.CSSLayer[]|null = null;
1040
1045
  let sawLayers = false;
1041
1046
 
@@ -1046,6 +1051,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1046
1051
  if ((layers.length || lastLayers) && lastLayers !== layers) {
1047
1052
  const block = SectionBlock.createLayerBlock(parentRule);
1048
1053
  blocks.push(block);
1054
+ lastLayerParent?.childBlocks.push(block);
1049
1055
  sawLayers = true;
1050
1056
  lastLayers = layers;
1051
1057
  }
@@ -1055,12 +1061,12 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1055
1061
  // We disable the layer widget initially. If we see a layer in
1056
1062
  // the matched styles we reenable the button.
1057
1063
  LayersWidget.ButtonProvider.instance().item().setVisible(false);
1058
-
1059
1064
  for (const style of matchedStyles.nodeStyles()) {
1060
1065
  const parentNode = matchedStyles.isInherited(style) ? matchedStyles.nodeForStyle(style) : null;
1061
1066
  if (parentNode && parentNode !== lastParentNode) {
1062
1067
  lastParentNode = parentNode;
1063
1068
  const block = await SectionBlock.createInheritedNodeBlock(lastParentNode);
1069
+ lastLayerParent = block;
1064
1070
  blocks.push(block);
1065
1071
  }
1066
1072
 
@@ -1078,6 +1084,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1078
1084
  });
1079
1085
  }
1080
1086
  }
1087
+ lastLayerParent = undefined;
1081
1088
 
1082
1089
  const customHighlightPseudoRulesets: Array<{
1083
1090
  highlightName: string | null,
@@ -1130,9 +1137,11 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1130
1137
  if (parentNode) {
1131
1138
  const block =
1132
1139
  await SectionBlock.createInheritedPseudoTypeBlock(pseudo.pseudoType, pseudo.highlightName, parentNode);
1140
+ lastLayerParent = block;
1133
1141
  blocks.push(block);
1134
1142
  } else {
1135
1143
  const block = SectionBlock.createPseudoTypeBlock(pseudo.pseudoType, pseudo.highlightName);
1144
+ lastLayerParent = block;
1136
1145
  blocks.push(block);
1137
1146
  }
1138
1147
  }
@@ -1503,6 +1512,7 @@ const MAX_LINK_LENGTH = 23;
1503
1512
  export class SectionBlock {
1504
1513
  readonly #titleElement: Element|null;
1505
1514
  sections: StylePropertiesSection[];
1515
+ childBlocks: SectionBlock[] = [];
1506
1516
  #expanded = false;
1507
1517
  #icon: Icon|undefined;
1508
1518
  constructor(titleElement: Element|null, expandable?: boolean, expandedByDefault?: boolean) {
@@ -1634,14 +1644,15 @@ export class SectionBlock {
1634
1644
  }
1635
1645
 
1636
1646
  updateFilter(): number {
1637
- let hasAnyVisibleSection = false;
1638
1647
  let numVisibleSections = 0;
1648
+ for (const childBlock of this.childBlocks) {
1649
+ numVisibleSections += childBlock.updateFilter();
1650
+ }
1639
1651
  for (const section of this.sections) {
1640
1652
  numVisibleSections += section.updateFilter() ? 1 : 0;
1641
- hasAnyVisibleSection = section.updateFilter() || hasAnyVisibleSection;
1642
1653
  }
1643
1654
  if (this.#titleElement) {
1644
- this.#titleElement.classList.toggle('hidden', !hasAnyVisibleSection);
1655
+ this.#titleElement.classList.toggle('hidden', numVisibleSections === 0);
1645
1656
  }
1646
1657
  return numVisibleSections;
1647
1658
  }
@@ -2,24 +2,12 @@
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
4
 
5
- export const enum AdornerCategories {
6
- SECURITY = 'Security',
7
- LAYOUT = 'Layout',
8
- DEFAULT = 'Default',
9
- }
10
-
11
- export interface AdornerSetting {
5
+ interface AdornerSetting {
12
6
  adorner: string;
13
7
  isEnabled: boolean;
14
8
  }
15
9
 
16
- export type AdornerSettingsMap = Map<string, boolean>;
17
-
18
- export interface RegisteredAdorner {
19
- readonly name: string;
20
- readonly category: AdornerCategories;
21
- readonly enabledByDefault: boolean;
22
- }
10
+ type AdornerSettingsMap = Map<string, boolean>;
23
11
 
24
12
  export enum RegisteredAdorners {
25
13
  AD = 'ad',
@@ -39,125 +27,6 @@ export enum RegisteredAdorners {
39
27
  TOP_LAYER = 'top-layer',
40
28
  }
41
29
 
42
- /**
43
- * This enum-like const object serves as the authoritative registry for all the
44
- * adorners available.
45
- **/
46
- export function getRegisteredAdorner(which: RegisteredAdorners): RegisteredAdorner {
47
- switch (which) {
48
- case RegisteredAdorners.GRID:
49
- return {
50
- name: 'grid',
51
- category: AdornerCategories.LAYOUT,
52
- enabledByDefault: true,
53
- };
54
- case RegisteredAdorners.SUBGRID:
55
- return {
56
- name: 'subgrid',
57
- category: AdornerCategories.LAYOUT,
58
- enabledByDefault: true,
59
- };
60
- case RegisteredAdorners.GRID_LANES:
61
- return {
62
- name: 'grid-lanes',
63
- category: AdornerCategories.LAYOUT,
64
- enabledByDefault: true,
65
- };
66
- case RegisteredAdorners.FLEX:
67
- return {
68
- name: 'flex',
69
- category: AdornerCategories.LAYOUT,
70
- enabledByDefault: true,
71
- };
72
- case RegisteredAdorners.AD:
73
- return {
74
- name: 'ad',
75
- category: AdornerCategories.SECURITY,
76
- enabledByDefault: true,
77
- };
78
- case RegisteredAdorners.SCROLL_SNAP:
79
- return {
80
- name: 'scroll-snap',
81
- category: AdornerCategories.LAYOUT,
82
- enabledByDefault: true,
83
- };
84
- case RegisteredAdorners.STARTING_STYLE:
85
- return {
86
- name: 'starting-style',
87
- category: AdornerCategories.LAYOUT,
88
- enabledByDefault: true,
89
- };
90
- case RegisteredAdorners.CONTAINER:
91
- return {
92
- name: 'container',
93
- category: AdornerCategories.LAYOUT,
94
- enabledByDefault: true,
95
- };
96
- case RegisteredAdorners.SLOT:
97
- return {
98
- name: 'slot',
99
- category: AdornerCategories.LAYOUT,
100
- enabledByDefault: true,
101
- };
102
- case RegisteredAdorners.TOP_LAYER:
103
- return {
104
- name: 'top-layer',
105
- category: AdornerCategories.LAYOUT,
106
- enabledByDefault: true,
107
- };
108
- case RegisteredAdorners.REVEAL:
109
- return {
110
- name: 'reveal',
111
- category: AdornerCategories.DEFAULT,
112
- enabledByDefault: true,
113
- };
114
- case RegisteredAdorners.MEDIA:
115
- return {
116
- name: 'media',
117
- category: AdornerCategories.DEFAULT,
118
- enabledByDefault: false,
119
- };
120
- case RegisteredAdorners.SCROLL:
121
- return {
122
- name: 'scroll',
123
- category: AdornerCategories.LAYOUT,
124
- enabledByDefault: true,
125
- };
126
- case RegisteredAdorners.POPOVER: {
127
- return {
128
- name: 'popover',
129
- category: AdornerCategories.LAYOUT,
130
- enabledByDefault: true,
131
- };
132
- }
133
- case RegisteredAdorners.VIEW_SOURCE: {
134
- return {
135
- name: 'view-source',
136
- category: AdornerCategories.DEFAULT,
137
- enabledByDefault: true,
138
- };
139
- }
140
- }
141
- }
142
-
143
- let adornerNameToCategoryMap: Map<string, AdornerCategories>|undefined = undefined;
144
-
145
- function getCategoryFromAdornerName(name: string): AdornerCategories {
146
- if (!adornerNameToCategoryMap) {
147
- adornerNameToCategoryMap = new Map();
148
- for (const {name, category} of Object.values(RegisteredAdorners).map(getRegisteredAdorner)) {
149
- adornerNameToCategoryMap.set(name, category);
150
- }
151
- }
152
- return adornerNameToCategoryMap.get(name) || AdornerCategories.DEFAULT;
153
- }
154
-
155
- export const DefaultAdornerSettings: AdornerSetting[] =
156
- Object.values(RegisteredAdorners).map(getRegisteredAdorner).map(({name, enabledByDefault}) => ({
157
- adorner: name,
158
- isEnabled: enabledByDefault,
159
- }));
160
-
161
30
  interface SettingStore<Setting> {
162
31
  get(): Setting;
163
32
  set(setting: Setting): void;
@@ -205,9 +74,11 @@ export class AdornerManager {
205
74
 
206
75
  // Prune outdated adorners and add new ones to the persistence.
207
76
  const outdatedAdorners = new Set(this.#adornerSettings.keys());
208
- for (const {adorner, isEnabled} of DefaultAdornerSettings) {
77
+ for (const adorner of Object.values(RegisteredAdorners)) {
209
78
  outdatedAdorners.delete(adorner);
210
79
  if (!this.#adornerSettings.has(adorner)) {
80
+ // Only the MEDIA adorner is disabled by default.
81
+ const isEnabled = adorner !== RegisteredAdorners.MEDIA;
211
82
  this.#adornerSettings.set(adorner, isEnabled);
212
83
  }
213
84
  }
@@ -218,18 +89,3 @@ export class AdornerManager {
218
89
  this.#persistCurrentSettings();
219
90
  }
220
91
  }
221
-
222
- const OrderedAdornerCategories = [
223
- AdornerCategories.SECURITY,
224
- AdornerCategories.LAYOUT,
225
- AdornerCategories.DEFAULT,
226
- ];
227
-
228
- /** Use idx + 1 for the order to avoid JavaScript's 0 == false issue **/
229
- export const AdornerCategoryOrder = new Map(OrderedAdornerCategories.map((category, idx) => [category, idx + 1]));
230
-
231
- export function compareAdornerNamesByCategory(nameA: string, nameB: string): number {
232
- const orderA = AdornerCategoryOrder.get(getCategoryFromAdornerName(nameA)) || Number.POSITIVE_INFINITY;
233
- const orderB = AdornerCategoryOrder.get(getCategoryFromAdornerName(nameB)) || Number.POSITIVE_INFINITY;
234
- return orderA - orderB;
235
- }
@@ -49,8 +49,7 @@ const DEFAULT_VIEW: View = (input: ViewInput, _output: ViewOutput, target: HTMLE
49
49
  // clang-format off
50
50
  render(html`
51
51
  <div class="header">
52
- <devtools-adorner class="aggregated-issues-count"
53
- .data=${{name: 'countWrapper'}}>
52
+ <devtools-adorner class="aggregated-issues-count" .name=${'countWrapper'}>
54
53
  <span>${input.count}</span>
55
54
  </devtools-adorner>
56
55
  <div class="title">${i18nString(UIStrings.hiddenIssues)}</div>
@@ -98,10 +98,8 @@ export class IssueKindView extends UI.TreeOutline.TreeElement {
98
98
  issueKindIcon.classList.add('leading-issue-icon', 'extra-large');
99
99
 
100
100
  const countAdorner = new Adorners.Adorner.Adorner();
101
- countAdorner.data = {
102
- name: 'countWrapper',
103
- content: this.#issueCount,
104
- };
101
+ countAdorner.name = 'countWrapper';
102
+ countAdorner.append(this.#issueCount);
105
103
  countAdorner.classList.add('aggregated-issues-count');
106
104
  this.#issueCount.textContent = '0';
107
105
 
@@ -342,10 +342,8 @@ export class IssueView extends UI.TreeOutline.TreeElement {
342
342
  this.#issueKindIcon.classList.add('leading-issue-icon', 'extra-large');
343
343
  this.#aggregatedIssuesCount = document.createElement('span');
344
344
  const countAdorner = new Adorners.Adorner.Adorner();
345
- countAdorner.data = {
346
- name: 'countWrapper',
347
- content: this.#aggregatedIssuesCount,
348
- };
345
+ countAdorner.name = 'countWrapper';
346
+ countAdorner.append(this.#aggregatedIssuesCount);
349
347
  countAdorner.classList.add('aggregated-issues-count');
350
348
  header.appendChild(this.#issueKindIcon);
351
349
  header.appendChild(countAdorner);
@@ -323,8 +323,26 @@ const UIStrings = {
323
323
  */
324
324
  initialPriorityToolTip: '{PH1}, Initial priority: {PH2}',
325
325
  /**
326
- * @description Tooltip to explain why the request has an IPP icon
326
+ * @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a render blocking resource.
327
327
  */
328
+ blocking: 'Blocking',
329
+ /**
330
+ * @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a resource that blocks the parser from starting to parse the document.
331
+ */
332
+ inBodyParserBlocking: 'In-body parser blocking',
333
+ /**
334
+ * @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a non-blocking resource.
335
+ */
336
+ nonBlocking: 'Non-blocking',
337
+ /**
338
+ * @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a non-blocking resource.
339
+ */
340
+ nonBlockingDynamic: 'Non-blocking dynamic',
341
+ /**
342
+ * @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a potentially blocking resource.
343
+ */
344
+ potentiallyBlocking: 'Potentially blocking',
345
+
328
346
  } as const;
329
347
  const str_ = i18n.i18n.registerUIStrings('panels/network/NetworkDataGridNode.ts', UIStrings);
330
348
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -775,6 +793,25 @@ export class NetworkRequestNode extends NetworkNode {
775
793
  return aRequest.identityCompare(bRequest);
776
794
  }
777
795
 
796
+ static RenderBlockingComparator(a: NetworkNode, b: NetworkNode): number {
797
+ const aRequest = a.requestOrFirstKnownChildRequest();
798
+ const bRequest = b.requestOrFirstKnownChildRequest();
799
+ if (!aRequest || !bRequest) {
800
+ return !aRequest ? -1 : 1;
801
+ }
802
+ const order = [
803
+ Protocol.Network.RenderBlockingBehavior.InBodyParserBlocking,
804
+ Protocol.Network.RenderBlockingBehavior.Blocking,
805
+ Protocol.Network.RenderBlockingBehavior.PotentiallyBlocking,
806
+ Protocol.Network.RenderBlockingBehavior.NonBlocking,
807
+ Protocol.Network.RenderBlockingBehavior.NonBlockingDynamic,
808
+ undefined,
809
+ ];
810
+ const aOrder = order.indexOf(aRequest.renderBlockingBehavior());
811
+ const bOrder = order.indexOf(bRequest.renderBlockingBehavior());
812
+ return aOrder - bOrder;
813
+ }
814
+
778
815
  static RequestPropertyComparator(propertyName: string, a: NetworkNode, b: NetworkNode): number {
779
816
  // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
780
817
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1051,6 +1088,10 @@ export class NetworkRequestNode extends NetworkNode {
1051
1088
  this.setTextAndTitle(cell, this.requestInternal.isAdRelated().toLocaleString());
1052
1089
  break;
1053
1090
  }
1091
+ case 'render-blocking': {
1092
+ this.renderRenderBlockingCell(cell);
1093
+ break;
1094
+ }
1054
1095
  case 'cookies': {
1055
1096
  this.setTextAndTitle(cell, this.arrayLength(this.requestInternal.includedRequestCookies()));
1056
1097
  break;
@@ -1360,6 +1401,29 @@ export class NetworkRequestNode extends NetworkNode {
1360
1401
  }
1361
1402
  }
1362
1403
 
1404
+ private renderRenderBlockingCell(cell: HTMLElement): void {
1405
+ switch (this.requestInternal.renderBlockingBehavior()) {
1406
+ case Protocol.Network.RenderBlockingBehavior.Blocking:
1407
+ UI.UIUtils.createTextChild(cell, i18nString(UIStrings.blocking));
1408
+ break;
1409
+ case Protocol.Network.RenderBlockingBehavior.InBodyParserBlocking:
1410
+ UI.UIUtils.createTextChild(cell, i18nString(UIStrings.inBodyParserBlocking));
1411
+ break;
1412
+ case Protocol.Network.RenderBlockingBehavior.NonBlocking:
1413
+ UI.UIUtils.createTextChild(cell, i18nString(UIStrings.nonBlocking));
1414
+ break;
1415
+ case Protocol.Network.RenderBlockingBehavior.NonBlockingDynamic:
1416
+ UI.UIUtils.createTextChild(cell, i18nString(UIStrings.nonBlockingDynamic));
1417
+ break;
1418
+ case Protocol.Network.RenderBlockingBehavior.PotentiallyBlocking:
1419
+ UI.UIUtils.createTextChild(cell, i18nString(UIStrings.potentiallyBlocking));
1420
+ break;
1421
+ default:
1422
+ UI.UIUtils.createTextChild(cell, '');
1423
+ break;
1424
+ }
1425
+ }
1426
+
1363
1427
  #getLinkifierMetric(): Host.UserMetrics.Action|undefined {
1364
1428
  if (this.requestInternal.resourceType().isStyleSheet()) {
1365
1429
  return Host.UserMetrics.Action.StyleSheetInitiatorLinkClicked;
@@ -2754,11 +2754,9 @@ export class MoreFiltersDropDownUI extends Common.ObjectWrapper.ObjectWrapper<UI
2754
2754
  this.filterElement.setAttribute('jslog', `${VisualLogging.dropDown('more-filters').track({click: true})}`);
2755
2755
 
2756
2756
  this.activeFiltersCountAdorner = new Adorners.Adorner.Adorner();
2757
+ this.activeFiltersCountAdorner.name = 'countWrapper';
2757
2758
  this.activeFiltersCount = document.createElement('span');
2758
- this.activeFiltersCountAdorner.data = {
2759
- name: 'countWrapper',
2760
- content: this.activeFiltersCount,
2761
- };
2759
+ this.activeFiltersCountAdorner.append(this.activeFiltersCount);
2762
2760
  this.activeFiltersCountAdorner.classList.add('active-filters-count');
2763
2761
  this.updateActiveFiltersCount();
2764
2762
 
@@ -152,6 +152,10 @@ const UIStrings = {
152
152
  * @description Text to show whether a request is ad-related
153
153
  */
154
154
  isAdRelated: 'Is Ad-Related',
155
+ /**
156
+ * @description Text in Network Log View Columns of the Network panel
157
+ */
158
+ renderBlocking: 'Render Blocking',
155
159
  } as const;
156
160
  const str_ = i18n.i18n.registerUIStrings('panels/network/NetworkLogViewColumns.ts', UIStrings);
157
161
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -1192,6 +1196,11 @@ const DEFAULT_COLUMNS = [
1192
1196
  title: i18nLazyString(UIStrings.isAdRelated),
1193
1197
  sortingFunction: NetworkRequestNode.IsAdRelatedComparator,
1194
1198
  },
1199
+ {
1200
+ id: 'render-blocking',
1201
+ title: i18nLazyString(UIStrings.renderBlocking),
1202
+ sortingFunction: NetworkRequestNode.RenderBlockingComparator,
1203
+ },
1195
1204
  // This header is a placeholder to let datagrid know that it can be sorted by this column, but never shown.
1196
1205
  {
1197
1206
  id: 'waterfall',
@@ -46,6 +46,7 @@ export class ScreencastApp implements Common.App.App,
46
46
 
47
47
  presentUI(document: Document): void {
48
48
  this.rootView = new UI.RootView.RootView();
49
+ this.rootView.registerRequiredCSS(UI.inspectorCommonStyles);
49
50
 
50
51
  this.rootSplitWidget =
51
52
  new UI.SplitWidget.SplitWidget(false, true, 'inspector-view.screencast-split-view-state', 300, 300);