1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
import type {GraphDumpRemote} from './discards.mojom-webui.js';
import {GraphChangeStreamReceiver, GraphDump} from './discards.mojom-webui.js';
import {Graph} from './graph.js';
import {getCss} from './graph_tab.css.js';
import {getHtml} from './graph_tab.html.js';
export interface GraphTabElement {
$: {
toolTips: HTMLElement,
graphBody: SVGElement,
};
}
export class GraphTabElement extends CrLitElement {
static get is() {
return 'graph-tab';
}
static override get styles() {
return getCss();
}
override render() {
return getHtml.bind(this)();
}
/**
* The Mojo graph data source.
*/
private graphDump_: GraphDumpRemote|null = null;
/**
* The WebView's content window object.
*/
private graph_: Graph|null = null;
private resizeObserver_: ResizeObserver|null = null;
override connectedCallback() {
super.connectedCallback();
this.graph_ = new Graph(this.$.graphBody, this.$.toolTips);
this.graph_.initialize();
// Set up a resize listener to track the graph on resize.
this.resizeObserver_ = new ResizeObserver(() => {
if (this.graph_) {
this.graph_.onResize();
}
});
this.resizeObserver_.observe(this.$.graphBody);
this.graphDump_ = GraphDump.getRemote();
const client = new GraphChangeStreamReceiver(this.graph_);
// Subscribe for graph updates.
this.graphDump_.subscribeToChanges(client.$.bindNewPipeAndPassRemote());
}
override disconnectedCallback() {
// TODO(siggi): Is there a way to tear down the binding explicitly?
this.graphDump_ = null;
if (this.resizeObserver_) {
this.resizeObserver_.disconnect();
this.resizeObserver_ = null;
}
this.graph_ = null;
}
// Handle request for node descriptions from the Graph.
protected onRequestNodeDescriptions_(event: CustomEvent<bigint[]>) {
// Forward the request through the mojoms and bounce the reply back.
this.graphDump_!.requestNodeDescriptions(event.detail)
.then(
(descriptions) => this.graph_!.nodeDescriptions(
descriptions.nodeDescriptionsJson));
}
}
customElements.define(GraphTabElement.is, GraphTabElement);
|