Skip to main content

browser_protocol/audits/
mod.rs

1//! Audits domain allows investigation of page violations and possible improvements.
2
3use serde::{Serialize, Deserialize};
4
5/// Information about a cookie that is affected by an inspector issue.
6
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
8#[serde(rename_all = "camelCase")]
9pub struct AffectedCookie {
10    /// The following three properties uniquely identify a cookie
11
12    pub name: String,
13
14    pub path: String,
15
16    pub domain: String,
17}
18
19/// Information about a request that is affected by an inspector issue.
20
21#[derive(Debug, Clone, Serialize, Deserialize, Default)]
22#[serde(rename_all = "camelCase")]
23pub struct AffectedRequest {
24    /// The unique request id.
25
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub requestId: Option<crate::network::RequestId>,
28
29    pub url: String,
30}
31
32/// Information about the frame affected by an inspector issue.
33
34#[derive(Debug, Clone, Serialize, Deserialize, Default)]
35#[serde(rename_all = "camelCase")]
36pub struct AffectedFrame {
37
38    pub frameId: crate::page::FrameId,
39}
40
41
42#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
43pub enum CookieExclusionReason {
44    #[default]
45    ExcludeSameSiteUnspecifiedTreatedAsLax,
46    ExcludeSameSiteNoneInsecure,
47    ExcludeSameSiteLax,
48    ExcludeSameSiteStrict,
49    ExcludeDomainNonASCII,
50    ExcludeThirdPartyCookieBlockedInFirstPartySet,
51    ExcludeThirdPartyPhaseout,
52    ExcludePortMismatch,
53    ExcludeSchemeMismatch,
54}
55
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
58pub enum CookieWarningReason {
59    #[default]
60    WarnSameSiteUnspecifiedCrossSiteContext,
61    WarnSameSiteNoneInsecure,
62    WarnSameSiteUnspecifiedLaxAllowUnsafe,
63    WarnSameSiteStrictLaxDowngradeStrict,
64    WarnSameSiteStrictCrossDowngradeStrict,
65    WarnSameSiteStrictCrossDowngradeLax,
66    WarnSameSiteLaxCrossDowngradeStrict,
67    WarnSameSiteLaxCrossDowngradeLax,
68    WarnAttributeValueExceedsMaxSize,
69    WarnDomainNonASCII,
70    WarnThirdPartyPhaseout,
71    WarnCrossSiteRedirectDowngradeChangesInclusion,
72    WarnDeprecationTrialMetadata,
73    WarnThirdPartyCookieHeuristic,
74}
75
76
77#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
78pub enum CookieOperation {
79    #[default]
80    SetCookie,
81    ReadCookie,
82}
83
84/// Represents the category of insight that a cookie issue falls under.
85
86#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
87pub enum InsightType {
88    #[default]
89    GitHubResource,
90    GracePeriod,
91    Heuristics,
92}
93
94/// Information about the suggested solution to a cookie issue.
95
96#[derive(Debug, Clone, Serialize, Deserialize, Default)]
97#[serde(rename_all = "camelCase")]
98pub struct CookieIssueInsight {
99
100    #[serde(rename = "type")]
101    pub type_: InsightType,
102    /// Link to table entry in third-party cookie migration readiness list.
103
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub tableEntryUrl: Option<String>,
106}
107
108/// This information is currently necessary, as the front-end has a difficult
109/// time finding a specific cookie. With this, we can convey specific error
110/// information without the cookie.
111
112#[derive(Debug, Clone, Serialize, Deserialize, Default)]
113#[serde(rename_all = "camelCase")]
114pub struct CookieIssueDetails {
115    /// If AffectedCookie is not set then rawCookieLine contains the raw
116    /// Set-Cookie header string. This hints at a problem where the
117    /// cookie line is syntactically or semantically malformed in a way
118    /// that no valid cookie could be created.
119
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub cookie: Option<AffectedCookie>,
122
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub rawCookieLine: Option<String>,
125
126    pub cookieWarningReasons: Vec<CookieWarningReason>,
127
128    pub cookieExclusionReasons: Vec<CookieExclusionReason>,
129    /// Optionally identifies the site-for-cookies and the cookie url, which
130    /// may be used by the front-end as additional context.
131
132    pub operation: CookieOperation,
133
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub siteForCookies: Option<String>,
136
137    #[serde(skip_serializing_if = "Option::is_none")]
138    pub cookieUrl: Option<String>,
139
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub request: Option<AffectedRequest>,
142    /// The recommended solution to the issue.
143
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub insight: Option<CookieIssueInsight>,
146}
147
148
149#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
150pub enum PerformanceIssueType {
151    #[default]
152    DocumentCookie,
153}
154
155/// Details for a performance issue.
156
157#[derive(Debug, Clone, Serialize, Deserialize, Default)]
158#[serde(rename_all = "camelCase")]
159pub struct PerformanceIssueDetails {
160
161    pub performanceIssueType: PerformanceIssueType,
162
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub sourceCodeLocation: Option<SourceCodeLocation>,
165}
166
167
168#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
169pub enum MixedContentResolutionStatus {
170    #[default]
171    MixedContentBlocked,
172    MixedContentAutomaticallyUpgraded,
173    MixedContentWarning,
174}
175
176
177#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
178pub enum MixedContentResourceType {
179    #[default]
180    AttributionSrc,
181    Audio,
182    Beacon,
183    CSPReport,
184    Download,
185    EventSource,
186    Favicon,
187    Font,
188    Form,
189    Frame,
190    Image,
191    Import,
192    JSON,
193    Manifest,
194    Ping,
195    PluginData,
196    PluginResource,
197    Prefetch,
198    Resource,
199    Script,
200    ServiceWorker,
201    SharedWorker,
202    SpeculationRules,
203    Stylesheet,
204    Track,
205    Video,
206    Worker,
207    XMLHttpRequest,
208    XSLT,
209}
210
211
212#[derive(Debug, Clone, Serialize, Deserialize, Default)]
213#[serde(rename_all = "camelCase")]
214pub struct MixedContentIssueDetails {
215    /// The type of resource causing the mixed content issue (css, js, iframe,
216    /// form,...). Marked as optional because it is mapped to from
217    /// blink::mojom::RequestContextType, which will be replaced
218    /// by network::mojom::RequestDestination
219
220    #[serde(skip_serializing_if = "Option::is_none")]
221    pub resourceType: Option<MixedContentResourceType>,
222    /// The way the mixed content issue is being resolved.
223
224    pub resolutionStatus: MixedContentResolutionStatus,
225    /// The unsafe http url causing the mixed content issue.
226
227    pub insecureURL: String,
228    /// The url responsible for the call to an unsafe url.
229
230    pub mainResourceURL: String,
231    /// The mixed content request.
232    /// Does not always exist (e.g. for unsafe form submission urls).
233
234    #[serde(skip_serializing_if = "Option::is_none")]
235    pub request: Option<AffectedRequest>,
236    /// Optional because not every mixed content issue is necessarily linked to a frame.
237
238    #[serde(skip_serializing_if = "Option::is_none")]
239    pub frame: Option<AffectedFrame>,
240}
241
242/// Enum indicating the reason a response has been blocked. These reasons are
243/// refinements of the net error BLOCKED_BY_RESPONSE.
244
245#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
246pub enum BlockedByResponseReason {
247    #[default]
248    CoepFrameResourceNeedsCoepHeader,
249    CoopSandboxedIFrameCannotNavigateToCoopPage,
250    CorpNotSameOrigin,
251    CorpNotSameOriginAfterDefaultedToSameOriginByCoep,
252    CorpNotSameOriginAfterDefaultedToSameOriginByDip,
253    CorpNotSameOriginAfterDefaultedToSameOriginByCoepAndDip,
254    CorpNotSameSite,
255    SRIMessageSignatureMismatch,
256}
257
258/// Details for a request that has been blocked with the BLOCKED_BY_RESPONSE
259/// code. Currently only used for COEP/COOP, but may be extended to include
260/// some CSP errors in the future.
261
262#[derive(Debug, Clone, Serialize, Deserialize, Default)]
263#[serde(rename_all = "camelCase")]
264pub struct BlockedByResponseIssueDetails {
265
266    pub request: AffectedRequest,
267
268    #[serde(skip_serializing_if = "Option::is_none")]
269    pub parentFrame: Option<AffectedFrame>,
270
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub blockedFrame: Option<AffectedFrame>,
273
274    pub reason: BlockedByResponseReason,
275}
276
277
278#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
279pub enum HeavyAdResolutionStatus {
280    #[default]
281    HeavyAdBlocked,
282    HeavyAdWarning,
283}
284
285
286#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
287pub enum HeavyAdReason {
288    #[default]
289    NetworkTotalLimit,
290    CpuTotalLimit,
291    CpuPeakLimit,
292}
293
294
295#[derive(Debug, Clone, Serialize, Deserialize, Default)]
296#[serde(rename_all = "camelCase")]
297pub struct HeavyAdIssueDetails {
298    /// The resolution status, either blocking the content or warning.
299
300    pub resolution: HeavyAdResolutionStatus,
301    /// The reason the ad was blocked, total network or cpu or peak cpu.
302
303    pub reason: HeavyAdReason,
304    /// The frame that was blocked.
305
306    pub frame: AffectedFrame,
307}
308
309
310#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
311pub enum ContentSecurityPolicyViolationType {
312    #[default]
313    KInlineViolation,
314    KEvalViolation,
315    KURLViolation,
316    KSRIViolation,
317    KTrustedTypesSinkViolation,
318    KTrustedTypesPolicyViolation,
319    KWasmEvalViolation,
320}
321
322
323#[derive(Debug, Clone, Serialize, Deserialize, Default)]
324#[serde(rename_all = "camelCase")]
325pub struct SourceCodeLocation {
326
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub scriptId: Option<crate::runtime::ScriptId>,
329
330    pub url: String,
331
332    pub lineNumber: i64,
333
334    pub columnNumber: i64,
335}
336
337
338#[derive(Debug, Clone, Serialize, Deserialize, Default)]
339#[serde(rename_all = "camelCase")]
340pub struct ContentSecurityPolicyIssueDetails {
341    /// The url not included in allowed sources.
342
343    #[serde(skip_serializing_if = "Option::is_none")]
344    pub blockedURL: Option<String>,
345    /// Specific directive that is violated, causing the CSP issue.
346
347    pub violatedDirective: String,
348
349    pub isReportOnly: bool,
350
351    pub contentSecurityPolicyViolationType: ContentSecurityPolicyViolationType,
352
353    #[serde(skip_serializing_if = "Option::is_none")]
354    pub frameAncestor: Option<AffectedFrame>,
355
356    #[serde(skip_serializing_if = "Option::is_none")]
357    pub sourceCodeLocation: Option<SourceCodeLocation>,
358
359    #[serde(skip_serializing_if = "Option::is_none")]
360    pub violatingNodeId: Option<crate::dom::BackendNodeId>,
361}
362
363
364#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
365pub enum SharedArrayBufferIssueType {
366    #[default]
367    TransferIssue,
368    CreationIssue,
369}
370
371/// Details for a issue arising from an SAB being instantiated in, or
372/// transferred to a context that is not cross-origin isolated.
373
374#[derive(Debug, Clone, Serialize, Deserialize, Default)]
375#[serde(rename_all = "camelCase")]
376pub struct SharedArrayBufferIssueDetails {
377
378    pub sourceCodeLocation: SourceCodeLocation,
379
380    pub isWarning: bool,
381
382    #[serde(rename = "type")]
383    pub type_: SharedArrayBufferIssueType,
384}
385
386/// Details for a CORS related issue, e.g. a warning or error related to
387/// CORS RFC1918 enforcement.
388
389#[derive(Debug, Clone, Serialize, Deserialize, Default)]
390#[serde(rename_all = "camelCase")]
391pub struct CorsIssueDetails {
392
393    pub corsErrorStatus: crate::network::CorsErrorStatus,
394
395    pub isWarning: bool,
396
397    pub request: AffectedRequest,
398
399    #[serde(skip_serializing_if = "Option::is_none")]
400    pub location: Option<SourceCodeLocation>,
401
402    #[serde(skip_serializing_if = "Option::is_none")]
403    pub initiatorOrigin: Option<String>,
404
405    #[serde(skip_serializing_if = "Option::is_none")]
406    pub resourceIPAddressSpace: Option<crate::network::IPAddressSpace>,
407
408    #[serde(skip_serializing_if = "Option::is_none")]
409    pub clientSecurityState: Option<crate::network::ClientSecurityState>,
410}
411
412
413#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
414pub enum AttributionReportingIssueType {
415    #[default]
416    PermissionPolicyDisabled,
417    UntrustworthyReportingOrigin,
418    InsecureContext,
419    InvalidHeader,
420    InvalidRegisterTriggerHeader,
421    SourceAndTriggerHeaders,
422    SourceIgnored,
423    TriggerIgnored,
424    OsSourceIgnored,
425    OsTriggerIgnored,
426    InvalidRegisterOsSourceHeader,
427    InvalidRegisterOsTriggerHeader,
428    WebAndOsHeaders,
429    NoWebOrOsSupport,
430    NavigationRegistrationWithoutTransientUserActivation,
431    InvalidInfoHeader,
432    NoRegisterSourceHeader,
433    NoRegisterTriggerHeader,
434    NoRegisterOsSourceHeader,
435    NoRegisterOsTriggerHeader,
436    NavigationRegistrationUniqueScopeAlreadySet,
437}
438
439
440#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
441pub enum SharedDictionaryError {
442    #[default]
443    UseErrorCrossOriginNoCorsRequest,
444    UseErrorDictionaryLoadFailure,
445    UseErrorMatchingDictionaryNotUsed,
446    UseErrorUnexpectedContentDictionaryHeader,
447    WriteErrorCossOriginNoCorsRequest,
448    WriteErrorDisallowedBySettings,
449    WriteErrorExpiredResponse,
450    WriteErrorFeatureDisabled,
451    WriteErrorInsufficientResources,
452    WriteErrorInvalidMatchField,
453    WriteErrorInvalidStructuredHeader,
454    WriteErrorInvalidTTLField,
455    WriteErrorNavigationRequest,
456    WriteErrorNoMatchField,
457    WriteErrorNonIntegerTTLField,
458    WriteErrorNonListMatchDestField,
459    WriteErrorNonSecureContext,
460    WriteErrorNonStringIdField,
461    WriteErrorNonStringInMatchDestList,
462    WriteErrorNonStringMatchField,
463    WriteErrorNonTokenTypeField,
464    WriteErrorRequestAborted,
465    WriteErrorShuttingDown,
466    WriteErrorTooLongIdField,
467    WriteErrorUnsupportedType,
468}
469
470
471#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
472pub enum SRIMessageSignatureError {
473    #[default]
474    MissingSignatureHeader,
475    MissingSignatureInputHeader,
476    InvalidSignatureHeader,
477    InvalidSignatureInputHeader,
478    SignatureHeaderValueIsNotByteSequence,
479    SignatureHeaderValueIsParameterized,
480    SignatureHeaderValueIsIncorrectLength,
481    SignatureInputHeaderMissingLabel,
482    SignatureInputHeaderValueNotInnerList,
483    SignatureInputHeaderValueMissingComponents,
484    SignatureInputHeaderInvalidComponentType,
485    SignatureInputHeaderInvalidComponentName,
486    SignatureInputHeaderInvalidHeaderComponentParameter,
487    SignatureInputHeaderInvalidDerivedComponentParameter,
488    SignatureInputHeaderKeyIdLength,
489    SignatureInputHeaderInvalidParameter,
490    SignatureInputHeaderMissingRequiredParameters,
491    ValidationFailedSignatureExpired,
492    ValidationFailedInvalidLength,
493    ValidationFailedSignatureMismatch,
494    ValidationFailedIntegrityMismatch,
495}
496
497
498#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
499pub enum UnencodedDigestError {
500    #[default]
501    MalformedDictionary,
502    UnknownAlgorithm,
503    IncorrectDigestType,
504    IncorrectDigestLength,
505}
506
507
508#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
509pub enum ConnectionAllowlistError {
510    #[default]
511    InvalidHeader,
512    MoreThanOneList,
513    ItemNotInnerList,
514    InvalidAllowlistItemType,
515    ReportingEndpointNotToken,
516    InvalidUrlPattern,
517}
518
519/// Details for issues around "Attribution Reporting API" usage.
520/// Explainer: <https://github.com/WICG/attribution-reporting-api>
521
522#[derive(Debug, Clone, Serialize, Deserialize, Default)]
523#[serde(rename_all = "camelCase")]
524pub struct AttributionReportingIssueDetails {
525
526    pub violationType: AttributionReportingIssueType,
527
528    #[serde(skip_serializing_if = "Option::is_none")]
529    pub request: Option<AffectedRequest>,
530
531    #[serde(skip_serializing_if = "Option::is_none")]
532    pub violatingNodeId: Option<crate::dom::BackendNodeId>,
533
534    #[serde(skip_serializing_if = "Option::is_none")]
535    pub invalidParameter: Option<String>,
536}
537
538/// Details for issues about documents in Quirks Mode
539/// or Limited Quirks Mode that affects page layouting.
540
541#[derive(Debug, Clone, Serialize, Deserialize, Default)]
542#[serde(rename_all = "camelCase")]
543pub struct QuirksModeIssueDetails {
544    /// If false, it means the document's mode is "quirks"
545    /// instead of "limited-quirks".
546
547    pub isLimitedQuirksMode: bool,
548
549    pub documentNodeId: crate::dom::BackendNodeId,
550
551    pub url: String,
552
553    pub frameId: crate::page::FrameId,
554
555    pub loaderId: crate::network::LoaderId,
556}
557
558
559#[derive(Debug, Clone, Serialize, Deserialize, Default)]
560#[serde(rename_all = "camelCase")]
561pub struct NavigatorUserAgentIssueDetails {
562
563    pub url: String,
564
565    #[serde(skip_serializing_if = "Option::is_none")]
566    pub location: Option<SourceCodeLocation>,
567}
568
569
570#[derive(Debug, Clone, Serialize, Deserialize, Default)]
571#[serde(rename_all = "camelCase")]
572pub struct SharedDictionaryIssueDetails {
573
574    pub sharedDictionaryError: SharedDictionaryError,
575
576    pub request: AffectedRequest,
577}
578
579
580#[derive(Debug, Clone, Serialize, Deserialize, Default)]
581#[serde(rename_all = "camelCase")]
582pub struct SRIMessageSignatureIssueDetails {
583
584    pub error: SRIMessageSignatureError,
585
586    pub signatureBase: String,
587
588    pub integrityAssertions: Vec<String>,
589
590    pub request: AffectedRequest,
591}
592
593
594#[derive(Debug, Clone, Serialize, Deserialize, Default)]
595#[serde(rename_all = "camelCase")]
596pub struct UnencodedDigestIssueDetails {
597
598    pub error: UnencodedDigestError,
599
600    pub request: AffectedRequest,
601}
602
603
604#[derive(Debug, Clone, Serialize, Deserialize, Default)]
605#[serde(rename_all = "camelCase")]
606pub struct ConnectionAllowlistIssueDetails {
607
608    pub error: ConnectionAllowlistError,
609
610    pub request: AffectedRequest,
611}
612
613
614#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
615pub enum GenericIssueErrorType {
616    #[default]
617    FormLabelForNameError,
618    FormDuplicateIdForInputError,
619    FormInputWithNoLabelError,
620    FormAutocompleteAttributeEmptyError,
621    FormEmptyIdAndNameAttributesForInputError,
622    FormAriaLabelledByToNonExistingIdError,
623    FormInputAssignedAutocompleteValueToIdOrNameAttributeError,
624    FormLabelHasNeitherForNorNestedInputError,
625    FormLabelForMatchesNonExistingIdError,
626    FormInputHasWrongButWellIntendedAutocompleteValueError,
627    ResponseWasBlockedByORB,
628    NavigationEntryMarkedSkippable,
629    AutofillAndManualTextPolicyControlledFeaturesInfo,
630    AutofillPolicyControlledFeatureInfo,
631    ManualTextPolicyControlledFeatureInfo,
632    FormModelContextParameterMissingTitleAndDescription,
633    FormModelContextMissingToolName,
634    FormModelContextMissingToolDescription,
635    FormModelContextRequiredParameterMissingName,
636    FormModelContextParameterMissingName,
637}
638
639/// Depending on the concrete errorType, different properties are set.
640
641#[derive(Debug, Clone, Serialize, Deserialize, Default)]
642#[serde(rename_all = "camelCase")]
643pub struct GenericIssueDetails {
644    /// Issues with the same errorType are aggregated in the frontend.
645
646    pub errorType: GenericIssueErrorType,
647
648    #[serde(skip_serializing_if = "Option::is_none")]
649    pub frameId: Option<crate::page::FrameId>,
650
651    #[serde(skip_serializing_if = "Option::is_none")]
652    pub violatingNodeId: Option<crate::dom::BackendNodeId>,
653
654    #[serde(skip_serializing_if = "Option::is_none")]
655    pub violatingNodeAttribute: Option<String>,
656
657    #[serde(skip_serializing_if = "Option::is_none")]
658    pub request: Option<AffectedRequest>,
659}
660
661/// This issue tracks information needed to print a deprecation message.
662/// <https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/third_party/blink/renderer/core/frame/deprecation/README.md>
663
664#[derive(Debug, Clone, Serialize, Deserialize, Default)]
665#[serde(rename_all = "camelCase")]
666pub struct DeprecationIssueDetails {
667
668    #[serde(skip_serializing_if = "Option::is_none")]
669    pub affectedFrame: Option<AffectedFrame>,
670
671    pub sourceCodeLocation: SourceCodeLocation,
672    /// One of the deprecation names from third_party/blink/renderer/core/frame/deprecation/deprecation.json5
673
674    #[serde(rename = "type")]
675    pub type_: String,
676}
677
678/// This issue warns about sites in the redirect chain of a finished navigation
679/// that may be flagged as trackers and have their state cleared if they don't
680/// receive a user interaction. Note that in this context 'site' means eTLD+1.
681/// For example, if the URL '<https://example.test:80/bounce'> was in the
682/// redirect chain, the site reported would be 'example.test'.
683
684#[derive(Debug, Clone, Serialize, Deserialize, Default)]
685#[serde(rename_all = "camelCase")]
686pub struct BounceTrackingIssueDetails {
687
688    pub trackingSites: Vec<String>,
689}
690
691/// This issue warns about third-party sites that are accessing cookies on the
692/// current page, and have been permitted due to having a global metadata grant.
693/// Note that in this context 'site' means eTLD+1. For example, if the URL
694/// '<https://example.test:80/web_page'> was accessing cookies, the site reported
695/// would be 'example.test'.
696
697#[derive(Debug, Clone, Serialize, Deserialize, Default)]
698#[serde(rename_all = "camelCase")]
699pub struct CookieDeprecationMetadataIssueDetails {
700
701    pub allowedSites: Vec<String>,
702
703    pub optOutPercentage: f64,
704
705    pub isOptOutTopLevel: bool,
706
707    pub operation: CookieOperation,
708}
709
710
711#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
712pub enum ClientHintIssueReason {
713    #[default]
714    MetaTagAllowListInvalidOrigin,
715    MetaTagModifiedHTML,
716}
717
718
719#[derive(Debug, Clone, Serialize, Deserialize, Default)]
720#[serde(rename_all = "camelCase")]
721pub struct FederatedAuthRequestIssueDetails {
722
723    pub federatedAuthRequestIssueReason: FederatedAuthRequestIssueReason,
724}
725
726/// Represents the failure reason when a federated authentication reason fails.
727/// Should be updated alongside RequestIdTokenStatus in
728/// third_party/blink/public/mojom/devtools/inspector_issue.mojom to include
729/// all cases except for success.
730
731#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
732pub enum FederatedAuthRequestIssueReason {
733    #[default]
734    ShouldEmbargo,
735    TooManyRequests,
736    WellKnownHttpNotFound,
737    WellKnownNoResponse,
738    WellKnownInvalidResponse,
739    WellKnownListEmpty,
740    WellKnownInvalidContentType,
741    ConfigNotInWellKnown,
742    WellKnownTooBig,
743    ConfigHttpNotFound,
744    ConfigNoResponse,
745    ConfigInvalidResponse,
746    ConfigInvalidContentType,
747    IdpNotPotentiallyTrustworthy,
748    DisabledInSettings,
749    DisabledInFlags,
750    ErrorFetchingSignin,
751    InvalidSigninResponse,
752    AccountsHttpNotFound,
753    AccountsNoResponse,
754    AccountsInvalidResponse,
755    AccountsListEmpty,
756    AccountsInvalidContentType,
757    IdTokenHttpNotFound,
758    IdTokenNoResponse,
759    IdTokenInvalidResponse,
760    IdTokenIdpErrorResponse,
761    IdTokenCrossSiteIdpErrorResponse,
762    IdTokenInvalidRequest,
763    IdTokenInvalidContentType,
764    ErrorIdToken,
765    Canceled,
766    RpPageNotVisible,
767    SilentMediationFailure,
768    NotSignedInWithIdp,
769    MissingTransientUserActivation,
770    ReplacedByActiveMode,
771    RelyingPartyOriginIsOpaque,
772    TypeNotMatching,
773    UiDismissedNoEmbargo,
774    CorsError,
775    SuppressedBySegmentationPlatform,
776}
777
778
779#[derive(Debug, Clone, Serialize, Deserialize, Default)]
780#[serde(rename_all = "camelCase")]
781pub struct FederatedAuthUserInfoRequestIssueDetails {
782
783    pub federatedAuthUserInfoRequestIssueReason: FederatedAuthUserInfoRequestIssueReason,
784}
785
786/// Represents the failure reason when a getUserInfo() call fails.
787/// Should be updated alongside FederatedAuthUserInfoRequestResult in
788/// third_party/blink/public/mojom/devtools/inspector_issue.mojom.
789
790#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
791pub enum FederatedAuthUserInfoRequestIssueReason {
792    #[default]
793    NotSameOrigin,
794    NotIframe,
795    NotPotentiallyTrustworthy,
796    NoApiPermission,
797    NotSignedInWithIdp,
798    NoAccountSharingPermission,
799    InvalidConfigOrWellKnown,
800    InvalidAccountsResponse,
801    NoReturningUserFromFetchedAccounts,
802}
803
804/// This issue tracks client hints related issues. It's used to deprecate old
805/// features, encourage the use of new ones, and provide general guidance.
806
807#[derive(Debug, Clone, Serialize, Deserialize, Default)]
808#[serde(rename_all = "camelCase")]
809pub struct ClientHintIssueDetails {
810
811    pub sourceCodeLocation: SourceCodeLocation,
812
813    pub clientHintIssueReason: ClientHintIssueReason,
814}
815
816
817#[derive(Debug, Clone, Serialize, Deserialize, Default)]
818#[serde(rename_all = "camelCase")]
819pub struct FailedRequestInfo {
820    /// The URL that failed to load.
821
822    pub url: String,
823    /// The failure message for the failed request.
824
825    pub failureMessage: String,
826
827    #[serde(skip_serializing_if = "Option::is_none")]
828    pub requestId: Option<crate::network::RequestId>,
829}
830
831
832#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
833pub enum PartitioningBlobURLInfo {
834    #[default]
835    BlockedCrossPartitionFetching,
836    EnforceNoopenerForNavigation,
837}
838
839
840#[derive(Debug, Clone, Serialize, Deserialize, Default)]
841#[serde(rename_all = "camelCase")]
842pub struct PartitioningBlobURLIssueDetails {
843    /// The BlobURL that failed to load.
844
845    pub url: String,
846    /// Additional information about the Partitioning Blob URL issue.
847
848    pub partitioningBlobURLInfo: PartitioningBlobURLInfo,
849}
850
851
852#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
853pub enum ElementAccessibilityIssueReason {
854    #[default]
855    DisallowedSelectChild,
856    DisallowedOptGroupChild,
857    NonPhrasingContentOptionChild,
858    InteractiveContentOptionChild,
859    InteractiveContentLegendChild,
860    InteractiveContentSummaryDescendant,
861}
862
863/// This issue warns about errors in the select or summary element content model.
864
865#[derive(Debug, Clone, Serialize, Deserialize, Default)]
866#[serde(rename_all = "camelCase")]
867pub struct ElementAccessibilityIssueDetails {
868
869    pub nodeId: crate::dom::BackendNodeId,
870
871    pub elementAccessibilityIssueReason: ElementAccessibilityIssueReason,
872
873    pub hasDisallowedAttributes: bool,
874}
875
876
877#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
878pub enum StyleSheetLoadingIssueReason {
879    #[default]
880    LateImportRule,
881    RequestFailed,
882}
883
884/// This issue warns when a referenced stylesheet couldn't be loaded.
885
886#[derive(Debug, Clone, Serialize, Deserialize, Default)]
887#[serde(rename_all = "camelCase")]
888pub struct StylesheetLoadingIssueDetails {
889    /// Source code position that referenced the failing stylesheet.
890
891    pub sourceCodeLocation: SourceCodeLocation,
892    /// Reason why the stylesheet couldn't be loaded.
893
894    pub styleSheetLoadingIssueReason: StyleSheetLoadingIssueReason,
895    /// Contains additional info when the failure was due to a request.
896
897    #[serde(skip_serializing_if = "Option::is_none")]
898    pub failedRequestInfo: Option<FailedRequestInfo>,
899}
900
901
902#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
903pub enum PropertyRuleIssueReason {
904    #[default]
905    InvalidSyntax,
906    InvalidInitialValue,
907    InvalidInherits,
908    InvalidName,
909}
910
911/// This issue warns about errors in property rules that lead to property
912/// registrations being ignored.
913
914#[derive(Debug, Clone, Serialize, Deserialize, Default)]
915#[serde(rename_all = "camelCase")]
916pub struct PropertyRuleIssueDetails {
917    /// Source code position of the property rule.
918
919    pub sourceCodeLocation: SourceCodeLocation,
920    /// Reason why the property rule was discarded.
921
922    pub propertyRuleIssueReason: PropertyRuleIssueReason,
923    /// The value of the property rule property that failed to parse
924
925    #[serde(skip_serializing_if = "Option::is_none")]
926    pub propertyValue: Option<String>,
927}
928
929
930#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
931pub enum UserReidentificationIssueType {
932    #[default]
933    BlockedFrameNavigation,
934    BlockedSubresource,
935    NoisedCanvasReadback,
936}
937
938/// This issue warns about uses of APIs that may be considered misuse to
939/// re-identify users.
940
941#[derive(Debug, Clone, Serialize, Deserialize, Default)]
942#[serde(rename_all = "camelCase")]
943pub struct UserReidentificationIssueDetails {
944
945    #[serde(rename = "type")]
946    pub type_: UserReidentificationIssueType,
947    /// Applies to BlockedFrameNavigation and BlockedSubresource issue types.
948
949    #[serde(skip_serializing_if = "Option::is_none")]
950    pub request: Option<AffectedRequest>,
951    /// Applies to NoisedCanvasReadback issue type.
952
953    #[serde(skip_serializing_if = "Option::is_none")]
954    pub sourceCodeLocation: Option<SourceCodeLocation>,
955}
956
957
958#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
959pub enum PermissionElementIssueType {
960    #[default]
961    InvalidType,
962    FencedFrameDisallowed,
963    CspFrameAncestorsMissing,
964    PermissionsPolicyBlocked,
965    PaddingRightUnsupported,
966    PaddingBottomUnsupported,
967    InsetBoxShadowUnsupported,
968    RequestInProgress,
969    UntrustedEvent,
970    RegistrationFailed,
971    TypeNotSupported,
972    InvalidTypeActivation,
973    SecurityChecksFailed,
974    ActivationDisabled,
975    GeolocationDeprecated,
976    InvalidDisplayStyle,
977    NonOpaqueColor,
978    LowContrast,
979    FontSizeTooSmall,
980    FontSizeTooLarge,
981    InvalidSizeValue,
982}
983
984/// This issue warns about improper usage of the \<permission\> element.
985
986#[derive(Debug, Clone, Serialize, Deserialize, Default)]
987#[serde(rename_all = "camelCase")]
988pub struct PermissionElementIssueDetails {
989
990    pub issueType: PermissionElementIssueType,
991    /// The value of the type attribute.
992
993    #[serde(skip_serializing_if = "Option::is_none")]
994    #[serde(rename = "type")]
995    pub type_: Option<String>,
996    /// The node ID of the \<permission\> element.
997
998    #[serde(skip_serializing_if = "Option::is_none")]
999    pub nodeId: Option<crate::dom::BackendNodeId>,
1000    /// True if the issue is a warning, false if it is an error.
1001
1002    #[serde(skip_serializing_if = "Option::is_none")]
1003    pub isWarning: Option<bool>,
1004    /// Fields for message construction:
1005    /// Used for messages that reference a specific permission name
1006
1007    #[serde(skip_serializing_if = "Option::is_none")]
1008    pub permissionName: Option<String>,
1009    /// Used for messages about occlusion
1010
1011    #[serde(skip_serializing_if = "Option::is_none")]
1012    pub occluderNodeInfo: Option<String>,
1013    /// Used for messages about occluder's parent
1014
1015    #[serde(skip_serializing_if = "Option::is_none")]
1016    pub occluderParentNodeInfo: Option<String>,
1017    /// Used for messages about activation disabled reason
1018
1019    #[serde(skip_serializing_if = "Option::is_none")]
1020    pub disableReason: Option<String>,
1021}
1022
1023/// The issue warns about blocked calls to privacy sensitive APIs via the
1024/// Selective Permissions Intervention.
1025
1026#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1027#[serde(rename_all = "camelCase")]
1028pub struct SelectivePermissionsInterventionIssueDetails {
1029    /// Which API was intervened on.
1030
1031    pub apiName: String,
1032    /// Why the ad script using the API is considered an ad.
1033
1034    pub adAncestry: crate::network::AdAncestry,
1035    /// The stack trace at the time of the intervention.
1036
1037    #[serde(skip_serializing_if = "Option::is_none")]
1038    pub stackTrace: Option<crate::runtime::StackTrace>,
1039}
1040
1041/// A unique identifier for the type of issue. Each type may use one of the
1042/// optional fields in InspectorIssueDetails to convey more specific
1043/// information about the kind of issue.
1044
1045#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1046pub enum InspectorIssueCode {
1047    #[default]
1048    CookieIssue,
1049    MixedContentIssue,
1050    BlockedByResponseIssue,
1051    HeavyAdIssue,
1052    ContentSecurityPolicyIssue,
1053    SharedArrayBufferIssue,
1054    CorsIssue,
1055    AttributionReportingIssue,
1056    QuirksModeIssue,
1057    PartitioningBlobURLIssue,
1058    NavigatorUserAgentIssue,
1059    GenericIssue,
1060    DeprecationIssue,
1061    ClientHintIssue,
1062    FederatedAuthRequestIssue,
1063    BounceTrackingIssue,
1064    CookieDeprecationMetadataIssue,
1065    StylesheetLoadingIssue,
1066    FederatedAuthUserInfoRequestIssue,
1067    PropertyRuleIssue,
1068    SharedDictionaryIssue,
1069    ElementAccessibilityIssue,
1070    SRIMessageSignatureIssue,
1071    UnencodedDigestIssue,
1072    ConnectionAllowlistIssue,
1073    UserReidentificationIssue,
1074    PermissionElementIssue,
1075    PerformanceIssue,
1076    SelectivePermissionsInterventionIssue,
1077}
1078
1079/// This struct holds a list of optional fields with additional information
1080/// specific to the kind of issue. When adding a new issue code, please also
1081/// add a new optional field to this type.
1082
1083#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1084#[serde(rename_all = "camelCase")]
1085pub struct InspectorIssueDetails {
1086
1087    #[serde(skip_serializing_if = "Option::is_none")]
1088    pub cookieIssueDetails: Option<CookieIssueDetails>,
1089
1090    #[serde(skip_serializing_if = "Option::is_none")]
1091    pub mixedContentIssueDetails: Option<MixedContentIssueDetails>,
1092
1093    #[serde(skip_serializing_if = "Option::is_none")]
1094    pub blockedByResponseIssueDetails: Option<BlockedByResponseIssueDetails>,
1095
1096    #[serde(skip_serializing_if = "Option::is_none")]
1097    pub heavyAdIssueDetails: Option<HeavyAdIssueDetails>,
1098
1099    #[serde(skip_serializing_if = "Option::is_none")]
1100    pub contentSecurityPolicyIssueDetails: Option<ContentSecurityPolicyIssueDetails>,
1101
1102    #[serde(skip_serializing_if = "Option::is_none")]
1103    pub sharedArrayBufferIssueDetails: Option<SharedArrayBufferIssueDetails>,
1104
1105    #[serde(skip_serializing_if = "Option::is_none")]
1106    pub corsIssueDetails: Option<CorsIssueDetails>,
1107
1108    #[serde(skip_serializing_if = "Option::is_none")]
1109    pub attributionReportingIssueDetails: Option<AttributionReportingIssueDetails>,
1110
1111    #[serde(skip_serializing_if = "Option::is_none")]
1112    pub quirksModeIssueDetails: Option<QuirksModeIssueDetails>,
1113
1114    #[serde(skip_serializing_if = "Option::is_none")]
1115    pub partitioningBlobURLIssueDetails: Option<PartitioningBlobURLIssueDetails>,
1116
1117    #[serde(skip_serializing_if = "Option::is_none")]
1118    pub navigatorUserAgentIssueDetails: Option<NavigatorUserAgentIssueDetails>,
1119
1120    #[serde(skip_serializing_if = "Option::is_none")]
1121    pub genericIssueDetails: Option<GenericIssueDetails>,
1122
1123    #[serde(skip_serializing_if = "Option::is_none")]
1124    pub deprecationIssueDetails: Option<DeprecationIssueDetails>,
1125
1126    #[serde(skip_serializing_if = "Option::is_none")]
1127    pub clientHintIssueDetails: Option<ClientHintIssueDetails>,
1128
1129    #[serde(skip_serializing_if = "Option::is_none")]
1130    pub federatedAuthRequestIssueDetails: Option<FederatedAuthRequestIssueDetails>,
1131
1132    #[serde(skip_serializing_if = "Option::is_none")]
1133    pub bounceTrackingIssueDetails: Option<BounceTrackingIssueDetails>,
1134
1135    #[serde(skip_serializing_if = "Option::is_none")]
1136    pub cookieDeprecationMetadataIssueDetails: Option<CookieDeprecationMetadataIssueDetails>,
1137
1138    #[serde(skip_serializing_if = "Option::is_none")]
1139    pub stylesheetLoadingIssueDetails: Option<StylesheetLoadingIssueDetails>,
1140
1141    #[serde(skip_serializing_if = "Option::is_none")]
1142    pub propertyRuleIssueDetails: Option<PropertyRuleIssueDetails>,
1143
1144    #[serde(skip_serializing_if = "Option::is_none")]
1145    pub federatedAuthUserInfoRequestIssueDetails: Option<FederatedAuthUserInfoRequestIssueDetails>,
1146
1147    #[serde(skip_serializing_if = "Option::is_none")]
1148    pub sharedDictionaryIssueDetails: Option<SharedDictionaryIssueDetails>,
1149
1150    #[serde(skip_serializing_if = "Option::is_none")]
1151    pub elementAccessibilityIssueDetails: Option<ElementAccessibilityIssueDetails>,
1152
1153    #[serde(skip_serializing_if = "Option::is_none")]
1154    pub sriMessageSignatureIssueDetails: Option<SRIMessageSignatureIssueDetails>,
1155
1156    #[serde(skip_serializing_if = "Option::is_none")]
1157    pub unencodedDigestIssueDetails: Option<UnencodedDigestIssueDetails>,
1158
1159    #[serde(skip_serializing_if = "Option::is_none")]
1160    pub connectionAllowlistIssueDetails: Option<ConnectionAllowlistIssueDetails>,
1161
1162    #[serde(skip_serializing_if = "Option::is_none")]
1163    pub userReidentificationIssueDetails: Option<UserReidentificationIssueDetails>,
1164
1165    #[serde(skip_serializing_if = "Option::is_none")]
1166    pub permissionElementIssueDetails: Option<PermissionElementIssueDetails>,
1167
1168    #[serde(skip_serializing_if = "Option::is_none")]
1169    pub performanceIssueDetails: Option<PerformanceIssueDetails>,
1170
1171    #[serde(skip_serializing_if = "Option::is_none")]
1172    pub selectivePermissionsInterventionIssueDetails: Option<SelectivePermissionsInterventionIssueDetails>,
1173}
1174
1175/// A unique id for a DevTools inspector issue. Allows other entities (e.g.
1176/// exceptions, CDP message, console messages, etc.) to reference an issue.
1177
1178pub type IssueId = String;
1179
1180/// An inspector issue reported from the back-end.
1181
1182#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1183#[serde(rename_all = "camelCase")]
1184pub struct InspectorIssue {
1185
1186    pub code: InspectorIssueCode,
1187
1188    pub details: InspectorIssueDetails,
1189    /// A unique id for this issue. May be omitted if no other entity (e.g.
1190    /// exception, CDP message, etc.) is referencing this issue.
1191
1192    #[serde(skip_serializing_if = "Option::is_none")]
1193    pub issueId: Option<IssueId>,
1194}
1195
1196/// Returns the response body and size if it were re-encoded with the specified settings. Only
1197/// applies to images.
1198
1199#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1200#[serde(rename_all = "camelCase")]
1201pub struct GetEncodedResponseParams {
1202    /// Identifier of the network request to get content for.
1203
1204    pub requestId: crate::network::RequestId,
1205    /// The encoding to use.
1206
1207    pub encoding: String,
1208    /// The quality of the encoding (0-1). (defaults to 1)
1209
1210    #[serde(skip_serializing_if = "Option::is_none")]
1211    pub quality: Option<f64>,
1212    /// Whether to only return the size information (defaults to false).
1213
1214    #[serde(skip_serializing_if = "Option::is_none")]
1215    pub sizeOnly: Option<bool>,
1216}
1217
1218/// Returns the response body and size if it were re-encoded with the specified settings. Only
1219/// applies to images.
1220
1221#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1222#[serde(rename_all = "camelCase")]
1223pub struct GetEncodedResponseReturns {
1224    /// The encoded body as a base64 string. Omitted if sizeOnly is true. (Encoded as a base64 string when passed over JSON)
1225
1226    #[serde(skip_serializing_if = "Option::is_none")]
1227    pub body: Option<String>,
1228    /// Size before re-encoding.
1229
1230    pub originalSize: u64,
1231    /// Size after re-encoding.
1232
1233    pub encodedSize: u64,
1234}
1235
1236/// Runs the form issues check for the target page. Found issues are reported
1237/// using Audits.issueAdded event.
1238
1239#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1240#[serde(rename_all = "camelCase")]
1241pub struct CheckFormsIssuesReturns {
1242
1243    pub formIssues: Vec<GenericIssueDetails>,
1244}