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.
- package/front_end/core/protocol_client/InspectorBackend.ts +1 -1
- package/front_end/core/root/Runtime.ts +0 -4
- package/front_end/core/sdk/DOMModel.ts +101 -7
- package/front_end/entrypoints/formatter_worker/FormatterActions.ts +2 -0
- package/front_end/entrypoints/formatter_worker/ScopeParser.ts +75 -7
- package/front_end/entrypoints/formatter_worker/Substitute.ts +1 -1
- package/front_end/generated/InspectorBackendCommands.ts +1 -1
- package/front_end/generated/protocol.ts +0 -1
- package/front_end/models/ai_assistance/AiConversation.ts +71 -10
- package/front_end/models/ai_assistance/ArtifactsManager.ts +67 -0
- package/front_end/models/ai_assistance/ConversationHandler.ts +3 -2
- package/front_end/models/ai_assistance/agents/AiAgent.ts +17 -27
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +152 -4
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -2
- package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -1
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +0 -2
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -1
- package/front_end/{ui/components → models}/annotations/AnnotationRepository.ts +4 -4
- package/front_end/models/annotations/README.md +7 -0
- package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
- package/front_end/models/greendev/Prototypes.ts +56 -0
- package/front_end/models/greendev/README.md +5 -0
- package/front_end/models/greendev/greendev.ts +5 -0
- package/front_end/models/stack_trace/StackTrace.ts +13 -2
- package/front_end/models/stack_trace/StackTraceImpl.ts +81 -6
- package/front_end/models/stack_trace/StackTraceModel.ts +35 -3
- package/front_end/models/trace/extras/TraceTree.ts +4 -2
- package/front_end/models/trace/insights/LCPDiscovery.ts +0 -2
- package/front_end/models/trace/types/TraceEvents.ts +0 -1
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +116 -70
- package/front_end/panels/ai_assistance/aiAssistancePanel.css +16 -0
- package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +159 -0
- package/front_end/panels/ai_assistance/components/ChatView.ts +3 -2
- package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +7 -8
- package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +15 -8
- package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +9 -9
- package/front_end/panels/ai_assistance/components/artifactsViewer.css +15 -0
- package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +5 -6
- package/front_end/panels/application/AppManifestView.ts +263 -205
- package/front_end/panels/application/ApplicationPanelSidebar.ts +24 -57
- package/front_end/panels/application/OpenedWindowDetailsView.ts +2 -0
- package/front_end/panels/application/ServiceWorkersView.ts +2 -0
- package/front_end/panels/application/StorageView.ts +1 -0
- package/front_end/panels/application/appManifestView.css +48 -0
- package/front_end/panels/application/components/ProtocolHandlersView.ts +2 -2
- package/front_end/panels/application/preloading/PreloadingView.ts +12 -6
- package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +230 -237
- package/front_end/panels/application/preloading/components/PreloadingGrid.ts +96 -79
- package/front_end/panels/application/preloading/components/preloadingGrid.css +26 -29
- package/front_end/panels/application/preloading/preloadingView.css +6 -0
- package/front_end/panels/common/Annotation.ts +1 -1
- package/front_end/panels/common/AnnotationManager.ts +1 -1
- package/front_end/panels/common/ExtensionView.ts +1 -0
- package/front_end/panels/console/ConsoleContextSelector.ts +74 -9
- package/front_end/panels/console/consoleContextSelector.css +31 -29
- package/front_end/panels/coverage/coverageListView.css +59 -57
- package/front_end/panels/elements/ElementsPanel.ts +1 -1
- package/front_end/panels/elements/ElementsTreeElement.ts +39 -1
- package/front_end/panels/elements/ElementsTreeOutline.ts +23 -21
- package/front_end/panels/elements/TopLayerContainer.ts +26 -91
- package/front_end/panels/explain/components/ConsoleInsight.ts +3 -3
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +4 -8
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +148 -97
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryViewer.ts +1 -1
- package/front_end/panels/linear_memory_inspector/components/linearMemoryValueInterpreter.css +37 -35
- package/front_end/panels/network/NetworkItemView.ts +1 -1
- package/front_end/panels/network/NetworkLogView.ts +1 -1
- package/front_end/panels/network/NetworkPanel.ts +1 -1
- package/front_end/panels/recorder/RecorderController.ts +0 -1
- package/front_end/panels/security/SecurityPanelSidebar.ts +5 -0
- package/front_end/panels/settings/SettingsScreen.ts +133 -1
- package/front_end/panels/settings/settings-meta.ts +24 -0
- package/front_end/panels/settings/settingsScreen.css +4 -0
- package/front_end/panels/sources/UISourceCodeFrame.ts +3 -17
- package/front_end/panels/timeline/TimelineUIUtils.ts +5 -8
- package/front_end/panels/timeline/components/TimelineSummary.ts +75 -54
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +18 -26
- package/front_end/panels/timeline/components/insights/Cache.ts +12 -8
- package/front_end/panels/timeline/components/insights/DOMSize.ts +25 -21
- package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +7 -7
- package/front_end/panels/timeline/components/insights/FontDisplay.ts +7 -5
- package/front_end/panels/timeline/components/insights/ForcedReflow.ts +11 -9
- package/front_end/panels/timeline/components/insights/INPBreakdown.ts +7 -6
- package/front_end/panels/timeline/components/insights/ImageDelivery.ts +7 -5
- package/front_end/panels/timeline/components/insights/InsightRenderer.ts +20 -18
- package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +12 -12
- package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +7 -7
- package/front_end/panels/timeline/components/insights/ModernHTTP.ts +7 -5
- package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +15 -13
- package/front_end/panels/timeline/components/insights/RenderBlocking.ts +2 -2
- package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +15 -14
- package/front_end/panels/timeline/components/insights/Table.ts +152 -130
- package/front_end/panels/timeline/components/insights/ThirdParties.ts +11 -9
- package/front_end/panels/timeline/components/timelineSummary.css +58 -57
- package/front_end/panels/timeline/thirdPartyTreeView.css +109 -0
- package/front_end/panels/timeline/timelineDetailsView.css +2 -4
- package/front_end/panels/timeline/timelinePanel.css +0 -110
- package/front_end/third_party/acorn/estree-legacy.d.ts +2 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Connection.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +21 -7
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +15 -6
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Connection.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +21 -7
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/package.json +2 -2
- package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +1 -2
- package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +2 -4
- package/front_end/third_party/puppeteer/package/src/api/Frame.ts +2 -4
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -4
- package/front_end/third_party/puppeteer/package/src/bidi/core/Connection.ts +3 -2
- package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +29 -10
- package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/components/report_view/ReportView.docs.ts +37 -0
- package/front_end/ui/components/report_view/ReportView.ts +1 -4
- package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
- package/front_end/ui/legacy/Floaty.ts +5 -9
- package/front_end/ui/legacy/InspectorView.ts +2 -1
- package/front_end/ui/legacy/ReportView.ts +5 -4
- package/front_end/ui/legacy/TabbedPane.ts +1 -1
- package/front_end/ui/legacy/ViewManager.ts +2 -32
- package/front_end/ui/legacy/Widget.ts +7 -0
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -1
- package/front_end/ui/legacy/reportView.css +0 -24
- package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
- package/package.json +1 -1
- /package/front_end/{ui/components → models}/annotations/AnnotationType.ts +0 -0
- /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
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
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
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
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
|
-
|
|
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
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
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
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
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
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
|
|
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
|
-
|
|
839
|
-
onSelectOs
|
|
840
|
-
onToggleWcoToolbar
|
|
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
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
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>):
|
|
1012
|
+
onToggleWcoToolbar: (enabled: boolean) => Promise<void>): LitTemplate {
|
|
988
1013
|
// clang-format off
|
|
989
|
-
return
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
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},
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1427
|
+
this.output, this.contentElement);
|
|
1370
1428
|
}
|
|
1371
1429
|
|
|
1372
1430
|
private stringProperty(parsedManifest: Manifest, name: keyof Manifest): string {
|