chrome-devtools-frontend 1.0.976570 → 1.0.976703
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/gni/devtools_grd_files.gni +3 -0
- package/front_end/core/host/UserMetrics.ts +23 -23
- package/front_end/core/i18n/locales/en-US.json +6 -0
- package/front_end/core/i18n/locales/en-XL.json +6 -0
- package/front_end/core/sdk/CSSContainerQuery.ts +1 -1
- package/front_end/core/sdk/CSSModel.ts +9 -9
- package/front_end/generated/InspectorBackendCommands.js +6 -5
- package/front_end/generated/protocol.ts +10 -9
- package/front_end/models/issues_manager/Issue.ts +1 -1
- package/front_end/models/issues_manager/IssuesManager.ts +3 -9
- package/front_end/models/issues_manager/SameSiteCookieIssue.ts +74 -78
- package/front_end/models/issues_manager/issues_manager.ts +2 -2
- package/front_end/models/persistence/NetworkPersistenceManager.ts +1 -1
- package/front_end/panels/elements/ClassesPaneWidget.ts +1 -1
- package/front_end/panels/elements/ComputedStyleModel.ts +1 -1
- package/front_end/panels/elements/ElementsTreeElement.ts +1 -1
- package/front_end/panels/elements/LayersWidget.ts +1 -1
- package/front_end/panels/elements/MetricsSidebarPane.ts +2 -2
- package/front_end/panels/elements/PlatformFontsWidget.ts +1 -1
- package/front_end/panels/elements/StylePropertyTreeElement.ts +1 -1
- package/front_end/panels/elements/StylesSidebarPane.ts +2 -3
- package/front_end/panels/emulation/MediaQueryInspector.ts +1 -1
- package/front_end/panels/issues/IssueView.ts +1 -1
- package/front_end/panels/issues/IssuesPane.ts +1 -1
- package/front_end/panels/network/NetworkLogView.ts +1 -1
- package/front_end/panels/sources/CSSPlugin.ts +1 -1
- package/front_end/panels/sources/SourcesView.ts +23 -10
- package/front_end/panels/sources/components/HeadersView.css +32 -0
- package/front_end/panels/sources/components/HeadersView.ts +89 -0
- package/front_end/panels/sources/components/components.ts +9 -0
- package/package.json +1 -1
@@ -440,6 +440,7 @@ grd_files_release_sources = [
|
|
440
440
|
"front_end/panels/settings/settings.js",
|
441
441
|
"front_end/panels/snippets/snippets-legacy.js",
|
442
442
|
"front_end/panels/snippets/snippets.js",
|
443
|
+
"front_end/panels/sources/components/components.js",
|
443
444
|
"front_end/panels/sources/sources-legacy.js",
|
444
445
|
"front_end/panels/sources/sources-meta.js",
|
445
446
|
"front_end/panels/sources/sources.js",
|
@@ -1238,6 +1239,8 @@ grd_files_debug_sources = [
|
|
1238
1239
|
"front_end/panels/sources/WatchExpressionsSidebarPane.js",
|
1239
1240
|
"front_end/panels/sources/breakpointEditDialog.css.js",
|
1240
1241
|
"front_end/panels/sources/callStackSidebarPane.css.js",
|
1242
|
+
"front_end/panels/sources/components/HeadersView.css.js",
|
1243
|
+
"front_end/panels/sources/components/HeadersView.js",
|
1241
1244
|
"front_end/panels/sources/debuggerPausedMessage.css.js",
|
1242
1245
|
"front_end/panels/sources/dialog.css.js",
|
1243
1246
|
"front_end/panels/sources/javaScriptBreakpointsSidebarPane.css.js",
|
@@ -599,7 +599,7 @@ export enum DevtoolsExperiments {
|
|
599
599
|
export enum IssueExpanded {
|
600
600
|
CrossOriginEmbedderPolicy = 0,
|
601
601
|
MixedContent = 1,
|
602
|
-
|
602
|
+
Cookie = 2,
|
603
603
|
HeavyAd = 3,
|
604
604
|
ContentSecurityPolicy = 4,
|
605
605
|
Other = 5,
|
@@ -646,28 +646,28 @@ export enum IssueCreated {
|
|
646
646
|
'CrossOriginEmbedderPolicyIssue::CorpNotSameOrigin' = 11,
|
647
647
|
'CrossOriginEmbedderPolicyIssue::CorpNotSameOriginAfterDefaultedToSameOriginByCoep' = 12,
|
648
648
|
'CrossOriginEmbedderPolicyIssue::CorpNotSameSite' = 13,
|
649
|
-
'
|
650
|
-
'
|
651
|
-
'
|
652
|
-
'
|
653
|
-
'
|
654
|
-
'
|
655
|
-
'
|
656
|
-
'
|
657
|
-
'
|
658
|
-
'
|
659
|
-
'
|
660
|
-
'
|
661
|
-
'
|
662
|
-
'
|
663
|
-
'
|
664
|
-
'
|
665
|
-
'
|
666
|
-
'
|
667
|
-
'
|
668
|
-
'
|
669
|
-
'
|
670
|
-
'
|
649
|
+
'CookieIssue::ExcludeSameSiteNoneInsecure::ReadCookie' = 14,
|
650
|
+
'CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie' = 15,
|
651
|
+
'CookieIssue::WarnSameSiteNoneInsecure::ReadCookie' = 16,
|
652
|
+
'CookieIssue::WarnSameSiteNoneInsecure::SetCookie' = 17,
|
653
|
+
'CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure' = 18,
|
654
|
+
'CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure' = 19,
|
655
|
+
'CookieIssue::WarnCrossDowngrade::ReadCookie::Secure' = 20,
|
656
|
+
'CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure' = 21,
|
657
|
+
'CookieIssue::WarnCrossDowngrade::SetCookie::Secure' = 22,
|
658
|
+
'CookieIssue::WarnCrossDowngrade::SetCookie::Insecure' = 23,
|
659
|
+
'CookieIssue::ExcludeNavigationContextDowngrade::Secure' = 24,
|
660
|
+
'CookieIssue::ExcludeNavigationContextDowngrade::Insecure' = 25,
|
661
|
+
'CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure' = 26,
|
662
|
+
'CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure' = 27,
|
663
|
+
'CookieIssue::ExcludeContextDowngrade::SetCookie::Secure' = 28,
|
664
|
+
'CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure' = 29,
|
665
|
+
'CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie' = 30,
|
666
|
+
'CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie' = 31,
|
667
|
+
'CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie' = 32,
|
668
|
+
'CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::SetCookie' = 33,
|
669
|
+
'CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::ReadCookie' = 34,
|
670
|
+
'CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::SetCookie' = 35,
|
671
671
|
'SharedArrayBufferIssue::TransferIssue' = 36,
|
672
672
|
'SharedArrayBufferIssue::CreationIssue' = 37,
|
673
673
|
'TrustedWebActivityIssue::kHttpError' = 38,
|
@@ -9242,6 +9242,12 @@
|
|
9242
9242
|
"panels/sources/CallStackSidebarPane.ts | showMore": {
|
9243
9243
|
"message": "Show more"
|
9244
9244
|
},
|
9245
|
+
"panels/sources/components/HeadersView.ts | errorWhenParsing": {
|
9246
|
+
"message": "Error when parsing ''{PH1}''."
|
9247
|
+
},
|
9248
|
+
"panels/sources/components/HeadersView.ts | parsingErrorExplainer": {
|
9249
|
+
"message": "This is most likely due to a syntax error in ''{PH1}''. Try opening this file in an external editor to fix the error or delete the file and re-create the override."
|
9250
|
+
},
|
9245
9251
|
"panels/sources/CoveragePlugin.ts | clickToShowCoveragePanel": {
|
9246
9252
|
"message": "Click to show Coverage Panel"
|
9247
9253
|
},
|
@@ -9242,6 +9242,12 @@
|
|
9242
9242
|
"panels/sources/CallStackSidebarPane.ts | showMore": {
|
9243
9243
|
"message": "Ŝh́ôẃ m̂ór̂é"
|
9244
9244
|
},
|
9245
|
+
"panels/sources/components/HeadersView.ts | errorWhenParsing": {
|
9246
|
+
"message": "Êŕr̂ór̂ ẃĥén̂ ṕâŕŝín̂ǵ ''{PH1}''."
|
9247
|
+
},
|
9248
|
+
"panels/sources/components/HeadersView.ts | parsingErrorExplainer": {
|
9249
|
+
"message": "T̂h́îś îś m̂óŝt́ l̂ík̂él̂ý d̂úê t́ô á ŝýn̂t́âx́ êŕr̂ór̂ ín̂ ''{PH1}''. T́r̂ý ôṕêńîńĝ t́ĥíŝ f́îĺê ín̂ án̂ éx̂t́êŕn̂ál̂ éd̂ít̂ór̂ t́ô f́îx́ t̂h́ê ér̂ŕôŕ ôŕ d̂él̂ét̂é t̂h́ê f́îĺê án̂d́ r̂é-ĉŕêát̂é t̂h́ê óv̂ér̂ŕîd́ê."
|
9250
|
+
},
|
9245
9251
|
"panels/sources/CoveragePlugin.ts | clickToShowCoveragePanel": {
|
9246
9252
|
"message": "Ĉĺîćk̂ t́ô śĥóŵ Ćôv́êŕâǵê Ṕâńêĺ"
|
9247
9253
|
},
|
@@ -50,7 +50,7 @@ export class CSSContainerQueryContainer {
|
|
50
50
|
}
|
51
51
|
|
52
52
|
async getContainerSizeDetails(): Promise<ContainerQueriedSizeDetails|undefined> {
|
53
|
-
const styles = await this.containerNode.domModel().cssModel().
|
53
|
+
const styles = await this.containerNode.domModel().cssModel().getComputedStyle(this.containerNode.id);
|
54
54
|
if (!styles) {
|
55
55
|
return;
|
56
56
|
}
|
@@ -265,12 +265,12 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
265
265
|
await this.agent.invoke_stopRuleUsageTracking();
|
266
266
|
}
|
267
267
|
|
268
|
-
async
|
268
|
+
async getMediaQueries(): Promise<CSSMedia[]> {
|
269
269
|
const {medias} = await this.agent.invoke_getMediaQueries();
|
270
270
|
return medias ? CSSMedia.parseMediaArrayPayload(this, medias) : [];
|
271
271
|
}
|
272
272
|
|
273
|
-
async
|
273
|
+
async getRootLayer(nodeId: Protocol.DOM.NodeId): Promise<Protocol.CSS.CSSLayerData> {
|
274
274
|
const {rootLayer} = await this.agent.invoke_getLayersForNode({nodeId});
|
275
275
|
return rootLayer;
|
276
276
|
}
|
@@ -288,7 +288,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
288
288
|
this.dispatchEventToListeners(Events.ModelWasEnabled);
|
289
289
|
}
|
290
290
|
|
291
|
-
async
|
291
|
+
async getMatchedStyles(nodeId: Protocol.DOM.NodeId): Promise<CSSMatchedStyles|null> {
|
292
292
|
const response = await this.agent.invoke_getMatchedStylesForNode({nodeId});
|
293
293
|
|
294
294
|
if (response.getError()) {
|
@@ -306,16 +306,16 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
306
306
|
response.cssKeyframesRules || []);
|
307
307
|
}
|
308
308
|
|
309
|
-
async
|
309
|
+
async getClassNames(styleSheetId: Protocol.CSS.StyleSheetId): Promise<string[]> {
|
310
310
|
const {classNames} = await this.agent.invoke_collectClassNames({styleSheetId});
|
311
311
|
return classNames || [];
|
312
312
|
}
|
313
313
|
|
314
|
-
|
314
|
+
getComputedStyle(nodeId: Protocol.DOM.NodeId): Promise<Map<string, string>|null> {
|
315
315
|
return this.#styleLoader.computedStylePromise(nodeId);
|
316
316
|
}
|
317
317
|
|
318
|
-
async
|
318
|
+
async getBackgroundColors(nodeId: Protocol.DOM.NodeId): Promise<ContrastInfo|null> {
|
319
319
|
const response = await this.agent.invoke_getBackgroundColors({nodeId});
|
320
320
|
if (response.getError()) {
|
321
321
|
return null;
|
@@ -328,7 +328,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
328
328
|
};
|
329
329
|
}
|
330
330
|
|
331
|
-
async
|
331
|
+
async getPlatformFonts(nodeId: Protocol.DOM.NodeId): Promise<Protocol.CSS.PlatformFontUsage[]|null> {
|
332
332
|
const {fonts} = await this.agent.invoke_getPlatformFontsForNode({nodeId});
|
333
333
|
return fonts;
|
334
334
|
}
|
@@ -349,7 +349,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
349
349
|
return values;
|
350
350
|
}
|
351
351
|
|
352
|
-
async
|
352
|
+
async getInlineStyles(nodeId: Protocol.DOM.NodeId): Promise<InlineStyleResult|null> {
|
353
353
|
const response = await this.agent.invoke_getInlineStylesForNode({nodeId});
|
354
354
|
|
355
355
|
if (response.getError() || !response.inlineStyle) {
|
@@ -702,7 +702,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
702
702
|
this.#cachedMatchedCascadeNode = node;
|
703
703
|
if (!this.#cachedMatchedCascadePromise) {
|
704
704
|
if (node.id) {
|
705
|
-
this.#cachedMatchedCascadePromise = this.
|
705
|
+
this.#cachedMatchedCascadePromise = this.getMatchedStyles(node.id);
|
706
706
|
} else {
|
707
707
|
return Promise.resolve(null);
|
708
708
|
}
|
@@ -182,7 +182,7 @@ export function registerCommands(inspectorBackend) {
|
|
182
182
|
[]);
|
183
183
|
|
184
184
|
// Audits.
|
185
|
-
inspectorBackend.registerEnum('Audits.
|
185
|
+
inspectorBackend.registerEnum('Audits.CookieExclusionReason', {
|
186
186
|
ExcludeSameSiteUnspecifiedTreatedAsLax: 'ExcludeSameSiteUnspecifiedTreatedAsLax',
|
187
187
|
ExcludeSameSiteNoneInsecure: 'ExcludeSameSiteNoneInsecure',
|
188
188
|
ExcludeSameSiteLax: 'ExcludeSameSiteLax',
|
@@ -190,7 +190,7 @@ export function registerCommands(inspectorBackend) {
|
|
190
190
|
ExcludeInvalidSameParty: 'ExcludeInvalidSameParty',
|
191
191
|
ExcludeSamePartyCrossPartyContext: 'ExcludeSamePartyCrossPartyContext'
|
192
192
|
});
|
193
|
-
inspectorBackend.registerEnum('Audits.
|
193
|
+
inspectorBackend.registerEnum('Audits.CookieWarningReason', {
|
194
194
|
WarnSameSiteUnspecifiedCrossSiteContext: 'WarnSameSiteUnspecifiedCrossSiteContext',
|
195
195
|
WarnSameSiteNoneInsecure: 'WarnSameSiteNoneInsecure',
|
196
196
|
WarnSameSiteUnspecifiedLaxAllowUnsafe: 'WarnSameSiteUnspecifiedLaxAllowUnsafe',
|
@@ -198,9 +198,10 @@ export function registerCommands(inspectorBackend) {
|
|
198
198
|
WarnSameSiteStrictCrossDowngradeStrict: 'WarnSameSiteStrictCrossDowngradeStrict',
|
199
199
|
WarnSameSiteStrictCrossDowngradeLax: 'WarnSameSiteStrictCrossDowngradeLax',
|
200
200
|
WarnSameSiteLaxCrossDowngradeStrict: 'WarnSameSiteLaxCrossDowngradeStrict',
|
201
|
-
WarnSameSiteLaxCrossDowngradeLax: 'WarnSameSiteLaxCrossDowngradeLax'
|
201
|
+
WarnSameSiteLaxCrossDowngradeLax: 'WarnSameSiteLaxCrossDowngradeLax',
|
202
|
+
WarnAttributeValueExceedsMaxSize: 'WarnAttributeValueExceedsMaxSize'
|
202
203
|
});
|
203
|
-
inspectorBackend.registerEnum('Audits.
|
204
|
+
inspectorBackend.registerEnum('Audits.CookieOperation', {SetCookie: 'SetCookie', ReadCookie: 'ReadCookie'});
|
204
205
|
inspectorBackend.registerEnum('Audits.MixedContentResolutionStatus', {
|
205
206
|
MixedContentBlocked: 'MixedContentBlocked',
|
206
207
|
MixedContentAutomaticallyUpgraded: 'MixedContentAutomaticallyUpgraded',
|
@@ -301,7 +302,7 @@ export function registerCommands(inspectorBackend) {
|
|
301
302
|
Canceled: 'Canceled'
|
302
303
|
});
|
303
304
|
inspectorBackend.registerEnum('Audits.InspectorIssueCode', {
|
304
|
-
|
305
|
+
CookieIssue: 'CookieIssue',
|
305
306
|
MixedContentIssue: 'MixedContentIssue',
|
306
307
|
BlockedByResponseIssue: 'BlockedByResponseIssue',
|
307
308
|
HeavyAdIssue: 'HeavyAdIssue',
|
@@ -696,7 +696,7 @@ export namespace Audits {
|
|
696
696
|
frameId: Page.FrameId;
|
697
697
|
}
|
698
698
|
|
699
|
-
export const enum
|
699
|
+
export const enum CookieExclusionReason {
|
700
700
|
ExcludeSameSiteUnspecifiedTreatedAsLax = 'ExcludeSameSiteUnspecifiedTreatedAsLax',
|
701
701
|
ExcludeSameSiteNoneInsecure = 'ExcludeSameSiteNoneInsecure',
|
702
702
|
ExcludeSameSiteLax = 'ExcludeSameSiteLax',
|
@@ -705,7 +705,7 @@ export namespace Audits {
|
|
705
705
|
ExcludeSamePartyCrossPartyContext = 'ExcludeSamePartyCrossPartyContext',
|
706
706
|
}
|
707
707
|
|
708
|
-
export const enum
|
708
|
+
export const enum CookieWarningReason {
|
709
709
|
WarnSameSiteUnspecifiedCrossSiteContext = 'WarnSameSiteUnspecifiedCrossSiteContext',
|
710
710
|
WarnSameSiteNoneInsecure = 'WarnSameSiteNoneInsecure',
|
711
711
|
WarnSameSiteUnspecifiedLaxAllowUnsafe = 'WarnSameSiteUnspecifiedLaxAllowUnsafe',
|
@@ -714,9 +714,10 @@ export namespace Audits {
|
|
714
714
|
WarnSameSiteStrictCrossDowngradeLax = 'WarnSameSiteStrictCrossDowngradeLax',
|
715
715
|
WarnSameSiteLaxCrossDowngradeStrict = 'WarnSameSiteLaxCrossDowngradeStrict',
|
716
716
|
WarnSameSiteLaxCrossDowngradeLax = 'WarnSameSiteLaxCrossDowngradeLax',
|
717
|
+
WarnAttributeValueExceedsMaxSize = 'WarnAttributeValueExceedsMaxSize',
|
717
718
|
}
|
718
719
|
|
719
|
-
export const enum
|
720
|
+
export const enum CookieOperation {
|
720
721
|
SetCookie = 'SetCookie',
|
721
722
|
ReadCookie = 'ReadCookie',
|
722
723
|
}
|
@@ -726,7 +727,7 @@ export namespace Audits {
|
|
726
727
|
* time finding a specific cookie. With this, we can convey specific error
|
727
728
|
* information without the cookie.
|
728
729
|
*/
|
729
|
-
export interface
|
730
|
+
export interface CookieIssueDetails {
|
730
731
|
/**
|
731
732
|
* If AffectedCookie is not set then rawCookieLine contains the raw
|
732
733
|
* Set-Cookie header string. This hints at a problem where the
|
@@ -735,13 +736,13 @@ export namespace Audits {
|
|
735
736
|
*/
|
736
737
|
cookie?: AffectedCookie;
|
737
738
|
rawCookieLine?: string;
|
738
|
-
cookieWarningReasons:
|
739
|
-
cookieExclusionReasons:
|
739
|
+
cookieWarningReasons: CookieWarningReason[];
|
740
|
+
cookieExclusionReasons: CookieExclusionReason[];
|
740
741
|
/**
|
741
742
|
* Optionally identifies the site-for-cookies and the cookie url, which
|
742
743
|
* may be used by the front-end as additional context.
|
743
744
|
*/
|
744
|
-
operation:
|
745
|
+
operation: CookieOperation;
|
745
746
|
siteForCookies?: string;
|
746
747
|
cookieUrl?: string;
|
747
748
|
request?: AffectedRequest;
|
@@ -1096,7 +1097,7 @@ export namespace Audits {
|
|
1096
1097
|
* information about the kind of issue.
|
1097
1098
|
*/
|
1098
1099
|
export const enum InspectorIssueCode {
|
1099
|
-
|
1100
|
+
CookieIssue = 'CookieIssue',
|
1100
1101
|
MixedContentIssue = 'MixedContentIssue',
|
1101
1102
|
BlockedByResponseIssue = 'BlockedByResponseIssue',
|
1102
1103
|
HeavyAdIssue = 'HeavyAdIssue',
|
@@ -1120,7 +1121,7 @@ export namespace Audits {
|
|
1120
1121
|
* add a new optional field to this type.
|
1121
1122
|
*/
|
1122
1123
|
export interface InspectorIssueDetails {
|
1123
|
-
|
1124
|
+
cookieIssueDetails?: CookieIssueDetails;
|
1124
1125
|
mixedContentIssueDetails?: MixedContentIssueDetails;
|
1125
1126
|
blockedByResponseIssueDetails?: BlockedByResponseIssueDetails;
|
1126
1127
|
heavyAdIssueDetails?: HeavyAdIssueDetails;
|
@@ -44,7 +44,7 @@ export enum IssueCategory {
|
|
44
44
|
CrossOriginEmbedderPolicy = 'CrossOriginEmbedderPolicy',
|
45
45
|
Generic = 'Generic',
|
46
46
|
MixedContent = 'MixedContent',
|
47
|
-
|
47
|
+
Cookie = 'Cookie',
|
48
48
|
HeavyAd = 'HeavyAd',
|
49
49
|
ContentSecurityPolicy = 'ContentSecurityPolicy',
|
50
50
|
TrustedWebActivity = 'TrustedWebActivity',
|
@@ -22,7 +22,7 @@ import {LowTextContrastIssue} from './LowTextContrastIssue.js';
|
|
22
22
|
import {MixedContentIssue} from './MixedContentIssue.js';
|
23
23
|
import {NavigatorUserAgentIssue} from './NavigatorUserAgentIssue.js';
|
24
24
|
import {QuirksModeIssue} from './QuirksModeIssue.js';
|
25
|
-
import {
|
25
|
+
import {CookieIssue} from './SameSiteCookieIssue.js';
|
26
26
|
import {SharedArrayBufferIssue} from './SharedArrayBufferIssue.js';
|
27
27
|
import {SourceFrameIssuesManager} from './SourceFrameIssuesManager.js';
|
28
28
|
import {TrustedWebActivityIssue} from './TrustedWebActivityIssue.js';
|
@@ -49,8 +49,8 @@ const issueCodeHandlers = new Map<
|
|
49
49
|
Protocol.Audits.InspectorIssueCode,
|
50
50
|
(model: SDK.IssuesModel.IssuesModel, inspectorIssue: Protocol.Audits.InspectorIssue) => Issue[]>([
|
51
51
|
[
|
52
|
-
Protocol.Audits.InspectorIssueCode.
|
53
|
-
|
52
|
+
Protocol.Audits.InspectorIssueCode.CookieIssue,
|
53
|
+
CookieIssue.fromInspectorIssue,
|
54
54
|
],
|
55
55
|
[
|
56
56
|
Protocol.Audits.InspectorIssueCode.MixedContentIssue,
|
@@ -117,12 +117,6 @@ const issueCodeHandlers = new Map<
|
|
117
117
|
*/
|
118
118
|
function createIssuesFromProtocolIssue(
|
119
119
|
issuesModel: SDK.IssuesModel.IssuesModel, inspectorIssue: Protocol.Audits.InspectorIssue): Issue[] {
|
120
|
-
if (inspectorIssue.code.toString() === 'CookieIssue') {
|
121
|
-
// TODO: backward compatibility for the next chromium roll
|
122
|
-
const details = inspectorIssue.details as {cookieIssueDetails: Protocol.Audits.SameSiteCookieIssueDetails};
|
123
|
-
inspectorIssue.code = Protocol.Audits.InspectorIssueCode.SameSiteCookieIssue;
|
124
|
-
inspectorIssue.details.sameSiteCookieIssueDetails = details.cookieIssueDetails;
|
125
|
-
}
|
126
120
|
const handler = issueCodeHandlers.get(inspectorIssue.code);
|
127
121
|
if (handler) {
|
128
122
|
return handler(issuesModel, inspectorIssue);
|
@@ -37,12 +37,11 @@ const UIStrings = {
|
|
37
37
|
const str_ = i18n.i18n.registerUIStrings('models/issues_manager/SameSiteCookieIssue.ts', UIStrings);
|
38
38
|
const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
|
39
39
|
|
40
|
-
export class
|
41
|
-
#issueDetails: Protocol.Audits.
|
40
|
+
export class CookieIssue extends Issue {
|
41
|
+
#issueDetails: Protocol.Audits.CookieIssueDetails;
|
42
42
|
|
43
43
|
constructor(
|
44
|
-
code: string, issueDetails: Protocol.Audits.
|
45
|
-
issuesModel: SDK.IssuesModel.IssuesModel) {
|
44
|
+
code: string, issueDetails: Protocol.Audits.CookieIssueDetails, issuesModel: SDK.IssuesModel.IssuesModel) {
|
46
45
|
super(code, issuesModel);
|
47
46
|
this.#issueDetails = issueDetails;
|
48
47
|
}
|
@@ -62,35 +61,34 @@ export class SameSiteCookieIssue extends Issue {
|
|
62
61
|
}
|
63
62
|
|
64
63
|
/**
|
65
|
-
* Returns an array of issues from a given
|
64
|
+
* Returns an array of issues from a given CookieIssueDetails.
|
66
65
|
*/
|
67
|
-
static
|
68
|
-
|
69
|
-
|
70
|
-
const issues: SameSiteCookieIssue[] = [];
|
66
|
+
static createIssuesFromCookieIssueDetails(
|
67
|
+
cookieIssueDetails: Protocol.Audits.CookieIssueDetails, issuesModel: SDK.IssuesModel.IssuesModel): CookieIssue[] {
|
68
|
+
const issues: CookieIssue[] = [];
|
71
69
|
|
72
70
|
// Exclusion reasons have priority. It means a cookie was blocked. Create an issue
|
73
71
|
// for every exclusion reason but ignore warning reasons if the cookie was blocked.
|
74
72
|
// Some exclusion reasons are dependent on warning reasons existing in order to produce an issue.
|
75
|
-
if (
|
76
|
-
for (const exclusionReason of
|
77
|
-
const code =
|
78
|
-
exclusionReason,
|
79
|
-
|
73
|
+
if (cookieIssueDetails.cookieExclusionReasons && cookieIssueDetails.cookieExclusionReasons.length > 0) {
|
74
|
+
for (const exclusionReason of cookieIssueDetails.cookieExclusionReasons) {
|
75
|
+
const code = CookieIssue.codeForCookieIssueDetails(
|
76
|
+
exclusionReason, cookieIssueDetails.cookieWarningReasons, cookieIssueDetails.operation,
|
77
|
+
cookieIssueDetails.cookieUrl);
|
80
78
|
if (code) {
|
81
|
-
issues.push(new
|
79
|
+
issues.push(new CookieIssue(code, cookieIssueDetails, issuesModel));
|
82
80
|
}
|
83
81
|
}
|
84
82
|
return issues;
|
85
83
|
}
|
86
84
|
|
87
|
-
if (
|
88
|
-
for (const warningReason of
|
85
|
+
if (cookieIssueDetails.cookieWarningReasons) {
|
86
|
+
for (const warningReason of cookieIssueDetails.cookieWarningReasons) {
|
89
87
|
// warningReasons should be an empty array here.
|
90
|
-
const code =
|
91
|
-
warningReason, [],
|
88
|
+
const code = CookieIssue.codeForCookieIssueDetails(
|
89
|
+
warningReason, [], cookieIssueDetails.operation, cookieIssueDetails.cookieUrl);
|
92
90
|
if (code) {
|
93
|
-
issues.push(new
|
91
|
+
issues.push(new CookieIssue(code, cookieIssueDetails, issuesModel));
|
94
92
|
}
|
95
93
|
}
|
96
94
|
}
|
@@ -99,36 +97,35 @@ export class SameSiteCookieIssue extends Issue {
|
|
99
97
|
|
100
98
|
/**
|
101
99
|
* Calculates an issue code from a reason, an operation, and an array of warningReasons. All these together
|
102
|
-
* can uniquely identify a specific
|
103
|
-
* warningReasons is only needed for some
|
104
|
-
* It is not required if reason is a
|
100
|
+
* can uniquely identify a specific cookie issue.
|
101
|
+
* warningReasons is only needed for some CookieExclusionReason in order to determine if an issue should be raised.
|
102
|
+
* It is not required if reason is a CookieWarningReason.
|
105
103
|
*/
|
106
|
-
static
|
107
|
-
reason: Protocol.Audits.
|
108
|
-
warningReasons: Protocol.Audits.
|
104
|
+
static codeForCookieIssueDetails(
|
105
|
+
reason: Protocol.Audits.CookieExclusionReason|Protocol.Audits.CookieWarningReason,
|
106
|
+
warningReasons: Protocol.Audits.CookieWarningReason[], operation: Protocol.Audits.CookieOperation,
|
109
107
|
cookieUrl?: string): string|null {
|
110
108
|
const isURLSecure = cookieUrl && (cookieUrl.startsWith('https://') || cookieUrl.startsWith('wss://'));
|
111
109
|
const secure = isURLSecure ? 'Secure' : 'Insecure';
|
112
110
|
|
113
|
-
if (reason === Protocol.Audits.
|
114
|
-
reason === Protocol.Audits.
|
115
|
-
reason === Protocol.Audits.
|
111
|
+
if (reason === Protocol.Audits.CookieExclusionReason.ExcludeSameSiteStrict ||
|
112
|
+
reason === Protocol.Audits.CookieExclusionReason.ExcludeSameSiteLax ||
|
113
|
+
reason === Protocol.Audits.CookieExclusionReason.ExcludeSameSiteUnspecifiedTreatedAsLax) {
|
116
114
|
if (warningReasons && warningReasons.length > 0) {
|
117
|
-
if (warningReasons.includes(Protocol.Audits.
|
115
|
+
if (warningReasons.includes(Protocol.Audits.CookieWarningReason.WarnSameSiteStrictLaxDowngradeStrict)) {
|
118
116
|
return [
|
119
|
-
Protocol.Audits.InspectorIssueCode.
|
117
|
+
Protocol.Audits.InspectorIssueCode.CookieIssue,
|
120
118
|
'ExcludeNavigationContextDowngrade',
|
121
119
|
secure,
|
122
120
|
].join('::');
|
123
121
|
}
|
124
122
|
|
125
|
-
if (warningReasons.includes(
|
126
|
-
|
127
|
-
warningReasons.includes(Protocol.Audits.
|
128
|
-
warningReasons.includes(Protocol.Audits.
|
129
|
-
warningReasons.includes(Protocol.Audits.SameSiteCookieWarningReason.WarnSameSiteLaxCrossDowngradeLax)) {
|
123
|
+
if (warningReasons.includes(Protocol.Audits.CookieWarningReason.WarnSameSiteStrictCrossDowngradeStrict) ||
|
124
|
+
warningReasons.includes(Protocol.Audits.CookieWarningReason.WarnSameSiteStrictCrossDowngradeLax) ||
|
125
|
+
warningReasons.includes(Protocol.Audits.CookieWarningReason.WarnSameSiteLaxCrossDowngradeStrict) ||
|
126
|
+
warningReasons.includes(Protocol.Audits.CookieWarningReason.WarnSameSiteLaxCrossDowngradeLax)) {
|
130
127
|
return [
|
131
|
-
Protocol.Audits.InspectorIssueCode.
|
128
|
+
Protocol.Audits.InspectorIssueCode.CookieIssue,
|
132
129
|
'ExcludeContextDowngrade',
|
133
130
|
operation,
|
134
131
|
secure,
|
@@ -138,8 +135,8 @@ export class SameSiteCookieIssue extends Issue {
|
|
138
135
|
|
139
136
|
// If we have ExcludeSameSiteUnspecifiedTreatedAsLax but no corresponding warnings, then add just
|
140
137
|
// the Issue code for ExcludeSameSiteUnspecifiedTreatedAsLax.
|
141
|
-
if (reason === Protocol.Audits.
|
142
|
-
return [Protocol.Audits.InspectorIssueCode.
|
138
|
+
if (reason === Protocol.Audits.CookieExclusionReason.ExcludeSameSiteUnspecifiedTreatedAsLax) {
|
139
|
+
return [Protocol.Audits.InspectorIssueCode.CookieIssue, reason, operation].join('::');
|
143
140
|
}
|
144
141
|
|
145
142
|
// ExcludeSameSiteStrict and ExcludeSameSiteLax require being paired with an appropriate warning. We didn't
|
@@ -147,18 +144,17 @@ export class SameSiteCookieIssue extends Issue {
|
|
147
144
|
return null;
|
148
145
|
}
|
149
146
|
|
150
|
-
if (reason === Protocol.Audits.
|
151
|
-
return [Protocol.Audits.InspectorIssueCode.
|
147
|
+
if (reason === Protocol.Audits.CookieWarningReason.WarnSameSiteStrictLaxDowngradeStrict) {
|
148
|
+
return [Protocol.Audits.InspectorIssueCode.CookieIssue, reason, secure].join('::');
|
152
149
|
}
|
153
150
|
// These have the same message.
|
154
|
-
if (reason === Protocol.Audits.
|
155
|
-
reason === Protocol.Audits.
|
156
|
-
reason === Protocol.Audits.
|
157
|
-
reason === Protocol.Audits.
|
158
|
-
return [Protocol.Audits.InspectorIssueCode.
|
159
|
-
'::');
|
151
|
+
if (reason === Protocol.Audits.CookieWarningReason.WarnSameSiteStrictCrossDowngradeStrict ||
|
152
|
+
reason === Protocol.Audits.CookieWarningReason.WarnSameSiteStrictCrossDowngradeLax ||
|
153
|
+
reason === Protocol.Audits.CookieWarningReason.WarnSameSiteLaxCrossDowngradeLax ||
|
154
|
+
reason === Protocol.Audits.CookieWarningReason.WarnSameSiteLaxCrossDowngradeStrict) {
|
155
|
+
return [Protocol.Audits.InspectorIssueCode.CookieIssue, 'WarnCrossDowngrade', operation, secure].join('::');
|
160
156
|
}
|
161
|
-
return [Protocol.Audits.InspectorIssueCode.
|
157
|
+
return [Protocol.Audits.InspectorIssueCode.CookieIssue, reason, operation].join('::');
|
162
158
|
}
|
163
159
|
|
164
160
|
cookies(): Iterable<Protocol.Audits.AffectedCookie> {
|
@@ -183,7 +179,7 @@ export class SameSiteCookieIssue extends Issue {
|
|
183
179
|
}
|
184
180
|
|
185
181
|
getCategory(): IssueCategory {
|
186
|
-
return IssueCategory.
|
182
|
+
return IssueCategory.Cookie;
|
187
183
|
}
|
188
184
|
|
189
185
|
getDescription(): MarkdownIssueDescription|null {
|
@@ -207,14 +203,14 @@ export class SameSiteCookieIssue extends Issue {
|
|
207
203
|
}
|
208
204
|
|
209
205
|
static fromInspectorIssue(issuesModel: SDK.IssuesModel.IssuesModel, inspectorIssue: Protocol.Audits.InspectorIssue):
|
210
|
-
|
211
|
-
const
|
212
|
-
if (!
|
213
|
-
console.warn('
|
206
|
+
CookieIssue[] {
|
207
|
+
const cookieIssueDetails = inspectorIssue.details.cookieIssueDetails;
|
208
|
+
if (!cookieIssueDetails) {
|
209
|
+
console.warn('Cookie issue without details received.');
|
214
210
|
return [];
|
215
211
|
}
|
216
212
|
|
217
|
-
return
|
213
|
+
return CookieIssue.createIssuesFromCookieIssueDetails(cookieIssueDetails, issuesModel);
|
218
214
|
}
|
219
215
|
}
|
220
216
|
|
@@ -431,32 +427,32 @@ const samePartyCrossPartyContextSet: LazyMarkdownIssueDescription = {
|
|
431
427
|
};
|
432
428
|
|
433
429
|
const issueDescriptions: Map<string, LazyMarkdownIssueDescription> = new Map([
|
434
|
-
['
|
435
|
-
['
|
430
|
+
['CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie', sameSiteUnspecifiedErrorRead],
|
431
|
+
['CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie', sameSiteUnspecifiedErrorSet],
|
436
432
|
// These two don't have a deprecation date yet, but they need to be fixed eventually.
|
437
|
-
['
|
438
|
-
['
|
439
|
-
['
|
440
|
-
['
|
441
|
-
['
|
442
|
-
['
|
443
|
-
['
|
444
|
-
['
|
445
|
-
['
|
446
|
-
['
|
447
|
-
['
|
448
|
-
['
|
449
|
-
['
|
450
|
-
['
|
451
|
-
['
|
433
|
+
['CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie', sameSiteUnspecifiedWarnRead],
|
434
|
+
['CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::SetCookie', sameSiteUnspecifiedWarnSet],
|
435
|
+
['CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::ReadCookie', sameSiteUnspecifiedWarnRead],
|
436
|
+
['CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::SetCookie', sameSiteUnspecifiedWarnSet],
|
437
|
+
['CookieIssue::ExcludeSameSiteNoneInsecure::ReadCookie', sameSiteNoneInsecureErrorRead],
|
438
|
+
['CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie', sameSiteNoneInsecureErrorSet],
|
439
|
+
['CookieIssue::WarnSameSiteNoneInsecure::ReadCookie', sameSiteNoneInsecureWarnRead],
|
440
|
+
['CookieIssue::WarnSameSiteNoneInsecure::SetCookie', sameSiteNoneInsecureWarnSet],
|
441
|
+
['CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure', sameSiteWarnStrictLaxDowngradeStrict(true)],
|
442
|
+
['CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure', sameSiteWarnStrictLaxDowngradeStrict(false)],
|
443
|
+
['CookieIssue::WarnCrossDowngrade::ReadCookie::Secure', sameSiteWarnCrossDowngradeRead(true)],
|
444
|
+
['CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure', sameSiteWarnCrossDowngradeRead(false)],
|
445
|
+
['CookieIssue::WarnCrossDowngrade::SetCookie::Secure', sameSiteWarnCrossDowngradeSet(true)],
|
446
|
+
['CookieIssue::WarnCrossDowngrade::SetCookie::Insecure', sameSiteWarnCrossDowngradeSet(false)],
|
447
|
+
['CookieIssue::ExcludeNavigationContextDowngrade::Secure', sameSiteExcludeNavigationContextDowngrade(true)],
|
452
448
|
[
|
453
|
-
'
|
449
|
+
'CookieIssue::ExcludeNavigationContextDowngrade::Insecure',
|
454
450
|
sameSiteExcludeNavigationContextDowngrade(false),
|
455
451
|
],
|
456
|
-
['
|
457
|
-
['
|
458
|
-
['
|
459
|
-
['
|
460
|
-
['
|
461
|
-
['
|
452
|
+
['CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure', sameSiteExcludeContextDowngradeRead(true)],
|
453
|
+
['CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure', sameSiteExcludeContextDowngradeRead(false)],
|
454
|
+
['CookieIssue::ExcludeContextDowngrade::SetCookie::Secure', sameSiteExcludeContextDowngradeSet(true)],
|
455
|
+
['CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure', sameSiteExcludeContextDowngradeSet(false)],
|
456
|
+
['CookieIssue::ExcludeInvalidSameParty::SetCookie', sameSiteInvalidSameParty],
|
457
|
+
['CookieIssue::ExcludeSamePartyCrossPartyContext::SetCookie', samePartyCrossPartyContextSet],
|
462
458
|
]);
|
@@ -20,7 +20,7 @@ import * as MixedContentIssue from './MixedContentIssue.js';
|
|
20
20
|
import * as NavigatorUserAgentIssue from './NavigatorUserAgentIssue.js';
|
21
21
|
import * as QuirksModeIssue from './QuirksModeIssue.js';
|
22
22
|
import * as RelatedIssue from './RelatedIssue.js';
|
23
|
-
import * as
|
23
|
+
import * as CookieIssue from './SameSiteCookieIssue.js';
|
24
24
|
import * as SharedArrayBufferIssue from './SharedArrayBufferIssue.js';
|
25
25
|
import * as SourceFrameIssuesManager from './SourceFrameIssuesManager.js';
|
26
26
|
import * as TrustedWebActivityIssue from './TrustedWebActivityIssue.js';
|
@@ -30,6 +30,7 @@ export {
|
|
30
30
|
ClientHintIssue,
|
31
31
|
ContentSecurityPolicyIssue,
|
32
32
|
ContrastCheckTrigger,
|
33
|
+
CookieIssue,
|
33
34
|
CorsIssue,
|
34
35
|
CrossOriginEmbedderPolicyIssue,
|
35
36
|
DeprecationIssue,
|
@@ -44,7 +45,6 @@ export {
|
|
44
45
|
NavigatorUserAgentIssue,
|
45
46
|
QuirksModeIssue,
|
46
47
|
RelatedIssue,
|
47
|
-
SameSiteCookieIssue,
|
48
48
|
SharedArrayBufferIssue,
|
49
49
|
SourceFrameIssuesManager,
|
50
50
|
TrustedWebActivityIssue,
|
@@ -421,7 +421,7 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
|
|
421
421
|
await this.#innerUpdateInterceptionPatterns();
|
422
422
|
}
|
423
423
|
|
424
|
-
|
424
|
+
updateInterceptionPatterns(): void {
|
425
425
|
void this.updateInterceptionThrottler.schedule(this.#innerUpdateInterceptionPatterns.bind(this));
|
426
426
|
}
|
427
427
|
|
@@ -313,7 +313,7 @@ export class ClassNamePrompt extends UI.TextPrompt.TextPrompt {
|
|
313
313
|
if (stylesheet.frameId !== this.selectedFrameId) {
|
314
314
|
continue;
|
315
315
|
}
|
316
|
-
const cssPromise = cssModel.
|
316
|
+
const cssPromise = cssModel.getClassNames(stylesheet.id).then(classes => {
|
317
317
|
for (const className of classes) {
|
318
318
|
completions.add(className);
|
319
319
|
}
|
@@ -106,7 +106,7 @@ export class ComputedStyleModel extends Common.ObjectWrapper.ObjectWrapper<Event
|
|
106
106
|
}
|
107
107
|
|
108
108
|
if (!this.computedStylePromise) {
|
109
|
-
this.computedStylePromise = cssModel.
|
109
|
+
this.computedStylePromise = cssModel.getComputedStyle(nodeId).then(verifyOutdated.bind(this, elementNode));
|
110
110
|
}
|
111
111
|
|
112
112
|
return this.computedStylePromise;
|
@@ -1996,7 +1996,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
1996
1996
|
return;
|
1997
1997
|
}
|
1998
1998
|
|
1999
|
-
const styles = await node.domModel().cssModel().
|
1999
|
+
const styles = await node.domModel().cssModel().getComputedStyle(nodeId);
|
2000
2000
|
for (const styleAdorner of this.styleAdorners) {
|
2001
2001
|
this.removeAdorner(styleAdorner);
|
2002
2002
|
}
|
@@ -97,7 +97,7 @@ export class LayersWidget extends UI.Widget.Widget {
|
|
97
97
|
Promise.resolve(subLayers.sort((layer1, layer2) => layer1.order - layer2.order).map(makeTreeNode(id))),
|
98
98
|
};
|
99
99
|
};
|
100
|
-
const rootLayer = await this.cssModel.
|
100
|
+
const rootLayer = await this.cssModel.getRootLayer(node.id);
|
101
101
|
this.layerTreeComponent.data = {
|
102
102
|
defaultRenderer: TreeOutline.TreeOutline.defaultRenderer,
|
103
103
|
tree: [makeTreeNode('')(rootLayer)],
|
@@ -88,8 +88,8 @@ export class MetricsSidebarPane extends ElementsSidebarPane {
|
|
88
88
|
}
|
89
89
|
|
90
90
|
const promises = [
|
91
|
-
cssModel.
|
92
|
-
cssModel.
|
91
|
+
cssModel.getComputedStyle(node.id).then(callback.bind(this)),
|
92
|
+
cssModel.getInlineStyles(node.id).then(inlineStyleResult => {
|
93
93
|
if (inlineStyleResult && this.node() === node) {
|
94
94
|
this.inlineStyle = inlineStyleResult.inlineStyle;
|
95
95
|
}
|
@@ -88,7 +88,7 @@ export class PlatformFontsWidget extends UI.ThrottledWidget.ThrottledWidget {
|
|
88
88
|
return Promise.resolve();
|
89
89
|
}
|
90
90
|
|
91
|
-
return cssModel.
|
91
|
+
return cssModel.getPlatformFonts(node.id).then(this.refreshUI.bind(this, node));
|
92
92
|
}
|
93
93
|
|
94
94
|
private refreshUI(node: SDK.DOMModel.DOMNode, platformFonts: Protocol.CSS.PlatformFontUsage[]|null): void {
|
@@ -278,7 +278,7 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
|
|
278
278
|
const cssModel = this.parentPaneInternal.cssModel();
|
279
279
|
const node = this.node();
|
280
280
|
if (cssModel && node && typeof node.id !== 'undefined') {
|
281
|
-
const contrastInfo = new ColorPicker.ContrastInfo.ContrastInfo(await cssModel.
|
281
|
+
const contrastInfo = new ColorPicker.ContrastInfo.ContrastInfo(await cssModel.getBackgroundColors(node.id));
|
282
282
|
swatchIcon.setContrastInfo(contrastInfo);
|
283
283
|
}
|
284
284
|
}
|
@@ -3195,13 +3195,12 @@ export class CSSPropertyPrompt extends UI.TextPrompt.TextPrompt {
|
|
3195
3195
|
if (!node || this.selectedNodeComputedStyles) {
|
3196
3196
|
return;
|
3197
3197
|
}
|
3198
|
-
this.selectedNodeComputedStyles = await node.domModel().cssModel().
|
3198
|
+
this.selectedNodeComputedStyles = await node.domModel().cssModel().getComputedStyle(node.id);
|
3199
3199
|
const parentNode = node.parentNode;
|
3200
3200
|
if (parentNode) {
|
3201
|
-
this.parentNodeComputedStyles = await parentNode.domModel().cssModel().
|
3201
|
+
this.parentNodeComputedStyles = await parentNode.domModel().cssModel().getComputedStyle(parentNode.id);
|
3202
3202
|
}
|
3203
3203
|
};
|
3204
|
-
|
3205
3204
|
for (const result of results) {
|
3206
3205
|
await ensureComputedStyles();
|
3207
3206
|
// Using parent node's computed styles does not work in all cases. For example:
|
@@ -165,7 +165,7 @@ export class MediaQueryInspector extends UI.Widget.Widget implements
|
|
165
165
|
return Promise.resolve();
|
166
166
|
}
|
167
167
|
|
168
|
-
return this.cssModel.
|
168
|
+
return this.cssModel.getMediaQueries().then(this.rebuildMediaQueries.bind(this));
|
169
169
|
}
|
170
170
|
|
171
171
|
private squashAdjacentEqual(models: MediaQueryUIModel[]): MediaQueryUIModel[] {
|
@@ -131,7 +131,7 @@ class AffectedRequestsView extends AffectedResourcesView {
|
|
131
131
|
const issueTypeToNetworkHeaderMap =
|
132
132
|
new Map<IssuesManager.Issue.IssueCategory, NetworkForward.UIRequestLocation.UIRequestTabs>([
|
133
133
|
[
|
134
|
-
IssuesManager.Issue.IssueCategory.
|
134
|
+
IssuesManager.Issue.IssueCategory.Cookie,
|
135
135
|
NetworkForward.UIRequestLocation.UIRequestTabs.Cookies,
|
136
136
|
],
|
137
137
|
[
|
@@ -127,7 +127,7 @@ class IssueCategoryView extends UI.TreeOutline.TreeElement {
|
|
127
127
|
return i18nString(UIStrings.crossOriginEmbedderPolicy);
|
128
128
|
case IssuesManager.Issue.IssueCategory.MixedContent:
|
129
129
|
return i18nString(UIStrings.mixedContent);
|
130
|
-
case IssuesManager.Issue.IssueCategory.
|
130
|
+
case IssuesManager.Issue.IssueCategory.Cookie:
|
131
131
|
return i18nString(UIStrings.samesiteCookie);
|
132
132
|
case IssuesManager.Issue.IssueCategory.HeavyAd:
|
133
133
|
return i18nString(UIStrings.heavyAds);
|
@@ -1716,7 +1716,7 @@ export class NetworkLogView extends Common.ObjectWrapper.eventMixin<EventTypes,
|
|
1716
1716
|
return false;
|
1717
1717
|
}
|
1718
1718
|
if (this.onlyIssuesFilterUI.checked() &&
|
1719
|
-
!IssuesManager.RelatedIssue.hasIssueOfCategory(request, IssuesManager.Issue.IssueCategory.
|
1719
|
+
!IssuesManager.RelatedIssue.hasIssueOfCategory(request, IssuesManager.Issue.IssueCategory.Cookie)) {
|
1720
1720
|
return false;
|
1721
1721
|
}
|
1722
1722
|
if (this.onlyBlockedRequestsUI.checked() && !request.wasBlocked() && !request.corsErrorStatus()) {
|
@@ -69,7 +69,7 @@ async function specificCssCompletion(
|
|
69
69
|
assertNotNullOrUndefined(cssModel);
|
70
70
|
|
71
71
|
const currentStyleSheet = getCurrentStyleSheet(uiSourceCode.url(), cssModel);
|
72
|
-
const existingClassNames = await cssModel.
|
72
|
+
const existingClassNames = await cssModel.getClassNames(currentStyleSheet);
|
73
73
|
|
74
74
|
return {
|
75
75
|
from: node.from,
|
@@ -12,6 +12,7 @@ import * as QuickOpen from '../../ui/legacy/components/quick_open/quick_open.js'
|
|
12
12
|
import * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
|
13
13
|
import * as UI from '../../ui/legacy/legacy.js';
|
14
14
|
|
15
|
+
import * as Components from './components/components.js';
|
15
16
|
import {EditingLocationHistoryManager} from './EditingLocationHistoryManager.js';
|
16
17
|
import sourcesViewStyles from './sourcesView.css.js';
|
17
18
|
|
@@ -377,6 +378,10 @@ export class SourcesView extends Common.ObjectWrapper.eventMixin<EventTypes, typ
|
|
377
378
|
sourceView = new SourceFrame.ImageView.ImageView(uiSourceCode.mimeType(), uiSourceCode);
|
378
379
|
} else if (contentType === Common.ResourceType.resourceTypes.Font) {
|
379
380
|
sourceView = new SourceFrame.FontView.FontView(uiSourceCode.mimeType(), uiSourceCode);
|
381
|
+
} else if (
|
382
|
+
uiSourceCode.name() === HEADER_OVERRIDES_FILENAME &&
|
383
|
+
Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.HEADER_OVERRIDES)) {
|
384
|
+
sourceView = new Components.HeadersView.HeadersView(uiSourceCode);
|
380
385
|
} else {
|
381
386
|
sourceFrame = new UISourceCodeFrame(uiSourceCode);
|
382
387
|
}
|
@@ -399,10 +404,18 @@ export class SourcesView extends Common.ObjectWrapper.eventMixin<EventTypes, typ
|
|
399
404
|
if (widget instanceof SourceFrame.FontView.FontView) {
|
400
405
|
return SourceViewType.FontView;
|
401
406
|
}
|
407
|
+
if (widget instanceof Components.HeadersView.HeadersView) {
|
408
|
+
return SourceViewType.HeadersView;
|
409
|
+
}
|
402
410
|
return SourceViewType.SourceView;
|
403
411
|
}
|
404
412
|
|
405
|
-
#
|
413
|
+
#sourceViewTypeForUISourceCode(uiSourceCode: Workspace.UISourceCode.UISourceCode): SourceViewType {
|
414
|
+
if (uiSourceCode.name() === HEADER_OVERRIDES_FILENAME &&
|
415
|
+
Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.HEADER_OVERRIDES)) {
|
416
|
+
return SourceViewType.HeadersView;
|
417
|
+
}
|
418
|
+
const contentType = uiSourceCode.contentType();
|
406
419
|
switch (contentType) {
|
407
420
|
case Common.ResourceType.resourceTypes.Image:
|
408
421
|
return SourceViewType.ImageView;
|
@@ -417,8 +430,7 @@ export class SourcesView extends Common.ObjectWrapper.eventMixin<EventTypes, typ
|
|
417
430
|
const uiSourceCode = event.data;
|
418
431
|
const widget = this.sourceViewByUISourceCode.get(uiSourceCode);
|
419
432
|
if (widget) {
|
420
|
-
|
421
|
-
if (this.#sourceViewTypeForWidget(widget) !== this.#sourceViewTypeForContentType(contentType)) {
|
433
|
+
if (this.#sourceViewTypeForWidget(widget) !== this.#sourceViewTypeForUISourceCode(uiSourceCode)) {
|
422
434
|
// Remove the exisiting editor tab and create a new one of the correct type.
|
423
435
|
this.removeUISourceCodes([uiSourceCode]);
|
424
436
|
this.showSourceLocation(uiSourceCode);
|
@@ -602,20 +614,18 @@ export class SourcesView extends Common.ObjectWrapper.eventMixin<EventTypes, typ
|
|
602
614
|
}
|
603
615
|
|
604
616
|
save(): void {
|
605
|
-
this.
|
617
|
+
this.saveSourceView(this.visibleView());
|
606
618
|
}
|
607
619
|
|
608
620
|
saveAll(): void {
|
609
621
|
const sourceFrames = this.editorContainer.fileViews();
|
610
|
-
sourceFrames.forEach(this.
|
622
|
+
sourceFrames.forEach(this.saveSourceView.bind(this));
|
611
623
|
}
|
612
624
|
|
613
|
-
private
|
614
|
-
if (
|
615
|
-
|
625
|
+
private saveSourceView(sourceView: UI.Widget.Widget|null): void {
|
626
|
+
if (sourceView instanceof UISourceCodeFrame || sourceView instanceof Components.HeadersView.HeadersView) {
|
627
|
+
sourceView.commitEditing();
|
616
628
|
}
|
617
|
-
const uiSourceCodeFrame = (sourceFrame as UISourceCodeFrame);
|
618
|
-
uiSourceCodeFrame.commitEditing();
|
619
629
|
}
|
620
630
|
|
621
631
|
toggleBreakpointsActiveState(active: boolean): void {
|
@@ -764,9 +774,12 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
|
|
764
774
|
}
|
765
775
|
}
|
766
776
|
|
777
|
+
const HEADER_OVERRIDES_FILENAME = '.headers';
|
778
|
+
|
767
779
|
// eslint-disable-next-line rulesdir/const_enum
|
768
780
|
enum SourceViewType {
|
769
781
|
ImageView = 'ImageView',
|
770
782
|
FontView = 'FontView',
|
783
|
+
HeadersView = 'HeadersView',
|
771
784
|
SourceView = 'SourceView',
|
772
785
|
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2022 The Chromium Authors. All rights reserved.
|
3
|
+
* Use of this source code is governed by a BSD-style license that can be
|
4
|
+
* found in the LICENSE file.
|
5
|
+
*/
|
6
|
+
|
7
|
+
:host {
|
8
|
+
flex-grow: 1;
|
9
|
+
}
|
10
|
+
|
11
|
+
.center-wrapper {
|
12
|
+
height: 100%;
|
13
|
+
display: flex;
|
14
|
+
justify-content: center;
|
15
|
+
align-items: center;
|
16
|
+
}
|
17
|
+
|
18
|
+
.centered {
|
19
|
+
margin: 1em;
|
20
|
+
max-width: 300px;
|
21
|
+
text-align: center;
|
22
|
+
}
|
23
|
+
|
24
|
+
.error-header {
|
25
|
+
font-weight: bold;
|
26
|
+
margin-bottom: 1em;
|
27
|
+
}
|
28
|
+
|
29
|
+
.error-body {
|
30
|
+
line-height: 1.5em;
|
31
|
+
color: var(--color-text-secondary);
|
32
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
// Copyright 2022 The Chromium Authors. All rights reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
3
|
+
// found in the LICENSE file.
|
4
|
+
|
5
|
+
import * as i18n from '../../../core/i18n/i18n.js';
|
6
|
+
import * as Persistence from '../../../models/persistence/persistence.js';
|
7
|
+
import type * as Workspace from '../../../models/workspace/workspace.js';
|
8
|
+
import * as ComponentHelpers from '../../../ui/components/helpers/helpers.js';
|
9
|
+
import * as UI from '../../../ui/legacy/legacy.js';
|
10
|
+
import * as LitHtml from '../../../ui/lit-html/lit-html.js';
|
11
|
+
|
12
|
+
import HeadersViewStyles from './HeadersView.css.js';
|
13
|
+
|
14
|
+
const UIStrings = {
|
15
|
+
/**
|
16
|
+
*@description Error message for files which cannot not be parsed.
|
17
|
+
*@example {.headers} PH1
|
18
|
+
*/
|
19
|
+
errorWhenParsing: 'Error when parsing \'\'{PH1}\'\'.',
|
20
|
+
/**
|
21
|
+
*@description Explainer for files which cannot be parsed.
|
22
|
+
*@example {.headers} PH1
|
23
|
+
*/
|
24
|
+
parsingErrorExplainer:
|
25
|
+
'This is most likely due to a syntax error in \'\'{PH1}\'\'. Try opening this file in an external editor to fix the error or delete the file and re-create the override.',
|
26
|
+
};
|
27
|
+
const str_ = i18n.i18n.registerUIStrings('panels/sources/components/HeadersView.ts', UIStrings);
|
28
|
+
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
29
|
+
|
30
|
+
export class HeadersView extends UI.View.SimpleView {
|
31
|
+
readonly #headersViewComponent = new HeadersViewComponent();
|
32
|
+
#uiSourceCode: Workspace.UISourceCode.UISourceCode;
|
33
|
+
|
34
|
+
constructor(uiSourceCode: Workspace.UISourceCode.UISourceCode) {
|
35
|
+
super('HeadersView');
|
36
|
+
this.#uiSourceCode = uiSourceCode;
|
37
|
+
this.element.appendChild(this.#headersViewComponent);
|
38
|
+
this.#headersViewComponent.data = {
|
39
|
+
uiSourceCode: this.#uiSourceCode,
|
40
|
+
};
|
41
|
+
}
|
42
|
+
|
43
|
+
commitEditing(): void {
|
44
|
+
this.#uiSourceCode.commitWorkingCopy();
|
45
|
+
Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().updateInterceptionPatterns();
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
export interface HeadersViewComponentData {
|
50
|
+
uiSourceCode: Workspace.UISourceCode.UISourceCode;
|
51
|
+
}
|
52
|
+
|
53
|
+
export class HeadersViewComponent extends HTMLElement {
|
54
|
+
static readonly litTagName = LitHtml.literal`devtools-sources-headers-view`;
|
55
|
+
readonly #shadow = this.attachShadow({mode: 'open'});
|
56
|
+
#uiSourceCode: Workspace.UISourceCode.UISourceCode|null = null;
|
57
|
+
|
58
|
+
connectedCallback(): void {
|
59
|
+
this.#shadow.adoptedStyleSheets = [HeadersViewStyles];
|
60
|
+
}
|
61
|
+
|
62
|
+
set data(data: HeadersViewComponentData) {
|
63
|
+
this.#uiSourceCode = data.uiSourceCode;
|
64
|
+
this.#render();
|
65
|
+
}
|
66
|
+
|
67
|
+
#render(): void {
|
68
|
+
const fileName = this.#uiSourceCode?.name() || '.headers';
|
69
|
+
// clang-format off
|
70
|
+
LitHtml.render(LitHtml.html`
|
71
|
+
<div class="center-wrapper">
|
72
|
+
<div class="centered">
|
73
|
+
<div class="error-header">${i18nString(UIStrings.errorWhenParsing, {PH1: fileName})}</div>
|
74
|
+
<div class="error-body">${i18nString(UIStrings.parsingErrorExplainer, {PH1: fileName})}</div>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
`, this.#shadow, {host: this});
|
78
|
+
// clang-format on
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
ComponentHelpers.CustomElements.defineComponent('devtools-sources-headers-view', HeadersViewComponent);
|
83
|
+
|
84
|
+
declare global {
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
86
|
+
interface HTMLElementTagNameMap {
|
87
|
+
'devtools-sources-headers-view': HeadersViewComponent;
|
88
|
+
}
|
89
|
+
}
|
package/package.json
CHANGED