chrome-devtools-frontend 1.0.1559913 → 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 (130) hide show
  1. package/front_end/core/host/InspectorFrontendHostStub.ts +0 -3
  2. package/front_end/core/platform/ArrayUtilities.ts +13 -0
  3. package/front_end/core/root/Runtime.ts +0 -5
  4. package/front_end/core/sdk/DOMModel.ts +8 -0
  5. package/front_end/core/sdk/NetworkManager.ts +4 -0
  6. package/front_end/core/sdk/NetworkRequest.ts +9 -0
  7. package/front_end/core/sdk/OverlayModel.ts +20 -9
  8. package/front_end/entrypoints/main/MainImpl.ts +2 -1
  9. package/front_end/generated/InspectorBackendCommands.ts +4 -2
  10. package/front_end/generated/protocol-mapping.d.ts +7 -0
  11. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  12. package/front_end/generated/protocol.ts +24 -0
  13. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +23 -22
  14. package/front_end/models/badges/UserBadges.ts +48 -16
  15. package/front_end/models/greendev/Prototypes.ts +6 -1
  16. package/front_end/models/trace/extras/TraceTree.ts +1 -1
  17. package/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +8 -3
  18. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +11 -142
  19. package/front_end/panels/ai_assistance/PatchWidget.ts +90 -72
  20. package/front_end/panels/ai_assistance/ai_assistance.ts +1 -0
  21. package/front_end/panels/ai_assistance/components/ChatInput.ts +701 -0
  22. package/front_end/panels/ai_assistance/components/ChatView.ts +71 -1268
  23. package/front_end/panels/ai_assistance/components/UserActionRow.ts +514 -31
  24. package/front_end/panels/ai_assistance/components/chatInput.css +387 -0
  25. package/front_end/panels/ai_assistance/components/chatView.css +38 -599
  26. package/front_end/panels/ai_assistance/components/userActionRow.css +230 -0
  27. package/front_end/panels/autofill/AutofillView.ts +2 -2
  28. package/front_end/panels/changes/ChangesView.ts +15 -1
  29. package/front_end/panels/changes/changesView.css +6 -0
  30. package/front_end/panels/common/BadgeNotification.ts +44 -58
  31. package/front_end/panels/common/CopyChangesToPrompt.ts +233 -0
  32. package/front_end/panels/common/common.ts +1 -0
  33. package/front_end/panels/elements/ElementsTreeElement.ts +183 -359
  34. package/front_end/panels/elements/ElementsTreeOutline.ts +0 -6
  35. package/front_end/panels/elements/ShortcutTreeElement.ts +57 -50
  36. package/front_end/panels/elements/StylePropertiesSection.ts +1 -3
  37. package/front_end/panels/elements/components/AdornerManager.ts +5 -149
  38. package/front_end/panels/issues/HiddenIssuesRow.ts +1 -2
  39. package/front_end/panels/issues/IssueKindView.ts +2 -4
  40. package/front_end/panels/issues/IssueView.ts +2 -4
  41. package/front_end/panels/network/NetworkDataGridNode.ts +65 -1
  42. package/front_end/panels/network/NetworkLogView.ts +2 -4
  43. package/front_end/panels/network/NetworkLogViewColumns.ts +9 -0
  44. package/front_end/panels/screencast/ScreencastApp.ts +1 -0
  45. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  46. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +14 -1
  47. package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -4
  48. package/front_end/panels/timeline/TimelineController.ts +185 -3
  49. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +52 -25
  50. package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -0
  51. package/front_end/panels/timeline/TimelinePanel.ts +17 -104
  52. package/front_end/panels/timeline/TimelineTreeView.ts +1 -0
  53. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -2
  54. package/front_end/panels/timeline/components/insights/Table.ts +3 -3
  55. package/front_end/panels/whats_new/ReleaseNoteText.ts +15 -9
  56. package/front_end/panels/whats_new/resources/WNDT.md +6 -6
  57. package/front_end/third_party/chromium/README.chromium +1 -1
  58. package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
  59. package/front_end/third_party/lit/rebuild.sh +1 -1
  60. package/front_end/third_party/puppeteer/README.chromium +2 -2
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +2 -3
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js +9 -0
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js.map +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts +3 -0
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js +9 -0
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js.map +1 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts +3 -0
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js +10 -0
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +8 -4
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +10 -1
  90. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +13 -7
  91. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +2 -3
  92. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  93. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  94. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js +9 -0
  96. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts +3 -0
  98. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js +9 -0
  100. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts +3 -0
  102. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js +10 -0
  104. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +8 -4
  107. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  113. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/types.d.ts +10 -1
  118. package/front_end/third_party/puppeteer/package/package.json +3 -3
  119. package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -3
  120. package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +13 -0
  121. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +10 -0
  122. package/front_end/third_party/puppeteer/package/src/bidi/core/Request.ts +15 -0
  123. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +9 -4
  124. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  125. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  126. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  127. package/front_end/ui/components/adorners/Adorner.ts +8 -68
  128. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  129. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  130. 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
 
@@ -1747,10 +1746,6 @@ export class ElementsTreeOutline extends
1747
1746
  treeElement.setCollapsible(false);
1748
1747
  }
1749
1748
 
1750
- if (node.hasAssignedSlot()) {
1751
- treeElement.createSlotLink(node.assignedSlot);
1752
- }
1753
-
1754
1749
  treeElement.selectable = Boolean(this.selectEnabled);
1755
1750
  return treeElement;
1756
1751
  }
@@ -2023,7 +2018,6 @@ export class ElementsTreeOutline extends
2023
2018
  const {node} = event.data;
2024
2019
  const treeElement = this.treeElementByNode.get(node);
2025
2020
  if (treeElement && isOpeningTag(treeElement.tagTypeContext)) {
2026
- void treeElement.updateStyleAdorners();
2027
2021
  void treeElement.updateAdorners();
2028
2022
  }
2029
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) {
@@ -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);
@@ -646,7 +646,7 @@ const GREENDEV_VIEW: View = (input, _output, target) => {
646
646
  <span>${i18nString(UIStrings.greenDevUnstable)}</span>
647
647
  </div>
648
648
  <div class="settings-experiments-block">
649
- ${renderPrototypeCheckboxes(input.settings, ['aiAnnotations', 'inDevToolsFloaty'])}
649
+ ${renderPrototypeCheckboxes(input.settings, ['aiAnnotations', 'inDevToolsFloaty', 'copyToGemini'])}
650
650
  </div>
651
651
  </devtools-card>
652
652
 
@@ -668,7 +668,8 @@ const GREENDEV_PROTOTYPE_NAMES: Record<keyof GreenDev.GreenDevSettings, string>
668
668
  inDevToolsFloaty: 'In DevTools context picker',
669
669
  aiAnnotations: 'AI auto-annotations',
670
670
  inlineWidgets: 'Inline widgets in AI Assistance',
671
- artifactViewer: 'Widgets in the Artifact viewer'
671
+ artifactViewer: 'Widgets in the Artifact viewer',
672
+ copyToGemini: 'Copy changes to AI Prompt'
672
673
  };
673
674
 
674
675
  function renderWidgetOptions(settings: GreenDev.GreenDevSettings): TemplateResult {
@@ -4,6 +4,7 @@
4
4
  /* eslint-disable @devtools/no-imperative-dom-api */
5
5
 
6
6
  import * as Common from '../../core/common/common.js';
7
+ import * as Host from '../../core/host/host.js';
7
8
  import * as Platform from '../../core/platform/platform.js';
8
9
  import * as Root from '../../core/root/root.js';
9
10
  import * as Trace from '../../models/trace/trace.js';
@@ -409,6 +410,7 @@ export class CompatibilityTracksAppender {
409
410
  if (trackStartLevel === null || trackEndLevel === null) {
410
411
  throw new Error(`Could not find events for track: ${trackAppender}`);
411
412
  }
413
+
412
414
  const entryLevels = this.#flameChartData.entryLevels;
413
415
  const events = [];
414
416
  for (let i = 0; i < entryLevels.length; i++) {
@@ -416,7 +418,13 @@ export class CompatibilityTracksAppender {
416
418
  events.push(this.#entryData[i]);
417
419
  }
418
420
  }
419
- events.sort((a, b) => a.ts - b.ts); // TODO(paulirish): Remove as I'm 90% it's already sorted.
421
+
422
+ // TODO(crbug.com/457866795): callers expect this to be sorted, but #entryData
423
+ // currently isn't guaranteed to be sorted because of appendEventsAtLevel and
424
+ // appendEventAtLevel. Also, see
425
+ // TimelineFlameChartDataProvider#insertEventToEntryData. This method is cached
426
+ // in eventsForTreeView, so it doesn't impact performance much.
427
+ events.sort((a, b) => a.ts - b.ts);
420
428
 
421
429
  this.#eventsForTrack.set(trackAppender, events);
422
430
  return events;
@@ -541,6 +549,11 @@ export class CompatibilityTracksAppender {
541
549
  appendEventsAtLevel<T extends Trace.Types.Events.Event>(
542
550
  events: readonly T[], trackStartLevel: number, appender: TrackAppender,
543
551
  eventAppendedCallback?: (event: T, index: number) => void): number {
552
+ // Usage of getEventLevel below requires `events` to be sorted.
553
+ if (Host.InspectorFrontendHost.isUnderTest()) {
554
+ Platform.ArrayUtilities.assertArrayIsSorted(events, (a, b) => a.ts - b.ts);
555
+ }
556
+
544
557
  const lastTimestampByLevel: LastTimestampByLevel = [];
545
558
  for (let i = 0; i < events.length; ++i) {
546
559
  const event = events[i];
@@ -80,9 +80,6 @@ export class ThirdPartyTreeViewWidget extends TimelineTreeView.TimelineTreeView
80
80
  });
81
81
  }
82
82
 
83
- // const events = this.#thirdPartySummaries.entityByEvent.keys();
84
- const relatedEvents = this.selectedEvents().sort(Trace.Helpers.Trace.eventTimeComparator);
85
-
86
83
  // The filters for this view are slightly different; we want to use the set
87
84
  // of visible event types, but also include network events, which by
88
85
  // default are not in the set of visible entries (as they are not shown on
@@ -90,7 +87,7 @@ export class ThirdPartyTreeViewWidget extends TimelineTreeView.TimelineTreeView
90
87
  const filter = new Trace.Extras.TraceFilter.VisibleEventsFilter(
91
88
  Trace.Styles.visibleTypes().concat([Trace.Types.Events.Name.SYNTHETIC_NETWORK_REQUEST]));
92
89
 
93
- const node = new Trace.Extras.TraceTree.BottomUpRootNode(relatedEvents, {
90
+ const node = new Trace.Extras.TraceTree.BottomUpRootNode(this.selectedEvents(), {
94
91
  textFilter: this.textFilter(),
95
92
  filters: [filter],
96
93
  startTime: this.startTime,