Skip to content

Commit 0334a50

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Adopt UI eng vision in the OriginTrialTreeView class.
The rest of the file will be migrated in the subsequent CLs Bug: 407750554 Change-Id: I1ecc286b1ebc76aadaa620d0cf5d9db252359b3e Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7096385 Reviewed-by: Jack Franklin <[email protected]> Auto-Submit: Danil Somsikov <[email protected]> Commit-Queue: Jack Franklin <[email protected]>
1 parent 5eaf0ff commit 0334a50

File tree

4 files changed

+62
-60
lines changed

4 files changed

+62
-60
lines changed

front_end/panels/application/components/FrameDetailsView.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import * as LegacyWrapper from '../../../ui/components/legacy_wrapper/legacy_wra
2323
import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js';
2424
import type * as ReportView from '../../../ui/components/report_view/report_view.js';
2525
import * as Components from '../../../ui/legacy/components/utils/utils.js';
26+
import * as UI from '../../../ui/legacy/legacy.js';
2627
import * as Lit from '../../../ui/lit/lit.js';
2728
import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
2829

@@ -35,6 +36,7 @@ import {
3536
import type {StackTraceData} from './StackTrace.js';
3637

3738
const {html} = Lit;
39+
const {widgetConfig} = UI.Widget;
3840

3941
const UIStrings = {
4042
/**
@@ -283,7 +285,6 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
283285
#protocolMonitorExperimentEnabled = false;
284286
#permissionsPolicies: Promise<Protocol.Page.PermissionsPolicyFeatureState[]|null>|null = null;
285287
#permissionsPolicySectionData: PermissionsPolicySectionData = {policies: [], showDetails: false};
286-
#originTrialTreeView: OriginTrialTreeView = new OriginTrialTreeView();
287288
#linkifier = new Components.Linkifier.Linkifier();
288289
#adScriptAncestry: Protocol.Page.AdScriptAncestry|null = null;
289290

@@ -317,7 +318,7 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
317318
if (!this.#permissionsPolicies && this.#frame) {
318319
this.#permissionsPolicies = this.#frame.getPermissionsPolicyState();
319320
}
320-
await RenderCoordinator.write('FrameDetailsView render', () => {
321+
await RenderCoordinator.write('FrameDetailsView render', async () => {
321322
if (!this.#frame) {
322323
return;
323324
}
@@ -331,7 +332,7 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
331332
${this.#renderDocumentSection()}
332333
${this.#renderIsolationSection()}
333334
${this.#renderApiAvailabilitySection()}
334-
${this.#renderOriginTrial()}
335+
${await this.#renderOriginTrial()}
335336
${Lit.Directives.until(this.#permissionsPolicies?.then(policies => {
336337
this.#permissionsPolicySectionData.policies = policies || [];
337338
return html`
@@ -348,17 +349,12 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
348349
});
349350
}
350351

351-
#renderOriginTrial(): Lit.LitTemplate {
352+
async #renderOriginTrial(): Promise<Lit.LitTemplate> {
352353
if (!this.#frame) {
353354
return Lit.nothing;
354355
}
355356

356-
this.#originTrialTreeView.classList.add('span-cols');
357-
358-
void this.#frame.getOriginTrials().then(trials => {
359-
this.#originTrialTreeView.data = {trials};
360-
});
361-
357+
const data = {trials: await this.#frame.getOriginTrials()};
362358
// clang-format off
363359
return html`
364360
<devtools-report-section-header>
@@ -373,7 +369,8 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
373369
</x-link>
374370
</span>
375371
</devtools-report-section>
376-
${this.#originTrialTreeView}
372+
<devtools-widget class="span-cols" .widgetConfig=${widgetConfig(OriginTrialTreeView, {data})}>
373+
</devtools-widget>
377374
<devtools-report-divider></devtools-report-divider>`;
378375
// clang-format on
379376
}

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

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,24 @@
44

55
import * as Protocol from '../../../generated/protocol.js';
66
import {
7-
getElementWithinComponent,
87
renderElementIntoDOM,
98
stripLitHtmlCommentNodes,
109
} from '../../../testing/DOMHelpers.js';
1110
import {describeWithLocale} from '../../../testing/LocaleHelpers.js';
1211
import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js';
13-
import * as TreeOutline from '../../../ui/components/tree_outline/tree_outline.js';
12+
import type * as TreeOutline from '../../../ui/components/tree_outline/tree_outline.js';
1413

1514
import * as ApplicationComponents from './components.js';
1615

1716
async function renderOriginTrialTreeView(
1817
data: ApplicationComponents.OriginTrialTreeView.OriginTrialTreeViewData,
19-
): Promise<{
20-
component: ApplicationComponents.OriginTrialTreeView.OriginTrialTreeView,
21-
shadowRoot: ShadowRoot,
22-
}> {
18+
): Promise<ApplicationComponents.OriginTrialTreeView.OriginTrialTreeView> {
2319
const component = new ApplicationComponents.OriginTrialTreeView.OriginTrialTreeView();
2420
component.data = data;
2521
renderElementIntoDOM(component);
26-
assert.isNotNull(component.shadowRoot);
22+
await component.updateComplete;
2723
await RenderCoordinator.done();
28-
return {
29-
component,
30-
shadowRoot: component.shadowRoot,
31-
};
24+
return component;
3225
}
3326

3427
type OriginTrialTreeOutline =
@@ -43,10 +36,9 @@ async function renderOriginTrialTreeViewTreeOutline(
4336
component: OriginTrialTreeOutline,
4437
shadowRoot: ShadowRoot,
4538
}> {
46-
const {component} = await renderOriginTrialTreeView(data);
39+
const component = await renderOriginTrialTreeView(data);
4740
const treeOutline: OriginTrialTreeOutline =
48-
getElementWithinComponent<ApplicationComponents.OriginTrialTreeView.OriginTrialTreeView, OriginTrialTreeOutline>(
49-
component, 'devtools-tree-outline', TreeOutline.TreeOutline.TreeOutline);
41+
component.contentElement.querySelector<OriginTrialTreeOutline>('devtools-tree-outline')!;
5042
assert.isNotNull(treeOutline.shadowRoot);
5143
return {
5244
component: treeOutline,
@@ -208,6 +200,7 @@ describeWithLocale('OriginTrialTreeView', () => {
208200
trialWithUnparsableToken,
209201
],
210202
});
203+
211204
const visibleItems = shadowRoot.querySelectorAll<HTMLLIElement>('li[role="treeitem"]');
212205
assert.lengthOf(visibleItems, 3);
213206
assert.include(nodeKeyInnerHTML(visibleItems[0]), trialWithMultipleTokens.trialName);

front_end/panels/application/components/OriginTrialTreeView.ts

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import * as i18n from '../../../core/i18n/i18n.js';
1111
import * as Protocol from '../../../generated/protocol.js';
1212
import * as Adorners from '../../../ui/components/adorners/adorners.js';
1313
import type * as TreeOutline from '../../../ui/components/tree_outline/tree_outline.js';
14+
import * as UI from '../../../ui/legacy/legacy.js';
1415
import * as Lit from '../../../ui/lit/lit.js';
1516

1617
import badgeStyles from './badge.css.js';
@@ -118,6 +119,7 @@ function constructOriginTrialTree(originTrial: Protocol.Page.OriginTrial): TreeN
118119

119120
return html`
120121
${trial.trialName}
122+
<style>${badgeStyles}</style>
121123
${createBadge({
122124
badgeContent: trial.status,
123125
style: trial.status === Protocol.Page.OriginTrialStatus.Enabled ? 'success' : 'error',
@@ -269,7 +271,9 @@ export class OriginTrialTokenRows extends HTMLElement {
269271
const tokenDetails: TokenField[] = [
270272
{
271273
name: i18nString(UIStrings.status),
272-
value: html`${createBadge({
274+
value: html`
275+
<style>${badgeStyles}</style>
276+
${createBadge({
273277
badgeContent: this.#tokenWithStatus.status,
274278
style: this.#tokenWithStatus.status === Protocol.Page.OriginTrialTokenStatus.Success ? 'success' : 'error',
275279
})}`,
@@ -287,7 +291,6 @@ export class OriginTrialTokenRows extends HTMLElement {
287291
Lit.render(
288292
html`
289293
<style>
290-
${badgeStyles}
291294
${originTrialTokenRowsStyles}
292295
</style>
293296
<div class="content">
@@ -304,47 +307,56 @@ export interface OriginTrialTreeViewData {
304307
trials: Protocol.Page.OriginTrial[];
305308
}
306309

307-
export class OriginTrialTreeView extends HTMLElement {
308-
readonly #shadow = this.attachShadow({mode: 'open'});
310+
type View = (input: OriginTrialTreeViewData, output: undefined, target: HTMLElement) => void;
311+
312+
const DEFAULT_VIEW: View = (input, _output, target) => {
313+
if (!input.trials.length) {
314+
// clang-format off
315+
Lit.render(html`
316+
<style>${originTrialTreeViewStyles}</style>
317+
<span class="status-badge">
318+
<devtools-icon class="medium" name="clear"></devtools-icon>
319+
<span>${i18nString(UIStrings.noTrialTokens)}</span>
320+
</span>`, target);
321+
// clang-format on
322+
return;
323+
}
309324

310-
set data(data: OriginTrialTreeViewData) {
311-
this.#render(data.trials);
325+
// clang-format off
326+
Lit.render(html`
327+
<style>
328+
${originTrialTreeViewStyles}
329+
</style>
330+
<devtools-tree-outline .data=${{
331+
tree: input.trials.map(constructOriginTrialTree),
332+
defaultRenderer,
333+
} as TreeOutline.TreeOutline.TreeOutlineData < OriginTrialTreeNodeData >}>
334+
</devtools-tree-outline>
335+
`, target);
336+
// clang-format on
337+
};
338+
339+
export class OriginTrialTreeView extends UI.Widget.Widget {
340+
#data: OriginTrialTreeViewData = {trials: []};
341+
#view: View;
342+
343+
constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
344+
super(element, {useShadowDom: true});
345+
this.#view = view;
312346
}
313347

314-
#render(trials: Protocol.Page.OriginTrial[]): void {
315-
if (!trials.length) {
316-
Lit.render(
317-
html`
318-
<style>${originTrialTreeViewStyles}</style>
319-
<span class="status-badge">
320-
<devtools-icon class="medium" name="clear"></devtools-icon>
321-
<span>${i18nString(UIStrings.noTrialTokens)}</span>
322-
</span>`,
323-
this.#shadow, {host: this});
324-
return;
325-
}
348+
set data(data: OriginTrialTreeViewData) {
349+
this.#data = data;
350+
this.requestUpdate();
351+
}
326352

327-
Lit.render(
328-
html`
329-
<style>
330-
${badgeStyles}
331-
${originTrialTreeViewStyles}
332-
</style>
333-
<devtools-tree-outline .data=${{
334-
tree: trials.map(constructOriginTrialTree),
335-
defaultRenderer,
336-
} as TreeOutline.TreeOutline.TreeOutlineData < OriginTrialTreeNodeData >}>
337-
</devtools-tree-outline>
338-
`,
339-
this.#shadow, {host: this});
353+
override performUpdate(): void {
354+
this.#view(this.#data, undefined, this.contentElement);
340355
}
341356
}
342357

343-
customElements.define('devtools-resources-origin-trial-tree-view', OriginTrialTreeView);
344-
345358
declare global {
346359
interface HTMLElementTagNameMap {
347-
'devtools-resources-origin-trial-tree-view': OriginTrialTreeView;
348360
'devtools-resources-origin-trial-token-rows': OriginTrialTokenRows;
349361
}
350362
}

front_end/panels/application/components/badge.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020
}
2121

2222
/* Use mono-space source code font to assist reading of adorner content */
23-
:host {
23+
:host devtools-adorner {
2424
font-family: var(--source-code-font-family);
2525
}

0 commit comments

Comments
 (0)