chrome-devtools-frontend 1.0.1559913 → 1.0.1561528

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
@@ -33,6 +33,8 @@
33
33
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
34
  */
35
35
 
36
+ import '../../ui/components/adorners/adorners.js';
37
+
36
38
  import * as Common from '../../core/common/common.js';
37
39
  import * as Host from '../../core/host/host.js';
38
40
  import * as i18n from '../../core/i18n/i18n.js';
@@ -47,12 +49,12 @@ import * as TextUtils from '../../models/text_utils/text_utils.js';
47
49
  import * as Workspace from '../../models/workspace/workspace.js';
48
50
  import * as CodeMirror from '../../third_party/codemirror.next/codemirror.next.js';
49
51
  import type {DirectiveResult} from '../../third_party/lit/lib/directive.js';
50
- import * as Adorners from '../../ui/components/adorners/adorners.js';
52
+ import type * as Adorners from '../../ui/components/adorners/adorners.js';
51
53
  import * as Buttons from '../../ui/components/buttons/buttons.js';
52
54
  import * as CodeHighlighter from '../../ui/components/code_highlighter/code_highlighter.js';
53
55
  import * as Highlighting from '../../ui/components/highlighting/highlighting.js';
54
56
  import * as TextEditor from '../../ui/components/text_editor/text_editor.js';
55
- import {createIcon, Icon} from '../../ui/kit/kit.js';
57
+ import {Icon} from '../../ui/kit/kit.js';
56
58
  import * as Components from '../../ui/legacy/components/utils/utils.js';
57
59
  import * as UI from '../../ui/legacy/legacy.js';
58
60
  import * as Lit from '../../ui/lit/lit.js';
@@ -69,7 +71,7 @@ import {type ElementsTreeOutline, MappedCharToEntity} from './ElementsTreeOutlin
69
71
  import {ImagePreviewPopover} from './ImagePreviewPopover.js';
70
72
  import {getRegisteredDecorators, type MarkerDecorator, type MarkerDecoratorRegistration} from './MarkerDecorator.js';
71
73
 
72
- const {html, nothing, render, Directives: {ref, repeat}} = Lit;
74
+ const {html, nothing, render, Directives: {ref}} = Lit;
73
75
 
74
76
  const UIStrings = {
75
77
  /**
@@ -394,20 +396,26 @@ export interface ViewInput {
394
396
 
395
397
  showViewSourceAdorner: boolean;
396
398
  showScrollAdorner: boolean;
397
- adorners?: Set<Adorners.Adorner.Adorner>;
399
+ showScrollSnapAdorner: boolean;
398
400
  nodeInfo?: DocumentFragment;
399
401
  topLayerIndex: number;
402
+ scrollSnapAdornerActive: boolean;
400
403
 
401
404
  onGutterClick: (e: Event) => void;
402
- onAdornerAdded: (adorner: Adorners.Adorner.Adorner) => void;
403
- onAdornerRemoved: (adorner: Adorners.Adorner.Adorner) => void;
404
405
  onContainerAdornerClick: (e: Event) => void;
405
406
  onFlexAdornerClick: (e: Event) => void;
406
407
  onGridAdornerClick: (e: Event) => void;
407
408
  onMediaAdornerClick: (e: Event) => void;
408
409
  onPopoverAdornerClick: (e: Event) => void;
410
+ onScrollSnapAdornerClick: (e: Event) => void;
409
411
  onTopLayerAdornerClick: (e: Event) => void;
410
412
  onViewSourceAdornerClick: () => void;
413
+ onSlotAdornerClick: (e: Event) => void;
414
+ showSlotAdorner: boolean;
415
+ slotName?: string;
416
+ showStartingStyleAdorner: boolean;
417
+ startingStyleAdornerActive: boolean;
418
+ onStartingStyleAdornerClick: (e: Event) => void;
411
419
  }
412
420
 
413
421
  export interface ViewOutput {
@@ -416,51 +424,39 @@ export interface ViewOutput {
416
424
  contentElement?: HTMLElement;
417
425
  }
418
426
 
419
- function adornerRef(input: ViewInput): DirectiveResult<typeof Lit.Directives.RefDirective> {
427
+ export function adornerRef(): DirectiveResult<typeof Lit.Directives.RefDirective> {
420
428
  let adorner: Adorners.Adorner.Adorner|undefined;
421
429
  return ref((el?: Element) => {
422
430
  if (adorner) {
423
- input.onAdornerRemoved(adorner);
431
+ ElementsPanel.instance().deregisterAdorner(adorner);
424
432
  }
425
433
  adorner = el as Adorners.Adorner.Adorner;
426
-
427
434
  if (adorner) {
428
435
  if (ElementsPanel.instance().isAdornerEnabled(adorner.name)) {
429
436
  adorner.show();
430
437
  } else {
431
438
  adorner.hide();
432
439
  }
433
- input.onAdornerAdded(adorner);
440
+ ElementsPanel.instance().registerAdorner(adorner);
434
441
  }
435
442
  });
436
443
  }
437
444
 
445
+ function handleAdornerKeydown(cb: (event: Event) => void): (event: KeyboardEvent) => void {
446
+ return (event: KeyboardEvent) => {
447
+ if (event.code === 'Enter' || event.code === 'Space') {
448
+ cb(event);
449
+ event.preventDefault();
450
+ event.stopPropagation();
451
+ }
452
+ };
453
+ }
454
+
438
455
  export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLElement): void => {
439
- const adAdornerConfig =
440
- ElementsComponents.AdornerManager.getRegisteredAdorner(ElementsComponents.AdornerManager.RegisteredAdorners.AD);
441
- const viewSourceAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
442
- ElementsComponents.AdornerManager.RegisteredAdorners.VIEW_SOURCE);
443
- const containerAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
444
- ElementsComponents.AdornerManager.RegisteredAdorners.CONTAINER);
445
- const flexAdornerConfig =
446
- ElementsComponents.AdornerManager.getRegisteredAdorner(ElementsComponents.AdornerManager.RegisteredAdorners.FLEX);
447
- const gridAdornerConfig =
448
- ElementsComponents.AdornerManager.getRegisteredAdorner(ElementsComponents.AdornerManager.RegisteredAdorners.GRID);
449
- const subgridAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
450
- ElementsComponents.AdornerManager.RegisteredAdorners.SUBGRID);
451
- const gridLanesAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
452
- ElementsComponents.AdornerManager.RegisteredAdorners.GRID_LANES);
453
- const mediaAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
454
- ElementsComponents.AdornerManager.RegisteredAdorners.MEDIA);
455
- const popoverAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
456
- ElementsComponents.AdornerManager.RegisteredAdorners.POPOVER);
457
- const topLayerAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
458
- ElementsComponents.AdornerManager.RegisteredAdorners.TOP_LAYER);
459
- const scrollAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
460
- ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL);
461
- const hasAdorners = input.adorners?.size || input.showAdAdorner || input.showContainerAdorner ||
462
- input.showFlexAdorner || input.showGridAdorner || input.showGridLanesAdorner || input.showMediaAdorner ||
463
- input.showPopoverAdorner || input.showTopLayerAdorner || input.showViewSourceAdorner || input.showScrollAdorner;
456
+ const hasAdorners = input.showAdAdorner || input.showContainerAdorner || input.showFlexAdorner ||
457
+ input.showGridAdorner || input.showGridLanesAdorner || input.showMediaAdorner || input.showPopoverAdorner ||
458
+ input.showTopLayerAdorner || input.showViewSourceAdorner || input.showScrollAdorner ||
459
+ input.showScrollSnapAdorner || input.showSlotAdorner || input.showStartingStyleAdorner;
464
460
  // clang-format off
465
461
  render(html`
466
462
  <div ${ref(el => { output.contentElement = el as HTMLElement; })}>
@@ -472,34 +468,31 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
472
468
  ${hasAdorners ? html`<div class="adorner-container ${!hasAdorners ? 'hidden' : ''}">
473
469
  ${input.showAdAdorner ? html`<devtools-adorner
474
470
  aria-label=${i18nString(UIStrings.thisFrameWasIdentifiedAsAnAd)}
475
- .data=${{name: adAdornerConfig.name, jslogContext: adAdornerConfig.name}}
476
- ${adornerRef(input)}>
477
- <span>${adAdornerConfig.name}</span>
471
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.AD}
472
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.AD)}
473
+ ${adornerRef()}>
474
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.AD}</span>
478
475
  </devtools-adorner>` : nothing}
479
476
  ${input.showViewSourceAdorner ? html`<devtools-adorner
480
- .data=${{name: viewSourceAdornerConfig.name, jslogContext: viewSourceAdornerConfig.name}}
477
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.VIEW_SOURCE}
478
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.VIEW_SOURCE)}
481
479
  aria-label=${i18nString(UIStrings.viewSourceCode)}
482
480
  @click=${input.onViewSourceAdornerClick}
483
- ${adornerRef(input)}>
484
- <span>${viewSourceAdornerConfig.name}</span>
481
+ ${adornerRef()}>
482
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.VIEW_SOURCE}</span>
485
483
  </devtools-adorner>` : nothing}
486
484
  ${input.showContainerAdorner ? html`<devtools-adorner
487
485
  class=clickable
488
486
  role=button
489
487
  toggleable=true
490
488
  tabindex=0
491
- .data=${{name: containerAdornerConfig.name, jslogContext: containerAdornerConfig.name}}
492
- jslog=${VisualLogging.adorner(containerAdornerConfig.name).track({click: true})}
489
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.CONTAINER}
490
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.CONTAINER).track({click: true})}
493
491
  active=${input.containerAdornerActive}
494
492
  aria-label=${input.containerAdornerActive ? i18nString(UIStrings.enableContainer) : i18nString(UIStrings.disableContainer)}
495
493
  @click=${input.onContainerAdornerClick}
496
- @keydown=${(event: KeyboardEvent) => {
497
- if (event.code === 'Enter' || event.code === 'Space') {
498
- input.onContainerAdornerClick(event);
499
- event.stopPropagation();
500
- }
501
- }}
502
- ${adornerRef(input)}>
494
+ @keydown=${handleAdornerKeydown(input.onContainerAdornerClick)}
495
+ ${adornerRef()}>
503
496
  <span class="adorner-with-icon">
504
497
  <devtools-icon name="container"></devtools-icon>
505
498
  <span>${input.containerType}</span>
@@ -510,78 +503,55 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
510
503
  role=button
511
504
  toggleable=true
512
505
  tabindex=0
513
- .data=${{name: flexAdornerConfig.name, jslogContext: flexAdornerConfig.name}}
514
- jslog=${VisualLogging.adorner(flexAdornerConfig.name).track({click: true})}
506
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.FLEX}
507
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.FLEX).track({click: true})}
515
508
  active=${input.flexAdornerActive}
516
509
  aria-label=${input.flexAdornerActive ? i18nString(UIStrings.disableFlexMode) : i18nString(UIStrings.enableFlexMode)}
517
510
  @click=${input.onFlexAdornerClick}
518
- @keydown=${(event: KeyboardEvent) => {
519
- if (event.code === 'Enter' || event.code === 'Space') {
520
- input.onFlexAdornerClick(event);
521
- event.stopPropagation();
522
- }
523
- }}
524
- ${adornerRef(input)}>
525
- <span>${flexAdornerConfig.name}</span>
511
+ @keydown=${handleAdornerKeydown(input.onFlexAdornerClick)}
512
+ ${adornerRef()}>
513
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.FLEX}</span>
526
514
  </devtools-adorner>`: nothing}
527
515
  ${input.showGridAdorner ? html`<devtools-adorner
528
516
  class=clickable
529
517
  role=button
530
518
  toggleable=true
531
519
  tabindex=0
532
- .data=${{
533
- name: input.isSubgrid ? subgridAdornerConfig.name : gridAdornerConfig.name,
534
- jslogContext: input.isSubgrid ? subgridAdornerConfig.name : gridAdornerConfig.name,
535
- }}
536
- jslog=${VisualLogging.adorner(input.isSubgrid ? subgridAdornerConfig.name : gridAdornerConfig.name).track({click: true})}
520
+ .name=${input.isSubgrid ? ElementsComponents.AdornerManager.RegisteredAdorners.SUBGRID : ElementsComponents.AdornerManager.RegisteredAdorners.GRID}
521
+ jslog=${VisualLogging.adorner(input.isSubgrid ? ElementsComponents.AdornerManager.RegisteredAdorners.SUBGRID : ElementsComponents.AdornerManager.RegisteredAdorners.GRID).track({click: true})}
537
522
  active=${input.gridAdornerActive}
538
523
  aria-label=${input.gridAdornerActive ? i18nString(UIStrings.disableGridMode) : i18nString(UIStrings.enableGridMode)}
539
524
  @click=${input.onGridAdornerClick}
540
- @keydown=${(event: KeyboardEvent) => {
541
- if (event.code === 'Enter' || event.code === 'Space') {
542
- input.onGridAdornerClick(event);
543
- event.stopPropagation();
544
- }
545
- }}
546
- ${adornerRef(input)}>
547
- <span>${input.isSubgrid ? subgridAdornerConfig.name : gridAdornerConfig.name}</span>
525
+ @keydown=${handleAdornerKeydown(input.onGridAdornerClick)}
526
+ ${adornerRef()}>
527
+ <span>${input.isSubgrid ? ElementsComponents.AdornerManager.RegisteredAdorners.SUBGRID : ElementsComponents.AdornerManager.RegisteredAdorners.GRID}</span>
548
528
  </devtools-adorner>`: nothing}
549
529
  ${input.showGridLanesAdorner ? html`<devtools-adorner
550
530
  class=clickable
551
531
  role=button
552
532
  toggleable=true
553
533
  tabindex=0
554
- .data=${{name: gridLanesAdornerConfig.name, jslogContext: gridLanesAdornerConfig.name}}
555
- jslog=${VisualLogging.adorner(gridLanesAdornerConfig.name).track({click: true})}
534
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.GRID_LANES}
535
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.GRID_LANES).track({click: true})}
556
536
  active=${input.gridAdornerActive}
557
537
  aria-label=${input.gridAdornerActive ? i18nString(UIStrings.disableGridLanesMode) : i18nString(UIStrings.enableGridLanesMode)}
558
538
  @click=${input.onGridAdornerClick}
559
- @keydown=${(event: KeyboardEvent) => {
560
- if (event.code === 'Enter' || event.code === 'Space') {
561
- input.onGridAdornerClick(event);
562
- event.stopPropagation();
563
- }
564
- }}
565
- ${adornerRef(input)}>
566
- <span>${gridLanesAdornerConfig.name}</span>
539
+ @keydown=${handleAdornerKeydown(input.onGridAdornerClick)}
540
+ ${adornerRef()}>
541
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.GRID_LANES}</span>
567
542
  </devtools-adorner>`: nothing}
568
543
  ${input.showMediaAdorner ? html`<devtools-adorner
569
544
  class=clickable
570
545
  role=button
571
546
  tabindex=0
572
- .data=${{name: mediaAdornerConfig.name, jslogContext: mediaAdornerConfig.name}}
573
- jslog=${VisualLogging.adorner(mediaAdornerConfig.name).track({click: true})}
547
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.MEDIA}
548
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.MEDIA).track({click: true})}
574
549
  aria-label=${i18nString(UIStrings.openMediaPanel)}
575
550
  @click=${input.onMediaAdornerClick}
576
- @keydown=${(event: KeyboardEvent) => {
577
- if (event.code === 'Enter' || event.code === 'Space') {
578
- input.onMediaAdornerClick(event);
579
- event.stopPropagation();
580
- }
581
- }}
582
- ${adornerRef(input)}>
551
+ @keydown=${handleAdornerKeydown(input.onMediaAdornerClick)}
552
+ ${adornerRef()}>
583
553
  <span class="adorner-with-icon">
584
- ${mediaAdornerConfig.name}<devtools-icon name="select-element"></devtools-icon>
554
+ ${ElementsComponents.AdornerManager.RegisteredAdorners.MEDIA}<devtools-icon name="select-element"></devtools-icon>
585
555
  </span>
586
556
  </devtools-adorner>`: nothing}
587
557
  ${input.showPopoverAdorner ? html`<devtools-adorner
@@ -589,48 +559,74 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
589
559
  role=button
590
560
  toggleable=true
591
561
  tabindex=0
592
- .data=${{name: popoverAdornerConfig.name, jslogContext: popoverAdornerConfig.name}}
593
- jslog=${VisualLogging.adorner(popoverAdornerConfig.name).track({click: true})}
562
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.POPOVER}
563
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.POPOVER).track({click: true})}
594
564
  active=${input.popoverAdornerActive}
595
565
  aria-label=${input.popoverAdornerActive ? i18nString(UIStrings.stopForceOpenPopover) : i18nString(UIStrings.forceOpenPopover)}
596
566
  @click=${input.onPopoverAdornerClick}
597
- @keydown=${(event: KeyboardEvent) => {
598
- if (event.code === 'Enter' || event.code === 'Space') {
599
- input.onPopoverAdornerClick(event);
600
- event.stopPropagation();
601
- }
602
- }}
603
- ${adornerRef(input)}>
604
- <span>${popoverAdornerConfig.name}</span>
567
+ @keydown=${handleAdornerKeydown(input.onPopoverAdornerClick)}
568
+ ${adornerRef()}>
569
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.POPOVER}</span>
605
570
  </devtools-adorner>`: nothing}
606
571
  ${input.showTopLayerAdorner ? html`<devtools-adorner
607
572
  class=clickable
608
573
  role=button
609
574
  tabindex=0
610
- .data=${{name: topLayerAdornerConfig.name, jslogContext: topLayerAdornerConfig.name}}
611
- jslog=${VisualLogging.adorner(topLayerAdornerConfig.name).track({click: true})}
575
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.TOP_LAYER}
576
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.TOP_LAYER).track({click: true})}
612
577
  aria-label=${i18nString(UIStrings.reveal)}
613
578
  @click=${input.onTopLayerAdornerClick}
614
- @keydown=${(event: KeyboardEvent) => {
615
- if (event.code === 'Enter' || event.code === 'Space') {
616
- input.onTopLayerAdornerClick(event);
617
- event.stopPropagation();
618
- }
619
- }}
620
- ${adornerRef(input)}>
579
+ @keydown=${handleAdornerKeydown(input.onTopLayerAdornerClick)}
580
+ ${adornerRef()}>
621
581
  <span class="adorner-with-icon">
622
582
  ${`top-layer (${input.topLayerIndex})`}<devtools-icon name="select-element"></devtools-icon>
623
583
  </span>
624
584
  </devtools-adorner>`: nothing}
625
- ${repeat(Array.from((input.adorners ?? new Set()).values()).sort(adornerComparator), adorner => {
626
- return adorner;
627
- })}
585
+ ${input.showStartingStyleAdorner ? html`<devtools-adorner
586
+ class="starting-style"
587
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.STARTING_STYLE}
588
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.STARTING_STYLE).track({click: true})}
589
+ active=${input.startingStyleAdornerActive}
590
+ toggleable=true
591
+ aria-label=${input.startingStyleAdornerActive ? i18nString(UIStrings.disableStartingStyle) : i18nString(UIStrings.enableStartingStyle)}
592
+ @click=${input.onStartingStyleAdornerClick}
593
+ @keydown=${handleAdornerKeydown(input.onStartingStyleAdornerClick)}
594
+ ${adornerRef()}>
595
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.STARTING_STYLE}</span>
596
+ </devtools-adorner>` : nothing}
628
597
  ${input.showScrollAdorner ? html`<devtools-adorner
629
598
  class="scroll"
630
- .data=${{name: scrollAdornerConfig.name, jslogContext: scrollAdornerConfig.name}}
599
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL}
600
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL).track({click: true})}
631
601
  aria-label=${i18nString(UIStrings.elementHasScrollableOverflow)}
632
- ${adornerRef(input)}>
633
- <span>${scrollAdornerConfig.name}</span>
602
+ ${adornerRef()}>
603
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL}</span>
604
+ </devtools-adorner>` : nothing}
605
+ ${input.showSlotAdorner ? html`<devtools-adorner
606
+ class=clickable
607
+ role=button
608
+ tabindex=0
609
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.SLOT}
610
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.SLOT).track({click: true})}
611
+ @click=${input.onSlotAdornerClick}
612
+ @mousedown=${(e: Event) => e.stopPropagation()}
613
+ ${adornerRef()}>
614
+ <span class="adorner-with-icon">
615
+ <devtools-icon name="select-element"></devtools-icon>
616
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.SLOT}</span>
617
+ </span>
618
+ </devtools-adorner>`: nothing}
619
+ ${input.showScrollSnapAdorner ? html`<devtools-adorner
620
+ class="scroll-snap"
621
+ .name=${ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP}
622
+ jslog=${VisualLogging.adorner(ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP).track({click: true})}
623
+ active=${input.scrollSnapAdornerActive}
624
+ toggleable=true
625
+ aria-label=${input.scrollSnapAdornerActive ? i18nString(UIStrings.disableScrollSnap) : i18nString(UIStrings.enableScrollSnap)}
626
+ @click=${input.onScrollSnapAdornerClick}
627
+ @keydown=${handleAdornerKeydown(input.onScrollSnapAdornerClick)}
628
+ ${adornerRef()}>
629
+ <span>${ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP}</span>
634
630
  </devtools-adorner>` : nothing}
635
631
  </div>`: nothing}
636
632
  </div>
@@ -665,12 +661,14 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
665
661
  readonly tagTypeContext: TagTypeContext;
666
662
 
667
663
  #adornersThrottler = new Common.Throttler.Throttler(100);
668
- #adorners = new Set<Adorners.Adorner.Adorner>();
669
664
  #nodeInfo?: DocumentFragment;
670
665
  #containerAdornerActive = false;
671
666
  #flexAdornerActive = false;
672
667
  #gridAdornerActive = false;
673
668
  #popoverAdornerActive = false;
669
+
670
+ #scrollSnapAdornerActive = false;
671
+ #startingStyleAdornerActive = false;
674
672
  #layout: SDK.CSSModel.LayoutProperties|null = null;
675
673
 
676
674
  constructor(node: SDK.DOMModel.DOMNode, isClosingTag?: boolean) {
@@ -701,8 +699,6 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
701
699
  tagType: TagType.OPENING,
702
700
  canAddAttributes: this.nodeInternal.nodeType() === Node.ELEMENT_NODE,
703
701
  };
704
- void this.updateStyleAdorners();
705
-
706
702
  void this.#updateAdorners();
707
703
  }
708
704
  this.expandAllButtonElement = null;
@@ -778,15 +774,10 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
778
774
  }
779
775
  }
780
776
 
781
- get adorners(): Adorners.Adorner.Adorner[] {
782
- return Array.from(this.#adorners);
783
- }
784
-
785
777
  performUpdate(): void {
786
778
  DEFAULT_VIEW(
787
779
  {
788
780
  containerAdornerActive: this.#containerAdornerActive,
789
- adorners: !this.isClosingTag() ? this.#adorners : undefined,
790
781
  showAdAdorner: this.nodeInternal.isAdFrameNode(),
791
782
  showContainerAdorner: Boolean(this.#layout?.containerType) && !this.isClosingTag(),
792
783
  containerType: this.#layout?.containerType,
@@ -805,21 +796,30 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
805
796
  showScrollAdorner: ((this.node().nodeName() === 'HTML' && this.node().ownerDocument?.isScrollable()) ||
806
797
  (this.node().nodeName() !== '#document' && this.node().isScrollable())) &&
807
798
  !this.isClosingTag(),
799
+ showScrollSnapAdorner: Boolean(this.#layout?.hasScroll) && !this.isClosingTag(),
800
+ scrollSnapAdornerActive: this.#scrollSnapAdornerActive,
801
+ showSlotAdorner: Boolean(this.nodeInternal.assignedSlot) && !this.isClosingTag(),
802
+ showStartingStyleAdorner: this.nodeInternal.affectedByStartingStyles() && !this.isClosingTag(),
803
+ startingStyleAdornerActive: this.#startingStyleAdornerActive,
808
804
  nodeInfo: this.#nodeInfo,
805
+ onStartingStyleAdornerClick: (event: Event) => this.#onStartingStyleAdornerClick(event),
806
+ onSlotAdornerClick: () => {
807
+ if (this.nodeInternal.assignedSlot) {
808
+ const deferredNode = this.nodeInternal.assignedSlot.deferredNode;
809
+ deferredNode.resolve(node => {
810
+ void Common.Revealer.reveal(node);
811
+ });
812
+ }
813
+ },
809
814
  topLayerIndex: this.node().topLayerIndex(),
810
815
  onViewSourceAdornerClick: this.revealHTMLInSources.bind(this),
811
816
  onGutterClick: this.showContextMenu.bind(this),
812
- onAdornerAdded: adorner => {
813
- ElementsPanel.instance().registerAdorner(adorner);
814
- },
815
- onAdornerRemoved: adorner => {
816
- ElementsPanel.instance().deregisterAdorner(adorner);
817
- },
818
817
  onContainerAdornerClick: (event: Event) => this.#onContainerAdornerClick(event),
819
818
  onFlexAdornerClick: (event: Event) => this.#onFlexAdornerClick(event),
820
819
  onGridAdornerClick: (event: Event) => this.#onGridAdornerClick(event),
821
820
  onMediaAdornerClick: (event: Event) => this.#onMediaAdornerClick(event),
822
821
  onPopoverAdornerClick: (event: Event) => this.#onPopoverAdornerClick(event),
822
+ onScrollSnapAdornerClick: (event: Event) => this.#onScrollSnapAdornerClick(event),
823
823
  onTopLayerAdornerClick: () => {
824
824
  if (!this.treeOutline) {
825
825
  return;
@@ -1042,25 +1042,6 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1042
1042
  this.#expandedChildrenLimit = expandedChildrenLimit;
1043
1043
  }
1044
1044
 
1045
- createSlotLink(nodeShortcut: SDK.DOMModel.DOMNodeShortcut|null): void {
1046
- if (!isOpeningTag(this.tagTypeContext)) {
1047
- return;
1048
- }
1049
- if (nodeShortcut) {
1050
- const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
1051
- ElementsComponents.AdornerManager.RegisteredAdorners.SLOT);
1052
- const adorner = this.adornSlot(config);
1053
- this.#adorners.add(adorner);
1054
- const deferredNode = nodeShortcut.deferredNode;
1055
- adorner.addEventListener('click', () => {
1056
- deferredNode.resolve(node => {
1057
- void Common.Revealer.reveal(node);
1058
- });
1059
- });
1060
- adorner.addEventListener('mousedown', e => e.consume(), false);
1061
- }
1062
- }
1063
-
1064
1045
  private createSelection(): void {
1065
1046
  const contentElement = this.contentElement;
1066
1047
  if (!contentElement) {
@@ -1114,15 +1095,16 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1114
1095
  this.nodeInternal.addEventListener(SDK.DOMModel.DOMNodeEvents.TOP_LAYER_INDEX_CHANGED, this.performUpdate, this);
1115
1096
  this.nodeInternal.addEventListener(
1116
1097
  SDK.DOMModel.DOMNodeEvents.SCROLLABLE_FLAG_UPDATED, this.#onScrollableFlagUpdated, this);
1117
- const overlayModel = this.nodeInternal.domModel().overlayModel();
1118
- overlayModel.addEventListener(
1119
- SDK.OverlayModel.Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED,
1098
+ this.nodeInternal.addEventListener(
1099
+ SDK.DOMModel.DOMNodeEvents.CONTAINER_QUERY_OVERLAY_STATE_CHANGED,
1120
1100
  this.#onPersistentContainerQueryOverlayStateChanged, this);
1121
- overlayModel.addEventListener(
1122
- SDK.OverlayModel.Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED,
1101
+ this.nodeInternal.addEventListener(
1102
+ SDK.DOMModel.DOMNodeEvents.FLEX_CONTAINER_OVERLAY_STATE_CHANGED,
1123
1103
  this.#onPersistentFlexContainerOverlayStateChanged, this);
1124
- overlayModel.addEventListener(
1125
- SDK.OverlayModel.Events.PERSISTENT_GRID_OVERLAY_STATE_CHANGED, this.#onPersistentGridOverlayStateChanged,
1104
+ this.nodeInternal.addEventListener(
1105
+ SDK.DOMModel.DOMNodeEvents.GRID_OVERLAY_STATE_CHANGED, this.#onPersistentGridOverlayStateChanged, this);
1106
+ this.nodeInternal.addEventListener(
1107
+ SDK.DOMModel.DOMNodeEvents.SCROLL_SNAP_OVERLAY_STATE_CHANGED, this.#onPersistentScrollSnapOverlayStateChanged,
1126
1108
  this);
1127
1109
  }
1128
1110
  }
@@ -1137,49 +1119,56 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1137
1119
  this.nodeInternal.removeEventListener(SDK.DOMModel.DOMNodeEvents.TOP_LAYER_INDEX_CHANGED, this.performUpdate, this);
1138
1120
  this.nodeInternal.removeEventListener(
1139
1121
  SDK.DOMModel.DOMNodeEvents.SCROLLABLE_FLAG_UPDATED, this.#onScrollableFlagUpdated, this);
1140
- const overlayModel = this.nodeInternal.domModel().overlayModel();
1141
- overlayModel.removeEventListener(
1142
- SDK.OverlayModel.Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED,
1122
+ this.nodeInternal.removeEventListener(
1123
+ SDK.DOMModel.DOMNodeEvents.CONTAINER_QUERY_OVERLAY_STATE_CHANGED,
1143
1124
  this.#onPersistentContainerQueryOverlayStateChanged, this);
1144
- overlayModel.removeEventListener(
1145
- SDK.OverlayModel.Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED,
1125
+ this.nodeInternal.removeEventListener(
1126
+ SDK.DOMModel.DOMNodeEvents.FLEX_CONTAINER_OVERLAY_STATE_CHANGED,
1146
1127
  this.#onPersistentFlexContainerOverlayStateChanged, this);
1147
- overlayModel.removeEventListener(
1148
- SDK.OverlayModel.Events.PERSISTENT_GRID_OVERLAY_STATE_CHANGED, this.#onPersistentGridOverlayStateChanged, this);
1128
+ this.nodeInternal.removeEventListener(
1129
+ SDK.DOMModel.DOMNodeEvents.GRID_OVERLAY_STATE_CHANGED, this.#onPersistentGridOverlayStateChanged, this);
1130
+ this.nodeInternal.removeEventListener(
1131
+ SDK.DOMModel.DOMNodeEvents.SCROLL_SNAP_OVERLAY_STATE_CHANGED, this.#onPersistentScrollSnapOverlayStateChanged,
1132
+ this);
1149
1133
  }
1150
1134
 
1151
1135
  #onScrollableFlagUpdated(): void {
1152
1136
  void this.#updateAdorners();
1153
1137
  }
1154
1138
 
1155
- #onPersistentContainerQueryOverlayStateChanged(
1156
- event: Common.EventTarget.EventTargetEvent<SDK.OverlayModel.ChangedNodeId>): void {
1157
- const {nodeId: eventNodeId, enabled} = event.data;
1158
- if (eventNodeId !== this.nodeInternal.id) {
1159
- return;
1160
- }
1161
- this.#containerAdornerActive = enabled;
1139
+ #onPersistentContainerQueryOverlayStateChanged(event: Common.EventTarget.EventTargetEvent<{enabled: boolean}>): void {
1140
+ this.#containerAdornerActive = event.data.enabled;
1162
1141
  this.performUpdate();
1163
1142
  }
1164
1143
 
1165
- #onPersistentFlexContainerOverlayStateChanged(
1166
- event: Common.EventTarget.EventTargetEvent<SDK.OverlayModel.ChangedNodeId>): void {
1167
- const {nodeId: eventNodeId, enabled} = event.data;
1168
- if (eventNodeId !== this.nodeInternal.id) {
1169
- return;
1170
- }
1171
- this.#flexAdornerActive = enabled;
1144
+ #onPersistentFlexContainerOverlayStateChanged(event: Common.EventTarget.EventTargetEvent<{enabled: boolean}>): void {
1145
+ this.#flexAdornerActive = event.data.enabled;
1146
+ this.performUpdate();
1147
+ }
1148
+
1149
+ #onPersistentGridOverlayStateChanged(event: Common.EventTarget.EventTargetEvent<{enabled: boolean}>): void {
1150
+ this.#gridAdornerActive = event.data.enabled;
1172
1151
  this.performUpdate();
1173
1152
  }
1174
1153
 
1175
- #onPersistentGridOverlayStateChanged(event: Common.EventTarget.EventTargetEvent<SDK.OverlayModel.ChangedNodeId>):
1176
- void {
1177
- const {nodeId: eventNodeId, enabled} = event.data;
1178
- if (eventNodeId !== this.nodeInternal.id) {
1154
+ #onPersistentScrollSnapOverlayStateChanged(event: Common.EventTarget.EventTargetEvent<{enabled: boolean}>): void {
1155
+ this.#scrollSnapAdornerActive = event.data.enabled;
1156
+ this.performUpdate();
1157
+ }
1158
+
1159
+ #onScrollSnapAdornerClick(event: Event): void {
1160
+ event.stopPropagation();
1161
+ const node = this.node();
1162
+ const nodeId = node.id;
1163
+ if (!nodeId) {
1179
1164
  return;
1180
1165
  }
1181
- this.#gridAdornerActive = enabled;
1182
- this.performUpdate();
1166
+ const model = node.domModel().overlayModel();
1167
+ if (this.#scrollSnapAdornerActive) {
1168
+ model.hideScrollSnapInPersistentOverlay(nodeId);
1169
+ } else {
1170
+ model.highlightScrollSnapInPersistentOverlay(nodeId);
1171
+ }
1183
1172
  }
1184
1173
 
1185
1174
  override onattach(): void {
@@ -2896,69 +2885,6 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
2896
2885
  });
2897
2886
  }
2898
2887
 
2899
- // TODO: add unit tests for adorner-related methods after component and TypeScript works are done
2900
- adorn({name}: {name: string}, content?: HTMLElement): Adorners.Adorner.Adorner {
2901
- let adornerContent = content;
2902
- if (!adornerContent) {
2903
- adornerContent = document.createElement('span');
2904
- adornerContent.textContent = name;
2905
- }
2906
- const adorner = new Adorners.Adorner.Adorner();
2907
- adorner.data = {
2908
- name,
2909
- content: adornerContent,
2910
- jslogContext: name,
2911
- };
2912
- if (isOpeningTag(this.tagTypeContext)) {
2913
- this.#adorners.add(adorner);
2914
- ElementsPanel.instance().registerAdorner(adorner);
2915
- this.updateAdorners();
2916
- }
2917
- return adorner;
2918
- }
2919
-
2920
- adornSlot({name}: {name: string}): Adorners.Adorner.Adorner {
2921
- const linkIcon = createIcon('select-element');
2922
- const slotText = document.createElement('span');
2923
- slotText.textContent = name;
2924
- const adornerContent = document.createElement('span');
2925
- adornerContent.append(linkIcon);
2926
- adornerContent.append(slotText);
2927
- adornerContent.classList.add('adorner-with-icon');
2928
- const adorner = new Adorners.Adorner.Adorner();
2929
- adorner.data = {
2930
- name,
2931
- content: adornerContent,
2932
- jslogContext: 'slot',
2933
- };
2934
- this.#adorners.add(adorner);
2935
- ElementsPanel.instance().registerAdorner(adorner);
2936
- this.updateAdorners();
2937
- return adorner;
2938
- }
2939
-
2940
- removeAdorner(adornerToRemove: Adorners.Adorner.Adorner): void {
2941
- ElementsPanel.instance().deregisterAdorner(adornerToRemove);
2942
- adornerToRemove.remove();
2943
- this.#adorners.delete(adornerToRemove);
2944
- this.updateAdorners();
2945
- }
2946
-
2947
- /**
2948
- * @param adornerType optional type of adorner to remove. If not provided, remove all adorners.
2949
- */
2950
- removeAdornersByType(adornerType?: ElementsComponents.AdornerManager.RegisteredAdorners): void {
2951
- if (!isOpeningTag(this.tagTypeContext)) {
2952
- return;
2953
- }
2954
-
2955
- for (const adorner of this.#adorners) {
2956
- if (adorner.name === adornerType || !adornerType) {
2957
- this.removeAdorner(adorner);
2958
- }
2959
- }
2960
- }
2961
-
2962
2888
  updateAdorners(): void {
2963
2889
  // TODO: remove adornersThrottler in favour of throttled updated (requestUpdate/performUpdate).
2964
2890
  void this.#adornersThrottler.schedule(this.#updateAdorners.bind(this));
@@ -2966,7 +2892,6 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
2966
2892
 
2967
2893
  async #updateAdorners(): Promise<void> {
2968
2894
  if (this.isClosingTag()) {
2969
- this.performUpdate();
2970
2895
  return;
2971
2896
  }
2972
2897
  const node = this.node();
@@ -2980,41 +2905,6 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
2980
2905
  this.performUpdate();
2981
2906
  }
2982
2907
 
2983
- // TODO: remove in favour of updateAdorners.
2984
- async updateStyleAdorners(): Promise<void> {
2985
- if (!isOpeningTag(this.tagTypeContext)) {
2986
- return;
2987
- }
2988
-
2989
- const node = this.node();
2990
- const nodeId = node.id;
2991
- if (node.nodeType() === Node.COMMENT_NODE || node.nodeType() === Node.DOCUMENT_FRAGMENT_NODE ||
2992
- node.nodeType() === Node.TEXT_NODE || nodeId === undefined) {
2993
- return;
2994
- }
2995
- const layout = await node.domModel().cssModel().getLayoutPropertiesFromComputedStyle(nodeId);
2996
- // TODO: move this to the template.
2997
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.SUBGRID);
2998
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.GRID);
2999
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.GRID_LANES);
3000
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.FLEX);
3001
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP);
3002
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.MEDIA);
3003
- this.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.STARTING_STYLE);
3004
- if (layout) {
3005
- if (layout.hasScroll) {
3006
- this.pushScrollSnapAdorner();
3007
- }
3008
- }
3009
-
3010
- if (Root.Runtime.hostConfig.devToolsStartingStyleDebugging?.enabled) {
3011
- const affectedByStartingStyles = node.affectedByStartingStyles();
3012
- if (affectedByStartingStyles) {
3013
- this.pushStartingStyleAdorner();
3014
- }
3015
- }
3016
- }
3017
-
3018
2908
  async #onPopoverAdornerClick(event: Event): Promise<void> {
3019
2909
  event.stopPropagation();
3020
2910
  const node = this.node();
@@ -3030,79 +2920,22 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
3030
2920
  this.performUpdate();
3031
2921
  }
3032
2922
 
3033
- pushScrollSnapAdorner(): void {
2923
+ #onStartingStyleAdornerClick(event: Event): void {
2924
+ event.stopPropagation();
3034
2925
  const node = this.node();
3035
2926
  const nodeId = node.id;
3036
2927
  if (!nodeId) {
3037
2928
  return;
3038
2929
  }
3039
- const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
3040
- ElementsComponents.AdornerManager.RegisteredAdorners.SCROLL_SNAP);
3041
- const adorner = this.adorn(config);
3042
- adorner.classList.add('scroll-snap');
3043
-
3044
- const onClick = ((() => {
3045
- const model = node.domModel().overlayModel();
3046
- if (adorner.isActive()) {
3047
- model.highlightScrollSnapInPersistentOverlay(nodeId);
3048
- } else {
3049
- model.hideScrollSnapInPersistentOverlay(nodeId);
3050
- }
3051
- }) as EventListener);
3052
-
3053
- adorner.addInteraction(onClick, {
3054
- isToggle: true,
3055
- shouldPropagateOnKeydown: false,
3056
- ariaLabelDefault: i18nString(UIStrings.enableScrollSnap),
3057
- ariaLabelActive: i18nString(UIStrings.disableScrollSnap),
3058
- });
3059
-
3060
- node.domModel().overlayModel().addEventListener(
3061
- SDK.OverlayModel.Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED, event => {
3062
- const {nodeId: eventNodeId, enabled} = event.data;
3063
- if (eventNodeId !== nodeId) {
3064
- return;
3065
- }
3066
- adorner.toggle(enabled);
3067
- });
3068
-
3069
- this.#adorners.add(adorner);
3070
-
3071
- if (node.domModel().overlayModel().isHighlightedScrollSnapInPersistentOverlay(nodeId)) {
3072
- adorner.toggle(true);
3073
- }
3074
- }
3075
-
3076
- pushStartingStyleAdorner(): void {
3077
- const node = this.node();
3078
- const nodeId = node.id;
3079
- if (!nodeId) {
3080
- return;
2930
+ const model = node.domModel().cssModel();
2931
+ if (this.#startingStyleAdornerActive) {
2932
+ model.forceStartingStyle(node, false);
2933
+ } else {
2934
+ model.forceStartingStyle(node, true);
3081
2935
  }
3082
- const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
3083
- ElementsComponents.AdornerManager.RegisteredAdorners.STARTING_STYLE);
3084
- const adorner = this.adorn(config);
3085
- adorner.classList.add('starting-style');
3086
-
3087
- const onClick = ((() => {
3088
- const model = node.domModel().cssModel();
3089
- if (adorner.isActive()) {
3090
- model.forceStartingStyle(node, true);
3091
- } else {
3092
- model.forceStartingStyle(node, false);
3093
- }
3094
- }) as EventListener);
3095
-
3096
- adorner.addInteraction(onClick, {
3097
- isToggle: true,
3098
- shouldPropagateOnKeydown: false,
3099
- ariaLabelDefault: i18nString(UIStrings.enableStartingStyle),
3100
- ariaLabelActive: i18nString(UIStrings.disableStartingStyle),
3101
- });
3102
-
3103
- this.#adorners.add(adorner);
2936
+ this.#startingStyleAdornerActive = !this.#startingStyleAdornerActive;
2937
+ this.performUpdate();
3104
2938
  }
3105
-
3106
2939
  }
3107
2940
 
3108
2941
  export const InitialChildrenLimit = 500;
@@ -3119,15 +2952,6 @@ export const ForbiddenClosingTagElements = new Set<string>([
3119
2952
  /** These tags we do not allow editing their tag name. **/
3120
2953
  export const EditTagBlocklist = new Set<string>(['html', 'head', 'body']);
3121
2954
 
3122
- export function adornerComparator(adornerA: Adorners.Adorner.Adorner, adornerB: Adorners.Adorner.Adorner): number {
3123
- const compareCategories =
3124
- ElementsComponents.AdornerManager.compareAdornerNamesByCategory(adornerB.name, adornerB.name);
3125
- if (compareCategories === 0) {
3126
- return adornerA.name.localeCompare(adornerB.name);
3127
- }
3128
- return compareCategories;
3129
- }
3130
-
3131
2955
  export function convertUnicodeCharsToHTMLEntities(text: string): {
3132
2956
  text: string,
3133
2957
  entityRanges: TextUtils.TextRange.SourceRange[],