chrome-devtools-frontend 1.0.1556696 → 1.0.1558690

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 (157) hide show
  1. package/front_end/core/common/Object.ts +5 -1
  2. package/front_end/core/host/ResourceLoader.ts +1 -1
  3. package/front_end/core/host/UserMetrics.ts +3 -1
  4. package/front_end/core/sdk/DOMModel.ts +7 -0
  5. package/front_end/core/sdk/NetworkManager.ts +0 -7
  6. package/front_end/core/sdk/SourceMap.ts +16 -2
  7. package/front_end/core/sdk/SourceMapManager.ts +1 -1
  8. package/front_end/core/sdk/SourceMapScopesInfo.ts +11 -4
  9. package/front_end/entrypoints/formatter_worker/FormatterActions.ts +1 -0
  10. package/front_end/entrypoints/formatter_worker/ScopeParser.ts +51 -8
  11. package/front_end/entrypoints/main/GlobalAiButton.ts +5 -1
  12. package/front_end/generated/Deprecation.ts +0 -7
  13. package/front_end/generated/InspectorBackendCommands.ts +3 -3
  14. package/front_end/generated/protocol.ts +9 -0
  15. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +3 -3
  16. package/front_end/models/bindings/CompilerScriptMapping.ts +7 -6
  17. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +4 -4
  18. package/front_end/models/javascript_metadata/NativeFunctions.js +2 -2
  19. package/front_end/models/stack_trace/StackTraceImpl.ts +5 -3
  20. package/front_end/models/stack_trace/StackTraceModel.ts +53 -40
  21. package/front_end/models/trace/EventsSerializer.ts +8 -2
  22. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +2 -2
  23. package/front_end/panels/application/AppManifestView.ts +134 -223
  24. package/front_end/panels/application/CookieItemsView.ts +1 -0
  25. package/front_end/panels/application/SharedStorageTreeElement.ts +3 -0
  26. package/front_end/panels/application/appManifestView.css +1 -1
  27. package/front_end/panels/console/ConsoleViewMessage.ts +4 -3
  28. package/front_end/panels/elements/ElementsTreeElement.ts +30 -1
  29. package/front_end/panels/elements/ElementsTreeOutlineRenderer.ts +7 -1
  30. package/front_end/panels/elements/components/AdornerManager.ts +8 -0
  31. package/front_end/panels/emulation/DeviceModeToolbar.ts +3 -1
  32. package/front_end/panels/issues/AffectedResourcesView.ts +0 -1
  33. package/front_end/panels/lighthouse/LighthousePanel.ts +10 -0
  34. package/front_end/panels/lighthouse/lighthousePanel.css +46 -3
  35. package/front_end/panels/network/NetworkLogViewColumns.ts +9 -9
  36. package/front_end/panels/network/RequestCookiesView.ts +125 -141
  37. package/front_end/panels/network/components/RequestHeadersView.ts +2 -2
  38. package/front_end/panels/network/requestCookiesView.css +22 -20
  39. package/front_end/panels/recorder/components/RecordingView.ts +3 -3
  40. package/front_end/panels/recorder/components/StepView.ts +2 -1
  41. package/front_end/panels/settings/keybindsSettingsTab.css +4 -0
  42. package/front_end/panels/sources/CallStackSidebarPane.ts +7 -3
  43. package/front_end/panels/sources/DebuggerPausedMessage.ts +125 -90
  44. package/front_end/panels/sources/SourcesPanel.ts +10 -7
  45. package/front_end/panels/sources/debuggerPausedMessage.css +8 -0
  46. package/front_end/panels/timeline/components/sidebarInsightsTab.css +2 -0
  47. package/front_end/third_party/acorn/estree-legacy.d.ts +2 -0
  48. package/front_end/third_party/chromium/README.chromium +1 -1
  49. package/front_end/third_party/puppeteer/README.chromium +2 -2
  50. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +12 -0
  51. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  52. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  53. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +14 -2
  54. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  55. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  56. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +3 -1
  57. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
  58. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +6 -0
  59. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.d.ts +0 -1
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js +0 -20
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js.map +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +3 -1
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +10 -14
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts +1 -0
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +14 -0
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +3 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +12 -0
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/EmulationManager.d.ts +1 -0
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/EmulationManager.d.ts.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/EmulationManager.js +22 -0
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/EmulationManager.js.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +3 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +9 -2
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +26 -0
  92. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +72 -15
  93. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +12 -0
  94. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +14 -2
  97. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +3 -1
  100. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +6 -0
  102. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.d.ts +0 -1
  104. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js +0 -20
  106. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +3 -1
  108. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +11 -15
  110. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts +1 -0
  112. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +14 -0
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +3 -1
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +12 -0
  118. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/EmulationManager.d.ts +1 -0
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/EmulationManager.d.ts.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/EmulationManager.js +22 -0
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/EmulationManager.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +3 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +9 -2
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/types.d.ts +26 -0
  133. package/front_end/third_party/puppeteer/package/package.json +1 -1
  134. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +18 -0
  135. package/front_end/third_party/puppeteer/package/src/api/Page.ts +16 -2
  136. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +13 -0
  137. package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +0 -33
  138. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +14 -28
  139. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +19 -0
  140. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +19 -0
  141. package/front_end/third_party/puppeteer/package/src/cdp/EmulationManager.ts +30 -0
  142. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +15 -6
  143. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  144. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  145. package/front_end/ui/components/icon_button/iconButton.css +3 -1
  146. package/front_end/ui/components/report_view/ReportView.ts +11 -2
  147. package/front_end/ui/components/report_view/report.css +16 -0
  148. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +135 -7
  149. package/front_end/ui/components/text_editor/config.ts +6 -6
  150. package/front_end/ui/legacy/ContextMenu.ts +11 -2
  151. package/front_end/ui/legacy/TextPrompt.ts +1 -1
  152. package/front_end/ui/legacy/Toolbar.ts +4 -0
  153. package/front_end/ui/legacy/UIUtils.ts +0 -2
  154. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +18 -3
  155. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +3 -3
  156. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +6 -0
  157. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
1
  // Copyright 2016 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, @devtools/no-lit-render-outside-of-view */
5
4
 
6
5
  import '../../ui/legacy/components/inline_editor/inline_editor.js';
7
6
  import '../../ui/components/report_view/report_view.js';
@@ -21,7 +20,7 @@ import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
21
20
  import appManifestViewStyles from './appManifestView.css.js';
22
21
  import * as ApplicationComponents from './components/components.js';
23
22
 
24
- const {classMap, ref} = Directives;
23
+ const {styleMap, classMap, ref} = Directives;
25
24
  const {linkifyURL} = Components.Linkifier.Linkifier;
26
25
  const {widgetConfig} = UI.Widget;
27
26
 
@@ -515,13 +514,6 @@ interface Manifest {
515
514
  }
516
515
  /* eslint-enable @typescript-eslint/naming-convention */
517
516
 
518
- interface ReportSectionItem {
519
- content: LitTemplate|LitTemplate[]|string|HTMLElement;
520
- title?: string;
521
- label?: string;
522
- flexed?: boolean;
523
- }
524
-
525
517
  interface IdentitySectionData {
526
518
  name: string;
527
519
  shortName: string;
@@ -614,75 +606,67 @@ function renderSectionHeader(text: Platform.UIString.LocalizedString, output?: V
614
606
  }
615
607
 
616
608
  function renderErrors(
617
- errorsSection: UI.ReportView.Section, warnings?: Platform.UIString.LocalizedString[],
618
- manifestErrors?: Protocol.Page.AppManifestError[], imageErrors?: Platform.UIString.LocalizedString[]): void {
619
- errorsSection.clearContent();
620
- errorsSection.element.classList.toggle(
621
- 'hidden', !manifestErrors?.length && !warnings?.length && !imageErrors?.length);
622
-
623
- for (const error of manifestErrors ?? []) {
624
- const icon = UI.UIUtils.createIconLabel({
625
- title: error.message,
626
- iconName: error.critical ? 'cross-circle-filled' : 'warning-filled',
627
- color: error.critical ? 'var(--icon-error)' : 'var(--icon-warning)',
628
- });
629
- errorsSection.appendRow().appendChild(icon);
630
- }
631
-
632
- for (const warning of warnings ?? []) {
633
- const msgElement = document.createTextNode(warning);
634
- errorsSection.appendRow().appendChild(msgElement);
635
- }
636
- for (const error of imageErrors ?? []) {
637
- const msgElement = document.createTextNode(error);
638
- errorsSection.appendRow().appendChild(msgElement);
639
- }
609
+ warnings?: Platform.UIString.LocalizedString[], manifestErrors?: Protocol.Page.AppManifestError[],
610
+ imageErrors?: Platform.UIString.LocalizedString[], output?: ViewOutput): LitTemplate {
611
+ // clang-format off
612
+ return html`
613
+ ${renderSectionHeader(i18nString(UIStrings.errorsAndWarnings), output)}
614
+ <div class="report-section" jslog=${VisualLogging.section('errors-and-warnings')}>
615
+ ${manifestErrors?.map(error => html`<div class="report-row">
616
+ <devtools-icon
617
+ name=${error.critical ? 'cross-circle-filled' : 'warning-filled'}
618
+ style=${styleMap({color: error.critical ? 'var(--icon-error)' : 'var(--icon-warning)'})}>
619
+ </devtools-icon>
620
+ ${error.message}</div>
621
+ `)}
622
+ ${warnings?.map(warning => html`<div class="report-row">${warning}</div>`)}
623
+ ${imageErrors?.map(error => html`<div class="report-row">${error}</div>`)}
624
+ </div>`;
625
+ // clang-format on
640
626
  }
641
627
 
642
- function renderIdentity(identitySection: UI.ReportView.Section, identityData: IdentitySectionData): void {
628
+ function renderIdentity(identityData: IdentitySectionData, onCopy: () => void, output: ViewOutput): LitTemplate {
643
629
  const {name, shortName, description, appId, recommendedId, hasId} = identityData;
644
- const fields: ReportSectionItem[] = [];
645
- fields.push({title: i18nString(UIStrings.name), content: name});
646
- fields.push({title: i18nString(UIStrings.shortName), content: shortName});
647
- fields.push({title: i18nString(UIStrings.description), content: description});
648
-
649
- if (appId && recommendedId) {
650
- const onCopy = (): void => {
651
- UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.copiedToClipboard, {PH1: recommendedId}));
652
- Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(recommendedId);
653
- };
654
- // clang-format off
655
- fields.push({title: i18nString(UIStrings.computedAppId), label: 'App Id', content: html`
656
- ${appId}
657
- <devtools-icon class="inline-icon" name="help" title=${i18nString(UIStrings.appIdExplainer)}
658
- jslog=${VisualLogging.action('help').track({hover: true})}>
659
- </devtools-icon>
660
- <devtools-link href="https://developer.chrome.com/blog/pwa-manifest-id/"
661
- .jslogContext=${'learn-more'}>
662
- ${i18nString(UIStrings.learnMore)}
663
- </devtools-link>
664
- ${!hasId ? html`
665
- <div class="multiline-value">
666
- ${i18nTemplate(str_, UIStrings.appIdNote, {
667
- PH1: html`<code>${recommendedId}</code>`,
668
- PH2: html`<devtools-button class="inline-button" @click=${onCopy}
669
- .iconName=${'copy'}
670
- .variant=${Buttons.Button.Variant.ICON}
671
- .size=${Buttons.Button.Size.SMALL}
672
- .jslogContext=${'manifest.copy-id'}
673
- .title=${i18nString(UIStrings.copyToClipboard)}>
674
- </devtools-button>`,
675
- })}
676
- </div>` : nothing}`});
677
- // clang-format on
678
- } else {
679
- identitySection.removeField(i18nString(UIStrings.computedAppId));
680
- }
681
- setSectionContents(fields, identitySection);
630
+ // clang-format off
631
+ return html`${renderSectionHeader(i18nString(UIStrings.identity), output)}
632
+ <div class="report-section" jslog=${VisualLogging.section('identity')}>
633
+ <devtools-report-key>${i18nString(UIStrings.name)}</devtools-report-key>
634
+ <devtools-report-value>${name}</devtools-report-value>
635
+ <devtools-report-key>${i18nString(UIStrings.shortName)}</devtools-report-key>
636
+ <devtools-report-value>${shortName}</devtools-report-value>
637
+ <devtools-report-key>${i18nString(UIStrings.description)}</devtools-report-key>
638
+ <devtools-report-value>${description}</devtools-report-value>
639
+ ${appId && recommendedId ? html`
640
+ <devtools-report-key aria-label="App Id">${i18nString(UIStrings.computedAppId)}</devtools-report-key>
641
+ <devtools-report-value jslog=${VisualLogging.section('identity')}>
642
+ ${appId}
643
+ <devtools-icon class="inline-icon" name="help" title=${i18nString(UIStrings.appIdExplainer)}
644
+ jslog=${VisualLogging.action('help').track({hover: true})}>
645
+ </devtools-icon>
646
+ <devtools-link href="https://developer.chrome.com/blog/pwa-manifest-id/"
647
+ .jslogContext=${'learn-more'}
648
+ ${ref(setFocusOnSection(i18nString(UIStrings.identity), output))}>
649
+ ${i18nString(UIStrings.learnMore)}
650
+ </devtools-link>
651
+ ${!hasId ? html`
652
+ <div class="multiline-value">
653
+ ${i18nTemplate(str_, UIStrings.appIdNote, {
654
+ PH1: html`<code>${recommendedId}</code>`,
655
+ PH2: html`<devtools-button class="inline-button" @click=${onCopy}
656
+ .iconName=${'copy'}
657
+ .variant=${Buttons.Button.Variant.ICON}
658
+ .size=${Buttons.Button.Size.SMALL}
659
+ .jslogContext=${'manifest.copy-id'}
660
+ .title=${i18nString(UIStrings.copyToClipboard)}>
661
+ </devtools-button>`,
662
+ })}
663
+ </div>` : nothing}
664
+ </devtools-report-value>` : nothing}
665
+ </div>`;
666
+ // clang-format on
682
667
  }
683
668
 
684
- function renderPresentation(
685
- presentationSection: UI.ReportView.Section, presentationData: PresentationSectionData): void {
669
+ function renderPresentation(presentationData: PresentationSectionData, output: ViewOutput): LitTemplate {
686
670
  const {
687
671
  startUrl,
688
672
  completeStartUrl,
@@ -694,35 +678,41 @@ function renderPresentation(
694
678
  hasNewNoteUrl,
695
679
  completeNewNoteUrl,
696
680
  } = presentationData;
697
- const fields: ReportSectionItem[] = [
698
- {
699
- title: i18nString(UIStrings.startUrl),
700
- label: i18nString(UIStrings.startUrl),
701
- content: completeStartUrl ? Components.Linkifier.Linkifier.linkifyURL(
702
- completeStartUrl, ({text: startUrl, tabStop: true, jslogContext: 'start-url'})) :
703
- nothing,
704
- },
705
- {
706
- title: i18nString(UIStrings.themeColor),
707
- content: themeColor ? html`<devtools-color-swatch .color=${themeColor}></devtools-color-swatch>` : nothing,
708
- },
709
- {
710
- title: i18nString(UIStrings.backgroundColor),
711
- content: backgroundColor ? html`<devtools-color-swatch .color=${backgroundColor}></devtools-color-swatch>` :
712
- nothing,
713
- },
714
- {title: i18nString(UIStrings.orientation), content: orientation},
715
- {title: i18nString(UIStrings.display), content: display},
716
- ];
717
- if (completeNewNoteUrl) {
718
- fields.push({
719
- title: i18nString(UIStrings.newNoteUrl),
720
- content: hasNewNoteUrl ?
721
- Components.Linkifier.Linkifier.linkifyURL(completeNewNoteUrl, ({text: newNoteUrl, tabStop: true})) :
722
- nothing,
723
- });
724
- }
725
- setSectionContents(fields, presentationSection);
681
+ // clang-format off
682
+ return html`${renderSectionHeader(i18nString(UIStrings.presentation), output)}
683
+ <div class="report-section" jslog=${VisualLogging.section('presentation')}>
684
+ <devtools-report-key>${i18nString(UIStrings.startUrl)}</devtools-report-key>
685
+ <devtools-report-value>
686
+ ${completeStartUrl ? (() => {
687
+ const link = linkifyURL(completeStartUrl, {text: startUrl, tabStop: true, jslogContext: 'start-url'});
688
+ output.focusOnSection.set(i18nString(UIStrings.presentation), () => link.focus());
689
+ return link;
690
+ })() : nothing}
691
+ </devtools-report-value>
692
+ <devtools-report-key>${i18nString(UIStrings.themeColor)}</devtools-report-key>
693
+ <devtools-report-value>${themeColor
694
+ ? html`<devtools-color-swatch .color=${themeColor}></devtools-color-swatch>`
695
+ : nothing}
696
+ </devtools-report-value>
697
+ <devtools-report-key>${i18nString(UIStrings.backgroundColor)}</devtools-report-key>
698
+ <devtools-report-value>${backgroundColor
699
+ ? html`<devtools-color-swatch .color=${backgroundColor}></devtools-color-swatch>`
700
+ : nothing}
701
+ </devtools-report-value>
702
+ <devtools-report-key>${i18nString(UIStrings.orientation)}</devtools-report-key>
703
+ <devtools-report-value>${orientation}</devtools-report-value>
704
+ <devtools-report-key>${i18nString(UIStrings.display)}</devtools-report-key>
705
+ <devtools-report-value>${display}</devtools-report-value>
706
+ ${completeNewNoteUrl ? html`
707
+ <devtools-report-key>${i18nString(UIStrings.newNoteUrl)}</devtools-report-key>
708
+ <devtools-report-value>${hasNewNoteUrl
709
+ ? linkifyURL(completeNewNoteUrl, {text: newNoteUrl, tabStop: true})
710
+ : nothing}
711
+ </devtools-report-value>
712
+ ` : nothing}
713
+ </div>
714
+ `;
715
+ // clang-format on
726
716
  }
727
717
 
728
718
  function renderProtocolHandlers(data: ProtocolHandlersSectionData, output: ViewOutput): LitTemplate {
@@ -851,12 +841,13 @@ function renderScreenshots(data: ScreenshotsSectionData): LitTemplate {
851
841
  // clang-format on
852
842
  }
853
843
 
854
- function renderInstallability(
855
- installabilitySection: UI.ReportView.Section, installabilityErrors: Protocol.Page.InstallabilityError[]): void {
856
- installabilitySection.clearContent();
857
- installabilitySection.element.classList.toggle('hidden', !installabilityErrors.length);
858
- const errorMessages = getInstallabilityErrorMessages(installabilityErrors);
859
- setSectionContents(errorMessages.map(content => ({content})), installabilitySection);
844
+ function renderInstallability(installabilityErrors: Protocol.Page.InstallabilityError[]): LitTemplate {
845
+ return html`${renderSectionHeader(i18nString(UIStrings.installability))}
846
+ ${getInstallabilityErrorMessages(installabilityErrors).map(content => html`
847
+ <div class="report-row">
848
+ ${content}
849
+ </div>
850
+ `)}`;
860
851
  }
861
852
 
862
853
  function renderWindowControlsSection(
@@ -1040,23 +1031,8 @@ function renderWindowControls(
1040
1031
  // clang-format on
1041
1032
  }
1042
1033
 
1043
- function setSectionContents(items: ReportSectionItem[], section: UI.ReportView.Section): void {
1044
- for (const item of items) {
1045
- if (!item.title) {
1046
- render(item.content, section.appendRow());
1047
- continue;
1048
- }
1049
- const element = item.flexed ? section.appendFlexedField(item.title) : section.appendField(item.title);
1050
- if (item.label) {
1051
- UI.ARIAUtils.setLabel(element, item.label);
1052
- }
1053
- render(item.content, element);
1054
- }
1055
- }
1056
-
1057
1034
  interface ViewInput {
1058
- emptyView: UI.EmptyWidget.EmptyWidget;
1059
- reportView: UI.ReportView.ReportView;
1035
+ isEmpty?: boolean;
1060
1036
  errorsSection?: UI.ReportView.Section;
1061
1037
  installabilitySection?: UI.ReportView.Section;
1062
1038
  identitySection?: UI.ReportView.Section;
@@ -1082,6 +1058,7 @@ interface ViewInput {
1082
1058
  selectedPlatform?: string;
1083
1059
  onSelectOs?: (selectedOS: SDK.OverlayModel.EmulatedOSType) => Promise<void>;
1084
1060
  onToggleWcoToolbar?: (enabled: boolean) => Promise<void>;
1061
+ onCopyId?: () => void;
1085
1062
  onToggleIconMasked?: (masked: boolean) => void;
1086
1063
  }
1087
1064
 
@@ -1094,10 +1071,7 @@ type View = (input: ViewInput, output: ViewOutput, target: HTMLElement) => void;
1094
1071
 
1095
1072
  export const DEFAULT_VIEW: View = (input, output, target) => {
1096
1073
  const {
1097
- errorsSection,
1098
- installabilitySection,
1099
- identitySection,
1100
- presentationSection,
1074
+ isEmpty,
1101
1075
  identityData,
1102
1076
  presentationData,
1103
1077
  protocolHandlersData,
@@ -1114,23 +1088,24 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
1114
1088
  onSelectOs,
1115
1089
  onToggleWcoToolbar,
1116
1090
  onToggleIconMasked,
1091
+ onCopyId,
1092
+ url,
1117
1093
  } = input;
1118
- if (identitySection && identityData) {
1119
- renderIdentity(identitySection, identityData);
1120
- }
1121
- if (presentationSection && presentationData) {
1122
- renderPresentation(presentationSection, presentationData);
1123
- }
1124
- if (installabilitySection && installabilityErrors) {
1125
- renderInstallability(installabilitySection, installabilityErrors);
1126
- }
1127
- if (errorsSection) {
1128
- renderErrors(errorsSection, warnings, errors, imageErrors);
1129
- }
1130
1094
  // clang-format off
1131
1095
  render(html`
1132
1096
  <style>${appManifestViewStyles}</style>
1133
- <devtools-report>
1097
+ <style>${UI.inspectorCommonStyles}</style>
1098
+ ${isEmpty ? html`
1099
+ <devtools-widget .widgetConfig=${widgetConfig(UI.EmptyWidget.EmptyWidget, {
1100
+ header: i18nString(UIStrings.noManifestDetected),
1101
+ text: i18nString(UIStrings.manifestDescription),
1102
+ link: 'https://web.dev/add-manifest/' as Platform.DevToolsPath.UrlString
1103
+ })}></devtools-widget>` : html`
1104
+ <devtools-report .data=${{reportTitle: i18nString(UIStrings.appManifest), reportUrl: url}}>
1105
+ ${renderErrors(warnings, errors, imageErrors, output)}
1106
+ ${installabilityErrors?.length ? renderInstallability(installabilityErrors) : nothing}
1107
+ ${identityData && onCopyId ? renderIdentity(identityData, onCopyId, output) : nothing}
1108
+ ${presentationData ? renderPresentation(presentationData, output) : nothing}
1134
1109
  ${protocolHandlersData ? renderProtocolHandlers(protocolHandlersData, output) : nothing}
1135
1110
  ${iconsData && onToggleIconMasked && maskedIcons ?
1136
1111
  renderIcons(iconsData, maskedIcons, onToggleIconMasked, output) : nothing}
@@ -1138,18 +1113,12 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
1138
1113
  windowControlsData, selectedPlatform, onSelectOs, onToggleWcoToolbar, output) : nothing}
1139
1114
  ${shortcutsData ? renderShortcuts(shortcutsData) : nothing}
1140
1115
  ${screenshotsData ? renderScreenshots(screenshotsData) : nothing}
1141
- </devtools-report>`, target);
1116
+ </devtools-report>`}`, target);
1142
1117
  // clang-format on
1143
1118
  };
1144
1119
 
1145
1120
  export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes, typeof UI.Widget.VBox>(UI.Widget.VBox)
1146
1121
  implements SDK.TargetManager.Observer {
1147
- private readonly emptyView: UI.EmptyWidget.EmptyWidget;
1148
- private readonly reportView: UI.ReportView.ReportView;
1149
- private readonly errorsSection: UI.ReportView.Section;
1150
- private readonly installabilitySection: UI.ReportView.Section;
1151
- private readonly identitySection: UI.ReportView.Section;
1152
- private readonly presentationSection: UI.ReportView.Section;
1153
1122
  private registeredListeners: Common.EventTarget.EventDescriptor[];
1154
1123
  private target?: SDK.Target.Target;
1155
1124
  private resourceTreeModel?: SDK.ResourceTreeModel.ResourceTreeModel|null;
@@ -1172,29 +1141,6 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1172
1141
  });
1173
1142
  this.view = view;
1174
1143
 
1175
- this.contentElement.classList.add('manifest-container');
1176
-
1177
- this.emptyView = new UI.EmptyWidget.EmptyWidget(
1178
- i18nString(UIStrings.noManifestDetected), i18nString(UIStrings.manifestDescription));
1179
- this.emptyView.link = 'https://web.dev/add-manifest/' as Platform.DevToolsPath.UrlString;
1180
-
1181
- this.emptyView.show(this.contentElement);
1182
- this.emptyView.hideWidget();
1183
-
1184
- this.reportView = new UI.ReportView.ReportView(i18nString(UIStrings.appManifest));
1185
- this.reportView.registerRequiredCSS(appManifestViewStyles);
1186
- this.reportView.element.classList.add('manifest-view-header');
1187
- this.reportView.show(this.contentElement);
1188
- this.reportView.hideWidget();
1189
-
1190
- this.errorsSection =
1191
- this.reportView.appendSection(i18nString(UIStrings.errorsAndWarnings), undefined, 'errors-and-warnings');
1192
- this.installabilitySection =
1193
- this.reportView.appendSection(i18nString(UIStrings.installability), undefined, 'installability');
1194
- this.identitySection = this.reportView.appendSection(i18nString(UIStrings.identity), 'undefined,identity');
1195
- this.presentationSection =
1196
- this.reportView.appendSection(i18nString(UIStrings.presentation), 'undefined,presentation');
1197
-
1198
1144
  SDK.TargetManager.TargetManager.instance().observeTargets(this);
1199
1145
  this.registeredListeners = [];
1200
1146
 
@@ -1207,50 +1153,22 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1207
1153
 
1208
1154
  scrollToSection(sectionTitle: string): void {
1209
1155
  const handler = this.output.scrollToSection.get(sectionTitle);
1210
- if (handler) {
1211
- handler();
1212
- } else {
1213
- const section = this.getManifestSections().find(s => s.title() === sectionTitle);
1214
- if (section) {
1215
- section.getTitleElement().scrollIntoView();
1216
- }
1156
+ if (!handler) {
1157
+ return;
1217
1158
  }
1159
+ handler();
1218
1160
  UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.onInvokeAlert, {PH1: sectionTitle}));
1219
1161
  }
1220
1162
 
1221
- getFieldElementForSection(sectionTitle: string): HTMLElement|null {
1222
- const section = this.getManifestSections().find(s => s.title() === sectionTitle);
1223
- return section ? section.getFieldElement() : null;
1224
- }
1225
-
1226
1163
  focusOnSection(sectionTitle: string): boolean {
1227
1164
  const handler = this.output.focusOnSection.get(sectionTitle);
1228
- if (handler) {
1229
- handler();
1230
- return true;
1231
- }
1232
- const sectionFieldElement = this.getFieldElementForSection(sectionTitle);
1233
- if (!sectionFieldElement) {
1165
+ if (!handler) {
1234
1166
  return false;
1235
1167
  }
1236
- const checkBoxElement = sectionFieldElement.querySelector('.mask-checkbox');
1237
- let focusableElement: HTMLElement|null = sectionFieldElement.querySelector('[tabindex="0"]');
1238
- if (checkBoxElement?.shadowRoot) {
1239
- focusableElement = checkBoxElement.shadowRoot.querySelector('input') || null;
1240
- }
1241
- if (focusableElement) {
1242
- focusableElement.focus();
1243
- return true;
1244
- }
1245
- return false;
1168
+ handler();
1169
+ return true;
1246
1170
  }
1247
1171
 
1248
- private getManifestSections(): UI.ReportView.Section[] {
1249
- return [
1250
- this.identitySection,
1251
- this.presentationSection,
1252
- ];
1253
- }
1254
1172
  getStaticSections(): Array<{title: string, jslogContext: string|undefined}> {
1255
1173
  return [
1256
1174
  {title: i18nString(UIStrings.identity), jslogContext: 'identity'},
@@ -1262,7 +1180,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1262
1180
  }
1263
1181
 
1264
1182
  getManifestElement(): Element {
1265
- return this.reportView.getHeaderElement();
1183
+ return this.contentElement;
1266
1184
  }
1267
1185
 
1268
1186
  targetAdded(target: SDK.Target.Target): void {
@@ -1339,23 +1257,14 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1339
1257
  const appId = appIdResponse?.appId || null;
1340
1258
  const recommendedId = appIdResponse?.recommendedId || null;
1341
1259
  if ((!data || data === '{}') && !errors.length) {
1342
- this.emptyView.showWidget();
1343
- this.reportView.hideWidget();
1344
- this.view({emptyView: this.emptyView, reportView: this.reportView}, this.output, this.contentElement);
1260
+ this.view({isEmpty: true}, this.output, this.contentElement);
1345
1261
  this.dispatchEventToListeners(Events.MANIFEST_DETECTED, false);
1346
1262
  return;
1347
1263
  }
1348
- this.emptyView.hideWidget();
1349
- this.reportView.showWidget();
1350
1264
  this.dispatchEventToListeners(Events.MANIFEST_DETECTED, true);
1351
1265
 
1352
- const link = Components.Linkifier.Linkifier.linkifyURL(url, {tabStop: true});
1353
- this.reportView.setURL(link);
1354
-
1355
1266
  if (!data) {
1356
- this.view(
1357
- {emptyView: this.emptyView, reportView: this.reportView, errorsSection: this.errorsSection, errors},
1358
- this.output, this.contentElement);
1267
+ this.view({url, errors}, this.output, this.contentElement);
1359
1268
  return;
1360
1269
  }
1361
1270
 
@@ -1393,18 +1302,16 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1393
1302
  (selectedOS: SDK.OverlayModel.EmulatedOSType) => this.onSelectOs(selectedOS, windowControlsData.themeColor) :
1394
1303
  undefined;
1395
1304
  const onToggleWcoToolbar = this.overlayModel ? (enabled: boolean) => this.onToggleWcoToolbar(enabled) : undefined;
1305
+ const onCopyId = recommendedId ? () : void => {
1306
+ UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.copiedToClipboard, {PH1: recommendedId}));
1307
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(recommendedId);
1308
+ }: undefined;
1396
1309
  const onToggleIconMasked = (masked: boolean): void => {
1397
1310
  this.maskedIcons = masked;
1398
1311
  this.requestUpdate();
1399
1312
  };
1400
1313
  this.view(
1401
1314
  {
1402
- emptyView: this.emptyView,
1403
- reportView: this.reportView,
1404
- errorsSection: this.errorsSection,
1405
- installabilitySection: this.installabilitySection,
1406
- identitySection: this.identitySection,
1407
- presentationSection: this.presentationSection,
1408
1315
  maskedIcons: this.maskedIcons,
1409
1316
  parsedManifest,
1410
1317
  url,
@@ -1422,6 +1329,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1422
1329
  selectedPlatform,
1423
1330
  onSelectOs,
1424
1331
  onToggleWcoToolbar,
1332
+ onCopyId,
1425
1333
  onToggleIconMasked,
1426
1334
  },
1427
1335
  this.output, this.contentElement);
@@ -1454,6 +1362,8 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1454
1362
  initiatorUrl: this.target.inspectedURL(),
1455
1363
  },
1456
1364
  /* isBinary=*/ true);
1365
+ // Just loading the image, not building UI.
1366
+ /* eslint-disable @devtools/no-imperative-dom-api */
1457
1367
  const image = document.createElement('img');
1458
1368
  const result = new Promise((resolve, reject) => {
1459
1369
  image.onload = resolve;
@@ -1463,6 +1373,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1463
1373
  // does not work, we can parse mimeType out of the response headers
1464
1374
  // using front_end/core/platform/MimeType.ts.
1465
1375
  image.src = 'data:application/octet-stream;base64,' + await Common.Base64.encode(content);
1376
+ /* eslint-enable @devtools/no-imperative-dom-api */
1466
1377
  try {
1467
1378
  await result;
1468
1379
  return {naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight, src: image.src};
@@ -184,6 +184,7 @@ export class CookieItemsView extends UI.Widget.VBox {
184
184
  this.#toolbar.show(this.element);
185
185
 
186
186
  this.cookiesTable = new CookieTable.CookiesTable.CookiesTable(
187
+ undefined,
187
188
  /* renderInline */ false, this.saveCookie.bind(this), this.refreshItems.bind(this),
188
189
  this.handleCookieSelected.bind(this), this.deleteCookie.bind(this));
189
190
 
@@ -3,6 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import type * as Platform from '../../core/platform/platform.js';
6
+ import {createIcon} from '../../ui/kit/kit.js';
6
7
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
7
8
 
8
9
  import {ApplicationPanelTreeElement} from './ApplicationPanelTreeElement.js';
@@ -22,6 +23,8 @@ export class SharedStorageTreeElement extends ApplicationPanelTreeElement {
22
23
  const treeElement = new SharedStorageTreeElement(resourcesPanel, sharedStorage);
23
24
  treeElement.view = await SharedStorageItemsView.createView(sharedStorage);
24
25
  treeElement.view.element.setAttribute('jslog', `${VisualLogging.pane('shared-storage-data')}`);
26
+ const sharedStorageIcon = createIcon('database');
27
+ treeElement.setLeadingIcons([sharedStorageIcon]);
25
28
  return treeElement;
26
29
  }
27
30
 
@@ -13,7 +13,7 @@
13
13
  flex-grow: 0;
14
14
  }
15
15
 
16
- .manifest-container {
16
+ :host {
17
17
  overflow: auto;
18
18
  }
19
19
 
@@ -982,10 +982,11 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
982
982
  const renderResult = await UI.UIUtils.Renderer.render(node);
983
983
  if (renderResult) {
984
984
  this.selectableChildren.push(renderResult);
985
- const resizeObserver = new ResizeObserver(() => {
985
+ // FIXME: this should not be needed once ConsoleViewMessage is rendering
986
+ // declaratively and the tree outline auto-resizes itself.
987
+ renderResult.element.addEventListener('dimensionschanged', () => {
986
988
  this.messageResized({data: renderResult.element});
987
989
  });
988
- resizeObserver.observe(renderResult.element);
989
990
  result.appendChild(renderResult.element);
990
991
  } else {
991
992
  result.appendChild(this.formatParameterAsObject(remoteObject, false));
@@ -1185,7 +1186,7 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
1185
1186
  }
1186
1187
 
1187
1188
  matchesFilterText(filter: string): boolean {
1188
- const text = this.contentElement().deepTextContent();
1189
+ const text = this.contentElement().deepTextContent() + this.message.messageText;
1189
1190
  return text.toLowerCase().includes(filter.toLowerCase());
1190
1191
  }
1191
1192