Home | History | Annotate | Download | only in api
      1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 /**
      7  * This file defines the <code>PPP_Instance</code> structure - a series of
      8  * pointers to methods that you must implement in your module.
      9  */
     10 
     11 label Chrome {
     12   M14 = 1.0,
     13   M17 = 1.1
     14 };
     15 
     16 /**
     17  * The <code>PPP_Instance</code> interface contains pointers to a series of
     18  * functions that you must implement in your module. These functions can be
     19  * trivial (simply return the default return value) unless you want your module
     20  * to handle events such as change of focus or input events (keyboard/mouse)
     21  * events.
     22  */
     23 interface PPP_Instance {
     24   /**
     25    * DidCreate() is a creation handler that is called when a new instance is
     26    * created. This function is called for each instantiation on the page,
     27    * corresponding to one \<embed\> tag on the page.
     28    *
     29    * Generally you would handle this call by initializing the information
     30    * your module associates with an instance and creating a mapping from the
     31    * given <code>PP_Instance</code> handle to this data. The
     32    * <code>PP_Instance</code> handle will be used in subsequent calls to
     33    * identify which instance the call pertains to.
     34    *
     35    * It's possible for more than one instance to be created in a single module.
     36    * This means that you may get more than one <code>OnCreate</code> without an
     37    * <code>OnDestroy</code> in between, and should be prepared to maintain
     38    * multiple states associated with each instance.
     39    *
     40    * If this function reports a failure (by returning <code>PP_FALSE</code>),
     41    * the instance will be deleted.
     42    *
     43    * @param[in] instance A new <code>PP_Instance</code> identifying one
     44    * instance of a module. This is an opaque handle.
     45    *
     46    * @param[in] argc The number of arguments contained in <code>argn</code>
     47    * and <code>argv</code>.
     48    *
     49    * @param[in] argn An array of argument names.  These argument names are
     50    * supplied in the \<embed\> tag, for example:
     51    * <code>\<embed id="nacl_module" dimensions="2"\></code> will produce two
     52    * argument names: "id" and "dimensions."
     53    *
     54    * @param[in] argv An array of argument values.  These are the values of the
     55    * arguments listed in the \<embed\> tag, for example
     56    * <code>\<embed id="nacl_module" dimensions="2"\></code> will produce two
     57    * argument values: "nacl_module" and "2".  The indices of these values match
     58    * the indices of the corresponding names in <code>argn</code>.
     59    *
     60    * @return <code>PP_TRUE</code> on success or <code>PP_FALSE</code> on
     61    * failure.
     62    */
     63   PP_Bool DidCreate(
     64       /* A PP_Instance identifying one instance of a module. */
     65       [in] PP_Instance instance,
     66       /* The number of arguments contained in argn and argv. */
     67       [in] uint32_t argc,
     68       /* An array of argument names.  These argument names are
     69        * supplied in the <embed> tag, for example:
     70        * <embed id="nacl_module" dimensions="2"> will produce two argument
     71        * names: "id" and "dimensions."
     72        */
     73       [in, size_as=argc] str_t[] argn,
     74       /* An array of argument values.  These are the values of the
     75        * arguments listed in the <embed> tag, for example
     76        * <embed id="nacl_module" dimensions="2"> will produce two argument
     77        * values: "nacl_module" and "2."  The indices of these values match the
     78        * indices of the corresponding names in argn.
     79        */
     80       [in, size_as=argc] str_t[] argv);
     81 
     82   /**
     83    * DidDestroy() is an instance destruction handler. This function is called
     84    * in many cases (see below) when a module instance is destroyed. It will be
     85    * called even if DidCreate() returned failure.
     86    *
     87    * Generally you will handle this call by deallocating the tracking
     88    * information and the <code>PP_Instance</code> mapping you created in the
     89    * DidCreate() call. You can also free resources associated with this
     90    * instance but this isn't required; all resources associated with the deleted
     91    * instance will be automatically freed when this function returns.
     92    *
     93    * The instance identifier will still be valid during this call, so the module
     94    * can perform cleanup-related tasks. Once this function returns, the
     95    * <code>PP_Instance</code> handle will be invalid. This means that you can't
     96    * do any asynchronous operations like network requests, file writes or
     97    * messaging from this function since they will be immediately canceled.
     98    *
     99    * <strong>Note:</strong> This function will always be skipped on untrusted
    100    * (Native Client) implementations. This function may be skipped on trusted
    101    * implementations in certain circumstances when Chrome does "fast shutdown"
    102    * of a web page. Fast shutdown will happen in some cases when all module
    103    * instances are being deleted, and no cleanup functions will be called.
    104    * The module will just be unloaded and the process terminated.
    105    *
    106    * @param[in] instance A <code>PP_Instance</code> identifying one instance
    107    * of a module.
    108    */
    109   void DidDestroy(
    110       /* A PP_Instance identifying one instance of a module. */
    111       [in] PP_Instance instance);
    112 
    113   /**
    114    * Deprecated in 1.1 in favor of the version that takes a Resource.
    115    *
    116    * DidChangeView() is called when the position, the size, of the clip
    117    * rectangle of the element in the browser that corresponds to this
    118    * instance has changed.
    119    *
    120    * A typical implementation will check the size of the <code>position</code>
    121    * argument and reallocate the graphics context when a different size is
    122    * received. Note that this function will be called for scroll events where
    123    * the size doesn't change, so you should always check that the size is
    124    * actually different before doing any reallocations.
    125    *
    126    * @param[in] instance A <code>PP_Instance</code> identifying the instance
    127    * that has changed.
    128    *
    129    * @param[in] position The location on the page of the instance. This is
    130    * relative to the top left corner of the viewport, which changes as the
    131    * page is scrolled. Generally the size of this value will be used to create
    132    * a graphics device, and the position is ignored (most things are relative
    133    * to the instance so the absolute position isn't useful in most cases).
    134    *
    135    * @param[in] clip The visible region of the instance. This is relative to
    136    * the top left of the module's coordinate system (not the page).  If the
    137    * module is invisible, <code>clip</code> will be (0, 0, 0, 0).
    138    *
    139    * It's recommended to check for invisible instances and to stop
    140    * generating graphics updates in this case to save system resources. It's
    141    * not usually worthwhile, however, to generate partial updates according to
    142    * the clip when the instance is partially visible. Instead, update the entire
    143    * region. The time saved doing partial paints is usually not significant and
    144    * it can create artifacts when scrolling (this notification is sent
    145    * asynchronously from scrolling so there can be flashes of old content in the
    146    * exposed regions).
    147    */
    148   void DidChangeView(
    149       /* A PP_Instance identifying the instance whose view changed. */
    150       [in] PP_Instance instance,
    151       /* The new location on the page of this instance. This is relative to
    152        * the top left corner of the viewport, which changes as the
    153        * page is scrolled.
    154        */
    155       [in] PP_Rect position,
    156       /* The visible region of the NaCl module. This is relative to the top
    157        * left of the plugin's coordinate system (not the page)  If the plugin
    158        * is invisible, clip will be (0, 0, 0, 0).
    159        */
    160       [in] PP_Rect clip);
    161 
    162   /**
    163    * <code>DidChangeView() is called when the position, size, or other view
    164    * attributes of the instance has changed.
    165    */
    166   [version=1.1]
    167   void DidChangeView(
    168       /* A PP_Instance identifying the instance whose view changed. */
    169       [in] PP_Instance instance,
    170       /**
    171        * A handle to a <code>PPB_View</code> resource identifying the new view.
    172        */
    173       [in] PP_Resource view);
    174 
    175   /**
    176    * DidChangeFocus() is called when an instance has gained or lost focus.
    177    * Having focus means that keyboard events will be sent to the instance.
    178    * An instance's default condition is that it will not have focus.
    179    *
    180    * The focus flag takes into account both browser tab and window focus as
    181    * well as focus of the plugin element on the page. In order to be deemed
    182    * to have focus, the browser window must be topmost, the tab must be
    183    * selected in the window, and the instance must be the focused element on
    184    * the page.
    185    *
    186    * <strong>Note:</strong>Clicks on instances will give focus only if you
    187    * handle the click event. Return <code>true</code> from
    188    * <code>HandleInputEvent</code> in <code>PPP_InputEvent</code> (or use
    189    * unfiltered events) to signal that the click event was handled. Otherwise,
    190    * the browser will bubble the event and give focus to the element on the page
    191    * that actually did end up consuming it. If you're not getting focus, check
    192    * to make sure you're either requesting them via
    193    * <code>RequestInputEvents()<code> (which implicitly marks all input events
    194    * as consumed) or via <code>RequestFilteringInputEvents()</code> and
    195    * returning true from your event handler.
    196    *
    197    * @param[in] instance A <code>PP_Instance</code> identifying the instance
    198    * receiving the input event.
    199    *
    200    * @param[in] has_focus Indicates the new focused state of the instance.
    201    */
    202   void DidChangeFocus(
    203       /* A PP_Instance identifying one instance of a module. */
    204       [in] PP_Instance instance,
    205       /* Indicates whether this NaCl module gained or lost event focus. */
    206       [in] PP_Bool has_focus);
    207 
    208   /**
    209    * HandleDocumentLoad() is called after initialize for a full-frame
    210    * instance that was instantiated based on the MIME type of a DOMWindow
    211    * navigation. This situation only applies to modules that are pre-registered
    212    * to handle certain MIME types. If you haven't specifically registered to
    213    * handle a MIME type or aren't positive this applies to you, your
    214    * implementation of this function can just return <code>PP_FALSE</code>.
    215    *
    216    * The given <code>url_loader</code> corresponds to a
    217    * <code>PPB_URLLoader</code> instance that is already opened. Its response
    218    * headers may be queried using <code>PPB_URLLoader::GetResponseInfo</code>.
    219    * The reference count for the URL loader is not incremented automatically on
    220    * behalf of the module. You need to increment the reference count yourself
    221    * if you are going to keep a reference to it.
    222    *
    223    * This method returns <code>PP_FALSE</code> if the module cannot handle the
    224    * data. In response to this method, the module should call
    225    * ReadResponseBody() to read the incoming data.
    226    *
    227    * @param[in] instance A <code>PP_Instance</code> identifying the instance
    228    * that should do the load.
    229    *
    230    * @param[in] url_loader An open <code>PPB_URLLoader</code> instance.
    231    *
    232    * @return <code>PP_TRUE</code> if the data was handled,
    233    * <code>PP_FALSE</code> otherwise.  If you return false, the load will be
    234    * canceled for you.
    235    */
    236   PP_Bool HandleDocumentLoad(
    237       /* A PP_Instance identifying one instance of a module. */
    238       [in] PP_Instance instance,
    239       /* A PP_Resource an open PPB_URLLoader instance. */
    240       [in] PP_Resource url_loader);
    241 
    242 };
    243