/* 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 PPP_Instance structure - a series of * pointers to methods that you must implement in your module. */ label Chrome { M14 = 1.0, M17 = 1.1 }; /** * 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. */ interface PPP_Instance { /** * DidCreate() is a creation handler that is called when a new instance is * created. This function is called for each instantiation on the page, * corresponding to one \ tag on the page. * * Generally you would handle this call by initializing the information * your module associates with an instance and creating a mapping from the * given PP_Instance handle to this data. The * PP_Instance handle will be used in subsequent calls to * identify which instance the call pertains to. * * It's possible for more than one instance to be created in a single module. * This means that you may get more than one OnCreate without an * OnDestroy in between, and should be prepared to maintain * multiple states associated with each instance. * * If this function reports a failure (by returning PP_FALSE), * the instance will be deleted. * * @param[in] instance A new PP_Instance identifying one * instance of a module. This is an opaque handle. * * @param[in] argc The number of arguments contained in argn * and argv. * * @param[in] argn An array of argument names. These argument names are * supplied in the \ tag, for example: * \ 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 \ tag, for example * \ will produce two * argument values: "nacl_module" and "2". The indices of these values match * the indices of the corresponding names in argn. * * @return PP_TRUE on success or PP_FALSE on * failure. */ PP_Bool DidCreate( /* A PP_Instance identifying one instance of a module. */ [in] PP_Instance instance, /* The number of arguments contained in argn and argv. */ [in] uint32_t argc, /* An array of argument names. These argument names are * supplied in the tag, for example: * will produce two argument * names: "id" and "dimensions." */ [in, size_as=argc] str_t[] argn, /* An array of argument values. These are the values of the * arguments listed in the tag, for example * will produce two argument * values: "nacl_module" and "2." The indices of these values match the * indices of the corresponding names in argn. */ [in, size_as=argc] str_t[] argv); /** * DidDestroy() is an instance destruction handler. This function is called * in many cases (see below) when a module instance is destroyed. It will be * called even if DidCreate() returned failure. * * Generally you will handle this call by deallocating the tracking * information and the PP_Instance mapping you created in the * DidCreate() call. You can also free resources associated with this * instance but this isn't required; all resources associated with the deleted * instance will be automatically freed when this function returns. * * The instance identifier will still be valid during this call, so the module * can perform cleanup-related tasks. Once this function returns, the * PP_Instance handle will be invalid. This means that you can't * do any asynchronous operations like network requests, file writes or * messaging from this function since they will be immediately canceled. * * Note: This function will always be skipped on untrusted * (Native Client) implementations. This function may be skipped on trusted * implementations in certain circumstances when Chrome does "fast shutdown" * of a web page. Fast shutdown will happen in some cases when all module * instances are being deleted, and no cleanup functions will be called. * The module will just be unloaded and the process terminated. * * @param[in] instance A PP_Instance identifying one instance * of a module. */ void DidDestroy( /* A PP_Instance identifying one instance of a module. */ [in] PP_Instance instance); /** * Deprecated in 1.1 in favor of the version that takes a Resource. * * DidChangeView() is called when the position, the size, of the clip * rectangle of the element in the browser that corresponds to this * instance has changed. * * A typical implementation will check the size of the position * argument and reallocate the graphics context when a different size is * received. Note that this function will be called for scroll events where * the size doesn't change, so you should always check that the size is * actually different before doing any reallocations. * * @param[in] instance A PP_Instance identifying the instance * that has changed. * * @param[in] position The location on the page of the instance. This is * relative to the top left corner of the viewport, which changes as the * page is scrolled. Generally the size of this value will be used to create * a graphics device, and the position is ignored (most things are relative * to the instance so the absolute position isn't useful in most cases). * * @param[in] clip The visible region of the instance. This is relative to * the top left of the module's coordinate system (not the page). If the * module is invisible, clip will be (0, 0, 0, 0). * * It's recommended to check for invisible instances and to stop * generating graphics updates in this case to save system resources. It's * not usually worthwhile, however, to generate partial updates according to * the clip when the instance is partially visible. Instead, update the entire * region. The time saved doing partial paints is usually not significant and * it can create artifacts when scrolling (this notification is sent * asynchronously from scrolling so there can be flashes of old content in the * exposed regions). */ void DidChangeView( /* A PP_Instance identifying the instance whose view changed. */ [in] PP_Instance instance, /* The new location on the page of this instance. This is relative to * the top left corner of the viewport, which changes as the * page is scrolled. */ [in] PP_Rect position, /* 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, clip will be (0, 0, 0, 0). */ [in] PP_Rect clip); /** * DidChangeView() is called when the position, size, or other view * attributes of the instance has changed. */ [version=1.1] void DidChangeView( /* A PP_Instance identifying the instance whose view changed. */ [in] PP_Instance instance, /** * A handle to a PPB_View resource identifying the new view. */ [in] PP_Resource view); /** * DidChangeFocus() is called when an instance has gained or lost focus. * Having focus means that keyboard events will be sent to the instance. * An instance's default condition is that it will not have focus. * * The focus flag takes into account both browser tab and window focus as * well as focus of the plugin element on the page. In order to be deemed * to have focus, the browser window must be topmost, the tab must be * selected in the window, and the instance must be the focused element on * the page. * * Note:Clicks on instances will give focus only if you * handle the click event. Return true from * HandleInputEvent in PPP_InputEvent (or use * unfiltered events) 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 either requesting them via * RequestInputEvents() (which implicitly marks all input events * as consumed) or via RequestFilteringInputEvents() and * returning true from your event handler. * * @param[in] instance A PP_Instance identifying the instance * receiving the input event. * * @param[in] has_focus Indicates the new focused state of the instance. */ void DidChangeFocus( /* A PP_Instance identifying one instance of a module. */ [in] PP_Instance instance, /* Indicates whether this NaCl module gained or lost event focus. */ [in] PP_Bool has_focus); /** * HandleDocumentLoad() is called after initialize for a full-frame * instance that was instantiated based on the MIME type of a DOMWindow * navigation. This situation only applies to modules that are pre-registered * to handle certain MIME types. If you haven't specifically registered to * handle a MIME type or aren't positive this applies to you, your * implementation of this function can just return PP_FALSE. * * 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 reference count for the URL loader is not incremented automatically on * behalf of the module. You need to increment the reference count yourself * if you are going to keep a reference to it. * * 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 identifying the instance * that should do the load. * * @param[in] url_loader An open PPB_URLLoader instance. * * @return PP_TRUE if the data was handled, * PP_FALSE otherwise. If you return false, the load will be * canceled for you. */ PP_Bool HandleDocumentLoad( /* A PP_Instance identifying one instance of a module. */ [in] PP_Instance instance, /* A PP_Resource an open PPB_URLLoader instance. */ [in] PP_Resource url_loader); };