blob: 26f9614e9b3ed6db0aba4fe93fe984ac797f2e35 [file] [log] [blame]
/* Copyright (c) 2011 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.
*/
#ifndef PPAPI_C_PPP_INSTANCE_H_
#define PPAPI_C_PPP_INSTANCE_H_
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_rect.h"
#include "ppapi/c/pp_resource.h"
struct PP_InputEvent;
struct PP_Var;
#define PPP_INSTANCE_INTERFACE_0_4 "PPP_Instance;0.4"
#define PPP_INSTANCE_INTERFACE_0_5 "PPP_Instance;0.5"
#ifdef PPAPI_INSTANCE_REMOVE_SCRIPTING
#define PPP_INSTANCE_INTERFACE PPP_INSTANCE_INTERFACE_0_5
#else
#define PPP_INSTANCE_INTERFACE PPP_INSTANCE_INTERFACE_0_4
#endif
/**
* @file
* This file defines the PPP_Instance structure - a series of pointers to
* methods that you must implement in your module.
*/
/** @addtogroup Interfaces
* @{
*/
/**
* The PPP_Instance interface contains pointers to a series of functions that
* you must implement in your module. These functions can be trivial (simply
* return the default return value) unless you want your module
* to handle events such as change of focus or input events (keyboard/mouse)
* events.
*/
#ifdef PPAPI_INSTANCE_REMOVE_SCRIPTING
struct PPP_Instance {
#else
struct PPP_Instance_0_5 {
#endif
/**
* This value represents a pointer to a function that is called when a new
* module is instantiated on the web page. The identifier of the new
* instance will be passed in as the first argument (this value is
* generated by the browser and is an opaque handle). This is called for each
* instantiation of the NaCl module, which is each time the <embed> tag for
* this module is encountered.
*
* It's possible for more than one module instance to be created
* (i.e. you may get more than one OnCreate without an OnDestroy
* in between).
*
* If this function reports a failure (by returning @a PP_FALSE), the NaCl
* module will be deleted and DidDestroy will be called.
*
* @param[in] instance A PP_Instance indentifying one instance of a module.
* @param[in] argc The number of arguments contained in @a argn and @a argv.
* @param[in] argn An array of argument names. These argument names are
* supplied in the <embed> tag, for example:
* <embed id="nacl_module" dimensions="2"> will produce two argument
* names: "id" and "dimensions."
* @param[in] argv An array of argument values. These are the values of the
* arguments listed in the <embed> tag, for example
* <embed id="nacl_module" dimensions="2"> will produce two argument
* values: "nacl_module" and "2." The indices of these values match the
* indices of the corresponding names in @a argn.
* @return @a PP_TRUE on success.
*/
PP_Bool (*DidCreate)(PP_Instance instance,
uint32_t argc,
const char* argn[],
const char* argv[]);
/**
* This value represents a pointer to a function that is called when the
* module instance is destroyed. This function will always be called,
* even if DidCreate returned failure. The function should deallocate any data
* associated with the instance.
*
* The instance identifier will still be valid so the plugin can perform
* cleanup-related tasks. Once this function is called, the PP_Instance will
* be invalid.
*
* @param[in] instance A PP_Instance indentifying one instance of a module.
*/
void (*DidDestroy)(PP_Instance instance);
/**
* This value represents a pointer to a function that is called when the
* position, the size, or the clip rectangle of the element in the
* browser that corresponds to this NaCl module has changed.
*
* @param[in] instance A PP_Instance indentifying one instance of a module.
* @param[in] position The location on the page of this NaCl module. This is
* relative to the top left corner of the viewport, which changes as the
* page is scrolled.
* @param[in] clip The visible region of the NaCl module. This is relative to
* the top left of the plugin's coordinate system (not the page). If the
* plugin is invisible, @a clip will be (0, 0, 0, 0).
*/
void (*DidChangeView)(PP_Instance instance,
const struct PP_Rect* position,
const struct PP_Rect* clip);
/**
* This value represents a pointer to a function to handle when your module
* has gained or lost focus. Having focus means that keyboard events will be
* sent to the module. A module's default condition is that it will
* not have focus.
*
* Note: clicks on modules will give focus only if you handle the
* click event. Return @a true from HandleInputEvent to signal that the click
* event was handled. Otherwise the browser will bubble the event and give
* focus to the element on the page that actually did end up consuming it.
* If you're not getting focus, check to make sure you're returning true from
* the mouse click in HandleInputEvent.
* @param[in] instance A PP_Instance indentifying one instance of a module.
* @param[in] has_focus Indicates whether this NaCl module gained or lost
* event focus.
*/
void (*DidChangeFocus)(PP_Instance instance, PP_Bool has_focus);
/**
* This value represents a pointer to a function to handle input events.
* Returns true if the event was handled or false if it was not.
*
* If the event was handled, it will not be forwarded to the web page or
* browser. If it was not handled, it will bubble according to the normal
* rules. So it is important that a module respond accurately with whether
* event propagation should continue.
*
* Event propagation also controls focus. If you handle an event like a mouse
* event, typically your module will be given focus. Returning false means
* that the click will be given to a lower part of the page and your module
* will not receive focus. This allows a module to be partially transparent,
* where clicks on the transparent areas will behave like clicks to the
* underlying page.
* @param[in] instance A PP_Instance indentifying one instance of a module.
* @param[in] event The event.
* @return PP_TRUE if @a event was handled, PP_FALSE otherwise.
*/
PP_Bool (*HandleInputEvent)(PP_Instance instance,
const struct PP_InputEvent* event);
/**
* This value represents a pointer to a function that is called after
* initialize for a full-frame plugin that was instantiated based on the MIME
* type of a DOMWindow navigation. This only applies to modules that are
* registered to handle certain MIME types (not current Native Client
* modules).
*
* The given url_loader corresponds to a PPB_URLLoader instance that is
* already opened. Its response headers may be queried using
* PPB_URLLoader::GetResponseInfo. The url loader is not addrefed on behalf
* of the module, if you're going to keep a reference to it, you need to
* addref it yourself.
*
* This method returns PP_FALSE if the module cannot handle the data. In
* response to this method, the module should call ReadResponseBody to read
* the incoming data.
* @param[in] instance A PP_Instance indentifying one instance of a module.
* @param[in] url_loader A PP_Resource an open PPB_URLLoader instance.
* @return PP_TRUE if the data was handled, PP_FALSE otherwise.
*/
PP_Bool (*HandleDocumentLoad)(PP_Instance instance, PP_Resource url_loader);
};
#ifdef PPAPI_INSTANCE_REMOVE_SCRIPTING
struct PPP_Instance_0_4 {
#else
struct PPP_Instance {
#endif
PP_Bool (*DidCreate)(PP_Instance instance,
uint32_t argc,
const char* argn[],
const char* argv[]);
void (*DidDestroy)(PP_Instance instance);
void (*DidChangeView)(PP_Instance instance,
const struct PP_Rect* position,
const struct PP_Rect* clip);
void (*DidChangeFocus)(PP_Instance instance, PP_Bool has_focus);
PP_Bool (*HandleInputEvent)(PP_Instance instance,
const struct PP_InputEvent* event);
PP_Bool (*HandleDocumentLoad)(PP_Instance instance, PP_Resource url_loader);
struct PP_Var (*GetInstanceObject)(PP_Instance instance);
};
/**
* @}
*/
#ifdef PPAPI_INSTANCE_REMOVE_SCRIPTING
typedef struct PPP_Instance PPP_Instance_0_5;
#else
typedef struct PPP_Instance PPP_Instance_0_4;
#endif
#endif /* PPAPI_C_PPP_INSTANCE_H_ */