chrome-devtools-frontend
Version:
Chrome DevTools UI
331 lines (314 loc) • 12.6 kB
text/typescript
// Copyright 2023 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 SDK from '../../core/sdk/sdk.js';
import * as Protocol from '../../generated/protocol.js';
import {Issue, IssueCategory, IssueKind} from './Issue.js';
import {
type LazyMarkdownIssueDescription,
type MarkdownIssueDescription,
resolveLazyDescription,
} from './MarkdownIssueDescription.js';
const UIStrings = {
/**
*@description Title for Compression Dictionary Transport specification url link
*/
compressionDictionaryTransport: 'Compression Dictionary Transport',
} as const;
const str_ = i18n.i18n.registerUIStrings('models/issues_manager/SharedDictionaryIssue.ts', UIStrings);
const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
export const enum IssueCode {
USE_ERROR_CROSS_ORIGIN_NO_CORS_REQUEST = 'SharedDictionaryIssue::UseErrorCrossOriginNoCorsRequest',
USE_ERROR_DICTIONARY_LOAD_FAILURE = 'SharedDictionaryIssue::UseErrorDictionaryLoadFailure',
USE_ERROR_MATCHING_DICTIONARY_NOT_USED = 'SharedDictionaryIssue::UseErrorMatchingDictionaryNotUsed',
USE_ERROR_UNEXPECTED_CONTENT_DICTIONARY_HEADER = 'SharedDictionaryIssue::UseErrorUnexpectedContentDictionaryHeader',
WRITE_ERROR_CROSS_ORIGIN_NO_CORS_REQUEST = 'SharedDictionaryIssue::WriteErrorCossOriginNoCorsRequest',
WRITE_ERROR_DISALLOWED_BY_SETTINGS = 'SharedDictionaryIssue::WriteErrorDisallowedBySettings',
WRITE_ERROR_EXPIRED_RESPONSE = 'SharedDictionaryIssue::WriteErrorExpiredResponse',
WRITE_ERROR_FEATURE_DISABLED = 'SharedDictionaryIssue::WriteErrorFeatureDisabled',
WRITE_ERROR_INSUFFICIENT_RESOURCES = 'SharedDictionaryIssue::WriteErrorInsufficientResources',
WRITE_ERROR_INVALID_MATCH_FIELD = 'SharedDictionaryIssue::WriteErrorInvalidMatchField',
WRITE_ERROR_INVALID_STRUCTURED_HEADER = 'SharedDictionaryIssue::WriteErrorInvalidStructuredHeader',
WRITE_ERROR_NAVIGATION_REQUEST = 'SharedDictionaryIssue::WriteErrorNavigationRequest',
WRITE_ERROR_NO_MATCH_FIELD = 'SharedDictionaryIssue::WriteErrorNoMatchField',
WRITE_ERROR_NON_LIST_MATCH_DEST_FIELD = 'SharedDictionaryIssue::WriteErrorNonListMatchDestField',
WRITE_ERROR_NON_SECURE_CONTEXT = 'SharedDictionaryIssue::WriteErrorNonSecureContext',
WRITE_ERROR_NON_STRING_ID_FIELD = 'SharedDictionaryIssue::WriteErrorNonStringIdField',
WRITE_ERROR_NON_STRING_IN_MATCH_DEST_LIST = 'SharedDictionaryIssue::WriteErrorNonStringInMatchDestList',
WRITE_ERROR_NON_STRING_MATCH_FIELD = 'SharedDictionaryIssue::WriteErrorNonStringMatchField',
WRITE_ERROR_NON_TOKEN_TYPE_FIELD = 'SharedDictionaryIssue::WriteErrorNonTokenTypeField',
WRITE_ERROR_REQUEST_ABORTED = 'SharedDictionaryIssue::WriteErrorRequestAborted',
WRITE_ERROR_SHUTTING_DOWN = 'SharedDictionaryIssue::WriteErrorShuttingDown',
WRITE_ERROR_TOO_LONG_ID_FIELD = 'SharedDictionaryIssue::WriteErrorTooLongIdField',
WRITE_ERROR_UNSUPPORTED_TYPE = 'SharedDictionaryIssue::WriteErrorUnsupportedType',
UNKNOWN = 'SharedDictionaryIssue::WriteErrorUnknown',
}
function getIssueCode(details: Protocol.Audits.SharedDictionaryIssueDetails): IssueCode {
switch (details.sharedDictionaryError) {
case Protocol.Audits.SharedDictionaryError.UseErrorCrossOriginNoCorsRequest:
return IssueCode.USE_ERROR_CROSS_ORIGIN_NO_CORS_REQUEST;
case Protocol.Audits.SharedDictionaryError.UseErrorDictionaryLoadFailure:
return IssueCode.USE_ERROR_DICTIONARY_LOAD_FAILURE;
case Protocol.Audits.SharedDictionaryError.UseErrorMatchingDictionaryNotUsed:
return IssueCode.USE_ERROR_MATCHING_DICTIONARY_NOT_USED;
case Protocol.Audits.SharedDictionaryError.UseErrorUnexpectedContentDictionaryHeader:
return IssueCode.USE_ERROR_UNEXPECTED_CONTENT_DICTIONARY_HEADER;
case Protocol.Audits.SharedDictionaryError.WriteErrorCossOriginNoCorsRequest:
return IssueCode.WRITE_ERROR_CROSS_ORIGIN_NO_CORS_REQUEST;
case Protocol.Audits.SharedDictionaryError.WriteErrorDisallowedBySettings:
return IssueCode.WRITE_ERROR_DISALLOWED_BY_SETTINGS;
case Protocol.Audits.SharedDictionaryError.WriteErrorExpiredResponse:
return IssueCode.WRITE_ERROR_EXPIRED_RESPONSE;
case Protocol.Audits.SharedDictionaryError.WriteErrorFeatureDisabled:
return IssueCode.WRITE_ERROR_FEATURE_DISABLED;
case Protocol.Audits.SharedDictionaryError.WriteErrorInsufficientResources:
return IssueCode.WRITE_ERROR_INSUFFICIENT_RESOURCES;
case Protocol.Audits.SharedDictionaryError.WriteErrorInvalidMatchField:
return IssueCode.WRITE_ERROR_INVALID_MATCH_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorInvalidStructuredHeader:
return IssueCode.WRITE_ERROR_INVALID_STRUCTURED_HEADER;
case Protocol.Audits.SharedDictionaryError.WriteErrorNavigationRequest:
return IssueCode.WRITE_ERROR_NAVIGATION_REQUEST;
case Protocol.Audits.SharedDictionaryError.WriteErrorNoMatchField:
return IssueCode.WRITE_ERROR_NO_MATCH_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorNonListMatchDestField:
return IssueCode.WRITE_ERROR_NON_LIST_MATCH_DEST_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorNonSecureContext:
return IssueCode.WRITE_ERROR_NON_SECURE_CONTEXT;
case Protocol.Audits.SharedDictionaryError.WriteErrorNonStringIdField:
return IssueCode.WRITE_ERROR_NON_STRING_ID_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorNonStringInMatchDestList:
return IssueCode.WRITE_ERROR_NON_STRING_IN_MATCH_DEST_LIST;
case Protocol.Audits.SharedDictionaryError.WriteErrorNonStringMatchField:
return IssueCode.WRITE_ERROR_NON_STRING_MATCH_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorNonTokenTypeField:
return IssueCode.WRITE_ERROR_NON_TOKEN_TYPE_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorRequestAborted:
return IssueCode.WRITE_ERROR_REQUEST_ABORTED;
case Protocol.Audits.SharedDictionaryError.WriteErrorShuttingDown:
return IssueCode.WRITE_ERROR_SHUTTING_DOWN;
case Protocol.Audits.SharedDictionaryError.WriteErrorTooLongIdField:
return IssueCode.WRITE_ERROR_TOO_LONG_ID_FIELD;
case Protocol.Audits.SharedDictionaryError.WriteErrorUnsupportedType:
return IssueCode.WRITE_ERROR_UNSUPPORTED_TYPE;
default:
return IssueCode.UNKNOWN;
}
}
export class SharedDictionaryIssue extends Issue {
readonly #issueDetails: Protocol.Audits.SharedDictionaryIssueDetails;
constructor(issueDetails: Protocol.Audits.SharedDictionaryIssueDetails, issuesModel: SDK.IssuesModel.IssuesModel) {
super(
{
code: getIssueCode(issueDetails),
umaCode: [
Protocol.Audits.InspectorIssueCode.SharedDictionaryIssue,
issueDetails.sharedDictionaryError,
].join('::'),
},
issuesModel);
this.#issueDetails = issueDetails;
}
override requests(): Iterable<Protocol.Audits.AffectedRequest> {
if (this.#issueDetails.request) {
return [this.#issueDetails.request];
}
return [];
}
getCategory(): IssueCategory {
return IssueCategory.OTHER;
}
details(): Protocol.Audits.SharedDictionaryIssueDetails {
return this.#issueDetails;
}
getDescription(): MarkdownIssueDescription|null {
const description = issueDescriptions.get(this.#issueDetails.sharedDictionaryError);
if (!description) {
return null;
}
return resolveLazyDescription(description);
}
primaryKey(): string {
return JSON.stringify(this.#issueDetails);
}
getKind(): IssueKind {
return IssueKind.PAGE_ERROR;
}
static fromInspectorIssue(issuesModel: SDK.IssuesModel.IssuesModel, inspectorIssue: Protocol.Audits.InspectorIssue):
SharedDictionaryIssue[] {
const details = inspectorIssue.details.sharedDictionaryIssueDetails;
if (!details) {
console.warn('Shared Dictionary issue without details received.');
return [];
}
return [new SharedDictionaryIssue(details, issuesModel)];
}
}
const specLinks = [{
link: 'https://datatracker.ietf.org/doc/draft-ietf-httpbis-compression-dictionary/',
linkTitle: i18nLazyString(UIStrings.compressionDictionaryTransport),
}];
const issueDescriptions = new Map<Protocol.Audits.SharedDictionaryError, LazyMarkdownIssueDescription>([
[
Protocol.Audits.SharedDictionaryError.UseErrorCrossOriginNoCorsRequest,
{
file: 'sharedDictionaryUseErrorCrossOriginNoCorsRequest.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.UseErrorDictionaryLoadFailure,
{
file: 'sharedDictionaryUseErrorDictionaryLoadFailure.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.UseErrorMatchingDictionaryNotUsed,
{
file: 'sharedDictionaryUseErrorMatchingDictionaryNotUsed.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.UseErrorUnexpectedContentDictionaryHeader,
{
file: 'sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorCossOriginNoCorsRequest,
{
file: 'sharedDictionaryWriteErrorCossOriginNoCorsRequest.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorDisallowedBySettings,
{
file: 'sharedDictionaryWriteErrorDisallowedBySettings.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorExpiredResponse,
{
file: 'sharedDictionaryWriteErrorExpiredResponse.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorFeatureDisabled,
{
file: 'sharedDictionaryWriteErrorFeatureDisabled.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorInsufficientResources,
{
file: 'sharedDictionaryWriteErrorInsufficientResources.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorInvalidMatchField,
{
file: 'sharedDictionaryWriteErrorInvalidMatchField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorInvalidStructuredHeader,
{
file: 'sharedDictionaryWriteErrorInvalidStructuredHeader.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNavigationRequest,
{
file: 'sharedDictionaryWriteErrorNavigationRequest.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNoMatchField,
{
file: 'sharedDictionaryWriteErrorNoMatchField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNonListMatchDestField,
{
file: 'sharedDictionaryWriteErrorNonListMatchDestField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNonSecureContext,
{
file: 'sharedDictionaryWriteErrorNonSecureContext.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNonStringIdField,
{
file: 'sharedDictionaryWriteErrorNonStringIdField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNonStringInMatchDestList,
{
file: 'sharedDictionaryWriteErrorNonStringInMatchDestList.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNonStringMatchField,
{
file: 'sharedDictionaryWriteErrorNonStringMatchField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorNonTokenTypeField,
{
file: 'sharedDictionaryWriteErrorNonTokenTypeField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorRequestAborted,
{
file: 'sharedDictionaryWriteErrorRequestAborted.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorShuttingDown,
{
file: 'sharedDictionaryWriteErrorShuttingDown.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorTooLongIdField,
{
file: 'sharedDictionaryWriteErrorTooLongIdField.md',
links: specLinks,
},
],
[
Protocol.Audits.SharedDictionaryError.WriteErrorUnsupportedType,
{
file: 'sharedDictionaryWriteErrorUnsupportedType.md',
links: specLinks,
},
],
]);