// components/services/storage/public/mojom/session_storage_control.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 {
  SessionStorageNamespaceRemote as blink_mojom_SessionStorageNamespaceRemote,
  SessionStorageNamespacePendingReceiver as blink_mojom_SessionStorageNamespacePendingReceiver
} from '../../../../../third_party/blink/public/mojom/dom_storage/session_storage_namespace.mojom.m.js';

import {
  StorageAreaRemote as blink_mojom_StorageAreaRemote,
  StorageAreaPendingReceiver as blink_mojom_StorageAreaPendingReceiver
} from '../../../../../third_party/blink/public/mojom/dom_storage/storage_area.mojom.m.js';

import {
  StorageKey as blink_mojom_StorageKey,
  StorageKeySpec as blink_mojom_StorageKeySpec
} from '../../../../../third_party/blink/public/mojom/storage_key/storage_key.mojom.m.js';


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

/**
 * @enum {number}
 */
export const SessionStorageCloneType = {
  
  kImmediate: 0,
  kWaitForCloneOnNamespace: 1,
  MIN_VALUE: 0,
  MAX_VALUE: 1,
};



/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 */
export class SessionStorageControlPendingReceiver {
  /**
   * @param {!MojoHandle|!mojo.internal.interfaceSupport.Endpoint} handle
   */
  constructor(handle) {
    /** @public {!mojo.internal.interfaceSupport.Endpoint} */
    this.handle = mojo.internal.interfaceSupport.getEndpointForReceiver(handle);
  }

  /** @param {string=} scope */
  bindInBrowser(scope = 'context') {
    mojo.internal.interfaceSupport.bind(
        this.handle, 'storage.mojom.SessionStorageControl', scope);
  }
}

/** @interface */
export class SessionStorageControlInterface {
  
  /**
   * @param { !string } namespaceId
   * @param { !blink_mojom_SessionStorageNamespacePendingReceiver } receiver
   * @return {!Promise<{
        success: !boolean,
   *  }>}
   */

  bindNamespace(namespaceId, receiver) {}
  
  /**
   * @param { !blink_mojom_StorageKey } storageKey
   * @param { !string } namespaceId
   * @param { !blink_mojom_StorageAreaPendingReceiver } receiver
   * @return {!Promise<{
        success: !boolean,
   *  }>}
   */

  bindStorageArea(storageKey, namespaceId, receiver) {}
  
  /**
   * @return {!Promise<{
        info: !Array<!SessionStorageUsageInfo>,
   *  }>}
   */

  getUsage() {}
  
  /**
   * @param { !blink_mojom_StorageKey } storageKey
   * @param { !string } namespaceId
   * @return {!Promise}
   */

  deleteStorage(storageKey, namespaceId) {}
  
  /**
   * @return {!Promise}
   */

  cleanUpStorage() {}
  
  /**
   * @return {!Promise}
   */

  scavengeUnusedNamespaces() {}
  
  /**
   * @return {!Promise}
   */

  flush() {}
  
  /**
   */

  purgeMemory() {}
  
  /**
   * @param { !string } namespaceId
   */

  createNamespace(namespaceId) {}
  
  /**
   * @param { !string } namespaceIdToClone
   * @param { !string } cloneNamespaceId
   * @param { !SessionStorageCloneType } cloneType
   */

  cloneNamespace(namespaceIdToClone, cloneNamespaceId, cloneType) {}
  
  /**
   * @param { !string } namespaceId
   * @param { !boolean } shouldPersist
   */

  deleteNamespace(namespaceId, shouldPersist) {}
}

/**
 * @implements { SessionStorageControlInterface }
 */
export class SessionStorageControlRemote {
  /** @param {MojoHandle|mojo.internal.interfaceSupport.Endpoint=} handle */
  constructor(handle = undefined) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!SessionStorageControlPendingReceiver>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          SessionStorageControlPendingReceiver,
          handle);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper<!SessionStorageControlPendingReceiver>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper(this.proxy);

    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.proxy.getConnectionErrorEventRouter();
  }

  
  /**
   * @param { !string } namespaceId
   * @param { !blink_mojom_SessionStorageNamespacePendingReceiver } receiver
   * @return {!Promise<{
        success: !boolean,
   *  }>}
   */

  bindNamespace(
      namespaceId,
      receiver) {
    return this.proxy.sendMessage(
        2095849880,
        SessionStorageControl_BindNamespace_ParamsSpec.$,
        SessionStorageControl_BindNamespace_ResponseParamsSpec.$,
        [
          namespaceId,
          receiver
        ]);
  }

  
  /**
   * @param { !blink_mojom_StorageKey } storageKey
   * @param { !string } namespaceId
   * @param { !blink_mojom_StorageAreaPendingReceiver } receiver
   * @return {!Promise<{
        success: !boolean,
   *  }>}
   */

  bindStorageArea(
      storageKey,
      namespaceId,
      receiver) {
    return this.proxy.sendMessage(
        2098188176,
        SessionStorageControl_BindStorageArea_ParamsSpec.$,
        SessionStorageControl_BindStorageArea_ResponseParamsSpec.$,
        [
          storageKey,
          namespaceId,
          receiver
        ]);
  }

  
  /**
   * @return {!Promise<{
        info: !Array<!SessionStorageUsageInfo>,
   *  }>}
   */

  getUsage() {
    return this.proxy.sendMessage(
        105839110,
        SessionStorageControl_GetUsage_ParamsSpec.$,
        SessionStorageControl_GetUsage_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   * @param { !blink_mojom_StorageKey } storageKey
   * @param { !string } namespaceId
   * @return {!Promise}
   */

  deleteStorage(
      storageKey,
      namespaceId) {
    return this.proxy.sendMessage(
        974240947,
        SessionStorageControl_DeleteStorage_ParamsSpec.$,
        SessionStorageControl_DeleteStorage_ResponseParamsSpec.$,
        [
          storageKey,
          namespaceId
        ]);
  }

  
  /**
   * @return {!Promise}
   */

  cleanUpStorage() {
    return this.proxy.sendMessage(
        158646174,
        SessionStorageControl_CleanUpStorage_ParamsSpec.$,
        SessionStorageControl_CleanUpStorage_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   * @return {!Promise}
   */

  scavengeUnusedNamespaces() {
    return this.proxy.sendMessage(
        1147411331,
        SessionStorageControl_ScavengeUnusedNamespaces_ParamsSpec.$,
        SessionStorageControl_ScavengeUnusedNamespaces_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   * @return {!Promise}
   */

  flush() {
    return this.proxy.sendMessage(
        1728259503,
        SessionStorageControl_Flush_ParamsSpec.$,
        SessionStorageControl_Flush_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   */

  purgeMemory() {
    this.proxy.sendMessage(
        1765730181,
        SessionStorageControl_PurgeMemory_ParamsSpec.$,
        null,
        [
        ]);
  }

  
  /**
   * @param { !string } namespaceId
   */

  createNamespace(
      namespaceId) {
    this.proxy.sendMessage(
        1429595598,
        SessionStorageControl_CreateNamespace_ParamsSpec.$,
        null,
        [
          namespaceId
        ]);
  }

  
  /**
   * @param { !string } namespaceIdToClone
   * @param { !string } cloneNamespaceId
   * @param { !SessionStorageCloneType } cloneType
   */

  cloneNamespace(
      namespaceIdToClone,
      cloneNamespaceId,
      cloneType) {
    this.proxy.sendMessage(
        1802979580,
        SessionStorageControl_CloneNamespace_ParamsSpec.$,
        null,
        [
          namespaceIdToClone,
          cloneNamespaceId,
          cloneType
        ]);
  }

  
  /**
   * @param { !string } namespaceId
   * @param { !boolean } shouldPersist
   */

  deleteNamespace(
      namespaceId,
      shouldPersist) {
    this.proxy.sendMessage(
        1538719207,
        SessionStorageControl_DeleteNamespace_ParamsSpec.$,
        null,
        [
          namespaceId,
          shouldPersist
        ]);
  }
}

/**
 * An object which receives request messages for the SessionStorageControl
 * mojom interface. Must be constructed over an object which implements that
 * interface.
 */
export class SessionStorageControlReceiver {
  /**
   * @param {!SessionStorageControlInterface } impl
   */
  constructor(impl) {
    /** @private {!mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal<!SessionStorageControlRemote>} */
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
        SessionStorageControlRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!SessionStorageControlRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);


    this.helper_internal_.registerHandler(
        2095849880,
        SessionStorageControl_BindNamespace_ParamsSpec.$,
        SessionStorageControl_BindNamespace_ResponseParamsSpec.$,
        impl.bindNamespace.bind(impl));
    this.helper_internal_.registerHandler(
        2098188176,
        SessionStorageControl_BindStorageArea_ParamsSpec.$,
        SessionStorageControl_BindStorageArea_ResponseParamsSpec.$,
        impl.bindStorageArea.bind(impl));
    this.helper_internal_.registerHandler(
        105839110,
        SessionStorageControl_GetUsage_ParamsSpec.$,
        SessionStorageControl_GetUsage_ResponseParamsSpec.$,
        impl.getUsage.bind(impl));
    this.helper_internal_.registerHandler(
        974240947,
        SessionStorageControl_DeleteStorage_ParamsSpec.$,
        SessionStorageControl_DeleteStorage_ResponseParamsSpec.$,
        impl.deleteStorage.bind(impl));
    this.helper_internal_.registerHandler(
        158646174,
        SessionStorageControl_CleanUpStorage_ParamsSpec.$,
        SessionStorageControl_CleanUpStorage_ResponseParamsSpec.$,
        impl.cleanUpStorage.bind(impl));
    this.helper_internal_.registerHandler(
        1147411331,
        SessionStorageControl_ScavengeUnusedNamespaces_ParamsSpec.$,
        SessionStorageControl_ScavengeUnusedNamespaces_ResponseParamsSpec.$,
        impl.scavengeUnusedNamespaces.bind(impl));
    this.helper_internal_.registerHandler(
        1728259503,
        SessionStorageControl_Flush_ParamsSpec.$,
        SessionStorageControl_Flush_ResponseParamsSpec.$,
        impl.flush.bind(impl));
    this.helper_internal_.registerHandler(
        1765730181,
        SessionStorageControl_PurgeMemory_ParamsSpec.$,
        null,
        impl.purgeMemory.bind(impl));
    this.helper_internal_.registerHandler(
        1429595598,
        SessionStorageControl_CreateNamespace_ParamsSpec.$,
        null,
        impl.createNamespace.bind(impl));
    this.helper_internal_.registerHandler(
        1802979580,
        SessionStorageControl_CloneNamespace_ParamsSpec.$,
        null,
        impl.cloneNamespace.bind(impl));
    this.helper_internal_.registerHandler(
        1538719207,
        SessionStorageControl_DeleteNamespace_ParamsSpec.$,
        null,
        impl.deleteNamespace.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
}

export class SessionStorageControl {
  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "storage.mojom.SessionStorageControl";
  }

  /**
   * Returns a remote for this interface which sends messages to the browser.
   * The browser must have an interface request binder registered for this
   * interface and accessible to the calling document's frame.
   *
   * @return {!SessionStorageControlRemote}
   */
  static getRemote() {
    let remote = new SessionStorageControlRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
}


/**
 * An object which receives request messages for the SessionStorageControl
 * mojom interface and dispatches them as callbacks. One callback receiver exists
 * on this object for each message defined in the mojom interface, and each
 * receiver can have any number of listeners added to it.
 */
export class SessionStorageControlCallbackRouter {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      SessionStorageControlRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!SessionStorageControlRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);

    this.router_ = new mojo.internal.interfaceSupport.CallbackRouter;

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.bindNamespace =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2095849880,
        SessionStorageControl_BindNamespace_ParamsSpec.$,
        SessionStorageControl_BindNamespace_ResponseParamsSpec.$,
        this.bindNamespace.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.bindStorageArea =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2098188176,
        SessionStorageControl_BindStorageArea_ParamsSpec.$,
        SessionStorageControl_BindStorageArea_ResponseParamsSpec.$,
        this.bindStorageArea.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.getUsage =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        105839110,
        SessionStorageControl_GetUsage_ParamsSpec.$,
        SessionStorageControl_GetUsage_ResponseParamsSpec.$,
        this.getUsage.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.deleteStorage =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        974240947,
        SessionStorageControl_DeleteStorage_ParamsSpec.$,
        SessionStorageControl_DeleteStorage_ResponseParamsSpec.$,
        this.deleteStorage.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.cleanUpStorage =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        158646174,
        SessionStorageControl_CleanUpStorage_ParamsSpec.$,
        SessionStorageControl_CleanUpStorage_ResponseParamsSpec.$,
        this.cleanUpStorage.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.scavengeUnusedNamespaces =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1147411331,
        SessionStorageControl_ScavengeUnusedNamespaces_ParamsSpec.$,
        SessionStorageControl_ScavengeUnusedNamespaces_ResponseParamsSpec.$,
        this.scavengeUnusedNamespaces.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.flush =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1728259503,
        SessionStorageControl_Flush_ParamsSpec.$,
        SessionStorageControl_Flush_ResponseParamsSpec.$,
        this.flush.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.purgeMemory =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1765730181,
        SessionStorageControl_PurgeMemory_ParamsSpec.$,
        null,
        this.purgeMemory.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.createNamespace =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1429595598,
        SessionStorageControl_CreateNamespace_ParamsSpec.$,
        null,
        this.createNamespace.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.cloneNamespace =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1802979580,
        SessionStorageControl_CloneNamespace_ParamsSpec.$,
        null,
        this.cloneNamespace.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.deleteNamespace =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1538719207,
        SessionStorageControl_DeleteNamespace_ParamsSpec.$,
        null,
        this.deleteNamespace.createReceiverHandler(false /* expectsResponse */));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * @param {number} id An ID returned by a prior call to addListener.
   * @return {boolean} True iff the identified listener was found and removed.
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




mojo.internal.Struct(
    SessionStorageUsageInfoSpec.$,
    'SessionStorageUsageInfo',
    [
      mojo.internal.StructField(
        'storageKey', 0,
        0,
        blink_mojom_StorageKeySpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'namespaceId', 8,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 24],]);



/**
 * @record
 */
export class SessionStorageUsageInfo {
  constructor() {
    /** @type { !blink_mojom_StorageKey } */
    this.storageKey;
    /** @type { !string } */
    this.namespaceId;
  }
}



mojo.internal.Struct(
    SessionStorageControl_BindNamespace_ParamsSpec.$,
    'SessionStorageControl_BindNamespace_Params',
    [
      mojo.internal.StructField(
        'namespaceId', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'receiver', 8,
        0,
        mojo.internal.InterfaceRequest(blink_mojom_SessionStorageNamespacePendingReceiver),
        null,
        false /* nullable */,
        0),
    ],
    [[0, 24],]);



/**
 * @record
 */
export class SessionStorageControl_BindNamespace_Params {
  constructor() {
    /** @type { !string } */
    this.namespaceId;
    /** @type { !blink_mojom_SessionStorageNamespacePendingReceiver } */
    this.receiver;
  }
}



mojo.internal.Struct(
    SessionStorageControl_BindNamespace_ResponseParamsSpec.$,
    'SessionStorageControl_BindNamespace_ResponseParams',
    [
      mojo.internal.StructField(
        'success', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class SessionStorageControl_BindNamespace_ResponseParams {
  constructor() {
    /** @type { !boolean } */
    this.success;
  }
}



mojo.internal.Struct(
    SessionStorageControl_BindStorageArea_ParamsSpec.$,
    'SessionStorageControl_BindStorageArea_Params',
    [
      mojo.internal.StructField(
        'storageKey', 0,
        0,
        blink_mojom_StorageKeySpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'namespaceId', 8,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'receiver', 16,
        0,
        mojo.internal.InterfaceRequest(blink_mojom_StorageAreaPendingReceiver),
        null,
        false /* nullable */,
        0),
    ],
    [[0, 32],]);



/**
 * @record
 */
export class SessionStorageControl_BindStorageArea_Params {
  constructor() {
    /** @type { !blink_mojom_StorageKey } */
    this.storageKey;
    /** @type { !string } */
    this.namespaceId;
    /** @type { !blink_mojom_StorageAreaPendingReceiver } */
    this.receiver;
  }
}



mojo.internal.Struct(
    SessionStorageControl_BindStorageArea_ResponseParamsSpec.$,
    'SessionStorageControl_BindStorageArea_ResponseParams',
    [
      mojo.internal.StructField(
        'success', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class SessionStorageControl_BindStorageArea_ResponseParams {
  constructor() {
    /** @type { !boolean } */
    this.success;
  }
}



mojo.internal.Struct(
    SessionStorageControl_GetUsage_ParamsSpec.$,
    'SessionStorageControl_GetUsage_Params',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_GetUsage_Params {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_GetUsage_ResponseParamsSpec.$,
    'SessionStorageControl_GetUsage_ResponseParams',
    [
      mojo.internal.StructField(
        'info', 0,
        0,
        mojo.internal.Array(SessionStorageUsageInfoSpec.$, false),
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class SessionStorageControl_GetUsage_ResponseParams {
  constructor() {
    /** @type { !Array<!SessionStorageUsageInfo> } */
    this.info;
  }
}



mojo.internal.Struct(
    SessionStorageControl_DeleteStorage_ParamsSpec.$,
    'SessionStorageControl_DeleteStorage_Params',
    [
      mojo.internal.StructField(
        'storageKey', 0,
        0,
        blink_mojom_StorageKeySpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'namespaceId', 8,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 24],]);



/**
 * @record
 */
export class SessionStorageControl_DeleteStorage_Params {
  constructor() {
    /** @type { !blink_mojom_StorageKey } */
    this.storageKey;
    /** @type { !string } */
    this.namespaceId;
  }
}



mojo.internal.Struct(
    SessionStorageControl_DeleteStorage_ResponseParamsSpec.$,
    'SessionStorageControl_DeleteStorage_ResponseParams',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_DeleteStorage_ResponseParams {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_CleanUpStorage_ParamsSpec.$,
    'SessionStorageControl_CleanUpStorage_Params',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_CleanUpStorage_Params {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_CleanUpStorage_ResponseParamsSpec.$,
    'SessionStorageControl_CleanUpStorage_ResponseParams',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_CleanUpStorage_ResponseParams {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_ScavengeUnusedNamespaces_ParamsSpec.$,
    'SessionStorageControl_ScavengeUnusedNamespaces_Params',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_ScavengeUnusedNamespaces_Params {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_ScavengeUnusedNamespaces_ResponseParamsSpec.$,
    'SessionStorageControl_ScavengeUnusedNamespaces_ResponseParams',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_ScavengeUnusedNamespaces_ResponseParams {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_Flush_ParamsSpec.$,
    'SessionStorageControl_Flush_Params',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_Flush_Params {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_Flush_ResponseParamsSpec.$,
    'SessionStorageControl_Flush_ResponseParams',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_Flush_ResponseParams {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_PurgeMemory_ParamsSpec.$,
    'SessionStorageControl_PurgeMemory_Params',
    [
    ],
    [[0, 8],]);



/**
 * @record
 */
export class SessionStorageControl_PurgeMemory_Params {
  constructor() {
  }
}



mojo.internal.Struct(
    SessionStorageControl_CreateNamespace_ParamsSpec.$,
    'SessionStorageControl_CreateNamespace_Params',
    [
      mojo.internal.StructField(
        'namespaceId', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class SessionStorageControl_CreateNamespace_Params {
  constructor() {
    /** @type { !string } */
    this.namespaceId;
  }
}



mojo.internal.Struct(
    SessionStorageControl_CloneNamespace_ParamsSpec.$,
    'SessionStorageControl_CloneNamespace_Params',
    [
      mojo.internal.StructField(
        'namespaceIdToClone', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'cloneNamespaceId', 8,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'cloneType', 16,
        0,
        SessionStorageCloneTypeSpec.$,
        0,
        false /* nullable */,
        0),
    ],
    [[0, 32],]);



/**
 * @record
 */
export class SessionStorageControl_CloneNamespace_Params {
  constructor() {
    /** @type { !string } */
    this.namespaceIdToClone;
    /** @type { !string } */
    this.cloneNamespaceId;
    /** @type { !SessionStorageCloneType } */
    this.cloneType;
  }
}



mojo.internal.Struct(
    SessionStorageControl_DeleteNamespace_ParamsSpec.$,
    'SessionStorageControl_DeleteNamespace_Params',
    [
      mojo.internal.StructField(
        'namespaceId', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'shouldPersist', 8,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 24],]);



/**
 * @record
 */
export class SessionStorageControl_DeleteNamespace_Params {
  constructor() {
    /** @type { !string } */
    this.namespaceId;
    /** @type { !boolean } */
    this.shouldPersist;
  }
}

