UNPKG

chrome-devtools-frontend

Version:
71 lines (57 loc) 2.01 kB
// Copyright 2019 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 ProtocolProxyApi from '../../generated/protocol-proxy-api.js'; import type * as Protocol from '../../generated/protocol.js'; import {SDKModel} from './SDKModel.js'; import { Capability, type Target, } from './Target.js'; /** * The `IssuesModel` is a thin dispatch that does not store issues, but only creates the representation * class (usually derived from `Issue`) and passes the instances on via a dispatched event. * We chose this approach here because the lifetime of the Model is tied to the target, but DevTools * wants to preserve issues for targets (e.g. iframes) that are already gone as well. */ export class IssuesModel extends SDKModel<EventTypes> implements ProtocolProxyApi.AuditsDispatcher { #disposed = false; #enabled = false; constructor(target: Target) { super(target); void this.ensureEnabled(); } private async ensureEnabled(): Promise<void> { if (this.#enabled) { return; } this.#enabled = true; this.target().registerAuditsDispatcher(this); const auditsAgent = this.target().auditsAgent(); await auditsAgent.invoke_enable(); } issueAdded(issueAddedEvent: Protocol.Audits.IssueAddedEvent): void { this.dispatchEventToListeners(Events.ISSUE_ADDED, {issuesModel: this, inspectorIssue: issueAddedEvent.issue}); } override dispose(): void { super.dispose(); this.#disposed = true; } getTargetIfNotDisposed(): Target|null { if (!this.#disposed) { return this.target(); } return null; } } export const enum Events { ISSUE_ADDED = 'IssueAdded', } export interface IssueAddedEvent { issuesModel: IssuesModel; inspectorIssue: Protocol.Audits.InspectorIssue; } export interface EventTypes { [Events.ISSUE_ADDED]: IssueAddedEvent; } SDKModel.register(IssuesModel, {capabilities: Capability.AUDITS, autostart: true});