blob: 1a9eb7852d9307b2b9b6d252dd50c5d12b739d6f [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 Host from '../core/host/host.js';
import * as i18n from '../core/i18n/i18n.js';
import * as Platform from '../core/platform/platform.js';
import * as Network from '../panels/network/network.js';
import * as UI from '../ui/legacy/legacy.js';
import {AffectedItem, AffectedResourcesView} from './AffectedResourcesView.js';
import type {AggregatedIssue} from './IssueAggregator.js';
import {IssueView} from './IssueView.js';
const UIStrings = {
/**
*@description Noun, singular or plural. Label for the kind and number of affected resources associated with a DevTools issue. A cookie is a small piece of data that a server sends to the user's web browser. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies.
*/
nCookies: '{n, plural, =1 { cookie} other { cookies}}',
/**
*@description Noun, singular. Label for the kind and number of affected resources associated with a DevTools issue. A cookie is a small piece of data that a server sends to the user's web browser. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies.
*/
cookie: 'cookie',
/**
*@description Noun, plural. Label for the kind and number of affected resources associated with a DevTools issue. A cookie is a small piece of data that a server sends to the user's web browser. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies.
*/
cookies: 'cookies',
/**
*@description Noun, singular. Label for a column in a table which lists cookies in the affected resources section of a DevTools issue. Each cookie has a name.
*/
name: 'Name',
/**
*@description Noun, singular. Label for a column in a table which lists cookies in the affected resources section of a DevTools issue. Cookies may have a 'Domain' attribute: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies.#define_where_cookies_are_sent
*/
domain: 'Domain',
/**
*@description Noun, singular. Label for a column in a table which lists cookies in the affected resources section of a DevTools issue. Cookies may have a 'Path' attribute: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies.#define_where_cookies_are_sent
*/
path: 'Path',
};
const str_ = i18n.i18n.registerUIStrings('issues/AffectedCookiesView.ts', UIStrings);
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
export class AffectedCookiesView extends AffectedResourcesView {
private issue: AggregatedIssue;
constructor(parent: IssueView, issue: AggregatedIssue) {
super(parent, {singular: i18nString(UIStrings.cookie), plural: i18nString(UIStrings.cookies)});
this.issue = issue;
}
protected getResourceName(count: number): Platform.UIString.LocalizedString {
return i18nString(UIStrings.nCookies, {n: count});
}
private appendAffectedCookies(cookies: Iterable<{cookie: Protocol.Audits.AffectedCookie, hasRequest: boolean}>):
void {
const header = document.createElement('tr');
this.appendColumnTitle(header, i18nString(UIStrings.name));
this.appendColumnTitle(
header, i18nString(UIStrings.domain) + ' & ' + i18nString(UIStrings.path),
'affected-resource-cookie-info-header');
this.affectedResources.appendChild(header);
let count = 0;
for (const cookie of cookies) {
count++;
this.appendAffectedCookie(cookie.cookie, cookie.hasRequest);
}
this.updateAffectedResourceCount(count);
}
private appendAffectedCookie(cookie: Protocol.Audits.AffectedCookie, hasAssociatedRequest: boolean): void {
const element = document.createElement('tr');
element.classList.add('affected-resource-cookie');
const name = document.createElement('td');
if (hasAssociatedRequest) {
name.appendChild(UI.UIUtils.createTextButton(cookie.name, () => {
Host.userMetrics.issuesPanelResourceOpened(this.issue.getCategory(), AffectedItem.Cookie);
Network.NetworkPanel.NetworkPanel.revealAndFilter([
{
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
// @ts-expect-error
filterType: 'cookie-domain',
filterValue: cookie.domain,
},
{
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
// @ts-expect-error
filterType: 'cookie-name',
filterValue: cookie.name,
},
{
// TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
// @ts-expect-error
filterType: 'cookie-path',
filterValue: cookie.path,
},
]);
}, 'link-style devtools-link'));
} else {
name.textContent = cookie.name;
}
element.appendChild(name);
this.appendIssueDetailCell(element, `${cookie.domain}${cookie.path}`, 'affected-resource-cookie-info');
this.affectedResources.appendChild(element);
}
update(): void {
this.clear();
this.appendAffectedCookies(this.issue.cookiesWithRequestIndicator());
}
}