Skip to main content

browser_protocol/network/
mod.rs

1//! Network domain allows tracking network activities of the page. It exposes information about http,
2//! file, data and other requests and responses, their headers, bodies, timing, etc.
3
4use serde::{Serialize, Deserialize};
5use serde_json::Value as JsonValue;
6
7/// Resource type as it was perceived by the rendering engine.
8
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
10pub enum ResourceType {
11    #[default]
12    Document,
13    Stylesheet,
14    Image,
15    Media,
16    Font,
17    Script,
18    TextTrack,
19    XHR,
20    Fetch,
21    Prefetch,
22    EventSource,
23    WebSocket,
24    Manifest,
25    SignedExchange,
26    Ping,
27    CSPViolationReport,
28    Preflight,
29    FedCM,
30    Other,
31}
32
33/// Unique loader identifier.
34
35pub type LoaderId = String;
36
37/// Unique network request identifier.
38/// Note that this does not identify individual HTTP requests that are part of
39/// a network request.
40
41pub type RequestId = String;
42
43/// Unique intercepted request identifier.
44
45pub type InterceptionId = String;
46
47/// Network level fetch failure reason.
48
49#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
50pub enum ErrorReason {
51    #[default]
52    Failed,
53    Aborted,
54    TimedOut,
55    AccessDenied,
56    ConnectionClosed,
57    ConnectionReset,
58    ConnectionRefused,
59    ConnectionAborted,
60    ConnectionFailed,
61    NameNotResolved,
62    InternetDisconnected,
63    AddressUnreachable,
64    BlockedByClient,
65    BlockedByResponse,
66}
67
68/// UTC time in seconds, counted from January 1, 1970.
69
70pub type TimeSinceEpoch = f64;
71
72/// Monotonically increasing time in seconds since an arbitrary point in the past.
73
74pub type MonotonicTime = f64;
75
76/// Request / response headers as keys / values of JSON object.
77
78pub type Headers = serde_json::Map<String, JsonValue>;
79
80/// The underlying connection technology that the browser is supposedly using.
81
82#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
83pub enum ConnectionType {
84    #[default]
85    None,
86    Cellular2g,
87    Cellular3g,
88    Cellular4g,
89    Bluetooth,
90    Ethernet,
91    Wifi,
92    Wimax,
93    Other,
94}
95
96/// Represents the cookie's 'SameSite' status:
97/// <https://tools.ietf.org/html/draft-west-first-party-cookies>
98
99#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
100pub enum CookieSameSite {
101    #[default]
102    Strict,
103    Lax,
104    None,
105}
106
107/// Represents the cookie's 'Priority' status:
108/// <https://tools.ietf.org/html/draft-west-cookie-priority-00>
109
110#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
111pub enum CookiePriority {
112    #[default]
113    Low,
114    Medium,
115    High,
116}
117
118/// Represents the source scheme of the origin that originally set the cookie.
119/// A value of "Unset" allows protocol clients to emulate legacy cookie scope for the scheme.
120/// This is a temporary ability and it will be removed in the future.
121
122#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
123pub enum CookieSourceScheme {
124    #[default]
125    Unset,
126    NonSecure,
127    Secure,
128}
129
130/// Timing information for the request.
131
132#[derive(Debug, Clone, Serialize, Deserialize, Default)]
133#[serde(rename_all = "camelCase")]
134pub struct ResourceTiming {
135    /// Timing's requestTime is a baseline in seconds, while the other numbers are ticks in
136    /// milliseconds relatively to this requestTime.
137
138    pub requestTime: f64,
139    /// Started resolving proxy.
140
141    pub proxyStart: f64,
142    /// Finished resolving proxy.
143
144    pub proxyEnd: f64,
145    /// Started DNS address resolve.
146
147    pub dnsStart: f64,
148    /// Finished DNS address resolve.
149
150    pub dnsEnd: f64,
151    /// Started connecting to the remote host.
152
153    pub connectStart: f64,
154    /// Connected to the remote host.
155
156    pub connectEnd: f64,
157    /// Started SSL handshake.
158
159    pub sslStart: f64,
160    /// Finished SSL handshake.
161
162    pub sslEnd: f64,
163    /// Started running ServiceWorker.
164
165    pub workerStart: f64,
166    /// Finished Starting ServiceWorker.
167
168    pub workerReady: f64,
169    /// Started fetch event.
170
171    pub workerFetchStart: f64,
172    /// Settled fetch event respondWith promise.
173
174    pub workerRespondWithSettled: f64,
175    /// Started ServiceWorker static routing source evaluation.
176
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub workerRouterEvaluationStart: Option<f64>,
179    /// Started cache lookup when the source was evaluated to 'cache'.
180
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub workerCacheLookupStart: Option<f64>,
183    /// Started sending request.
184
185    pub sendStart: f64,
186    /// Finished sending request.
187
188    pub sendEnd: f64,
189    /// Time the server started pushing request.
190
191    pub pushStart: f64,
192    /// Time the server finished pushing request.
193
194    pub pushEnd: f64,
195    /// Started receiving response headers.
196
197    pub receiveHeadersStart: f64,
198    /// Finished receiving response headers.
199
200    pub receiveHeadersEnd: f64,
201}
202
203/// Loading priority of a resource request.
204
205#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
206pub enum ResourcePriority {
207    #[default]
208    VeryLow,
209    Low,
210    Medium,
211    High,
212    VeryHigh,
213}
214
215/// The render-blocking behavior of a resource request.
216
217#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
218pub enum RenderBlockingBehavior {
219    #[default]
220    Blocking,
221    InBodyParserBlocking,
222    NonBlocking,
223    NonBlockingDynamic,
224    PotentiallyBlocking,
225}
226
227/// Post data entry for HTTP request
228
229#[derive(Debug, Clone, Serialize, Deserialize, Default)]
230#[serde(rename_all = "camelCase")]
231pub struct PostDataEntry {
232
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub bytes: Option<String>,
235}
236
237/// HTTP request data.
238
239#[derive(Debug, Clone, Serialize, Deserialize, Default)]
240#[serde(rename_all = "camelCase")]
241pub struct Request {
242    /// Request URL (without fragment).
243
244    pub url: String,
245    /// Fragment of the requested URL starting with hash, if present.
246
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub urlFragment: Option<String>,
249    /// HTTP request method.
250
251    pub method: String,
252    /// HTTP request headers.
253
254    pub headers: Headers,
255    /// HTTP POST request data.
256    /// Use postDataEntries instead.
257
258    #[serde(skip_serializing_if = "Option::is_none")]
259    pub postData: Option<String>,
260    /// True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.
261
262    #[serde(skip_serializing_if = "Option::is_none")]
263    pub hasPostData: Option<bool>,
264    /// Request body elements (post data broken into individual entries).
265
266    #[serde(skip_serializing_if = "Option::is_none")]
267    pub postDataEntries: Option<Vec<PostDataEntry>>,
268    /// The mixed content type of the request.
269
270    #[serde(skip_serializing_if = "Option::is_none")]
271    pub mixedContentType: Option<crate::security::MixedContentType>,
272    /// Priority of the resource request at the time request is sent.
273
274    pub initialPriority: ResourcePriority,
275    /// The referrer policy of the request, as defined in <https://www.w3.org/TR/referrer-policy/>
276
277    pub referrerPolicy: String,
278    /// Whether is loaded via link preload.
279
280    #[serde(skip_serializing_if = "Option::is_none")]
281    pub isLinkPreload: Option<bool>,
282    /// Set for requests when the TrustToken API is used. Contains the parameters
283    /// passed by the developer (e.g. via "fetch") as understood by the backend.
284
285    #[serde(skip_serializing_if = "Option::is_none")]
286    pub trustTokenParams: Option<TrustTokenParams>,
287    /// True if this resource request is considered to be the 'same site' as the
288    /// request corresponding to the main frame.
289
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub isSameSite: Option<bool>,
292    /// True when the resource request is ad-related.
293
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub isAdRelated: Option<bool>,
296}
297
298/// Details of a signed certificate timestamp (SCT).
299
300#[derive(Debug, Clone, Serialize, Deserialize, Default)]
301#[serde(rename_all = "camelCase")]
302pub struct SignedCertificateTimestamp {
303    /// Validation status.
304
305    pub status: String,
306    /// Origin.
307
308    pub origin: String,
309    /// Log name / description.
310
311    pub logDescription: String,
312    /// Log ID.
313
314    pub logId: String,
315    /// Issuance date. Unlike TimeSinceEpoch, this contains the number of
316    /// milliseconds since January 1, 1970, UTC, not the number of seconds.
317
318    pub timestamp: f64,
319    /// Hash algorithm.
320
321    pub hashAlgorithm: String,
322    /// Signature algorithm.
323
324    pub signatureAlgorithm: String,
325    /// Signature data.
326
327    pub signatureData: String,
328}
329
330/// Security details about a request.
331
332#[derive(Debug, Clone, Serialize, Deserialize, Default)]
333#[serde(rename_all = "camelCase")]
334pub struct SecurityDetails {
335    /// Protocol name (e.g. "TLS 1.2" or "QUIC").
336
337    pub protocol: String,
338    /// Key Exchange used by the connection, or the empty string if not applicable.
339
340    pub keyExchange: String,
341    /// (EC)DH group used by the connection, if applicable.
342
343    #[serde(skip_serializing_if = "Option::is_none")]
344    pub keyExchangeGroup: Option<String>,
345    /// Cipher name.
346
347    pub cipher: String,
348    /// TLS MAC. Note that AEAD ciphers do not have separate MACs.
349
350    #[serde(skip_serializing_if = "Option::is_none")]
351    pub mac: Option<String>,
352    /// Certificate ID value.
353
354    pub certificateId: crate::security::CertificateId,
355    /// Certificate subject name.
356
357    pub subjectName: String,
358    /// Subject Alternative Name (SAN) DNS names and IP addresses.
359
360    pub sanList: Vec<String>,
361    /// Name of the issuing CA.
362
363    pub issuer: String,
364    /// Certificate valid from date.
365
366    pub validFrom: TimeSinceEpoch,
367    /// Certificate valid to (expiration) date
368
369    pub validTo: TimeSinceEpoch,
370    /// List of signed certificate timestamps (SCTs).
371
372    pub signedCertificateTimestampList: Vec<SignedCertificateTimestamp>,
373    /// Whether the request complied with Certificate Transparency policy
374
375    pub certificateTransparencyCompliance: CertificateTransparencyCompliance,
376    /// The signature algorithm used by the server in the TLS server signature,
377    /// represented as a TLS SignatureScheme code point. Omitted if not
378    /// applicable or not known.
379
380    #[serde(skip_serializing_if = "Option::is_none")]
381    pub serverSignatureAlgorithm: Option<i64>,
382    /// Whether the connection used Encrypted ClientHello
383
384    pub encryptedClientHello: bool,
385}
386
387/// Whether the request complied with Certificate Transparency policy.
388
389#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
390pub enum CertificateTransparencyCompliance {
391    #[default]
392    Unknown,
393    NotCompliant,
394    Compliant,
395}
396
397/// The reason why request was blocked.
398
399#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
400pub enum BlockedReason {
401    #[default]
402    Other,
403    Csp,
404    MixedContent,
405    Origin,
406    Inspector,
407    Integrity,
408    SubresourceFilter,
409    ContentType,
410    CoepFrameResourceNeedsCoepHeader,
411    CoopSandboxedIframeCannotNavigateToCoopPage,
412    CorpNotSameOrigin,
413    CorpNotSameOriginAfterDefaultedToSameOriginByCoep,
414    CorpNotSameOriginAfterDefaultedToSameOriginByDip,
415    CorpNotSameOriginAfterDefaultedToSameOriginByCoepAndDip,
416    CorpNotSameSite,
417    SriMessageSignatureMismatch,
418}
419
420/// The reason why request was blocked.
421
422#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
423pub enum CorsError {
424    #[default]
425    DisallowedByMode,
426    InvalidResponse,
427    WildcardOriginNotAllowed,
428    MissingAllowOriginHeader,
429    MultipleAllowOriginValues,
430    InvalidAllowOriginValue,
431    AllowOriginMismatch,
432    InvalidAllowCredentials,
433    CorsDisabledScheme,
434    PreflightInvalidStatus,
435    PreflightDisallowedRedirect,
436    PreflightWildcardOriginNotAllowed,
437    PreflightMissingAllowOriginHeader,
438    PreflightMultipleAllowOriginValues,
439    PreflightInvalidAllowOriginValue,
440    PreflightAllowOriginMismatch,
441    PreflightInvalidAllowCredentials,
442    PreflightMissingAllowExternal,
443    PreflightInvalidAllowExternal,
444    InvalidAllowMethodsPreflightResponse,
445    InvalidAllowHeadersPreflightResponse,
446    MethodDisallowedByPreflightResponse,
447    HeaderDisallowedByPreflightResponse,
448    RedirectContainsCredentials,
449    InsecureLocalNetwork,
450    InvalidLocalNetworkAccess,
451    NoCorsRedirectModeNotFollow,
452    LocalNetworkAccessPermissionDenied,
453}
454
455
456#[derive(Debug, Clone, Serialize, Deserialize, Default)]
457#[serde(rename_all = "camelCase")]
458pub struct CorsErrorStatus {
459
460    pub corsError: CorsError,
461
462    pub failedParameter: String,
463}
464
465/// Source of serviceworker response.
466
467#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
468pub enum ServiceWorkerResponseSource {
469    #[default]
470    CacheStorage,
471    HttpCache,
472    FallbackCode,
473    Network,
474}
475
476/// Determines what type of Trust Token operation is executed and
477/// depending on the type, some additional parameters. The values
478/// are specified in third_party/blink/renderer/core/fetch/trust_token.idl.
479
480#[derive(Debug, Clone, Serialize, Deserialize, Default)]
481#[serde(rename_all = "camelCase")]
482pub struct TrustTokenParams {
483
484    pub operation: TrustTokenOperationType,
485    /// Only set for "token-redemption" operation and determine whether
486    /// to request a fresh SRR or use a still valid cached SRR.
487
488    pub refreshPolicy: String,
489    /// Origins of issuers from whom to request tokens or redemption
490    /// records.
491
492    #[serde(skip_serializing_if = "Option::is_none")]
493    pub issuers: Option<Vec<String>>,
494}
495
496
497#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
498pub enum TrustTokenOperationType {
499    #[default]
500    Issuance,
501    Redemption,
502    Signing,
503}
504
505/// The reason why Chrome uses a specific transport protocol for HTTP semantics.
506
507#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
508pub enum AlternateProtocolUsage {
509    #[default]
510    AlternativeJobWonWithoutRace,
511    AlternativeJobWonRace,
512    MainJobWonRace,
513    MappingMissing,
514    Broken,
515    DnsAlpnH3JobWonWithoutRace,
516    DnsAlpnH3JobWonRace,
517    UnspecifiedReason,
518}
519
520/// Source of service worker router.
521
522#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
523pub enum ServiceWorkerRouterSource {
524    #[default]
525    Network,
526    Cache,
527    FetchEvent,
528    RaceNetworkAndFetchHandler,
529    RaceNetworkAndCache,
530}
531
532
533#[derive(Debug, Clone, Serialize, Deserialize, Default)]
534#[serde(rename_all = "camelCase")]
535pub struct ServiceWorkerRouterInfo {
536    /// ID of the rule matched. If there is a matched rule, this field will
537    /// be set, otherwiser no value will be set.
538
539    #[serde(skip_serializing_if = "Option::is_none")]
540    pub ruleIdMatched: Option<u64>,
541    /// The router source of the matched rule. If there is a matched rule, this
542    /// field will be set, otherwise no value will be set.
543
544    #[serde(skip_serializing_if = "Option::is_none")]
545    pub matchedSourceType: Option<ServiceWorkerRouterSource>,
546    /// The actual router source used.
547
548    #[serde(skip_serializing_if = "Option::is_none")]
549    pub actualSourceType: Option<ServiceWorkerRouterSource>,
550}
551
552/// HTTP response data.
553
554#[derive(Debug, Clone, Serialize, Deserialize, Default)]
555#[serde(rename_all = "camelCase")]
556pub struct Response {
557    /// Response URL. This URL can be different from CachedResource.url in case of redirect.
558
559    pub url: String,
560    /// HTTP response status code.
561
562    pub status: i64,
563    /// HTTP response status text.
564
565    pub statusText: String,
566    /// HTTP response headers.
567
568    pub headers: Headers,
569    /// HTTP response headers text. This has been replaced by the headers in Network.responseReceivedExtraInfo.
570
571    #[serde(skip_serializing_if = "Option::is_none")]
572    pub headersText: Option<String>,
573    /// Resource mimeType as determined by the browser.
574
575    pub mimeType: String,
576    /// Resource charset as determined by the browser (if applicable).
577
578    pub charset: String,
579    /// Refined HTTP request headers that were actually transmitted over the network.
580
581    #[serde(skip_serializing_if = "Option::is_none")]
582    pub requestHeaders: Option<Headers>,
583    /// HTTP request headers text. This has been replaced by the headers in Network.requestWillBeSentExtraInfo.
584
585    #[serde(skip_serializing_if = "Option::is_none")]
586    pub requestHeadersText: Option<String>,
587    /// Specifies whether physical connection was actually reused for this request.
588
589    pub connectionReused: bool,
590    /// Physical connection id that was actually used for this request.
591
592    pub connectionId: f64,
593    /// Remote IP address.
594
595    #[serde(skip_serializing_if = "Option::is_none")]
596    pub remoteIPAddress: Option<String>,
597    /// Remote port.
598
599    #[serde(skip_serializing_if = "Option::is_none")]
600    pub remotePort: Option<i64>,
601    /// Specifies that the request was served from the disk cache.
602
603    #[serde(skip_serializing_if = "Option::is_none")]
604    pub fromDiskCache: Option<bool>,
605    /// Specifies that the request was served from the ServiceWorker.
606
607    #[serde(skip_serializing_if = "Option::is_none")]
608    pub fromServiceWorker: Option<bool>,
609    /// Specifies that the request was served from the prefetch cache.
610
611    #[serde(skip_serializing_if = "Option::is_none")]
612    pub fromPrefetchCache: Option<bool>,
613    /// Specifies that the request was served from the prefetch cache.
614
615    #[serde(skip_serializing_if = "Option::is_none")]
616    pub fromEarlyHints: Option<bool>,
617    /// Information about how ServiceWorker Static Router API was used. If this
618    /// field is set with 'matchedSourceType' field, a matching rule is found.
619    /// If this field is set without 'matchedSource', no matching rule is found.
620    /// Otherwise, the API is not used.
621
622    #[serde(skip_serializing_if = "Option::is_none")]
623    pub serviceWorkerRouterInfo: Option<ServiceWorkerRouterInfo>,
624    /// Total number of bytes received for this request so far.
625
626    pub encodedDataLength: f64,
627    /// Timing information for the given request.
628
629    #[serde(skip_serializing_if = "Option::is_none")]
630    pub timing: Option<ResourceTiming>,
631    /// Response source of response from ServiceWorker.
632
633    #[serde(skip_serializing_if = "Option::is_none")]
634    pub serviceWorkerResponseSource: Option<ServiceWorkerResponseSource>,
635    /// The time at which the returned response was generated.
636
637    #[serde(skip_serializing_if = "Option::is_none")]
638    pub responseTime: Option<TimeSinceEpoch>,
639    /// Cache Storage Cache Name.
640
641    #[serde(skip_serializing_if = "Option::is_none")]
642    pub cacheStorageCacheName: Option<String>,
643    /// Protocol used to fetch this request.
644
645    #[serde(skip_serializing_if = "Option::is_none")]
646    pub protocol: Option<String>,
647    /// The reason why Chrome uses a specific transport protocol for HTTP semantics.
648
649    #[serde(skip_serializing_if = "Option::is_none")]
650    pub alternateProtocolUsage: Option<AlternateProtocolUsage>,
651    /// Security state of the request resource.
652
653    pub securityState: crate::security::SecurityState,
654    /// Security details for the request.
655
656    #[serde(skip_serializing_if = "Option::is_none")]
657    pub securityDetails: Option<SecurityDetails>,
658}
659
660/// WebSocket request data.
661
662#[derive(Debug, Clone, Serialize, Deserialize, Default)]
663#[serde(rename_all = "camelCase")]
664pub struct WebSocketRequest {
665    /// HTTP request headers.
666
667    pub headers: Headers,
668}
669
670/// WebSocket response data.
671
672#[derive(Debug, Clone, Serialize, Deserialize, Default)]
673#[serde(rename_all = "camelCase")]
674pub struct WebSocketResponse {
675    /// HTTP response status code.
676
677    pub status: i64,
678    /// HTTP response status text.
679
680    pub statusText: String,
681    /// HTTP response headers.
682
683    pub headers: Headers,
684    /// HTTP response headers text.
685
686    #[serde(skip_serializing_if = "Option::is_none")]
687    pub headersText: Option<String>,
688    /// HTTP request headers.
689
690    #[serde(skip_serializing_if = "Option::is_none")]
691    pub requestHeaders: Option<Headers>,
692    /// HTTP request headers text.
693
694    #[serde(skip_serializing_if = "Option::is_none")]
695    pub requestHeadersText: Option<String>,
696}
697
698/// WebSocket message data. This represents an entire WebSocket message, not just a fragmented frame as the name suggests.
699
700#[derive(Debug, Clone, Serialize, Deserialize, Default)]
701#[serde(rename_all = "camelCase")]
702pub struct WebSocketFrame {
703    /// WebSocket message opcode.
704
705    pub opcode: f64,
706    /// WebSocket message mask.
707
708    pub mask: bool,
709    /// WebSocket message payload data.
710    /// If the opcode is 1, this is a text message and payloadData is a UTF-8 string.
711    /// If the opcode isn't 1, then payloadData is a base64 encoded string representing binary data.
712
713    pub payloadData: String,
714}
715
716/// Information about the cached resource.
717
718#[derive(Debug, Clone, Serialize, Deserialize, Default)]
719#[serde(rename_all = "camelCase")]
720pub struct CachedResource {
721    /// Resource URL. This is the url of the original network request.
722
723    pub url: String,
724    /// Type of this resource.
725
726    #[serde(rename = "type")]
727    pub type_: ResourceType,
728    /// Cached response data.
729
730    #[serde(skip_serializing_if = "Option::is_none")]
731    pub response: Option<Response>,
732    /// Cached response body size.
733
734    pub bodySize: f64,
735}
736
737/// Information about the request initiator.
738
739#[derive(Debug, Clone, Serialize, Deserialize, Default)]
740#[serde(rename_all = "camelCase")]
741pub struct Initiator {
742    /// Type of this initiator.
743
744    #[serde(rename = "type")]
745    pub type_: String,
746    /// Initiator JavaScript stack trace, set for Script only.
747    /// Requires the Debugger domain to be enabled.
748
749    #[serde(skip_serializing_if = "Option::is_none")]
750    pub stack: Option<crate::runtime::StackTrace>,
751    /// Initiator URL, set for Parser type or for Script type (when script is importing module) or for SignedExchange type.
752
753    #[serde(skip_serializing_if = "Option::is_none")]
754    pub url: Option<String>,
755    /// Initiator line number, set for Parser type or for Script type (when script is importing
756    /// module) (0-based).
757
758    #[serde(skip_serializing_if = "Option::is_none")]
759    pub lineNumber: Option<f64>,
760    /// Initiator column number, set for Parser type or for Script type (when script is importing
761    /// module) (0-based).
762
763    #[serde(skip_serializing_if = "Option::is_none")]
764    pub columnNumber: Option<f64>,
765    /// Set if another request triggered this request (e.g. preflight).
766
767    #[serde(skip_serializing_if = "Option::is_none")]
768    pub requestId: Option<RequestId>,
769}
770
771/// cookiePartitionKey object
772/// The representation of the components of the key that are created by the cookiePartitionKey class contained in net/cookies/cookie_partition_key.h.
773
774#[derive(Debug, Clone, Serialize, Deserialize, Default)]
775#[serde(rename_all = "camelCase")]
776pub struct CookiePartitionKey {
777    /// The site of the top-level URL the browser was visiting at the start
778    /// of the request to the endpoint that set the cookie.
779
780    pub topLevelSite: String,
781    /// Indicates if the cookie has any ancestors that are cross-site to the topLevelSite.
782
783    pub hasCrossSiteAncestor: bool,
784}
785
786/// Cookie object
787
788#[derive(Debug, Clone, Serialize, Deserialize, Default)]
789#[serde(rename_all = "camelCase")]
790pub struct Cookie {
791    /// Cookie name.
792
793    pub name: String,
794    /// Cookie value.
795
796    pub value: String,
797    /// Cookie domain.
798
799    pub domain: String,
800    /// Cookie path.
801
802    pub path: String,
803    /// Cookie expiration date as the number of seconds since the UNIX epoch.
804    /// The value is set to -1 if the expiry date is not set.
805    /// The value can be null for values that cannot be represented in
806    /// JSON (±Inf).
807
808    pub expires: f64,
809    /// Cookie size.
810
811    pub size: u64,
812    /// True if cookie is http-only.
813
814    pub httpOnly: bool,
815    /// True if cookie is secure.
816
817    pub secure: bool,
818    /// True in case of session cookie.
819
820    pub session: bool,
821    /// Cookie SameSite type.
822
823    #[serde(skip_serializing_if = "Option::is_none")]
824    pub sameSite: Option<CookieSameSite>,
825    /// Cookie Priority
826
827    pub priority: CookiePriority,
828    /// Cookie source scheme type.
829
830    pub sourceScheme: CookieSourceScheme,
831    /// Cookie source port. Valid values are {-1, \[1, 65535\]}, -1 indicates an unspecified port.
832    /// An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
833    /// This is a temporary ability and it will be removed in the future.
834
835    pub sourcePort: i64,
836    /// Cookie partition key.
837
838    #[serde(skip_serializing_if = "Option::is_none")]
839    pub partitionKey: Option<CookiePartitionKey>,
840    /// True if cookie partition key is opaque.
841
842    #[serde(skip_serializing_if = "Option::is_none")]
843    pub partitionKeyOpaque: Option<bool>,
844}
845
846/// Types of reasons why a cookie may not be stored from a response.
847
848#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
849pub enum SetCookieBlockedReason {
850    #[default]
851    SecureOnly,
852    SameSiteStrict,
853    SameSiteLax,
854    SameSiteUnspecifiedTreatedAsLax,
855    SameSiteNoneInsecure,
856    UserPreferences,
857    ThirdPartyPhaseout,
858    ThirdPartyBlockedInFirstPartySet,
859    SyntaxError,
860    SchemeNotSupported,
861    OverwriteSecure,
862    InvalidDomain,
863    InvalidPrefix,
864    UnknownError,
865    SchemefulSameSiteStrict,
866    SchemefulSameSiteLax,
867    SchemefulSameSiteUnspecifiedTreatedAsLax,
868    NameValuePairExceedsMaxSize,
869    DisallowedCharacter,
870    NoCookieContent,
871}
872
873/// Types of reasons why a cookie may not be sent with a request.
874
875#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
876pub enum CookieBlockedReason {
877    #[default]
878    SecureOnly,
879    NotOnPath,
880    DomainMismatch,
881    SameSiteStrict,
882    SameSiteLax,
883    SameSiteUnspecifiedTreatedAsLax,
884    SameSiteNoneInsecure,
885    UserPreferences,
886    ThirdPartyPhaseout,
887    ThirdPartyBlockedInFirstPartySet,
888    UnknownError,
889    SchemefulSameSiteStrict,
890    SchemefulSameSiteLax,
891    SchemefulSameSiteUnspecifiedTreatedAsLax,
892    NameValuePairExceedsMaxSize,
893    PortMismatch,
894    SchemeMismatch,
895    AnonymousContext,
896}
897
898/// Types of reasons why a cookie should have been blocked by 3PCD but is exempted for the request.
899
900#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
901pub enum CookieExemptionReason {
902    #[default]
903    None,
904    UserSetting,
905    TPCDMetadata,
906    TPCDDeprecationTrial,
907    TopLevelTPCDDeprecationTrial,
908    TPCDHeuristics,
909    EnterprisePolicy,
910    StorageAccess,
911    TopLevelStorageAccess,
912    Scheme,
913    SameSiteNoneCookiesInSandbox,
914}
915
916/// A cookie which was not stored from a response with the corresponding reason.
917
918#[derive(Debug, Clone, Serialize, Deserialize, Default)]
919#[serde(rename_all = "camelCase")]
920pub struct BlockedSetCookieWithReason {
921    /// The reason(s) this cookie was blocked.
922
923    pub blockedReasons: Vec<SetCookieBlockedReason>,
924    /// The string representing this individual cookie as it would appear in the header.
925    /// This is not the entire "cookie" or "set-cookie" header which could have multiple cookies.
926
927    pub cookieLine: String,
928    /// The cookie object which represents the cookie which was not stored. It is optional because
929    /// sometimes complete cookie information is not available, such as in the case of parsing
930    /// errors.
931
932    #[serde(skip_serializing_if = "Option::is_none")]
933    pub cookie: Option<Cookie>,
934}
935
936/// A cookie should have been blocked by 3PCD but is exempted and stored from a response with the
937/// corresponding reason. A cookie could only have at most one exemption reason.
938
939#[derive(Debug, Clone, Serialize, Deserialize, Default)]
940#[serde(rename_all = "camelCase")]
941pub struct ExemptedSetCookieWithReason {
942    /// The reason the cookie was exempted.
943
944    pub exemptionReason: CookieExemptionReason,
945    /// The string representing this individual cookie as it would appear in the header.
946
947    pub cookieLine: String,
948    /// The cookie object representing the cookie.
949
950    pub cookie: Cookie,
951}
952
953/// A cookie associated with the request which may or may not be sent with it.
954/// Includes the cookies itself and reasons for blocking or exemption.
955
956#[derive(Debug, Clone, Serialize, Deserialize, Default)]
957#[serde(rename_all = "camelCase")]
958pub struct AssociatedCookie {
959    /// The cookie object representing the cookie which was not sent.
960
961    pub cookie: Cookie,
962    /// The reason(s) the cookie was blocked. If empty means the cookie is included.
963
964    pub blockedReasons: Vec<CookieBlockedReason>,
965    /// The reason the cookie should have been blocked by 3PCD but is exempted. A cookie could
966    /// only have at most one exemption reason.
967
968    #[serde(skip_serializing_if = "Option::is_none")]
969    pub exemptionReason: Option<CookieExemptionReason>,
970}
971
972/// Cookie parameter object
973
974#[derive(Debug, Clone, Serialize, Deserialize, Default)]
975#[serde(rename_all = "camelCase")]
976pub struct CookieParam {
977    /// Cookie name.
978
979    pub name: String,
980    /// Cookie value.
981
982    pub value: String,
983    /// The request-URI to associate with the setting of the cookie. This value can affect the
984    /// default domain, path, source port, and source scheme values of the created cookie.
985
986    #[serde(skip_serializing_if = "Option::is_none")]
987    pub url: Option<String>,
988    /// Cookie domain.
989
990    #[serde(skip_serializing_if = "Option::is_none")]
991    pub domain: Option<String>,
992    /// Cookie path.
993
994    #[serde(skip_serializing_if = "Option::is_none")]
995    pub path: Option<String>,
996    /// True if cookie is secure.
997
998    #[serde(skip_serializing_if = "Option::is_none")]
999    pub secure: Option<bool>,
1000    /// True if cookie is http-only.
1001
1002    #[serde(skip_serializing_if = "Option::is_none")]
1003    pub httpOnly: Option<bool>,
1004    /// Cookie SameSite type.
1005
1006    #[serde(skip_serializing_if = "Option::is_none")]
1007    pub sameSite: Option<CookieSameSite>,
1008    /// Cookie expiration date, session cookie if not set
1009
1010    #[serde(skip_serializing_if = "Option::is_none")]
1011    pub expires: Option<TimeSinceEpoch>,
1012    /// Cookie Priority.
1013
1014    #[serde(skip_serializing_if = "Option::is_none")]
1015    pub priority: Option<CookiePriority>,
1016    /// Cookie source scheme type.
1017
1018    #[serde(skip_serializing_if = "Option::is_none")]
1019    pub sourceScheme: Option<CookieSourceScheme>,
1020    /// Cookie source port. Valid values are {-1, \[1, 65535\]}, -1 indicates an unspecified port.
1021    /// An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
1022    /// This is a temporary ability and it will be removed in the future.
1023
1024    #[serde(skip_serializing_if = "Option::is_none")]
1025    pub sourcePort: Option<i64>,
1026    /// Cookie partition key. If not set, the cookie will be set as not partitioned.
1027
1028    #[serde(skip_serializing_if = "Option::is_none")]
1029    pub partitionKey: Option<CookiePartitionKey>,
1030}
1031
1032/// Authorization challenge for HTTP status code 401 or 407.
1033
1034#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1035#[serde(rename_all = "camelCase")]
1036pub struct AuthChallenge {
1037    /// Source of the authentication challenge.
1038
1039    #[serde(skip_serializing_if = "Option::is_none")]
1040    pub source: Option<String>,
1041    /// Origin of the challenger.
1042
1043    pub origin: String,
1044    /// The authentication scheme used, such as basic or digest
1045
1046    pub scheme: String,
1047    /// The realm of the challenge. May be empty.
1048
1049    pub realm: String,
1050}
1051
1052/// Response to an AuthChallenge.
1053
1054#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1055#[serde(rename_all = "camelCase")]
1056pub struct AuthChallengeResponse {
1057    /// The decision on what to do in response to the authorization challenge.  Default means
1058    /// deferring to the default behavior of the net stack, which will likely either the Cancel
1059    /// authentication or display a popup dialog box.
1060
1061    pub response: String,
1062    /// The username to provide, possibly empty. Should only be set if response is
1063    /// ProvideCredentials.
1064
1065    #[serde(skip_serializing_if = "Option::is_none")]
1066    pub username: Option<String>,
1067    /// The password to provide, possibly empty. Should only be set if response is
1068    /// ProvideCredentials.
1069
1070    #[serde(skip_serializing_if = "Option::is_none")]
1071    pub password: Option<String>,
1072}
1073
1074/// Stages of the interception to begin intercepting. Request will intercept before the request is
1075/// sent. Response will intercept after the response is received.
1076
1077#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1078pub enum InterceptionStage {
1079    #[default]
1080    Request,
1081    HeadersReceived,
1082}
1083
1084/// Request pattern for interception.
1085
1086#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1087#[serde(rename_all = "camelCase")]
1088pub struct RequestPattern {
1089    /// Wildcards (''*'' -\> zero or more, ''?'' -\> exactly one) are allowed. Escape character is
1090    /// backslash. Omitting is equivalent to '"*"'.
1091
1092    #[serde(skip_serializing_if = "Option::is_none")]
1093    pub urlPattern: Option<String>,
1094    /// If set, only requests for matching resource types will be intercepted.
1095
1096    #[serde(skip_serializing_if = "Option::is_none")]
1097    pub resourceType: Option<ResourceType>,
1098    /// Stage at which to begin intercepting requests. Default is Request.
1099
1100    #[serde(skip_serializing_if = "Option::is_none")]
1101    pub interceptionStage: Option<InterceptionStage>,
1102}
1103
1104/// Information about a signed exchange signature.
1105/// <https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#rfc.section.3.1>
1106
1107#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1108#[serde(rename_all = "camelCase")]
1109pub struct SignedExchangeSignature {
1110    /// Signed exchange signature label.
1111
1112    pub label: String,
1113    /// The hex string of signed exchange signature.
1114
1115    pub signature: String,
1116    /// Signed exchange signature integrity.
1117
1118    pub integrity: String,
1119    /// Signed exchange signature cert Url.
1120
1121    #[serde(skip_serializing_if = "Option::is_none")]
1122    pub certUrl: Option<String>,
1123    /// The hex string of signed exchange signature cert sha256.
1124
1125    #[serde(skip_serializing_if = "Option::is_none")]
1126    pub certSha256: Option<String>,
1127    /// Signed exchange signature validity Url.
1128
1129    pub validityUrl: String,
1130    /// Signed exchange signature date.
1131
1132    pub date: i64,
1133    /// Signed exchange signature expires.
1134
1135    pub expires: i64,
1136    /// The encoded certificates.
1137
1138    #[serde(skip_serializing_if = "Option::is_none")]
1139    pub certificates: Option<Vec<String>>,
1140}
1141
1142/// Information about a signed exchange header.
1143/// <https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cbor-representation>
1144
1145#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1146#[serde(rename_all = "camelCase")]
1147pub struct SignedExchangeHeader {
1148    /// Signed exchange request URL.
1149
1150    pub requestUrl: String,
1151    /// Signed exchange response code.
1152
1153    pub responseCode: i64,
1154    /// Signed exchange response headers.
1155
1156    pub responseHeaders: Headers,
1157    /// Signed exchange response signature.
1158
1159    pub signatures: Vec<SignedExchangeSignature>,
1160    /// Signed exchange header integrity hash in the form of 'sha256-\<base64-hash-value\>'.
1161
1162    pub headerIntegrity: String,
1163}
1164
1165/// Field type for a signed exchange related error.
1166
1167#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1168pub enum SignedExchangeErrorField {
1169    #[default]
1170    SignatureSig,
1171    SignatureIntegrity,
1172    SignatureCertUrl,
1173    SignatureCertSha256,
1174    SignatureValidityUrl,
1175    SignatureTimestamps,
1176}
1177
1178/// Information about a signed exchange response.
1179
1180#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1181#[serde(rename_all = "camelCase")]
1182pub struct SignedExchangeError {
1183    /// Error message.
1184
1185    pub message: String,
1186    /// The index of the signature which caused the error.
1187
1188    #[serde(skip_serializing_if = "Option::is_none")]
1189    pub signatureIndex: Option<u64>,
1190    /// The field which caused the error.
1191
1192    #[serde(skip_serializing_if = "Option::is_none")]
1193    pub errorField: Option<SignedExchangeErrorField>,
1194}
1195
1196/// Information about a signed exchange response.
1197
1198#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1199#[serde(rename_all = "camelCase")]
1200pub struct SignedExchangeInfo {
1201    /// The outer response of signed HTTP exchange which was received from network.
1202
1203    pub outerResponse: Response,
1204    /// Whether network response for the signed exchange was accompanied by
1205    /// extra headers.
1206
1207    pub hasExtraInfo: bool,
1208    /// Information about the signed exchange header.
1209
1210    #[serde(skip_serializing_if = "Option::is_none")]
1211    pub header: Option<SignedExchangeHeader>,
1212    /// Security details for the signed exchange header.
1213
1214    #[serde(skip_serializing_if = "Option::is_none")]
1215    pub securityDetails: Option<SecurityDetails>,
1216    /// Errors occurred while handling the signed exchange.
1217
1218    #[serde(skip_serializing_if = "Option::is_none")]
1219    pub errors: Option<Vec<SignedExchangeError>>,
1220}
1221
1222/// List of content encodings supported by the backend.
1223
1224#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1225pub enum ContentEncoding {
1226    #[default]
1227    Deflate,
1228    Gzip,
1229    Br,
1230    Zstd,
1231}
1232
1233
1234#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1235#[serde(rename_all = "camelCase")]
1236pub struct NetworkConditions {
1237    /// Only matching requests will be affected by these conditions. Patterns use the URLPattern constructor string
1238    /// syntax (<https://urlpattern.spec.whatwg.org/>) and must be absolute. If the pattern is empty, all requests are
1239    /// matched (including p2p connections).
1240
1241    pub urlPattern: String,
1242    /// Minimum latency from request sent to response headers received (ms).
1243
1244    pub latency: f64,
1245    /// Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.
1246
1247    pub downloadThroughput: f64,
1248    /// Maximal aggregated upload throughput (bytes/sec).  -1 disables upload throttling.
1249
1250    pub uploadThroughput: f64,
1251    /// Connection type if known.
1252
1253    #[serde(skip_serializing_if = "Option::is_none")]
1254    pub connectionType: Option<ConnectionType>,
1255    /// WebRTC packet loss (percent, 0-100). 0 disables packet loss emulation, 100 drops all the packets.
1256
1257    #[serde(skip_serializing_if = "Option::is_none")]
1258    pub packetLoss: Option<f64>,
1259    /// WebRTC packet queue length (packet). 0 removes any queue length limitations.
1260
1261    #[serde(skip_serializing_if = "Option::is_none")]
1262    pub packetQueueLength: Option<u64>,
1263    /// WebRTC packetReordering feature.
1264
1265    #[serde(skip_serializing_if = "Option::is_none")]
1266    pub packetReordering: Option<bool>,
1267    /// True to emulate internet disconnection.
1268
1269    #[serde(skip_serializing_if = "Option::is_none")]
1270    pub offline: Option<bool>,
1271}
1272
1273
1274#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1275#[serde(rename_all = "camelCase")]
1276pub struct BlockPattern {
1277    /// URL pattern to match. Patterns use the URLPattern constructor string syntax
1278    /// (<https://urlpattern.spec.whatwg.org/>) and must be absolute. Example: '*://*:*/*.css'.
1279
1280    pub urlPattern: String,
1281    /// Whether or not to block the pattern. If false, a matching request will not be blocked even if it matches a later
1282    /// 'BlockPattern'.
1283
1284    pub block: bool,
1285}
1286
1287
1288#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1289pub enum DirectSocketDnsQueryType {
1290    #[default]
1291    Ipv4,
1292    Ipv6,
1293}
1294
1295
1296#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1297#[serde(rename_all = "camelCase")]
1298pub struct DirectTCPSocketOptions {
1299    /// TCP_NODELAY option
1300
1301    pub noDelay: bool,
1302    /// Expected to be unsigned integer.
1303
1304    #[serde(skip_serializing_if = "Option::is_none")]
1305    pub keepAliveDelay: Option<f64>,
1306    /// Expected to be unsigned integer.
1307
1308    #[serde(skip_serializing_if = "Option::is_none")]
1309    pub sendBufferSize: Option<f64>,
1310    /// Expected to be unsigned integer.
1311
1312    #[serde(skip_serializing_if = "Option::is_none")]
1313    pub receiveBufferSize: Option<f64>,
1314
1315    #[serde(skip_serializing_if = "Option::is_none")]
1316    pub dnsQueryType: Option<DirectSocketDnsQueryType>,
1317}
1318
1319
1320#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1321#[serde(rename_all = "camelCase")]
1322pub struct DirectUDPSocketOptions {
1323
1324    #[serde(skip_serializing_if = "Option::is_none")]
1325    pub remoteAddr: Option<String>,
1326    /// Unsigned int 16.
1327
1328    #[serde(skip_serializing_if = "Option::is_none")]
1329    pub remotePort: Option<i64>,
1330
1331    #[serde(skip_serializing_if = "Option::is_none")]
1332    pub localAddr: Option<String>,
1333    /// Unsigned int 16.
1334
1335    #[serde(skip_serializing_if = "Option::is_none")]
1336    pub localPort: Option<i64>,
1337
1338    #[serde(skip_serializing_if = "Option::is_none")]
1339    pub dnsQueryType: Option<DirectSocketDnsQueryType>,
1340    /// Expected to be unsigned integer.
1341
1342    #[serde(skip_serializing_if = "Option::is_none")]
1343    pub sendBufferSize: Option<f64>,
1344    /// Expected to be unsigned integer.
1345
1346    #[serde(skip_serializing_if = "Option::is_none")]
1347    pub receiveBufferSize: Option<f64>,
1348
1349    #[serde(skip_serializing_if = "Option::is_none")]
1350    pub multicastLoopback: Option<bool>,
1351    /// Unsigned int 8.
1352
1353    #[serde(skip_serializing_if = "Option::is_none")]
1354    pub multicastTimeToLive: Option<i64>,
1355
1356    #[serde(skip_serializing_if = "Option::is_none")]
1357    pub multicastAllowAddressSharing: Option<bool>,
1358}
1359
1360
1361#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1362#[serde(rename_all = "camelCase")]
1363pub struct DirectUDPMessage {
1364
1365    pub data: String,
1366    /// Null for connected mode.
1367
1368    #[serde(skip_serializing_if = "Option::is_none")]
1369    pub remoteAddr: Option<String>,
1370    /// Null for connected mode.
1371    /// Expected to be unsigned integer.
1372
1373    #[serde(skip_serializing_if = "Option::is_none")]
1374    pub remotePort: Option<i64>,
1375}
1376
1377
1378#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1379pub enum LocalNetworkAccessRequestPolicy {
1380    #[default]
1381    Allow,
1382    BlockFromInsecureToMorePrivate,
1383    WarnFromInsecureToMorePrivate,
1384    PermissionBlock,
1385    PermissionWarn,
1386}
1387
1388
1389#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1390pub enum IPAddressSpace {
1391    #[default]
1392    Loopback,
1393    Local,
1394    Public,
1395    Unknown,
1396}
1397
1398
1399#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1400#[serde(rename_all = "camelCase")]
1401pub struct ConnectTiming {
1402    /// Timing's requestTime is a baseline in seconds, while the other numbers are ticks in
1403    /// milliseconds relatively to this requestTime. Matches ResourceTiming's requestTime for
1404    /// the same request (but not for redirected requests).
1405
1406    pub requestTime: f64,
1407}
1408
1409
1410#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1411#[serde(rename_all = "camelCase")]
1412pub struct ClientSecurityState {
1413
1414    pub initiatorIsSecureContext: bool,
1415
1416    pub initiatorIPAddressSpace: IPAddressSpace,
1417
1418    pub localNetworkAccessRequestPolicy: LocalNetworkAccessRequestPolicy,
1419}
1420
1421/// Identifies the script on the stack that caused a resource or element to be
1422/// labeled as an ad. For resources, this indicates the context that triggered
1423/// the fetch. For elements, this indicates the context that caused the element
1424/// to be appended to the DOM.
1425
1426#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1427#[serde(rename_all = "camelCase")]
1428pub struct AdScriptIdentifier {
1429    /// The script's V8 identifier.
1430
1431    pub scriptId: crate::runtime::ScriptId,
1432    /// V8's debugging ID for the v8::Context.
1433
1434    pub debuggerId: crate::runtime::UniqueDebuggerId,
1435    /// The script's url (or generated name based on id if inline script).
1436
1437    pub name: String,
1438}
1439
1440/// Encapsulates the script ancestry and the root script filter list rule that
1441/// caused the resource or element to be labeled as an ad.
1442
1443#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1444#[serde(rename_all = "camelCase")]
1445pub struct AdAncestry {
1446    /// A chain of 'AdScriptIdentifier's representing the ancestry of an ad
1447    /// script that led to the creation of a resource or element. The chain is
1448    /// ordered from the script itself (lowest level) up to its root ancestor
1449    /// that was flagged by a filter list.
1450
1451    pub ancestryChain: Vec<AdScriptIdentifier>,
1452    /// The filter list rule that caused the root (last) script in
1453    /// 'ancestryChain' to be tagged as an ad.
1454
1455    #[serde(skip_serializing_if = "Option::is_none")]
1456    pub rootScriptFilterlistRule: Option<String>,
1457}
1458
1459/// Represents the provenance of an ad resource or element. Only one of
1460/// 'filterlistRule' or 'adScriptAncestry' can be set. If 'filterlistRule'
1461/// is provided, the resource URL directly matches a filter list rule. If
1462/// 'adScriptAncestry' is provided, an ad script initiated the resource fetch or
1463/// appended the element to the DOM. If neither is provided, the entity is
1464/// known to be an ad, but provenance tracking information is unavailable.
1465
1466#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1467#[serde(rename_all = "camelCase")]
1468pub struct AdProvenance {
1469    /// The filterlist rule that matched, if any.
1470
1471    #[serde(skip_serializing_if = "Option::is_none")]
1472    pub filterlistRule: Option<String>,
1473    /// The script ancestry that created the ad, if any.
1474
1475    #[serde(skip_serializing_if = "Option::is_none")]
1476    pub adScriptAncestry: Option<AdAncestry>,
1477}
1478
1479
1480#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1481pub enum CrossOriginOpenerPolicyValue {
1482    #[default]
1483    SameOrigin,
1484    SameOriginAllowPopups,
1485    RestrictProperties,
1486    UnsafeNone,
1487    SameOriginPlusCoep,
1488    RestrictPropertiesPlusCoep,
1489    NoopenerAllowPopups,
1490}
1491
1492
1493#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1494#[serde(rename_all = "camelCase")]
1495pub struct CrossOriginOpenerPolicyStatus {
1496
1497    pub value: CrossOriginOpenerPolicyValue,
1498
1499    pub reportOnlyValue: CrossOriginOpenerPolicyValue,
1500
1501    #[serde(skip_serializing_if = "Option::is_none")]
1502    pub reportingEndpoint: Option<String>,
1503
1504    #[serde(skip_serializing_if = "Option::is_none")]
1505    pub reportOnlyReportingEndpoint: Option<String>,
1506}
1507
1508
1509#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1510pub enum CrossOriginEmbedderPolicyValue {
1511    #[default]
1512    None,
1513    Credentialless,
1514    RequireCorp,
1515}
1516
1517
1518#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1519#[serde(rename_all = "camelCase")]
1520pub struct CrossOriginEmbedderPolicyStatus {
1521
1522    pub value: CrossOriginEmbedderPolicyValue,
1523
1524    pub reportOnlyValue: CrossOriginEmbedderPolicyValue,
1525
1526    #[serde(skip_serializing_if = "Option::is_none")]
1527    pub reportingEndpoint: Option<String>,
1528
1529    #[serde(skip_serializing_if = "Option::is_none")]
1530    pub reportOnlyReportingEndpoint: Option<String>,
1531}
1532
1533
1534#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1535pub enum ContentSecurityPolicySource {
1536    #[default]
1537    HTTP,
1538    Meta,
1539}
1540
1541
1542#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1543#[serde(rename_all = "camelCase")]
1544pub struct ContentSecurityPolicyStatus {
1545
1546    pub effectiveDirectives: String,
1547
1548    pub isEnforced: bool,
1549
1550    pub source: ContentSecurityPolicySource,
1551}
1552
1553
1554#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1555#[serde(rename_all = "camelCase")]
1556pub struct SecurityIsolationStatus {
1557
1558    #[serde(skip_serializing_if = "Option::is_none")]
1559    pub coop: Option<CrossOriginOpenerPolicyStatus>,
1560
1561    #[serde(skip_serializing_if = "Option::is_none")]
1562    pub coep: Option<CrossOriginEmbedderPolicyStatus>,
1563
1564    #[serde(skip_serializing_if = "Option::is_none")]
1565    pub csp: Option<Vec<ContentSecurityPolicyStatus>>,
1566}
1567
1568/// The status of a Reporting API report.
1569
1570#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1571pub enum ReportStatus {
1572    #[default]
1573    Queued,
1574    Pending,
1575    MarkedForRemoval,
1576    Success,
1577}
1578
1579
1580pub type ReportId = String;
1581
1582/// An object representing a report generated by the Reporting API.
1583
1584#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1585#[serde(rename_all = "camelCase")]
1586pub struct ReportingApiReport {
1587
1588    pub id: ReportId,
1589    /// The URL of the document that triggered the report.
1590
1591    pub initiatorUrl: String,
1592    /// The name of the endpoint group that should be used to deliver the report.
1593
1594    pub destination: String,
1595    /// The type of the report (specifies the set of data that is contained in the report body).
1596
1597    #[serde(rename = "type")]
1598    pub type_: String,
1599    /// When the report was generated.
1600
1601    pub timestamp: crate::network::TimeSinceEpoch,
1602    /// How many uploads deep the related request was.
1603
1604    pub depth: i64,
1605    /// The number of delivery attempts made so far, not including an active attempt.
1606
1607    pub completedAttempts: i64,
1608
1609    pub body: serde_json::Map<String, JsonValue>,
1610
1611    pub status: ReportStatus,
1612}
1613
1614
1615#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1616#[serde(rename_all = "camelCase")]
1617pub struct ReportingApiEndpoint {
1618    /// The URL of the endpoint to which reports may be delivered.
1619
1620    pub url: String,
1621    /// Name of the endpoint group.
1622
1623    pub groupName: String,
1624}
1625
1626/// Unique identifier for a device bound session.
1627
1628#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1629#[serde(rename_all = "camelCase")]
1630pub struct DeviceBoundSessionKey {
1631    /// The site the session is set up for.
1632
1633    pub site: String,
1634    /// The id of the session.
1635
1636    pub id: String,
1637}
1638
1639/// How a device bound session was used during a request.
1640
1641#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1642#[serde(rename_all = "camelCase")]
1643pub struct DeviceBoundSessionWithUsage {
1644    /// The key for the session.
1645
1646    pub sessionKey: DeviceBoundSessionKey,
1647    /// How the session was used (or not used).
1648
1649    pub usage: String,
1650}
1651
1652/// A device bound session's cookie craving.
1653
1654#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1655#[serde(rename_all = "camelCase")]
1656pub struct DeviceBoundSessionCookieCraving {
1657    /// The name of the craving.
1658
1659    pub name: String,
1660    /// The domain of the craving.
1661
1662    pub domain: String,
1663    /// The path of the craving.
1664
1665    pub path: String,
1666    /// The 'Secure' attribute of the craving attributes.
1667
1668    pub secure: bool,
1669    /// The 'HttpOnly' attribute of the craving attributes.
1670
1671    pub httpOnly: bool,
1672    /// The 'SameSite' attribute of the craving attributes.
1673
1674    #[serde(skip_serializing_if = "Option::is_none")]
1675    pub sameSite: Option<CookieSameSite>,
1676}
1677
1678/// A device bound session's inclusion URL rule.
1679
1680#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1681#[serde(rename_all = "camelCase")]
1682pub struct DeviceBoundSessionUrlRule {
1683    /// See comments on 'net::device_bound_sessions::SessionInclusionRules::UrlRule::rule_type'.
1684
1685    pub ruleType: String,
1686    /// See comments on 'net::device_bound_sessions::SessionInclusionRules::UrlRule::host_pattern'.
1687
1688    pub hostPattern: String,
1689    /// See comments on 'net::device_bound_sessions::SessionInclusionRules::UrlRule::path_prefix'.
1690
1691    pub pathPrefix: String,
1692}
1693
1694/// A device bound session's inclusion rules.
1695
1696#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1697#[serde(rename_all = "camelCase")]
1698pub struct DeviceBoundSessionInclusionRules {
1699    /// See comments on 'net::device_bound_sessions::SessionInclusionRules::origin_'.
1700
1701    pub origin: String,
1702    /// Whether the whole site is included. See comments on
1703    /// 'net::device_bound_sessions::SessionInclusionRules::include_site_' for more
1704    /// details; this boolean is true if that value is populated.
1705
1706    pub includeSite: bool,
1707    /// See comments on 'net::device_bound_sessions::SessionInclusionRules::url_rules_'.
1708
1709    pub urlRules: Vec<DeviceBoundSessionUrlRule>,
1710}
1711
1712/// A device bound session.
1713
1714#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1715#[serde(rename_all = "camelCase")]
1716pub struct DeviceBoundSession {
1717    /// The site and session ID of the session.
1718
1719    pub key: DeviceBoundSessionKey,
1720    /// See comments on 'net::device_bound_sessions::Session::refresh_url_'.
1721
1722    pub refreshUrl: String,
1723    /// See comments on 'net::device_bound_sessions::Session::inclusion_rules_'.
1724
1725    pub inclusionRules: DeviceBoundSessionInclusionRules,
1726    /// See comments on 'net::device_bound_sessions::Session::cookie_cravings_'.
1727
1728    pub cookieCravings: Vec<DeviceBoundSessionCookieCraving>,
1729    /// See comments on 'net::device_bound_sessions::Session::expiry_date_'.
1730
1731    pub expiryDate: crate::network::TimeSinceEpoch,
1732    /// See comments on 'net::device_bound_sessions::Session::cached_challenge__'.
1733
1734    #[serde(skip_serializing_if = "Option::is_none")]
1735    pub cachedChallenge: Option<String>,
1736    /// See comments on 'net::device_bound_sessions::Session::allowed_refresh_initiators_'.
1737
1738    pub allowedRefreshInitiators: Vec<String>,
1739}
1740
1741/// A unique identifier for a device bound session event.
1742
1743pub type DeviceBoundSessionEventId = String;
1744
1745/// A fetch result for a device bound session creation or refresh.
1746
1747#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
1748pub enum DeviceBoundSessionFetchResult {
1749    #[default]
1750    Success,
1751    KeyError,
1752    SigningError,
1753    ServerRequestedTermination,
1754    InvalidSessionId,
1755    InvalidChallenge,
1756    TooManyChallenges,
1757    InvalidFetcherUrl,
1758    InvalidRefreshUrl,
1759    TransientHttpError,
1760    ScopeOriginSameSiteMismatch,
1761    RefreshUrlSameSiteMismatch,
1762    MismatchedSessionId,
1763    MissingScope,
1764    NoCredentials,
1765    SubdomainRegistrationWellKnownUnavailable,
1766    SubdomainRegistrationUnauthorized,
1767    SubdomainRegistrationWellKnownMalformed,
1768    SessionProviderWellKnownUnavailable,
1769    RelyingPartyWellKnownUnavailable,
1770    FederatedKeyThumbprintMismatch,
1771    InvalidFederatedSessionUrl,
1772    InvalidFederatedKey,
1773    TooManyRelyingOriginLabels,
1774    BoundCookieSetForbidden,
1775    NetError,
1776    ProxyError,
1777    EmptySessionConfig,
1778    InvalidCredentialsConfig,
1779    InvalidCredentialsType,
1780    InvalidCredentialsEmptyName,
1781    InvalidCredentialsCookie,
1782    PersistentHttpError,
1783    RegistrationAttemptedChallenge,
1784    InvalidScopeOrigin,
1785    ScopeOriginContainsPath,
1786    RefreshInitiatorNotString,
1787    RefreshInitiatorInvalidHostPattern,
1788    InvalidScopeSpecification,
1789    MissingScopeSpecificationType,
1790    EmptyScopeSpecificationDomain,
1791    EmptyScopeSpecificationPath,
1792    InvalidScopeSpecificationType,
1793    InvalidScopeIncludeSite,
1794    MissingScopeIncludeSite,
1795    FederatedNotAuthorizedByProvider,
1796    FederatedNotAuthorizedByRelyingParty,
1797    SessionProviderWellKnownMalformed,
1798    SessionProviderWellKnownHasProviderOrigin,
1799    RelyingPartyWellKnownMalformed,
1800    RelyingPartyWellKnownHasRelyingOrigins,
1801    InvalidFederatedSessionProviderSessionMissing,
1802    InvalidFederatedSessionWrongProviderOrigin,
1803    InvalidCredentialsCookieCreationTime,
1804    InvalidCredentialsCookieName,
1805    InvalidCredentialsCookieParsing,
1806    InvalidCredentialsCookieUnpermittedAttribute,
1807    InvalidCredentialsCookieInvalidDomain,
1808    InvalidCredentialsCookiePrefix,
1809    InvalidScopeRulePath,
1810    InvalidScopeRuleHostPattern,
1811    ScopeRuleOriginScopedHostPatternMismatch,
1812    ScopeRuleSiteScopedHostPatternMismatch,
1813    SigningQuotaExceeded,
1814    InvalidConfigJson,
1815    InvalidFederatedSessionProviderFailedToRestoreKey,
1816    FailedToUnwrapKey,
1817    SessionDeletedDuringRefresh,
1818}
1819
1820/// Details about a failed device bound session network request.
1821
1822#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1823#[serde(rename_all = "camelCase")]
1824pub struct DeviceBoundSessionFailedRequest {
1825    /// The failed request URL.
1826
1827    pub requestUrl: String,
1828    /// The net error of the response if it was not OK.
1829
1830    #[serde(skip_serializing_if = "Option::is_none")]
1831    pub netError: Option<String>,
1832    /// The response code if the net error was OK and the response code was not
1833    /// 200.
1834
1835    #[serde(skip_serializing_if = "Option::is_none")]
1836    pub responseError: Option<i64>,
1837    /// The body of the response if the net error was OK, the response code was
1838    /// not 200, and the response body was not empty.
1839
1840    #[serde(skip_serializing_if = "Option::is_none")]
1841    pub responseErrorBody: Option<String>,
1842}
1843
1844/// Session event details specific to creation.
1845
1846#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1847#[serde(rename_all = "camelCase")]
1848pub struct CreationEventDetails {
1849    /// The result of the fetch attempt.
1850
1851    pub fetchResult: DeviceBoundSessionFetchResult,
1852    /// The session if there was a newly created session. This is populated for
1853    /// all successful creation events.
1854
1855    #[serde(skip_serializing_if = "Option::is_none")]
1856    pub newSession: Option<DeviceBoundSession>,
1857    /// Details about a failed device bound session network request if there was
1858    /// one.
1859
1860    #[serde(skip_serializing_if = "Option::is_none")]
1861    pub failedRequest: Option<DeviceBoundSessionFailedRequest>,
1862}
1863
1864/// Session event details specific to refresh.
1865
1866#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1867#[serde(rename_all = "camelCase")]
1868pub struct RefreshEventDetails {
1869    /// The result of a refresh.
1870
1871    pub refreshResult: String,
1872    /// If there was a fetch attempt, the result of that.
1873
1874    #[serde(skip_serializing_if = "Option::is_none")]
1875    pub fetchResult: Option<DeviceBoundSessionFetchResult>,
1876    /// The session display if there was a newly created session. This is populated
1877    /// for any refresh event that modifies the session config.
1878
1879    #[serde(skip_serializing_if = "Option::is_none")]
1880    pub newSession: Option<DeviceBoundSession>,
1881    /// See comments on 'net::device_bound_sessions::RefreshEventResult::was_fully_proactive_refresh'.
1882
1883    pub wasFullyProactiveRefresh: bool,
1884    /// Details about a failed device bound session network request if there was
1885    /// one.
1886
1887    #[serde(skip_serializing_if = "Option::is_none")]
1888    pub failedRequest: Option<DeviceBoundSessionFailedRequest>,
1889}
1890
1891/// Session event details specific to termination.
1892
1893#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1894#[serde(rename_all = "camelCase")]
1895pub struct TerminationEventDetails {
1896    /// The reason for a session being deleted.
1897
1898    pub deletionReason: String,
1899}
1900
1901/// Session event details specific to challenges.
1902
1903#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1904#[serde(rename_all = "camelCase")]
1905pub struct ChallengeEventDetails {
1906    /// The result of a challenge.
1907
1908    pub challengeResult: String,
1909    /// The challenge set.
1910
1911    pub challenge: String,
1912}
1913
1914/// An object providing the result of a network resource load.
1915
1916#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1917#[serde(rename_all = "camelCase")]
1918pub struct LoadNetworkResourcePageResult {
1919
1920    pub success: bool,
1921    /// Optional values used for error reporting.
1922
1923    #[serde(skip_serializing_if = "Option::is_none")]
1924    pub netError: Option<f64>,
1925
1926    #[serde(skip_serializing_if = "Option::is_none")]
1927    pub netErrorName: Option<String>,
1928
1929    #[serde(skip_serializing_if = "Option::is_none")]
1930    pub httpStatusCode: Option<f64>,
1931    /// If successful, one of the following two fields holds the result.
1932
1933    #[serde(skip_serializing_if = "Option::is_none")]
1934    pub stream: Option<crate::io::StreamHandle>,
1935    /// Response headers.
1936
1937    #[serde(skip_serializing_if = "Option::is_none")]
1938    pub headers: Option<crate::network::Headers>,
1939}
1940
1941/// An options object that may be extended later to better support CORS,
1942/// CORB and streaming.
1943
1944#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1945#[serde(rename_all = "camelCase")]
1946pub struct LoadNetworkResourceOptions {
1947
1948    pub disableCache: bool,
1949
1950    pub includeCredentials: bool,
1951}
1952
1953/// Sets a list of content encodings that will be accepted. Empty list means no encoding is accepted.
1954
1955#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1956#[serde(rename_all = "camelCase")]
1957pub struct SetAcceptedEncodingsParams {
1958    /// List of accepted content encodings.
1959
1960    pub encodings: Vec<ContentEncoding>,
1961}
1962
1963/// Tells whether clearing browser cache is supported.
1964
1965#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1966#[serde(rename_all = "camelCase")]
1967pub struct CanClearBrowserCacheReturns {
1968    /// True if browser cache can be cleared.
1969
1970    pub result: bool,
1971}
1972
1973/// Tells whether clearing browser cookies is supported.
1974
1975#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1976#[serde(rename_all = "camelCase")]
1977pub struct CanClearBrowserCookiesReturns {
1978    /// True if browser cookies can be cleared.
1979
1980    pub result: bool,
1981}
1982
1983/// Tells whether emulation of network conditions is supported.
1984
1985#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1986#[serde(rename_all = "camelCase")]
1987pub struct CanEmulateNetworkConditionsReturns {
1988    /// True if emulation of network conditions is supported.
1989
1990    pub result: bool,
1991}
1992
1993/// Response to Network.requestIntercepted which either modifies the request to continue with any
1994/// modifications, or blocks it, or completes it with the provided response bytes. If a network
1995/// fetch occurs as a result which encounters a redirect an additional Network.requestIntercepted
1996/// event will be sent with the same InterceptionId.
1997/// Deprecated, use Fetch.continueRequest, Fetch.fulfillRequest and Fetch.failRequest instead.
1998
1999#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2000#[serde(rename_all = "camelCase")]
2001pub struct ContinueInterceptedRequestParams {
2002
2003    pub interceptionId: InterceptionId,
2004    /// If set this causes the request to fail with the given reason. Passing 'Aborted' for requests
2005    /// marked with 'isNavigationRequest' also cancels the navigation. Must not be set in response
2006    /// to an authChallenge.
2007
2008    #[serde(skip_serializing_if = "Option::is_none")]
2009    pub errorReason: Option<ErrorReason>,
2010    /// If set the requests completes using with the provided base64 encoded raw response, including
2011    /// HTTP status line and headers etc... Must not be set in response to an authChallenge. (Encoded as a base64 string when passed over JSON)
2012
2013    #[serde(skip_serializing_if = "Option::is_none")]
2014    pub rawResponse: Option<String>,
2015    /// If set the request url will be modified in a way that's not observable by page. Must not be
2016    /// set in response to an authChallenge.
2017
2018    #[serde(skip_serializing_if = "Option::is_none")]
2019    pub url: Option<String>,
2020    /// If set this allows the request method to be overridden. Must not be set in response to an
2021    /// authChallenge.
2022
2023    #[serde(skip_serializing_if = "Option::is_none")]
2024    pub method: Option<String>,
2025    /// If set this allows postData to be set. Must not be set in response to an authChallenge.
2026
2027    #[serde(skip_serializing_if = "Option::is_none")]
2028    pub postData: Option<String>,
2029    /// If set this allows the request headers to be changed. Must not be set in response to an
2030    /// authChallenge.
2031
2032    #[serde(skip_serializing_if = "Option::is_none")]
2033    pub headers: Option<Headers>,
2034    /// Response to a requestIntercepted with an authChallenge. Must not be set otherwise.
2035
2036    #[serde(skip_serializing_if = "Option::is_none")]
2037    pub authChallengeResponse: Option<AuthChallengeResponse>,
2038}
2039
2040/// Deletes browser cookies with matching name and url or domain/path/partitionKey pair.
2041
2042#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2043#[serde(rename_all = "camelCase")]
2044pub struct DeleteCookiesParams {
2045    /// Name of the cookies to remove.
2046
2047    pub name: String,
2048    /// If specified, deletes all the cookies with the given name where domain and path match
2049    /// provided URL.
2050
2051    #[serde(skip_serializing_if = "Option::is_none")]
2052    pub url: Option<String>,
2053    /// If specified, deletes only cookies with the exact domain.
2054
2055    #[serde(skip_serializing_if = "Option::is_none")]
2056    pub domain: Option<String>,
2057    /// If specified, deletes only cookies with the exact path.
2058
2059    #[serde(skip_serializing_if = "Option::is_none")]
2060    pub path: Option<String>,
2061    /// If specified, deletes only cookies with the the given name and partitionKey where
2062    /// all partition key attributes match the cookie partition key attribute.
2063
2064    #[serde(skip_serializing_if = "Option::is_none")]
2065    pub partitionKey: Option<CookiePartitionKey>,
2066}
2067
2068/// Activates emulation of network conditions. This command is deprecated in favor of the emulateNetworkConditionsByRule
2069/// and overrideNetworkState commands, which can be used together to the same effect.
2070
2071#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2072#[serde(rename_all = "camelCase")]
2073pub struct EmulateNetworkConditionsParams {
2074    /// True to emulate internet disconnection.
2075
2076    pub offline: bool,
2077    /// Minimum latency from request sent to response headers received (ms).
2078
2079    pub latency: f64,
2080    /// Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.
2081
2082    pub downloadThroughput: f64,
2083    /// Maximal aggregated upload throughput (bytes/sec).  -1 disables upload throttling.
2084
2085    pub uploadThroughput: f64,
2086    /// Connection type if known.
2087
2088    #[serde(skip_serializing_if = "Option::is_none")]
2089    pub connectionType: Option<ConnectionType>,
2090    /// WebRTC packet loss (percent, 0-100). 0 disables packet loss emulation, 100 drops all the packets.
2091
2092    #[serde(skip_serializing_if = "Option::is_none")]
2093    pub packetLoss: Option<f64>,
2094    /// WebRTC packet queue length (packet). 0 removes any queue length limitations.
2095
2096    #[serde(skip_serializing_if = "Option::is_none")]
2097    pub packetQueueLength: Option<u64>,
2098    /// WebRTC packetReordering feature.
2099
2100    #[serde(skip_serializing_if = "Option::is_none")]
2101    pub packetReordering: Option<bool>,
2102}
2103
2104/// Activates emulation of network conditions for individual requests using URL match patterns. Unlike the deprecated
2105/// Network.emulateNetworkConditions this method does not affect 'navigator' state. Use Network.overrideNetworkState to
2106/// explicitly modify 'navigator' behavior.
2107
2108#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2109#[serde(rename_all = "camelCase")]
2110pub struct EmulateNetworkConditionsByRuleParams {
2111    /// True to emulate internet disconnection. Deprecated, use the offline property in matchedNetworkConditions
2112    /// or emulateOfflineServiceWorker instead.
2113
2114    #[serde(skip_serializing_if = "Option::is_none")]
2115    pub offline: Option<bool>,
2116    /// True to emulate offline service worker.
2117
2118    #[serde(skip_serializing_if = "Option::is_none")]
2119    pub emulateOfflineServiceWorker: Option<bool>,
2120    /// Configure conditions for matching requests. If multiple entries match a request, the first entry wins.  Global
2121    /// conditions can be configured by leaving the urlPattern for the conditions empty. These global conditions are
2122    /// also applied for throttling of p2p connections.
2123
2124    pub matchedNetworkConditions: Vec<NetworkConditions>,
2125}
2126
2127/// Activates emulation of network conditions for individual requests using URL match patterns. Unlike the deprecated
2128/// Network.emulateNetworkConditions this method does not affect 'navigator' state. Use Network.overrideNetworkState to
2129/// explicitly modify 'navigator' behavior.
2130
2131#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2132#[serde(rename_all = "camelCase")]
2133pub struct EmulateNetworkConditionsByRuleReturns {
2134    /// An id for each entry in matchedNetworkConditions. The id will be included in the requestWillBeSentExtraInfo for
2135    /// requests affected by a rule.
2136
2137    pub ruleIds: Vec<String>,
2138}
2139
2140/// Override the state of navigator.onLine and navigator.connection.
2141
2142#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2143#[serde(rename_all = "camelCase")]
2144pub struct OverrideNetworkStateParams {
2145    /// True to emulate internet disconnection.
2146
2147    pub offline: bool,
2148    /// Minimum latency from request sent to response headers received (ms).
2149
2150    pub latency: f64,
2151    /// Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.
2152
2153    pub downloadThroughput: f64,
2154    /// Maximal aggregated upload throughput (bytes/sec).  -1 disables upload throttling.
2155
2156    pub uploadThroughput: f64,
2157    /// Connection type if known.
2158
2159    #[serde(skip_serializing_if = "Option::is_none")]
2160    pub connectionType: Option<ConnectionType>,
2161}
2162
2163/// Enables network tracking, network events will now be delivered to the client.
2164
2165#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2166#[serde(rename_all = "camelCase")]
2167pub struct EnableParams {
2168    /// Buffer size in bytes to use when preserving network payloads (XHRs, etc).
2169    /// This is the maximum number of bytes that will be collected by this
2170    /// DevTools session.
2171
2172    #[serde(skip_serializing_if = "Option::is_none")]
2173    pub maxTotalBufferSize: Option<u64>,
2174    /// Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).
2175
2176    #[serde(skip_serializing_if = "Option::is_none")]
2177    pub maxResourceBufferSize: Option<u64>,
2178    /// Longest post body size (in bytes) that would be included in requestWillBeSent notification
2179
2180    #[serde(skip_serializing_if = "Option::is_none")]
2181    pub maxPostDataSize: Option<u64>,
2182    /// Whether DirectSocket chunk send/receive events should be reported.
2183
2184    #[serde(skip_serializing_if = "Option::is_none")]
2185    pub reportDirectSocketTraffic: Option<bool>,
2186    /// Enable storing response bodies outside of renderer, so that these survive
2187    /// a cross-process navigation. Requires maxTotalBufferSize to be set.
2188    /// Currently defaults to false. This field is being deprecated in favor of the dedicated
2189    /// configureDurableMessages command, due to the possibility of deadlocks when awaiting
2190    /// Network.enable before issuing Runtime.runIfWaitingForDebugger.
2191
2192    #[serde(skip_serializing_if = "Option::is_none")]
2193    pub enableDurableMessages: Option<bool>,
2194}
2195
2196/// Configures storing response bodies outside of renderer, so that these survive
2197/// a cross-process navigation.
2198/// If maxTotalBufferSize is not set, durable messages are disabled.
2199
2200#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2201#[serde(rename_all = "camelCase")]
2202pub struct ConfigureDurableMessagesParams {
2203    /// Buffer size in bytes to use when preserving network payloads (XHRs, etc).
2204
2205    #[serde(skip_serializing_if = "Option::is_none")]
2206    pub maxTotalBufferSize: Option<u64>,
2207    /// Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).
2208
2209    #[serde(skip_serializing_if = "Option::is_none")]
2210    pub maxResourceBufferSize: Option<u64>,
2211}
2212
2213/// Returns all browser cookies. Depending on the backend support, will return detailed cookie
2214/// information in the 'cookies' field.
2215/// Deprecated. Use Storage.getCookies instead.
2216
2217#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2218#[serde(rename_all = "camelCase")]
2219pub struct GetAllCookiesReturns {
2220    /// Array of cookie objects.
2221
2222    pub cookies: Vec<Cookie>,
2223}
2224
2225/// Returns the DER-encoded certificate.
2226
2227#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2228#[serde(rename_all = "camelCase")]
2229pub struct GetCertificateParams {
2230    /// Origin to get certificate for.
2231
2232    pub origin: String,
2233}
2234
2235/// Returns the DER-encoded certificate.
2236
2237#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2238#[serde(rename_all = "camelCase")]
2239pub struct GetCertificateReturns {
2240
2241    pub tableNames: Vec<String>,
2242}
2243
2244/// Returns all browser cookies for the current URL. Depending on the backend support, will return
2245/// detailed cookie information in the 'cookies' field.
2246
2247#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2248#[serde(rename_all = "camelCase")]
2249pub struct GetCookiesParams {
2250    /// The list of URLs for which applicable cookies will be fetched.
2251    /// If not specified, it's assumed to be set to the list containing
2252    /// the URLs of the page and all of its subframes.
2253
2254    #[serde(skip_serializing_if = "Option::is_none")]
2255    pub urls: Option<Vec<String>>,
2256}
2257
2258/// Returns all browser cookies for the current URL. Depending on the backend support, will return
2259/// detailed cookie information in the 'cookies' field.
2260
2261#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2262#[serde(rename_all = "camelCase")]
2263pub struct GetCookiesReturns {
2264    /// Array of cookie objects.
2265
2266    pub cookies: Vec<Cookie>,
2267}
2268
2269/// Returns content served for the given request.
2270
2271#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2272#[serde(rename_all = "camelCase")]
2273pub struct GetResponseBodyParams {
2274    /// Identifier of the network request to get content for.
2275
2276    pub requestId: RequestId,
2277}
2278
2279/// Returns content served for the given request.
2280
2281#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2282#[serde(rename_all = "camelCase")]
2283pub struct GetResponseBodyReturns {
2284    /// Response body.
2285
2286    pub body: String,
2287    /// True, if content was sent as base64.
2288
2289    pub base64Encoded: bool,
2290}
2291
2292/// Returns post data sent with the request. Returns an error when no data was sent with the request.
2293
2294#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2295#[serde(rename_all = "camelCase")]
2296pub struct GetRequestPostDataParams {
2297    /// Identifier of the network request to get content for.
2298
2299    pub requestId: RequestId,
2300}
2301
2302/// Returns post data sent with the request. Returns an error when no data was sent with the request.
2303
2304#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2305#[serde(rename_all = "camelCase")]
2306pub struct GetRequestPostDataReturns {
2307    /// Request body string, omitting files from multipart requests
2308
2309    pub postData: String,
2310    /// True, if content was sent as base64.
2311
2312    pub base64Encoded: bool,
2313}
2314
2315/// Returns content served for the given currently intercepted request.
2316
2317#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2318#[serde(rename_all = "camelCase")]
2319pub struct GetResponseBodyForInterceptionParams {
2320    /// Identifier for the intercepted request to get body for.
2321
2322    pub interceptionId: InterceptionId,
2323}
2324
2325/// Returns content served for the given currently intercepted request.
2326
2327#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2328#[serde(rename_all = "camelCase")]
2329pub struct GetResponseBodyForInterceptionReturns {
2330    /// Response body.
2331
2332    pub body: String,
2333    /// True, if content was sent as base64.
2334
2335    pub base64Encoded: bool,
2336}
2337
2338/// Returns a handle to the stream representing the response body. Note that after this command,
2339/// the intercepted request can't be continued as is -- you either need to cancel it or to provide
2340/// the response body. The stream only supports sequential read, IO.read will fail if the position
2341/// is specified.
2342
2343#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2344#[serde(rename_all = "camelCase")]
2345pub struct TakeResponseBodyForInterceptionAsStreamParams {
2346
2347    pub interceptionId: InterceptionId,
2348}
2349
2350/// Returns a handle to the stream representing the response body. Note that after this command,
2351/// the intercepted request can't be continued as is -- you either need to cancel it or to provide
2352/// the response body. The stream only supports sequential read, IO.read will fail if the position
2353/// is specified.
2354
2355#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2356#[serde(rename_all = "camelCase")]
2357pub struct TakeResponseBodyForInterceptionAsStreamReturns {
2358
2359    pub stream: crate::io::StreamHandle,
2360}
2361
2362/// This method sends a new XMLHttpRequest which is identical to the original one. The following
2363/// parameters should be identical: method, url, async, request body, extra headers, withCredentials
2364/// attribute, user, password.
2365
2366#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2367#[serde(rename_all = "camelCase")]
2368pub struct ReplayXHRParams {
2369    /// Identifier of XHR to replay.
2370
2371    pub requestId: RequestId,
2372}
2373
2374/// Searches for given string in response content.
2375
2376#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2377#[serde(rename_all = "camelCase")]
2378pub struct SearchInResponseBodyParams {
2379    /// Identifier of the network response to search.
2380
2381    pub requestId: RequestId,
2382    /// String to search for.
2383
2384    pub query: String,
2385    /// If true, search is case sensitive.
2386
2387    #[serde(skip_serializing_if = "Option::is_none")]
2388    pub caseSensitive: Option<bool>,
2389    /// If true, treats string parameter as regex.
2390
2391    #[serde(skip_serializing_if = "Option::is_none")]
2392    pub isRegex: Option<bool>,
2393}
2394
2395/// Searches for given string in response content.
2396
2397#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2398#[serde(rename_all = "camelCase")]
2399pub struct SearchInResponseBodyReturns {
2400    /// List of search matches.
2401
2402    pub result: Vec<crate::debugger::SearchMatch>,
2403}
2404
2405/// Blocks URLs from loading.
2406
2407#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2408#[serde(rename_all = "camelCase")]
2409pub struct SetBlockedURLsParams {
2410    /// Patterns to match in the order in which they are given. These patterns
2411    /// also take precedence over any wildcard patterns defined in 'urls'.
2412
2413    #[serde(skip_serializing_if = "Option::is_none")]
2414    pub urlPatterns: Option<Vec<BlockPattern>>,
2415    /// URL patterns to block. Wildcards ('*') are allowed.
2416
2417    #[serde(skip_serializing_if = "Option::is_none")]
2418    pub urls: Option<Vec<String>>,
2419}
2420
2421/// Toggles ignoring of service worker for each request.
2422
2423#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2424#[serde(rename_all = "camelCase")]
2425pub struct SetBypassServiceWorkerParams {
2426    /// Bypass service worker and load from network.
2427
2428    pub bypass: bool,
2429}
2430
2431/// Toggles ignoring cache for each request. If 'true', cache will not be used.
2432
2433#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2434#[serde(rename_all = "camelCase")]
2435pub struct SetCacheDisabledParams {
2436    /// Cache disabled state.
2437
2438    pub cacheDisabled: bool,
2439}
2440
2441/// Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.
2442
2443#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2444#[serde(rename_all = "camelCase")]
2445pub struct SetCookieParams {
2446    /// Cookie name.
2447
2448    pub name: String,
2449    /// Cookie value.
2450
2451    pub value: String,
2452    /// The request-URI to associate with the setting of the cookie. This value can affect the
2453    /// default domain, path, source port, and source scheme values of the created cookie.
2454
2455    #[serde(skip_serializing_if = "Option::is_none")]
2456    pub url: Option<String>,
2457    /// Cookie domain.
2458
2459    #[serde(skip_serializing_if = "Option::is_none")]
2460    pub domain: Option<String>,
2461    /// Cookie path.
2462
2463    #[serde(skip_serializing_if = "Option::is_none")]
2464    pub path: Option<String>,
2465    /// True if cookie is secure.
2466
2467    #[serde(skip_serializing_if = "Option::is_none")]
2468    pub secure: Option<bool>,
2469    /// True if cookie is http-only.
2470
2471    #[serde(skip_serializing_if = "Option::is_none")]
2472    pub httpOnly: Option<bool>,
2473    /// Cookie SameSite type.
2474
2475    #[serde(skip_serializing_if = "Option::is_none")]
2476    pub sameSite: Option<CookieSameSite>,
2477    /// Cookie expiration date, session cookie if not set
2478
2479    #[serde(skip_serializing_if = "Option::is_none")]
2480    pub expires: Option<TimeSinceEpoch>,
2481    /// Cookie Priority type.
2482
2483    #[serde(skip_serializing_if = "Option::is_none")]
2484    pub priority: Option<CookiePriority>,
2485    /// Cookie source scheme type.
2486
2487    #[serde(skip_serializing_if = "Option::is_none")]
2488    pub sourceScheme: Option<CookieSourceScheme>,
2489    /// Cookie source port. Valid values are {-1, \[1, 65535\]}, -1 indicates an unspecified port.
2490    /// An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
2491    /// This is a temporary ability and it will be removed in the future.
2492
2493    #[serde(skip_serializing_if = "Option::is_none")]
2494    pub sourcePort: Option<i64>,
2495    /// Cookie partition key. If not set, the cookie will be set as not partitioned.
2496
2497    #[serde(skip_serializing_if = "Option::is_none")]
2498    pub partitionKey: Option<CookiePartitionKey>,
2499}
2500
2501/// Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.
2502
2503#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2504#[serde(rename_all = "camelCase")]
2505pub struct SetCookieReturns {
2506    /// Always set to true. If an error occurs, the response indicates protocol error.
2507
2508    pub success: bool,
2509}
2510
2511/// Sets given cookies.
2512
2513#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2514#[serde(rename_all = "camelCase")]
2515pub struct SetCookiesParams {
2516    /// Cookies to be set.
2517
2518    pub cookies: Vec<CookieParam>,
2519}
2520
2521/// Specifies whether to always send extra HTTP headers with the requests from this page.
2522
2523#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2524#[serde(rename_all = "camelCase")]
2525pub struct SetExtraHTTPHeadersParams {
2526    /// Map with extra HTTP headers.
2527
2528    pub headers: Headers,
2529}
2530
2531/// Specifies whether to attach a page script stack id in requests
2532
2533#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2534#[serde(rename_all = "camelCase")]
2535pub struct SetAttachDebugStackParams {
2536    /// Whether to attach a page script stack for debugging purpose.
2537
2538    pub enabled: bool,
2539}
2540
2541/// Sets the requests to intercept that match the provided patterns and optionally resource types.
2542/// Deprecated, please use Fetch.enable instead.
2543
2544#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2545#[serde(rename_all = "camelCase")]
2546pub struct SetRequestInterceptionParams {
2547    /// Requests matching any of these patterns will be forwarded and wait for the corresponding
2548    /// continueInterceptedRequest call.
2549
2550    pub patterns: Vec<RequestPattern>,
2551}
2552
2553/// Allows overriding user agent with the given string.
2554
2555#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2556#[serde(rename_all = "camelCase")]
2557pub struct SetUserAgentOverrideParams {
2558    /// User agent to use.
2559
2560    pub userAgent: String,
2561    /// Browser language to emulate.
2562
2563    #[serde(skip_serializing_if = "Option::is_none")]
2564    pub acceptLanguage: Option<String>,
2565    /// The platform navigator.platform should return.
2566
2567    #[serde(skip_serializing_if = "Option::is_none")]
2568    pub platform: Option<String>,
2569    /// To be sent in Sec-CH-UA-* headers and returned in navigator.userAgentData
2570
2571    #[serde(skip_serializing_if = "Option::is_none")]
2572    pub userAgentMetadata: Option<crate::emulation::UserAgentMetadata>,
2573}
2574
2575/// Enables streaming of the response for the given requestId.
2576/// If enabled, the dataReceived event contains the data that was received during streaming.
2577
2578#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2579#[serde(rename_all = "camelCase")]
2580pub struct StreamResourceContentParams {
2581    /// Identifier of the request to stream.
2582
2583    pub requestId: RequestId,
2584}
2585
2586/// Enables streaming of the response for the given requestId.
2587/// If enabled, the dataReceived event contains the data that was received during streaming.
2588
2589#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2590#[serde(rename_all = "camelCase")]
2591pub struct StreamResourceContentReturns {
2592    /// Data that has been buffered until streaming is enabled. (Encoded as a base64 string when passed over JSON)
2593
2594    pub bufferedData: String,
2595}
2596
2597/// Returns information about the COEP/COOP isolation status.
2598
2599#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2600#[serde(rename_all = "camelCase")]
2601pub struct GetSecurityIsolationStatusParams {
2602    /// If no frameId is provided, the status of the target is provided.
2603
2604    #[serde(skip_serializing_if = "Option::is_none")]
2605    pub frameId: Option<crate::page::FrameId>,
2606}
2607
2608/// Returns information about the COEP/COOP isolation status.
2609
2610#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2611#[serde(rename_all = "camelCase")]
2612pub struct GetSecurityIsolationStatusReturns {
2613
2614    pub status: SecurityIsolationStatus,
2615}
2616
2617/// Enables tracking for the Reporting API, events generated by the Reporting API will now be delivered to the client.
2618/// Enabling triggers 'reportingApiReportAdded' for all existing reports.
2619
2620#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2621#[serde(rename_all = "camelCase")]
2622pub struct EnableReportingApiParams {
2623    /// Whether to enable or disable events for the Reporting API
2624
2625    pub enable: bool,
2626}
2627
2628/// Sets up tracking device bound sessions and fetching of initial set of sessions.
2629
2630#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2631#[serde(rename_all = "camelCase")]
2632pub struct EnableDeviceBoundSessionsParams {
2633    /// Whether to enable or disable events.
2634
2635    pub enable: bool,
2636}
2637
2638/// Deletes a device bound session.
2639
2640#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2641#[serde(rename_all = "camelCase")]
2642pub struct DeleteDeviceBoundSessionParams {
2643
2644    pub key: DeviceBoundSessionKey,
2645}
2646
2647/// Fetches the schemeful site for a specific origin.
2648
2649#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2650#[serde(rename_all = "camelCase")]
2651pub struct FetchSchemefulSiteParams {
2652    /// The URL origin.
2653
2654    pub origin: String,
2655}
2656
2657/// Fetches the schemeful site for a specific origin.
2658
2659#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2660#[serde(rename_all = "camelCase")]
2661pub struct FetchSchemefulSiteReturns {
2662    /// The corresponding schemeful site.
2663
2664    pub schemefulSite: String,
2665}
2666
2667/// Fetches the resource and returns the content.
2668
2669#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2670#[serde(rename_all = "camelCase")]
2671pub struct LoadNetworkResourceParams {
2672    /// Frame id to get the resource for. Mandatory for frame targets, and
2673    /// should be omitted for worker targets.
2674
2675    #[serde(skip_serializing_if = "Option::is_none")]
2676    pub frameId: Option<crate::page::FrameId>,
2677    /// URL of the resource to get content for.
2678
2679    pub url: String,
2680    /// Options for the request.
2681
2682    pub options: LoadNetworkResourceOptions,
2683}
2684
2685/// Fetches the resource and returns the content.
2686
2687#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2688#[serde(rename_all = "camelCase")]
2689pub struct LoadNetworkResourceReturns {
2690
2691    pub resource: LoadNetworkResourcePageResult,
2692}
2693
2694/// Sets Controls for third-party cookie access
2695/// Page reload is required before the new cookie behavior will be observed
2696
2697#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2698#[serde(rename_all = "camelCase")]
2699pub struct SetCookieControlsParams {
2700    /// Whether 3pc restriction is enabled.
2701
2702    pub enableThirdPartyCookieRestriction: bool,
2703}