chrome-devtools-frontend 1.0.1555174 → 1.0.1556696

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 (156) hide show
  1. package/front_end/core/protocol_client/InspectorBackend.ts +1 -1
  2. package/front_end/core/root/Runtime.ts +0 -4
  3. package/front_end/core/sdk/DOMModel.ts +101 -7
  4. package/front_end/entrypoints/formatter_worker/FormatterActions.ts +2 -0
  5. package/front_end/entrypoints/formatter_worker/ScopeParser.ts +75 -7
  6. package/front_end/entrypoints/formatter_worker/Substitute.ts +1 -1
  7. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  8. package/front_end/generated/protocol.ts +0 -1
  9. package/front_end/models/ai_assistance/AiConversation.ts +71 -10
  10. package/front_end/models/ai_assistance/ArtifactsManager.ts +67 -0
  11. package/front_end/models/ai_assistance/ConversationHandler.ts +3 -2
  12. package/front_end/models/ai_assistance/agents/AiAgent.ts +17 -27
  13. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +152 -4
  14. package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -2
  15. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  16. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -1
  17. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +0 -2
  18. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -1
  19. package/front_end/{ui/components → models}/annotations/AnnotationRepository.ts +4 -4
  20. package/front_end/models/annotations/README.md +7 -0
  21. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  22. package/front_end/models/greendev/Prototypes.ts +56 -0
  23. package/front_end/models/greendev/README.md +5 -0
  24. package/front_end/models/greendev/greendev.ts +5 -0
  25. package/front_end/models/stack_trace/StackTrace.ts +13 -2
  26. package/front_end/models/stack_trace/StackTraceImpl.ts +81 -6
  27. package/front_end/models/stack_trace/StackTraceModel.ts +35 -3
  28. package/front_end/models/trace/extras/TraceTree.ts +4 -2
  29. package/front_end/models/trace/insights/LCPDiscovery.ts +0 -2
  30. package/front_end/models/trace/types/TraceEvents.ts +0 -1
  31. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +116 -70
  32. package/front_end/panels/ai_assistance/aiAssistancePanel.css +16 -0
  33. package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +159 -0
  34. package/front_end/panels/ai_assistance/components/ChatView.ts +3 -2
  35. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +7 -8
  36. package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +15 -8
  37. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +9 -9
  38. package/front_end/panels/ai_assistance/components/artifactsViewer.css +15 -0
  39. package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +5 -6
  40. package/front_end/panels/application/AppManifestView.ts +263 -205
  41. package/front_end/panels/application/ApplicationPanelSidebar.ts +24 -57
  42. package/front_end/panels/application/OpenedWindowDetailsView.ts +2 -0
  43. package/front_end/panels/application/ServiceWorkersView.ts +2 -0
  44. package/front_end/panels/application/StorageView.ts +1 -0
  45. package/front_end/panels/application/appManifestView.css +48 -0
  46. package/front_end/panels/application/components/ProtocolHandlersView.ts +2 -2
  47. package/front_end/panels/application/preloading/PreloadingView.ts +12 -6
  48. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +230 -237
  49. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +96 -79
  50. package/front_end/panels/application/preloading/components/preloadingGrid.css +26 -29
  51. package/front_end/panels/application/preloading/preloadingView.css +6 -0
  52. package/front_end/panels/common/Annotation.ts +1 -1
  53. package/front_end/panels/common/AnnotationManager.ts +1 -1
  54. package/front_end/panels/common/ExtensionView.ts +1 -0
  55. package/front_end/panels/console/ConsoleContextSelector.ts +74 -9
  56. package/front_end/panels/console/consoleContextSelector.css +31 -29
  57. package/front_end/panels/coverage/coverageListView.css +59 -57
  58. package/front_end/panels/elements/ElementsPanel.ts +1 -1
  59. package/front_end/panels/elements/ElementsTreeElement.ts +39 -1
  60. package/front_end/panels/elements/ElementsTreeOutline.ts +23 -21
  61. package/front_end/panels/elements/TopLayerContainer.ts +26 -91
  62. package/front_end/panels/explain/components/ConsoleInsight.ts +3 -3
  63. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +4 -8
  64. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +148 -97
  65. package/front_end/panels/linear_memory_inspector/components/LinearMemoryViewer.ts +1 -1
  66. package/front_end/panels/linear_memory_inspector/components/linearMemoryValueInterpreter.css +37 -35
  67. package/front_end/panels/network/NetworkItemView.ts +1 -1
  68. package/front_end/panels/network/NetworkLogView.ts +1 -1
  69. package/front_end/panels/network/NetworkPanel.ts +1 -1
  70. package/front_end/panels/recorder/RecorderController.ts +0 -1
  71. package/front_end/panels/security/SecurityPanelSidebar.ts +5 -0
  72. package/front_end/panels/settings/SettingsScreen.ts +133 -1
  73. package/front_end/panels/settings/settings-meta.ts +24 -0
  74. package/front_end/panels/settings/settingsScreen.css +4 -0
  75. package/front_end/panels/sources/UISourceCodeFrame.ts +3 -17
  76. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -8
  77. package/front_end/panels/timeline/components/TimelineSummary.ts +75 -54
  78. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +18 -26
  79. package/front_end/panels/timeline/components/insights/Cache.ts +12 -8
  80. package/front_end/panels/timeline/components/insights/DOMSize.ts +25 -21
  81. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +7 -7
  82. package/front_end/panels/timeline/components/insights/FontDisplay.ts +7 -5
  83. package/front_end/panels/timeline/components/insights/ForcedReflow.ts +11 -9
  84. package/front_end/panels/timeline/components/insights/INPBreakdown.ts +7 -6
  85. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +7 -5
  86. package/front_end/panels/timeline/components/insights/InsightRenderer.ts +20 -18
  87. package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +12 -12
  88. package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +7 -7
  89. package/front_end/panels/timeline/components/insights/ModernHTTP.ts +7 -5
  90. package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +15 -13
  91. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +2 -2
  92. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +15 -14
  93. package/front_end/panels/timeline/components/insights/Table.ts +152 -130
  94. package/front_end/panels/timeline/components/insights/ThirdParties.ts +11 -9
  95. package/front_end/panels/timeline/components/timelineSummary.css +58 -57
  96. package/front_end/panels/timeline/thirdPartyTreeView.css +109 -0
  97. package/front_end/panels/timeline/timelineDetailsView.css +2 -4
  98. package/front_end/panels/timeline/timelinePanel.css +0 -110
  99. package/front_end/third_party/acorn/estree-legacy.d.ts +2 -0
  100. package/front_end/third_party/chromium/README.chromium +1 -1
  101. package/front_end/third_party/puppeteer/README.chromium +2 -2
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Connection.d.ts.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +21 -7
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.d.ts.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +15 -6
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.d.ts.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Connection.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +21 -7
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.d.ts.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  133. package/front_end/third_party/puppeteer/package/package.json +2 -2
  134. package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +1 -2
  135. package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +2 -4
  136. package/front_end/third_party/puppeteer/package/src/api/Frame.ts +2 -4
  137. package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -4
  138. package/front_end/third_party/puppeteer/package/src/bidi/core/Connection.ts +3 -2
  139. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +29 -10
  140. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +3 -3
  141. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  142. package/front_end/ui/components/report_view/ReportView.docs.ts +37 -0
  143. package/front_end/ui/components/report_view/ReportView.ts +1 -4
  144. package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
  145. package/front_end/ui/legacy/Floaty.ts +5 -9
  146. package/front_end/ui/legacy/InspectorView.ts +2 -1
  147. package/front_end/ui/legacy/ReportView.ts +5 -4
  148. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  149. package/front_end/ui/legacy/ViewManager.ts +2 -32
  150. package/front_end/ui/legacy/Widget.ts +7 -0
  151. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -1
  152. package/front_end/ui/legacy/reportView.css +0 -24
  153. package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
  154. package/package.json +1 -1
  155. /package/front_end/{ui/components → models}/annotations/AnnotationType.ts +0 -0
  156. /package/front_end/{ui/components → models}/annotations/annotations.ts +0 -0
@@ -3,8 +3,8 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-imperative-dom-api, @devtools/no-lit-render-outside-of-view */
5
5
 
6
- import '../../ui/kit/kit.js';
7
6
  import '../../ui/legacy/components/inline_editor/inline_editor.js';
7
+ import '../../ui/components/report_view/report_view.js';
8
8
 
9
9
  import * as Common from '../../core/common/common.js';
10
10
  import * as Host from '../../core/host/host.js';
@@ -15,12 +15,16 @@ import type * as Protocol from '../../generated/protocol.js';
15
15
  import * as Buttons from '../../ui/components/buttons/buttons.js';
16
16
  import * as Components from '../../ui/legacy/components/utils/utils.js';
17
17
  import * as UI from '../../ui/legacy/legacy.js';
18
- import {html, i18nTemplate, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
18
+ import {Directives, html, i18nTemplate, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
19
19
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
20
20
 
21
21
  import appManifestViewStyles from './appManifestView.css.js';
22
22
  import * as ApplicationComponents from './components/components.js';
23
23
 
24
+ const {classMap, ref} = Directives;
25
+ const {linkifyURL} = Components.Linkifier.Linkifier;
26
+ const {widgetConfig} = UI.Widget;
27
+
24
28
  const UIStrings = {
25
29
  /**
26
30
  * @description Text in App Manifest View of the Application panel
@@ -446,6 +450,11 @@ const UIStrings = {
446
450
  * @description Text for emulation OS selection dropdown
447
451
  */
448
452
  selectWindowControlsOverlayEmulationOs: 'Emulate the Window Controls Overlay on',
453
+ /**
454
+ * @description Alert message for screen reader to announce which subsection is being scrolled to
455
+ * @example {"Identity"} PH1
456
+ */
457
+ onInvokeAlert: 'Scrolled to {PH1}',
449
458
  } as const;
450
459
  const str_ = i18n.i18n.registerUIStrings('panels/application/AppManifestView.ts', UIStrings);
451
460
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -592,6 +601,18 @@ type ProcessedImageResource = {
592
601
  imageSrc: string,
593
602
  };
594
603
 
604
+ function renderSectionHeader(text: Platform.UIString.LocalizedString, output?: ViewOutput): LitTemplate {
605
+ // clang-format off
606
+ return html`
607
+ <devtools-report-section-header
608
+ ${ref(e => { if (output && e instanceof HTMLElement) {
609
+ output.scrollToSection.set(text, () => { e.scrollIntoView(); });
610
+ }})}>
611
+ ${text}
612
+ </devtools-report-section-header>`;
613
+ // clang-format on
614
+ }
615
+
595
616
  function renderErrors(
596
617
  errorsSection: UI.ReportView.Section, warnings?: Platform.UIString.LocalizedString[],
597
618
  manifestErrors?: Protocol.Page.AppManifestError[], imageErrors?: Platform.UIString.LocalizedString[]): void {
@@ -704,11 +725,18 @@ function renderPresentation(
704
725
  setSectionContents(fields, presentationSection);
705
726
  }
706
727
 
707
- function renderProtocolHandlers(
708
- protocolHandlersView: ApplicationComponents.ProtocolHandlersView.ProtocolHandlersView,
709
- data: ProtocolHandlersSectionData): void {
710
- protocolHandlersView.protocolHandlers = data.protocolHandlers;
711
- protocolHandlersView.manifestLink = data.manifestLink;
728
+ function renderProtocolHandlers(data: ProtocolHandlersSectionData, output: ViewOutput): LitTemplate {
729
+ // clang-format off
730
+ return html`${renderSectionHeader(i18nString(UIStrings.protocolHandlers), output)}
731
+ <div class="report-row">
732
+ <devtools-widget .widgetConfig=${widgetConfig(
733
+ ApplicationComponents.ProtocolHandlersView.ProtocolHandlersView,
734
+ {protocolHandlers: data.protocolHandlers, manifestLink: data.manifestLink})}
735
+ ${ref(setFocusOnSection(i18nString(UIStrings.protocolHandlers), output))}>
736
+ </devtools-widget>
737
+ </div>
738
+ <devtools-report-divider></devtools-report-divider>`;
739
+ // clang-format on
712
740
  }
713
741
 
714
742
  function renderImage(imageSrc: string, imageUrl: string, naturalWidth: number): LitTemplate {
@@ -721,109 +749,106 @@ function renderImage(imageSrc: string, imageUrl: string, naturalWidth: number):
721
749
  // clang-format on
722
750
  }
723
751
 
724
- function renderIcons(iconsSection: UI.ReportView.Section, data: IconsSectionData): void {
725
- iconsSection.clearContent();
726
-
727
- const contents: ReportSectionItem[] = [
728
- // clang-format off
729
- {
730
- content: html`<devtools-checkbox class="mask-checkbox"
731
- jslog=${VisualLogging.toggle('show-minimal-safe-area-for-maskable-icons')
732
- .track({change: true})}
733
- @click=${(event: Event) => {
734
- iconsSection.setIconMasked((event.target as HTMLInputElement).checked);
735
- }}>
736
- ${i18nString(UIStrings.showOnlyTheMinimumSafeAreaFor)}
737
- </devtools-checkbox>`},
738
- // clang-format on
739
- {
740
- content: i18nTemplate(str_, UIStrings.needHelpReadOurS, {
741
- PH1: html`
742
- <devtools-link href="https://web.dev/maskable-icon/" .jslogContext=${'learn-more'}>
743
- ${i18nString(UIStrings.documentationOnMaskableIcons)}
744
- </devtools-link>`,
745
- }),
746
- },
747
- ];
748
- for (const [title, images] of data.icons) {
749
- const content = images.filter(icon => 'imageSrc' in icon)
750
- .map(icon => renderImage(icon.imageSrc, icon.imageUrl, icon.naturalWidth));
751
- contents.push({title, content, flexed: true});
752
- }
753
- setSectionContents(contents, iconsSection);
754
- }
755
-
756
- function renderShortcuts(
757
- reportView: UI.ReportView.ReportView, shortcutSections: UI.ReportView.Section[], data: ShortcutsSectionData): void {
758
- for (const shortcutsSection of shortcutSections) {
759
- shortcutsSection.detach(/** overrideHideOnDetach= */ true);
760
- }
761
- shortcutSections.length = 0;
762
-
763
- let shortcutIndex = 1;
764
- for (const shortcut of data.shortcuts) {
765
- const shortcutSection = reportView.appendSection(i18nString(UIStrings.shortcutS, {PH1: shortcutIndex}));
766
- shortcutSection.element.setAttribute('jslog', `${VisualLogging.section('shortcuts')}`);
767
- shortcutSections.push(shortcutSection);
768
-
769
- const fields: ReportSectionItem[] = [
770
- {title: i18nString(UIStrings.name), flexed: true, content: shortcut.name},
771
- ];
772
- if (shortcut.shortName) {
773
- fields.push({title: i18nString(UIStrings.shortName), flexed: true, content: shortcut.shortName});
752
+ function setFocusOnSection(section: Platform.UIString.LocalizedString, output: ViewOutput): (e: Element|undefined) =>
753
+ void {
754
+ return (e: Element|undefined) => {
755
+ if (e instanceof HTMLElement) {
756
+ output.focusOnSection.set(section, () => e.focus());
774
757
  }
775
- if (shortcut.description) {
776
- fields.push({title: i18nString(UIStrings.description), flexed: true, content: shortcut.description});
777
- }
778
- fields.push({
779
- title: i18nString(UIStrings.url),
780
- flexed: true,
781
- content: Components.Linkifier.Linkifier.linkifyURL(
782
- shortcut.shortcutUrl, ({text: shortcut.url, tabStop: true, jslogContext: 'shortcut'})),
783
- });
784
-
785
- for (const [title, images] of shortcut.icons) {
786
- const content = images.filter(icon => 'imageSrc' in icon)
787
- .map(icon => renderImage(icon.imageSrc, icon.imageUrl, icon.naturalWidth));
788
- fields.push({title, content, flexed: true});
789
- }
790
- setSectionContents(fields, shortcutSection);
791
- shortcutIndex++;
792
- }
758
+ };
793
759
  }
794
760
 
795
- function renderScreenshots(
796
- reportView: UI.ReportView.ReportView, screenshotsSections: UI.ReportView.Section[],
797
- data: ScreenshotsSectionData): void {
798
- for (const screenshotSection of screenshotsSections) {
799
- screenshotSection.detach(/** overrideHideOnDetach= */ true);
800
- }
801
- screenshotsSections.length = 0;
802
-
803
- let screenshotIndex = 1;
804
- for (const processedScreenshot of data.screenshots) {
805
- const {screenshot, processedImage} = processedScreenshot;
806
- const screenshotSection = reportView.appendSection(i18nString(UIStrings.screenshotS, {PH1: screenshotIndex}));
807
- screenshotsSections.push(screenshotSection);
808
- const fields: ReportSectionItem[] = [];
761
+ function renderIcons(
762
+ data: IconsSectionData, maskedIcons: boolean, onToggleIconMasked: (value: boolean) => void,
763
+ output: ViewOutput): LitTemplate {
764
+ // clang-format off
765
+ return html`${renderSectionHeader(i18nString(UIStrings.icons), output)}
766
+ <div class="report-section" jslog=${VisualLogging.section('icons')}>
767
+ <div class="report-row">
768
+ <devtools-checkbox class="mask-checkbox"
769
+ jslog=${VisualLogging.toggle('show-minimal-safe-area-for-maskable-icons')
770
+ .track({change: true})}
771
+ @click=${(event: Event) => onToggleIconMasked((event.target as HTMLInputElement).checked)}
772
+ ${ref(setFocusOnSection(i18nString(UIStrings.icons), output))}>
773
+ ${i18nString(UIStrings.showOnlyTheMinimumSafeAreaFor)}
774
+ </devtools-checkbox>
775
+ </div>
776
+ <div class="report-row">
777
+ ${i18nTemplate(str_, UIStrings.needHelpReadOurS, {
778
+ PH1: html`
779
+ <devtools-link href="https://web.dev/maskable-icon/" .jslogContext=${'learn-more'}>
780
+ ${i18nString(UIStrings.documentationOnMaskableIcons)}
781
+ </devtools-link>`,
782
+ })}
783
+ </div>
784
+ ${Array.from(data.icons).map(([title, images]: [string, ProcessedImageResource[]]) => {
785
+ return html`
786
+ <devtools-report-key>${title}</devtools-report-key>
787
+ <devtools-report-value class=${classMap({'show-mask': Boolean(maskedIcons)})}>
788
+ ${images.filter(icon => 'imageSrc' in icon)
789
+ .map(icon => renderImage(icon.imageSrc, icon.imageUrl, icon.naturalWidth))}
790
+ </devtools-report-value>
791
+ `;})}
792
+ </div>`;
793
+ // clang-format on
794
+ }
809
795
 
810
- if (screenshot.form_factor) {
811
- fields.push({title: i18nString(UIStrings.formFactor), flexed: true, content: screenshot.form_factor});
812
- }
813
- if (screenshot.label) {
814
- fields.push({title: i18nString(UIStrings.label), flexed: true, content: screenshot.label});
815
- }
816
- if (screenshot.platform) {
817
- fields.push({title: i18nString(UIStrings.platform), flexed: true, content: screenshot.platform});
818
- }
796
+ function renderShortcuts(data: ShortcutsSectionData): LitTemplate {
797
+ // clang-format off
798
+ return html`${data.shortcuts.map((shortcut, index) => html`
799
+ ${renderSectionHeader(i18nString(UIStrings.shortcutS, {PH1: index + 1}))}
800
+ <div class="report-section" jslog=${VisualLogging.section('shortcuts')}>
801
+ <devtools-report-key>${i18nString(UIStrings.name)}</devtools-report-key>
802
+ <devtools-report-value>${shortcut.name}</devtools-report-value>
803
+ ${shortcut.shortName ? html`
804
+ <devtools-report-key>${i18nString(UIStrings.shortName)}</devtools-report-key>
805
+ <devtools-report-value>${shortcut.shortName}</devtools-report-value>
806
+ ` : nothing}
807
+ ${shortcut.description ? html`
808
+ <devtools-report-key>${i18nString(UIStrings.description)}</devtools-report-key>
809
+ <devtools-report-value>${shortcut.description}</devtools-report-value>
810
+ ` : nothing}
811
+ <devtools-report-key>${i18nString(UIStrings.url)}</devtools-report-key>
812
+ <devtools-report-value>
813
+ ${linkifyURL(shortcut.shortcutUrl, {text: shortcut.url, tabStop: true, jslogContext: 'shortcut'})}
814
+ </devtools-report-value>
815
+ ${Array.from(shortcut.icons).map(([title, images]) => html`
816
+ <devtools-report-key>${title}</devtools-report-key>
817
+ <devtools-report-value>
818
+ ${images.filter(icon => 'imageSrc' in icon)
819
+ .map(icon => renderImage(icon.imageSrc, icon.imageUrl, icon.naturalWidth))}
820
+ </devtools-report-value>
821
+ `)}
822
+ </div>`)}`;
823
+ // clang-format on
824
+ }
819
825
 
820
- if ('imageSrc' in processedImage) {
821
- const content = renderImage(processedImage.imageSrc, processedImage.imageUrl, processedImage.naturalWidth);
822
- fields.push({title: processedImage.title, content, flexed: true});
823
- }
824
- setSectionContents(fields, screenshotSection);
825
- screenshotIndex++;
826
- }
826
+ function renderScreenshots(data: ScreenshotsSectionData): LitTemplate {
827
+ // clang-format off
828
+ return html`${data.screenshots.map(({screenshot, processedImage}, index) => html`
829
+ ${renderSectionHeader(i18nString(UIStrings.screenshotS, {PH1: index + 1}))}
830
+ <div class="report-section" jslog=${VisualLogging.section('screenshots')}>
831
+ ${screenshot.form_factor
832
+ ? html`<devtools-report-key>${i18nString(UIStrings.formFactor)}</devtools-report-key>
833
+ <devtools-report-value>${screenshot.form_factor}</devtools-report-value>`
834
+ : nothing}
835
+ ${screenshot.label
836
+ ? html`<devtools-report-key>${i18nString(UIStrings.label)}</devtools-report-key>
837
+ <devtools-report-value>${screenshot.label}</devtools-report-value>`
838
+ : nothing}
839
+ ${screenshot.platform
840
+ ? html`<devtools-report-key>${i18nString(UIStrings.platform)}</devtools-report-key>
841
+ <devtools-report-value>${screenshot.platform}</devtools-report-value>`
842
+ : nothing}
843
+ ${'imageSrc' in processedImage ? html`
844
+ <devtools-report-key>${processedImage.title}</devtools-report-key>
845
+ <devtools-report-value>
846
+ ${renderImage(processedImage.imageSrc, processedImage.imageUrl, processedImage.naturalWidth)}
847
+ </devtools-report-value>`
848
+ : nothing}
849
+ </div>
850
+ `)}`;
851
+ // clang-format on
827
852
  }
828
853
 
829
854
  function renderInstallability(
@@ -835,52 +860,52 @@ function renderInstallability(
835
860
  }
836
861
 
837
862
  function renderWindowControlsSection(
838
- windowControlsSection: UI.ReportView.Section, data: WindowControlsSectionData, selectedPlatform?: string,
839
- onSelectOs?: (selectedOS: SDK.OverlayModel.EmulatedOSType) => Promise<void>,
840
- onToggleWcoToolbar?: (enabled: boolean) => Promise<void>): void {
841
- const {hasWco, url} = data;
842
- const contents: ReportSectionItem[] = [];
843
- if (hasWco) {
844
- // clang-format off
845
- contents.push({content: html`
846
- <devtools-icon class="inline-icon" name="check-circle"></devtools-icon>
847
- ${i18nTemplate(str_, UIStrings.wcoFound, {
848
- PH1: html`<code class="wco">window-controls-overlay</code>`,
849
- PH2: html`<code>
850
- <devtools-link href="https://developer.mozilla.org/en-US/docs/Web/Manifest/display_override"
851
- .jslogContext=${'display-override'}>
852
- display-override
853
- </devtools-link>
854
- </code>`,
855
- PH3: html`${Components.Linkifier.Linkifier.linkifyURL(url)}`,
856
- })}`});
857
- // clang-format on
858
- if (selectedPlatform && onSelectOs && onToggleWcoToolbar) {
859
- const controls = renderWindowControls(selectedPlatform, onSelectOs, onToggleWcoToolbar);
860
- contents.push(controls);
861
- }
862
- } else {
863
- // clang-format off
864
- contents.push({content: html`
865
- <devtools-icon class="inline-icon" name="info"></devtools-icon>
866
- ${i18nTemplate(str_, UIStrings.wcoNotFound, {
867
- PH1: html`<code>
868
- <devtools-link href="https://developer.mozilla.org/en-US/docs/Web/Manifest/display_override"
869
- .jslogContext=${'display-override'}>
870
- display-override
871
- </devtools-link>
872
- </code>`})}`});
873
- // clang-format on
874
- }
863
+ data: WindowControlsSectionData, selectedPlatform: string|undefined,
864
+ onSelectOs: ((selectedOS: SDK.OverlayModel.EmulatedOSType) => Promise<void>)|undefined,
865
+ onToggleWcoToolbar: ((enabled: boolean) => Promise<void>)|undefined, output: ViewOutput): LitTemplate {
875
866
  // clang-format off
876
- contents.push({content: i18nTemplate(str_, UIStrings.wcoNeedHelpReadMore, { PH1: html`<devtools-link
877
- href="https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/window-controls-overlay"
878
- .jslogContext=${'customize-pwa-tittle-bar'}>
879
- ${i18nString(UIStrings.customizePwaTitleBar)}
880
- </devtools-link>`})});
867
+ return html`
868
+ ${renderSectionHeader(i18nString(UIStrings.windowControlsOverlay), output)}
869
+ <div class="report-section" jslog=${VisualLogging.section('window-controls-overlay')}>
870
+ ${data?.hasWco && output ? html`
871
+ <div class="report-row">
872
+ <devtools-icon class="inline-icon" name="check-circle"></devtools-icon>
873
+ ${i18nTemplate(str_, UIStrings.wcoFound, {
874
+ PH1: html`<code class="wco">window-controls-overlay</code>`,
875
+ PH2: html`<code>
876
+ <devtools-link
877
+ href="https://developer.mozilla.org/en-US/docs/Web/Manifest/display_override"
878
+ .jslogContext=${'display-override'}
879
+ ${ref(setFocusOnSection(i18nString(UIStrings.windowControlsOverlay), output))}>
880
+ display-override
881
+ </devtools-link>
882
+ </code>`,
883
+ PH3: html`${Components.Linkifier.Linkifier.linkifyURL(data.url)}`,
884
+ })}
885
+ </div>
886
+ ${selectedPlatform && onSelectOs && onToggleWcoToolbar ?
887
+ renderWindowControls(selectedPlatform, onSelectOs, onToggleWcoToolbar) :
888
+ nothing}` : html`
889
+ <div class="report-row">
890
+ <devtools-icon class="inline-icon" name="info"></devtools-icon>
891
+ ${i18nTemplate(str_, UIStrings.wcoNotFound, {PH1: html`<code>
892
+ <devtools-link
893
+ href="https://developer.mozilla.org/en-US/docs/Web/Manifest/display_override"
894
+ .jslogContext=${'display-override'}
895
+ ${ref(setFocusOnSection(i18nString(UIStrings.windowControlsOverlay), output))}>
896
+ display-override
897
+ </devtools-link>
898
+ </code>`})}
899
+ </div>`}
900
+ <div class="report-row">
901
+ ${i18nTemplate(str_, UIStrings.wcoNeedHelpReadMore, {PH1: html`<devtools-link
902
+ href="https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/window-controls-overlay"
903
+ .jslogContext=${'customize-pwa-tittle-bar'}>
904
+ ${i18nString(UIStrings.customizePwaTitleBar)}
905
+ </devtools-link>`})}
906
+ </div>
907
+ </div>`;
881
908
  // clang-format on
882
- windowControlsSection.clearContent();
883
- setSectionContents(contents, windowControlsSection);
884
909
  }
885
910
 
886
911
  function getInstallabilityErrorMessages(installabilityErrors: Protocol.Page.InstallabilityError[]): string[] {
@@ -984,9 +1009,9 @@ function getInstallabilityErrorMessages(installabilityErrors: Protocol.Page.Inst
984
1009
 
985
1010
  function renderWindowControls(
986
1011
  selectedPlatform: string, onSelectOs: (selectedOS: SDK.OverlayModel.EmulatedOSType) => Promise<void>,
987
- onToggleWcoToolbar: (enabled: boolean) => Promise<void>): ReportSectionItem {
1012
+ onToggleWcoToolbar: (enabled: boolean) => Promise<void>): LitTemplate {
988
1013
  // clang-format off
989
- return {content: html`
1014
+ return html`<div class="report-row">
990
1015
  <devtools-checkbox @click=${(event: Event) => onToggleWcoToolbar((event.target as HTMLInputElement).checked)}
991
1016
  title=${i18nString(UIStrings.selectWindowControlsOverlayEmulationOs)}>
992
1017
  ${i18nString(UIStrings.selectWindowControlsOverlayEmulationOs)}
@@ -1010,7 +1035,8 @@ function renderWindowControls(
1010
1035
  jslog=${VisualLogging.item('linux').track({click: true})}>
1011
1036
  Linux
1012
1037
  </option>
1013
- </select>`};
1038
+ </select>
1039
+ </div>`;
1014
1040
  // clang-format on
1015
1041
  }
1016
1042
 
@@ -1035,8 +1061,8 @@ interface ViewInput {
1035
1061
  installabilitySection?: UI.ReportView.Section;
1036
1062
  identitySection?: UI.ReportView.Section;
1037
1063
  presentationSection?: UI.ReportView.Section;
1038
- protocolHandlersView?: ApplicationComponents.ProtocolHandlersView.ProtocolHandlersView;
1039
1064
  iconsSection?: UI.ReportView.Section;
1065
+ maskedIcons?: boolean;
1040
1066
  windowControlsSection?: UI.ReportView.Section;
1041
1067
  shortcutSections?: UI.ReportView.Section[];
1042
1068
  screenshotsSections?: UI.ReportView.Section[];
@@ -1056,22 +1082,22 @@ interface ViewInput {
1056
1082
  selectedPlatform?: string;
1057
1083
  onSelectOs?: (selectedOS: SDK.OverlayModel.EmulatedOSType) => Promise<void>;
1058
1084
  onToggleWcoToolbar?: (enabled: boolean) => Promise<void>;
1085
+ onToggleIconMasked?: (masked: boolean) => void;
1059
1086
  }
1060
1087
 
1061
- type View = (input: ViewInput, output: undefined, target: HTMLElement) => void;
1088
+ interface ViewOutput {
1089
+ scrollToSection: Map<string, () => void>;
1090
+ focusOnSection: Map<string, () => void>;
1091
+ }
1092
+
1093
+ type View = (input: ViewInput, output: ViewOutput, target: HTMLElement) => void;
1062
1094
 
1063
- export const DEFAULT_VIEW: View = (input, _output, _target) => {
1095
+ export const DEFAULT_VIEW: View = (input, output, target) => {
1064
1096
  const {
1065
- reportView,
1066
1097
  errorsSection,
1067
1098
  installabilitySection,
1068
1099
  identitySection,
1069
1100
  presentationSection,
1070
- protocolHandlersView,
1071
- iconsSection,
1072
- windowControlsSection,
1073
- shortcutSections,
1074
- screenshotsSections,
1075
1101
  identityData,
1076
1102
  presentationData,
1077
1103
  protocolHandlersData,
@@ -1082,10 +1108,12 @@ export const DEFAULT_VIEW: View = (input, _output, _target) => {
1082
1108
  warnings,
1083
1109
  errors,
1084
1110
  imageErrors,
1111
+ maskedIcons,
1085
1112
  windowControlsData,
1086
1113
  selectedPlatform,
1087
1114
  onSelectOs,
1088
1115
  onToggleWcoToolbar,
1116
+ onToggleIconMasked,
1089
1117
  } = input;
1090
1118
  if (identitySection && identityData) {
1091
1119
  renderIdentity(identitySection, identityData);
@@ -1093,28 +1121,25 @@ export const DEFAULT_VIEW: View = (input, _output, _target) => {
1093
1121
  if (presentationSection && presentationData) {
1094
1122
  renderPresentation(presentationSection, presentationData);
1095
1123
  }
1096
- if (protocolHandlersView && protocolHandlersData) {
1097
- renderProtocolHandlers(protocolHandlersView, protocolHandlersData);
1098
- }
1099
- if (iconsSection && iconsData) {
1100
- renderIcons(iconsSection, iconsData);
1101
- }
1102
- if (shortcutSections && shortcutsData) {
1103
- renderShortcuts(reportView, shortcutSections, shortcutsData);
1104
- }
1105
- if (screenshotsSections && screenshotsData) {
1106
- renderScreenshots(reportView, screenshotsSections, screenshotsData);
1107
- }
1108
1124
  if (installabilitySection && installabilityErrors) {
1109
1125
  renderInstallability(installabilitySection, installabilityErrors);
1110
1126
  }
1111
- if (windowControlsSection && windowControlsData) {
1112
- renderWindowControlsSection(
1113
- windowControlsSection, windowControlsData, selectedPlatform, onSelectOs, onToggleWcoToolbar);
1114
- }
1115
1127
  if (errorsSection) {
1116
1128
  renderErrors(errorsSection, warnings, errors, imageErrors);
1117
1129
  }
1130
+ // clang-format off
1131
+ render(html`
1132
+ <style>${appManifestViewStyles}</style>
1133
+ <devtools-report>
1134
+ ${protocolHandlersData ? renderProtocolHandlers(protocolHandlersData, output) : nothing}
1135
+ ${iconsData && onToggleIconMasked && maskedIcons ?
1136
+ renderIcons(iconsData, maskedIcons, onToggleIconMasked, output) : nothing}
1137
+ ${windowControlsData && output ? renderWindowControlsSection(
1138
+ windowControlsData, selectedPlatform, onSelectOs, onToggleWcoToolbar, output) : nothing}
1139
+ ${shortcutsData ? renderShortcuts(shortcutsData) : nothing}
1140
+ ${screenshotsData ? renderScreenshots(screenshotsData) : nothing}
1141
+ </devtools-report>`, target);
1142
+ // clang-format on
1118
1143
  };
1119
1144
 
1120
1145
  export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes, typeof UI.Widget.VBox>(UI.Widget.VBox)
@@ -1125,24 +1150,20 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1125
1150
  private readonly installabilitySection: UI.ReportView.Section;
1126
1151
  private readonly identitySection: UI.ReportView.Section;
1127
1152
  private readonly presentationSection: UI.ReportView.Section;
1128
- private readonly iconsSection: UI.ReportView.Section;
1129
- private readonly windowControlsSection: UI.ReportView.Section;
1130
- private readonly protocolHandlersSection: UI.ReportView.Section;
1131
- private readonly shortcutSections: UI.ReportView.Section[];
1132
- private readonly screenshotsSections: UI.ReportView.Section[];
1133
1153
  private registeredListeners: Common.EventTarget.EventDescriptor[];
1134
1154
  private target?: SDK.Target.Target;
1135
1155
  private resourceTreeModel?: SDK.ResourceTreeModel.ResourceTreeModel|null;
1136
1156
  private serviceWorkerManager?: SDK.ServiceWorkerManager.ServiceWorkerManager|null;
1137
1157
  private overlayModel?: SDK.OverlayModel.OverlayModel|null;
1138
- private protocolHandlersView: ApplicationComponents.ProtocolHandlersView.ProtocolHandlersView;
1139
1158
  private manifestUrl: Platform.DevToolsPath.UrlString;
1140
1159
  private manifestData: string|null;
1141
1160
  private manifestErrors: Protocol.Page.AppManifestError[];
1142
1161
  private installabilityErrors: Protocol.Page.InstallabilityError[];
1143
1162
  private appIdResponse: Protocol.Page.GetAppIdResponse|null;
1144
1163
  private wcoToolbarEnabled = false;
1164
+ private maskedIcons = false;
1145
1165
  private readonly view: View;
1166
+ private readonly output: ViewOutput = {scrollToSection: new Map(), focusOnSection: new Map()};
1146
1167
 
1147
1168
  constructor(view: View = DEFAULT_VIEW) {
1148
1169
  super({
@@ -1150,7 +1171,6 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1150
1171
  useShadowDom: true,
1151
1172
  });
1152
1173
  this.view = view;
1153
- this.registerRequiredCSS(appManifestViewStyles);
1154
1174
 
1155
1175
  this.contentElement.classList.add('manifest-container');
1156
1176
 
@@ -1174,15 +1194,6 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1174
1194
  this.identitySection = this.reportView.appendSection(i18nString(UIStrings.identity), 'undefined,identity');
1175
1195
  this.presentationSection =
1176
1196
  this.reportView.appendSection(i18nString(UIStrings.presentation), 'undefined,presentation');
1177
- this.protocolHandlersSection =
1178
- this.reportView.appendSection(i18nString(UIStrings.protocolHandlers), 'undefined,protocol-handlers');
1179
- this.protocolHandlersView = new ApplicationComponents.ProtocolHandlersView.ProtocolHandlersView();
1180
- this.protocolHandlersView.show(this.protocolHandlersSection.getFieldElement());
1181
- this.iconsSection = this.reportView.appendSection(i18nString(UIStrings.icons), 'report-section-icons', 'icons');
1182
- this.windowControlsSection =
1183
- this.reportView.appendSection(UIStrings.windowControlsOverlay, undefined, 'window-controls-overlay');
1184
- this.shortcutSections = [];
1185
- this.screenshotsSections = [];
1186
1197
 
1187
1198
  SDK.TargetManager.TargetManager.instance().observeTargets(this);
1188
1199
  this.registeredListeners = [];
@@ -1194,13 +1205,59 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1194
1205
  this.appIdResponse = null;
1195
1206
  }
1196
1207
 
1197
- getStaticSections(): UI.ReportView.Section[] {
1208
+ scrollToSection(sectionTitle: string): void {
1209
+ 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
+ }
1217
+ }
1218
+ UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.onInvokeAlert, {PH1: sectionTitle}));
1219
+ }
1220
+
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
+ focusOnSection(sectionTitle: string): boolean {
1227
+ 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) {
1234
+ return false;
1235
+ }
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;
1246
+ }
1247
+
1248
+ private getManifestSections(): UI.ReportView.Section[] {
1198
1249
  return [
1199
1250
  this.identitySection,
1200
1251
  this.presentationSection,
1201
- this.protocolHandlersSection,
1202
- this.iconsSection,
1203
- this.windowControlsSection,
1252
+ ];
1253
+ }
1254
+ getStaticSections(): Array<{title: string, jslogContext: string|undefined}> {
1255
+ return [
1256
+ {title: i18nString(UIStrings.identity), jslogContext: 'identity'},
1257
+ {title: i18nString(UIStrings.presentation), jslogContext: 'presentation'},
1258
+ {title: i18nString(UIStrings.protocolHandlers), jslogContext: 'protocol-handlers'},
1259
+ {title: i18nString(UIStrings.icons), jslogContext: 'icons'},
1260
+ {title: i18nString(UIStrings.windowControlsOverlay), jslogContext: 'window-controls'},
1204
1261
  ];
1205
1262
  }
1206
1263
 
@@ -1284,7 +1341,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1284
1341
  if ((!data || data === '{}') && !errors.length) {
1285
1342
  this.emptyView.showWidget();
1286
1343
  this.reportView.hideWidget();
1287
- this.view({emptyView: this.emptyView, reportView: this.reportView}, undefined, this.contentElement);
1344
+ this.view({emptyView: this.emptyView, reportView: this.reportView}, this.output, this.contentElement);
1288
1345
  this.dispatchEventToListeners(Events.MANIFEST_DETECTED, false);
1289
1346
  return;
1290
1347
  }
@@ -1298,7 +1355,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1298
1355
  if (!data) {
1299
1356
  this.view(
1300
1357
  {emptyView: this.emptyView, reportView: this.reportView, errorsSection: this.errorsSection, errors},
1301
- undefined, this.contentElement);
1358
+ this.output, this.contentElement);
1302
1359
  return;
1303
1360
  }
1304
1361
 
@@ -1336,6 +1393,10 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1336
1393
  (selectedOS: SDK.OverlayModel.EmulatedOSType) => this.onSelectOs(selectedOS, windowControlsData.themeColor) :
1337
1394
  undefined;
1338
1395
  const onToggleWcoToolbar = this.overlayModel ? (enabled: boolean) => this.onToggleWcoToolbar(enabled) : undefined;
1396
+ const onToggleIconMasked = (masked: boolean): void => {
1397
+ this.maskedIcons = masked;
1398
+ this.requestUpdate();
1399
+ };
1339
1400
  this.view(
1340
1401
  {
1341
1402
  emptyView: this.emptyView,
@@ -1344,11 +1405,7 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1344
1405
  installabilitySection: this.installabilitySection,
1345
1406
  identitySection: this.identitySection,
1346
1407
  presentationSection: this.presentationSection,
1347
- protocolHandlersView: this.protocolHandlersView,
1348
- iconsSection: this.iconsSection,
1349
- windowControlsSection: this.windowControlsSection,
1350
- shortcutSections: this.shortcutSections,
1351
- screenshotsSections: this.screenshotsSections,
1408
+ maskedIcons: this.maskedIcons,
1352
1409
  parsedManifest,
1353
1410
  url,
1354
1411
  identityData,
@@ -1365,8 +1422,9 @@ export class AppManifestView extends Common.ObjectWrapper.eventMixin<EventTypes,
1365
1422
  selectedPlatform,
1366
1423
  onSelectOs,
1367
1424
  onToggleWcoToolbar,
1425
+ onToggleIconMasked,
1368
1426
  },
1369
- undefined, this.contentElement);
1427
+ this.output, this.contentElement);
1370
1428
  }
1371
1429
 
1372
1430
  private stringProperty(parsedManifest: Manifest, name: keyof Manifest): string {