blob: df92e079a132959f5bcfec76c44e5a2369d00054 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as i18n from '../../core/i18n/i18n.js';
import type * as Platform from '../../core/platform/platform.js';
import type * as IssuesManager from '../../models/issues_manager/issues_manager.js';
import * as Protocol from '../../generated/protocol.js';
import {AffectedResourcesView} from './AffectedResourcesView.js';
const UIStrings = {
/**
*@description Label for number of affected resources indication in issue view
*/
nResources: '{n, plural, =1 {# resource} other {# resources}}',
/**
*@description Title for a column in an Heavy Ads issue view
*/
limitExceeded: 'Limit exceeded',
/**
*@description Title for a column in an Heavy Ads issue view
*/
resolutionStatus: 'Resolution Status',
/**
*@description Title for a column in an Heavy Ads issue view
*/
frameUrl: 'Frame URL',
/**
* @description When there is a Heavy Ad, the browser can choose to deal with it in different ways.
* This string indicates that the ad was bad enough that it was removed.
*/
removed: 'Removed',
/**
* @description When there is a Heavy Ad, the browser can choose to deal with it in different ways.
* This string indicates that the ad was only warned, and not removed.
*/
warned: 'Warned',
/**
*@description Reason for a Heavy Ad being flagged in issue view. The Ad has been flagged as a
*Heavy Ad because it exceeded the set limit for peak CPU usage, e.g. it blocked the main thread
*for more than 15 seconds in any 30-second window.
*/
cpuPeakLimit: 'CPU peak limit',
/**
*@description Reason for a Heavy Ad being flagged in issue view
*/
cpuTotalLimit: 'CPU total limit',
/**
*@description Reason for a Heavy Ad being flagged in issue view
*/
networkLimit: 'Network limit',
};
const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedHeavyAdView.ts', UIStrings);
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
export class AffectedHeavyAdView extends AffectedResourcesView {
#appendAffectedHeavyAds(heavyAds: Iterable<IssuesManager.HeavyAdIssue.HeavyAdIssue>): void {
const header = document.createElement('tr');
this.appendColumnTitle(header, i18nString(UIStrings.limitExceeded));
this.appendColumnTitle(header, i18nString(UIStrings.resolutionStatus));
this.appendColumnTitle(header, i18nString(UIStrings.frameUrl));
this.affectedResources.appendChild(header);
let count = 0;
for (const heavyAd of heavyAds) {
this.#appendAffectedHeavyAd(heavyAd.details());
count++;
}
this.updateAffectedResourceCount(count);
}
protected getResourceNameWithCount(count: number): Platform.UIString.LocalizedString {
return i18nString(UIStrings.nResources, {n: count});
}
#statusToString(status: Protocol.Audits.HeavyAdResolutionStatus): string {
switch (status) {
case Protocol.Audits.HeavyAdResolutionStatus.HeavyAdBlocked:
return i18nString(UIStrings.removed);
case Protocol.Audits.HeavyAdResolutionStatus.HeavyAdWarning:
return i18nString(UIStrings.warned);
}
return '';
}
#limitToString(status: Protocol.Audits.HeavyAdReason): string {
switch (status) {
case Protocol.Audits.HeavyAdReason.CpuPeakLimit:
return i18nString(UIStrings.cpuPeakLimit);
case Protocol.Audits.HeavyAdReason.CpuTotalLimit:
return i18nString(UIStrings.cpuTotalLimit);
case Protocol.Audits.HeavyAdReason.NetworkTotalLimit:
return i18nString(UIStrings.networkLimit);
}
return '';
}
#appendAffectedHeavyAd(heavyAd: Protocol.Audits.HeavyAdIssueDetails): void {
const element = document.createElement('tr');
element.classList.add('affected-resource-heavy-ad');
const reason = document.createElement('td');
reason.classList.add('affected-resource-heavy-ad-info');
reason.textContent = this.#limitToString(heavyAd.reason);
element.appendChild(reason);
const status = document.createElement('td');
status.classList.add('affected-resource-heavy-ad-info');
status.textContent = this.#statusToString(heavyAd.resolution);
element.appendChild(status);
const frameId = heavyAd.frame.frameId;
const frameUrl = this.createFrameCell(frameId, this.issue.getCategory());
element.appendChild(frameUrl);
this.affectedResources.appendChild(element);
}
update(): void {
this.clear();
this.#appendAffectedHeavyAds(this.issue.getHeavyAdIssues());
}
}