1*6777b538SAndroid Build Coastguard Worker// Copyright 2024 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerimport {CustomElement} from 'chrome://resources/js/custom_element.js'; 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport {getTemplate} from './app.html.js'; 8*6777b538SAndroid Build Coastguard Workerimport {StructuredMetricsBrowserProxyImpl} from './structured_metrics_browser_proxy.js'; 9*6777b538SAndroid Build Coastguard Workerimport type {StructuredMetricEvent, StructuredMetricsSummary} from './structured_utils.js'; 10*6777b538SAndroid Build Coastguard Workerimport {updateStructuredMetricsEvents, updateStructuredMetricsSummary} from './structured_utils.js'; 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workerexport class StructuredMetricsInternalsAppElement extends CustomElement { 13*6777b538SAndroid Build Coastguard Worker static get is(): string { 14*6777b538SAndroid Build Coastguard Worker return 'structured-metrics-internals-app'; 15*6777b538SAndroid Build Coastguard Worker } 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker static override get template() { 18*6777b538SAndroid Build Coastguard Worker return getTemplate(); 19*6777b538SAndroid Build Coastguard Worker } 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker private browserProxy_: StructuredMetricsBrowserProxyImpl = 22*6777b538SAndroid Build Coastguard Worker StructuredMetricsBrowserProxyImpl.getInstance(); 23*6777b538SAndroid Build Coastguard Worker private summaryIntervalId_: ReturnType<typeof setInterval>; 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker initPromise: Promise<void>; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker constructor() { 28*6777b538SAndroid Build Coastguard Worker super(); 29*6777b538SAndroid Build Coastguard Worker this.initPromise = this.init_(); 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // Create periodic callbacks. 32*6777b538SAndroid Build Coastguard Worker this.summaryIntervalId_ = 33*6777b538SAndroid Build Coastguard Worker setInterval(() => this.updateStructuredMetricsSummary_(), 5000); 34*6777b538SAndroid Build Coastguard Worker } 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker disconnectedCallback() { 37*6777b538SAndroid Build Coastguard Worker clearInterval(this.summaryIntervalId_); 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker private async init_(): Promise<void> { 41*6777b538SAndroid Build Coastguard Worker // Fetch Structured Metrics summary and events. 42*6777b538SAndroid Build Coastguard Worker // TODO: Implement a push model as new events are recorded. 43*6777b538SAndroid Build Coastguard Worker await this.updateStructuredMetricsSummary_(); 44*6777b538SAndroid Build Coastguard Worker await this.updateStructuredMetricsEvents_(); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker const eventRefreshButton = 47*6777b538SAndroid Build Coastguard Worker this.getRequiredElement<HTMLElement>('#sm-refresh-events'); 48*6777b538SAndroid Build Coastguard Worker eventRefreshButton.addEventListener( 49*6777b538SAndroid Build Coastguard Worker 'click', () => this.updateStructuredMetricsEvents_()); 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker /** 53*6777b538SAndroid Build Coastguard Worker * Fetches summary information of the Structured Metrics service and renders 54*6777b538SAndroid Build Coastguard Worker * it. 55*6777b538SAndroid Build Coastguard Worker */ 56*6777b538SAndroid Build Coastguard Worker private async updateStructuredMetricsSummary_(): Promise<void> { 57*6777b538SAndroid Build Coastguard Worker const summary: StructuredMetricsSummary = 58*6777b538SAndroid Build Coastguard Worker await this.browserProxy_.fetchStructuredMetricsSummary(); 59*6777b538SAndroid Build Coastguard Worker const template = 60*6777b538SAndroid Build Coastguard Worker this.getRequiredElement<HTMLTemplateElement>('#summary-row-template'); 61*6777b538SAndroid Build Coastguard Worker const smSummaryBody = 62*6777b538SAndroid Build Coastguard Worker this.getRequiredElement<HTMLElement>('#sm-summary-body'); 63*6777b538SAndroid Build Coastguard Worker updateStructuredMetricsSummary(smSummaryBody, summary, template); 64*6777b538SAndroid Build Coastguard Worker } 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker /** 67*6777b538SAndroid Build Coastguard Worker * Fetches all events currently recorded by the Structured Metrics Service and 68*6777b538SAndroid Build Coastguard Worker * renders them. It an event has been uploaded then it will not be shown 69*6777b538SAndroid Build Coastguard Worker * again. This only shows Events recorded in Chromium. Platform2 events are 70*6777b538SAndroid Build Coastguard Worker * not supported yet. 71*6777b538SAndroid Build Coastguard Worker */ 72*6777b538SAndroid Build Coastguard Worker private async updateStructuredMetricsEvents_(): Promise<void> { 73*6777b538SAndroid Build Coastguard Worker const events: StructuredMetricEvent[] = 74*6777b538SAndroid Build Coastguard Worker await this.browserProxy_.fetchStructuredMetricsEvents(); 75*6777b538SAndroid Build Coastguard Worker const eventTemplate = this.getRequiredElement<HTMLTemplateElement>( 76*6777b538SAndroid Build Coastguard Worker '#structured-metrics-event-row-template'); 77*6777b538SAndroid Build Coastguard Worker const eventDetailsTemplate = this.getRequiredElement<HTMLTemplateElement>( 78*6777b538SAndroid Build Coastguard Worker '#structured-metrics-event-details-template'); 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker const kvTemplate = 81*6777b538SAndroid Build Coastguard Worker this.getRequiredElement<HTMLTemplateElement>('#summary-row-template'); 82*6777b538SAndroid Build Coastguard Worker const eventTableBody = 83*6777b538SAndroid Build Coastguard Worker this.getRequiredElement<HTMLElement>('#sm-event-body'); 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker updateStructuredMetricsEvents( 86*6777b538SAndroid Build Coastguard Worker eventTableBody, events, eventTemplate, eventDetailsTemplate, 87*6777b538SAndroid Build Coastguard Worker kvTemplate); 88*6777b538SAndroid Build Coastguard Worker } 89*6777b538SAndroid Build Coastguard Worker} 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Workerdeclare global { 92*6777b538SAndroid Build Coastguard Worker interface HTMLElementTagNameMap { 93*6777b538SAndroid Build Coastguard Worker 'structured-metrics-internals-app': StructuredMetricsInternalsAppElement; 94*6777b538SAndroid Build Coastguard Worker } 95*6777b538SAndroid Build Coastguard Worker} 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard WorkercustomElements.define( 98*6777b538SAndroid Build Coastguard Worker StructuredMetricsInternalsAppElement.is, 99*6777b538SAndroid Build Coastguard Worker StructuredMetricsInternalsAppElement); 100