chrome-devtools-frontend 1.0.1558690 → 1.0.1561080
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/front_end/Images/src/container.svg +4 -0
- package/front_end/core/common/Gzip.ts +15 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +0 -3
- package/front_end/core/platform/ArrayUtilities.ts +13 -0
- package/front_end/core/root/Runtime.ts +0 -5
- package/front_end/core/sdk/CSSMetadata.ts +6 -6
- package/front_end/core/sdk/CSSModel.ts +2 -2
- package/front_end/core/sdk/DOMModel.ts +15 -3
- package/front_end/core/sdk/NetworkManager.ts +4 -0
- package/front_end/core/sdk/NetworkRequest.ts +9 -0
- package/front_end/core/sdk/OverlayModel.ts +20 -9
- package/front_end/entrypoints/main/MainImpl.ts +2 -1
- package/front_end/generated/InspectorBackendCommands.ts +6 -3
- package/front_end/generated/SupportedCSSProperties.js +64 -32
- package/front_end/generated/protocol-mapping.d.ts +16 -0
- package/front_end/generated/protocol-proxy-api.d.ts +12 -0
- package/front_end/generated/protocol.ts +38 -1
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +1 -1
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +11 -7
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +23 -22
- package/front_end/models/badges/UserBadges.ts +48 -16
- package/front_end/models/greendev/Prototypes.ts +6 -1
- package/front_end/models/trace/LanternComputationData.ts +4 -3
- package/front_end/models/trace/Processor.ts +6 -5
- package/front_end/models/trace/Styles.ts +10 -1
- package/front_end/models/trace/extras/TraceTree.ts +1 -1
- package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +2 -2
- package/front_end/models/trace/handlers/MetaHandler.ts +14 -0
- package/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +59 -34
- package/front_end/models/trace/helpers/Timing.ts +8 -1
- package/front_end/models/trace/insights/Common.ts +1 -1
- package/front_end/models/trace/insights/LCPBreakdown.ts +4 -4
- package/front_end/models/trace/insights/LCPDiscovery.ts +3 -3
- package/front_end/models/trace/insights/RenderBlocking.ts +1 -1
- package/front_end/models/trace/insights/types.ts +1 -1
- package/front_end/models/trace/types/TraceEvents.ts +62 -10
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +11 -142
- package/front_end/panels/ai_assistance/PatchWidget.ts +90 -72
- package/front_end/panels/ai_assistance/ai_assistance.ts +1 -0
- package/front_end/panels/ai_assistance/components/ChatInput.ts +701 -0
- package/front_end/panels/ai_assistance/components/ChatView.ts +71 -1268
- package/front_end/panels/ai_assistance/components/UserActionRow.ts +514 -31
- package/front_end/panels/ai_assistance/components/chatInput.css +387 -0
- package/front_end/panels/ai_assistance/components/chatView.css +38 -599
- package/front_end/panels/ai_assistance/components/userActionRow.css +230 -0
- package/front_end/panels/autofill/AutofillView.ts +2 -2
- package/front_end/panels/changes/ChangesView.ts +15 -1
- package/front_end/panels/changes/changesView.css +6 -0
- package/front_end/panels/common/AiCodeGenerationTeaser.ts +48 -12
- package/front_end/panels/common/BadgeNotification.ts +44 -58
- package/front_end/panels/common/CopyChangesToPrompt.ts +233 -0
- package/front_end/panels/common/aiCodeGenerationTeaser.css +14 -0
- package/front_end/panels/common/common.ts +2 -1
- package/front_end/panels/console/consoleView.css +1 -1
- package/front_end/panels/elements/CSSRuleValidator.ts +38 -0
- package/front_end/panels/elements/ElementsTreeElement.ts +222 -377
- package/front_end/panels/elements/ElementsTreeOutline.ts +0 -23
- package/front_end/panels/elements/ShortcutTreeElement.ts +57 -50
- package/front_end/panels/elements/StylePropertiesSection.ts +1 -3
- package/front_end/panels/elements/StylesSidebarPane.ts +15 -4
- package/front_end/panels/elements/components/AdornerManager.ts +5 -149
- package/front_end/panels/issues/HiddenIssuesRow.ts +1 -2
- package/front_end/panels/issues/IssueKindView.ts +2 -4
- package/front_end/panels/issues/IssueView.ts +2 -4
- package/front_end/panels/network/NetworkDataGridNode.ts +65 -1
- package/front_end/panels/network/NetworkLogView.ts +2 -4
- package/front_end/panels/network/NetworkLogViewColumns.ts +9 -0
- package/front_end/panels/screencast/ScreencastApp.ts +1 -0
- package/front_end/panels/settings/SettingsScreen.ts +3 -2
- package/front_end/panels/timeline/CompatibilityTracksAppender.ts +14 -1
- package/front_end/panels/timeline/StatusDialog.ts +4 -3
- package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -4
- package/front_end/panels/timeline/TimelineController.ts +185 -3
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +52 -25
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +3 -16
- package/front_end/panels/timeline/TimelineFlameChartView.ts +65 -21
- package/front_end/panels/timeline/TimelinePanel.ts +86 -126
- package/front_end/panels/timeline/TimelineTreeView.ts +1 -0
- package/front_end/panels/timeline/TimelineUIUtils.ts +28 -2
- package/front_end/panels/timeline/TimingsTrackAppender.ts +3 -1
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +1 -1
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -2
- package/front_end/panels/timeline/components/insights/RenderBlocking.ts +6 -4
- package/front_end/panels/timeline/components/insights/Table.ts +3 -3
- package/front_end/panels/timeline/overlays/OverlaysImpl.ts +4 -0
- package/front_end/panels/timeline/timelinePanel.css +8 -1
- package/front_end/panels/timeline/utils/EntryNodes.ts +2 -1
- package/front_end/panels/whats_new/ReleaseNoteText.ts +15 -9
- package/front_end/panels/whats_new/resources/WNDT.md +6 -6
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
- package/front_end/third_party/lit/rebuild.sh +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +2 -3
- 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/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js +9 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts +3 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js +9 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts +3 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js +10 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +8 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.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/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +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.d.ts +10 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +13 -7
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +2 -3
- 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/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js +9 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts +3 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js +9 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts +3 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js +10 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +8 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.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/lib/types.d.ts +10 -1
- package/front_end/third_party/puppeteer/package/package.json +3 -3
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -3
- package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +13 -0
- package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +10 -0
- package/front_end/third_party/puppeteer/package/src/bidi/core/Request.ts +15 -0
- package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +9 -4
- package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/components/adorners/Adorner.ts +8 -68
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +70 -28
- package/front_end/ui/legacy/SearchableView.ts +11 -5
- package/front_end/ui/legacy/SplitWidget.ts +1 -1
- package/front_end/ui/legacy/TabbedPane.ts +1 -1
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +43 -9
- package/front_end/ui/visual_logging/KnownContextValues.ts +16 -0
- package/package.json +2 -1
|
@@ -372,7 +372,6 @@ export class DOMTreeWidget extends UI.Widget.Widget {
|
|
|
372
372
|
*/
|
|
373
373
|
updateNodeAdorners(node: SDK.DOMModel.DOMNode): void {
|
|
374
374
|
const element = this.#viewOutput.elementsTreeOutline?.findTreeElement(node);
|
|
375
|
-
void element?.updateStyleAdorners();
|
|
376
375
|
void element?.updateAdorners();
|
|
377
376
|
}
|
|
378
377
|
|
|
@@ -1526,7 +1525,6 @@ export class ElementsTreeOutline extends
|
|
|
1526
1525
|
domModel.addEventListener(SDK.DOMModel.Events.DocumentUpdated, this.documentUpdated, this);
|
|
1527
1526
|
domModel.addEventListener(SDK.DOMModel.Events.ChildNodeCountUpdated, this.childNodeCountUpdated, this);
|
|
1528
1527
|
domModel.addEventListener(SDK.DOMModel.Events.DistributedNodesChanged, this.distributedNodesChanged, this);
|
|
1529
|
-
domModel.addEventListener(SDK.DOMModel.Events.ScrollableFlagUpdated, this.scrollableFlagUpdated, this);
|
|
1530
1528
|
domModel.addEventListener(
|
|
1531
1529
|
SDK.DOMModel.Events.AffectedByStartingStylesFlagUpdated, this.affectedByStartingStylesFlagUpdated, this);
|
|
1532
1530
|
domModel.addEventListener(SDK.DOMModel.Events.AdoptedStyleSheetsModified, this.adoptedStyleSheetsModified, this);
|
|
@@ -1542,7 +1540,6 @@ export class ElementsTreeOutline extends
|
|
|
1542
1540
|
domModel.removeEventListener(SDK.DOMModel.Events.DocumentUpdated, this.documentUpdated, this);
|
|
1543
1541
|
domModel.removeEventListener(SDK.DOMModel.Events.ChildNodeCountUpdated, this.childNodeCountUpdated, this);
|
|
1544
1542
|
domModel.removeEventListener(SDK.DOMModel.Events.DistributedNodesChanged, this.distributedNodesChanged, this);
|
|
1545
|
-
domModel.removeEventListener(SDK.DOMModel.Events.ScrollableFlagUpdated, this.scrollableFlagUpdated, this);
|
|
1546
1543
|
domModel.removeEventListener(
|
|
1547
1544
|
SDK.DOMModel.Events.AffectedByStartingStylesFlagUpdated, this.affectedByStartingStylesFlagUpdated, this);
|
|
1548
1545
|
domModel.removeEventListener(SDK.DOMModel.Events.AdoptedStyleSheetsModified, this.adoptedStyleSheetsModified, this);
|
|
@@ -1749,10 +1746,6 @@ export class ElementsTreeOutline extends
|
|
|
1749
1746
|
treeElement.setCollapsible(false);
|
|
1750
1747
|
}
|
|
1751
1748
|
|
|
1752
|
-
if (node.hasAssignedSlot()) {
|
|
1753
|
-
treeElement.createSlotLink(node.assignedSlot);
|
|
1754
|
-
}
|
|
1755
|
-
|
|
1756
1749
|
treeElement.selectable = Boolean(this.selectEnabled);
|
|
1757
1750
|
return treeElement;
|
|
1758
1751
|
}
|
|
@@ -2020,27 +2013,11 @@ export class ElementsTreeOutline extends
|
|
|
2020
2013
|
}
|
|
2021
2014
|
}
|
|
2022
2015
|
|
|
2023
|
-
private scrollableFlagUpdated(event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode}>): void {
|
|
2024
|
-
let {node} = event.data;
|
|
2025
|
-
if (node.nodeName() === '#document') {
|
|
2026
|
-
// We show the scroll badge of the document on the <html> element.
|
|
2027
|
-
if (!node.ownerDocument?.documentElement) {
|
|
2028
|
-
return;
|
|
2029
|
-
}
|
|
2030
|
-
node = node.ownerDocument.documentElement;
|
|
2031
|
-
}
|
|
2032
|
-
const treeElement = this.treeElementByNode.get(node);
|
|
2033
|
-
if (treeElement && isOpeningTag(treeElement.tagTypeContext)) {
|
|
2034
|
-
void treeElement.updateScrollAdorner();
|
|
2035
|
-
}
|
|
2036
|
-
}
|
|
2037
|
-
|
|
2038
2016
|
private affectedByStartingStylesFlagUpdated(event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode}>):
|
|
2039
2017
|
void {
|
|
2040
2018
|
const {node} = event.data;
|
|
2041
2019
|
const treeElement = this.treeElementByNode.get(node);
|
|
2042
2020
|
if (treeElement && isOpeningTag(treeElement.tagTypeContext)) {
|
|
2043
|
-
void treeElement.updateStyleAdorners();
|
|
2044
2021
|
void treeElement.updateAdorners();
|
|
2045
2022
|
}
|
|
2046
2023
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Copyright 2021 The Chromium Authors
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
|
-
/* eslint-disable @devtools/no-imperative-dom-api */
|
|
5
4
|
|
|
6
5
|
/*
|
|
7
6
|
* Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
|
|
@@ -36,15 +35,16 @@
|
|
|
36
35
|
import * as Common from '../../core/common/common.js';
|
|
37
36
|
import * as i18n from '../../core/i18n/i18n.js';
|
|
38
37
|
import type * as SDK from '../../core/sdk/sdk.js';
|
|
39
|
-
import * as Adorners from '../../ui/components/adorners/adorners.js';
|
|
40
|
-
import {createIcon} from '../../ui/kit/kit.js';
|
|
41
38
|
import * as UI from '../../ui/legacy/legacy.js';
|
|
39
|
+
import * as Lit from '../../ui/lit/lit.js';
|
|
40
|
+
import * as VisualElements from '../../ui/visual_logging/visual_logging.js';
|
|
42
41
|
|
|
43
42
|
import * as ElementsComponents from './components/components.js';
|
|
44
|
-
import {
|
|
45
|
-
import {ElementsTreeElement} from './ElementsTreeElement.js';
|
|
43
|
+
import {adornerRef, ElementsTreeElement} from './ElementsTreeElement.js';
|
|
46
44
|
import {ElementsTreeOutline} from './ElementsTreeOutline.js';
|
|
47
45
|
|
|
46
|
+
const {html, render} = Lit;
|
|
47
|
+
|
|
48
48
|
const UIStrings = {
|
|
49
49
|
/**
|
|
50
50
|
* @description Link text content in Elements Tree Outline of the Elements panel
|
|
@@ -54,56 +54,43 @@ const UIStrings = {
|
|
|
54
54
|
const str_ = i18n.i18n.registerUIStrings('panels/elements/ShortcutTreeElement.ts', UIStrings);
|
|
55
55
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
56
56
|
|
|
57
|
+
interface ViewInput {
|
|
58
|
+
title: string;
|
|
59
|
+
onRevealAdornerClick: (e: Event) => void;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLElement): void => {
|
|
63
|
+
// clang-format off
|
|
64
|
+
render(html`
|
|
65
|
+
<div class="selection fill"></div>
|
|
66
|
+
<span class="elements-tree-shortcut-title">\u21AA ${input.title}</span>
|
|
67
|
+
<devtools-adorner
|
|
68
|
+
.name=${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}
|
|
69
|
+
class="adorner-reveal"
|
|
70
|
+
jslog=${VisualElements.adorner('reveal')}
|
|
71
|
+
aria-label=${i18nString(UIStrings.reveal)}
|
|
72
|
+
@click=${input.onRevealAdornerClick}
|
|
73
|
+
@mousedown=${(e: Event) => e.consume()}
|
|
74
|
+
${adornerRef()}>
|
|
75
|
+
<span class="adorner-with-icon">
|
|
76
|
+
<devtools-icon name="select-element"></devtools-icon>
|
|
77
|
+
<span>${ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL}</span>
|
|
78
|
+
</span>
|
|
79
|
+
</devtools-adorner>
|
|
80
|
+
`, target);
|
|
81
|
+
// clang-format on
|
|
82
|
+
};
|
|
83
|
+
|
|
57
84
|
export class ShortcutTreeElement extends UI.TreeOutline.TreeElement {
|
|
58
85
|
private readonly nodeShortcut: SDK.DOMModel.DOMNodeShortcut;
|
|
59
86
|
#hovered?: boolean;
|
|
60
|
-
|
|
87
|
+
#view: typeof DEFAULT_VIEW;
|
|
88
|
+
|
|
89
|
+
constructor(nodeShortcut: SDK.DOMModel.DOMNodeShortcut, view = DEFAULT_VIEW) {
|
|
61
90
|
super('');
|
|
62
|
-
this.listItemElement.createChild('div', 'selection fill');
|
|
63
|
-
const title = this.listItemElement.createChild('span', 'elements-tree-shortcut-title');
|
|
64
|
-
let text = nodeShortcut.nodeName.toLowerCase();
|
|
65
|
-
if (nodeShortcut.nodeType === Node.ELEMENT_NODE) {
|
|
66
|
-
text = '<' + text + '>';
|
|
67
|
-
}
|
|
68
|
-
title.textContent = '\u21AA ' + text;
|
|
69
91
|
this.nodeShortcut = nodeShortcut;
|
|
70
|
-
this
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
addRevealAdorner(): void {
|
|
74
|
-
const adorner = new Adorners.Adorner.Adorner();
|
|
75
|
-
adorner.classList.add('adorner-reveal');
|
|
76
|
-
const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
|
|
77
|
-
ElementsComponents.AdornerManager.RegisteredAdorners.REVEAL);
|
|
78
|
-
const name = config.name;
|
|
79
|
-
const adornerContent = document.createElement('span');
|
|
80
|
-
const linkIcon = createIcon('select-element');
|
|
81
|
-
const slotText = document.createElement('span');
|
|
82
|
-
slotText.textContent = name;
|
|
83
|
-
adornerContent.append(linkIcon);
|
|
84
|
-
adornerContent.append(slotText);
|
|
85
|
-
adornerContent.classList.add('adorner-with-icon');
|
|
86
|
-
adorner.data = {
|
|
87
|
-
name,
|
|
88
|
-
content: adornerContent,
|
|
89
|
-
jslogContext: 'reveal',
|
|
90
|
-
};
|
|
91
|
-
this.listItemElement.appendChild(adorner);
|
|
92
|
-
const onClick = ((() => {
|
|
93
|
-
this.nodeShortcut.deferredNode.resolve(
|
|
94
|
-
node => {
|
|
95
|
-
void Common.Revealer.reveal(node);
|
|
96
|
-
},
|
|
97
|
-
);
|
|
98
|
-
}) as EventListener);
|
|
99
|
-
adorner.addInteraction(onClick, {
|
|
100
|
-
isToggle: false,
|
|
101
|
-
shouldPropagateOnKeydown: false,
|
|
102
|
-
ariaLabelDefault: i18nString(UIStrings.reveal),
|
|
103
|
-
ariaLabelActive: i18nString(UIStrings.reveal),
|
|
104
|
-
});
|
|
105
|
-
adorner.addEventListener('mousedown', e => e.consume(), false);
|
|
106
|
-
ElementsPanel.instance().registerAdorner(adorner);
|
|
92
|
+
this.#view = view;
|
|
93
|
+
this.performUpdate();
|
|
107
94
|
}
|
|
108
95
|
|
|
109
96
|
get hovered(): boolean {
|
|
@@ -154,4 +141,24 @@ export class ShortcutTreeElement extends UI.TreeOutline.TreeElement {
|
|
|
154
141
|
}
|
|
155
142
|
return true;
|
|
156
143
|
}
|
|
144
|
+
|
|
145
|
+
private onRevealAdornerClick(event: Event): void {
|
|
146
|
+
event.stopPropagation();
|
|
147
|
+
this.nodeShortcut.deferredNode.resolve(node => {
|
|
148
|
+
void Common.Revealer.reveal(node);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private performUpdate(): void {
|
|
153
|
+
let text = this.nodeShortcut.nodeName.toLowerCase();
|
|
154
|
+
if (this.nodeShortcut.nodeType === Node.ELEMENT_NODE) {
|
|
155
|
+
text = '<' + text + '>';
|
|
156
|
+
}
|
|
157
|
+
this.#view(
|
|
158
|
+
{
|
|
159
|
+
title: text,
|
|
160
|
+
onRevealAdornerClick: this.onRevealAdornerClick.bind(this),
|
|
161
|
+
},
|
|
162
|
+
undefined, this.listItemElement);
|
|
163
|
+
}
|
|
157
164
|
}
|
|
@@ -810,9 +810,7 @@ export class StylePropertiesSection {
|
|
|
810
810
|
ancestorRuleElement = this.createNestingElement(rule.nestingSelectors?.[nestingIndex++]);
|
|
811
811
|
break;
|
|
812
812
|
case Protocol.CSS.CSSRuleType.StartingStyleRule:
|
|
813
|
-
|
|
814
|
-
ancestorRuleElement = this.createStartingStyleElement();
|
|
815
|
-
}
|
|
813
|
+
ancestorRuleElement = this.createStartingStyleElement();
|
|
816
814
|
break;
|
|
817
815
|
}
|
|
818
816
|
if (ancestorRuleElement) {
|
|
@@ -482,6 +482,10 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
482
482
|
|
|
483
483
|
private onFilterChanged(event: Common.EventTarget.EventTargetEvent<string>): void {
|
|
484
484
|
const regex = event.data ? new RegExp(Platform.StringUtilities.escapeForRegExp(event.data), 'i') : null;
|
|
485
|
+
this.setFilter(regex);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
setFilter(regex: RegExp|null): void {
|
|
485
489
|
this.lastFilterChange = Date.now();
|
|
486
490
|
this.#filterRegex = regex;
|
|
487
491
|
this.updateFilter();
|
|
@@ -1036,6 +1040,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1036
1040
|
let sectionIdx = 0;
|
|
1037
1041
|
let lastParentNode: SDK.DOMModel.DOMNode|null = null;
|
|
1038
1042
|
|
|
1043
|
+
let lastLayerParent: SectionBlock|undefined;
|
|
1039
1044
|
let lastLayers: SDK.CSSLayer.CSSLayer[]|null = null;
|
|
1040
1045
|
let sawLayers = false;
|
|
1041
1046
|
|
|
@@ -1046,6 +1051,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1046
1051
|
if ((layers.length || lastLayers) && lastLayers !== layers) {
|
|
1047
1052
|
const block = SectionBlock.createLayerBlock(parentRule);
|
|
1048
1053
|
blocks.push(block);
|
|
1054
|
+
lastLayerParent?.childBlocks.push(block);
|
|
1049
1055
|
sawLayers = true;
|
|
1050
1056
|
lastLayers = layers;
|
|
1051
1057
|
}
|
|
@@ -1055,12 +1061,12 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1055
1061
|
// We disable the layer widget initially. If we see a layer in
|
|
1056
1062
|
// the matched styles we reenable the button.
|
|
1057
1063
|
LayersWidget.ButtonProvider.instance().item().setVisible(false);
|
|
1058
|
-
|
|
1059
1064
|
for (const style of matchedStyles.nodeStyles()) {
|
|
1060
1065
|
const parentNode = matchedStyles.isInherited(style) ? matchedStyles.nodeForStyle(style) : null;
|
|
1061
1066
|
if (parentNode && parentNode !== lastParentNode) {
|
|
1062
1067
|
lastParentNode = parentNode;
|
|
1063
1068
|
const block = await SectionBlock.createInheritedNodeBlock(lastParentNode);
|
|
1069
|
+
lastLayerParent = block;
|
|
1064
1070
|
blocks.push(block);
|
|
1065
1071
|
}
|
|
1066
1072
|
|
|
@@ -1078,6 +1084,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1078
1084
|
});
|
|
1079
1085
|
}
|
|
1080
1086
|
}
|
|
1087
|
+
lastLayerParent = undefined;
|
|
1081
1088
|
|
|
1082
1089
|
const customHighlightPseudoRulesets: Array<{
|
|
1083
1090
|
highlightName: string | null,
|
|
@@ -1130,9 +1137,11 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1130
1137
|
if (parentNode) {
|
|
1131
1138
|
const block =
|
|
1132
1139
|
await SectionBlock.createInheritedPseudoTypeBlock(pseudo.pseudoType, pseudo.highlightName, parentNode);
|
|
1140
|
+
lastLayerParent = block;
|
|
1133
1141
|
blocks.push(block);
|
|
1134
1142
|
} else {
|
|
1135
1143
|
const block = SectionBlock.createPseudoTypeBlock(pseudo.pseudoType, pseudo.highlightName);
|
|
1144
|
+
lastLayerParent = block;
|
|
1136
1145
|
blocks.push(block);
|
|
1137
1146
|
}
|
|
1138
1147
|
}
|
|
@@ -1503,6 +1512,7 @@ const MAX_LINK_LENGTH = 23;
|
|
|
1503
1512
|
export class SectionBlock {
|
|
1504
1513
|
readonly #titleElement: Element|null;
|
|
1505
1514
|
sections: StylePropertiesSection[];
|
|
1515
|
+
childBlocks: SectionBlock[] = [];
|
|
1506
1516
|
#expanded = false;
|
|
1507
1517
|
#icon: Icon|undefined;
|
|
1508
1518
|
constructor(titleElement: Element|null, expandable?: boolean, expandedByDefault?: boolean) {
|
|
@@ -1634,14 +1644,15 @@ export class SectionBlock {
|
|
|
1634
1644
|
}
|
|
1635
1645
|
|
|
1636
1646
|
updateFilter(): number {
|
|
1637
|
-
let hasAnyVisibleSection = false;
|
|
1638
1647
|
let numVisibleSections = 0;
|
|
1648
|
+
for (const childBlock of this.childBlocks) {
|
|
1649
|
+
numVisibleSections += childBlock.updateFilter();
|
|
1650
|
+
}
|
|
1639
1651
|
for (const section of this.sections) {
|
|
1640
1652
|
numVisibleSections += section.updateFilter() ? 1 : 0;
|
|
1641
|
-
hasAnyVisibleSection = section.updateFilter() || hasAnyVisibleSection;
|
|
1642
1653
|
}
|
|
1643
1654
|
if (this.#titleElement) {
|
|
1644
|
-
this.#titleElement.classList.toggle('hidden',
|
|
1655
|
+
this.#titleElement.classList.toggle('hidden', numVisibleSections === 0);
|
|
1645
1656
|
}
|
|
1646
1657
|
return numVisibleSections;
|
|
1647
1658
|
}
|
|
@@ -2,24 +2,12 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
SECURITY = 'Security',
|
|
7
|
-
LAYOUT = 'Layout',
|
|
8
|
-
DEFAULT = 'Default',
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface AdornerSetting {
|
|
5
|
+
interface AdornerSetting {
|
|
12
6
|
adorner: string;
|
|
13
7
|
isEnabled: boolean;
|
|
14
8
|
}
|
|
15
9
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export interface RegisteredAdorner {
|
|
19
|
-
readonly name: string;
|
|
20
|
-
readonly category: AdornerCategories;
|
|
21
|
-
readonly enabledByDefault: boolean;
|
|
22
|
-
}
|
|
10
|
+
type AdornerSettingsMap = Map<string, boolean>;
|
|
23
11
|
|
|
24
12
|
export enum RegisteredAdorners {
|
|
25
13
|
AD = 'ad',
|
|
@@ -39,125 +27,6 @@ export enum RegisteredAdorners {
|
|
|
39
27
|
TOP_LAYER = 'top-layer',
|
|
40
28
|
}
|
|
41
29
|
|
|
42
|
-
/**
|
|
43
|
-
* This enum-like const object serves as the authoritative registry for all the
|
|
44
|
-
* adorners available.
|
|
45
|
-
**/
|
|
46
|
-
export function getRegisteredAdorner(which: RegisteredAdorners): RegisteredAdorner {
|
|
47
|
-
switch (which) {
|
|
48
|
-
case RegisteredAdorners.GRID:
|
|
49
|
-
return {
|
|
50
|
-
name: 'grid',
|
|
51
|
-
category: AdornerCategories.LAYOUT,
|
|
52
|
-
enabledByDefault: true,
|
|
53
|
-
};
|
|
54
|
-
case RegisteredAdorners.SUBGRID:
|
|
55
|
-
return {
|
|
56
|
-
name: 'subgrid',
|
|
57
|
-
category: AdornerCategories.LAYOUT,
|
|
58
|
-
enabledByDefault: true,
|
|
59
|
-
};
|
|
60
|
-
case RegisteredAdorners.GRID_LANES:
|
|
61
|
-
return {
|
|
62
|
-
name: 'grid-lanes',
|
|
63
|
-
category: AdornerCategories.LAYOUT,
|
|
64
|
-
enabledByDefault: true,
|
|
65
|
-
};
|
|
66
|
-
case RegisteredAdorners.FLEX:
|
|
67
|
-
return {
|
|
68
|
-
name: 'flex',
|
|
69
|
-
category: AdornerCategories.LAYOUT,
|
|
70
|
-
enabledByDefault: true,
|
|
71
|
-
};
|
|
72
|
-
case RegisteredAdorners.AD:
|
|
73
|
-
return {
|
|
74
|
-
name: 'ad',
|
|
75
|
-
category: AdornerCategories.SECURITY,
|
|
76
|
-
enabledByDefault: true,
|
|
77
|
-
};
|
|
78
|
-
case RegisteredAdorners.SCROLL_SNAP:
|
|
79
|
-
return {
|
|
80
|
-
name: 'scroll-snap',
|
|
81
|
-
category: AdornerCategories.LAYOUT,
|
|
82
|
-
enabledByDefault: true,
|
|
83
|
-
};
|
|
84
|
-
case RegisteredAdorners.STARTING_STYLE:
|
|
85
|
-
return {
|
|
86
|
-
name: 'starting-style',
|
|
87
|
-
category: AdornerCategories.LAYOUT,
|
|
88
|
-
enabledByDefault: true,
|
|
89
|
-
};
|
|
90
|
-
case RegisteredAdorners.CONTAINER:
|
|
91
|
-
return {
|
|
92
|
-
name: 'container',
|
|
93
|
-
category: AdornerCategories.LAYOUT,
|
|
94
|
-
enabledByDefault: true,
|
|
95
|
-
};
|
|
96
|
-
case RegisteredAdorners.SLOT:
|
|
97
|
-
return {
|
|
98
|
-
name: 'slot',
|
|
99
|
-
category: AdornerCategories.LAYOUT,
|
|
100
|
-
enabledByDefault: true,
|
|
101
|
-
};
|
|
102
|
-
case RegisteredAdorners.TOP_LAYER:
|
|
103
|
-
return {
|
|
104
|
-
name: 'top-layer',
|
|
105
|
-
category: AdornerCategories.LAYOUT,
|
|
106
|
-
enabledByDefault: true,
|
|
107
|
-
};
|
|
108
|
-
case RegisteredAdorners.REVEAL:
|
|
109
|
-
return {
|
|
110
|
-
name: 'reveal',
|
|
111
|
-
category: AdornerCategories.DEFAULT,
|
|
112
|
-
enabledByDefault: true,
|
|
113
|
-
};
|
|
114
|
-
case RegisteredAdorners.MEDIA:
|
|
115
|
-
return {
|
|
116
|
-
name: 'media',
|
|
117
|
-
category: AdornerCategories.DEFAULT,
|
|
118
|
-
enabledByDefault: false,
|
|
119
|
-
};
|
|
120
|
-
case RegisteredAdorners.SCROLL:
|
|
121
|
-
return {
|
|
122
|
-
name: 'scroll',
|
|
123
|
-
category: AdornerCategories.LAYOUT,
|
|
124
|
-
enabledByDefault: true,
|
|
125
|
-
};
|
|
126
|
-
case RegisteredAdorners.POPOVER: {
|
|
127
|
-
return {
|
|
128
|
-
name: 'popover',
|
|
129
|
-
category: AdornerCategories.LAYOUT,
|
|
130
|
-
enabledByDefault: true,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
case RegisteredAdorners.VIEW_SOURCE: {
|
|
134
|
-
return {
|
|
135
|
-
name: 'view-source',
|
|
136
|
-
category: AdornerCategories.DEFAULT,
|
|
137
|
-
enabledByDefault: true,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
let adornerNameToCategoryMap: Map<string, AdornerCategories>|undefined = undefined;
|
|
144
|
-
|
|
145
|
-
function getCategoryFromAdornerName(name: string): AdornerCategories {
|
|
146
|
-
if (!adornerNameToCategoryMap) {
|
|
147
|
-
adornerNameToCategoryMap = new Map();
|
|
148
|
-
for (const {name, category} of Object.values(RegisteredAdorners).map(getRegisteredAdorner)) {
|
|
149
|
-
adornerNameToCategoryMap.set(name, category);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return adornerNameToCategoryMap.get(name) || AdornerCategories.DEFAULT;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export const DefaultAdornerSettings: AdornerSetting[] =
|
|
156
|
-
Object.values(RegisteredAdorners).map(getRegisteredAdorner).map(({name, enabledByDefault}) => ({
|
|
157
|
-
adorner: name,
|
|
158
|
-
isEnabled: enabledByDefault,
|
|
159
|
-
}));
|
|
160
|
-
|
|
161
30
|
interface SettingStore<Setting> {
|
|
162
31
|
get(): Setting;
|
|
163
32
|
set(setting: Setting): void;
|
|
@@ -205,9 +74,11 @@ export class AdornerManager {
|
|
|
205
74
|
|
|
206
75
|
// Prune outdated adorners and add new ones to the persistence.
|
|
207
76
|
const outdatedAdorners = new Set(this.#adornerSettings.keys());
|
|
208
|
-
for (const
|
|
77
|
+
for (const adorner of Object.values(RegisteredAdorners)) {
|
|
209
78
|
outdatedAdorners.delete(adorner);
|
|
210
79
|
if (!this.#adornerSettings.has(adorner)) {
|
|
80
|
+
// Only the MEDIA adorner is disabled by default.
|
|
81
|
+
const isEnabled = adorner !== RegisteredAdorners.MEDIA;
|
|
211
82
|
this.#adornerSettings.set(adorner, isEnabled);
|
|
212
83
|
}
|
|
213
84
|
}
|
|
@@ -218,18 +89,3 @@ export class AdornerManager {
|
|
|
218
89
|
this.#persistCurrentSettings();
|
|
219
90
|
}
|
|
220
91
|
}
|
|
221
|
-
|
|
222
|
-
const OrderedAdornerCategories = [
|
|
223
|
-
AdornerCategories.SECURITY,
|
|
224
|
-
AdornerCategories.LAYOUT,
|
|
225
|
-
AdornerCategories.DEFAULT,
|
|
226
|
-
];
|
|
227
|
-
|
|
228
|
-
/** Use idx + 1 for the order to avoid JavaScript's 0 == false issue **/
|
|
229
|
-
export const AdornerCategoryOrder = new Map(OrderedAdornerCategories.map((category, idx) => [category, idx + 1]));
|
|
230
|
-
|
|
231
|
-
export function compareAdornerNamesByCategory(nameA: string, nameB: string): number {
|
|
232
|
-
const orderA = AdornerCategoryOrder.get(getCategoryFromAdornerName(nameA)) || Number.POSITIVE_INFINITY;
|
|
233
|
-
const orderB = AdornerCategoryOrder.get(getCategoryFromAdornerName(nameB)) || Number.POSITIVE_INFINITY;
|
|
234
|
-
return orderA - orderB;
|
|
235
|
-
}
|
|
@@ -49,8 +49,7 @@ const DEFAULT_VIEW: View = (input: ViewInput, _output: ViewOutput, target: HTMLE
|
|
|
49
49
|
// clang-format off
|
|
50
50
|
render(html`
|
|
51
51
|
<div class="header">
|
|
52
|
-
<devtools-adorner class="aggregated-issues-count"
|
|
53
|
-
.data=${{name: 'countWrapper'}}>
|
|
52
|
+
<devtools-adorner class="aggregated-issues-count" .name=${'countWrapper'}>
|
|
54
53
|
<span>${input.count}</span>
|
|
55
54
|
</devtools-adorner>
|
|
56
55
|
<div class="title">${i18nString(UIStrings.hiddenIssues)}</div>
|
|
@@ -98,10 +98,8 @@ export class IssueKindView extends UI.TreeOutline.TreeElement {
|
|
|
98
98
|
issueKindIcon.classList.add('leading-issue-icon', 'extra-large');
|
|
99
99
|
|
|
100
100
|
const countAdorner = new Adorners.Adorner.Adorner();
|
|
101
|
-
countAdorner.
|
|
102
|
-
|
|
103
|
-
content: this.#issueCount,
|
|
104
|
-
};
|
|
101
|
+
countAdorner.name = 'countWrapper';
|
|
102
|
+
countAdorner.append(this.#issueCount);
|
|
105
103
|
countAdorner.classList.add('aggregated-issues-count');
|
|
106
104
|
this.#issueCount.textContent = '0';
|
|
107
105
|
|
|
@@ -342,10 +342,8 @@ export class IssueView extends UI.TreeOutline.TreeElement {
|
|
|
342
342
|
this.#issueKindIcon.classList.add('leading-issue-icon', 'extra-large');
|
|
343
343
|
this.#aggregatedIssuesCount = document.createElement('span');
|
|
344
344
|
const countAdorner = new Adorners.Adorner.Adorner();
|
|
345
|
-
countAdorner.
|
|
346
|
-
|
|
347
|
-
content: this.#aggregatedIssuesCount,
|
|
348
|
-
};
|
|
345
|
+
countAdorner.name = 'countWrapper';
|
|
346
|
+
countAdorner.append(this.#aggregatedIssuesCount);
|
|
349
347
|
countAdorner.classList.add('aggregated-issues-count');
|
|
350
348
|
header.appendChild(this.#issueKindIcon);
|
|
351
349
|
header.appendChild(countAdorner);
|
|
@@ -323,8 +323,26 @@ const UIStrings = {
|
|
|
323
323
|
*/
|
|
324
324
|
initialPriorityToolTip: '{PH1}, Initial priority: {PH2}',
|
|
325
325
|
/**
|
|
326
|
-
* @description
|
|
326
|
+
* @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a render blocking resource.
|
|
327
327
|
*/
|
|
328
|
+
blocking: 'Blocking',
|
|
329
|
+
/**
|
|
330
|
+
* @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a resource that blocks the parser from starting to parse the document.
|
|
331
|
+
*/
|
|
332
|
+
inBodyParserBlocking: 'In-body parser blocking',
|
|
333
|
+
/**
|
|
334
|
+
* @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a non-blocking resource.
|
|
335
|
+
*/
|
|
336
|
+
nonBlocking: 'Non-blocking',
|
|
337
|
+
/**
|
|
338
|
+
* @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a non-blocking resource.
|
|
339
|
+
*/
|
|
340
|
+
nonBlockingDynamic: 'Non-blocking dynamic',
|
|
341
|
+
/**
|
|
342
|
+
* @description Text in Network Data Grid Node of the Network panel. Noun. Refers to a potentially blocking resource.
|
|
343
|
+
*/
|
|
344
|
+
potentiallyBlocking: 'Potentially blocking',
|
|
345
|
+
|
|
328
346
|
} as const;
|
|
329
347
|
const str_ = i18n.i18n.registerUIStrings('panels/network/NetworkDataGridNode.ts', UIStrings);
|
|
330
348
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
@@ -775,6 +793,25 @@ export class NetworkRequestNode extends NetworkNode {
|
|
|
775
793
|
return aRequest.identityCompare(bRequest);
|
|
776
794
|
}
|
|
777
795
|
|
|
796
|
+
static RenderBlockingComparator(a: NetworkNode, b: NetworkNode): number {
|
|
797
|
+
const aRequest = a.requestOrFirstKnownChildRequest();
|
|
798
|
+
const bRequest = b.requestOrFirstKnownChildRequest();
|
|
799
|
+
if (!aRequest || !bRequest) {
|
|
800
|
+
return !aRequest ? -1 : 1;
|
|
801
|
+
}
|
|
802
|
+
const order = [
|
|
803
|
+
Protocol.Network.RenderBlockingBehavior.InBodyParserBlocking,
|
|
804
|
+
Protocol.Network.RenderBlockingBehavior.Blocking,
|
|
805
|
+
Protocol.Network.RenderBlockingBehavior.PotentiallyBlocking,
|
|
806
|
+
Protocol.Network.RenderBlockingBehavior.NonBlocking,
|
|
807
|
+
Protocol.Network.RenderBlockingBehavior.NonBlockingDynamic,
|
|
808
|
+
undefined,
|
|
809
|
+
];
|
|
810
|
+
const aOrder = order.indexOf(aRequest.renderBlockingBehavior());
|
|
811
|
+
const bOrder = order.indexOf(bRequest.renderBlockingBehavior());
|
|
812
|
+
return aOrder - bOrder;
|
|
813
|
+
}
|
|
814
|
+
|
|
778
815
|
static RequestPropertyComparator(propertyName: string, a: NetworkNode, b: NetworkNode): number {
|
|
779
816
|
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
|
|
780
817
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -1051,6 +1088,10 @@ export class NetworkRequestNode extends NetworkNode {
|
|
|
1051
1088
|
this.setTextAndTitle(cell, this.requestInternal.isAdRelated().toLocaleString());
|
|
1052
1089
|
break;
|
|
1053
1090
|
}
|
|
1091
|
+
case 'render-blocking': {
|
|
1092
|
+
this.renderRenderBlockingCell(cell);
|
|
1093
|
+
break;
|
|
1094
|
+
}
|
|
1054
1095
|
case 'cookies': {
|
|
1055
1096
|
this.setTextAndTitle(cell, this.arrayLength(this.requestInternal.includedRequestCookies()));
|
|
1056
1097
|
break;
|
|
@@ -1360,6 +1401,29 @@ export class NetworkRequestNode extends NetworkNode {
|
|
|
1360
1401
|
}
|
|
1361
1402
|
}
|
|
1362
1403
|
|
|
1404
|
+
private renderRenderBlockingCell(cell: HTMLElement): void {
|
|
1405
|
+
switch (this.requestInternal.renderBlockingBehavior()) {
|
|
1406
|
+
case Protocol.Network.RenderBlockingBehavior.Blocking:
|
|
1407
|
+
UI.UIUtils.createTextChild(cell, i18nString(UIStrings.blocking));
|
|
1408
|
+
break;
|
|
1409
|
+
case Protocol.Network.RenderBlockingBehavior.InBodyParserBlocking:
|
|
1410
|
+
UI.UIUtils.createTextChild(cell, i18nString(UIStrings.inBodyParserBlocking));
|
|
1411
|
+
break;
|
|
1412
|
+
case Protocol.Network.RenderBlockingBehavior.NonBlocking:
|
|
1413
|
+
UI.UIUtils.createTextChild(cell, i18nString(UIStrings.nonBlocking));
|
|
1414
|
+
break;
|
|
1415
|
+
case Protocol.Network.RenderBlockingBehavior.NonBlockingDynamic:
|
|
1416
|
+
UI.UIUtils.createTextChild(cell, i18nString(UIStrings.nonBlockingDynamic));
|
|
1417
|
+
break;
|
|
1418
|
+
case Protocol.Network.RenderBlockingBehavior.PotentiallyBlocking:
|
|
1419
|
+
UI.UIUtils.createTextChild(cell, i18nString(UIStrings.potentiallyBlocking));
|
|
1420
|
+
break;
|
|
1421
|
+
default:
|
|
1422
|
+
UI.UIUtils.createTextChild(cell, '');
|
|
1423
|
+
break;
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1363
1427
|
#getLinkifierMetric(): Host.UserMetrics.Action|undefined {
|
|
1364
1428
|
if (this.requestInternal.resourceType().isStyleSheet()) {
|
|
1365
1429
|
return Host.UserMetrics.Action.StyleSheetInitiatorLinkClicked;
|
|
@@ -2754,11 +2754,9 @@ export class MoreFiltersDropDownUI extends Common.ObjectWrapper.ObjectWrapper<UI
|
|
|
2754
2754
|
this.filterElement.setAttribute('jslog', `${VisualLogging.dropDown('more-filters').track({click: true})}`);
|
|
2755
2755
|
|
|
2756
2756
|
this.activeFiltersCountAdorner = new Adorners.Adorner.Adorner();
|
|
2757
|
+
this.activeFiltersCountAdorner.name = 'countWrapper';
|
|
2757
2758
|
this.activeFiltersCount = document.createElement('span');
|
|
2758
|
-
this.activeFiltersCountAdorner.
|
|
2759
|
-
name: 'countWrapper',
|
|
2760
|
-
content: this.activeFiltersCount,
|
|
2761
|
-
};
|
|
2759
|
+
this.activeFiltersCountAdorner.append(this.activeFiltersCount);
|
|
2762
2760
|
this.activeFiltersCountAdorner.classList.add('active-filters-count');
|
|
2763
2761
|
this.updateActiveFiltersCount();
|
|
2764
2762
|
|
|
@@ -152,6 +152,10 @@ const UIStrings = {
|
|
|
152
152
|
* @description Text to show whether a request is ad-related
|
|
153
153
|
*/
|
|
154
154
|
isAdRelated: 'Is Ad-Related',
|
|
155
|
+
/**
|
|
156
|
+
* @description Text in Network Log View Columns of the Network panel
|
|
157
|
+
*/
|
|
158
|
+
renderBlocking: 'Render Blocking',
|
|
155
159
|
} as const;
|
|
156
160
|
const str_ = i18n.i18n.registerUIStrings('panels/network/NetworkLogViewColumns.ts', UIStrings);
|
|
157
161
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
@@ -1192,6 +1196,11 @@ const DEFAULT_COLUMNS = [
|
|
|
1192
1196
|
title: i18nLazyString(UIStrings.isAdRelated),
|
|
1193
1197
|
sortingFunction: NetworkRequestNode.IsAdRelatedComparator,
|
|
1194
1198
|
},
|
|
1199
|
+
{
|
|
1200
|
+
id: 'render-blocking',
|
|
1201
|
+
title: i18nLazyString(UIStrings.renderBlocking),
|
|
1202
|
+
sortingFunction: NetworkRequestNode.RenderBlockingComparator,
|
|
1203
|
+
},
|
|
1195
1204
|
// This header is a placeholder to let datagrid know that it can be sorted by this column, but never shown.
|
|
1196
1205
|
{
|
|
1197
1206
|
id: 'waterfall',
|
|
@@ -46,6 +46,7 @@ export class ScreencastApp implements Common.App.App,
|
|
|
46
46
|
|
|
47
47
|
presentUI(document: Document): void {
|
|
48
48
|
this.rootView = new UI.RootView.RootView();
|
|
49
|
+
this.rootView.registerRequiredCSS(UI.inspectorCommonStyles);
|
|
49
50
|
|
|
50
51
|
this.rootSplitWidget =
|
|
51
52
|
new UI.SplitWidget.SplitWidget(false, true, 'inspector-view.screencast-split-view-state', 300, 300);
|