// Copyright 2018 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.
'use strict';

goog.require('mojo.internal');
goog.require('mojo.internal.interfaceSupport');








goog.provide('downloads.mojom.PageHandlerFactory');
goog.provide('downloads.mojom.PageHandlerFactoryCallbackRouter');
goog.provide('downloads.mojom.PageHandlerFactoryInterface');
goog.provide('downloads.mojom.PageHandlerFactoryProxy');
goog.provide('downloads.mojom.PageHandlerFactoryRequest');


/** @export */
downloads.mojom.PageHandlerFactoryRequest = class {
  /** @param {!MojoHandle} handle */
  constructor(handle) {
    /** @public {!MojoHandle} */
    this.handle = handle;
  }
};

/** @interface */
downloads.mojom.PageHandlerFactoryInterface = class {
  
  /**
   * @param { !downloads.mojom.PageProxy } page
   * @param { !downloads.mojom.PageHandlerRequest } handler
   */

  createPageHandler(page, handler) {}
};

/**
 * @export
 * @implements { downloads.mojom.PageHandlerFactoryInterface }
 */
downloads.mojom.PageHandlerFactoryProxy = class {
  /** @param {MojoHandle=} opt_handle */
  constructor(opt_handle) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!downloads.mojom.PageHandlerFactoryRequest>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          downloads.mojom.PageHandlerFactoryRequest,
          opt_handle);

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

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

  
  /**
   * @param { !downloads.mojom.PageProxy } page
   * @param { !downloads.mojom.PageHandlerRequest } handler
   */

  createPageHandler(
      page,
      handler) {
    this.proxy.sendMessage(
        679185176,
        downloads.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$,
        null,
        [
          page,
          handler
        ]);
  }
};

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

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


    this.helper_internal_.registerHandler(
        679185176,
        downloads.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$,
        null,
        impl.createPageHandler.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * Returns a proxy 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 {!downloads.mojom.PageHandlerFactoryProxy}
   * @export
   */
  static getProxy() {
    let proxy = new downloads.mojom.PageHandlerFactoryProxy;
    Mojo.bindInterface('downloads.mojom.PageHandlerFactory',
                       proxy.$.bindNewPipeAndPassReceiver().handle);
    return proxy;
  }

  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "downloads.mojom.PageHandlerFactory";
  }
  
};




/**
 * An object which receives request messages for the PageHandlerFactory
 * 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
 */
downloads.mojom.PageHandlerFactoryCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      downloads.mojom.PageHandlerFactoryProxy);

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

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

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

    this.helper_internal_.registerHandler(
        679185176,
        downloads.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$,
        null,
        this.createPageHandler.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.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};



goog.provide('downloads.mojom.PageHandler');
goog.provide('downloads.mojom.PageHandlerCallbackRouter');
goog.provide('downloads.mojom.PageHandlerInterface');
goog.provide('downloads.mojom.PageHandlerProxy');
goog.provide('downloads.mojom.PageHandlerRequest');


/** @export */
downloads.mojom.PageHandlerRequest = class {
  /** @param {!MojoHandle} handle */
  constructor(handle) {
    /** @public {!MojoHandle} */
    this.handle = handle;
  }
};

/** @interface */
downloads.mojom.PageHandlerInterface = class {
  
  /**
   * @param { !Array<!string> } searchTerms
   */

  getDownloads(searchTerms) {}
  
  /**
   * @param { !string } id
   */

  openFileRequiringGesture(id) {}
  
  /**
   * @param { !string } id
   */

  drag(id) {}
  
  /**
   * @param { !string } id
   */

  saveDangerousRequiringGesture(id) {}
  
  /**
   * @param { !string } id
   */

  discardDangerous(id) {}
  
  /**
   * @param { !string } id
   */

  retryDownload(id) {}
  
  /**
   * @param { !string } id
   */

  show(id) {}
  
  /**
   * @param { !string } id
   */

  pause(id) {}
  
  /**
   * @param { !string } id
   */

  resume(id) {}
  
  /**
   * @param { !string } id
   */

  remove(id) {}
  
  /**
   */

  undo() {}
  
  /**
   * @param { !string } id
   */

  cancel(id) {}
  
  /**
   */

  clearAll() {}
  
  /**
   */

  openDownloadsFolderRequiringGesture() {}
};

/**
 * @export
 * @implements { downloads.mojom.PageHandlerInterface }
 */
downloads.mojom.PageHandlerProxy = class {
  /** @param {MojoHandle=} opt_handle */
  constructor(opt_handle) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!downloads.mojom.PageHandlerRequest>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          downloads.mojom.PageHandlerRequest,
          opt_handle);

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

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

  
  /**
   * @param { !Array<!string> } searchTerms
   */

  getDownloads(
      searchTerms) {
    this.proxy.sendMessage(
        1276580619,
        downloads.mojom.PageHandler_GetDownloads_ParamsSpec.$,
        null,
        [
          searchTerms
        ]);
  }

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

  openFileRequiringGesture(
      id) {
    this.proxy.sendMessage(
        996308385,
        downloads.mojom.PageHandler_OpenFileRequiringGesture_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  drag(
      id) {
    this.proxy.sendMessage(
        1115880847,
        downloads.mojom.PageHandler_Drag_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  saveDangerousRequiringGesture(
      id) {
    this.proxy.sendMessage(
        136851667,
        downloads.mojom.PageHandler_SaveDangerousRequiringGesture_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  discardDangerous(
      id) {
    this.proxy.sendMessage(
        1364801168,
        downloads.mojom.PageHandler_DiscardDangerous_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  retryDownload(
      id) {
    this.proxy.sendMessage(
        2088295024,
        downloads.mojom.PageHandler_RetryDownload_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  show(
      id) {
    this.proxy.sendMessage(
        1102020196,
        downloads.mojom.PageHandler_Show_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  pause(
      id) {
    this.proxy.sendMessage(
        1602987341,
        downloads.mojom.PageHandler_Pause_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  resume(
      id) {
    this.proxy.sendMessage(
        1633949866,
        downloads.mojom.PageHandler_Resume_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

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

  remove(
      id) {
    this.proxy.sendMessage(
        1404358583,
        downloads.mojom.PageHandler_Remove_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

  
  /**
   */

  undo() {
    this.proxy.sendMessage(
        2102863004,
        downloads.mojom.PageHandler_Undo_ParamsSpec.$,
        null,
        [
        ]);
  }

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

  cancel(
      id) {
    this.proxy.sendMessage(
        1770063371,
        downloads.mojom.PageHandler_Cancel_ParamsSpec.$,
        null,
        [
          id
        ]);
  }

  
  /**
   */

  clearAll() {
    this.proxy.sendMessage(
        818496779,
        downloads.mojom.PageHandler_ClearAll_ParamsSpec.$,
        null,
        [
        ]);
  }

  
  /**
   */

  openDownloadsFolderRequiringGesture() {
    this.proxy.sendMessage(
        795050229,
        downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_ParamsSpec.$,
        null,
        [
        ]);
  }
};

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

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


    this.helper_internal_.registerHandler(
        1276580619,
        downloads.mojom.PageHandler_GetDownloads_ParamsSpec.$,
        null,
        impl.getDownloads.bind(impl));
    this.helper_internal_.registerHandler(
        996308385,
        downloads.mojom.PageHandler_OpenFileRequiringGesture_ParamsSpec.$,
        null,
        impl.openFileRequiringGesture.bind(impl));
    this.helper_internal_.registerHandler(
        1115880847,
        downloads.mojom.PageHandler_Drag_ParamsSpec.$,
        null,
        impl.drag.bind(impl));
    this.helper_internal_.registerHandler(
        136851667,
        downloads.mojom.PageHandler_SaveDangerousRequiringGesture_ParamsSpec.$,
        null,
        impl.saveDangerousRequiringGesture.bind(impl));
    this.helper_internal_.registerHandler(
        1364801168,
        downloads.mojom.PageHandler_DiscardDangerous_ParamsSpec.$,
        null,
        impl.discardDangerous.bind(impl));
    this.helper_internal_.registerHandler(
        2088295024,
        downloads.mojom.PageHandler_RetryDownload_ParamsSpec.$,
        null,
        impl.retryDownload.bind(impl));
    this.helper_internal_.registerHandler(
        1102020196,
        downloads.mojom.PageHandler_Show_ParamsSpec.$,
        null,
        impl.show.bind(impl));
    this.helper_internal_.registerHandler(
        1602987341,
        downloads.mojom.PageHandler_Pause_ParamsSpec.$,
        null,
        impl.pause.bind(impl));
    this.helper_internal_.registerHandler(
        1633949866,
        downloads.mojom.PageHandler_Resume_ParamsSpec.$,
        null,
        impl.resume.bind(impl));
    this.helper_internal_.registerHandler(
        1404358583,
        downloads.mojom.PageHandler_Remove_ParamsSpec.$,
        null,
        impl.remove.bind(impl));
    this.helper_internal_.registerHandler(
        2102863004,
        downloads.mojom.PageHandler_Undo_ParamsSpec.$,
        null,
        impl.undo.bind(impl));
    this.helper_internal_.registerHandler(
        1770063371,
        downloads.mojom.PageHandler_Cancel_ParamsSpec.$,
        null,
        impl.cancel.bind(impl));
    this.helper_internal_.registerHandler(
        818496779,
        downloads.mojom.PageHandler_ClearAll_ParamsSpec.$,
        null,
        impl.clearAll.bind(impl));
    this.helper_internal_.registerHandler(
        795050229,
        downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_ParamsSpec.$,
        null,
        impl.openDownloadsFolderRequiringGesture.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * Returns a proxy 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 {!downloads.mojom.PageHandlerProxy}
   * @export
   */
  static getProxy() {
    let proxy = new downloads.mojom.PageHandlerProxy;
    Mojo.bindInterface('downloads.mojom.PageHandler',
                       proxy.$.bindNewPipeAndPassReceiver().handle);
    return proxy;
  }

  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "downloads.mojom.PageHandler";
  }
  
};




/**
 * An object which receives request messages for the PageHandler
 * 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
 */
downloads.mojom.PageHandlerCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      downloads.mojom.PageHandlerProxy);

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

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

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

    this.helper_internal_.registerHandler(
        1276580619,
        downloads.mojom.PageHandler_GetDownloads_ParamsSpec.$,
        null,
        this.getDownloads.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.openFileRequiringGesture =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        996308385,
        downloads.mojom.PageHandler_OpenFileRequiringGesture_ParamsSpec.$,
        null,
        this.openFileRequiringGesture.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.drag =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1115880847,
        downloads.mojom.PageHandler_Drag_ParamsSpec.$,
        null,
        this.drag.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.saveDangerousRequiringGesture =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        136851667,
        downloads.mojom.PageHandler_SaveDangerousRequiringGesture_ParamsSpec.$,
        null,
        this.saveDangerousRequiringGesture.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.discardDangerous =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1364801168,
        downloads.mojom.PageHandler_DiscardDangerous_ParamsSpec.$,
        null,
        this.discardDangerous.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.retryDownload =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2088295024,
        downloads.mojom.PageHandler_RetryDownload_ParamsSpec.$,
        null,
        this.retryDownload.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.show =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1102020196,
        downloads.mojom.PageHandler_Show_ParamsSpec.$,
        null,
        this.show.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.pause =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1602987341,
        downloads.mojom.PageHandler_Pause_ParamsSpec.$,
        null,
        this.pause.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.resume =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1633949866,
        downloads.mojom.PageHandler_Resume_ParamsSpec.$,
        null,
        this.resume.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.remove =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1404358583,
        downloads.mojom.PageHandler_Remove_ParamsSpec.$,
        null,
        this.remove.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.undo =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2102863004,
        downloads.mojom.PageHandler_Undo_ParamsSpec.$,
        null,
        this.undo.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.cancel =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1770063371,
        downloads.mojom.PageHandler_Cancel_ParamsSpec.$,
        null,
        this.cancel.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.clearAll =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        818496779,
        downloads.mojom.PageHandler_ClearAll_ParamsSpec.$,
        null,
        this.clearAll.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.openDownloadsFolderRequiringGesture =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        795050229,
        downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_ParamsSpec.$,
        null,
        this.openDownloadsFolderRequiringGesture.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.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};



goog.provide('downloads.mojom.Page');
goog.provide('downloads.mojom.PageCallbackRouter');
goog.provide('downloads.mojom.PageInterface');
goog.provide('downloads.mojom.PageProxy');
goog.provide('downloads.mojom.PageRequest');


/** @export */
downloads.mojom.PageRequest = class {
  /** @param {!MojoHandle} handle */
  constructor(handle) {
    /** @public {!MojoHandle} */
    this.handle = handle;
  }
};

/** @interface */
downloads.mojom.PageInterface = class {
  
  /**
   * @param { !number } index
   */

  removeItem(index) {}
  
  /**
   * @param { !number } index
   * @param { !downloads.mojom.Data } data
   */

  updateItem(index, data) {}
  
  /**
   * @param { !number } index
   * @param { !Array<!downloads.mojom.Data> } items
   */

  insertItems(index, items) {}
  
  /**
   */

  clearAll() {}
};

/**
 * @export
 * @implements { downloads.mojom.PageInterface }
 */
downloads.mojom.PageProxy = class {
  /** @param {MojoHandle=} opt_handle */
  constructor(opt_handle) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!downloads.mojom.PageRequest>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          downloads.mojom.PageRequest,
          opt_handle);

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

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

  
  /**
   * @param { !number } index
   */

  removeItem(
      index) {
    this.proxy.sendMessage(
        1539598892,
        downloads.mojom.Page_RemoveItem_ParamsSpec.$,
        null,
        [
          index
        ]);
  }

  
  /**
   * @param { !number } index
   * @param { !downloads.mojom.Data } data
   */

  updateItem(
      index,
      data) {
    this.proxy.sendMessage(
        438505251,
        downloads.mojom.Page_UpdateItem_ParamsSpec.$,
        null,
        [
          index,
          data
        ]);
  }

  
  /**
   * @param { !number } index
   * @param { !Array<!downloads.mojom.Data> } items
   */

  insertItems(
      index,
      items) {
    this.proxy.sendMessage(
        1326163021,
        downloads.mojom.Page_InsertItems_ParamsSpec.$,
        null,
        [
          index,
          items
        ]);
  }

  
  /**
   */

  clearAll() {
    this.proxy.sendMessage(
        2094195754,
        downloads.mojom.Page_ClearAll_ParamsSpec.$,
        null,
        [
        ]);
  }
};

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

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


    this.helper_internal_.registerHandler(
        1539598892,
        downloads.mojom.Page_RemoveItem_ParamsSpec.$,
        null,
        impl.removeItem.bind(impl));
    this.helper_internal_.registerHandler(
        438505251,
        downloads.mojom.Page_UpdateItem_ParamsSpec.$,
        null,
        impl.updateItem.bind(impl));
    this.helper_internal_.registerHandler(
        1326163021,
        downloads.mojom.Page_InsertItems_ParamsSpec.$,
        null,
        impl.insertItems.bind(impl));
    this.helper_internal_.registerHandler(
        2094195754,
        downloads.mojom.Page_ClearAll_ParamsSpec.$,
        null,
        impl.clearAll.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * Returns a proxy 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 {!downloads.mojom.PageProxy}
   * @export
   */
  static getProxy() {
    let proxy = new downloads.mojom.PageProxy;
    Mojo.bindInterface('downloads.mojom.Page',
                       proxy.$.bindNewPipeAndPassReceiver().handle);
    return proxy;
  }

  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "downloads.mojom.Page";
  }
  
};




/**
 * An object which receives request messages for the Page
 * 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
 */
downloads.mojom.PageCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      downloads.mojom.PageProxy);

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

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

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

    this.helper_internal_.registerHandler(
        1539598892,
        downloads.mojom.Page_RemoveItem_ParamsSpec.$,
        null,
        this.removeItem.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.updateItem =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        438505251,
        downloads.mojom.Page_UpdateItem_ParamsSpec.$,
        null,
        this.updateItem.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.insertItems =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1326163021,
        downloads.mojom.Page_InsertItems_ParamsSpec.$,
        null,
        this.insertItems.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.clearAll =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2094195754,
        downloads.mojom.Page_ClearAll_ParamsSpec.$,
        null,
        this.clearAll.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.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};


goog.provide('downloads.mojom.DataSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.DataSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_GetDownloads_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_GetDownloads_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_OpenFileRequiringGesture_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_OpenFileRequiringGesture_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Drag_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Drag_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_SaveDangerousRequiringGesture_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_SaveDangerousRequiringGesture_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_DiscardDangerous_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_DiscardDangerous_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_RetryDownload_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_RetryDownload_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Show_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Show_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Pause_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Pause_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Resume_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Resume_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Remove_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Remove_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Undo_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Undo_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_Cancel_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_Cancel_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_ClearAll_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_ClearAll_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.Page_RemoveItem_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.Page_RemoveItem_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.Page_UpdateItem_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.Page_UpdateItem_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.Page_InsertItems_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.Page_InsertItems_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('downloads.mojom.Page_ClearAll_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
downloads.mojom.Page_ClearAll_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };




mojo.internal.Struct(
    downloads.mojom.DataSpec.$,
    'Data',
    120,
    [
      mojo.internal.StructField(
        'fileExternallyRemoved', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */),
      mojo.internal.StructField(
        'otr', 0,
        1,
        mojo.internal.Bool,
        false,
        false /* nullable */),
      mojo.internal.StructField(
        'resume', 0,
        2,
        mojo.internal.Bool,
        false,
        false /* nullable */),
      mojo.internal.StructField(
        'retry', 0,
        3,
        mojo.internal.Bool,
        false,
        false /* nullable */),
      mojo.internal.StructField(
        'percent', 4,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'started', 8,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'total', 12,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'byExtId', 16,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'byExtName', 24,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'dangerType', 32,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'dateString', 40,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'fileName', 48,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'filePath', 56,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'fileUrl', 64,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'id', 72,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'lastReasonText', 80,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'progressStatusText', 88,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'sinceString', 96,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'state', 104,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'url', 112,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.Data');


/**
 * @typedef { {
 *   fileExternallyRemoved: !boolean,
 *   otr: !boolean,
 *   resume: !boolean,
 *   retry: !boolean,
 *   percent: !number,
 *   started: !number,
 *   total: !number,
 *   byExtId: !string,
 *   byExtName: !string,
 *   dangerType: !string,
 *   dateString: !string,
 *   fileName: !string,
 *   filePath: !string,
 *   fileUrl: !string,
 *   id: !string,
 *   lastReasonText: !string,
 *   progressStatusText: !string,
 *   sinceString: !string,
 *   state: !string,
 *   url: !string,
 * } }
 */

downloads.mojom.Data;



mojo.internal.Struct(
    downloads.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$,
    'PageHandlerFactory_CreatePageHandler_Params',
    16,
    [
      mojo.internal.StructField(
        'page', 0,
        0,
        mojo.internal.InterfaceProxy(downloads.mojom.PageProxy),
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'handler', 8,
        0,
        mojo.internal.InterfaceRequest(downloads.mojom.PageHandlerRequest),
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandlerFactory_CreatePageHandler_Params');


/**
 * @typedef { {
 *   page: !downloads.mojom.PageProxy,
 *   handler: !downloads.mojom.PageHandlerRequest,
 * } }
 */

downloads.mojom.PageHandlerFactory_CreatePageHandler_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_GetDownloads_ParamsSpec.$,
    'PageHandler_GetDownloads_Params',
    8,
    [
      mojo.internal.StructField(
        'searchTerms', 0,
        0,
        mojo.internal.Array(mojo.internal.String, false),
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_GetDownloads_Params');


/**
 * @typedef { {
 *   searchTerms: !Array<!string>,
 * } }
 */

downloads.mojom.PageHandler_GetDownloads_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_OpenFileRequiringGesture_ParamsSpec.$,
    'PageHandler_OpenFileRequiringGesture_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_OpenFileRequiringGesture_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_OpenFileRequiringGesture_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Drag_ParamsSpec.$,
    'PageHandler_Drag_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_Drag_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_Drag_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_SaveDangerousRequiringGesture_ParamsSpec.$,
    'PageHandler_SaveDangerousRequiringGesture_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_SaveDangerousRequiringGesture_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_SaveDangerousRequiringGesture_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_DiscardDangerous_ParamsSpec.$,
    'PageHandler_DiscardDangerous_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_DiscardDangerous_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_DiscardDangerous_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_RetryDownload_ParamsSpec.$,
    'PageHandler_RetryDownload_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_RetryDownload_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_RetryDownload_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Show_ParamsSpec.$,
    'PageHandler_Show_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_Show_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_Show_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Pause_ParamsSpec.$,
    'PageHandler_Pause_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_Pause_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_Pause_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Resume_ParamsSpec.$,
    'PageHandler_Resume_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_Resume_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_Resume_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Remove_ParamsSpec.$,
    'PageHandler_Remove_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_Remove_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_Remove_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Undo_ParamsSpec.$,
    'PageHandler_Undo_Params',
    0,
    [
    ]);

goog.provide('downloads.mojom.PageHandler_Undo_Params');


/** @typedef {Object} */

downloads.mojom.PageHandler_Undo_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_Cancel_ParamsSpec.$,
    'PageHandler_Cancel_Params',
    8,
    [
      mojo.internal.StructField(
        'id', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.PageHandler_Cancel_Params');


/**
 * @typedef { {
 *   id: !string,
 * } }
 */

downloads.mojom.PageHandler_Cancel_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_ClearAll_ParamsSpec.$,
    'PageHandler_ClearAll_Params',
    0,
    [
    ]);

goog.provide('downloads.mojom.PageHandler_ClearAll_Params');


/** @typedef {Object} */

downloads.mojom.PageHandler_ClearAll_Params;



mojo.internal.Struct(
    downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_ParamsSpec.$,
    'PageHandler_OpenDownloadsFolderRequiringGesture_Params',
    0,
    [
    ]);

goog.provide('downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_Params');


/** @typedef {Object} */

downloads.mojom.PageHandler_OpenDownloadsFolderRequiringGesture_Params;



mojo.internal.Struct(
    downloads.mojom.Page_RemoveItem_ParamsSpec.$,
    'Page_RemoveItem_Params',
    8,
    [
      mojo.internal.StructField(
        'index', 0,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.Page_RemoveItem_Params');


/**
 * @typedef { {
 *   index: !number,
 * } }
 */

downloads.mojom.Page_RemoveItem_Params;



mojo.internal.Struct(
    downloads.mojom.Page_UpdateItem_ParamsSpec.$,
    'Page_UpdateItem_Params',
    16,
    [
      mojo.internal.StructField(
        'index', 0,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'data', 8,
        0,
        downloads.mojom.DataSpec.$,
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.Page_UpdateItem_Params');


/**
 * @typedef { {
 *   index: !number,
 *   data: !downloads.mojom.Data,
 * } }
 */

downloads.mojom.Page_UpdateItem_Params;



mojo.internal.Struct(
    downloads.mojom.Page_InsertItems_ParamsSpec.$,
    'Page_InsertItems_Params',
    16,
    [
      mojo.internal.StructField(
        'index', 0,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'items', 8,
        0,
        mojo.internal.Array(downloads.mojom.DataSpec.$, false),
        null,
        false /* nullable */),
    ]);

goog.provide('downloads.mojom.Page_InsertItems_Params');


/**
 * @typedef { {
 *   index: !number,
 *   items: !Array<!downloads.mojom.Data>,
 * } }
 */

downloads.mojom.Page_InsertItems_Params;



mojo.internal.Struct(
    downloads.mojom.Page_ClearAll_ParamsSpec.$,
    'Page_ClearAll_Params',
    0,
    [
    ]);

goog.provide('downloads.mojom.Page_ClearAll_Params');


/** @typedef {Object} */

downloads.mojom.Page_ClearAll_Params;

