Skip to content

Commit aba1bb1

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Adopt UI eng vision in the FrameDetailsView
Bug: 407750239 Change-Id: I70e6848a124e9b95a1510c896fd1b4dfce244229 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7158008 Auto-Submit: Danil Somsikov <[email protected]> Reviewed-by: Wolfgang Beyer <[email protected]> Commit-Queue: Danil Somsikov <[email protected]>
1 parent 7463a4b commit aba1bb1

File tree

4 files changed

+76
-80
lines changed

4 files changed

+76
-80
lines changed

front_end/panels/application/ApplicationPanelSidebar.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,8 +2149,7 @@ export class FrameTreeElement extends ApplicationPanelTreeElement {
21492149
private readonly treeElementForResource: Map<string, FrameResourceTreeElement>;
21502150
private treeElementForWindow: Map<Protocol.Target.TargetID, FrameWindowTreeElement>;
21512151
private treeElementForWorker: Map<Protocol.Target.TargetID, WorkerTreeElement>;
2152-
private view: LegacyWrapper.LegacyWrapper
2153-
.LegacyWrapper<UI.Widget.Widget, ApplicationComponents.FrameDetailsView.FrameDetailsReportView>|null;
2152+
private view: ApplicationComponents.FrameDetailsView.FrameDetailsReportView|null;
21542153

21552154
constructor(section: ResourcesSection, frame: SDK.ResourceTreeModel.ResourceTreeFrame) {
21562155
super(section.panel, '', false, 'frame');
@@ -2195,8 +2194,8 @@ export class FrameTreeElement extends ApplicationPanelTreeElement {
21952194
this.treeElementForWorker.clear();
21962195

21972196
if (this.selected) {
2198-
this.view = LegacyWrapper.LegacyWrapper.legacyWrapper(
2199-
UI.Widget.Widget, new ApplicationComponents.FrameDetailsView.FrameDetailsReportView(this.frame));
2197+
this.view = new ApplicationComponents.FrameDetailsView.FrameDetailsReportView();
2198+
this.view.frame = this.frame;
22002199
this.showView(this.view);
22012200
} else {
22022201
this.view = null;
@@ -2233,8 +2232,8 @@ export class FrameTreeElement extends ApplicationPanelTreeElement {
22332232
override onselect(selectedByUser?: boolean): boolean {
22342233
super.onselect(selectedByUser);
22352234
if (!this.view) {
2236-
this.view = LegacyWrapper.LegacyWrapper.legacyWrapper(
2237-
UI.Widget.Widget, new ApplicationComponents.FrameDetailsView.FrameDetailsReportView(this.frame));
2235+
this.view = new ApplicationComponents.FrameDetailsView.FrameDetailsReportView();
2236+
this.view.frame = this.frame;
22382237
}
22392238
Host.userMetrics.panelShown('frame-details');
22402239
this.showView(this.view);

front_end/panels/application/components/FrameDetailsView.test.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ import {
1919
dispatchEvent,
2020
} from '../../../testing/MockConnection.js';
2121
import * as ExpandableList from '../../../ui/components/expandable_list/expandable_list.js';
22-
import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js';
23-
import * as ReportView from '../../../ui/components/report_view/report_view.js';
22+
import type * as ReportView from '../../../ui/components/report_view/report_view.js';
2423

2524
import * as ApplicationComponents from './components.js';
2625

@@ -89,13 +88,13 @@ const makeFrame = (target: SDK.Target.Target) => {
8988
describeWithMockConnection('FrameDetailsView', () => {
9089
it('renders with a title', async () => {
9190
const frame = makeFrame(createTarget());
92-
const component = new ApplicationComponents.FrameDetailsView.FrameDetailsReportView(frame);
91+
const component = new ApplicationComponents.FrameDetailsView.FrameDetailsReportView();
92+
component.frame = frame;
9393
renderElementIntoDOM(component);
9494

95-
assert.isNotNull(component.shadowRoot);
96-
void component.render();
97-
await RenderCoordinator.done({waitForWork: true});
98-
const report = getElementWithinComponent(component, 'devtools-report', ReportView.ReportView.Report);
95+
await component.updateComplete;
96+
97+
const report = component.contentElement.querySelector('devtools-report') as ReportView.ReportView.Report;
9998

10099
const titleElement = report.shadowRoot!.querySelector('.report-title');
101100
assert.strictEqual(titleElement?.textContent, frame.displayName());
@@ -180,14 +179,15 @@ describeWithMockConnection('FrameDetailsView', () => {
180179
}],
181180
});
182181

183-
const component = new ApplicationComponents.FrameDetailsView.FrameDetailsReportView(frame);
182+
const component = new ApplicationComponents.FrameDetailsView.FrameDetailsReportView();
183+
component.frame = frame;
184184
renderElementIntoDOM(component);
185185

186-
assert.isNotNull(component.shadowRoot);
187-
await component.render();
188-
await RenderCoordinator.done({waitForWork: true});
186+
await component.updateComplete;
187+
188+
await raf();
189189

190-
const keys = getCleanTextContentFromElements(component.shadowRoot, 'devtools-report-key');
190+
const keys = [...component.contentElement.querySelectorAll('devtools-report-key')].map(k => k.deepInnerText());
191191
assert.deepEqual(keys, [
192192
'URL',
193193
'Origin',
@@ -205,7 +205,7 @@ describeWithMockConnection('FrameDetailsView', () => {
205205
'Measure Memory',
206206
]);
207207

208-
const values = [...component.shadowRoot.querySelectorAll('devtools-report-value')].map(v => v.deepInnerText());
208+
const values = [...component.contentElement.querySelectorAll('devtools-report-value')].map(v => v.deepInnerText());
209209
assert.deepEqual(values, [
210210
'https://www.example.com/path/page.html',
211211
'https://www.example.com',
@@ -227,8 +227,8 @@ report-uri: https://www.example.com/csp`,
227227
'available\nLearn more',
228228
]);
229229

230-
const stackTrace = getElementWithinComponent(
231-
component, 'devtools-resources-stack-trace', ApplicationComponents.StackTrace.StackTrace);
230+
const stackTrace = component.contentElement.querySelector('devtools-resources-stack-trace') as
231+
ApplicationComponents.StackTrace.StackTrace;
232232
assert.isNotNull(stackTrace.shadowRoot);
233233
const expandableList =
234234
getElementWithinComponent(stackTrace, 'devtools-expandable-list', ExpandableList.ExpandableList.ExpandableList);
@@ -246,15 +246,15 @@ report-uri: https://www.example.com/csp`,
246246
assert.deepEqual(stackTraceText[0], 'function1\n\xA0@\xA0www.example.com/script.js:16');
247247

248248
const adStatusList =
249-
component.shadowRoot.querySelector('devtools-report-value.ad-status-list devtools-expandable-list');
249+
component.contentElement.querySelector('devtools-report-value.ad-status-list devtools-expandable-list');
250250
assert.exists(adStatusList);
251251
const adStatusExpandableButton = adStatusList.shadowRoot!.querySelector('button');
252252
assert.notExists(adStatusExpandableButton);
253253
const adStatusItem = adStatusList.shadowRoot!.querySelector('.expandable-list-items');
254254
assert.exists(adStatusItem);
255255
assert.strictEqual(adStatusItem.textContent?.trim(), 'root');
256256

257-
const adScriptAncestryList = component.shadowRoot.querySelector(
257+
const adScriptAncestryList = component.contentElement.querySelector(
258258
'devtools-report-value.creator-ad-script-ancestry-list devtools-expandable-list');
259259
assert.exists(adScriptAncestryList);
260260
const adScriptAncestryExpandableButton = adScriptAncestryList.shadowRoot!.querySelector('button');

front_end/panels/application/components/FrameDetailsView.ts

Lines changed: 50 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright 2021 The Chromium Authors
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
4-
/* eslint-disable @devtools/no-lit-render-outside-of-view */
54

65
import '../../../ui/components/expandable_list/expandable_list.js';
76
import '../../../ui/components/report_view/report_view.js';
@@ -20,8 +19,6 @@ import * as NetworkForward from '../../../panels/network/forward/forward.js';
2019
import * as CspEvaluator from '../../../third_party/csp_evaluator/csp_evaluator.js';
2120
import * as Buttons from '../../../ui/components/buttons/buttons.js';
2221
import type * as ExpandableList from '../../../ui/components/expandable_list/expandable_list.js';
23-
import * as LegacyWrapper from '../../../ui/components/legacy_wrapper/legacy_wrapper.js';
24-
import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js';
2522
import type * as ReportView from '../../../ui/components/report_view/report_view.js';
2623
import * as Components from '../../../ui/legacy/components/utils/utils.js';
2724
import * as UI from '../../../ui/legacy/legacy.js';
@@ -288,7 +285,9 @@ interface FrameDetailsViewInput {
288285
onRevealInSources: () => void;
289286
}
290287

291-
function renderFrameDetailsView(input: FrameDetailsViewInput, target: ShadowRoot): void {
288+
type View = (input: FrameDetailsViewInput, output: undefined, target: HTMLElement) => void;
289+
290+
const DEFAULT_VIEW: View = (input, _output, target) => {
292291
if (!input.frame) {
293292
return;
294293
}
@@ -310,7 +309,7 @@ function renderFrameDetailsView(input: FrameDetailsViewInput, target: ShadowRoot
310309
</devtools-report>
311310
`, target);
312311
// clang-format on
313-
}
312+
};
314313

315314
function renderOriginTrial(trials: Protocol.Page.OriginTrial[]|null): LitTemplate {
316315
if (!trials) {
@@ -848,27 +847,31 @@ function renderAdditionalInfoSection(frame: SDK.ResourceTreeModel.ResourceTreeFr
848847
`;
849848
}
850849

851-
export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.WrappableComponent {
852-
readonly #shadow = this.attachShadow({mode: 'open'});
850+
export class FrameDetailsReportView extends UI.Widget.Widget {
853851
#frame?: SDK.ResourceTreeModel.ResourceTreeFrame;
854852
#target: SDK.Target.Target|null = null;
855853
#protocolMonitorExperimentEnabled = false;
856854
#permissionsPolicies: Promise<Protocol.Page.PermissionsPolicyFeatureState[]|null>|null = null;
857855
#linkifier = new Components.Linkifier.Linkifier();
858856
#adScriptAncestry: Protocol.Page.AdScriptAncestry|null = null;
857+
#view: View;
859858

860-
constructor(frame: SDK.ResourceTreeModel.ResourceTreeFrame) {
861-
super();
859+
constructor(element?: HTMLElement, view = DEFAULT_VIEW) {
860+
super(element, {useShadowDom: true});
861+
this.#protocolMonitorExperimentEnabled = Root.Runtime.experiments.isEnabled('protocol-monitor');
862+
this.#view = view;
863+
}
864+
865+
set frame(frame: SDK.ResourceTreeModel.ResourceTreeFrame) {
862866
this.#frame = frame;
863-
void this.render();
867+
this.requestUpdate();
864868
}
865869

866-
connectedCallback(): void {
867-
this.parentElement?.classList.add('overflow-auto');
868-
this.#protocolMonitorExperimentEnabled = Root.Runtime.experiments.isEnabled('protocol-monitor');
870+
get frame(): SDK.ResourceTreeModel.ResourceTreeFrame|undefined {
871+
return this.#frame;
869872
}
870873

871-
override async render(): Promise<void> {
874+
override async performUpdate(): Promise<void> {
872875
const result = await this.#frame?.parentFrame()?.getAdScriptAncestry(this.#frame?.id);
873876
if (result && result.ancestryChain.length > 0) {
874877
this.#adScriptAncestry = result;
@@ -887,41 +890,39 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
887890
if (!this.#permissionsPolicies && this.#frame) {
888891
this.#permissionsPolicies = this.#frame.getPermissionsPolicyState();
889892
}
890-
await RenderCoordinator.write('FrameDetailsView render', async () => {
891-
const frame = this.#frame;
892-
if (!frame) {
893-
return;
894-
}
895-
const networkManager = frame.resourceTreeModel().target().model(SDK.NetworkManager.NetworkManager);
896-
const securityIsolationInfo = networkManager?.getSecurityIsolationStatus(frame.id);
897-
const linkTargetDOMNode = frame.getOwnerDOMNodeOrDocument();
898-
const frameRequest = frame.resourceForURL(frame.url)?.request;
899-
const input = {
900-
frame,
901-
target: this.#target,
902-
protocolMonitorExperimentEnabled: this.#protocolMonitorExperimentEnabled,
903-
permissionsPolicies: this.#permissionsPolicies,
904-
adScriptAncestry: this.#adScriptAncestry,
905-
linkifier: this.#linkifier,
906-
linkTargetDOMNode,
907-
trials: await frame.getOriginTrials(),
908-
securityIsolationInfo,
909-
onRevealInNetwork: frameRequest ?
910-
() => {
911-
const requestLocation = NetworkForward.UIRequestLocation.UIRequestLocation.tab(
912-
frameRequest, NetworkForward.UIRequestLocation.UIRequestTabs.HEADERS_COMPONENT);
913-
return Common.Revealer.reveal(requestLocation);
914-
} :
915-
undefined,
916-
onRevealInSources: async () => {
917-
const sourceCode = this.#uiSourceCodeForFrame(frame);
918-
if (sourceCode) {
919-
await Common.Revealer.reveal(sourceCode);
920-
}
921-
},
922-
};
923-
renderFrameDetailsView(input, this.#shadow);
924-
});
893+
const frame = this.#frame;
894+
if (!frame) {
895+
return;
896+
}
897+
const networkManager = frame.resourceTreeModel().target().model(SDK.NetworkManager.NetworkManager);
898+
const securityIsolationInfo = networkManager?.getSecurityIsolationStatus(frame.id);
899+
const linkTargetDOMNode = frame.getOwnerDOMNodeOrDocument();
900+
const frameRequest = frame.resourceForURL(frame.url)?.request;
901+
const input = {
902+
frame,
903+
target: this.#target,
904+
protocolMonitorExperimentEnabled: this.#protocolMonitorExperimentEnabled,
905+
permissionsPolicies: this.#permissionsPolicies,
906+
adScriptAncestry: this.#adScriptAncestry,
907+
linkifier: this.#linkifier,
908+
linkTargetDOMNode,
909+
trials: await frame.getOriginTrials(),
910+
securityIsolationInfo,
911+
onRevealInNetwork: frameRequest ?
912+
() => {
913+
const requestLocation = NetworkForward.UIRequestLocation.UIRequestLocation.tab(
914+
frameRequest, NetworkForward.UIRequestLocation.UIRequestTabs.HEADERS_COMPONENT);
915+
return Common.Revealer.reveal(requestLocation);
916+
} :
917+
undefined,
918+
onRevealInSources: async () => {
919+
const sourceCode = this.#uiSourceCodeForFrame(frame);
920+
if (sourceCode) {
921+
await Common.Revealer.reveal(sourceCode);
922+
}
923+
},
924+
};
925+
this.#view(input, undefined, this.contentElement);
925926
}
926927

927928
#uiSourceCodeForFrame(frame: SDK.ResourceTreeModel.ResourceTreeFrame): Workspace.UISourceCode.UISourceCode|null {
@@ -937,11 +938,3 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
937938
return null;
938939
}
939940
}
940-
941-
customElements.define('devtools-resources-frame-details-view', FrameDetailsReportView);
942-
943-
declare global {
944-
interface HTMLElementTagNameMap {
945-
'devtools-resources-frame-details-view': FrameDetailsReportView;
946-
}
947-
}

front_end/panels/application/components/frameDetailsReportView.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
* found in the LICENSE file.
55
*/
66

7+
:host {
8+
overflow: auto;
9+
}
10+
711
.text-ellipsis {
812
overflow: hidden;
913
text-overflow: ellipsis;

0 commit comments

Comments
 (0)