chromium/chrome/browser/resources/about_sys/app.ts

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import '/shared/key_value_pair_viewer/key_value_pair_viewer.js';
import './strings.m.js';

import type {KeyValuePairEntry} from '/shared/key_value_pair_viewer/key_value_pair_entry.js';
import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';

import {getCss} from './app.css.js';
import {getHtml} from './app.html.js';
import type {SystemLog} from './browser_proxy.js';
import {BrowserProxyImpl} from './browser_proxy.js';

export interface AppElement {
  $: {
    title: HTMLElement,
  };
}

export class AppElement extends CrLitElement {
  static get is() {
    return 'system-app';
  }

  static override get styles() {
    return getCss();
  }

  override render() {
    return getHtml.bind(this)();
  }

  static override get properties() {
    return {
      entries_: {type: Array},

      // <if expr="chromeos_ash">
      isLacrosEnabled_: {type: Boolean},
      // </if>

      loading_: {
        type: Boolean,
        reflect: true,
      },
    };
  }

  protected entries_: KeyValuePairEntry[] = [];
  // <if expr="chromeos_ash">
  protected isLacrosEnabled_: boolean = false;
  // </if>
  protected loading_: boolean = false;

  override async connectedCallback() {
    super.connectedCallback();

    // <if expr="chromeos_ash">
    this.isLacrosEnabled_ =
        await BrowserProxyImpl.getInstance().isLacrosEnabled();
    // </if>

    this.loading_ = true;
    const logs = await BrowserProxyImpl.getInstance().requestSystemInfo();
    this.entries_ = logs.map((log: SystemLog) => {
      return {
        key: log.statName,
        value: log.statValue,
      };
    });
    this.loading_ = false;

    // Dispatch event used by tests.
    this.dispatchEvent(new CustomEvent('ready-for-testing'));
  }

  // <if expr="chromeos_ash">
  protected onOsLinkContainerClick_(event: MouseEvent) {
    this.handleOsLinkContainerClick_(event);
  }

  protected onOsLinkContainerAuxClick_(event: MouseEvent) {
    // Make middle-clicks have the same effects as Ctrl+clicks
    if (event.button === 1) {
      this.handleOsLinkContainerClick_(event);
    }
  }

  private handleOsLinkContainerClick_(event: MouseEvent) {
    if (event.target instanceof Element && event.target.id === 'osLinkHref') {
      event.preventDefault();
      BrowserProxyImpl.getInstance().openLacrosSystemPage();
    }
  }
  // </if>
}

declare global {
  interface HTMLElementTagNameMap {
    'system-app': AppElement;
  }
}

customElements.define(AppElement.is, AppElement);