chrome-devtools-frontend
Version:
Chrome DevTools UI
112 lines (97 loc) • 3.64 kB
text/typescript
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import type * as SDK from '../../core/sdk/sdk.js';
import * as UI from '../../ui/legacy/legacy.js';
import * as Lit from '../../ui/lit/lit.js';
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
import * as LayerViewer from '../layer_viewer/layer_viewer.js';
const {html, render} = Lit;
const {widget} = UI.Widget;
export interface ViewInput {
showImageCallback: (arg0?: string|undefined) => void;
snapshot: SDK.PaintProfiler.PaintProfilerSnapshot|null;
log: SDK.PaintProfiler.PaintProfilerLogItem[];
scale: number;
selectionWindow: {left: number, right: number}|null;
onWindowChanged: (window: {left: number, right: number}|null) => void;
}
export type ViewOutput = undefined;
export type View = (input: ViewInput, output: ViewOutput, target: HTMLElement) => void;
export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTMLElement): void => {
// clang-format off
render(html`
<devtools-split-view direction="column" jslog=${VisualLogging.pane('layers.paint-profiler').track({resize: true})}>
<devtools-widget slot="sidebar"
${widget(LayerViewer.PaintProfilerView.PaintProfilerCommandLogView, {
commandLog: input.log,
selectionWindow: input.selectionWindow,
})}>
</devtools-widget>
<devtools-widget slot="main"
${widget(LayerViewer.PaintProfilerView.PaintProfilerView, {
showImageCallback: input.showImageCallback,
snapshotAndLog: {snapshot: input.snapshot, log: input.log},
scale: input.scale,
})}
@WindowChanged=${(e: CustomEvent<{left: number, right: number}|null>) => input.onWindowChanged(e.detail)}>
</devtools-widget>
</devtools-split-view>
`, target);
// clang-format on
};
export class LayerPaintProfilerView extends UI.Widget.VBox {
readonly #showImageCallback: (arg0?: string|undefined) => void;
#snapshot: SDK.PaintProfiler.PaintProfilerSnapshot|null = null;
#log: SDK.PaintProfiler.PaintProfilerLogItem[] = [];
#scale = 1;
#selectionWindow: {left: number, right: number}|null = null;
readonly #view: View;
constructor(showImageCallback: (arg0?: string|undefined) => void, view: View = DEFAULT_VIEW) {
super();
this.#showImageCallback = showImageCallback;
this.#view = view;
}
override wasShown(): void {
super.wasShown();
this.requestUpdate();
}
override performUpdate(): void {
const input: ViewInput = {
showImageCallback: this.#showImageCallback,
snapshot: this.#snapshot,
log: this.#log,
scale: this.#scale,
selectionWindow: this.#selectionWindow,
onWindowChanged: this.onWindowChanged,
};
this.#view(input, undefined, this.contentElement);
}
reset(): void {
if (this.#snapshot) {
this.#snapshot.release();
}
this.#snapshot = null;
this.#log = [];
this.#selectionWindow = null;
this.requestUpdate();
}
profile(snapshot: SDK.PaintProfiler.PaintProfilerSnapshot): void {
void snapshot.commandLog().then(log => {
if (this.#snapshot) {
this.#snapshot.release();
}
this.#snapshot = snapshot;
this.#log = log || [];
this.requestUpdate();
});
}
setScale(scale: number): void {
this.#scale = scale;
this.requestUpdate();
}
private onWindowChanged = (window: {left: number, right: number}|null): void => {
this.#selectionWindow = window;
this.requestUpdate();
};
}