blob: 029a85119fe79f75145b124c1d43dafa5edd049f [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 Common from '../../core/common/common.js';
import * as Host from '../../core/host/host.js';
import * as i18n from '../../core/i18n/i18n.js';
import type * as Platform from '../../core/platform/platform.js';
import * as UI from '../../ui/legacy/legacy.js';
import * as NetworkForward from '../../panels/network/forward/forward.js';
import type * as Protocol from '../../generated/protocol.js';
import {AffectedItem, AffectedResourcesView} from './AffectedResourcesView.js';
import type {AggregatedIssue} from './IssueAggregator.js';
import type {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 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',
/**
*@description Label for the the number of affected `Set-Cookie` lines associated with a DevTools issue. `Set-Cookie` is a specific header line in an HTTP network request and consists of a single line of text.
*/
nRawCookieLines: '{n, plural, =1 {1 Raw `Set-Cookie` header} other {# Raw `Set-Cookie` headers}}',
};
const str_ = i18n.i18n.registerUIStrings('panels/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);
this.issue = issue;
}
protected getResourceNameWithCount(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);
Common.Revealer.reveal(NetworkForward.UIFilter.UIRequestFilter.filters([
{
filterType: NetworkForward.UIFilter.FilterType.CookieDomain,
filterValue: cookie.domain,
},
{
filterType: NetworkForward.UIFilter.FilterType.CookieName,
filterValue: cookie.name,
},
{
filterType: NetworkForward.UIFilter.FilterType.CookiePath,
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());
}
}
export class AffectedRawCookieLinesView extends AffectedResourcesView {
private issue: AggregatedIssue;
constructor(parent: IssueView, issue: AggregatedIssue) {
super(parent);
this.issue = issue;
}
protected override getResourceNameWithCount(count: number): Platform.UIString.LocalizedString {
return i18nString(UIStrings.nRawCookieLines, {n: count});
}
override update(): void {
this.clear();
const rawCookieLines = this.issue.getRawCookieLines();
for (const rawCookieLine of rawCookieLines) {
const row = document.createElement('tr');
row.classList.add('affected-resource-directive');
this.appendIssueDetailCell(row, rawCookieLine);
this.affectedResources.appendChild(row);
}
this.updateAffectedResourceCount(rawCookieLines.size);
}
}