// extensions/common/mojom/frame.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 {
  ListValue as mojoBase_mojom_ListValue,
  ListValueSpec as mojoBase_mojom_ListValueSpec,
  Value as mojoBase_mojom_Value,
  ValueSpec as mojoBase_mojom_ValueSpec
} from '../../../mojo/public/mojom/base/values.mojom.m.js';

import {
  Url as url_mojom_Url,
  UrlSpec as url_mojom_UrlSpec
} from '../../../url/mojom/url.mojom.m.js';

import {
  CodeInjection as extensions_mojom_CodeInjection,
  CodeInjectionSpec as extensions_mojom_CodeInjectionSpec
} from './code_injection.mojom.m.js';

import {
  HostID as extensions_mojom_HostID,
  HostIDSpec as extensions_mojom_HostIDSpec
} from './host_id.mojom.m.js';

import {
  InjectionType as extensions_mojom_InjectionType,
  InjectionTypeSpec as extensions_mojom_InjectionTypeSpec
} from './injection_type.mojom.m.js';

import {
  RunLocation as extensions_mojom_RunLocation,
  RunLocationSpec as extensions_mojom_RunLocationSpec
} from './run_location.mojom.m.js';

import {
  ViewType as extensions_mojom_ViewType,
  ViewTypeSpec as extensions_mojom_ViewTypeSpec
} from './view_type.mojom.m.js';




/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 */
export class LocalFramePendingReceiver {
  /**
   * @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, 'extensions.mojom.LocalFrame', scope);
  }
}

/** @interface */
export class LocalFrameInterface {
  
  /**
   * @param { !string } frameName
   */

  setFrameName(frameName) {}
  
  /**
   * @param { !boolean } spatialNavEnabled
   */

  setSpatialNavigationEnabled(spatialNavEnabled) {}
  
  /**
   * @param { !number } tabId
   */

  setTabId(tabId) {}
  
  /**
   * @param { !boolean } sendOnclosed
   */

  appWindowClosed(sendOnclosed) {}
  
  /**
   * @param { !extensions_mojom_ViewType } viewType
   */

  notifyRenderViewType(viewType) {}
  
  /**
   * @param { !string } extensionId
   * @param { !string } moduleName
   * @param { !string } functionName
   * @param { !mojoBase_mojom_ListValue } args
   */

  messageInvoke(extensionId, moduleName, functionName, args) {}
  
  /**
   * @param { !ExecuteCodeParams } param
   * @return {!Promise<{
        error: !string,
        url: !url_mojom_Url,
        result: ?mojoBase_mojom_Value,
   *  }>}
   */

  executeCode(param) {}
  
  /**
   * @param { !number } tabId
   * @param { !string } extensionId
   * @param { !string } scriptId
   * @param { !url_mojom_Url } url
   */

  executeDeclarativeScript(tabId, extensionId, scriptId, url) {}
  
  /**
   * @param { !number } windowId
   */

  updateBrowserWindowId(windowId) {}
}

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

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

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

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

  setFrameName(
      frameName) {
    this.proxy.sendMessage(
        1461916727,
        LocalFrame_SetFrameName_ParamsSpec.$,
        null,
        [
          frameName
        ]);
  }

  
  /**
   * @param { !boolean } spatialNavEnabled
   */

  setSpatialNavigationEnabled(
      spatialNavEnabled) {
    this.proxy.sendMessage(
        269129413,
        LocalFrame_SetSpatialNavigationEnabled_ParamsSpec.$,
        null,
        [
          spatialNavEnabled
        ]);
  }

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

  setTabId(
      tabId) {
    this.proxy.sendMessage(
        1456329045,
        LocalFrame_SetTabId_ParamsSpec.$,
        null,
        [
          tabId
        ]);
  }

  
  /**
   * @param { !boolean } sendOnclosed
   */

  appWindowClosed(
      sendOnclosed) {
    this.proxy.sendMessage(
        1489244111,
        LocalFrame_AppWindowClosed_ParamsSpec.$,
        null,
        [
          sendOnclosed
        ]);
  }

  
  /**
   * @param { !extensions_mojom_ViewType } viewType
   */

  notifyRenderViewType(
      viewType) {
    this.proxy.sendMessage(
        1636304199,
        LocalFrame_NotifyRenderViewType_ParamsSpec.$,
        null,
        [
          viewType
        ]);
  }

  
  /**
   * @param { !string } extensionId
   * @param { !string } moduleName
   * @param { !string } functionName
   * @param { !mojoBase_mojom_ListValue } args
   */

  messageInvoke(
      extensionId,
      moduleName,
      functionName,
      args) {
    this.proxy.sendMessage(
        1636150581,
        LocalFrame_MessageInvoke_ParamsSpec.$,
        null,
        [
          extensionId,
          moduleName,
          functionName,
          args
        ]);
  }

  
  /**
   * @param { !ExecuteCodeParams } param
   * @return {!Promise<{
        error: !string,
        url: !url_mojom_Url,
        result: ?mojoBase_mojom_Value,
   *  }>}
   */

  executeCode(
      param) {
    return this.proxy.sendMessage(
        1804689572,
        LocalFrame_ExecuteCode_ParamsSpec.$,
        LocalFrame_ExecuteCode_ResponseParamsSpec.$,
        [
          param
        ]);
  }

  
  /**
   * @param { !number } tabId
   * @param { !string } extensionId
   * @param { !string } scriptId
   * @param { !url_mojom_Url } url
   */

  executeDeclarativeScript(
      tabId,
      extensionId,
      scriptId,
      url) {
    this.proxy.sendMessage(
        1274596649,
        LocalFrame_ExecuteDeclarativeScript_ParamsSpec.$,
        null,
        [
          tabId,
          extensionId,
          scriptId,
          url
        ]);
  }

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

  updateBrowserWindowId(
      windowId) {
    this.proxy.sendMessage(
        697679857,
        LocalFrame_UpdateBrowserWindowId_ParamsSpec.$,
        null,
        [
          windowId
        ]);
  }
}

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

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


    this.helper_internal_.registerHandler(
        1461916727,
        LocalFrame_SetFrameName_ParamsSpec.$,
        null,
        impl.setFrameName.bind(impl));
    this.helper_internal_.registerHandler(
        269129413,
        LocalFrame_SetSpatialNavigationEnabled_ParamsSpec.$,
        null,
        impl.setSpatialNavigationEnabled.bind(impl));
    this.helper_internal_.registerHandler(
        1456329045,
        LocalFrame_SetTabId_ParamsSpec.$,
        null,
        impl.setTabId.bind(impl));
    this.helper_internal_.registerHandler(
        1489244111,
        LocalFrame_AppWindowClosed_ParamsSpec.$,
        null,
        impl.appWindowClosed.bind(impl));
    this.helper_internal_.registerHandler(
        1636304199,
        LocalFrame_NotifyRenderViewType_ParamsSpec.$,
        null,
        impl.notifyRenderViewType.bind(impl));
    this.helper_internal_.registerHandler(
        1636150581,
        LocalFrame_MessageInvoke_ParamsSpec.$,
        null,
        impl.messageInvoke.bind(impl));
    this.helper_internal_.registerHandler(
        1804689572,
        LocalFrame_ExecuteCode_ParamsSpec.$,
        LocalFrame_ExecuteCode_ResponseParamsSpec.$,
        impl.executeCode.bind(impl));
    this.helper_internal_.registerHandler(
        1274596649,
        LocalFrame_ExecuteDeclarativeScript_ParamsSpec.$,
        null,
        impl.executeDeclarativeScript.bind(impl));
    this.helper_internal_.registerHandler(
        697679857,
        LocalFrame_UpdateBrowserWindowId_ParamsSpec.$,
        null,
        impl.updateBrowserWindowId.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
}

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

  /**
   * 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 {!LocalFrameRemote}
   */
  static getRemote() {
    let remote = new LocalFrameRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
}


/**
 * An object which receives request messages for the LocalFrame
 * 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 LocalFrameCallbackRouter {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      LocalFrameRemote);

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

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

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

    this.helper_internal_.registerHandler(
        1461916727,
        LocalFrame_SetFrameName_ParamsSpec.$,
        null,
        this.setFrameName.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.setSpatialNavigationEnabled =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        269129413,
        LocalFrame_SetSpatialNavigationEnabled_ParamsSpec.$,
        null,
        this.setSpatialNavigationEnabled.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.setTabId =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1456329045,
        LocalFrame_SetTabId_ParamsSpec.$,
        null,
        this.setTabId.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.appWindowClosed =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1489244111,
        LocalFrame_AppWindowClosed_ParamsSpec.$,
        null,
        this.appWindowClosed.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.notifyRenderViewType =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1636304199,
        LocalFrame_NotifyRenderViewType_ParamsSpec.$,
        null,
        this.notifyRenderViewType.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.messageInvoke =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1636150581,
        LocalFrame_MessageInvoke_ParamsSpec.$,
        null,
        this.messageInvoke.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.executeCode =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1804689572,
        LocalFrame_ExecuteCode_ParamsSpec.$,
        LocalFrame_ExecuteCode_ResponseParamsSpec.$,
        this.executeCode.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.executeDeclarativeScript =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1274596649,
        LocalFrame_ExecuteDeclarativeScript_ParamsSpec.$,
        null,
        this.executeDeclarativeScript.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.updateBrowserWindowId =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        697679857,
        LocalFrame_UpdateBrowserWindowId_ParamsSpec.$,
        null,
        this.updateBrowserWindowId.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);
  }
}


/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 */
export class LocalFrameHostPendingReceiver {
  /**
   * @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, 'extensions.mojom.LocalFrameHost', scope);
  }
}

/** @interface */
export class LocalFrameHostInterface {
  
  /**
   * @param { !string } extensionId
   * @param { !extensions_mojom_InjectionType } scriptType
   * @param { !extensions_mojom_RunLocation } runLocation
   * @return {!Promise<{
        granted: !boolean,
   *  }>}
   */

  requestScriptInjectionPermission(extensionId, scriptType, runLocation) {}
  
  /**
   * @param { !url_mojom_Url } url
   * @return {!Promise<{
        state: !string,
   *  }>}
   */

  getAppInstallState(url) {}
  
  /**
   * @param { !RequestParams } params
   * @return {!Promise<{
        success: !boolean,
        responseWrapper: !mojoBase_mojom_ListValue,
        error: !string,
   *  }>}
   */

  request(params) {}
  
  /**
   * @param { !Array<!string> } cssSelectors
   */

  watchedPageChange(cssSelectors) {}
}

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

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

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

  
  /**
   * @param { !string } extensionId
   * @param { !extensions_mojom_InjectionType } scriptType
   * @param { !extensions_mojom_RunLocation } runLocation
   * @return {!Promise<{
        granted: !boolean,
   *  }>}
   */

  requestScriptInjectionPermission(
      extensionId,
      scriptType,
      runLocation) {
    return this.proxy.sendMessage(
        2033294206,
        LocalFrameHost_RequestScriptInjectionPermission_ParamsSpec.$,
        LocalFrameHost_RequestScriptInjectionPermission_ResponseParamsSpec.$,
        [
          extensionId,
          scriptType,
          runLocation
        ]);
  }

  
  /**
   * @param { !url_mojom_Url } url
   * @return {!Promise<{
        state: !string,
   *  }>}
   */

  getAppInstallState(
      url) {
    return this.proxy.sendMessage(
        15242300,
        LocalFrameHost_GetAppInstallState_ParamsSpec.$,
        LocalFrameHost_GetAppInstallState_ResponseParamsSpec.$,
        [
          url
        ]);
  }

  
  /**
   * @param { !RequestParams } params
   * @return {!Promise<{
        success: !boolean,
        responseWrapper: !mojoBase_mojom_ListValue,
        error: !string,
   *  }>}
   */

  request(
      params) {
    return this.proxy.sendMessage(
        1099748669,
        LocalFrameHost_Request_ParamsSpec.$,
        LocalFrameHost_Request_ResponseParamsSpec.$,
        [
          params
        ]);
  }

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

  watchedPageChange(
      cssSelectors) {
    this.proxy.sendMessage(
        1781778014,
        LocalFrameHost_WatchedPageChange_ParamsSpec.$,
        null,
        [
          cssSelectors
        ]);
  }
}

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

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


    this.helper_internal_.registerHandler(
        2033294206,
        LocalFrameHost_RequestScriptInjectionPermission_ParamsSpec.$,
        LocalFrameHost_RequestScriptInjectionPermission_ResponseParamsSpec.$,
        impl.requestScriptInjectionPermission.bind(impl));
    this.helper_internal_.registerHandler(
        15242300,
        LocalFrameHost_GetAppInstallState_ParamsSpec.$,
        LocalFrameHost_GetAppInstallState_ResponseParamsSpec.$,
        impl.getAppInstallState.bind(impl));
    this.helper_internal_.registerHandler(
        1099748669,
        LocalFrameHost_Request_ParamsSpec.$,
        LocalFrameHost_Request_ResponseParamsSpec.$,
        impl.request.bind(impl));
    this.helper_internal_.registerHandler(
        1781778014,
        LocalFrameHost_WatchedPageChange_ParamsSpec.$,
        null,
        impl.watchedPageChange.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
}

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

  /**
   * 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 {!LocalFrameHostRemote}
   */
  static getRemote() {
    let remote = new LocalFrameHostRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
}


/**
 * An object which receives request messages for the LocalFrameHost
 * 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 LocalFrameHostCallbackRouter {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      LocalFrameHostRemote);

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

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

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

    this.helper_internal_.registerHandler(
        2033294206,
        LocalFrameHost_RequestScriptInjectionPermission_ParamsSpec.$,
        LocalFrameHost_RequestScriptInjectionPermission_ResponseParamsSpec.$,
        this.requestScriptInjectionPermission.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.getAppInstallState =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        15242300,
        LocalFrameHost_GetAppInstallState_ParamsSpec.$,
        LocalFrameHost_GetAppInstallState_ResponseParamsSpec.$,
        this.getAppInstallState.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.request =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1099748669,
        LocalFrameHost_Request_ParamsSpec.$,
        LocalFrameHost_Request_ResponseParamsSpec.$,
        this.request.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.watchedPageChange =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1781778014,
        LocalFrameHost_WatchedPageChange_ParamsSpec.$,
        null,
        this.watchedPageChange.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 ExecuteCodeParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




mojo.internal.Struct(
    ExecuteCodeParamsSpec.$,
    'ExecuteCodeParams',
    [
      mojo.internal.StructField(
        'hostId', 0,
        0,
        extensions_mojom_HostIDSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'injection', 8,
        0,
        extensions_mojom_CodeInjectionSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'webviewSrc', 24,
        0,
        url_mojom_UrlSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'matchAboutBlank', 32,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'runAt', 36,
        0,
        extensions_mojom_RunLocationSpec.$,
        0,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'isWebView', 32,
        1,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 48],]);



/**
 * @record
 */
export class ExecuteCodeParams {
  constructor() {
    /** @type { !extensions_mojom_HostID } */
    this.hostId;
    /** @type { !extensions_mojom_CodeInjection } */
    this.injection;
    /** @type { !url_mojom_Url } */
    this.webviewSrc;
    /** @type { !boolean } */
    this.matchAboutBlank;
    /** @type { !boolean } */
    this.isWebView;
    /** @type { !extensions_mojom_RunLocation } */
    this.runAt;
  }
}



mojo.internal.Struct(
    RequestParamsSpec.$,
    'RequestParams',
    [
      mojo.internal.StructField(
        'name', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'arguments', 8,
        0,
        mojoBase_mojom_ListValueSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'extensionId', 16,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'sourceUrl', 24,
        0,
        url_mojom_UrlSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'requestId', 32,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'hasCallback', 36,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'userGesture', 36,
        1,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'workerThreadId', 40,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'serviceWorkerVersionId', 48,
        0,
        mojo.internal.Int64,
        BigInt(0),
        false /* nullable */,
        0),
    ],
    [[0, 64],]);



/**
 * @record
 */
export class RequestParams {
  constructor() {
    /** @type { !string } */
    this.name;
    /** @type { !mojoBase_mojom_ListValue } */
    this.arguments;
    /** @type { !string } */
    this.extensionId;
    /** @type { !url_mojom_Url } */
    this.sourceUrl;
    /** @type { !number } */
    this.requestId;
    /** @type { !boolean } */
    this.hasCallback;
    /** @type { !boolean } */
    this.userGesture;
    /** @type { !number } */
    this.workerThreadId;
    /** @type { !bigint } */
    this.serviceWorkerVersionId;
  }
}



mojo.internal.Struct(
    LocalFrame_SetFrameName_ParamsSpec.$,
    'LocalFrame_SetFrameName_Params',
    [
      mojo.internal.StructField(
        'frameName', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



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



mojo.internal.Struct(
    LocalFrame_SetSpatialNavigationEnabled_ParamsSpec.$,
    'LocalFrame_SetSpatialNavigationEnabled_Params',
    [
      mojo.internal.StructField(
        'spatialNavEnabled', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



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



mojo.internal.Struct(
    LocalFrame_SetTabId_ParamsSpec.$,
    'LocalFrame_SetTabId_Params',
    [
      mojo.internal.StructField(
        'tabId', 0,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrame_SetTabId_Params {
  constructor() {
    /** @type { !number } */
    this.tabId;
  }
}



mojo.internal.Struct(
    LocalFrame_AppWindowClosed_ParamsSpec.$,
    'LocalFrame_AppWindowClosed_Params',
    [
      mojo.internal.StructField(
        'sendOnclosed', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



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



mojo.internal.Struct(
    LocalFrame_NotifyRenderViewType_ParamsSpec.$,
    'LocalFrame_NotifyRenderViewType_Params',
    [
      mojo.internal.StructField(
        'viewType', 0,
        0,
        extensions_mojom_ViewTypeSpec.$,
        0,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrame_NotifyRenderViewType_Params {
  constructor() {
    /** @type { !extensions_mojom_ViewType } */
    this.viewType;
  }
}



mojo.internal.Struct(
    LocalFrame_MessageInvoke_ParamsSpec.$,
    'LocalFrame_MessageInvoke_Params',
    [
      mojo.internal.StructField(
        'extensionId', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'moduleName', 8,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'functionName', 16,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'args', 24,
        0,
        mojoBase_mojom_ListValueSpec.$,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 40],]);



/**
 * @record
 */
export class LocalFrame_MessageInvoke_Params {
  constructor() {
    /** @type { !string } */
    this.extensionId;
    /** @type { !string } */
    this.moduleName;
    /** @type { !string } */
    this.functionName;
    /** @type { !mojoBase_mojom_ListValue } */
    this.args;
  }
}



mojo.internal.Struct(
    LocalFrame_ExecuteCode_ParamsSpec.$,
    'LocalFrame_ExecuteCode_Params',
    [
      mojo.internal.StructField(
        'param', 0,
        0,
        ExecuteCodeParamsSpec.$,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrame_ExecuteCode_Params {
  constructor() {
    /** @type { !ExecuteCodeParams } */
    this.param;
  }
}



mojo.internal.Struct(
    LocalFrame_ExecuteCode_ResponseParamsSpec.$,
    'LocalFrame_ExecuteCode_ResponseParams',
    [
      mojo.internal.StructField(
        'error', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'url', 8,
        0,
        url_mojom_UrlSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'result', 16,
        0,
        mojoBase_mojom_ValueSpec.$,
        null,
        true /* nullable */,
        0),
    ],
    [[0, 40],]);



/**
 * @record
 */
export class LocalFrame_ExecuteCode_ResponseParams {
  constructor() {
    /** @type { !string } */
    this.error;
    /** @type { !url_mojom_Url } */
    this.url;
    /** @type { (mojoBase_mojom_Value|undefined) } */
    this.result;
  }
}



mojo.internal.Struct(
    LocalFrame_ExecuteDeclarativeScript_ParamsSpec.$,
    'LocalFrame_ExecuteDeclarativeScript_Params',
    [
      mojo.internal.StructField(
        'tabId', 0,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'extensionId', 8,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'scriptId', 16,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'url', 24,
        0,
        url_mojom_UrlSpec.$,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 40],]);



/**
 * @record
 */
export class LocalFrame_ExecuteDeclarativeScript_Params {
  constructor() {
    /** @type { !number } */
    this.tabId;
    /** @type { !string } */
    this.extensionId;
    /** @type { !string } */
    this.scriptId;
    /** @type { !url_mojom_Url } */
    this.url;
  }
}



mojo.internal.Struct(
    LocalFrame_UpdateBrowserWindowId_ParamsSpec.$,
    'LocalFrame_UpdateBrowserWindowId_Params',
    [
      mojo.internal.StructField(
        'windowId', 0,
        0,
        mojo.internal.Int32,
        0,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrame_UpdateBrowserWindowId_Params {
  constructor() {
    /** @type { !number } */
    this.windowId;
  }
}



mojo.internal.Struct(
    LocalFrameHost_RequestScriptInjectionPermission_ParamsSpec.$,
    'LocalFrameHost_RequestScriptInjectionPermission_Params',
    [
      mojo.internal.StructField(
        'extensionId', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'scriptType', 8,
        0,
        extensions_mojom_InjectionTypeSpec.$,
        0,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'runLocation', 12,
        0,
        extensions_mojom_RunLocationSpec.$,
        0,
        false /* nullable */,
        0),
    ],
    [[0, 24],]);



/**
 * @record
 */
export class LocalFrameHost_RequestScriptInjectionPermission_Params {
  constructor() {
    /** @type { !string } */
    this.extensionId;
    /** @type { !extensions_mojom_InjectionType } */
    this.scriptType;
    /** @type { !extensions_mojom_RunLocation } */
    this.runLocation;
  }
}



mojo.internal.Struct(
    LocalFrameHost_RequestScriptInjectionPermission_ResponseParamsSpec.$,
    'LocalFrameHost_RequestScriptInjectionPermission_ResponseParams',
    [
      mojo.internal.StructField(
        'granted', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



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



mojo.internal.Struct(
    LocalFrameHost_GetAppInstallState_ParamsSpec.$,
    'LocalFrameHost_GetAppInstallState_Params',
    [
      mojo.internal.StructField(
        'url', 0,
        0,
        url_mojom_UrlSpec.$,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrameHost_GetAppInstallState_Params {
  constructor() {
    /** @type { !url_mojom_Url } */
    this.url;
  }
}



mojo.internal.Struct(
    LocalFrameHost_GetAppInstallState_ResponseParamsSpec.$,
    'LocalFrameHost_GetAppInstallState_ResponseParams',
    [
      mojo.internal.StructField(
        'state', 0,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



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



mojo.internal.Struct(
    LocalFrameHost_Request_ParamsSpec.$,
    'LocalFrameHost_Request_Params',
    [
      mojo.internal.StructField(
        'params', 0,
        0,
        RequestParamsSpec.$,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrameHost_Request_Params {
  constructor() {
    /** @type { !RequestParams } */
    this.params;
  }
}



mojo.internal.Struct(
    LocalFrameHost_Request_ResponseParamsSpec.$,
    'LocalFrameHost_Request_ResponseParams',
    [
      mojo.internal.StructField(
        'success', 0,
        0,
        mojo.internal.Bool,
        false,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'responseWrapper', 8,
        0,
        mojoBase_mojom_ListValueSpec.$,
        null,
        false /* nullable */,
        0),
      mojo.internal.StructField(
        'error', 16,
        0,
        mojo.internal.String,
        null,
        false /* nullable */,
        0),
    ],
    [[0, 32],]);



/**
 * @record
 */
export class LocalFrameHost_Request_ResponseParams {
  constructor() {
    /** @type { !boolean } */
    this.success;
    /** @type { !mojoBase_mojom_ListValue } */
    this.responseWrapper;
    /** @type { !string } */
    this.error;
  }
}



mojo.internal.Struct(
    LocalFrameHost_WatchedPageChange_ParamsSpec.$,
    'LocalFrameHost_WatchedPageChange_Params',
    [
      mojo.internal.StructField(
        'cssSelectors', 0,
        0,
        mojo.internal.Array(mojo.internal.String, false),
        null,
        false /* nullable */,
        0),
    ],
    [[0, 16],]);



/**
 * @record
 */
export class LocalFrameHost_WatchedPageChange_Params {
  constructor() {
    /** @type { !Array<!string> } */
    this.cssSelectors;
  }
}

