| Index: native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/progress-events.html
|
| diff --git a/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/progress-events.html b/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/progress-events.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..07721f933a66fbfb0dc746a76160b0ebfdd38b3a
|
| --- /dev/null
|
| +++ b/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/progress-events.html
|
| @@ -0,0 +1,434 @@
|
| +{{+bindTo:partials.standard_nacl_article}}
|
| +
|
| +<section id="progress-events">
|
| +<span id="devcycle-progress-events"></span><h1 id="progress-events"><span id="devcycle-progress-events"></span>Progress Events</h1>
|
| +<div class="contents local topic" id="contents">
|
| +<ul class="small-gap">
|
| +<li><a class="reference internal" href="#module-loading-and-progress-events" id="id3">Module loading and progress events</a></li>
|
| +<li><a class="reference internal" href="#handling-progress-events" id="id4">Handling progress events</a></li>
|
| +<li><a class="reference internal" href="#displaying-load-status" id="id5">Displaying load status</a></li>
|
| +<li><a class="reference internal" href="#the-lasterror-attribute" id="id6">The <code>lastError</code> attribute</a></li>
|
| +<li><a class="reference internal" href="#the-readystate-attribute" id="id7">The <code>readyState</code> attribute</a></li>
|
| +<li><a class="reference internal" href="#the-exitstatus-attribute" id="id8">The <code>exitStatus</code> attribute</a></li>
|
| +</ul>
|
| +</div>
|
| +<p>There are five types of events that developers can respond to in Native Client:
|
| +progress, message, view change, focus, and input events (each described in the
|
| +glossary below). This chapter describes how to monitor progress events (events
|
| +that occur during the loading and execution of a Native Client module). This
|
| +chapter assumes you are familiar with the material presented in the
|
| +<a class="reference internal" href="/native-client/overview.html"><em>Technical Overview</em></a>.</p>
|
| +<aside class="note">
|
| +The load_progress example illustrates progress event handling. You can find
|
| +this code in the <code>/examples/tutorial/load_progress/</code> directory in the Native
|
| +Client SDK download.
|
| +</aside>
|
| +<section id="module-loading-and-progress-events">
|
| +<h2 id="module-loading-and-progress-events">Module loading and progress events</h2>
|
| +<p>The Native Client runtime reports a set of state changes during the module
|
| +loading process by means of DOM progress events. This set of events is a direct
|
| +port of the proposed W3C <a class="reference external" href="http://www.w3.org/TR/progress-events/">Progress Events</a> standard (except for the <code>crash</code>
|
| +event which is an extension of the W3C standard). The following table lists the
|
| +events types reported by the Native Client runtime:</p>
|
| +<table border="1" class="docutils">
|
| +<colgroup>
|
| +</colgroup>
|
| +<thead valign="bottom">
|
| +<tr class="row-odd"><th class="head">Event</th>
|
| +<th class="head">Description</th>
|
| +<th class="head">Number of
|
| +times
|
| +triggered</th>
|
| +<th class="head">When event is
|
| +triggered</th>
|
| +<th class="head">How you might
|
| +react to
|
| +event</th>
|
| +</tr>
|
| +</thead>
|
| +<tbody valign="top">
|
| +<tr class="row-even"><td><code>loadstart</code></td>
|
| +<td>Native Client has
|
| +started to load a
|
| +Native Client
|
| +module.</td>
|
| +<td>once</td>
|
| +<td>This is the
|
| +first
|
| +progress
|
| +event
|
| +triggered
|
| +after the
|
| +Native Client
|
| +module is
|
| +instantiated
|
| +and
|
| +initialized.</td>
|
| +<td>Display a
|
| +status
|
| +message, such
|
| +as
|
| +“Loading...”</td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>progress</code></td>
|
| +<td>Part of the module
|
| +has been loaded.</td>
|
| +<td>zero or
|
| +more</td>
|
| +<td>After
|
| +<code>loadstart</code>
|
| +has been
|
| +dispatched.</td>
|
| +<td>Display a
|
| +progress bar.</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>error</code></td>
|
| +<td>The Native Client
|
| +module failed to
|
| +start execution
|
| +(includes any
|
| +error before or
|
| +during
|
| +initialization of
|
| +the module). The
|
| +<code>lastError</code>
|
| +attribute
|
| +(mentioned later)
|
| +provides details
|
| +on the error
|
| +(initialization
|
| +failed, sel_ldr
|
| +did not start,
|
| +and so on).</td>
|
| +<td>zero or
|
| +once</td>
|
| +<td>After the
|
| +last
|
| +<code>progress</code>
|
| +event has
|
| +been
|
| +dispatched,
|
| +or after
|
| +<code>loadstart</code>
|
| +if no
|
| +<code>progress</code>
|
| +event was
|
| +dispatched.</td>
|
| +<td>Inform user
|
| +that the
|
| +application
|
| +failed to
|
| +load.</td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>abort</code></td>
|
| +<td>Loading of the
|
| +Native Client
|
| +module was
|
| +aborted by the
|
| +user.</td>
|
| +<td>zero or
|
| +once</td>
|
| +<td>After the
|
| +last
|
| +<code>progress</code>
|
| +event has
|
| +been
|
| +dispatched,
|
| +or after
|
| +<code>loadstart</code>
|
| +if no
|
| +<code>progress</code>
|
| +event was
|
| +dispatched.</td>
|
| +<td>It’s not
|
| +likely you
|
| +will want to
|
| +respond to
|
| +this event.</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>load</code></td>
|
| +<td>The Native Client
|
| +module was
|
| +successfully
|
| +loaded, and
|
| +execution was
|
| +started. (The
|
| +module was
|
| +initialized
|
| +successfully.)</td>
|
| +<td>zero or
|
| +once</td>
|
| +<td>After the
|
| +last
|
| +<code>progress</code>
|
| +event has
|
| +been
|
| +dispatched,
|
| +or after
|
| +<code>loadstart</code>
|
| +if no
|
| +<code>progress</code>
|
| +event was
|
| +dispatched.</td>
|
| +<td>Remove the
|
| +progress bar.</td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>loadend</code></td>
|
| +<td>Loading of the
|
| +Native Client
|
| +module has
|
| +stopped. Load
|
| +succeeded
|
| +(<code>load</code>),
|
| +failed
|
| +(<code>error</code>), or
|
| +was aborted
|
| +(<code>abort</code>).</td>
|
| +<td>once</td>
|
| +<td>After an
|
| +<code>error</code>,
|
| +<code>abort</code>, or
|
| +<code>load</code>
|
| +event was
|
| +dispatched.</td>
|
| +<td>Indicate
|
| +loading is
|
| +over
|
| +(regardless
|
| +of failure or
|
| +not).</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>crash</code></td>
|
| +<td>The Native Client
|
| +module is not
|
| +responding (died
|
| +on an
|
| +<code>assert()</code> or
|
| +<code>exit()</code>) after
|
| +a successful
|
| +load. This event
|
| +is unique to
|
| +Native Client and
|
| +is not part of
|
| +the W3C Progress
|
| +Events standard.
|
| +The <code>exitStatus</code>
|
| +attribute provides
|
| +the numeric exit
|
| +status value.</td>
|
| +<td>zero or
|
| +once</td>
|
| +<td>After a
|
| +<code>loadend</code>.</td>
|
| +<td>Notify user
|
| +that the
|
| +module did
|
| +something
|
| +illegal.</td>
|
| +</tr>
|
| +</tbody>
|
| +</table>
|
| +<p>The sequence of events for a successful module load is as follows:</p>
|
| +<table border="1" class="docutils">
|
| +<colgroup>
|
| +</colgroup>
|
| +<thead valign="bottom">
|
| +<tr class="row-odd"><th class="head">Event is dispatched</th>
|
| +<th class="head">... then this task is attempted</th>
|
| +</tr>
|
| +</thead>
|
| +<tbody valign="top">
|
| +<tr class="row-even"><td><code>loadstart</code></td>
|
| +<td>load the manifest file</td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>progress</code> (first time)</td>
|
| +<td>load the module</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>progress</code> (subsequent times)</td>
|
| +<td> </td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>load</code></td>
|
| +<td>start executing the module</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>loadend</code></td>
|
| +<td> </td>
|
| +</tr>
|
| +</tbody>
|
| +</table>
|
| +<p>Errors that occur during loading are logged to the JavaScript console in Google
|
| +Chrome (select the menu icon <img alt="menu-icon" src="/native-client/images/menu-icon.png" /> > Tools > JavaScript console).</p>
|
| +</section><section id="handling-progress-events">
|
| +<h2 id="handling-progress-events">Handling progress events</h2>
|
| +<p>You should add event listeners in a <code><script></code> element to listen for these
|
| +events before the <code><embed></code> element is parsed. For example, the following code
|
| +adds a listener for the <code>load</code> event to a parent <code><div></code> element that also
|
| +contains the Native Client <code><embed></code> element. First, the listener is
|
| +attached. Then, when the listener <code><div></code> receives the <code>load</code> event, the
|
| +JavaScript <code>moduleDidLoad()</code> function is called. The following code is
|
| +excerpted from the example in <code>getting_started/part1/</code>:</p>
|
| +<pre class="prettyprint">
|
| +<!--
|
| +Load the published pexe.
|
| +Note: Since this module does not use any real-estate in the browser, its
|
| +width and height are set to 0.
|
| +
|
| +Note: The <embed> element is wrapped inside a <div>, which has both a 'load'
|
| +and a 'message' event listener attached. This wrapping method is used
|
| +instead of attaching the event listeners directly to the <embed> element to
|
| +ensure that the listeners are active before the NaCl module 'load' event
|
| +fires. This also allows you to use PPB_Messaging.PostMessage() (in C) or
|
| +pp::Instance.PostMessage() (in C++) from within the initialization code in
|
| +your module.
|
| +-->
|
| +<div id="listener">
|
| + <script type="text/javascript">
|
| + var listener = document.getElementById('listener');
|
| + listener.addEventListener('load', moduleDidLoad, true);
|
| + listener.addEventListener('message', handleMessage, true);
|
| + </script>
|
| +
|
| + <embed id="hello_tutorial"
|
| + width=0 height=0
|
| + src="hello_tutorial.nmf"
|
| + type="application/x-pnacl" />
|
| +</div>
|
| +</pre>
|
| +<p>Event listeners can be added to any DOM object. Since listeners set at the
|
| +outermost scope capture events for their contained elements, you can set
|
| +listeners on outer elements (including the <code><body></code> element) to handle events
|
| +from inner elements. For more information, see the W3 specifications for <a class="reference external" href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture">event
|
| +flow capture</a> and
|
| +<a class="reference external" href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">event listener registration</a>.</p>
|
| +</section><section id="displaying-load-status">
|
| +<h2 id="displaying-load-status">Displaying load status</h2>
|
| +<p>One common response to progress events is to display the percentage of the
|
| +module that has been loaded. In the load_progress example, when the <code>progress</code>
|
| +event is triggered the <code>moduleLoadProgress</code> function is called. This function
|
| +uses the <code>lengthComputable</code>, <code>loaded</code>, and <code>total</code> attributes (described
|
| +in the proposed W3C <a class="reference external" href="http://www.w3.org/TR/progress-events/">Progress Events</a>
|
| +standard) of the event to calculate the percentage of the module that has
|
| +loaded.</p>
|
| +<pre class="prettyprint">
|
| +function moduleLoadProgress(event) {
|
| + var loadPercent = 0.0;
|
| + var loadPercentString;
|
| + if (event.lengthComputable && event.total > 0) {
|
| + loadPercent = event.loaded / event.total * 100.0;
|
| + loadPercentString = loadPercent + '%';
|
| + common.logMessage('progress: ' + event.url + ' ' + loadPercentString +
|
| + ' (' + event.loaded + ' of ' + event.total + ' bytes)');
|
| + } else {
|
| + // The total length is not yet known.
|
| + common.logMessage('progress: Computing...');
|
| + }
|
| +}
|
| +</pre>
|
| +</section><section id="the-lasterror-attribute">
|
| +<h2 id="the-lasterror-attribute">The <code>lastError</code> attribute</h2>
|
| +<p>The <code><embed></code> element has a <code>lastError</code> attribute that is set to an
|
| +informative string whenever a load failure (an <code>error</code> or <code>abort</code> event)
|
| +occurs.</p>
|
| +<p>The following code adds an event listener before the <code><embed></code> element to
|
| +capture and handle an error in loading the Native Client module. The
|
| +<code>handleError()</code> function listens for an <code>error</code> event. When an error occurs,
|
| +this function prints the contents of the <code>lastError</code> attribute
|
| +(<code>embed_element.lastError</code>) as an alert.</p>
|
| +<pre class="prettyprint">
|
| +function domContentLoaded(name, tc, config, width, height) {
|
| + var listener = document.getElementById('listener');
|
| + ...
|
| + listener.addEventListener('error', moduleLoadError, true);
|
| + ...
|
| + common.createNaClModule(name, tc, config, width, height);
|
| +}
|
| +
|
| +function moduleLoadError() {
|
| + common.logMessage('error: ' + common.naclModule.lastError);
|
| +}
|
| +</pre>
|
| +</section><section id="the-readystate-attribute">
|
| +<h2 id="the-readystate-attribute">The <code>readyState</code> attribute</h2>
|
| +<p>You can use the <code>readyState</code> attribute to monitor the loading process. This
|
| +attribute is particularly useful if you don’t care about the details of
|
| +individual progress events or when you want to poll for current load state
|
| +without registering listeners. The value of <code>readyState</code> progresses as follows
|
| +for a successful load:</p>
|
| +<table border="1" class="docutils">
|
| +<colgroup>
|
| +</colgroup>
|
| +<thead valign="bottom">
|
| +<tr class="row-odd"><th class="head">Event</th>
|
| +<th class="head"><code>readyState</code> value</th>
|
| +</tr>
|
| +</thead>
|
| +<tbody valign="top">
|
| +<tr class="row-even"><td>(before any events)</td>
|
| +<td><code>undefined</code></td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>loadstart</code></td>
|
| +<td>1</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>progress</code></td>
|
| +<td>3</td>
|
| +</tr>
|
| +<tr class="row-odd"><td><code>load</code></td>
|
| +<td>4</td>
|
| +</tr>
|
| +<tr class="row-even"><td><code>loadend</code></td>
|
| +<td>4</td>
|
| +</tr>
|
| +</tbody>
|
| +</table>
|
| +<p>The following code demonstrates how to monitor the loading process using the
|
| +<code>readyState</code> attribute. As before, the script that adds the event listeners
|
| +precedes the <code><embed></code> element so that the event listeners are in place before
|
| +the progress events are generated.</p>
|
| +<pre class="prettyprint">
|
| +<html>
|
| +...
|
| + <body id="body">
|
| + <div id="status_div">
|
| + </div>
|
| + <div id="listener_div">
|
| + <script type="text/javascript">
|
| + var stat = document.getElementById('status_div');
|
| + function handleEvent(e) {
|
| + var embed_element = document.getElementById('my_embed');
|
| + stat.innerHTML +=
|
| + '<br>' + e.type + ': readyState = ' + embed_element.readyState;
|
| + }
|
| + var listener_element = document.getElementById('listener_div');
|
| + listener_element.addEventListener('loadstart', handleEvent, true);
|
| + listener_element.addEventListener('progress', handleEvent, true);
|
| + listener_element.addEventListener('load', handleEvent, true);
|
| + listener_element.addEventListener('loadend', handleEvent, true);
|
| + </script>
|
| + <embed
|
| + name="naclModule"
|
| + id="my_embed"
|
| + width=0 height=0
|
| + src="my_example.nmf"
|
| + type="application/x-pnacl" />
|
| + </div>
|
| + </body>
|
| +</html>
|
| +</pre>
|
| +</section><section id="the-exitstatus-attribute">
|
| +<h2 id="the-exitstatus-attribute">The <code>exitStatus</code> attribute</h2>
|
| +<p>This read-only attribute is set if the application calls <code>exit(n)</code>,
|
| +<code>abort()</code>, or crashes. Since NaCl modules are event handlers, there is no
|
| +need to call <code>exit(n)</code> in normal execution. If the module does exit or
|
| +crash, the <code>crash</code> progress event is issued and the <code>exitStatus</code> attribute
|
| +will contain the numeric value of the exit status:</p>
|
| +<ul class="small-gap">
|
| +<li>In the case of explicit calls to <code>exit(n)</code>, the numeric value will be
|
| +<code>n</code> (between 0 and 255).</li>
|
| +<li>In the case of crashes and calls to <code>abort()</code>, the numeric value will
|
| +be non-zero, but the exact value will depend on the chosen libc and the
|
| +target architecture, and may change in the future. Applications should not
|
| +rely on the <code>exitStatus</code> value being stable in these cases, but the value
|
| +may nevertheless be useful for temporary debugging.</li>
|
| +</ul>
|
| +</section></section>
|
| +
|
| +{{/partials.standard_nacl_article}}
|
|
|