/* Copyright (c) 2012 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.
 */

/**
 * This file defines the PPB_Instance_Private interface implemented by the
 * browser and containing pointers to functions available only to trusted plugin
 * instances.
 */

[generate_thunk]

label Chrome {
  M13 = 0.1
};

/**
 * The <code>PP_ExternalPluginResult </code> enum contains result codes from
 * launching an external plugin.
 */
[assert_size(4)]
enum PP_ExternalPluginResult  {
  /** Successful external plugin call */
  PP_EXTERNAL_PLUGIN_OK = 0,
  /** Unspecified external plugin error */
  PP_EXTERNAL_PLUGIN_FAILED = 1,
  /** Error creating the module */
  PP_EXTERNAL_PLUGIN_ERROR_MODULE = 2,
  /** Error creating and initializing the instance */
  PP_EXTERNAL_PLUGIN_ERROR_INSTANCE = 3
};


/**
 * The PPB_Instance_Private interface contains functions available only to
 * trusted plugin instances.
 *
 */
interface PPB_Instance_Private {
  /**
   * GetWindowObject is a pointer to a function that determines
   * the DOM window containing this module instance.
   *
   * @param[in] instance A PP_Instance whose WindowObject should be retrieved.
   * @return A PP_Var containing window object on success.
   */
  PP_Var GetWindowObject([in] PP_Instance instance);

  /**
   * GetOwnerElementObject is a pointer to a function that determines
   * the DOM element containing this module instance.
   *
   * @param[in] instance A PP_Instance whose WindowObject should be retrieved.
   * @return A PP_Var containing DOM element on success.
   */
  PP_Var GetOwnerElementObject([in] PP_Instance instance);

  /**
   * ExecuteScript is a pointer to a function that executes the given
   * script in the context of the frame containing the module.
   *
   * The exception, if any, will be returned in *exception. As with the PPB_Var
   * interface, the exception parameter, if non-NULL, must be initialized
   * to a "void" var or the function will immediately return. On success,
   * the exception parameter will be set to a "void" var. On failure, the
   * return value will be a "void" var.
   *
   * @param[in] script A string containing the JavaScript to execute.
   * @param[in/out] exception PP_Var containing the exception. Initialize
   * this to NULL if you don't want exception info; initialize this to a void
   * exception if want exception info.
   *
   * @return The result of the script execution, or a "void" var
   * if execution failed.
   */
  PP_Var ExecuteScript([in] PP_Instance instance,
                       [in] PP_Var script,
                       [out] PP_Var exception);
};
