// services/network/public/mojom/parsed_headers.mojom.m.js is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {mojo} from '../../../../mojo/public/js/bindings.js';

import {
  ContentSecurityPolicy as network_mojom_ContentSecurityPolicy,
  ContentSecurityPolicySpec as network_mojom_ContentSecurityPolicySpec,
  AllowCSPFromHeaderValue as network_mojom_AllowCSPFromHeaderValue,
  AllowCSPFromHeaderValueSpec as network_mojom_AllowCSPFromHeaderValueSpec
} from './content_security_policy.mojom.m.js';

import {
  CrossOriginEmbedderPolicy as network_mojom_CrossOriginEmbedderPolicy,
  CrossOriginEmbedderPolicySpec as network_mojom_CrossOriginEmbedderPolicySpec
} from './cross_origin_embedder_policy.mojom.m.js';

import {
  CrossOriginOpenerPolicy as network_mojom_CrossOriginOpenerPolicy,
  CrossOriginOpenerPolicySpec as network_mojom_CrossOriginOpenerPolicySpec
} from './cross_origin_opener_policy.mojom.m.js';

import {
  LinkHeader as network_mojom_LinkHeader,
  LinkHeaderSpec as network_mojom_LinkHeaderSpec
} from './link_header.mojom.m.js';

import {
  TimingAllowOrigin as network_mojom_TimingAllowOrigin,
  TimingAllowOriginSpec as network_mojom_TimingAllowOriginSpec
} from './timing_allow_origin.mojom.m.js';

import {
  WebClientHintsType as network_mojom_WebClientHintsType,
  WebClientHintsTypeSpec as network_mojom_WebClientHintsTypeSpec
} from './web_client_hints_types.mojom.m.js';

import {
  XFrameOptionsValue as network_mojom_XFrameOptionsValue,
  XFrameOptionsValueSpec as network_mojom_XFrameOptionsValueSpec
} from './x_frame_options.mojom.m.js';


/**
 * @const { {$: !mojo.internal.MojomType} }
 */
export const OriginAgentClusterValueSpec = { $: mojo.internal.Enum() };

/**
 * @enum {number}
 */
export const OriginAgentClusterValue = {
  
  kAbsent: 0,
  kTrue: 1,
  kFalse: 2,
  MIN_VALUE: 0,
  MAX_VALUE: 2,
};


/**
 * @const { {$:!mojo.internal.MojomType}}
 */
export const ParsedHeadersSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };




mojo.internal.Struct(
    ParsedHeadersSpec.$,
    'ParsedHeaders',
    [
      mojo.internal.StructField(
        'contentSecurityPolicy', 0,
        0,
        mojo.internal.Array(network_mojom_ContentSecurityPolicySpec.$, false),
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'allowCspFrom', 8,
        0,
        network_mojom_AllowCSPFromHeaderValueSpec.$,
        null,
        true /* nullable */,
        0),
      mojo.internal.StructField(
        'crossOriginEmbedderPolicy', 24,
        0,
        network_mojom_CrossOriginEmbedderPolicySpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'crossOriginOpenerPolicy', 32,
        0,
        network_mojom_CrossOriginOpenerPolicySpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'originAgentCluster', 40,
        0,
        OriginAgentClusterValueSpec.$,
        0,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'acceptCh', 48,
        0,
        mojo.internal.Array(network_mojom_WebClientHintsTypeSpec.$, false),
        null,
        true /* nullable */,
        0),
      mojo.internal.StructField(
        'criticalCh', 56,
        0,
        mojo.internal.Array(network_mojom_WebClientHintsTypeSpec.$, false),
        null,
        true /* nullable */,
        0),
      mojo.internal.StructField(
        'xfo', 44,
        0,
        network_mojom_XFrameOptionsValueSpec.$,
        network_mojom_XFrameOptionsValue.kNone,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'linkHeaders', 64,
        0,
        mojo.internal.Array(network_mojom_LinkHeaderSpec.$, false),
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'timingAllowOrigin', 72,
        0,
        network_mojom_TimingAllowOriginSpec.$,
        null,
        true /* nullable */,
        0),
      mojo.internal.StructField(
        'bfcacheOptInUnload', 88,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'reportingEndpoints', 96,
        0,
        mojo.internal.Map(mojo.internal.String, mojo.internal.String, false),
        null,
        true /* nullable */,
        0),
    ],
    [[0, 112],]);



/**
 * @record
 */
export class ParsedHeaders {
  constructor() {
    /** @type { !Array<!network_mojom_ContentSecurityPolicy> } */
    this.contentSecurityPolicy;
    /** @type { (network_mojom_AllowCSPFromHeaderValue|undefined) } */
    this.allowCspFrom;
    /** @type { !network_mojom_CrossOriginEmbedderPolicy } */
    this.crossOriginEmbedderPolicy;
    /** @type { !network_mojom_CrossOriginOpenerPolicy } */
    this.crossOriginOpenerPolicy;
    /** @type { !OriginAgentClusterValue } */
    this.originAgentCluster;
    /** @type { !network_mojom_XFrameOptionsValue } */
    this.xfo;
    /** @type { (Array<!network_mojom_WebClientHintsType>|undefined) } */
    this.acceptCh;
    /** @type { (Array<!network_mojom_WebClientHintsType>|undefined) } */
    this.criticalCh;
    /** @type { !Array<!network_mojom_LinkHeader> } */
    this.linkHeaders;
    /** @type { (network_mojom_TimingAllowOrigin|undefined) } */
    this.timingAllowOrigin;
    /** @type { !boolean } */
    this.bfcacheOptInUnload;
    /** @type { (Object<!string, !string>|undefined) } */
    this.reportingEndpoints;
  }
}

