summaryrefslogtreecommitdiff
path: root/native_client_sdk
diff options
context:
space:
mode:
authorTorne (Richard Coles) <torne@google.com>2014-03-18 10:20:56 +0000
committerTorne (Richard Coles) <torne@google.com>2014-03-18 10:20:56 +0000
commita1401311d1ab56c4ed0a474bd38c108f75cb0cd9 (patch)
tree3437151d9ae1ce20a1e53a0d98c19ca01c786394 /native_client_sdk
parentaf5066f1e36c6579e74752647e6c584438f80f94 (diff)
downloadchromium_org-a1401311d1ab56c4ed0a474bd38c108f75cb0cd9.tar.gz
Merge from Chromium at DEPS revision 257591
This commit was generated by merge_to_master.py. Change-Id: I0010df2ec3fbb5d4947cd026de2feb150ce7a6b5
Diffstat (limited to 'native_client_sdk')
-rw-r--r--native_client_sdk/PRESUBMIT.py20
-rw-r--r--native_client_sdk/doc_generated/_static/pygments.css4
-rw-r--r--native_client_sdk/doc_generated/devguide/devcycle/building.html48
-rw-r--r--native_client_sdk/doc_generated/pepper_beta/c/index.rst283
-rw-r--r--native_client_sdk/doc_generated/pepper_beta/cpp/index.rst218
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html11
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/group___enums.html59
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html25
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/index.html10
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/index.rst303
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h.html53
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h__incl.pngbin0 -> 10471 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h.html52
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h__incl.pngbin10590 -> 0 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__file__ref_8h.html20
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__media__stream__audio__track_8h.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h.html16
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h__incl.pngbin8365 -> 10887 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_buffer__0__1.html211
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_frame__0__1.html190
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___media_stream_audio_track__0__1.html42
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___var__1__2.html (renamed from native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___var__1__1.html)74
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h.html (renamed from native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h.html)10
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h__incl.pngbin0 -> 5651 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h__incl.pngbin5763 -> 0 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer-members.html40
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer.html297
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer__inherit__graph.pngbin0 -> 2590 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame-members.html39
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame.html279
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame__inherit__graph.pngbin2667 -> 0 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track-members.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track.html56
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_video_track.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource-members.html2
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html8
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.pngbin122188 -> 122147 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var-members.html2
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var.html37
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array-members.html2
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array_buffer-members.html2
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_dictionary-members.html2
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/index.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/index.rst234
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_20.pngbin121459 -> 121423 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html2
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/media__stream__audio__track_8h.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_dev/cpp/var_8h__incl.pngbin7864 -> 8909 bytes
-rw-r--r--native_client_sdk/doc_generated/pepper_stable/c/index.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_stable/c/index.rst283
-rw-r--r--native_client_sdk/doc_generated/pepper_stable/cpp/index.html4
-rw-r--r--native_client_sdk/doc_generated/pepper_stable/cpp/index.rst218
-rw-r--r--native_client_sdk/doc_generated/pepper_stable/index.html4
-rw-r--r--native_client_sdk/doc_generated/redirects.json3
-rw-r--r--native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html49
-rw-r--r--native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html103
-rw-r--r--native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html225
-rw-r--r--native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html41
-rw-r--r--native_client_sdk/doc_generated/reference/sandbox_internals/index.html20
-rw-r--r--native_client_sdk/doc_generated/rest-devsite-examples.html71
-rw-r--r--native_client_sdk/doc_generated/sitemap.html10
-rwxr-xr-xnative_client_sdk/src/build_tools/build_projects.py18
-rwxr-xr-xnative_client_sdk/src/build_tools/build_sdk.py43
-rw-r--r--native_client_sdk/src/build_tools/json/naclsdk_manifest2.json49
-rw-r--r--native_client_sdk/src/build_tools/sdk_files.list4
-rw-r--r--native_client_sdk/src/doc/Makefile187
-rw-r--r--native_client_sdk/src/doc/PRESUBMIT.py4
-rw-r--r--native_client_sdk/src/doc/README41
-rw-r--r--native_client_sdk/src/doc/_book.yaml2
-rw-r--r--native_client_sdk/src/doc/devguide/devcycle/building.rst35
-rwxr-xr-xnative_client_sdk/src/doc/doxygen/generate_docs.py5
-rw-r--r--native_client_sdk/src/doc/pepper_dev/c/index.rst16
-rw-r--r--native_client_sdk/src/doc/pepper_dev/cpp/index.rst8
-rw-r--r--native_client_sdk/src/doc/pepper_stable/c/index.rst4
-rw-r--r--native_client_sdk/src/doc/pepper_stable/cpp/index.rst4
-rw-r--r--native_client_sdk/src/doc/pepper_stable/index.rst4
-rw-r--r--native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst35
-rw-r--r--native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst79
-rw-r--r--native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst221
-rw-r--r--native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst9
-rw-r--r--native_client_sdk/src/doc/reference/sandbox_internals/index.rst25
-rw-r--r--native_client_sdk/src/doc/rest-devsite-examples.rst49
-rw-r--r--native_client_sdk/src/doc/sitemap.rst1
-rw-r--r--native_client_sdk/src/examples/api/input_event/input_event.cc4
-rw-r--r--native_client_sdk/src/examples/api/url_loader/url_loader.cc5
-rw-r--r--native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc2
-rw-r--r--native_client_sdk/src/examples/demo/earth/earth.cc4
-rw-r--r--native_client_sdk/src/gonacl_appengine/src/earth/earth.cc18
-rwxr-xr-xnative_client_sdk/src/gonacl_appengine/src/smoothlife/build.sh2
-rw-r--r--native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.css166
-rw-r--r--native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.html204
-rw-r--r--native_client_sdk/src/libraries/gmock/library.dsc2
-rw-r--r--native_client_sdk/src/libraries/gtest/library.dsc3
-rw-r--r--native_client_sdk/src/libraries/jsoncpp/library.dsc2
-rw-r--r--native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc224
-rw-r--r--native_client_sdk/src/libraries/nacl_io/kernel_intercept.h19
-rw-r--r--native_client_sdk/src/libraries/ppapi/library.dsc19
-rw-r--r--native_client_sdk/src/libraries/ppapi_cpp/library.dsc43
-rw-r--r--native_client_sdk/src/libraries/ppapi_gles2/library.dsc2
-rw-r--r--native_client_sdk/src/libraries/sdk_util/library.dsc2
-rw-r--r--native_client_sdk/src/libraries/zlib/library.dsc2
-rw-r--r--native_client_sdk/src/resources/Makefile.library.template2
-rwxr-xr-xnative_client_sdk/src/test_all.py3
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc3
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc6
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/jspipe_test.cc3
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc16
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc10
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/mock_kernel_proxy.cc6
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/socket_test.cc3
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/tty_test.cc3
-rw-r--r--native_client_sdk/src/tools/common.mk12
-rwxr-xr-xnative_client_sdk/src/tools/create_nmf.py516
-rw-r--r--native_client_sdk/src/tools/lib/elf.py99
-rw-r--r--native_client_sdk/src/tools/lib/get_shared_deps.py217
-rwxr-xr-xnative_client_sdk/src/tools/lib/quote.py (renamed from native_client_sdk/src/tools/quote.py)2
-rw-r--r--native_client_sdk/src/tools/lib/tests/data/test.pexebin0 -> 4580 bytes
-rw-r--r--native_client_sdk/src/tools/lib/tests/data/test_dynamic_x86_32.nexe (renamed from native_client_sdk/src/tools/tests/data/test_dynamic_x86_32.nexe)bin20796 -> 20796 bytes
-rw-r--r--native_client_sdk/src/tools/lib/tests/data/test_dynamic_x86_64.nexe (renamed from native_client_sdk/src/tools/tests/data/test_dynamic_x86_64.nexe)bin24915 -> 24915 bytes
-rw-r--r--native_client_sdk/src/tools/lib/tests/data/test_static_arm.nexe (renamed from native_client_sdk/src/tools/tests/data/test_static_arm.nexe)bin388371 -> 388371 bytes
-rw-r--r--native_client_sdk/src/tools/lib/tests/data/test_static_x86_32.nexe (renamed from native_client_sdk/src/tools/tests/data/test_static_x86_32.nexe)bin330308 -> 330308 bytes
-rw-r--r--native_client_sdk/src/tools/lib/tests/data/test_static_x86_64.nexe (renamed from native_client_sdk/src/tools/tests/data/test_static_x86_64.nexe)bin396296 -> 396296 bytes
-rwxr-xr-xnative_client_sdk/src/tools/lib/tests/elf_test.py76
-rwxr-xr-xnative_client_sdk/src/tools/lib/tests/get_shared_deps_test.py135
-rwxr-xr-xnative_client_sdk/src/tools/lib/tests/quote_test.py (renamed from native_client_sdk/src/tools/tests/quote_test.py)2
-rwxr-xr-xnative_client_sdk/src/tools/nacl_config.py5
-rw-r--r--native_client_sdk/src/tools/nacl_gcc.mk25
-rwxr-xr-xnative_client_sdk/src/tools/tests/create_nmf_test.py594
129 files changed, 3483 insertions, 3531 deletions
diff --git a/native_client_sdk/PRESUBMIT.py b/native_client_sdk/PRESUBMIT.py
index d219be389a..ac9fd612e5 100644
--- a/native_client_sdk/PRESUBMIT.py
+++ b/native_client_sdk/PRESUBMIT.py
@@ -38,12 +38,14 @@ def CheckChangeOnCommit(input_api, output_api):
return CommonChecks(input_api, output_api)
-def GetPreferredTrySlaves(project, change):
- return [
- 'linux_nacl_sdk',
- 'linux_nacl_sdk_build',
- 'win_nacl_sdk',
- 'win_nacl_sdk_build',
- 'mac_nacl_sdk',
- 'mac_nacl_sdk_build'
- ]
+def GetPreferredTryMasters(project, change):
+ return {
+ 'tryserver.chromium': {
+ 'linux_nacl_sdk': set(['defaulttests']),
+ 'linux_nacl_sdk_build': set(['defaulttests']),
+ 'win_nacl_sdk': set(['defaulttests']),
+ 'win_nacl_sdk_build': set(['defaulttests']),
+ 'mac_nacl_sdk': set(['defaulttests']),
+ 'mac_nacl_sdk_build': set(['defaulttests']),
+ }
+ }
diff --git a/native_client_sdk/doc_generated/_static/pygments.css b/native_client_sdk/doc_generated/_static/pygments.css
index d79caa151c..1a14f2ae1a 100644
--- a/native_client_sdk/doc_generated/_static/pygments.css
+++ b/native_client_sdk/doc_generated/_static/pygments.css
@@ -13,11 +13,11 @@
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #333333 } /* Generic.Output */
+.highlight .go { color: #303030 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .gt { color: #0040D0 } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/building.html b/native_client_sdk/doc_generated/devguide/devcycle/building.html
index 9431767115..3737c05c67 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/building.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/building.html
@@ -21,22 +21,23 @@
<li><a class="reference internal" href="#create-a-static-library" id="id13">Create a static library</a></li>
<li><a class="reference internal" href="#link-the-application" id="id14">Link the application</a></li>
<li><a class="reference internal" href="#finalizing-the-pexe-for-deployment" id="id15">Finalizing the <strong>pexe</strong> for deployment</a></li>
+<li><a class="reference internal" href="#compressing-the-pexe-for-deployment" id="id16">Compressing the <strong>pexe</strong> for deployment</a></li>
</ul>
</li>
-<li><p class="first"><a class="reference internal" href="#the-gnu-based-toolchains" id="id16">The GNU-based toolchains</a></p>
+<li><p class="first"><a class="reference internal" href="#the-gnu-based-toolchains" id="id17">The GNU-based toolchains</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#compiling" id="id17">Compiling</a></li>
-<li><a class="reference internal" href="#creating-libraries-and-linking" id="id18">Creating libraries and Linking</a></li>
-<li><a class="reference internal" href="#finalizing-a-nexe-for-deployment" id="id19">Finalizing a <strong>nexe</strong> for deployment</a></li>
+<li><a class="reference internal" href="#compiling" id="id18">Compiling</a></li>
+<li><a class="reference internal" href="#creating-libraries-and-linking" id="id19">Creating libraries and Linking</a></li>
+<li><a class="reference internal" href="#finalizing-a-nexe-for-deployment" id="id20">Finalizing a <strong>nexe</strong> for deployment</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#using-make" id="id20">Using make</a></li>
-<li><a class="reference internal" href="#libraries-and-header-files-provided-with-the-sdk" id="id21">Libraries and header files provided with the SDK</a></li>
-<li><p class="first"><a class="reference internal" href="#troubleshooting" id="id22">Troubleshooting</a></p>
+<li><a class="reference internal" href="#using-make" id="id21">Using make</a></li>
+<li><a class="reference internal" href="#libraries-and-header-files-provided-with-the-sdk" id="id22">Libraries and header files provided with the SDK</a></li>
+<li><p class="first"><a class="reference internal" href="#troubleshooting" id="id23">Troubleshooting</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#undefined-reference-error" id="id23">&#8220;Undefined reference&#8221; error</a></li>
-<li><a class="reference internal" href="#can-t-find-libraries-containing-necessary-symbols" id="id24">Can&#8217;t find libraries containing necessary symbols</a></li>
-<li><a class="reference internal" href="#pnacl-abi-verification-errors" id="id25">PNaCl ABI Verification errors</a></li>
+<li><a class="reference internal" href="#undefined-reference-error" id="id24">&#8220;Undefined reference&#8221; error</a></li>
+<li><a class="reference internal" href="#can-t-find-libraries-containing-necessary-symbols" id="id25">Can&#8217;t find libraries containing necessary symbols</a></li>
+<li><a class="reference internal" href="#pnacl-abi-verification-errors" id="id26">PNaCl ABI Verification errors</a></li>
</ul>
</li>
</ul>
@@ -159,6 +160,8 @@ tools include:</p>
<dd>C compiler and compiler driver</dd>
<dt>pnacl-clang++</dt>
<dd>C++ compiler and compiler driver</dd>
+<dt>pnacl-compress</dt>
+<dd>Size compresses a finalized <strong>pexe</strong> file for deployment.</dd>
<dt>pnacl-dis</dt>
<dd>Disassembler for both <strong>pexe</strong> files and <strong>nexe</strong> files</dd>
<dt>pnacl-finalize</dt>
@@ -286,6 +289,31 @@ stripping out debug information and other metadata.</p>
refer to the final version of the application before deployment.
The <code>create_nmf.py</code> tool helps generate an <code>.nmf</code> file, but <code>.nmf</code>
files can also be written by hand.</p>
+</section><section id="compressing-the-pexe-for-deployment">
+<h3 id="compressing-the-pexe-for-deployment">Compressing the <strong>pexe</strong> for deployment</h3>
+<p>Size compression is an optional step for deployment, and reduces the
+size of the pexe file that must be transmitted over the wire. The tool
+<code>pnacl-compress</code> applies compression strategies that are already built
+into the <strong>stable</strong> binary format of a pexe application. As such,
+compressed pexe files do not need any extra time to be decompressed on
+the client&#8217;s side. All costs are upfront when you call <code>pnacl-compress</code>.</p>
+<p>Currently, this tool will compress pexe files by about 25%. However,
+it is somewhat slow (can take from seconds to minutes on large
+appications). Hence, this step is optional.</p>
+<pre>
+&lt;NACL_SDK_ROOT&gt;/toolchain/win_pnacl/bin/pnacl-compress ^
+ hello_world.final.pexe
+</pre>
+<p>Tool <code>pnacl-compress</code> must be called after a pexe file has been finalized
+for deployment (via <code>pnacl-finalize</code>). Alternatively, you can apply this
+step as part of the finalizing step by adding the <code>--compress</code> flag
+to the pnacl-finalize command line.</p>
+<p>Note that this compression step doesn&#8217;t replace gzip. This compression
+step is in addition to gzipping a file for deployment. One should note
+that while the gzipped version of a compressed pexe file is still
+smaller than the corresponding uncompressed pexe file, the gains is
+somewhat smaller after being gzipped. Expected reduction in size
+(after being gzipped) is more like 7.5% to 10%.</p>
</section></section><section id="the-gnu-based-toolchains">
<h2 id="the-gnu-based-toolchains">The GNU-based toolchains</h2>
<p>Besides the PNaCl toolchain, the Native Client SDK also includes modified
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/index.rst b/native_client_sdk/doc_generated/pepper_beta/c/index.rst
deleted file mode 100644
index c08d1e6cdb..0000000000
--- a/native_client_sdk/doc_generated/pepper_beta/c/index.rst
+++ /dev/null
@@ -1,283 +0,0 @@
-.. _pepper_beta_c_index:
-
-.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
-
-##########################################
-Pepper C API Reference (Beta)
-##########################################
-
-This page lists the C API for Pepper 33. Apps that use this API can
-run in Chrome 33 or higher.
-
-`Interfaces <group___interfaces.html>`_
-=======================================
- * `PPB_Audio <struct_p_p_b___audio__1__1.html>`_
-
- * `PPB_AudioConfig <struct_p_p_b___audio_config__1__1.html>`_
-
- * `PPB_Console <struct_p_p_b___console__1__0.html>`_
-
- * `PPB_Core <struct_p_p_b___core__1__0.html>`_
-
- * `PPB_FileIO <struct_p_p_b___file_i_o__1__1.html>`_
-
- * `PPB_FileRef <struct_p_p_b___file_ref__1__1.html>`_
-
- * `PPB_FileSystem <struct_p_p_b___file_system__1__0.html>`_
-
- * `PPB_Fullscreen <struct_p_p_b___fullscreen__1__0.html>`_
-
- * `PPB_Gamepad <struct_p_p_b___gamepad__1__0.html>`_
-
- * `PPB_Graphics2D <struct_p_p_b___graphics2_d__1__1.html>`_
-
- * `PPB_Graphics3D <struct_p_p_b___graphics3_d__1__0.html>`_
-
- * `PPB_HostResolver <struct_p_p_b___host_resolver__1__0.html>`_
-
- * `PPB_IMEInputEvent <struct_p_p_b___i_m_e_input_event__1__0.html>`_
-
- * `PPB_ImageData <struct_p_p_b___image_data__1__0.html>`_
-
- * `PPB_InputEvent <struct_p_p_b___input_event__1__0.html>`_
-
- * `PPB_Instance <struct_p_p_b___instance__1__0.html>`_
-
- * `PPB_KeyboardInputEvent <struct_p_p_b___keyboard_input_event__1__0.html>`_
-
- * `PPB_MessageLoop <struct_p_p_b___message_loop__1__0.html>`_
-
- * `PPB_Messaging <struct_p_p_b___messaging__1__0.html>`_
-
- * `PPB_MouseCursor <struct_p_p_b___mouse_cursor__1__0.html>`_
-
- * `PPB_MouseInputEvent <struct_p_p_b___mouse_input_event__1__1.html>`_
-
- * `PPB_MouseLock <struct_p_p_b___mouse_lock__1__0.html>`_
-
- * `PPB_NetAddress <struct_p_p_b___net_address__1__0.html>`_
-
- * `PPB_NetworkList <struct_p_p_b___network_list__1__0.html>`_
-
- * `PPB_NetworkMonitor <struct_p_p_b___network_monitor__1__0.html>`_
-
- * `PPB_NetworkProxy <struct_p_p_b___network_proxy__1__0.html>`_
-
- * `PPB_TCPSocket <struct_p_p_b___t_c_p_socket__1__1.html>`_
-
- * `PPB_TextInputController <struct_p_p_b___text_input_controller__1__0.html>`_
-
- * `PPB_TouchInputEvent <struct_p_p_b___touch_input_event__1__0.html>`_
-
- * `PPB_UDPSocket <struct_p_p_b___u_d_p_socket__1__0.html>`_
-
- * `PPB_URLLoader <struct_p_p_b___u_r_l_loader__1__0.html>`_
-
- * `PPB_URLRequestInfo <struct_p_p_b___u_r_l_request_info__1__0.html>`_
-
- * `PPB_URLResponseInfo <struct_p_p_b___u_r_l_response_info__1__0.html>`_
-
- * `PPB_Var <struct_p_p_b___var__1__1.html>`_
-
- * `PPB_VarArray <struct_p_p_b___var_array__1__0.html>`_
-
- * `PPB_VarArrayBuffer <struct_p_p_b___var_array_buffer__1__0.html>`_
-
- * `PPB_VarDictionary <struct_p_p_b___var_dictionary__1__0.html>`_
-
- * `PPB_View <struct_p_p_b___view__1__1.html>`_
-
- * `PPB_WebSocket <struct_p_p_b___web_socket__1__0.html>`_
-
- * `PPB_WheelInputEvent <struct_p_p_b___wheel_input_event__1__0.html>`_
-
- * `PPP_Graphics3D <struct_p_p_p___graphics3_d__1__0.html>`_
-
- * `PPP_InputEvent <struct_p_p_p___input_event__0__1.html>`_
-
- * `PPP_Instance <struct_p_p_p___instance__1__1.html>`_
-
- * `PPP_Messaging <struct_p_p_p___messaging__1__0.html>`_
-
- * `PPP_MouseLock <struct_p_p_p___mouse_lock__1__0.html>`_
-
-
-`Structures <group___structs.html>`_
-====================================
- * `PP_ArrayOutput <struct_p_p___array_output.html>`_
-
- * `PP_CompletionCallback <struct_p_p___completion_callback.html>`_
-
- * `PP_DirectoryEntry <struct_p_p___directory_entry.html>`_
-
- * `PP_FileInfo <struct_p_p___file_info.html>`_
-
- * `PP_FloatPoint <struct_p_p___float_point.html>`_
-
- * `PP_GamepadSampleData <struct_p_p___gamepad_sample_data.html>`_
-
- * `PP_GamepadsSampleData <struct_p_p___gamepads_sample_data.html>`_
-
- * `PP_HostResolver_Hint <struct_p_p___host_resolver___hint.html>`_
-
- * `PP_ImageDataDesc <struct_p_p___image_data_desc.html>`_
-
- * `PP_InputEvent_Character <struct_p_p___input_event___character.html>`_
-
- * `PP_InputEvent_Key <struct_p_p___input_event___key.html>`_
-
- * `PP_InputEvent_Mouse <struct_p_p___input_event___mouse.html>`_
-
- * `PP_InputEvent_Wheel <struct_p_p___input_event___wheel.html>`_
-
- * `PP_NetAddress_IPv4 <struct_p_p___net_address___i_pv4.html>`_
-
- * `PP_NetAddress_IPv6 <struct_p_p___net_address___i_pv6.html>`_
-
- * `PP_Point <struct_p_p___point.html>`_
-
- * `PP_Rect <struct_p_p___rect.html>`_
-
- * `PP_Size <struct_p_p___size.html>`_
-
- * `PP_TouchPoint <struct_p_p___touch_point.html>`_
-
- * `PP_Var <struct_p_p___var.html>`_
-
- * `PP_VarValue <union_p_p___var_value.html>`_
-
-
-`Functions <group___functions.html>`_
-=====================================
-
-`Enums <group___enums.html>`_
-=============================
-
-`Typedefs <group___typedefs.html>`_
-===================================
-
-`Macros <globals_defs.html>`_
-=============================
-
-Files
-=====
- * `pp_array_output.h <pp__array__output_8h.html>`_
-
- * `pp_bool.h <pp__bool_8h.html>`_
-
- * `pp_completion_callback.h <pp__completion__callback_8h.html>`_
-
- * `pp_directory_entry.h <pp__directory__entry_8h.html>`_
-
- * `pp_errors.h <pp__errors_8h.html>`_
-
- * `pp_file_info.h <pp__file__info_8h.html>`_
-
- * `pp_graphics_3d.h <pp__graphics__3d_8h.html>`_
-
- * `pp_input_event.h <pp__input__event_8h.html>`_
-
- * `pp_instance.h <pp__instance_8h.html>`_
-
- * `pp_module.h <pp__module_8h.html>`_
-
- * `pp_point.h <pp__point_8h.html>`_
-
- * `pp_rect.h <pp__rect_8h.html>`_
-
- * `pp_resource.h <pp__resource_8h.html>`_
-
- * `pp_size.h <pp__size_8h.html>`_
-
- * `pp_stdint.h <pp__stdint_8h.html>`_
-
- * `pp_time.h <pp__time_8h.html>`_
-
- * `pp_touch_point.h <pp__touch__point_8h.html>`_
-
- * `pp_var.h <pp__var_8h.html>`_
-
- * `ppb.h <ppb_8h.html>`_
-
- * `ppb_audio.h <ppb__audio_8h.html>`_
-
- * `ppb_audio_config.h <ppb__audio__config_8h.html>`_
-
- * `ppb_console.h <ppb__console_8h.html>`_
-
- * `ppb_core.h <ppb__core_8h.html>`_
-
- * `ppb_file_io.h <ppb__file__io_8h.html>`_
-
- * `ppb_file_ref.h <ppb__file__ref_8h.html>`_
-
- * `ppb_file_system.h <ppb__file__system_8h.html>`_
-
- * `ppb_fullscreen.h <ppb__fullscreen_8h.html>`_
-
- * `ppb_gamepad.h <ppb__gamepad_8h.html>`_
-
- * `ppb_graphics_2d.h <ppb__graphics__2d_8h.html>`_
-
- * `ppb_graphics_3d.h <ppb__graphics__3d_8h.html>`_
-
- * `ppb_host_resolver.h <ppb__host__resolver_8h.html>`_
-
- * `ppb_image_data.h <ppb__image__data_8h.html>`_
-
- * `ppb_input_event.h <ppb__input__event_8h.html>`_
-
- * `ppb_instance.h <ppb__instance_8h.html>`_
-
- * `ppb_message_loop.h <ppb__message__loop_8h.html>`_
-
- * `ppb_messaging.h <ppb__messaging_8h.html>`_
-
- * `ppb_mouse_cursor.h <ppb__mouse__cursor_8h.html>`_
-
- * `ppb_mouse_lock.h <ppb__mouse__lock_8h.html>`_
-
- * `ppb_net_address.h <ppb__net__address_8h.html>`_
-
- * `ppb_network_list.h <ppb__network__list_8h.html>`_
-
- * `ppb_network_monitor.h <ppb__network__monitor_8h.html>`_
-
- * `ppb_network_proxy.h <ppb__network__proxy_8h.html>`_
-
- * `ppb_tcp_socket.h <ppb__tcp__socket_8h.html>`_
-
- * `ppb_text_input_controller.h <ppb__text__input__controller_8h.html>`_
-
- * `ppb_udp_socket.h <ppb__udp__socket_8h.html>`_
-
- * `ppb_url_loader.h <ppb__url__loader_8h.html>`_
-
- * `ppb_url_request_info.h <ppb__url__request__info_8h.html>`_
-
- * `ppb_url_response_info.h <ppb__url__response__info_8h.html>`_
-
- * `ppb_var.h <ppb__var_8h.html>`_
-
- * `ppb_var_array.h <ppb__var__array_8h.html>`_
-
- * `ppb_var_array_buffer.h <ppb__var__array__buffer_8h.html>`_
-
- * `ppb_var_dictionary.h <ppb__var__dictionary_8h.html>`_
-
- * `ppb_view.h <ppb__view_8h.html>`_
-
- * `ppb_websocket.h <ppb__websocket_8h.html>`_
-
- * `ppp.h <ppp_8h.html>`_
-
- * `ppp_graphics_3d.h <ppp__graphics__3d_8h.html>`_
-
- * `ppp_input_event.h <ppp__input__event_8h.html>`_
-
- * `ppp_instance.h <ppp__instance_8h.html>`_
-
- * `ppp_messaging.h <ppp__messaging_8h.html>`_
-
- * `ppp_mouse_lock.h <ppp__mouse__lock_8h.html>`_
-
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/index.rst b/native_client_sdk/doc_generated/pepper_beta/cpp/index.rst
deleted file mode 100644
index 0d4a59078e..0000000000
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/index.rst
+++ /dev/null
@@ -1,218 +0,0 @@
-.. _pepper_beta_cpp_index:
-
-.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
-
-############################################
-Pepper C++ API Reference (Beta)
-############################################
-
-This page lists the C++ API for Pepper 33. Apps that use this API can
-run in Chrome 33 or higher.
-
-`Classes <inherits.html>`_
-==========================
- * `Audio <classpp_1_1_audio.html>`_
-
- * `AudioConfig <classpp_1_1_audio_config.html>`_
-
- * `CompletionCallback <classpp_1_1_completion_callback.html>`_
-
- * `CompletionCallbackFactory <classpp_1_1_completion_callback_factory.html>`_
-
- * `CompletionCallbackWithOutput <classpp_1_1_completion_callback_with_output.html>`_
-
- * `Core <classpp_1_1_core.html>`_
-
- * `DirectoryEntry <classpp_1_1_directory_entry.html>`_
-
- * `FileIO <classpp_1_1_file_i_o.html>`_
-
- * `FileRef <classpp_1_1_file_ref.html>`_
-
- * `FileSystem <classpp_1_1_file_system.html>`_
-
- * `FloatPoint <classpp_1_1_float_point.html>`_
-
- * `Fullscreen <classpp_1_1_fullscreen.html>`_
-
- * `Graphics2D <classpp_1_1_graphics2_d.html>`_
-
- * `Graphics3D <classpp_1_1_graphics3_d.html>`_
-
- * `Graphics3DClient <classpp_1_1_graphics3_d_client.html>`_
-
- * `HostResolver <classpp_1_1_host_resolver.html>`_
-
- * `IMEInputEvent <classpp_1_1_i_m_e_input_event.html>`_
-
- * `ImageData <classpp_1_1_image_data.html>`_
-
- * `InputEvent <classpp_1_1_input_event.html>`_
-
- * `Instance <classpp_1_1_instance.html>`_
-
- * `InstanceHandle <classpp_1_1_instance_handle.html>`_
-
- * `KeyboardInputEvent <classpp_1_1_keyboard_input_event.html>`_
-
- * `MessageLoop <classpp_1_1_message_loop.html>`_
-
- * `Module <classpp_1_1_module.html>`_
-
- * `MouseCursor <classpp_1_1_mouse_cursor.html>`_
-
- * `MouseInputEvent <classpp_1_1_mouse_input_event.html>`_
-
- * `MouseLock <classpp_1_1_mouse_lock.html>`_
-
- * `NetAddress <classpp_1_1_net_address.html>`_
-
- * `NetworkList <classpp_1_1_network_list.html>`_
-
- * `NetworkMonitor <classpp_1_1_network_monitor.html>`_
-
- * `NetworkProxy <classpp_1_1_network_proxy.html>`_
-
- * `Point <classpp_1_1_point.html>`_
-
- * `Rect <classpp_1_1_rect.html>`_
-
- * `Resource <classpp_1_1_resource.html>`_
-
- * `Size <classpp_1_1_size.html>`_
-
- * `TCPSocket <classpp_1_1_t_c_p_socket.html>`_
-
- * `TextInputController <classpp_1_1_text_input_controller.html>`_
-
- * `TouchInputEvent <classpp_1_1_touch_input_event.html>`_
-
- * `TouchPoint <classpp_1_1_touch_point.html>`_
-
- * `UDPSocket <classpp_1_1_u_d_p_socket.html>`_
-
- * `URLLoader <classpp_1_1_u_r_l_loader.html>`_
-
- * `URLRequestInfo <classpp_1_1_u_r_l_request_info.html>`_
-
- * `URLResponseInfo <classpp_1_1_u_r_l_response_info.html>`_
-
- * `Var <classpp_1_1_var.html>`_
-
- * `Var11OutException <classpp_1_1_var_1_1_out_exception.html>`_
-
- * `VarArray <classpp_1_1_var_array.html>`_
-
- * `VarArrayBuffer <classpp_1_1_var_array_buffer.html>`_
-
- * `VarDictionary <classpp_1_1_var_dictionary.html>`_
-
- * `View <classpp_1_1_view.html>`_
-
- * `WebSocket <classpp_1_1_web_socket.html>`_
-
- * `WheelInputEvent <classpp_1_1_wheel_input_event.html>`_
-
- * `Ext::ExtCompletionCallbackWithOutput <classpp_1_1ext_1_1_ext_completion_callback_with_output.html>`_
-
- * `Internal::CompletionCallbackWithOutputBase <classpp_1_1internal_1_1_completion_callback_with_output_base.html>`_
-
- * `Internal::DirectoryEntryArrayOutputAdapterWithStorage <classpp_1_1internal_1_1_directory_entry_array_output_adapter_with_storage.html>`_
-
-
-Files
-=====
- * `audio.h <audio_8h.html>`_
-
- * `audio_config.h <audio__config_8h.html>`_
-
- * `completion_callback.h <completion__callback_8h.html>`_
-
- * `completion_callback_factory.h <completion__callback__factory_8h.html>`_
-
- * `core.h <core_8h.html>`_
-
- * `directory_entry.h <directory__entry_8h.html>`_
-
- * `file_io.h <file__io_8h.html>`_
-
- * `file_ref.h <file__ref_8h.html>`_
-
- * `file_system.h <file__system_8h.html>`_
-
- * `fullscreen.h <fullscreen_8h.html>`_
-
- * `graphics_2d.h <graphics__2d_8h.html>`_
-
- * `graphics_3d.h <graphics__3d_8h.html>`_
-
- * `graphics_3d_client.h <graphics__3d__client_8h.html>`_
-
- * `host_resolver.h <host__resolver_8h.html>`_
-
- * `image_data.h <image__data_8h.html>`_
-
- * `input_event.h <input__event_8h.html>`_
-
- * `instance.h <instance_8h.html>`_
-
- * `instance_handle.h <instance__handle_8h.html>`_
-
- * `logging.h <logging_8h.html>`_
-
- * `message_loop.h <message__loop_8h.html>`_
-
- * `module.h <module_8h.html>`_
-
- * `module_embedder.h <module__embedder_8h.html>`_
-
- * `module_impl.h <module__impl_8h.html>`_
-
- * `mouse_cursor.h <mouse__cursor_8h.html>`_
-
- * `mouse_lock.h <mouse__lock_8h.html>`_
-
- * `net_address.h <net__address_8h.html>`_
-
- * `network_list.h <network__list_8h.html>`_
-
- * `network_monitor.h <network__monitor_8h.html>`_
-
- * `network_proxy.h <network__proxy_8h.html>`_
-
- * `pass_ref.h <pass__ref_8h.html>`_
-
- * `point.h <point_8h.html>`_
-
- * `rect.h <rect_8h.html>`_
-
- * `resource.h <resource_8h.html>`_
-
- * `size.h <size_8h.html>`_
-
- * `tcp_socket.h <tcp__socket_8h.html>`_
-
- * `text_input_controller.h <text__input__controller_8h.html>`_
-
- * `touch_point.h <touch__point_8h.html>`_
-
- * `udp_socket.h <udp__socket_8h.html>`_
-
- * `url_loader.h <url__loader_8h.html>`_
-
- * `url_request_info.h <url__request__info_8h.html>`_
-
- * `url_response_info.h <url__response__info_8h.html>`_
-
- * `var.h <var_8h.html>`_
-
- * `var_array.h <var__array_8h.html>`_
-
- * `var_array_buffer.h <var__array__buffer_8h.html>`_
-
- * `var_dictionary.h <var__dictionary_8h.html>`_
-
- * `view.h <view_8h.html>`_
-
- * `websocket.h <websocket_8h.html>`_
-
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
index b9a6709549..54ea6430b7 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
@@ -25,8 +25,8 @@
<li>PPB_AUDIO_INTERFACE_1_1
: <a class="el" href="ppb__audio_8h.html#a05e57cf808f3ccd4467019e20832f28d">ppb_audio.h</a>
</li>
-<li>PPB_AUDIOFRAME_INTERFACE_0_1
-: <a class="el" href="ppb__audio__frame_8h.html#a8d8064bd5989ae176ec6a726d15b1a8b">ppb_audio_frame.h</a>
+<li>PPB_AUDIOBUFFER_INTERFACE_0_1
+: <a class="el" href="ppb__audio__buffer_8h.html#a4fddf6d285021552ba11f4460ba47445">ppb_audio_buffer.h</a>
</li>
<li>PPB_CONSOLE_INTERFACE
: <a class="el" href="ppb__console_8h.html#aeb04d0356a4ddc1488162c9512d318dd">ppb_console.h</a>
@@ -49,6 +49,9 @@
<li>PPB_FILEMAPPING_INTERFACE_0_1
: <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">ppb_file_mapping.h</a>
</li>
+<li>PPB_FILEREF_INTERFACE
+: <a class="el" href="ppb__file__ref_8h.html#a00615ce99f7d6774b0fc5c8f0326f0ba">ppb_file_ref.h</a>
+</li>
<li>PPB_FILEREF_INTERFACE_1_2
: <a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">ppb_file_ref.h</a>
</li>
@@ -241,8 +244,8 @@
<li>PPB_VAR_INTERFACE
: <a class="el" href="ppb__var_8h.html#a0d345a2704bcdbc588c4227b46747041">ppb_var.h</a>
</li>
-<li>PPB_VAR_INTERFACE_1_1
-: <a class="el" href="ppb__var_8h.html#acc1cbb0daac02e06063221b751084502">ppb_var.h</a>
+<li>PPB_VAR_INTERFACE_1_2
+: <a class="el" href="ppb__var_8h.html#aa29bf4400324815450e366663ea1c3a0">ppb_var.h</a>
</li>
<li>PPB_VIDEOFRAME_INTERFACE_0_1
: <a class="el" href="ppb__video__frame_8h.html#a4176d3adc972a5e92e02b9fb85dc78fd">ppb_video_frame.h</a>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html b/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
index b0ee330149..36262e85e2 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
@@ -117,6 +117,13 @@ Enumerations</h2><table class="memberdecls">
<a class="el" href="group___enums.html#gga9815041477d810724e44da862f9852eda898e69540595e8b95681d850ddecc7f1">PP_VARTYPE_RESOURCE</a> = 10
<br />
}</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> { <a class="el" href="group___enums.html#gga78757d4be14d14d17708071a9466afbdace5d37815e444b494434d9418a8dfb81">PP_AUDIOBUFFER_SAMPLERATE_UNKNOWN</a> = 0,
+<a class="el" href="group___enums.html#gga78757d4be14d14d17708071a9466afbda7a10ada2c776cf2ca4fa5a220ab23f4f">PP_AUDIOBUFFER_SAMPLERATE_8000</a> = 8000,
+<a class="el" href="group___enums.html#gga78757d4be14d14d17708071a9466afbdaef0fd009c55740284bcf6e60344395ac">PP_AUDIOBUFFER_SAMPLERATE_44100</a> = 44100
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> { <a class="el" href="group___enums.html#gga2ba5c3a8eed23fa49a73b218b1bce044a1bc7fa3874cd1ccee3cfa00e23bea379">PP_AUDIOBUFFER_SAMPLESIZE_UNKNOWN</a> = 0,
+<a class="el" href="group___enums.html#gga2ba5c3a8eed23fa49a73b218b1bce044a0cc6b2d53c4c3bc5d3f19f809a1ce6c8">PP_AUDIOBUFFER_SAMPLESIZE_16_BITS</a> = 2
+ }</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="group___enums.html#ggadf764cbdea00d65edcd07bb9953ad2b7a9bf932735e301eeecf183a9defc378b3">PP_AUDIOMINSAMPLEFRAMECOUNT</a> = 64,
<a class="el" href="group___enums.html#ggadf764cbdea00d65edcd07bb9953ad2b7a335c882fde010a0515ec5678a7003ce4">PP_AUDIOMAXSAMPLEFRAMECOUNT</a> = 32768
}</td></tr>
@@ -124,12 +131,6 @@ Enumerations</h2><table class="memberdecls">
<a class="el" href="group___enums.html#ggaee750c350655f2fb0fe04c04029e0ff8ac6d1056f50ebe082622d3250def41a54">PP_AUDIOSAMPLERATE_44100</a> = 44100,
<a class="el" href="group___enums.html#ggaee750c350655f2fb0fe04c04029e0ff8a0a3ddad3c00d75e1c57a245e599727cd">PP_AUDIOSAMPLERATE_48000</a> = 48000
}</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga388a9a1f954440d0dbaa254888f30d2d">PP_AudioFrame_SampleRate</a> { <a class="el" href="group___enums.html#gga388a9a1f954440d0dbaa254888f30d2da8fa4dfd3371f5cba806e1fe580797b1e">PP_AUDIOFRAME_SAMPLERATE_UNKNOWN</a> = 0,
-<a class="el" href="group___enums.html#gga388a9a1f954440d0dbaa254888f30d2da0fecce4b7a8b75f6c58fa72d4331a4d1">PP_AUDIOFRAME_SAMPLERATE_44100</a> = 44100
- }</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga971dbd9c541225dde753fb3ede7aac6a">PP_AudioFrame_SampleSize</a> { <a class="el" href="group___enums.html#gga971dbd9c541225dde753fb3ede7aac6aab771b69a7b40c3ee79c33ac4cf666b09">PP_AUDIOFRAME_SAMPLESIZE_UNKNOWN</a> = 0,
-<a class="el" href="group___enums.html#gga971dbd9c541225dde753fb3ede7aac6aa4c351744de007482435d3d50177ae88b">PP_AUDIOFRAME_SAMPLESIZE_16_BITS</a> = 2
- }</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gac39067c0883ec80b94290dd2a3bae440">PP_LogLevel</a> { <a class="el" href="group___enums.html#ggac39067c0883ec80b94290dd2a3bae440afe7444b89be7688e17bd6e4f0b1d3b34">PP_LOGLEVEL_TIP</a> = 0,
<a class="el" href="group___enums.html#ggac39067c0883ec80b94290dd2a3bae440a8c6fdcc8aa698af314fe72ebd08db32a">PP_LOGLEVEL_LOG</a> = 1,
<a class="el" href="group___enums.html#ggac39067c0883ec80b94290dd2a3bae440a66a3c4f684827eb994093dea14284aaf">PP_LOGLEVEL_WARNING</a> = 2,
@@ -227,7 +228,7 @@ Enumerations</h2><table class="memberdecls">
}</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2f729c238ba74adc778c0d0bc17c453f">PP_MediaStreamAudioTrack_Attrib</a> { <br />
&#160;&#160;<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa5f1f0d353fe407fe10ac3c0e908aba4f">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE</a> = 0,
-<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fafd82a0ca09456944d9966cd25987ce38">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES</a> = 1,
+<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fae157f98fb5bc32ca0e193e5b8198c7dc">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</a> = 1,
<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa5b0cf01bda3aa2bbcff7b41ffb96c425">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_RATE</a> = 2,
<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453faacb4f8d7388db7fdbeb96aa6e6309e13">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_SIZE</a> = 3,
<br />
@@ -601,42 +602,44 @@ Variables</h2><table class="memberdecls">
</dl>
</div>
</div>
-<a class="anchor" id="ga388a9a1f954440d0dbaa254888f30d2d"></a><!-- doxytag: member="ppb_audio_frame.h::PP_AudioFrame_SampleRate" ref="ga388a9a1f954440d0dbaa254888f30d2d" args="" -->
+<a class="anchor" id="ga78757d4be14d14d17708071a9466afbd"></a><!-- doxytag: member="ppb_audio_buffer.h::PP_AudioBuffer_SampleRate" ref="ga78757d4be14d14d17708071a9466afbd" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">enum <a class="el" href="group___enums.html#ga388a9a1f954440d0dbaa254888f30d2d">PP_AudioFrame_SampleRate</a></td>
+<td class="memname">enum <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a></td>
</tr>
</table>
</div>
<div class="memdoc">
-<p>PP_AudioFrame_SampleRate is an enumeration of the different audio sample rates. </p>
+<p>PP_AudioBuffer_SampleRate is an enumeration of the different audio sample rates. </p>
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" id="gga388a9a1f954440d0dbaa254888f30d2da8fa4dfd3371f5cba806e1fe580797b1e"></a><!-- doxytag: member="PP_AUDIOFRAME_SAMPLERATE_UNKNOWN" ref="gga388a9a1f954440d0dbaa254888f30d2da8fa4dfd3371f5cba806e1fe580797b1e" args="" -->PP_AUDIOFRAME_SAMPLERATE_UNKNOWN</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" id="gga78757d4be14d14d17708071a9466afbdace5d37815e444b494434d9418a8dfb81"></a><!-- doxytag: member="PP_AUDIOBUFFER_SAMPLERATE_UNKNOWN" ref="gga78757d4be14d14d17708071a9466afbdace5d37815e444b494434d9418a8dfb81" args="" -->PP_AUDIOBUFFER_SAMPLERATE_UNKNOWN</em>&nbsp;</td><td>
</td></tr>
-<tr><td valign="top"><em><a class="anchor" id="gga388a9a1f954440d0dbaa254888f30d2da0fecce4b7a8b75f6c58fa72d4331a4d1"></a><!-- doxytag: member="PP_AUDIOFRAME_SAMPLERATE_44100" ref="gga388a9a1f954440d0dbaa254888f30d2da0fecce4b7a8b75f6c58fa72d4331a4d1" args="" -->PP_AUDIOFRAME_SAMPLERATE_44100</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" id="gga78757d4be14d14d17708071a9466afbda7a10ada2c776cf2ca4fa5a220ab23f4f"></a><!-- doxytag: member="PP_AUDIOBUFFER_SAMPLERATE_8000" ref="gga78757d4be14d14d17708071a9466afbda7a10ada2c776cf2ca4fa5a220ab23f4f" args="" -->PP_AUDIOBUFFER_SAMPLERATE_8000</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga78757d4be14d14d17708071a9466afbdaef0fd009c55740284bcf6e60344395ac"></a><!-- doxytag: member="PP_AUDIOBUFFER_SAMPLERATE_44100" ref="gga78757d4be14d14d17708071a9466afbdaef0fd009c55740284bcf6e60344395ac" args="" -->PP_AUDIOBUFFER_SAMPLERATE_44100</em>&nbsp;</td><td>
</td></tr>
</table>
</dd>
</dl>
</div>
</div>
-<a class="anchor" id="ga971dbd9c541225dde753fb3ede7aac6a"></a><!-- doxytag: member="ppb_audio_frame.h::PP_AudioFrame_SampleSize" ref="ga971dbd9c541225dde753fb3ede7aac6a" args="" -->
+<a class="anchor" id="ga2ba5c3a8eed23fa49a73b218b1bce044"></a><!-- doxytag: member="ppb_audio_buffer.h::PP_AudioBuffer_SampleSize" ref="ga2ba5c3a8eed23fa49a73b218b1bce044" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">enum <a class="el" href="group___enums.html#ga971dbd9c541225dde753fb3ede7aac6a">PP_AudioFrame_SampleSize</a></td>
+<td class="memname">enum <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a></td>
</tr>
</table>
</div>
<div class="memdoc">
-<p>PP_AudioFrame_SampleSize is an enumeration of the different audio sample sizes. </p>
+<p>PP_AudioBuffer_SampleSize is an enumeration of the different audio sample sizes. </p>
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" id="gga971dbd9c541225dde753fb3ede7aac6aab771b69a7b40c3ee79c33ac4cf666b09"></a><!-- doxytag: member="PP_AUDIOFRAME_SAMPLESIZE_UNKNOWN" ref="gga971dbd9c541225dde753fb3ede7aac6aab771b69a7b40c3ee79c33ac4cf666b09" args="" -->PP_AUDIOFRAME_SAMPLESIZE_UNKNOWN</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" id="gga2ba5c3a8eed23fa49a73b218b1bce044a1bc7fa3874cd1ccee3cfa00e23bea379"></a><!-- doxytag: member="PP_AUDIOBUFFER_SAMPLESIZE_UNKNOWN" ref="gga2ba5c3a8eed23fa49a73b218b1bce044a1bc7fa3874cd1ccee3cfa00e23bea379" args="" -->PP_AUDIOBUFFER_SAMPLESIZE_UNKNOWN</em>&nbsp;</td><td>
</td></tr>
-<tr><td valign="top"><em><a class="anchor" id="gga971dbd9c541225dde753fb3ede7aac6aa4c351744de007482435d3d50177ae88b"></a><!-- doxytag: member="PP_AUDIOFRAME_SAMPLESIZE_16_BITS" ref="gga971dbd9c541225dde753fb3ede7aac6aa4c351744de007482435d3d50177ae88b" args="" -->PP_AUDIOFRAME_SAMPLESIZE_16_BITS</em>&nbsp;</td><td>
+<tr><td valign="top"><em><a class="anchor" id="gga2ba5c3a8eed23fa49a73b218b1bce044a0cc6b2d53c4c3bc5d3f19f809a1ce6c8"></a><!-- doxytag: member="PP_AUDIOBUFFER_SAMPLESIZE_16_BITS" ref="gga2ba5c3a8eed23fa49a73b218b1bce044a0cc6b2d53c4c3bc5d3f19f809a1ce6c8" args="" -->PP_AUDIOBUFFER_SAMPLESIZE_16_BITS</em>&nbsp;</td><td>
</td></tr>
</table>
</dd>
@@ -1226,7 +1229,7 @@ Variables</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>The <code>PP_MakeDirectoryFlags</code> enum contains flags used to control behavior of <code>PPB_FileRef.MakeDirectory()</code>. </p>
+<p>The <code>PP_MakeDirectoryFlags</code> enum contains flags used to control behavior of <code><a class="el" href="struct_p_p_b___file_ref__1__2.html#a829f880110d9d0756552a7070a08ed33" title="MakeDirectory() makes a new directory in the file system according to the given make_directory_flags...">PPB_FileRef.MakeDirectory()</a></code>. </p>
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><em><a class="anchor" id="ggadcb0a92e6ca510586c3f34088d35dc9fafeeef418b62780276c4671a57196ad3f"></a><!-- doxytag: member="PP_MAKEDIRECTORYFLAG_NONE" ref="ggadcb0a92e6ca510586c3f34088d35dc9fafeeef418b62780276c4671a57196ad3f" args="" -->PP_MAKEDIRECTORYFLAG_NONE</em>&nbsp;</td><td>
</td></tr>
@@ -1234,7 +1237,7 @@ Variables</h2><table class="memberdecls">
<p>Requests that ancestor directories are created if they do not exist. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="ggadcb0a92e6ca510586c3f34088d35dc9fa34dd5b5ba9af9e5c820d3c6e21fc2094"></a><!-- doxytag: member="PP_MAKEDIRECTORYFLAG_EXCLUSIVE" ref="ggadcb0a92e6ca510586c3f34088d35dc9fa34dd5b5ba9af9e5c820d3c6e21fc2094" args="" -->PP_MAKEDIRECTORYFLAG_EXCLUSIVE</em>&nbsp;</td><td>
-<p>Requests that the PPB_FileRef.MakeDirectory() call fails if the directory already exists. </p>
+<p>Requests that the <a class="el" href="struct_p_p_b___file_ref__1__2.html#a829f880110d9d0756552a7070a08ed33" title="MakeDirectory() makes a new directory in the file system according to the given make_directory_flags...">PPB_FileRef.MakeDirectory()</a> call fails if the directory already exists. </p>
</td></tr>
</table>
</dd>
@@ -1256,24 +1259,24 @@ Variables</h2><table class="memberdecls">
<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453fa5f1f0d353fe407fe10ac3c0e908aba4f"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE" ref="gga2f729c238ba74adc778c0d0bc17c453fa5f1f0d353fe407fe10ac3c0e908aba4f" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE</em>&nbsp;</td><td>
<p>Attribute list terminator. </p>
</td></tr>
-<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453fafd82a0ca09456944d9966cd25987ce38"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES" ref="gga2f729c238ba74adc778c0d0bc17c453fafd82a0ca09456944d9966cd25987ce38" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES</em>&nbsp;</td><td>
-<p>The maximum number of frames to hold in the input buffer. </p>
-<p>Note: this is only used as advisory; the browser may allocate more or fewer based on available resources. How many frames to buffer depends on usage - request at least 2 to make sure latency doesn't cause lost frames. If the plugin expects to hold on to more than one frame at a time (e.g. to do multi-frame processing), it should request that many more. </p>
+<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453fae157f98fb5bc32ca0e193e5b8198c7dc"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS" ref="gga2f729c238ba74adc778c0d0bc17c453fae157f98fb5bc32ca0e193e5b8198c7dc" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</em>&nbsp;</td><td>
+<p>The maximum number of buffers to hold audio samples. </p>
+<p>Note: this is only used as advisory; the browser may allocate more or fewer based on available resources. How many buffers depends on usage - request at least 2 to make sure latency doesn't cause lost samples. If the plugin expects to hold on to more than one buffer at a time (e.g. to do multi-buffer processing), it should request that many more. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453fa5b0cf01bda3aa2bbcff7b41ffb96c425"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_RATE" ref="gga2f729c238ba74adc778c0d0bc17c453fa5b0cf01bda3aa2bbcff7b41ffb96c425" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_RATE</em>&nbsp;</td><td>
-<p>The sample rate of audio frames. </p>
-<p>The attribute value is a <code>PP_AudioFrame_SampleRate</code>. </p>
+<p>The sample rate of audio data in buffers. </p>
+<p>The attribute value is a <code>PP_AudioBuffer_SampleRate</code>. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453faacb4f8d7388db7fdbeb96aa6e6309e13"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_SIZE" ref="gga2f729c238ba74adc778c0d0bc17c453faacb4f8d7388db7fdbeb96aa6e6309e13" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_SIZE</em>&nbsp;</td><td>
-<p>The sample size of audio frames in bytes. </p>
-<p>The attribute value is a <code>PP_AudioFrame_SampleSize</code>. </p>
+<p>The sample size of audio data in buffers in bytes. </p>
+<p>The attribute value is a <code>PP_AudioBuffer_SampleSize</code>. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453faa9fe8e2346974581d302372f844e7ef8"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_CHANNELS" ref="gga2f729c238ba74adc778c0d0bc17c453faa9fe8e2346974581d302372f844e7ef8" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_CHANNELS</em>&nbsp;</td><td>
-<p>The number of channels in audio frames. </p>
+<p>The number of channels in audio buffers. </p>
<p>Supported values: 1, 2 </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga2f729c238ba74adc778c0d0bc17c453fa13c3fa0a2740301acda8b218bac8b972"></a><!-- doxytag: member="PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION" ref="gga2f729c238ba74adc778c0d0bc17c453fa13c3fa0a2740301acda8b218bac8b972" args="" -->PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</em>&nbsp;</td><td>
-<p>The duration of audio frames in milliseconds. </p>
+<p>The duration of an audio buffer in milliseconds. </p>
<p>Valid range: 10 to 10000 </p>
</td></tr>
</table>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
index 572edbf16a..aa9ec2f707 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
@@ -13,9 +13,9 @@ Data Structures</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio__1__1.html">PPB_Audio</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Audio</code> interface contains pointers to several functions for handling audio resources. <a href="struct_p_p_b___audio__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_AudioConfig</code> interface contains pointers to several functions for establishing your audio configuration within the browser. <a href="struct_p_p_b___audio_config__1__1.html#details">More...</a><br /></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html">PPB_AudioFrame</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___console__1__0.html">PPB_Console</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___core__1__0.html">PPB_Core</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Core</code> interface contains pointers to functions related to memory management, time, and threads on the browser. <a href="struct_p_p_b___core__1__0.html#details">More...</a><br /></td></tr>
@@ -82,8 +82,8 @@ Data Structures</h2><table class="memberdecls">
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_URLRequestInfo</code> interface is used to create and handle URL requests. <a href="struct_p_p_b___u_r_l_request_info__1__0.html#details">More...</a><br /></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_response_info__1__0.html">PPB_URLResponseInfo</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The PPB_URLResponseInfo interface contains APIs for examining URL responses. <a href="struct_p_p_b___u_r_l_response_info__1__0.html#details">More...</a><br /></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__1.html">PPB_Var</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">PPB_Var API. <a href="struct_p_p_b___var__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html">PPB_Var</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">PPB_Var API. <a href="struct_p_p_b___var__1__2.html#details">More...</a><br /></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var_array__1__0.html">PPB_VarArray</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_VarArrayBuffer</code> interface provides a way to interact with JavaScript ArrayBuffers, which represent a contiguous sequence of bytes. <a href="struct_p_p_b___var_array_buffer__1__0.html#details">More...</a><br /></td></tr>
@@ -110,6 +110,7 @@ Typedefs</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___console__1__0.html">PPB_Console</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab38f2ca92926b53d58d1cf2ce6320ebb">PPB_Console</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___core__1__0.html">PPB_Core</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga34a986157c49afcad3537479bc5361e9">PPB_Core</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga7b7a4f4317a5af9982ba79d60f04db69">PPB_FileIO</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaafdfc08014561cc1479f7f1424e4c4ab">PPB_FileRef</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae5ad593b6aff864c6bd0acc09d6cc5e9">PPB_FileSystem</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga965dcf552ef79d1a41e0c24db2cf5c3c">PPB_Fullscreen</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga57baea75086a666a92489da807f16f2a">PPB_Gamepad</a></td></tr>
@@ -147,7 +148,7 @@ Typedefs</h2><table class="memberdecls">
<a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad60387934d9e235d3d145ee5a1fb4e74">PPB_URLRequestInfo</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" />
<a class="el" href="struct_p_p_b___u_r_l_response_info__1__0.html">PPB_URLResponseInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad63e57584aea115126b6922b141cf745">PPB_URLResponseInfo</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___var__1__1.html">PPB_Var</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga7363a88a6e5058841915641c1b2923ad">PPB_Var</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___var__1__2.html">PPB_Var</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1c3a6780ef84f66ac77dc1af656a8c40">PPB_Var</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___var_array__1__0.html">PPB_VarArray</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaad75327f1ecc75e58c2805fc4740d3c6">PPB_VarArray</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" />
<a class="el" href="struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab26d5bb032f5438d02faf5bdf7b208cb">PPB_VarArrayBuffer</a></td></tr>
@@ -222,6 +223,18 @@ Typedefs</h2><table class="memberdecls">
<div class="memdoc">
</div>
</div>
+<a class="anchor" id="gaafdfc08014561cc1479f7f1424e4c4ab"></a><!-- doxytag: member="ppb_file_ref.h::PPB_FileRef" ref="gaafdfc08014561cc1479f7f1424e4c4ab" args="" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">typedef struct <a class="el" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a> <a class="el" href="group___interfaces.html#gaafdfc08014561cc1479f7f1424e4c4ab">PPB_FileRef</a></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
<a class="anchor" id="gae5ad593b6aff864c6bd0acc09d6cc5e9"></a><!-- doxytag: member="ppb_file_system.h::PPB_FileSystem" ref="gae5ad593b6aff864c6bd0acc09d6cc5e9" args="" -->
<div class="memitem">
<div class="memproto">
@@ -546,12 +559,12 @@ Typedefs</h2><table class="memberdecls">
<div class="memdoc">
</div>
</div>
-<a class="anchor" id="ga7363a88a6e5058841915641c1b2923ad"></a><!-- doxytag: member="ppb_var.h::PPB_Var" ref="ga7363a88a6e5058841915641c1b2923ad" args="" -->
+<a class="anchor" id="ga1c3a6780ef84f66ac77dc1af656a8c40"></a><!-- doxytag: member="ppb_var.h::PPB_Var" ref="ga1c3a6780ef84f66ac77dc1af656a8c40" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">typedef struct <a class="el" href="struct_p_p_b___var__1__1.html">PPB_Var</a> <a class="el" href="group___interfaces.html#ga7363a88a6e5058841915641c1b2923ad">PPB_Var</a></td>
+<td class="memname">typedef struct <a class="el" href="struct_p_p_b___var__1__2.html">PPB_Var</a> <a class="el" href="group___interfaces.html#ga1c3a6780ef84f66ac77dc1af656a8c40">PPB_Var</a></td>
</tr>
</table>
</div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/index.html b/native_client_sdk/doc_generated/pepper_dev/c/index.html
index 0bf2ff078a..129039a1c5 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/index.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/index.html
@@ -9,11 +9,12 @@ run in Chrome 34 or higher.</p>
<blockquote>
<div><ul class="small-gap">
<li><a class="reference external" href="struct_p_p_b___audio__1__1.html">PPB_Audio</a></li>
+<li><a class="reference external" href="struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></li>
<li><a class="reference external" href="struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></li>
-<li><a class="reference external" href="struct_p_p_b___audio_frame__0__1.html">PPB_AudioFrame</a></li>
<li><a class="reference external" href="struct_p_p_b___console__1__0.html">PPB_Console</a></li>
<li><a class="reference external" href="struct_p_p_b___core__1__0.html">PPB_Core</a></li>
<li><a class="reference external" href="struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></li>
+<li><a class="reference external" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></li>
<li><a class="reference external" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></li>
<li><a class="reference external" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li>
<li><a class="reference external" href="struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li>
@@ -25,7 +26,7 @@ run in Chrome 34 or higher.</p>
<li><a class="reference external" href="struct_p_p_b___image_data__1__0.html">PPB_ImageData</a></li>
<li><a class="reference external" href="struct_p_p_b___input_event__1__0.html">PPB_InputEvent</a></li>
<li><a class="reference external" href="struct_p_p_b___instance__1__0.html">PPB_Instance</a></li>
-<li><a class="reference external" href="struct_p_p_b___keyboard_input_event__1__0.html">PPB_KeyboardInputEvent</a></li>
+<li><a class="reference external" href="struct_p_p_b___keyboard_input_event__1__2.html">PPB_KeyboardInputEvent</a></li>
<li><a class="reference external" href="struct_p_p_b___media_stream_audio_track__0__1.html">PPB_MediaStreamAudioTrack</a></li>
<li><a class="reference external" href="struct_p_p_b___media_stream_video_track__0__1.html">PPB_MediaStreamVideoTrack</a></li>
<li><a class="reference external" href="struct_p_p_b___message_loop__1__0.html">PPB_MessageLoop</a></li>
@@ -44,7 +45,7 @@ run in Chrome 34 or higher.</p>
<li><a class="reference external" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></li>
<li><a class="reference external" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></li>
<li><a class="reference external" href="struct_p_p_b___u_r_l_response_info__1__0.html">PPB_URLResponseInfo</a></li>
-<li><a class="reference external" href="struct_p_p_b___var__1__1.html">PPB_Var</a></li>
+<li><a class="reference external" href="struct_p_p_b___var__1__2.html">PPB_Var</a></li>
<li><a class="reference external" href="struct_p_p_b___var_array__1__0.html">PPB_VarArray</a></li>
<li><a class="reference external" href="struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a></li>
<li><a class="reference external" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></li>
@@ -118,11 +119,12 @@ run in Chrome 34 or higher.</p>
<li><a class="reference external" href="pp__var_8h.html">pp_var.h</a></li>
<li><a class="reference external" href="ppb_8h.html">ppb.h</a></li>
<li><a class="reference external" href="ppb__audio_8h.html">ppb_audio.h</a></li>
+<li><a class="reference external" href="ppb__audio__buffer_8h.html">ppb_audio_buffer.h</a></li>
<li><a class="reference external" href="ppb__audio__config_8h.html">ppb_audio_config.h</a></li>
-<li><a class="reference external" href="ppb__audio__frame_8h.html">ppb_audio_frame.h</a></li>
<li><a class="reference external" href="ppb__console_8h.html">ppb_console.h</a></li>
<li><a class="reference external" href="ppb__core_8h.html">ppb_core.h</a></li>
<li><a class="reference external" href="ppb__file__io_8h.html">ppb_file_io.h</a></li>
+<li><a class="reference external" href="ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li>
<li><a class="reference external" href="ppb__file__ref_8h.html">ppb_file_ref.h</a></li>
<li><a class="reference external" href="ppb__file__system_8h.html">ppb_file_system.h</a></li>
<li><a class="reference external" href="ppb__fullscreen_8h.html">ppb_fullscreen.h</a></li>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/index.rst b/native_client_sdk/doc_generated/pepper_dev/c/index.rst
deleted file mode 100644
index e415c2a5ea..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/c/index.rst
+++ /dev/null
@@ -1,303 +0,0 @@
-.. _pepper_dev_c_index:
-
-.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
-
-##########################################
-Pepper C API Reference (Dev)
-##########################################
-
-This page lists the C API for Pepper 34. Apps that use this API can
-run in Chrome 34 or higher.
-
-`Interfaces <group___interfaces.html>`_
-=======================================
- * `PPB_Audio <struct_p_p_b___audio__1__1.html>`_
-
- * `PPB_AudioConfig <struct_p_p_b___audio_config__1__1.html>`_
-
- * `PPB_AudioFrame <struct_p_p_b___audio_frame__0__1.html>`_
-
- * `PPB_Console <struct_p_p_b___console__1__0.html>`_
-
- * `PPB_Core <struct_p_p_b___core__1__0.html>`_
-
- * `PPB_FileIO <struct_p_p_b___file_i_o__1__1.html>`_
-
- * `PPB_FileMapping <struct_p_p_b___file_mapping__0__1.html>`_
-
- * `PPB_FileRef <struct_p_p_b___file_ref__1__2.html>`_
-
- * `PPB_FileSystem <struct_p_p_b___file_system__1__0.html>`_
-
- * `PPB_Fullscreen <struct_p_p_b___fullscreen__1__0.html>`_
-
- * `PPB_Gamepad <struct_p_p_b___gamepad__1__0.html>`_
-
- * `PPB_Graphics2D <struct_p_p_b___graphics2_d__1__1.html>`_
-
- * `PPB_Graphics3D <struct_p_p_b___graphics3_d__1__0.html>`_
-
- * `PPB_HostResolver <struct_p_p_b___host_resolver__1__0.html>`_
-
- * `PPB_IMEInputEvent <struct_p_p_b___i_m_e_input_event__1__0.html>`_
-
- * `PPB_ImageData <struct_p_p_b___image_data__1__0.html>`_
-
- * `PPB_InputEvent <struct_p_p_b___input_event__1__0.html>`_
-
- * `PPB_Instance <struct_p_p_b___instance__1__0.html>`_
-
- * `PPB_KeyboardInputEvent <struct_p_p_b___keyboard_input_event__1__2.html>`_
-
- * `PPB_MediaStreamAudioTrack <struct_p_p_b___media_stream_audio_track__0__1.html>`_
-
- * `PPB_MediaStreamVideoTrack <struct_p_p_b___media_stream_video_track__0__1.html>`_
-
- * `PPB_MessageLoop <struct_p_p_b___message_loop__1__0.html>`_
-
- * `PPB_Messaging <struct_p_p_b___messaging__1__0.html>`_
-
- * `PPB_MouseCursor <struct_p_p_b___mouse_cursor__1__0.html>`_
-
- * `PPB_MouseInputEvent <struct_p_p_b___mouse_input_event__1__1.html>`_
-
- * `PPB_MouseLock <struct_p_p_b___mouse_lock__1__0.html>`_
-
- * `PPB_NetAddress <struct_p_p_b___net_address__1__0.html>`_
-
- * `PPB_NetworkList <struct_p_p_b___network_list__1__0.html>`_
-
- * `PPB_NetworkMonitor <struct_p_p_b___network_monitor__1__0.html>`_
-
- * `PPB_NetworkProxy <struct_p_p_b___network_proxy__1__0.html>`_
-
- * `PPB_TCPSocket <struct_p_p_b___t_c_p_socket__1__1.html>`_
-
- * `PPB_TextInputController <struct_p_p_b___text_input_controller__1__0.html>`_
-
- * `PPB_TouchInputEvent <struct_p_p_b___touch_input_event__1__0.html>`_
-
- * `PPB_UDPSocket <struct_p_p_b___u_d_p_socket__1__0.html>`_
-
- * `PPB_URLLoader <struct_p_p_b___u_r_l_loader__1__0.html>`_
-
- * `PPB_URLRequestInfo <struct_p_p_b___u_r_l_request_info__1__0.html>`_
-
- * `PPB_URLResponseInfo <struct_p_p_b___u_r_l_response_info__1__0.html>`_
-
- * `PPB_Var <struct_p_p_b___var__1__1.html>`_
-
- * `PPB_VarArray <struct_p_p_b___var_array__1__0.html>`_
-
- * `PPB_VarArrayBuffer <struct_p_p_b___var_array_buffer__1__0.html>`_
-
- * `PPB_VarDictionary <struct_p_p_b___var_dictionary__1__0.html>`_
-
- * `PPB_VideoFrame <struct_p_p_b___video_frame__0__1.html>`_
-
- * `PPB_View <struct_p_p_b___view__1__1.html>`_
-
- * `PPB_WebSocket <struct_p_p_b___web_socket__1__0.html>`_
-
- * `PPB_WheelInputEvent <struct_p_p_b___wheel_input_event__1__0.html>`_
-
- * `PPP_Graphics3D <struct_p_p_p___graphics3_d__1__0.html>`_
-
- * `PPP_InputEvent <struct_p_p_p___input_event__0__1.html>`_
-
- * `PPP_Instance <struct_p_p_p___instance__1__1.html>`_
-
- * `PPP_Messaging <struct_p_p_p___messaging__1__0.html>`_
-
- * `PPP_MouseLock <struct_p_p_p___mouse_lock__1__0.html>`_
-
-
-`Structures <group___structs.html>`_
-====================================
- * `PP_ArrayOutput <struct_p_p___array_output.html>`_
-
- * `PP_CompletionCallback <struct_p_p___completion_callback.html>`_
-
- * `PP_DirectoryEntry <struct_p_p___directory_entry.html>`_
-
- * `PP_FileInfo <struct_p_p___file_info.html>`_
-
- * `PP_FloatPoint <struct_p_p___float_point.html>`_
-
- * `PP_GamepadSampleData <struct_p_p___gamepad_sample_data.html>`_
-
- * `PP_GamepadsSampleData <struct_p_p___gamepads_sample_data.html>`_
-
- * `PP_HostResolver_Hint <struct_p_p___host_resolver___hint.html>`_
-
- * `PP_ImageDataDesc <struct_p_p___image_data_desc.html>`_
-
- * `PP_InputEvent_Character <struct_p_p___input_event___character.html>`_
-
- * `PP_InputEvent_Key <struct_p_p___input_event___key.html>`_
-
- * `PP_InputEvent_Mouse <struct_p_p___input_event___mouse.html>`_
-
- * `PP_InputEvent_Wheel <struct_p_p___input_event___wheel.html>`_
-
- * `PP_NetAddress_IPv4 <struct_p_p___net_address___i_pv4.html>`_
-
- * `PP_NetAddress_IPv6 <struct_p_p___net_address___i_pv6.html>`_
-
- * `PP_Point <struct_p_p___point.html>`_
-
- * `PP_Rect <struct_p_p___rect.html>`_
-
- * `PP_Size <struct_p_p___size.html>`_
-
- * `PP_TouchPoint <struct_p_p___touch_point.html>`_
-
- * `PP_Var <struct_p_p___var.html>`_
-
- * `PP_VarValue <union_p_p___var_value.html>`_
-
-
-`Functions <group___functions.html>`_
-=====================================
-
-`Enums <group___enums.html>`_
-=============================
-
-`Typedefs <group___typedefs.html>`_
-===================================
-
-`Macros <globals_defs.html>`_
-=============================
-
-Files
-=====
- * `pp_array_output.h <pp__array__output_8h.html>`_
-
- * `pp_bool.h <pp__bool_8h.html>`_
-
- * `pp_completion_callback.h <pp__completion__callback_8h.html>`_
-
- * `pp_directory_entry.h <pp__directory__entry_8h.html>`_
-
- * `pp_errors.h <pp__errors_8h.html>`_
-
- * `pp_file_info.h <pp__file__info_8h.html>`_
-
- * `pp_graphics_3d.h <pp__graphics__3d_8h.html>`_
-
- * `pp_input_event.h <pp__input__event_8h.html>`_
-
- * `pp_instance.h <pp__instance_8h.html>`_
-
- * `pp_module.h <pp__module_8h.html>`_
-
- * `pp_point.h <pp__point_8h.html>`_
-
- * `pp_rect.h <pp__rect_8h.html>`_
-
- * `pp_resource.h <pp__resource_8h.html>`_
-
- * `pp_size.h <pp__size_8h.html>`_
-
- * `pp_stdint.h <pp__stdint_8h.html>`_
-
- * `pp_time.h <pp__time_8h.html>`_
-
- * `pp_touch_point.h <pp__touch__point_8h.html>`_
-
- * `pp_var.h <pp__var_8h.html>`_
-
- * `ppb.h <ppb_8h.html>`_
-
- * `ppb_audio.h <ppb__audio_8h.html>`_
-
- * `ppb_audio_config.h <ppb__audio__config_8h.html>`_
-
- * `ppb_audio_frame.h <ppb__audio__frame_8h.html>`_
-
- * `ppb_console.h <ppb__console_8h.html>`_
-
- * `ppb_core.h <ppb__core_8h.html>`_
-
- * `ppb_file_io.h <ppb__file__io_8h.html>`_
-
- * `ppb_file_mapping.h <ppb__file__mapping_8h.html>`_
-
- * `ppb_file_ref.h <ppb__file__ref_8h.html>`_
-
- * `ppb_file_system.h <ppb__file__system_8h.html>`_
-
- * `ppb_fullscreen.h <ppb__fullscreen_8h.html>`_
-
- * `ppb_gamepad.h <ppb__gamepad_8h.html>`_
-
- * `ppb_graphics_2d.h <ppb__graphics__2d_8h.html>`_
-
- * `ppb_graphics_3d.h <ppb__graphics__3d_8h.html>`_
-
- * `ppb_host_resolver.h <ppb__host__resolver_8h.html>`_
-
- * `ppb_image_data.h <ppb__image__data_8h.html>`_
-
- * `ppb_input_event.h <ppb__input__event_8h.html>`_
-
- * `ppb_instance.h <ppb__instance_8h.html>`_
-
- * `ppb_media_stream_audio_track.h <ppb__media__stream__audio__track_8h.html>`_
-
- * `ppb_media_stream_video_track.h <ppb__media__stream__video__track_8h.html>`_
-
- * `ppb_message_loop.h <ppb__message__loop_8h.html>`_
-
- * `ppb_messaging.h <ppb__messaging_8h.html>`_
-
- * `ppb_mouse_cursor.h <ppb__mouse__cursor_8h.html>`_
-
- * `ppb_mouse_lock.h <ppb__mouse__lock_8h.html>`_
-
- * `ppb_net_address.h <ppb__net__address_8h.html>`_
-
- * `ppb_network_list.h <ppb__network__list_8h.html>`_
-
- * `ppb_network_monitor.h <ppb__network__monitor_8h.html>`_
-
- * `ppb_network_proxy.h <ppb__network__proxy_8h.html>`_
-
- * `ppb_tcp_socket.h <ppb__tcp__socket_8h.html>`_
-
- * `ppb_text_input_controller.h <ppb__text__input__controller_8h.html>`_
-
- * `ppb_udp_socket.h <ppb__udp__socket_8h.html>`_
-
- * `ppb_url_loader.h <ppb__url__loader_8h.html>`_
-
- * `ppb_url_request_info.h <ppb__url__request__info_8h.html>`_
-
- * `ppb_url_response_info.h <ppb__url__response__info_8h.html>`_
-
- * `ppb_var.h <ppb__var_8h.html>`_
-
- * `ppb_var_array.h <ppb__var__array_8h.html>`_
-
- * `ppb_var_array_buffer.h <ppb__var__array__buffer_8h.html>`_
-
- * `ppb_var_dictionary.h <ppb__var__dictionary_8h.html>`_
-
- * `ppb_video_frame.h <ppb__video__frame_8h.html>`_
-
- * `ppb_view.h <ppb__view_8h.html>`_
-
- * `ppb_websocket.h <ppb__websocket_8h.html>`_
-
- * `ppp.h <ppp_8h.html>`_
-
- * `ppp_graphics_3d.h <ppp__graphics__3d_8h.html>`_
-
- * `ppp_input_event.h <ppp__input__event_8h.html>`_
-
- * `ppp_instance.h <ppp__instance_8h.html>`_
-
- * `ppp_messaging.h <ppp__messaging_8h.html>`_
-
- * `ppp_mouse_lock.h <ppp__mouse__lock_8h.html>`_
-
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h.html
new file mode 100644
index 0000000000..dd350ad7a2
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h.html
@@ -0,0 +1,53 @@
+{{+bindTo:partials.standard_nacl_article}}
+<h1>ppb_audio_buffer.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+ <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for ppb_audio_buffer.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="ppb__audio__buffer_8h__incl.png" border="0" usemap="#ppb__audio__buffer_8h" alt="" /></div>
+<map name="ppb__audio__buffer_8h" id="ppb__audio__buffer_8h">
+</map>
+</div>
+</div><h2>
+Data Structures</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></td></tr>
+</table><h2>
+Defines</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__audio__buffer_8h.html#a4fddf6d285021552ba11f4460ba47445">PPB_AUDIOBUFFER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_AudioBuffer;0.1&quot; /* dev */</td></tr>
+</table><h2>
+Enumerations</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> { <a class="el" href="group___enums.html#gga78757d4be14d14d17708071a9466afbdace5d37815e444b494434d9418a8dfb81">PP_AUDIOBUFFER_SAMPLERATE_UNKNOWN</a> = 0,
+<a class="el" href="group___enums.html#gga78757d4be14d14d17708071a9466afbda7a10ada2c776cf2ca4fa5a220ab23f4f">PP_AUDIOBUFFER_SAMPLERATE_8000</a> = 8000,
+<a class="el" href="group___enums.html#gga78757d4be14d14d17708071a9466afbdaef0fd009c55740284bcf6e60344395ac">PP_AUDIOBUFFER_SAMPLERATE_44100</a> = 44100
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> { <a class="el" href="group___enums.html#gga2ba5c3a8eed23fa49a73b218b1bce044a1bc7fa3874cd1ccee3cfa00e23bea379">PP_AUDIOBUFFER_SAMPLESIZE_UNKNOWN</a> = 0,
+<a class="el" href="group___enums.html#gga2ba5c3a8eed23fa49a73b218b1bce044a0cc6b2d53c4c3bc5d3f19f809a1ce6c8">PP_AUDIOBUFFER_SAMPLESIZE_16_BITS</a> = 2
+ }</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Defines the <code>PPB_AudioBuffer</code> interface. </p>
+</div><hr /><h2>Define Documentation</h2>
+<a class="anchor" id="a4fddf6d285021552ba11f4460ba47445"></a><!-- doxytag: member="ppb_audio_buffer.h::PPB_AUDIOBUFFER_INTERFACE" ref="a4fddf6d285021552ba11f4460ba47445" args="" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">#define <a class="el" href="ppb__audio__buffer_8h.html#a4fddf6d285021552ba11f4460ba47445">PPB_AUDIOBUFFER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_AudioBuffer;0.1&quot; /* dev */</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h__incl.png
new file mode 100644
index 0000000000..7b9db937f1
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__buffer_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h.html
deleted file mode 100644
index 6b1995bc44..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h.html
+++ /dev/null
@@ -1,52 +0,0 @@
-{{+bindTo:partials.standard_nacl_article}}
-<h1>ppb_audio_frame.h File Reference</h1>
-<div id="doxygen-ref">
-{{- dummy div to appease doxygen -}}
- <div>
-<!-- Generated by Doxygen 1.7.6.1 -->
-
-
-</div>
-<!--header-->
-<div class="contents">
-<div class="textblock"><div class="dynheader">
-Include dependency graph for ppb_audio_frame.h:</div>
-<div class="dyncontent">
-<div class="center"><img src="ppb__audio__frame_8h__incl.png" border="0" usemap="#ppb__audio__frame_8h" alt="" /></div>
-<map name="ppb__audio__frame_8h" id="ppb__audio__frame_8h">
-</map>
-</div>
-</div><h2>
-Data Structures</h2><table class="memberdecls">
-
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html">PPB_AudioFrame</a></td></tr>
-</table><h2>
-Defines</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__audio__frame_8h.html#a8d8064bd5989ae176ec6a726d15b1a8b">PPB_AUDIOFRAME_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_AudioFrame;0.1&quot; /* dev */</td></tr>
-</table><h2>
-Enumerations</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga388a9a1f954440d0dbaa254888f30d2d">PP_AudioFrame_SampleRate</a> { <a class="el" href="group___enums.html#gga388a9a1f954440d0dbaa254888f30d2da8fa4dfd3371f5cba806e1fe580797b1e">PP_AUDIOFRAME_SAMPLERATE_UNKNOWN</a> = 0,
-<a class="el" href="group___enums.html#gga388a9a1f954440d0dbaa254888f30d2da0fecce4b7a8b75f6c58fa72d4331a4d1">PP_AUDIOFRAME_SAMPLERATE_44100</a> = 44100
- }</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga971dbd9c541225dde753fb3ede7aac6a">PP_AudioFrame_SampleSize</a> { <a class="el" href="group___enums.html#gga971dbd9c541225dde753fb3ede7aac6aab771b69a7b40c3ee79c33ac4cf666b09">PP_AUDIOFRAME_SAMPLESIZE_UNKNOWN</a> = 0,
-<a class="el" href="group___enums.html#gga971dbd9c541225dde753fb3ede7aac6aa4c351744de007482435d3d50177ae88b">PP_AUDIOFRAME_SAMPLESIZE_16_BITS</a> = 2
- }</td></tr>
-</table>
-<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
-<div class="textblock"><p>Defines the <code>PPB_AudioFrame</code> interface. </p>
-</div><hr /><h2>Define Documentation</h2>
-<a class="anchor" id="a8d8064bd5989ae176ec6a726d15b1a8b"></a><!-- doxytag: member="ppb_audio_frame.h::PPB_AUDIOFRAME_INTERFACE" ref="a8d8064bd5989ae176ec6a726d15b1a8b" args="" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">#define <a class="el" href="ppb__audio__frame_8h.html#a8d8064bd5989ae176ec6a726d15b1a8b">PPB_AUDIOFRAME_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_AudioFrame;0.1&quot; /* dev */</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-</div>
-</div>
-</div><!-- contents -->
-</div>
-{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h__incl.png
deleted file mode 100644
index d343f2ee58..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__frame_8h__incl.png
+++ /dev/null
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__ref_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__ref_8h.html
index 626e9b96fa..5647b75b09 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__ref_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__ref_8h.html
@@ -23,7 +23,11 @@ Data Structures</h2><table class="memberdecls">
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_FileRef</code> struct represents a "weak pointer" to a file in a file system. <a href="struct_p_p_b___file_ref__1__2.html#details">More...</a><br /></td></tr>
</table><h2>
Defines</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">PPB_FILEREF_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_FileRef;1.2&quot; /* dev */</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">PPB_FILEREF_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_FileRef;1.2&quot;</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__file__ref_8h.html#a00615ce99f7d6774b0fc5c8f0326f0ba">PPB_FILEREF_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">PPB_FILEREF_INTERFACE</a></td></tr>
+</table><h2>
+Typedefs</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaafdfc08014561cc1479f7f1424e4c4ab">PPB_FileRef</a></td></tr>
</table><h2>
Enumerations</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadcb0a92e6ca510586c3f34088d35dc9f">PP_MakeDirectoryFlags</a> { <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fafeeef418b62780276c4671a57196ad3f">PP_MAKEDIRECTORYFLAG_NONE</a> = 0 &lt;&lt; 0,
@@ -34,12 +38,24 @@ Enumerations</h2><table class="memberdecls">
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>This file defines the API to create a file reference or "weak pointer" to a file in a file system. </p>
</div><hr /><h2>Define Documentation</h2>
+<a class="anchor" id="a00615ce99f7d6774b0fc5c8f0326f0ba"></a><!-- doxytag: member="ppb_file_ref.h::PPB_FILEREF_INTERFACE" ref="a00615ce99f7d6774b0fc5c8f0326f0ba" args="" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">#define <a class="el" href="ppb__file__ref_8h.html#a00615ce99f7d6774b0fc5c8f0326f0ba">PPB_FILEREF_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">PPB_FILEREF_INTERFACE</a></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
<a class="anchor" id="a4752245ebf41b0ebee2c50019ec2bbe4"></a><!-- doxytag: member="ppb_file_ref.h::PPB_FILEREF_INTERFACE" ref="a4752245ebf41b0ebee2c50019ec2bbe4" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">#define <a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">PPB_FILEREF_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_FileRef;1.2&quot; /* dev */</td>
+<td class="memname">#define <a class="el" href="ppb__file__ref_8h.html#a4752245ebf41b0ebee2c50019ec2bbe4">PPB_FILEREF_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_FileRef;1.2&quot;</td>
</tr>
</table>
</div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__media__stream__audio__track_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__media__stream__audio__track_8h.html
index 9bdf6aed75..7ae056f301 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__media__stream__audio__track_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__media__stream__audio__track_8h.html
@@ -27,7 +27,7 @@ Defines</h2><table class="memberdecls">
Enumerations</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2f729c238ba74adc778c0d0bc17c453f">PP_MediaStreamAudioTrack_Attrib</a> { <br />
&#160;&#160;<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa5f1f0d353fe407fe10ac3c0e908aba4f">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE</a> = 0,
-<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fafd82a0ca09456944d9966cd25987ce38">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES</a> = 1,
+<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fae157f98fb5bc32ca0e193e5b8198c7dc">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</a> = 1,
<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa5b0cf01bda3aa2bbcff7b41ffb96c425">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_RATE</a> = 2,
<a class="el" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453faacb4f8d7388db7fdbeb96aa6e6309e13">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_SAMPLE_SIZE</a> = 3,
<br />
@@ -38,7 +38,7 @@ Enumerations</h2><table class="memberdecls">
</table>
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Defines the <code>PPB_MediaStreamAudioTrack</code> interface. </p>
-<p>Used for receiving audio frames from a MediaStream audio track in the browser. This interface is still in development (Dev API status) and may change. </p>
+<p>Used for receiving audio samples from a MediaStream audio track in the browser. This interface is still in development (Dev API status) and may change. </p>
</div><hr /><h2>Define Documentation</h2>
<a class="anchor" id="a1f573797be0968778c819a0d800f5293"></a><!-- doxytag: member="ppb_media_stream_audio_track.h::PPB_MEDIASTREAMAUDIOTRACK_INTERFACE" ref="a1f573797be0968778c819a0d800f5293" args="" -->
<div class="memitem">
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h.html
index b0afef9f4e..39986dcd42 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h.html
@@ -19,15 +19,15 @@ Include dependency graph for ppb_var.h:</div>
</div><h2>
Data Structures</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__1.html">PPB_Var</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">PPB_Var API. <a href="struct_p_p_b___var__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html">PPB_Var</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">PPB_Var API. <a href="struct_p_p_b___var__1__2.html#details">More...</a><br /></td></tr>
</table><h2>
Defines</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__var_8h.html#acc1cbb0daac02e06063221b751084502">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Var;1.1&quot;</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__var_8h.html#a0d345a2704bcdbc588c4227b46747041">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__var_8h.html#acc1cbb0daac02e06063221b751084502">PPB_VAR_INTERFACE</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__var_8h.html#aa29bf4400324815450e366663ea1c3a0">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Var;1.2&quot;</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__var_8h.html#a0d345a2704bcdbc588c4227b46747041">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__var_8h.html#aa29bf4400324815450e366663ea1c3a0">PPB_VAR_INTERFACE</a></td></tr>
</table><h2>
Typedefs</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___var__1__1.html">PPB_Var</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga7363a88a6e5058841915641c1b2923ad">PPB_Var</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___var__1__2.html">PPB_Var</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1c3a6780ef84f66ac77dc1af656a8c40">PPB_Var</a></td></tr>
</table>
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>This file defines the <code>PPB_Var</code> struct. </p>
@@ -37,19 +37,19 @@ Typedefs</h2><table class="memberdecls">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">#define <a class="el" href="ppb__var_8h.html#a0d345a2704bcdbc588c4227b46747041">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__var_8h.html#acc1cbb0daac02e06063221b751084502">PPB_VAR_INTERFACE</a></td>
+<td class="memname">#define <a class="el" href="ppb__var_8h.html#a0d345a2704bcdbc588c4227b46747041">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__var_8h.html#aa29bf4400324815450e366663ea1c3a0">PPB_VAR_INTERFACE</a></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
-<a class="anchor" id="acc1cbb0daac02e06063221b751084502"></a><!-- doxytag: member="ppb_var.h::PPB_VAR_INTERFACE" ref="acc1cbb0daac02e06063221b751084502" args="" -->
+<a class="anchor" id="aa29bf4400324815450e366663ea1c3a0"></a><!-- doxytag: member="ppb_var.h::PPB_VAR_INTERFACE" ref="aa29bf4400324815450e366663ea1c3a0" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">#define <a class="el" href="ppb__var_8h.html#acc1cbb0daac02e06063221b751084502">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Var;1.1&quot;</td>
+<td class="memname">#define <a class="el" href="ppb__var_8h.html#aa29bf4400324815450e366663ea1c3a0">PPB_VAR_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Var;1.2&quot;</td>
</tr>
</table>
</div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h__incl.png
index ef6b7048d6..d01f529fcf 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h__incl.png
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__var_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_buffer__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_buffer__0__1.html
new file mode 100644
index 0000000000..c073f00b4e
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_buffer__0__1.html
@@ -0,0 +1,211 @@
+{{+bindTo:partials.standard_nacl_article}}
+<h1>PPB_AudioBuffer Struct Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+ <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="PPB_AudioBuffer" --><h2>
+Data Fields</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a0d62d7fb07cae07004bbc6fbe1f14dcd">IsAudioBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a1072f128761e1869ca8bd8e31fc18b51">GetTimestamp</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a03113971cf40f80274d4475e335fbea3">SetTimestamp</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer, <a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a> timestamp)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a69f6c324fcc347f24f064f38a19d2465">GetSampleRate</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a71f0374949280835b5db4503c4ef8e15">GetSampleSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a6dd92974e5543ade219fff80b8bb1a38">GetNumberOfChannels</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#abba9e5c66fb8fb01771002b9667ec80f">GetNumberOfSamples</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a6c2b7a87ea483ee31950efef6de57201">GetDataBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html#aad58d200bfdd1e1ed1e1cb6884a10570">GetDataBufferSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
+</table>
+<hr /><h2>Field Documentation</h2>
+<a class="anchor" id="a6c2b7a87ea483ee31950efef6de57201"></a><!-- doxytag: member="PPB_AudioBuffer::GetDataBuffer" ref="a6c2b7a87ea483ee31950efef6de57201" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">void*(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a6c2b7a87ea483ee31950efef6de57201">PPB_AudioBuffer::GetDataBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the data buffer containing the audio samples. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A pointer to the beginning of the data buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="aad58d200bfdd1e1ed1e1cb6884a10570"></a><!-- doxytag: member="PPB_AudioBuffer::GetDataBufferSize" ref="aad58d200bfdd1e1ed1e1cb6884a10570" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">uint32_t(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#aad58d200bfdd1e1ed1e1cb6884a10570">PPB_AudioBuffer::GetDataBufferSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the size of the data buffer in bytes. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The size of the data buffer in bytes. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a6dd92974e5543ade219fff80b8bb1a38"></a><!-- doxytag: member="PPB_AudioBuffer::GetNumberOfChannels" ref="a6dd92974e5543ade219fff80b8bb1a38" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">uint32_t(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a6dd92974e5543ade219fff80b8bb1a38">PPB_AudioBuffer::GetNumberOfChannels</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the number of channels in the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The number of channels in the audio buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="abba9e5c66fb8fb01771002b9667ec80f"></a><!-- doxytag: member="PPB_AudioBuffer::GetNumberOfSamples" ref="abba9e5c66fb8fb01771002b9667ec80f" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">uint32_t(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#abba9e5c66fb8fb01771002b9667ec80f">PPB_AudioBuffer::GetNumberOfSamples</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the number of samples in the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The number of samples in the audio buffer. For example, at a sampling rate of 44,100 Hz in stereo audio, a buffer containing 4410 * 2 samples would have a duration of 100 milliseconds. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a69f6c324fcc347f24f064f38a19d2465"></a><!-- doxytag: member="PPB_AudioBuffer::GetSampleRate" ref="a69f6c324fcc347f24f064f38a19d2465" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a>(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a69f6c324fcc347f24f064f38a19d2465">PPB_AudioBuffer::GetSampleRate</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the sample rate of the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The sample rate of the audio buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a71f0374949280835b5db4503c4ef8e15"></a><!-- doxytag: member="PPB_AudioBuffer::GetSampleSize" ref="a71f0374949280835b5db4503c4ef8e15" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a>(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a71f0374949280835b5db4503c4ef8e15">PPB_AudioBuffer::GetSampleSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the sample size of the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The sample size of the audio buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a1072f128761e1869ca8bd8e31fc18b51"></a><!-- doxytag: member="PPB_AudioBuffer::GetTimestamp" ref="a1072f128761e1869ca8bd8e31fc18b51" args=")(PP_Resource buffer)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a>(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a1072f128761e1869ca8bd8e31fc18b51">PPB_AudioBuffer::GetTimestamp</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the timestamp of the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_TimeDelta</code> containing the timestamp of the audio buffer. Given in seconds since the start of the containing audio stream. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a0d62d7fb07cae07004bbc6fbe1f14dcd"></a><!-- doxytag: member="PPB_AudioBuffer::IsAudioBuffer" ref="a0d62d7fb07cae07004bbc6fbe1f14dcd" args=")(PP_Resource resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a0d62d7fb07cae07004bbc6fbe1f14dcd">PPB_AudioBuffer::IsAudioBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Determines if a resource is an AudioBuffer resource. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The <code>PP_Resource</code> to test.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given resource is an AudioBuffer resource or <code>PP_FALSE</code> otherwise. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a03113971cf40f80274d4475e335fbea3"></a><!-- doxytag: member="PPB_AudioBuffer::SetTimestamp" ref="a03113971cf40f80274d4475e335fbea3" args=")(PP_Resource buffer, PP_TimeDelta timestamp)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_buffer__0__1.html#a03113971cf40f80274d4475e335fbea3">PPB_AudioBuffer::SetTimestamp</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer, <a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a> timestamp)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Sets the timestamp of the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an audio buffer resource. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">timestamp</td><td>A <code>PP_TimeDelta</code> containing the timestamp of the audio buffer. Given in seconds since the start of the containing audio stream. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<hr />The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="ppb__audio__buffer_8h.html">ppb_audio_buffer.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_frame__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_frame__0__1.html
deleted file mode 100644
index 976a9d0cf3..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_frame__0__1.html
+++ /dev/null
@@ -1,190 +0,0 @@
-{{+bindTo:partials.standard_nacl_article}}
-<h1>PPB_AudioFrame Struct Reference</h1>
-<div id="doxygen-ref">
-{{- dummy div to appease doxygen -}}
- <div>
-<!-- Generated by Doxygen 1.7.6.1 -->
-
-
-</div>
-<!--header-->
-<div class="contents">
-<!-- doxytag: class="PPB_AudioFrame" --><h2>
-Data Fields</h2><table class="memberdecls">
-
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#a47061a145f5fa7511cad2b65e6c7f0a6">IsAudioFrame</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#a64d5acceb403c808b63b17090c7321b8">GetTimestamp</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#a58b693627085d79c202146b2937b9811">SetTimestamp</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame, <a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a> timestamp)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga971dbd9c541225dde753fb3ede7aac6a">PP_AudioFrame_SampleSize</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#a9fbb4974a6b2f317469a873a330df339">GetSampleSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#abc3b6c3ec27bb3653f9d2ec6e91a13c7">GetNumberOfChannels</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#ad0f46ad3beaa6146f9785d39ade2e4b3">GetNumberOfSamples</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#aa07fd4a8cefea92d3c922221aefe414f">GetDataBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_frame__0__1.html#a8ded1473451dc73b9c2d6bd33eb8863c">GetDataBufferSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
-</table>
-<hr /><h2>Field Documentation</h2>
-<a class="anchor" id="aa07fd4a8cefea92d3c922221aefe414f"></a><!-- doxytag: member="PPB_AudioFrame::GetDataBuffer" ref="aa07fd4a8cefea92d3c922221aefe414f" args=")(PP_Resource frame)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void*(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#aa07fd4a8cefea92d3c922221aefe414f">PPB_AudioFrame::GetDataBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the data buffer containing the audio frame samples. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A pointer to the beginning of the data buffer. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a8ded1473451dc73b9c2d6bd33eb8863c"></a><!-- doxytag: member="PPB_AudioFrame::GetDataBufferSize" ref="a8ded1473451dc73b9c2d6bd33eb8863c" args=")(PP_Resource frame)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#a8ded1473451dc73b9c2d6bd33eb8863c">PPB_AudioFrame::GetDataBufferSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the size of the data buffer in bytes. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The size of the data buffer in bytes. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="abc3b6c3ec27bb3653f9d2ec6e91a13c7"></a><!-- doxytag: member="PPB_AudioFrame::GetNumberOfChannels" ref="abc3b6c3ec27bb3653f9d2ec6e91a13c7" args=")(PP_Resource frame)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#abc3b6c3ec27bb3653f9d2ec6e91a13c7">PPB_AudioFrame::GetNumberOfChannels</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the number of channels in the audio frame. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The number of channels in the audio frame. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="ad0f46ad3beaa6146f9785d39ade2e4b3"></a><!-- doxytag: member="PPB_AudioFrame::GetNumberOfSamples" ref="ad0f46ad3beaa6146f9785d39ade2e4b3" args=")(PP_Resource frame)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#ad0f46ad3beaa6146f9785d39ade2e4b3">PPB_AudioFrame::GetNumberOfSamples</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the number of samples in the audio frame. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The number of samples in the audio frame. For example, at a sampling rate of 44,100 Hz in stereo audio, a frame containing 4410 * 2 samples would have a duration of 100 milliseconds. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a9fbb4974a6b2f317469a873a330df339"></a><!-- doxytag: member="PPB_AudioFrame::GetSampleSize" ref="a9fbb4974a6b2f317469a873a330df339" args=")(PP_Resource frame)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga971dbd9c541225dde753fb3ede7aac6a">PP_AudioFrame_SampleSize</a>(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#a9fbb4974a6b2f317469a873a330df339">PPB_AudioFrame::GetSampleSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the sample size of the audio frame. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The sample size of the audio frame. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a64d5acceb403c808b63b17090c7321b8"></a><!-- doxytag: member="PPB_AudioFrame::GetTimestamp" ref="a64d5acceb403c808b63b17090c7321b8" args=")(PP_Resource frame)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a>(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#a64d5acceb403c808b63b17090c7321b8">PPB_AudioFrame::GetTimestamp</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the timestamp of the audio frame. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_TimeDelta</code> containing the timestamp of the audio frame. Given in seconds since the start of the containing audio stream. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a47061a145f5fa7511cad2b65e6c7f0a6"></a><!-- doxytag: member="PPB_AudioFrame::IsAudioFrame" ref="a47061a145f5fa7511cad2b65e6c7f0a6" args=")(PP_Resource resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#a47061a145f5fa7511cad2b65e6c7f0a6">PPB_AudioFrame::IsAudioFrame</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Determines if a resource is an AudioFrame resource. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The <code>PP_Resource</code> to test.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given resource is an AudioFrame resource or <code>PP_FALSE</code> otherwise. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a58b693627085d79c202146b2937b9811"></a><!-- doxytag: member="PPB_AudioFrame::SetTimestamp" ref="a58b693627085d79c202146b2937b9811" args=")(PP_Resource frame, PP_TimeDelta timestamp)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_frame__0__1.html#a58b693627085d79c202146b2937b9811">PPB_AudioFrame::SetTimestamp</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame, <a class="el" href="group___typedefs.html#ga3962a5355895925a757f613567e422fa">PP_TimeDelta</a> timestamp)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Sets the timestamp of the audio frame. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an audio frame resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">timestamp</td><td>A <code>PP_TimeDelta</code> containing the timestamp of the audio frame. Given in seconds since the start of the containing audio stream. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<hr />The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="ppb__audio__frame_8h.html">ppb_audio_frame.h</a></li>
-</ul>
-</div><!-- contents -->
-</div>
-{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___media_stream_audio_track__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___media_stream_audio_track__0__1.html
index 6299252a82..4cdfdbef6d 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___media_stream_audio_track__0__1.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___media_stream_audio_track__0__1.html
@@ -17,8 +17,8 @@ Data Fields</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a3ad96bc4cd30dd580871a789a749819c">GetAttrib</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___enums.html#ga2f729c238ba74adc778c0d0bc17c453f">PP_MediaStreamAudioTrack_Attrib</a> attrib, int32_t *value)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a54bbc279f3440f49fbb9ad357ba4d224">GetId</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a21037392fc0a6fb893881fddb204002f">HasEnded</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af63b07a557e11a5bbee56a90b9071535">GetFrame</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#aef0d773171eaaf01357982088795e3c4">RecycleFrame</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af7941e0bcb6c2aac5bb2dc7397d22b96">GetBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af43b8871ebeeed2466437fcb23ce994d">RecycleBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a459bc28c5a626eb4a59a81286e9f8a58">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track)</td></tr>
</table>
<hr /><h2>Field Documentation</h2>
@@ -33,7 +33,7 @@ Data Fields</h2><table class="memberdecls">
</div>
<div class="memdoc">
<p>Closes the MediaStream audio track and disconnects it from the audio source. </p>
-<p>After calling <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a459bc28c5a626eb4a59a81286e9f8a58" title="Closes the MediaStream audio track and disconnects it from the audio source.">Close()</a></code>, no new frames will be received.</p>
+<p>After calling <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a459bc28c5a626eb4a59a81286e9f8a58" title="Closes the MediaStream audio track and disconnects it from the audio source.">Close()</a></code>, no new buffers will be received.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">audio_track</td><td>A <code>PP_Resource</code> corresponding to a MediaStream audio track resource. </td></tr>
@@ -52,18 +52,18 @@ Data Fields</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>Configures underlying frame buffers for incoming frames. </p>
-<p>If the application doesn't want to drop frames, then the <code>PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES</code> should be chosen such that inter-frame processing time variability won't overrun the input buffer. If the buffer is overfilled, then frames will be dropped. The application can detect this by examining the timestamp on returned frames. If <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a73f0f222f60ceed5f662ef3db7dee21b" title="Configures underlying frame buffers for incoming frames.">Configure()</a></code> is not called, default settings will be used. Example usage from plugin code: </p>
+<p>Configures underlying buffers for incoming audio samples. </p>
+<p>If the application doesn't want to drop samples, then the <code>PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</code> should be chosen such that inter-buffer processing time variability won't overrun all the input buffers. If all buffers are filled, then samples will be dropped. The application can detect this by examining the timestamp on returned buffers. If <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a73f0f222f60ceed5f662ef3db7dee21b" title="Configures underlying buffers for incoming audio samples.">Configure()</a></code> is not called, default settings will be used. Example usage from plugin code: </p>
<div class="fragment"><pre class="fragment"> int32_t attribs[] = {
- <a class="code" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fafd82a0ca09456944d9966cd25987ce38" title="The maximum number of frames to hold in the input buffer.">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES</a>, 4,
- <a class="code" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa13c3fa0a2740301acda8b218bac8b972" title="The duration of audio frames in milliseconds.">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</a>, 10,
+ <a class="code" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fae157f98fb5bc32ca0e193e5b8198c7dc" title="The maximum number of buffers to hold audio samples.">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</a>, 4,
+ <a class="code" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa13c3fa0a2740301acda8b218bac8b972" title="The duration of an audio buffer in milliseconds.">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</a>, 10,
<a class="code" href="group___enums.html#gga2f729c238ba74adc778c0d0bc17c453fa5f1f0d353fe407fe10ac3c0e908aba4f" title="Attribute list terminator.">PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE</a>};
track_if-&gt;Configure(track, attribs, callback);
</pre></div><dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">audio_track</td><td>A <code>PP_Resource</code> corresponding to an audio resource. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">attrib_list</td><td>A list of attribute name-value pairs in which each attribute is immediately followed by the corresponding desired value. The list is terminated by <code>PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE</code>. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a73f0f222f60ceed5f662ef3db7dee21b" title="Configures underlying frame buffers for incoming frames.">Configure()</a></code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#a73f0f222f60ceed5f662ef3db7dee21b" title="Configures underlying buffers for incoming audio samples.">Configure()</a></code>.</td></tr>
</table>
</dd>
</dl>
@@ -92,27 +92,27 @@ Data Fields</h2><table class="memberdecls">
<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl>
</div>
</div>
-<a class="anchor" id="af63b07a557e11a5bbee56a90b9071535"></a><!-- doxytag: member="PPB_MediaStreamAudioTrack::GetFrame" ref="af63b07a557e11a5bbee56a90b9071535" args=")(PP_Resource audio_track, PP_Resource *frame, struct PP_CompletionCallback callback)" -->
+<a class="anchor" id="af7941e0bcb6c2aac5bb2dc7397d22b96"></a><!-- doxytag: member="PPB_MediaStreamAudioTrack::GetBuffer" ref="af7941e0bcb6c2aac5bb2dc7397d22b96" args=")(PP_Resource audio_track, PP_Resource *buffer, struct PP_CompletionCallback callback)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af63b07a557e11a5bbee56a90b9071535">PPB_MediaStreamAudioTrack::GetFrame</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af7941e0bcb6c2aac5bb2dc7397d22b96">PPB_MediaStreamAudioTrack::GetBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
</tr>
</table>
</div>
<div class="memdoc">
-<p>Gets the next audio frame from the MediaStream track. </p>
-<p>If internal processing is slower than the incoming frame rate, new frames will be dropped from the incoming stream. Once the input buffer is full, frames will be dropped until <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#aef0d773171eaaf01357982088795e3c4" title="Recycles a frame returned by GetFrame(), so the track can reuse the underlying buffer of this frame...">RecycleFrame()</a></code> is called to free a spot for another frame to be buffered. If there are no frames in the input buffer, <code>PP_OK_COMPLETIONPENDING</code> will be returned immediately and the <code>callback</code> will be called, when a new frame is received or an error happens.</p>
+<p>Gets the next audio buffer from the MediaStream track. </p>
+<p>If internal processing is slower than the incoming buffer rate, new buffers will be dropped from the incoming stream. Once all buffers are full, audio samples will be dropped until <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af43b8871ebeeed2466437fcb23ce994d" title="Recycles a buffer returned by GetBuffer(), so the track can reuse the buffer.">RecycleBuffer()</a></code> is called to free a slot for another buffer. If there are no audio data in the input buffer, <code>PP_OK_COMPLETIONPENDING</code> will be returned immediately and the <code>callback</code> will be called, when a new buffer of audio samples is received or an error happens.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">audio_track</td><td>A <code>PP_Resource</code> corresponding to an audio resource. </td></tr>
-<tr><td class="paramdir">[out]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an AudioFrame resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af63b07a557e11a5bbee56a90b9071535" title="Gets the next audio frame from the MediaStream track.">GetFrame()</a>.</td></tr>
+<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an AudioBuffer resource. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af7941e0bcb6c2aac5bb2dc7397d22b96" title="Gets the next audio buffer from the MediaStream track.">GetBuffer()</a>.</td></tr>
</table>
</dd>
</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOMEMORY if <code>max_buffered_frames</code> frames buffer was not allocated successfully. </dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl>
</div>
</div>
<a class="anchor" id="a54bbc279f3440f49fbb9ad357ba4d224"></a><!-- doxytag: member="PPB_MediaStreamAudioTrack::GetId" ref="a54bbc279f3440f49fbb9ad357ba4d224" args=")(PP_Resource audio_track)" -->
@@ -146,7 +146,7 @@ Data Fields</h2><table class="memberdecls">
</div>
<div class="memdoc">
<p>Checks whether the underlying MediaStream track has ended. </p>
-<p>Calls to GetFrame while the track has ended are safe to make and will complete, but will fail.</p>
+<p>Calls to GetBuffer while the track has ended are safe to make and will complete, but will fail.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">audio_track</td><td>The <code>PP_Resource</code> to check.</td></tr>
@@ -176,22 +176,22 @@ Data Fields</h2><table class="memberdecls">
<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given resource is a Mediastream audio track resource or <code>PP_FALSE</code> otherwise. </dd></dl>
</div>
</div>
-<a class="anchor" id="aef0d773171eaaf01357982088795e3c4"></a><!-- doxytag: member="PPB_MediaStreamAudioTrack::RecycleFrame" ref="aef0d773171eaaf01357982088795e3c4" args=")(PP_Resource audio_track, PP_Resource frame)" -->
+<a class="anchor" id="af43b8871ebeeed2466437fcb23ce994d"></a><!-- doxytag: member="PPB_MediaStreamAudioTrack::RecycleBuffer" ref="af43b8871ebeeed2466437fcb23ce994d" args=")(PP_Resource audio_track, PP_Resource buffer)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#aef0d773171eaaf01357982088795e3c4">PPB_MediaStreamAudioTrack::RecycleFrame</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> frame)</td>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af43b8871ebeeed2466437fcb23ce994d">PPB_MediaStreamAudioTrack::RecycleBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_track, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> buffer)</td>
</tr>
</table>
</div>
<div class="memdoc">
-<p>Recycles a frame returned by <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af63b07a557e11a5bbee56a90b9071535" title="Gets the next audio frame from the MediaStream track.">GetFrame()</a></code>, so the track can reuse the underlying buffer of this frame. </p>
-<p>And the frame will become invalid. The caller should release all references it holds to <code>frame</code> and not use it anymore.</p>
+<p>Recycles a buffer returned by <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af7941e0bcb6c2aac5bb2dc7397d22b96" title="Gets the next audio buffer from the MediaStream track.">GetBuffer()</a></code>, so the track can reuse the buffer. </p>
+<p>And the buffer will become invalid. The caller should release all references it holds to <code>buffer</code> and not use it anymore.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">audio_track</td><td>A <code>PP_Resource</code> corresponding to an audio resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <code>PP_Resource</code> corresponding to an AudioFrame resource returned by <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af63b07a557e11a5bbee56a90b9071535" title="Gets the next audio frame from the MediaStream track.">GetFrame()</a></code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <code>PP_Resource</code> corresponding to an AudioBuffer resource returned by <code><a class="el" href="struct_p_p_b___media_stream_audio_track__0__1.html#af7941e0bcb6c2aac5bb2dc7397d22b96" title="Gets the next audio buffer from the MediaStream track.">GetBuffer()</a></code>.</td></tr>
</table>
</dd>
</dl>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___var__1__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___var__1__2.html
index dc93d0b912..e86afae3db 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___var__1__1.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___var__1__2.html
@@ -12,25 +12,27 @@
<!-- doxytag: class="PPB_Var" --><h2>
Data Fields</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__1.html#a8fc2c3ab17026665e7f0eeb0ac7a2105">AddRef</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__1.html#a11121fad397ca41981ccc48ee67aad3a">Release</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__1.html#a33b06493ec6ecf650d706346b28398e2">VarFromUtf8</a> )(const char *data, uint32_t len)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">const char *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__1.html#a308c42ffebc291fc2fab3200ea5f1845">VarToUtf8</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var, uint32_t *len)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html#a52f49d7d04522a69bbbc2b5161a32c1c">AddRef</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html#a3ca6fe76b51c14df6cc6a04d77edb807">Release</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html#a5c7ce303ae72998f54ba5da3357f7641">VarFromUtf8</a> )(const char *data, uint32_t len)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html#a573919f500ea491afe6c8c9dddc0106f">VarToUtf8</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var, uint32_t *len)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html#a686edc2d60c7d3803a03f8e1c1fb1414">VarToResource</a> )(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var__1__2.html#a3b2240a7db38d55b6ea084a7d3cfe340">VarFromResource</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
</table>
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>PPB_Var API. </p>
</div><hr /><h2>Field Documentation</h2>
-<a class="anchor" id="a8fc2c3ab17026665e7f0eeb0ac7a2105"></a><!-- doxytag: member="PPB_Var::AddRef" ref="a8fc2c3ab17026665e7f0eeb0ac7a2105" args=")(struct PP_Var var)" -->
+<a class="anchor" id="a52f49d7d04522a69bbbc2b5161a32c1c"></a><!-- doxytag: member="PPB_Var::AddRef" ref="a52f49d7d04522a69bbbc2b5161a32c1c" args=")(struct PP_Var var)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___var__1__1.html#a8fc2c3ab17026665e7f0eeb0ac7a2105">PPB_Var::AddRef</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___var__1__2.html#a52f49d7d04522a69bbbc2b5161a32c1c">PPB_Var::AddRef</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td>
</tr>
</table>
</div>
<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___var__1__1.html#a8fc2c3ab17026665e7f0eeb0ac7a2105" title="AddRef() adds a reference to the given var.">AddRef()</a> adds a reference to the given var. </p>
+<p><a class="el" href="struct_p_p_b___var__1__2.html#a52f49d7d04522a69bbbc2b5161a32c1c" title="AddRef() adds a reference to the given var.">AddRef()</a> adds a reference to the given var. </p>
<p>If this is not a refcounted object, this function will do nothing so you can always call it no matter what the type.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
@@ -40,17 +42,17 @@ Data Fields</h2><table class="memberdecls">
</dl>
</div>
</div>
-<a class="anchor" id="a11121fad397ca41981ccc48ee67aad3a"></a><!-- doxytag: member="PPB_Var::Release" ref="a11121fad397ca41981ccc48ee67aad3a" args=")(struct PP_Var var)" -->
+<a class="anchor" id="a3ca6fe76b51c14df6cc6a04d77edb807"></a><!-- doxytag: member="PPB_Var::Release" ref="a3ca6fe76b51c14df6cc6a04d77edb807" args=")(struct PP_Var var)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___var__1__1.html#a11121fad397ca41981ccc48ee67aad3a">PPB_Var::Release</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___var__1__2.html#a3ca6fe76b51c14df6cc6a04d77edb807">PPB_Var::Release</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td>
</tr>
</table>
</div>
<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___var__1__1.html#a11121fad397ca41981ccc48ee67aad3a" title="Release() removes a reference to given var, deleting it if the internal reference count becomes 0...">Release()</a> removes a reference to given var, deleting it if the internal reference count becomes 0. </p>
+<p><a class="el" href="struct_p_p_b___var__1__2.html#a3ca6fe76b51c14df6cc6a04d77edb807" title="Release() removes a reference to given var, deleting it if the internal reference count becomes 0...">Release()</a> removes a reference to given var, deleting it if the internal reference count becomes 0. </p>
<p>If the given var is not a refcounted object, this function will do nothing so you can always call it no matter what the type.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
@@ -60,17 +62,37 @@ Data Fields</h2><table class="memberdecls">
</dl>
</div>
</div>
-<a class="anchor" id="a33b06493ec6ecf650d706346b28398e2"></a><!-- doxytag: member="PPB_Var::VarFromUtf8" ref="a33b06493ec6ecf650d706346b28398e2" args=")(const char *data, uint32_t len)" -->
+<a class="anchor" id="a3b2240a7db38d55b6ea084a7d3cfe340"></a><!-- doxytag: member="PPB_Var::VarFromResource" ref="a3b2240a7db38d55b6ea084a7d3cfe340" args=")(PP_Resource resource)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(* <a class="el" href="struct_p_p_b___var__1__1.html#a33b06493ec6ecf650d706346b28398e2">PPB_Var::VarFromUtf8</a>)(const char *data, uint32_t len)<code> [read]</code></td>
+<td class="memname">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(* <a class="el" href="struct_p_p_b___var__1__2.html#a3b2240a7db38d55b6ea084a7d3cfe340">PPB_Var::VarFromResource</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)<code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___var__1__1.html#a33b06493ec6ecf650d706346b28398e2" title="VarFromUtf8() creates a string var from a string.">VarFromUtf8()</a> creates a string var from a string. </p>
+<p>Creates a new <code><a class="el" href="struct_p_p___var.html" title="The PP_VAR struct is a variant data type and can contain any value of one of the types named in the P...">PP_Var</a></code> from a given resource. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> to be wrapped in a var.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code><a class="el" href="struct_p_p___var.html" title="The PP_VAR struct is a variant data type and can contain any value of one of the types named in the P...">PP_Var</a></code> created for this resource, with type <code>PP_VARTYPE_RESOURCE</code>. The reference count of the var is set to 1 on behalf of the caller. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a5c7ce303ae72998f54ba5da3357f7641"></a><!-- doxytag: member="PPB_Var::VarFromUtf8" ref="a5c7ce303ae72998f54ba5da3357f7641" args=")(const char *data, uint32_t len)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">struct <a class="el" href="struct_p_p___var.html">PP_Var</a>(* <a class="el" href="struct_p_p_b___var__1__2.html#a5c7ce303ae72998f54ba5da3357f7641">PPB_Var::VarFromUtf8</a>)(const char *data, uint32_t len)<code> [read]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___var__1__2.html#a5c7ce303ae72998f54ba5da3357f7641" title="VarFromUtf8() creates a string var from a string.">VarFromUtf8()</a> creates a string var from a string. </p>
<p>The string must be encoded in valid UTF-8 and is NOT NULL-terminated, the length must be specified in <code>len</code>. It is an error if the string is not valid UTF-8.</p>
<p>If the length is 0, the <code>*data</code> pointer will not be dereferenced and may be <code>NULL</code>. Note, however if length is 0, the "NULL-ness" will not be preserved, as <code>VarToUtf8</code> will never return <code>NULL</code> on success, even for empty strings.</p>
<p>The resulting object will be a refcounted string object. It will be AddRef'ed for the caller. When the caller is done with it, it should be Released.</p>
@@ -85,17 +107,37 @@ Data Fields</h2><table class="memberdecls">
<dl class="return"><dt><b>Returns:</b></dt><dd>A <code><a class="el" href="struct_p_p___var.html" title="The PP_VAR struct is a variant data type and can contain any value of one of the types named in the P...">PP_Var</a></code> structure containing a reference counted string object. </dd></dl>
</div>
</div>
-<a class="anchor" id="a308c42ffebc291fc2fab3200ea5f1845"></a><!-- doxytag: member="PPB_Var::VarToUtf8" ref="a308c42ffebc291fc2fab3200ea5f1845" args=")(struct PP_Var var, uint32_t *len)" -->
+<a class="anchor" id="a686edc2d60c7d3803a03f8e1c1fb1414"></a><!-- doxytag: member="PPB_Var::VarToResource" ref="a686edc2d60c7d3803a03f8e1c1fb1414" args=")(struct PP_Var var)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___var__1__2.html#a686edc2d60c7d3803a03f8e1c1fb1414">PPB_Var::VarToResource</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Converts a resource-type var to a <code>PP_Resource</code>. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">var</td><td>A <code><a class="el" href="struct_p_p___var.html" title="The PP_VAR struct is a variant data type and can contain any value of one of the types named in the P...">PP_Var</a></code> struct containing a resource-type var.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> retrieved from the var, or 0 if the var is not a resource. The reference count of the resource is incremented on behalf of the caller. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a573919f500ea491afe6c8c9dddc0106f"></a><!-- doxytag: member="PPB_Var::VarToUtf8" ref="a573919f500ea491afe6c8c9dddc0106f" args=")(struct PP_Var var, uint32_t *len)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">const char*(* <a class="el" href="struct_p_p_b___var__1__1.html#a308c42ffebc291fc2fab3200ea5f1845">PPB_Var::VarToUtf8</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var, uint32_t *len)</td>
+<td class="memname">const char*(* <a class="el" href="struct_p_p_b___var__1__2.html#a573919f500ea491afe6c8c9dddc0106f">PPB_Var::VarToUtf8</a>)(struct <a class="el" href="struct_p_p___var.html">PP_Var</a> var, uint32_t *len)</td>
</tr>
</table>
</div>
<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___var__1__1.html#a308c42ffebc291fc2fab3200ea5f1845" title="VarToUtf8() converts a string-type var to a char* encoded in UTF-8.">VarToUtf8()</a> converts a string-type var to a char* encoded in UTF-8. </p>
+<p><a class="el" href="struct_p_p_b___var__1__2.html#a573919f500ea491afe6c8c9dddc0106f" title="VarToUtf8() converts a string-type var to a char* encoded in UTF-8.">VarToUtf8()</a> converts a string-type var to a char* encoded in UTF-8. </p>
<p>This string is NOT NULL-terminated. The length will be placed in <code>*len</code>. If the string is valid but empty the return value will be non-NULL, but <code>*len</code> will still be 0.</p>
<p>If the var is not a string, this function will return NULL and <code>*len</code> will be 0.</p>
<p>The returned buffer will be valid as long as the underlying var is alive. If the instance frees its reference, the string will be freed and the pointer will be to arbitrary memory.</p>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h.html b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h.html
index 1f95a995be..65d4ca1a2c 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h.html
@@ -1,5 +1,5 @@
{{+bindTo:partials.standard_nacl_article}}
-<h1>audio_frame.h File Reference</h1>
+<h1>audio_buffer.h File Reference</h1>
<div id="doxygen-ref">
{{- dummy div to appease doxygen -}}
<div>
@@ -10,16 +10,16 @@
<!--header-->
<div class="contents">
<div class="textblock"><div class="dynheader">
-Include dependency graph for audio_frame.h:</div>
+Include dependency graph for audio_buffer.h:</div>
<div class="dyncontent">
-<div class="center"><img src="audio__frame_8h__incl.png" border="0" usemap="#audio__frame_8h" alt="" /></div>
-<map name="audio__frame_8h" id="audio__frame_8h">
+<div class="center"><img src="audio__buffer_8h__incl.png" border="0" usemap="#audio__buffer_8h" alt="" /></div>
+<map name="audio__buffer_8h" id="audio__buffer_8h">
</map>
</div>
</div><h2>
Classes</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td></tr>
</table><h2>
Namespaces</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h__incl.png
new file mode 100644
index 0000000000..94a19ae687
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__buffer_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h__incl.png
deleted file mode 100644
index c628496738..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__frame_8h__incl.png
+++ /dev/null
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer-members.html
new file mode 100644
index 0000000000..3eb96b6f16
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer-members.html
@@ -0,0 +1,40 @@
+{{+bindTo:partials.standard_nacl_article}}
+<h1>Member List</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+ <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a>, including all inherited members.<table>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#ae5a21e1df405d530d9280de36791dbbf">AudioBuffer</a>()</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a8f51aeb6d98ff9d926ee1e2fcee4f712">AudioBuffer</a>(const AudioBuffer &amp;other)</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a96db6e6a05eb834ed8b04ef8c3f6647a">AudioBuffer</a>(const Resource &amp;resource)</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td><code> [explicit]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#ad80595164aba1e9fbe1ccc71793c48f9">AudioBuffer</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#aad0cdf64f6fc99ebbad26725ba17df65">GetDataBuffer</a>()</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a5548630a163439b2c811ab40d7cd64a0">GetDataBufferSize</a>() const </td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a3061bf5fc031ad6854d2b06ef6f6736a">GetNumberOfChannels</a>() const </td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#ad588d83a59d151fb8448ea59f6f9039e">GetNumberOfSamples</a>() const </td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a650c3a1abc424e21fa56997c9d55b76f">GetSampleRate</a>() const </td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#ac3846435b70b49392dec120716e0cfd5">GetSampleSize</a>() const </td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a08f55c4a972677114bb0c0e1ceb13661">GetTimestamp</a>() const </td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#a2882ec7147f4efddf3cefc6378f11f78">SetTimestamp</a>(PP_TimeDelta timestamp)</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_buffer.html#aa47da494df014dd6dba16053f914ce34">~AudioBuffer</a>()</td><td><a class="el" href="classpp_1_1_audio_buffer.html">pp::AudioBuffer</a></td><td><code> [virtual]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr>
+</table></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer.html
new file mode 100644
index 0000000000..0bcf28dca8
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer.html
@@ -0,0 +1,297 @@
+{{+bindTo:partials.standard_nacl_article}}
+<h1>pp::AudioBuffer Class Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+ <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="pp::AudioBuffer" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader">
+Inheritance diagram for pp::AudioBuffer:</div>
+<div class="dyncontent">
+<div class="center"><img src="classpp_1_1_audio_buffer__inherit__graph.png" border="0" usemap="#pp_1_1_audio_buffer_inherit__map" alt="Inheritance graph" /></div>
+<map name="pp_1_1_audio_buffer_inherit__map" id="pp_1_1_audio_buffer_inherit__map">
+<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="13,5,117,35"></area></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<p><a href="classpp_1_1_audio_buffer-members.html">List of all members.</a></p>
+<h2>
+Public Member Functions</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#ae5a21e1df405d530d9280de36791dbbf">AudioBuffer</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a8f51aeb6d98ff9d926ee1e2fcee4f712">AudioBuffer</a> (const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &amp;other)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a96db6e6a05eb834ed8b04ef8c3f6647a">AudioBuffer</a> (const <a class="el" href="classpp_1_1_resource.html">Resource</a> &amp;resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#ad80595164aba1e9fbe1ccc71793c48f9">AudioBuffer</a> (<a class="el" href="namespacepp.html#a339083c1beec620267bf8b3c55decaa5">PassRef</a>, PP_Resource resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#aa47da494df014dd6dba16053f914ce34">~AudioBuffer</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">PP_TimeDelta&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a08f55c4a972677114bb0c0e1ceb13661">GetTimestamp</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a2882ec7147f4efddf3cefc6378f11f78">SetTimestamp</a> (PP_TimeDelta timestamp)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">PP_AudioBuffer_SampleRate&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a650c3a1abc424e21fa56997c9d55b76f">GetSampleRate</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">PP_AudioBuffer_SampleSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#ac3846435b70b49392dec120716e0cfd5">GetSampleSize</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a3061bf5fc031ad6854d2b06ef6f6736a">GetNumberOfChannels</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#ad588d83a59d151fb8448ea59f6f9039e">GetNumberOfSamples</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#aad0cdf64f6fc99ebbad26725ba17df65">GetDataBuffer</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html#a5548630a163439b2c811ab40d7cd64a0">GetDataBufferSize</a> () const </td></tr>
+</table>
+<hr /><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ae5a21e1df405d530d9280de36791dbbf"></a><!-- doxytag: member="pp::AudioBuffer::AudioBuffer" ref="ae5a21e1df405d530d9280de36791dbbf" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_audio_buffer.html#ae5a21e1df405d530d9280de36791dbbf">pp::AudioBuffer::AudioBuffer</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> object. </p>
+</div>
+</div>
+<a class="anchor" id="a8f51aeb6d98ff9d926ee1e2fcee4f712"></a><!-- doxytag: member="pp::AudioBuffer::AudioBuffer" ref="a8f51aeb6d98ff9d926ee1e2fcee4f712" args="(const AudioBuffer &amp;other)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_audio_buffer.html#ae5a21e1df405d530d9280de36791dbbf">pp::AudioBuffer::AudioBuffer</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &amp;&#160;</td>
+<td class="paramname"><em>other</em></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>The copy constructor for <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code>. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to an <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code>. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<a class="anchor" id="a96db6e6a05eb834ed8b04ef8c3f6647a"></a><!-- doxytag: member="pp::AudioBuffer::AudioBuffer" ref="a96db6e6a05eb834ed8b04ef8c3f6647a" args="(const Resource &amp;resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_audio_buffer.html#ae5a21e1df405d530d9280de36791dbbf">pp::AudioBuffer::AudioBuffer</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_resource.html">Resource</a> &amp;&#160;</td>
+<td class="paramname"><em>resource</em></td><td>)</td>
+<td><code> [explicit]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Constructs an <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> from a <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code>. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PPB_AudioBuffer</code> resource. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<a class="anchor" id="ad80595164aba1e9fbe1ccc71793c48f9"></a><!-- doxytag: member="pp::AudioBuffer::AudioBuffer" ref="ad80595164aba1e9fbe1ccc71793c48f9" args="(PassRef, PP_Resource resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_audio_buffer.html#ae5a21e1df405d530d9280de36791dbbf">pp::AudioBuffer::AudioBuffer</a> </td>
+<td>(</td>
+<td class="paramtype"><a class="el" href="namespacepp.html#a339083c1beec620267bf8b3c55decaa5">PassRef</a>&#160;</td>
+<td class="paramname">, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">PP_Resource&#160;</td>
+<td class="paramname"><em>resource</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>A constructor used when you have received a <code>PP_Resource</code> as a return value that has had 1 ref added for you. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PPB_AudioBuffer</code> resource. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<a class="anchor" id="aa47da494df014dd6dba16053f914ce34"></a><!-- doxytag: member="pp::AudioBuffer::~AudioBuffer" ref="aa47da494df014dd6dba16053f914ce34" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">virtual <a class="el" href="classpp_1_1_audio_buffer.html#aa47da494df014dd6dba16053f914ce34">pp::AudioBuffer::~AudioBuffer</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [virtual]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
+<hr /><h2>Member Function Documentation</h2>
+<a class="anchor" id="aad0cdf64f6fc99ebbad26725ba17df65"></a><!-- doxytag: member="pp::AudioBuffer::GetDataBuffer" ref="aad0cdf64f6fc99ebbad26725ba17df65" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">void* <a class="el" href="classpp_1_1_audio_buffer.html#aad0cdf64f6fc99ebbad26725ba17df65">pp::AudioBuffer::GetDataBuffer</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the data buffer containing the audio buffer samples. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A pointer to the beginning of the data buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a5548630a163439b2c811ab40d7cd64a0"></a><!-- doxytag: member="pp::AudioBuffer::GetDataBufferSize" ref="a5548630a163439b2c811ab40d7cd64a0" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_buffer.html#a5548630a163439b2c811ab40d7cd64a0">pp::AudioBuffer::GetDataBufferSize</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the size of data buffer in bytes. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The size of the data buffer in bytes. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a3061bf5fc031ad6854d2b06ef6f6736a"></a><!-- doxytag: member="pp::AudioBuffer::GetNumberOfChannels" ref="a3061bf5fc031ad6854d2b06ef6f6736a" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_buffer.html#a3061bf5fc031ad6854d2b06ef6f6736a">pp::AudioBuffer::GetNumberOfChannels</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the number of channels in the audio buffer. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The number of channels in the audio buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="ad588d83a59d151fb8448ea59f6f9039e"></a><!-- doxytag: member="pp::AudioBuffer::GetNumberOfSamples" ref="ad588d83a59d151fb8448ea59f6f9039e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_buffer.html#ad588d83a59d151fb8448ea59f6f9039e">pp::AudioBuffer::GetNumberOfSamples</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the number of samples in the audio buffer. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The number of samples in the audio buffer. For example, at a sampling rate of 44,100 Hz in stereo audio, a buffer containing 4,410 * 2 samples would have a duration of 100 milliseconds. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a650c3a1abc424e21fa56997c9d55b76f"></a><!-- doxytag: member="pp::AudioBuffer::GetSampleRate" ref="a650c3a1abc424e21fa56997c9d55b76f" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">PP_AudioBuffer_SampleRate <a class="el" href="classpp_1_1_audio_buffer.html#a650c3a1abc424e21fa56997c9d55b76f">pp::AudioBuffer::GetSampleRate</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the sample rate of the audio buffer. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The sample rate of the audio buffer. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="ac3846435b70b49392dec120716e0cfd5"></a><!-- doxytag: member="pp::AudioBuffer::GetSampleSize" ref="ac3846435b70b49392dec120716e0cfd5" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">PP_AudioBuffer_SampleSize <a class="el" href="classpp_1_1_audio_buffer.html#ac3846435b70b49392dec120716e0cfd5">pp::AudioBuffer::GetSampleSize</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the sample size of the audio buffer in bytes. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The sample size of the audio buffer in bytes. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a08f55c4a972677114bb0c0e1ceb13661"></a><!-- doxytag: member="pp::AudioBuffer::GetTimestamp" ref="a08f55c4a972677114bb0c0e1ceb13661" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">PP_TimeDelta <a class="el" href="classpp_1_1_audio_buffer.html#a08f55c4a972677114bb0c0e1ceb13661">pp::AudioBuffer::GetTimestamp</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the timestamp of the audio buffer. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_TimeDelta</code> containing the timestamp of the audio buffer. Given in seconds since the start of the containing audio stream. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a2882ec7147f4efddf3cefc6378f11f78"></a><!-- doxytag: member="pp::AudioBuffer::SetTimestamp" ref="a2882ec7147f4efddf3cefc6378f11f78" args="(PP_TimeDelta timestamp)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">void <a class="el" href="classpp_1_1_audio_buffer.html#a2882ec7147f4efddf3cefc6378f11f78">pp::AudioBuffer::SetTimestamp</a> </td>
+<td>(</td>
+<td class="paramtype">PP_TimeDelta&#160;</td>
+<td class="paramname"><em>timestamp</em></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Sets the timestamp of the audio buffer. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">timestamp</td><td>A <code>PP_TimeDelta</code> containing the timestamp of the audio buffer. Given in seconds since the start of the containing audio stream. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<hr />The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="audio__buffer_8h.html">audio_buffer.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer__inherit__graph.png
new file mode 100644
index 0000000000..fb7b5e7371
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_buffer__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame-members.html
deleted file mode 100644
index 54bb7add5b..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame-members.html
+++ /dev/null
@@ -1,39 +0,0 @@
-{{+bindTo:partials.standard_nacl_article}}
-<h1>Member List</h1>
-<div id="doxygen-ref">
-{{- dummy div to appease doxygen -}}
- <div>
-<!-- Generated by Doxygen 1.7.6.1 -->
-
-
-
-</div>
-<!--header-->
-<div class="contents">
-This is the complete list of members for <a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a>, including all inherited members.<table>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a34c5fe2032eb858356bade18829eb5af">AudioFrame</a>()</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a4d90b7a73435fe86eec8d3b106ccad49">AudioFrame</a>(const AudioFrame &amp;other)</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a29676f598adbc902205712aa64bd79c8">AudioFrame</a>(const Resource &amp;resource)</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td><code> [explicit]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a423da94bba4bca8eb296e89f179640f9">AudioFrame</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a3eab39dcfec84777987b0b237747187d">GetDataBuffer</a>()</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a9b10a619f819ff7351dbabb8de140563">GetDataBufferSize</a>() const </td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a5c5dc02664ce94915445a698f655e7ca">GetNumberOfChannels</a>() const </td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a740e54cb2498a3dfe5b621cdf830b692">GetNumberOfSamples</a>() const </td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a0cf77d9bbf90d8474053a79514f4dd30">GetSampleSize</a>() const </td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#acfd8249e24bfe64b502856474c9bc1ff">GetTimestamp</a>() const </td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#af0222861693f93302daa16993aa30ef1">SetTimestamp</a>(PP_TimeDelta timestamp)</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_frame.html#a41fd32585aa8fe9427dff22cb5455422">~AudioFrame</a>()</td><td><a class="el" href="classpp_1_1_audio_frame.html">pp::AudioFrame</a></td><td><code> [virtual]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr>
-</table></div><!-- contents -->
-</div>
-{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame.html
deleted file mode 100644
index 6017722970..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame.html
+++ /dev/null
@@ -1,279 +0,0 @@
-{{+bindTo:partials.standard_nacl_article}}
-<h1>pp::AudioFrame Class Reference</h1>
-<div id="doxygen-ref">
-{{- dummy div to appease doxygen -}}
- <div>
-<!-- Generated by Doxygen 1.7.6.1 -->
-
-
-
-</div>
-<!--header-->
-<div class="contents">
-<!-- doxytag: class="pp::AudioFrame" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader">
-Inheritance diagram for pp::AudioFrame:</div>
-<div class="dyncontent">
-<div class="center"><img src="classpp_1_1_audio_frame__inherit__graph.png" border="0" usemap="#pp_1_1_audio_frame_inherit__map" alt="Inheritance graph" /></div>
-<map name="pp_1_1_audio_frame_inherit__map" id="pp_1_1_audio_frame_inherit__map">
-<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="15,5,119,35"></area></map>
-<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
-<p><a href="classpp_1_1_audio_frame-members.html">List of all members.</a></p>
-<h2>
-Public Member Functions</h2><table class="memberdecls">
-
-<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a34c5fe2032eb858356bade18829eb5af">AudioFrame</a> ()</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a4d90b7a73435fe86eec8d3b106ccad49">AudioFrame</a> (const <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> &amp;other)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a29676f598adbc902205712aa64bd79c8">AudioFrame</a> (const <a class="el" href="classpp_1_1_resource.html">Resource</a> &amp;resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a423da94bba4bca8eb296e89f179640f9">AudioFrame</a> (<a class="el" href="namespacepp.html#a339083c1beec620267bf8b3c55decaa5">PassRef</a>, PP_Resource resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a41fd32585aa8fe9427dff22cb5455422">~AudioFrame</a> ()</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">PP_TimeDelta&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#acfd8249e24bfe64b502856474c9bc1ff">GetTimestamp</a> () const </td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#af0222861693f93302daa16993aa30ef1">SetTimestamp</a> (PP_TimeDelta timestamp)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a0cf77d9bbf90d8474053a79514f4dd30">GetSampleSize</a> () const </td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a5c5dc02664ce94915445a698f655e7ca">GetNumberOfChannels</a> () const </td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a740e54cb2498a3dfe5b621cdf830b692">GetNumberOfSamples</a> () const </td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a3eab39dcfec84777987b0b237747187d">GetDataBuffer</a> ()</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html#a9b10a619f819ff7351dbabb8de140563">GetDataBufferSize</a> () const </td></tr>
-</table>
-<hr /><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" id="a34c5fe2032eb858356bade18829eb5af"></a><!-- doxytag: member="pp::AudioFrame::AudioFrame" ref="a34c5fe2032eb858356bade18829eb5af" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="classpp_1_1_audio_frame.html#a34c5fe2032eb858356bade18829eb5af">pp::AudioFrame::AudioFrame</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a></code> object. </p>
-</div>
-</div>
-<a class="anchor" id="a4d90b7a73435fe86eec8d3b106ccad49"></a><!-- doxytag: member="pp::AudioFrame::AudioFrame" ref="a4d90b7a73435fe86eec8d3b106ccad49" args="(const AudioFrame &amp;other)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="classpp_1_1_audio_frame.html#a34c5fe2032eb858356bade18829eb5af">pp::AudioFrame::AudioFrame</a> </td>
-<td>(</td>
-<td class="paramtype">const <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> &amp;&#160;</td>
-<td class="paramname"><em>other</em></td><td>)</td>
-<td></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>The copy constructor for <code><a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a></code>. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to an <code><a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a></code>. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="a29676f598adbc902205712aa64bd79c8"></a><!-- doxytag: member="pp::AudioFrame::AudioFrame" ref="a29676f598adbc902205712aa64bd79c8" args="(const Resource &amp;resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="classpp_1_1_audio_frame.html#a34c5fe2032eb858356bade18829eb5af">pp::AudioFrame::AudioFrame</a> </td>
-<td>(</td>
-<td class="paramtype">const <a class="el" href="classpp_1_1_resource.html">Resource</a> &amp;&#160;</td>
-<td class="paramname"><em>resource</em></td><td>)</td>
-<td><code> [explicit]</code></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Constructs an <code><a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a></code> from a <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code>. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PPB_AudioFrame</code> resource. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="a423da94bba4bca8eb296e89f179640f9"></a><!-- doxytag: member="pp::AudioFrame::AudioFrame" ref="a423da94bba4bca8eb296e89f179640f9" args="(PassRef, PP_Resource resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="classpp_1_1_audio_frame.html#a34c5fe2032eb858356bade18829eb5af">pp::AudioFrame::AudioFrame</a> </td>
-<td>(</td>
-<td class="paramtype"><a class="el" href="namespacepp.html#a339083c1beec620267bf8b3c55decaa5">PassRef</a>&#160;</td>
-<td class="paramname">, </td>
-</tr>
-<tr>
-<td class="paramkey"></td>
-<td></td>
-<td class="paramtype">PP_Resource&#160;</td>
-<td class="paramname"><em>resource</em>&#160;</td>
-</tr>
-<tr>
-<td></td>
-<td>)</td>
-<td></td><td></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>A constructor used when you have received a <code>PP_Resource</code> as a return value that has had 1 ref added for you. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PPB_AudioFrame</code> resource. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="a41fd32585aa8fe9427dff22cb5455422"></a><!-- doxytag: member="pp::AudioFrame::~AudioFrame" ref="a41fd32585aa8fe9427dff22cb5455422" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">virtual <a class="el" href="classpp_1_1_audio_frame.html#a41fd32585aa8fe9427dff22cb5455422">pp::AudioFrame::~AudioFrame</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td><code> [virtual]</code></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-</div>
-</div>
-<hr /><h2>Member Function Documentation</h2>
-<a class="anchor" id="a3eab39dcfec84777987b0b237747187d"></a><!-- doxytag: member="pp::AudioFrame::GetDataBuffer" ref="a3eab39dcfec84777987b0b237747187d" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void* <a class="el" href="classpp_1_1_audio_frame.html#a3eab39dcfec84777987b0b237747187d">pp::AudioFrame::GetDataBuffer</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the data buffer containing the audio frame samples. </p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A pointer to the beginning of the data buffer. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a9b10a619f819ff7351dbabb8de140563"></a><!-- doxytag: member="pp::AudioFrame::GetDataBufferSize" ref="a9b10a619f819ff7351dbabb8de140563" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_frame.html#a9b10a619f819ff7351dbabb8de140563">pp::AudioFrame::GetDataBufferSize</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td> const</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the size of data buffer in bytes. </p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The size of the data buffer in bytes. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a5c5dc02664ce94915445a698f655e7ca"></a><!-- doxytag: member="pp::AudioFrame::GetNumberOfChannels" ref="a5c5dc02664ce94915445a698f655e7ca" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_frame.html#a5c5dc02664ce94915445a698f655e7ca">pp::AudioFrame::GetNumberOfChannels</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td> const</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the number of channels in the audio frame. </p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The number of channels in the audio frame. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a740e54cb2498a3dfe5b621cdf830b692"></a><!-- doxytag: member="pp::AudioFrame::GetNumberOfSamples" ref="a740e54cb2498a3dfe5b621cdf830b692" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_frame.html#a740e54cb2498a3dfe5b621cdf830b692">pp::AudioFrame::GetNumberOfSamples</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td> const</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the number of samples in the audio frame. </p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The number of samples in the audio frame. For example, at a sampling rate of 44,100 Hz in stereo audio, a frame containing 4,410 * 2 samples would have a duration of 100 milliseconds. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a0cf77d9bbf90d8474053a79514f4dd30"></a><!-- doxytag: member="pp::AudioFrame::GetSampleSize" ref="a0cf77d9bbf90d8474053a79514f4dd30" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">uint32_t <a class="el" href="classpp_1_1_audio_frame.html#a0cf77d9bbf90d8474053a79514f4dd30">pp::AudioFrame::GetSampleSize</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td> const</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the sample size of the audio frame in bytes. </p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>The sample size of the audio frame in bytes. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="acfd8249e24bfe64b502856474c9bc1ff"></a><!-- doxytag: member="pp::AudioFrame::GetTimestamp" ref="acfd8249e24bfe64b502856474c9bc1ff" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">PP_TimeDelta <a class="el" href="classpp_1_1_audio_frame.html#acfd8249e24bfe64b502856474c9bc1ff">pp::AudioFrame::GetTimestamp</a> </td>
-<td>(</td>
-<td class="paramname"></td><td>)</td>
-<td> const</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Gets the timestamp of the audio frame. </p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_TimeDelta</code> containing the timestamp of the audio frame. Given in seconds since the start of the containing audio stream. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="af0222861693f93302daa16993aa30ef1"></a><!-- doxytag: member="pp::AudioFrame::SetTimestamp" ref="af0222861693f93302daa16993aa30ef1" args="(PP_TimeDelta timestamp)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void <a class="el" href="classpp_1_1_audio_frame.html#af0222861693f93302daa16993aa30ef1">pp::AudioFrame::SetTimestamp</a> </td>
-<td>(</td>
-<td class="paramtype">PP_TimeDelta&#160;</td>
-<td class="paramname"><em>timestamp</em></td><td>)</td>
-<td></td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p>Sets the timestamp of the audio frame. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">timestamp</td><td>A <code>PP_TimeDelta</code> containing the timestamp of the audio frame. Given in seconds since the start of the containing audio stream. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<hr />The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="audio__frame_8h.html">audio_frame.h</a></li>
-</ul>
-</div><!-- contents -->
-</div>
-{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame__inherit__graph.png
deleted file mode 100644
index 5d95b0a9da..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_frame__inherit__graph.png
+++ /dev/null
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track-members.html
index 8c93174456..aab87efdb0 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track-members.html
@@ -16,7 +16,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_media_s
<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#ad3572da8199315fc90248f5634358211">Configure</a>(const int32_t attributes[], const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#ac1767869e698082610ee3f9cb5a28561">GetAttrib</a>(PP_MediaStreamAudioTrack_Attrib attrib, int32_t *value)</td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#a21cbe2138268adba62b204762aa30e10">GetFrame</a>(const CompletionCallbackWithOutput&lt; AudioFrame &gt; &amp;callback)</td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#acc9e47e460bae4a6d0ade366b5cf33ed">GetBuffer</a>(const CompletionCallbackWithOutput&lt; AudioBuffer &gt; &amp;callback)</td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#ac04877194c84ddbb004265e476275a46">GetId</a>() const </td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#ae1be4d89810f272b4e43b1ca07a7b0de">HasEnded</a>() const </td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
@@ -28,7 +28,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_media_s
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#aa979e01db289d5063b6b7f8ac959345a">RecycleFrame</a>(const AudioFrame &amp;frame)</td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_media_stream_audio_track.html#a0601e973dc3020973cfb001ee320aa36">RecycleBuffer</a>(const AudioBuffer &amp;buffer)</td><td><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track.html
index c7daa1551d..7937cb88fa 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_audio_track.html
@@ -30,15 +30,15 @@ Public Member Functions</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#ac1767869e698082610ee3f9cb5a28561">GetAttrib</a> (PP_MediaStreamAudioTrack_Attrib attrib, int32_t *value)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#ac04877194c84ddbb004265e476275a46">GetId</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#ae1be4d89810f272b4e43b1ca07a7b0de">HasEnded</a> () const </td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#a21cbe2138268adba62b204762aa30e10">GetFrame</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> &gt; &amp;callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#aa979e01db289d5063b6b7f8ac959345a">RecycleFrame</a> (const <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> &amp;frame)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#acc9e47e460bae4a6d0ade366b5cf33ed">GetBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &gt; &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#a0601e973dc3020973cfb001ee320aa36">RecycleBuffer</a> (const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &amp;buffer)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#a2ad0471a5fb098f84ec301d52bca269a">Close</a> ()</td></tr>
</table><h2>
Static Public Member Functions</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html#a66b94f4551e3e1db35fc9cdfdb686097">IsMediaStreamAudioTrack</a> (const <a class="el" href="classpp_1_1_resource.html">Resource</a> &amp;resource)</td></tr>
</table>
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
-<div class="textblock"><p>The <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code> class contains methods for receiving audio frames from a MediaStream audio track in the browser. </p>
+<div class="textblock"><p>The <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code> class contains methods for receiving audio buffers from a MediaStream audio track in the browser. </p>
</div><hr /><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" id="aba4674796b58027523c3429e6e6c977f"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::MediaStreamAudioTrack" ref="aba4674796b58027523c3429e6e6c977f" args="()" -->
<div class="memitem">
@@ -53,7 +53,7 @@ Static Public Member Functions</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code> object. </p>
+<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code> object. </p>
</div>
</div>
<a class="anchor" id="adc7d45a01c7f7e27a94a033e957e0587"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::MediaStreamAudioTrack" ref="adc7d45a01c7f7e27a94a033e957e0587" args="(const MediaStreamAudioTrack &amp;other)" -->
@@ -70,10 +70,10 @@ Static Public Member Functions</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>The copy constructor for <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code>. </p>
+<p>The copy constructor for <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code>. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code>. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code>. </td></tr>
</table>
</dd>
</dl>
@@ -93,7 +93,7 @@ Static Public Member Functions</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>Constructs a <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code> from a <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code>. </p>
+<p>Constructs a <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code> from a <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code>. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PPB_MediaStreamAudioTrack</code> resource. </td></tr>
@@ -165,7 +165,7 @@ Static Public Member Functions</h2><table class="memberdecls">
</div>
<div class="memdoc">
<p>Closes the MediaStream audio track, and disconnects it from the audio source. </p>
-<p>After calling <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#a2ad0471a5fb098f84ec301d52bca269a" title="Closes the MediaStream audio track, and disconnects it from the audio source.">Close()</a></code>, no new frames will be received. </p>
+<p>After calling <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#a2ad0471a5fb098f84ec301d52bca269a" title="Closes the MediaStream audio track, and disconnects it from the audio source.">Close()</a></code>, no new buffers will be received. </p>
</div>
</div>
<a class="anchor" id="ad3572da8199315fc90248f5634358211"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::Configure" ref="ad3572da8199315fc90248f5634358211" args="(const int32_t attributes[], const CompletionCallback &amp;callback)" -->
@@ -192,17 +192,17 @@ Static Public Member Functions</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>Configures underlying frame buffers for incoming frames. </p>
-<p>If the application doesn't want to drop frames, then the <code>PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES</code> should be chosen such that inter-frame processing time variability won't overrun the input buffer. If the buffer is overfilled, then frames will be dropped. The application can detect this by examining the timestamp on returned frames. If <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#ad3572da8199315fc90248f5634358211" title="Configures underlying frame buffers for incoming frames.">Configure()</a></code> is not called, default settings will be used. Example usage from plugin code: </p>
+<p>Configures underlying buffer buffers for incoming audio samples. </p>
+<p>If the application doesn't want to drop samples, then the <code>PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</code> should be chosen such that inter-buffer processing time variability won't overrun all input buffers. If all buffers are filled, then samples will be dropped. The application can detect this by examining the timestamp on returned buffers. If <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#ad3572da8199315fc90248f5634358211" title="Configures underlying buffer buffers for incoming audio samples.">Configure()</a></code> is not called, default settings will be used. Example usage from plugin code: </p>
<div class="fragment"><pre class="fragment"> int32_t attribs[] = {
- PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERED_FRAMES, 4,
+ PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS, 4,
PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION, 10,
PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE};
track.Configure(attribs, callback);
</pre></div><dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">attrib_list</td><td>A list of attribute name-value pairs in which each attribute is immediately followed by the corresponding desired value. The list is terminated by <code>PP_MEDIASTREAMAUDIOTRACK_AUDIO_NONE</code>. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#ad3572da8199315fc90248f5634358211" title="Configures underlying frame buffers for incoming frames.">Configure()</a></code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#ad3572da8199315fc90248f5634358211" title="Configures underlying buffer buffers for incoming audio samples.">Configure()</a></code>.</td></tr>
</table>
</dd>
</dl>
@@ -244,29 +244,29 @@ Static Public Member Functions</h2><table class="memberdecls">
<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code>pp_errors.h</code>. </dd></dl>
</div>
</div>
-<a class="anchor" id="a21cbe2138268adba62b204762aa30e10"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::GetFrame" ref="a21cbe2138268adba62b204762aa30e10" args="(const CompletionCallbackWithOutput&lt; AudioFrame &gt; &amp;callback)" -->
+<a class="anchor" id="acc9e47e460bae4a6d0ade366b5cf33ed"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::GetBuffer" ref="acc9e47e460bae4a6d0ade366b5cf33ed" args="(const CompletionCallbackWithOutput&lt; AudioBuffer &gt; &amp;callback)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">int32_t <a class="el" href="classpp_1_1_media_stream_audio_track.html#a21cbe2138268adba62b204762aa30e10">pp::MediaStreamAudioTrack::GetFrame</a> </td>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_media_stream_audio_track.html#acc9e47e460bae4a6d0ade366b5cf33ed">pp::MediaStreamAudioTrack::GetBuffer</a> </td>
<td>(</td>
-<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> &gt; &amp;&#160;</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>callback</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
-<p>Gets the next audio frame from the MediaStream track. </p>
-<p>If internal processing is slower than the incoming frame rate, new frames will be dropped from the incoming stream. Once the input buffer is full, frames will be dropped until <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#aa979e01db289d5063b6b7f8ac959345a" title="Recycles a frame returned by GetFrame(), so the track can reuse the underlying buffer of this frame...">RecycleFrame()</a></code> is called to free a spot for another frame to be buffered. If there are no frames in the input buffer, <code>PP_OK_COMPLETIONPENDING</code> will be returned immediately and the <code>callback</code> will be called when a new frame is received or some error happens.</p>
+<p>Gets the next audio buffer from the MediaStream track. </p>
+<p>If internal processing is slower than the incoming buffer rate, new buffers will be dropped from the incoming stream. Once all buffers are full, audio samples will be dropped until <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#a0601e973dc3020973cfb001ee320aa36" title="Recycles a buffer returned by GetBuffer(), so the track can reuse the buffer.">RecycleBuffer()</a></code> is called to free a spot for another buffer. If there are no audio data in the input buffer, <code>PP_OK_COMPLETIONPENDING</code> will be returned immediately and the <code>callback</code> will be called when a new buffer of audio samples is received or some error happens.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#a21cbe2138268adba62b204762aa30e10" title="Gets the next audio frame from the MediaStream track.">GetFrame()</a></code>. If success, an <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> will be passed into the completion callback function.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#acc9e47e460bae4a6d0ade366b5cf33ed" title="Gets the next audio buffer from the MediaStream track.">GetBuffer()</a></code>. If success, an <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> will be passed into the completion callback function.</td></tr>
</table>
</dd>
</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code>pp_errors.h</code>. Returns PP_ERROR_NOMEMORY if <code>max_buffered_frames</code> frames buffer was not allocated successfully. </dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code>pp_errors.h</code>. </dd></dl>
</div>
</div>
<a class="anchor" id="ac04877194c84ddbb004265e476275a46"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::GetId" ref="ac04877194c84ddbb004265e476275a46" args="() const " -->
@@ -299,7 +299,7 @@ Static Public Member Functions</h2><table class="memberdecls">
</div>
<div class="memdoc">
<p>Checks whether the underlying MediaStream track has ended. </p>
-<p>Calls to GetFrame while the track has ended are safe to make and will complete, but will fail. </p>
+<p>Calls to GetBuffer while the track has ended are safe to make and will complete, but will fail. </p>
</div>
</div>
<a class="anchor" id="a66b94f4551e3e1db35fc9cdfdb686097"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::IsMediaStreamAudioTrack" ref="a66b94f4551e3e1db35fc9cdfdb686097" args="(const Resource &amp;resource)" -->
@@ -316,7 +316,7 @@ Static Public Member Functions</h2><table class="memberdecls">
</table>
</div>
<div class="memdoc">
-<p>Checks whether a <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code> is a MediaStream audio track, to test whether it is appropriate for use with the <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code> constructor. </p>
+<p>Checks whether a <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code> is a MediaStream audio track, to test whether it is appropriate for use with the <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code> constructor. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">Resource</a></code> to test.</td></tr>
@@ -326,25 +326,25 @@ Static Public Member Functions</h2><table class="memberdecls">
<dl class="return"><dt><b>Returns:</b></dt><dd>True if <code>resource</code> is a MediaStream audio track. </dd></dl>
</div>
</div>
-<a class="anchor" id="aa979e01db289d5063b6b7f8ac959345a"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::RecycleFrame" ref="aa979e01db289d5063b6b7f8ac959345a" args="(const AudioFrame &amp;frame)" -->
+<a class="anchor" id="a0601e973dc3020973cfb001ee320aa36"></a><!-- doxytag: member="pp::MediaStreamAudioTrack::RecycleBuffer" ref="a0601e973dc3020973cfb001ee320aa36" args="(const AudioBuffer &amp;buffer)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">int32_t <a class="el" href="classpp_1_1_media_stream_audio_track.html#aa979e01db289d5063b6b7f8ac959345a">pp::MediaStreamAudioTrack::RecycleFrame</a> </td>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_media_stream_audio_track.html#a0601e973dc3020973cfb001ee320aa36">pp::MediaStreamAudioTrack::RecycleBuffer</a> </td>
<td>(</td>
-<td class="paramtype">const <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> &amp;&#160;</td>
-<td class="paramname"><em>frame</em></td><td>)</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &amp;&#160;</td>
+<td class="paramname"><em>buffer</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
-<p>Recycles a frame returned by <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#a21cbe2138268adba62b204762aa30e10" title="Gets the next audio frame from the MediaStream track.">GetFrame()</a></code>, so the track can reuse the underlying buffer of this frame. </p>
-<p>And the frame will become invalid. The caller should release all references it holds to <code>frame</code> and not use it anymore.</p>
+<p>Recycles a buffer returned by <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#acc9e47e460bae4a6d0ade366b5cf33ed" title="Gets the next audio buffer from the MediaStream track.">GetBuffer()</a></code>, so the track can reuse the buffer. </p>
+<p>And the buffer will become invalid. The caller should release all references it holds to <code>buffer</code> and not use it anymore.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">frame</td><td>A <a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a> returned by <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#a21cbe2138268adba62b204762aa30e10" title="Gets the next audio frame from the MediaStream track.">GetFrame()</a></code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>A <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> returned by <code><a class="el" href="classpp_1_1_media_stream_audio_track.html#acc9e47e460bae4a6d0ade366b5cf33ed" title="Gets the next audio buffer from the MediaStream track.">GetBuffer()</a></code>.</td></tr>
</table>
</dd>
</dl>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_video_track.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_video_track.html
index 7aab6121ae..5bcaf4b6cd 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_video_track.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_media_stream_video_track.html
@@ -201,7 +201,7 @@ Static Public Member Functions</h2><table class="memberdecls">
</pre></div><dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">attrib_list</td><td>A list of attribute name-value pairs in which each attribute is immediately followed by the corresponding desired value. The list is terminated by <code>PP_MEDIASTREAMVIDEOTRACK_ATTRIB_NONE</code>. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_video_track.html#a1a7050062a28190a931e4b70b0e0b04d" title="Configures underlying frame buffers for incoming frames.">Configure()</a></code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_video_track.html#a1a7050062a28190a931e4b70b0e0b04d" title="Configures underlying frame buffers for incoming frames.">Configure()</a></code>.</td></tr>
</table>
</dd>
</dl>
@@ -261,7 +261,7 @@ Static Public Member Functions</h2><table class="memberdecls">
<p>If internal processing is slower than the incoming frame rate, new frames will be dropped from the incoming stream. Once the input buffer is full, frames will be dropped until <code><a class="el" href="classpp_1_1_media_stream_video_track.html#ab3df0710c423f1c2b1e45da957bc65e4" title="Recycles a frame returned by GetFrame(), so the track can reuse the underlying buffer of this frame...">RecycleFrame()</a></code> is called to free a spot for another frame to be buffered. If there are no frames in the input buffer, <code>PP_OK_COMPLETIONPENDING</code> will be returned immediately and the <code>callback</code> will be called when a new frame is received or some error happens.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_video_track.html#aeea5ef2549e1caeddea6ed783d0efe32" title="Gets the next video frame from the MediaStream track.">GetFrame()</a></code>. If success, a <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> will be passed into the completion callback function.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion of <code><a class="el" href="classpp_1_1_media_stream_video_track.html#aeea5ef2549e1caeddea6ed783d0efe32" title="Gets the next video frame from the MediaStream track.">GetFrame()</a></code>. If success, a <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> will be passed into the completion callback function.</td></tr>
</table>
</dd>
</dl>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource-members.html
index c2c8dcbf94..07007dafa2 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource-members.html
@@ -21,7 +21,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_resourc
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
-<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aef268205011788a4a9f05ed201384ace">VarResource_Dev</a> class</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [friend]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a966ff6c3e1475d52398924cc6d3cbb6d">Var</a> class</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [friend]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr>
</table></div><!-- contents -->
</div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
index cc54cc56fe..01e2a4feda 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@ Inheritance diagram for pp::Resource:</div>
<div class="dyncontent">
<div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div>
<map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map">
-<area shape="rect" id="node3" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,35"></area><area shape="rect" id="node5" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,59,319,88"></area><area shape="rect" id="node7" href="classpp_1_1_audio_frame.html" title="pp::AudioFrame" alt="" coords="196,112,319,141"></area><area shape="rect" id="node9" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="219,165,296,195"></area><area shape="rect" id="node11" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,219,300,248"></area><area shape="rect" id="node13" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,272,315,301"></area><area shape="rect" id="node15" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,325,317,355"></area><area shape="rect" id="node17" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,379,317,408"></area><area shape="rect" id="node19" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,432,321,461"></area><area shape="rect" id="node21" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,485,316,515"></area><area shape="rect" id="node23" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,539,315,568"></area><area shape="rect" id="node35" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ..." alt="" coords="157,592,357,621"></area><area shape="rect" id="node37" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,645,357,675"></area><area shape="rect" id="node39" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="191,699,324,728"></area><area shape="rect" id="node41" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,752,317,781"></area><area shape="rect" id="node43" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,805,317,835"></area><area shape="rect" id="node45" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,859,331,888"></area><area shape="rect" id="node47" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,912,313,941"></area><area shape="rect" id="node49" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="199,965,316,995"></area><area shape="rect" id="node51" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1019,315,1048"></area><area shape="rect" id="node53" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1072,329,1101"></area><area shape="rect" id="node55" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1125,335,1155"></area><area shape="rect" id="node57" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1179,319,1208"></area><area shape="rect" id="node59" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1232,295,1261"></area><area shape="rect" id="node61" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="200,1285,315,1315"></area><area shape="rect" id="node25" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,432,560,461"></area><area shape="rect" id="node27" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,485,579,515"></area><area shape="rect" id="node29" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="415,539,569,568"></area><area shape="rect" id="node31" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,592,567,621"></area><area shape="rect" id="node33" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,645,568,675"></area></map>
+<area shape="rect" id="node3" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,35"></area><area shape="rect" id="node5" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,59,317,88"></area><area shape="rect" id="node7" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,112,319,141"></area><area shape="rect" id="node9" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="219,165,296,195"></area><area shape="rect" id="node11" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,219,300,248"></area><area shape="rect" id="node13" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,272,315,301"></area><area shape="rect" id="node15" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,325,317,355"></area><area shape="rect" id="node17" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,379,317,408"></area><area shape="rect" id="node19" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,432,321,461"></area><area shape="rect" id="node21" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,485,316,515"></area><area shape="rect" id="node23" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,539,315,568"></area><area shape="rect" id="node35" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,592,357,621"></area><area shape="rect" id="node37" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,645,357,675"></area><area shape="rect" id="node39" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="191,699,324,728"></area><area shape="rect" id="node41" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,752,317,781"></area><area shape="rect" id="node43" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,805,317,835"></area><area shape="rect" id="node45" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,859,331,888"></area><area shape="rect" id="node47" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,912,313,941"></area><area shape="rect" id="node49" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="199,965,316,995"></area><area shape="rect" id="node51" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1019,315,1048"></area><area shape="rect" id="node53" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1072,329,1101"></area><area shape="rect" id="node55" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1125,335,1155"></area><area shape="rect" id="node57" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1179,319,1208"></area><area shape="rect" id="node59" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1232,295,1261"></area><area shape="rect" id="node61" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="200,1285,315,1315"></area><area shape="rect" id="node25" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,432,560,461"></area><area shape="rect" id="node27" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,485,579,515"></area><area shape="rect" id="node29" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="415,539,569,568"></area><area shape="rect" id="node31" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,592,567,621"></area><area shape="rect" id="node33" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,645,568,675"></area></map>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<p><a href="classpp_1_1_resource-members.html">List of all members.</a></p>
<h2>
@@ -36,7 +36,7 @@ Protected Member Functions</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a> ()</td></tr>
</table><h2>
Friends</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">class&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_resource.html#aef268205011788a4a9f05ed201384ace">VarResource_Dev</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_resource.html#a966ff6c3e1475d52398924cc6d3cbb6d">Var</a></td></tr>
</table>
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>A reference counted module resource. </p>
@@ -264,12 +264,12 @@ Friends</h2><table class="memberdecls">
</div>
</div>
<hr /><h2>Friends And Related Function Documentation</h2>
-<a class="anchor" id="aef268205011788a4a9f05ed201384ace"></a><!-- doxytag: member="pp::Resource::VarResource_Dev" ref="aef268205011788a4a9f05ed201384ace" args="" -->
+<a class="anchor" id="a966ff6c3e1475d52398924cc6d3cbb6d"></a><!-- doxytag: member="pp::Resource::Var" ref="a966ff6c3e1475d52398924cc6d3cbb6d" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
-<td class="memname">friend class <a class="el" href="classpp_1_1_resource.html#aef268205011788a4a9f05ed201384ace">VarResource_Dev</a><code> [friend]</code></td>
+<td class="memname">friend class <a class="el" href="classpp_1_1_var.html">Var</a><code> [friend]</code></td>
</tr>
</table>
</div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png
index ffd4d7557e..2876e0b7be 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var-members.html
index 81ae8c222c..ffc8b855de 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var-members.html
@@ -14,6 +14,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var.htm
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a07e7a4ea38b990e6c230109823347e70">AsBool</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a8a798b08e197948c161737fc7b745af6">AsDouble</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#ad31cdb379b6ceaae967125e358c81d16">AsInt</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a0346197dfa6ba350c6d9e3c85cc0ce80">AsResource</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a22a1e3b2a0783b949bedcdae49c07c97">AsString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a835b1e5a601d6e5ceb9a7d1b5fb7a66f">DebugString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a84a725a42640a63747f7f6bc252b65d4">Detach</a>()</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
@@ -40,6 +41,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var.htm
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a9bbdfd7d1aa2bd6c8d526ff5f6a2c035">Var</a>(double d)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a24ae309e6e0335d2b16aab6039c231fa">Var</a>(const char *utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a4b0c8c5ef714c9444cfd8f1dd4a9fb25">Var</a>(const std::string &amp;utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a7a9b5f09aa3c5f6f6ca961904c7d87ba">Var</a>(const pp::Resource &amp;resource)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a64a857e38d59b1e012a02d7b8f98680f">Var</a>(PassRef, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a52415e7de337c97b08eb70b06e0cda4b">Var</a>(const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a2356640f40527226f295cc15ec01f302">Var</a>(DontManage, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var.html
index 341b28ed85..e40a9f56b3 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var.html
@@ -35,6 +35,7 @@ Public Member Functions</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a9bbdfd7d1aa2bd6c8d526ff5f6a2c035">Var</a> (double d)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a24ae309e6e0335d2b16aab6039c231fa">Var</a> (const char *utf8_str)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a4b0c8c5ef714c9444cfd8f1dd4a9fb25">Var</a> (const std::string &amp;utf8_str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a7a9b5f09aa3c5f6f6ca961904c7d87ba">Var</a> (const <a class="el" href="classpp_1_1_resource.html">pp::Resource</a> &amp;resource)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a64a857e38d59b1e012a02d7b8f98680f">Var</a> (<a class="el" href="namespacepp.html#a339083c1beec620267bf8b3c55decaa5">PassRef</a>, const PP_Var &amp;var)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a52415e7de337c97b08eb70b06e0cda4b">Var</a> (const PP_Var &amp;var)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a2356640f40527226f295cc15ec01f302">Var</a> (<a class="el" href="structpp_1_1_var_1_1_dont_manage.html">DontManage</a>, const PP_Var &amp;var)</td></tr>
@@ -58,6 +59,7 @@ Public Member Functions</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#ad31cdb379b6ceaae967125e358c81d16">AsInt</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a8a798b08e197948c161737fc7b745af6">AsDouble</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a22a1e3b2a0783b949bedcdae49c07c97">AsString</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classpp_1_1_resource.html">pp::Resource</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a0346197dfa6ba350c6d9e3c85cc0ce80">AsResource</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const PP_Var &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#ad828439641c93930ff188b45b45b4261">pp_var</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">PP_Var&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a84a725a42640a63747f7f6bc252b65d4">Detach</a> ()</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var.html#a835b1e5a601d6e5ceb9a7d1b5fb7a66f">DebugString</a> () const </td></tr>
@@ -206,6 +208,23 @@ Protected Attributes</h2><table class="memberdecls">
<p>A constructor used to create a UTF-8 character <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code>. </p>
</div>
</div>
+<a class="anchor" id="a7a9b5f09aa3c5f6f6ca961904c7d87ba"></a><!-- doxytag: member="pp::Var::Var" ref="a7a9b5f09aa3c5f6f6ca961904c7d87ba" args="(const pp::Resource &amp;resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_var.html#af571fae55754a20ae95ffd140726d04c">pp::Var::Var</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_resource.html">pp::Resource</a> &amp;&#160;</td>
+<td class="paramname"><em>resource</em></td><td>)</td>
+<td><code> [explicit]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>A constructor used to create a resource <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code>. </p>
+</div>
+</div>
<a class="anchor" id="a64a857e38d59b1e012a02d7b8f98680f"></a><!-- doxytag: member="pp::Var::Var" ref="a64a857e38d59b1e012a02d7b8f98680f" args="(PassRef, const PP_Var &amp;var)" -->
<div class="memitem">
<div class="memproto">
@@ -375,6 +394,24 @@ Protected Attributes</h2><table class="memberdecls">
<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t version of this <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code>. </dd></dl>
</div>
</div>
+<a class="anchor" id="a0346197dfa6ba350c6d9e3c85cc0ce80"></a><!-- doxytag: member="pp::Var::AsResource" ref="a0346197dfa6ba350c6d9e3c85cc0ce80" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_resource.html">pp::Resource</a> <a class="el" href="classpp_1_1_var.html#a0346197dfa6ba350c6d9e3c85cc0ce80">pp::Var::AsResource</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td> const</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Gets the resource contained in the var. </p>
+<p>If this object is not a resource, it will assert in debug mode, and return a null resource.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The <code><a class="el" href="classpp_1_1_resource.html" title="A reference counted module resource.">pp::Resource</a></code> that is contained in the var. </dd></dl>
+</div>
+</div>
<a class="anchor" id="a22a1e3b2a0783b949bedcdae49c07c97"></a><!-- doxytag: member="pp::Var::AsString" ref="a22a1e3b2a0783b949bedcdae49c07c97" args="() const " -->
<div class="memitem">
<div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array-members.html
index a91f05c25a..f3c5ed4518 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array-members.html
@@ -14,6 +14,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var_arr
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a07e7a4ea38b990e6c230109823347e70">AsBool</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a8a798b08e197948c161737fc7b745af6">AsDouble</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#ad31cdb379b6ceaae967125e358c81d16">AsInt</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a0346197dfa6ba350c6d9e3c85cc0ce80">AsResource</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a22a1e3b2a0783b949bedcdae49c07c97">AsString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a835b1e5a601d6e5ceb9a7d1b5fb7a66f">DebugString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a84a725a42640a63747f7f6bc252b65d4">Detach</a>()</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
@@ -45,6 +46,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var_arr
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a9bbdfd7d1aa2bd6c8d526ff5f6a2c035">Var</a>(double d)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a24ae309e6e0335d2b16aab6039c231fa">Var</a>(const char *utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a4b0c8c5ef714c9444cfd8f1dd4a9fb25">Var</a>(const std::string &amp;utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a7a9b5f09aa3c5f6f6ca961904c7d87ba">Var</a>(const pp::Resource &amp;resource)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a64a857e38d59b1e012a02d7b8f98680f">Var</a>(PassRef, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a52415e7de337c97b08eb70b06e0cda4b">Var</a>(const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a2356640f40527226f295cc15ec01f302">Var</a>(DontManage, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array_buffer-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array_buffer-members.html
index 5fbc8721af..e16e2e4636 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array_buffer-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_array_buffer-members.html
@@ -14,6 +14,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var_arr
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a07e7a4ea38b990e6c230109823347e70">AsBool</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a8a798b08e197948c161737fc7b745af6">AsDouble</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#ad31cdb379b6ceaae967125e358c81d16">AsInt</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a0346197dfa6ba350c6d9e3c85cc0ce80">AsResource</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a22a1e3b2a0783b949bedcdae49c07c97">AsString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var_array_buffer.html#aee1fdb39f8a1ebcd8a78fb5e996e0af2">ByteLength</a>() const </td><td><a class="el" href="classpp_1_1_var_array_buffer.html">pp::VarArrayBuffer</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a835b1e5a601d6e5ceb9a7d1b5fb7a66f">DebugString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
@@ -44,6 +45,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var_arr
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a9bbdfd7d1aa2bd6c8d526ff5f6a2c035">Var</a>(double d)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a24ae309e6e0335d2b16aab6039c231fa">Var</a>(const char *utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a4b0c8c5ef714c9444cfd8f1dd4a9fb25">Var</a>(const std::string &amp;utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a7a9b5f09aa3c5f6f6ca961904c7d87ba">Var</a>(const pp::Resource &amp;resource)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a64a857e38d59b1e012a02d7b8f98680f">Var</a>(PassRef, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a52415e7de337c97b08eb70b06e0cda4b">Var</a>(const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a2356640f40527226f295cc15ec01f302">Var</a>(DontManage, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_dictionary-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_dictionary-members.html
index 6d240af6b0..bc6788ca07 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_dictionary-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_var_dictionary-members.html
@@ -14,6 +14,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var_dic
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a07e7a4ea38b990e6c230109823347e70">AsBool</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a8a798b08e197948c161737fc7b745af6">AsDouble</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#ad31cdb379b6ceaae967125e358c81d16">AsInt</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a0346197dfa6ba350c6d9e3c85cc0ce80">AsResource</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a22a1e3b2a0783b949bedcdae49c07c97">AsString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a835b1e5a601d6e5ceb9a7d1b5fb7a66f">DebugString</a>() const </td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var_dictionary.html#a1a3c22688159becedcb855fa78619c8c">Delete</a>(const Var &amp;key)</td><td><a class="el" href="classpp_1_1_var_dictionary.html">pp::VarDictionary</a></td><td></td></tr>
@@ -46,6 +47,7 @@ This is the complete list of members for <a class="el" href="classpp_1_1_var_dic
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a9bbdfd7d1aa2bd6c8d526ff5f6a2c035">Var</a>(double d)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a24ae309e6e0335d2b16aab6039c231fa">Var</a>(const char *utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a4b0c8c5ef714c9444cfd8f1dd4a9fb25">Var</a>(const std::string &amp;utf8_str)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a7a9b5f09aa3c5f6f6ca961904c7d87ba">Var</a>(const pp::Resource &amp;resource)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a64a857e38d59b1e012a02d7b8f98680f">Var</a>(PassRef, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a52415e7de337c97b08eb70b06e0cda4b">Var</a>(const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [explicit]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classpp_1_1_var.html#a2356640f40527226f295cc15ec01f302">Var</a>(DontManage, const PP_Var &amp;var)</td><td><a class="el" href="classpp_1_1_var.html">pp::Var</a></td><td><code> [inline]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/index.html b/native_client_sdk/doc_generated/pepper_dev/cpp/index.html
index 8a1e08ad3f..deea3b5dab 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/index.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/index.html
@@ -9,8 +9,8 @@ run in Chrome 34 or higher.</p>
<blockquote>
<div><ul class="small-gap">
<li><a class="reference external" href="classpp_1_1_audio.html">Audio</a></li>
+<li><a class="reference external" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></li>
<li><a class="reference external" href="classpp_1_1_audio_config.html">AudioConfig</a></li>
-<li><a class="reference external" href="classpp_1_1_audio_frame.html">AudioFrame</a></li>
<li><a class="reference external" href="classpp_1_1_completion_callback.html">CompletionCallback</a></li>
<li><a class="reference external" href="classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></li>
<li><a class="reference external" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></li>
@@ -73,8 +73,8 @@ run in Chrome 34 or higher.</p>
<blockquote>
<div><ul class="small-gap">
<li><a class="reference external" href="audio_8h.html">audio.h</a></li>
+<li><a class="reference external" href="audio__buffer_8h.html">audio_buffer.h</a></li>
<li><a class="reference external" href="audio__config_8h.html">audio_config.h</a></li>
-<li><a class="reference external" href="audio__frame_8h.html">audio_frame.h</a></li>
<li><a class="reference external" href="completion__callback_8h.html">completion_callback.h</a></li>
<li><a class="reference external" href="completion__callback__factory_8h.html">completion_callback_factory.h</a></li>
<li><a class="reference external" href="core_8h.html">core.h</a></li>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/index.rst b/native_client_sdk/doc_generated/pepper_dev/cpp/index.rst
deleted file mode 100644
index ae0721671b..0000000000
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/index.rst
+++ /dev/null
@@ -1,234 +0,0 @@
-.. _pepper_dev_cpp_index:
-
-.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
-
-############################################
-Pepper C++ API Reference (Dev)
-############################################
-
-This page lists the C++ API for Pepper 34. Apps that use this API can
-run in Chrome 34 or higher.
-
-`Classes <inherits.html>`_
-==========================
- * `Audio <classpp_1_1_audio.html>`_
-
- * `AudioConfig <classpp_1_1_audio_config.html>`_
-
- * `AudioFrame <classpp_1_1_audio_frame.html>`_
-
- * `CompletionCallback <classpp_1_1_completion_callback.html>`_
-
- * `CompletionCallbackFactory <classpp_1_1_completion_callback_factory.html>`_
-
- * `CompletionCallbackWithOutput <classpp_1_1_completion_callback_with_output.html>`_
-
- * `Core <classpp_1_1_core.html>`_
-
- * `DirectoryEntry <classpp_1_1_directory_entry.html>`_
-
- * `FileIO <classpp_1_1_file_i_o.html>`_
-
- * `FileRef <classpp_1_1_file_ref.html>`_
-
- * `FileSystem <classpp_1_1_file_system.html>`_
-
- * `FloatPoint <classpp_1_1_float_point.html>`_
-
- * `Fullscreen <classpp_1_1_fullscreen.html>`_
-
- * `Graphics2D <classpp_1_1_graphics2_d.html>`_
-
- * `Graphics3D <classpp_1_1_graphics3_d.html>`_
-
- * `Graphics3DClient <classpp_1_1_graphics3_d_client.html>`_
-
- * `HostResolver <classpp_1_1_host_resolver.html>`_
-
- * `IMEInputEvent <classpp_1_1_i_m_e_input_event.html>`_
-
- * `ImageData <classpp_1_1_image_data.html>`_
-
- * `InputEvent <classpp_1_1_input_event.html>`_
-
- * `Instance <classpp_1_1_instance.html>`_
-
- * `InstanceHandle <classpp_1_1_instance_handle.html>`_
-
- * `KeyboardInputEvent <classpp_1_1_keyboard_input_event.html>`_
-
- * `MediaStreamAudioTrack <classpp_1_1_media_stream_audio_track.html>`_
-
- * `MediaStreamVideoTrack <classpp_1_1_media_stream_video_track.html>`_
-
- * `MessageLoop <classpp_1_1_message_loop.html>`_
-
- * `Module <classpp_1_1_module.html>`_
-
- * `MouseCursor <classpp_1_1_mouse_cursor.html>`_
-
- * `MouseInputEvent <classpp_1_1_mouse_input_event.html>`_
-
- * `MouseLock <classpp_1_1_mouse_lock.html>`_
-
- * `NetAddress <classpp_1_1_net_address.html>`_
-
- * `NetworkList <classpp_1_1_network_list.html>`_
-
- * `NetworkMonitor <classpp_1_1_network_monitor.html>`_
-
- * `NetworkProxy <classpp_1_1_network_proxy.html>`_
-
- * `Point <classpp_1_1_point.html>`_
-
- * `Rect <classpp_1_1_rect.html>`_
-
- * `Resource <classpp_1_1_resource.html>`_
-
- * `Size <classpp_1_1_size.html>`_
-
- * `TCPSocket <classpp_1_1_t_c_p_socket.html>`_
-
- * `TextInputController <classpp_1_1_text_input_controller.html>`_
-
- * `TouchInputEvent <classpp_1_1_touch_input_event.html>`_
-
- * `TouchPoint <classpp_1_1_touch_point.html>`_
-
- * `UDPSocket <classpp_1_1_u_d_p_socket.html>`_
-
- * `URLLoader <classpp_1_1_u_r_l_loader.html>`_
-
- * `URLRequestInfo <classpp_1_1_u_r_l_request_info.html>`_
-
- * `URLResponseInfo <classpp_1_1_u_r_l_response_info.html>`_
-
- * `Var <classpp_1_1_var.html>`_
-
- * `Var11OutException <classpp_1_1_var_1_1_out_exception.html>`_
-
- * `VarArray <classpp_1_1_var_array.html>`_
-
- * `VarArrayBuffer <classpp_1_1_var_array_buffer.html>`_
-
- * `VarDictionary <classpp_1_1_var_dictionary.html>`_
-
- * `VideoFrame <classpp_1_1_video_frame.html>`_
-
- * `View <classpp_1_1_view.html>`_
-
- * `WebSocket <classpp_1_1_web_socket.html>`_
-
- * `WheelInputEvent <classpp_1_1_wheel_input_event.html>`_
-
- * `Ext::ExtCompletionCallbackWithOutput <classpp_1_1ext_1_1_ext_completion_callback_with_output.html>`_
-
- * `Internal::CompletionCallbackWithOutputBase <classpp_1_1internal_1_1_completion_callback_with_output_base.html>`_
-
- * `Internal::DirectoryEntryArrayOutputAdapterWithStorage <classpp_1_1internal_1_1_directory_entry_array_output_adapter_with_storage.html>`_
-
-
-Files
-=====
- * `audio.h <audio_8h.html>`_
-
- * `audio_config.h <audio__config_8h.html>`_
-
- * `audio_frame.h <audio__frame_8h.html>`_
-
- * `completion_callback.h <completion__callback_8h.html>`_
-
- * `completion_callback_factory.h <completion__callback__factory_8h.html>`_
-
- * `core.h <core_8h.html>`_
-
- * `directory_entry.h <directory__entry_8h.html>`_
-
- * `file_io.h <file__io_8h.html>`_
-
- * `file_ref.h <file__ref_8h.html>`_
-
- * `file_system.h <file__system_8h.html>`_
-
- * `fullscreen.h <fullscreen_8h.html>`_
-
- * `graphics_2d.h <graphics__2d_8h.html>`_
-
- * `graphics_3d.h <graphics__3d_8h.html>`_
-
- * `graphics_3d_client.h <graphics__3d__client_8h.html>`_
-
- * `host_resolver.h <host__resolver_8h.html>`_
-
- * `image_data.h <image__data_8h.html>`_
-
- * `input_event.h <input__event_8h.html>`_
-
- * `instance.h <instance_8h.html>`_
-
- * `instance_handle.h <instance__handle_8h.html>`_
-
- * `logging.h <logging_8h.html>`_
-
- * `media_stream_audio_track.h <media__stream__audio__track_8h.html>`_
-
- * `media_stream_video_track.h <media__stream__video__track_8h.html>`_
-
- * `message_loop.h <message__loop_8h.html>`_
-
- * `module.h <module_8h.html>`_
-
- * `module_embedder.h <module__embedder_8h.html>`_
-
- * `module_impl.h <module__impl_8h.html>`_
-
- * `mouse_cursor.h <mouse__cursor_8h.html>`_
-
- * `mouse_lock.h <mouse__lock_8h.html>`_
-
- * `net_address.h <net__address_8h.html>`_
-
- * `network_list.h <network__list_8h.html>`_
-
- * `network_monitor.h <network__monitor_8h.html>`_
-
- * `network_proxy.h <network__proxy_8h.html>`_
-
- * `pass_ref.h <pass__ref_8h.html>`_
-
- * `point.h <point_8h.html>`_
-
- * `rect.h <rect_8h.html>`_
-
- * `resource.h <resource_8h.html>`_
-
- * `size.h <size_8h.html>`_
-
- * `tcp_socket.h <tcp__socket_8h.html>`_
-
- * `text_input_controller.h <text__input__controller_8h.html>`_
-
- * `touch_point.h <touch__point_8h.html>`_
-
- * `udp_socket.h <udp__socket_8h.html>`_
-
- * `url_loader.h <url__loader_8h.html>`_
-
- * `url_request_info.h <url__request__info_8h.html>`_
-
- * `url_response_info.h <url__response__info_8h.html>`_
-
- * `var.h <var_8h.html>`_
-
- * `var_array.h <var__array_8h.html>`_
-
- * `var_array_buffer.h <var__array__buffer_8h.html>`_
-
- * `var_dictionary.h <var__dictionary_8h.html>`_
-
- * `video_frame.h <video__frame_8h.html>`_
-
- * `view.h <view_8h.html>`_
-
- * `websocket.h <websocket_8h.html>`_
-
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_20.png b/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_20.png
index 388904e3cd..9dc1bb2344 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_20.png
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_20.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
index e0a9f56b0a..bf1bc784d1 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
@@ -94,7 +94,7 @@
</td></tr>
<tr><td><img src="inherit_graph_20.png" border="0" alt="" usemap="#pp_1_1_resource" />
<map name="pp_1_1_resource" id="pp_1_1_resource">
-<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,645,109,675"></area><area shape="rect" id="node3" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,35"></area><area shape="rect" id="node5" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,59,319,88"></area><area shape="rect" id="node7" href="classpp_1_1_audio_frame.html" title="pp::AudioFrame" alt="" coords="196,112,319,141"></area><area shape="rect" id="node9" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="219,165,296,195"></area><area shape="rect" id="node11" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,219,300,248"></area><area shape="rect" id="node13" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,272,315,301"></area><area shape="rect" id="node15" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,325,317,355"></area><area shape="rect" id="node17" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,379,317,408"></area><area shape="rect" id="node19" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,432,321,461"></area><area shape="rect" id="node21" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,485,316,515"></area><area shape="rect" id="node23" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,539,315,568"></area><area shape="rect" id="node35" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ..." alt="" coords="157,592,357,621"></area><area shape="rect" id="node37" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,645,357,675"></area><area shape="rect" id="node39" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="191,699,324,728"></area><area shape="rect" id="node41" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,752,317,781"></area><area shape="rect" id="node43" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,805,317,835"></area><area shape="rect" id="node45" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,859,331,888"></area><area shape="rect" id="node47" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,912,313,941"></area><area shape="rect" id="node49" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="199,965,316,995"></area><area shape="rect" id="node51" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1019,315,1048"></area><area shape="rect" id="node53" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1072,329,1101"></area><area shape="rect" id="node55" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1125,335,1155"></area><area shape="rect" id="node57" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1179,319,1208"></area><area shape="rect" id="node59" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1232,295,1261"></area><area shape="rect" id="node61" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="200,1285,315,1315"></area><area shape="rect" id="node25" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,432,560,461"></area><area shape="rect" id="node27" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,485,579,515"></area><area shape="rect" id="node29" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="415,539,569,568"></area><area shape="rect" id="node31" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,592,567,621"></area><area shape="rect" id="node33" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,645,568,675"></area></map>
+<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,645,109,675"></area><area shape="rect" id="node3" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,35"></area><area shape="rect" id="node5" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,59,317,88"></area><area shape="rect" id="node7" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,112,319,141"></area><area shape="rect" id="node9" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="219,165,296,195"></area><area shape="rect" id="node11" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,219,300,248"></area><area shape="rect" id="node13" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,272,315,301"></area><area shape="rect" id="node15" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,325,317,355"></area><area shape="rect" id="node17" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,379,317,408"></area><area shape="rect" id="node19" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,432,321,461"></area><area shape="rect" id="node21" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,485,316,515"></area><area shape="rect" id="node23" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,539,315,568"></area><area shape="rect" id="node35" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,592,357,621"></area><area shape="rect" id="node37" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,645,357,675"></area><area shape="rect" id="node39" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="191,699,324,728"></area><area shape="rect" id="node41" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,752,317,781"></area><area shape="rect" id="node43" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,805,317,835"></area><area shape="rect" id="node45" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,859,331,888"></area><area shape="rect" id="node47" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,912,313,941"></area><area shape="rect" id="node49" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="199,965,316,995"></area><area shape="rect" id="node51" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1019,315,1048"></area><area shape="rect" id="node53" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1072,329,1101"></area><area shape="rect" id="node55" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1125,335,1155"></area><area shape="rect" id="node57" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1179,319,1208"></area><area shape="rect" id="node59" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1232,295,1261"></area><area shape="rect" id="node61" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="200,1285,315,1315"></area><area shape="rect" id="node25" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,432,560,461"></area><area shape="rect" id="node27" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,485,579,515"></area><area shape="rect" id="node29" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="415,539,569,568"></area><area shape="rect" id="node31" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,592,567,621"></area><area shape="rect" id="node33" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,645,568,675"></area></map>
</td></tr>
<tr><td><img src="inherit_graph_21.png" border="0" alt="" usemap="#pp_1_1_size" />
<map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/media__stream__audio__track_8h.html b/native_client_sdk/doc_generated/pepper_dev/cpp/media__stream__audio__track_8h.html
index 75722a06ec..80ddc0f6bf 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/media__stream__audio__track_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/media__stream__audio__track_8h.html
@@ -20,13 +20,13 @@ Include dependency graph for media_stream_audio_track.h:</div>
Classes</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html">pp::MediaStreamAudioTrack</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code> class contains methods for receiving audio frames from a MediaStream audio track in the browser. <a href="classpp_1_1_media_stream_audio_track.html#details">More...</a><br /></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code> class contains methods for receiving audio buffers from a MediaStream audio track in the browser. <a href="classpp_1_1_media_stream_audio_track.html#details">More...</a><br /></td></tr>
</table><h2>
Namespaces</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr>
</table>
<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
-<div class="textblock"><p>This file defines the <code>MediaStreamAudioTrack</code> interface for an audio source resource, which receives audio frames from a MediaStream audio track in the browser. </p>
+<div class="textblock"><p>This file defines the <code>MediaStreamAudioTrack</code> interface for an audio source resource, which receives audio buffers from a MediaStream audio track in the browser. </p>
</div></div><!-- contents -->
</div>
{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
index 47ba6ee9f3..be7a4c75e1 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
@@ -18,9 +18,9 @@ Namespaces</h2><table class="memberdecls">
Classes</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio.html">Audio</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">An audio resource. <a href="classpp_1_1_audio.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_config.html">AudioConfig</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A 16 bit stereo <a class="el" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource.">AudioConfig</a> resource. <a href="classpp_1_1_audio_config.html#details">More...</a><br /></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_frame.html">AudioFrame</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">This API enables you to implement and receive callbacks when Pepper operations complete asynchronously. <a href="classpp_1_1_completion_callback.html#details">More...</a><br /></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></td></tr>
@@ -56,7 +56,7 @@ Classes</h2><table class="memberdecls">
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">An instance handle identifies an instance in a constructor for a resource. <a href="classpp_1_1_instance_handle.html#details">More...</a><br /></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_audio_track.html">MediaStreamAudioTrack</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio frames from a MediaStream audio ...">MediaStreamAudioTrack</a></code> class contains methods for receiving audio frames from a MediaStream audio track in the browser. <a href="classpp_1_1_media_stream_audio_track.html#details">More...</a><br /></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio...">MediaStreamAudioTrack</a></code> class contains methods for receiving audio buffers from a MediaStream audio track in the browser. <a href="classpp_1_1_media_stream_audio_track.html#details">More...</a><br /></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_media_stream_video_track.html">MediaStreamVideoTrack</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ...">MediaStreamVideoTrack</a></code> class contains methods for receiving video frames from a MediaStream video track in the browser. <a href="classpp_1_1_media_stream_video_track.html#details">More...</a><br /></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_message_loop.html">MessageLoop</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/var_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/cpp/var_8h__incl.png
index bdacddbd83..75e736b93e 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/var_8h__incl.png
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/var_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/index.html b/native_client_sdk/doc_generated/pepper_stable/c/index.html
index be78e52421..7e5e48db74 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/index.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/index.html
@@ -2,8 +2,8 @@
<span class="target" id="pepper-stable-c-index"></span><section id="pepper-c-api-reference-stable">
<h1 id="pepper-c-api-reference-stable">Pepper C API Reference (Stable)</h1>
-<p>This page lists the C API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.</p>
+<p>This page lists the C API for Pepper 33. Apps that use this API can
+run in Chrome 33 or higher.</p>
<section id="id1">
<h2 id="id1"><a class="reference external" href="group___interfaces.html">Interfaces</a></h2>
<blockquote>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/index.rst b/native_client_sdk/doc_generated/pepper_stable/c/index.rst
deleted file mode 100644
index fc17998071..0000000000
--- a/native_client_sdk/doc_generated/pepper_stable/c/index.rst
+++ /dev/null
@@ -1,283 +0,0 @@
-.. _pepper_stable_c_index:
-
-.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
-
-##########################################
-Pepper C API Reference (Stable)
-##########################################
-
-This page lists the C API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.
-
-`Interfaces <group___interfaces.html>`_
-=======================================
- * `PPB_Audio <struct_p_p_b___audio__1__1.html>`_
-
- * `PPB_AudioConfig <struct_p_p_b___audio_config__1__1.html>`_
-
- * `PPB_Console <struct_p_p_b___console__1__0.html>`_
-
- * `PPB_Core <struct_p_p_b___core__1__0.html>`_
-
- * `PPB_FileIO <struct_p_p_b___file_i_o__1__1.html>`_
-
- * `PPB_FileRef <struct_p_p_b___file_ref__1__1.html>`_
-
- * `PPB_FileSystem <struct_p_p_b___file_system__1__0.html>`_
-
- * `PPB_Fullscreen <struct_p_p_b___fullscreen__1__0.html>`_
-
- * `PPB_Gamepad <struct_p_p_b___gamepad__1__0.html>`_
-
- * `PPB_Graphics2D <struct_p_p_b___graphics2_d__1__1.html>`_
-
- * `PPB_Graphics3D <struct_p_p_b___graphics3_d__1__0.html>`_
-
- * `PPB_HostResolver <struct_p_p_b___host_resolver__1__0.html>`_
-
- * `PPB_IMEInputEvent <struct_p_p_b___i_m_e_input_event__1__0.html>`_
-
- * `PPB_ImageData <struct_p_p_b___image_data__1__0.html>`_
-
- * `PPB_InputEvent <struct_p_p_b___input_event__1__0.html>`_
-
- * `PPB_Instance <struct_p_p_b___instance__1__0.html>`_
-
- * `PPB_KeyboardInputEvent <struct_p_p_b___keyboard_input_event__1__0.html>`_
-
- * `PPB_MessageLoop <struct_p_p_b___message_loop__1__0.html>`_
-
- * `PPB_Messaging <struct_p_p_b___messaging__1__0.html>`_
-
- * `PPB_MouseCursor <struct_p_p_b___mouse_cursor__1__0.html>`_
-
- * `PPB_MouseInputEvent <struct_p_p_b___mouse_input_event__1__1.html>`_
-
- * `PPB_MouseLock <struct_p_p_b___mouse_lock__1__0.html>`_
-
- * `PPB_NetAddress <struct_p_p_b___net_address__1__0.html>`_
-
- * `PPB_NetworkList <struct_p_p_b___network_list__1__0.html>`_
-
- * `PPB_NetworkMonitor <struct_p_p_b___network_monitor__1__0.html>`_
-
- * `PPB_NetworkProxy <struct_p_p_b___network_proxy__1__0.html>`_
-
- * `PPB_TCPSocket <struct_p_p_b___t_c_p_socket__1__1.html>`_
-
- * `PPB_TextInputController <struct_p_p_b___text_input_controller__1__0.html>`_
-
- * `PPB_TouchInputEvent <struct_p_p_b___touch_input_event__1__0.html>`_
-
- * `PPB_UDPSocket <struct_p_p_b___u_d_p_socket__1__0.html>`_
-
- * `PPB_URLLoader <struct_p_p_b___u_r_l_loader__1__0.html>`_
-
- * `PPB_URLRequestInfo <struct_p_p_b___u_r_l_request_info__1__0.html>`_
-
- * `PPB_URLResponseInfo <struct_p_p_b___u_r_l_response_info__1__0.html>`_
-
- * `PPB_Var <struct_p_p_b___var__1__1.html>`_
-
- * `PPB_VarArray <struct_p_p_b___var_array__1__0.html>`_
-
- * `PPB_VarArrayBuffer <struct_p_p_b___var_array_buffer__1__0.html>`_
-
- * `PPB_VarDictionary <struct_p_p_b___var_dictionary__1__0.html>`_
-
- * `PPB_View <struct_p_p_b___view__1__1.html>`_
-
- * `PPB_WebSocket <struct_p_p_b___web_socket__1__0.html>`_
-
- * `PPB_WheelInputEvent <struct_p_p_b___wheel_input_event__1__0.html>`_
-
- * `PPP_Graphics3D <struct_p_p_p___graphics3_d__1__0.html>`_
-
- * `PPP_InputEvent <struct_p_p_p___input_event__0__1.html>`_
-
- * `PPP_Instance <struct_p_p_p___instance__1__1.html>`_
-
- * `PPP_Messaging <struct_p_p_p___messaging__1__0.html>`_
-
- * `PPP_MouseLock <struct_p_p_p___mouse_lock__1__0.html>`_
-
-
-`Structures <group___structs.html>`_
-====================================
- * `PP_ArrayOutput <struct_p_p___array_output.html>`_
-
- * `PP_CompletionCallback <struct_p_p___completion_callback.html>`_
-
- * `PP_DirectoryEntry <struct_p_p___directory_entry.html>`_
-
- * `PP_FileInfo <struct_p_p___file_info.html>`_
-
- * `PP_FloatPoint <struct_p_p___float_point.html>`_
-
- * `PP_GamepadSampleData <struct_p_p___gamepad_sample_data.html>`_
-
- * `PP_GamepadsSampleData <struct_p_p___gamepads_sample_data.html>`_
-
- * `PP_HostResolver_Hint <struct_p_p___host_resolver___hint.html>`_
-
- * `PP_ImageDataDesc <struct_p_p___image_data_desc.html>`_
-
- * `PP_InputEvent_Character <struct_p_p___input_event___character.html>`_
-
- * `PP_InputEvent_Key <struct_p_p___input_event___key.html>`_
-
- * `PP_InputEvent_Mouse <struct_p_p___input_event___mouse.html>`_
-
- * `PP_InputEvent_Wheel <struct_p_p___input_event___wheel.html>`_
-
- * `PP_NetAddress_IPv4 <struct_p_p___net_address___i_pv4.html>`_
-
- * `PP_NetAddress_IPv6 <struct_p_p___net_address___i_pv6.html>`_
-
- * `PP_Point <struct_p_p___point.html>`_
-
- * `PP_Rect <struct_p_p___rect.html>`_
-
- * `PP_Size <struct_p_p___size.html>`_
-
- * `PP_TouchPoint <struct_p_p___touch_point.html>`_
-
- * `PP_Var <struct_p_p___var.html>`_
-
- * `PP_VarValue <union_p_p___var_value.html>`_
-
-
-`Functions <group___functions.html>`_
-=====================================
-
-`Enums <group___enums.html>`_
-=============================
-
-`Typedefs <group___typedefs.html>`_
-===================================
-
-`Macros <globals_defs.html>`_
-=============================
-
-Files
-=====
- * `pp_array_output.h <pp__array__output_8h.html>`_
-
- * `pp_bool.h <pp__bool_8h.html>`_
-
- * `pp_completion_callback.h <pp__completion__callback_8h.html>`_
-
- * `pp_directory_entry.h <pp__directory__entry_8h.html>`_
-
- * `pp_errors.h <pp__errors_8h.html>`_
-
- * `pp_file_info.h <pp__file__info_8h.html>`_
-
- * `pp_graphics_3d.h <pp__graphics__3d_8h.html>`_
-
- * `pp_input_event.h <pp__input__event_8h.html>`_
-
- * `pp_instance.h <pp__instance_8h.html>`_
-
- * `pp_module.h <pp__module_8h.html>`_
-
- * `pp_point.h <pp__point_8h.html>`_
-
- * `pp_rect.h <pp__rect_8h.html>`_
-
- * `pp_resource.h <pp__resource_8h.html>`_
-
- * `pp_size.h <pp__size_8h.html>`_
-
- * `pp_stdint.h <pp__stdint_8h.html>`_
-
- * `pp_time.h <pp__time_8h.html>`_
-
- * `pp_touch_point.h <pp__touch__point_8h.html>`_
-
- * `pp_var.h <pp__var_8h.html>`_
-
- * `ppb.h <ppb_8h.html>`_
-
- * `ppb_audio.h <ppb__audio_8h.html>`_
-
- * `ppb_audio_config.h <ppb__audio__config_8h.html>`_
-
- * `ppb_console.h <ppb__console_8h.html>`_
-
- * `ppb_core.h <ppb__core_8h.html>`_
-
- * `ppb_file_io.h <ppb__file__io_8h.html>`_
-
- * `ppb_file_ref.h <ppb__file__ref_8h.html>`_
-
- * `ppb_file_system.h <ppb__file__system_8h.html>`_
-
- * `ppb_fullscreen.h <ppb__fullscreen_8h.html>`_
-
- * `ppb_gamepad.h <ppb__gamepad_8h.html>`_
-
- * `ppb_graphics_2d.h <ppb__graphics__2d_8h.html>`_
-
- * `ppb_graphics_3d.h <ppb__graphics__3d_8h.html>`_
-
- * `ppb_host_resolver.h <ppb__host__resolver_8h.html>`_
-
- * `ppb_image_data.h <ppb__image__data_8h.html>`_
-
- * `ppb_input_event.h <ppb__input__event_8h.html>`_
-
- * `ppb_instance.h <ppb__instance_8h.html>`_
-
- * `ppb_message_loop.h <ppb__message__loop_8h.html>`_
-
- * `ppb_messaging.h <ppb__messaging_8h.html>`_
-
- * `ppb_mouse_cursor.h <ppb__mouse__cursor_8h.html>`_
-
- * `ppb_mouse_lock.h <ppb__mouse__lock_8h.html>`_
-
- * `ppb_net_address.h <ppb__net__address_8h.html>`_
-
- * `ppb_network_list.h <ppb__network__list_8h.html>`_
-
- * `ppb_network_monitor.h <ppb__network__monitor_8h.html>`_
-
- * `ppb_network_proxy.h <ppb__network__proxy_8h.html>`_
-
- * `ppb_tcp_socket.h <ppb__tcp__socket_8h.html>`_
-
- * `ppb_text_input_controller.h <ppb__text__input__controller_8h.html>`_
-
- * `ppb_udp_socket.h <ppb__udp__socket_8h.html>`_
-
- * `ppb_url_loader.h <ppb__url__loader_8h.html>`_
-
- * `ppb_url_request_info.h <ppb__url__request__info_8h.html>`_
-
- * `ppb_url_response_info.h <ppb__url__response__info_8h.html>`_
-
- * `ppb_var.h <ppb__var_8h.html>`_
-
- * `ppb_var_array.h <ppb__var__array_8h.html>`_
-
- * `ppb_var_array_buffer.h <ppb__var__array__buffer_8h.html>`_
-
- * `ppb_var_dictionary.h <ppb__var__dictionary_8h.html>`_
-
- * `ppb_view.h <ppb__view_8h.html>`_
-
- * `ppb_websocket.h <ppb__websocket_8h.html>`_
-
- * `ppp.h <ppp_8h.html>`_
-
- * `ppp_graphics_3d.h <ppp__graphics__3d_8h.html>`_
-
- * `ppp_input_event.h <ppp__input__event_8h.html>`_
-
- * `ppp_instance.h <ppp__instance_8h.html>`_
-
- * `ppp_messaging.h <ppp__messaging_8h.html>`_
-
- * `ppp_mouse_lock.h <ppp__mouse__lock_8h.html>`_
-
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/index.html b/native_client_sdk/doc_generated/pepper_stable/cpp/index.html
index 47c496c8b2..32ab5d07f7 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/index.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/index.html
@@ -2,8 +2,8 @@
<span class="target" id="pepper-stable-cpp-index"></span><section id="pepper-c-api-reference-stable">
<h1 id="pepper-c-api-reference-stable">Pepper C++ API Reference (Stable)</h1>
-<p>This page lists the C++ API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.</p>
+<p>This page lists the C++ API for Pepper 33. Apps that use this API can
+run in Chrome 33 or higher.</p>
<section id="id1">
<h2 id="id1"><a class="reference external" href="inherits.html">Classes</a></h2>
<blockquote>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/index.rst b/native_client_sdk/doc_generated/pepper_stable/cpp/index.rst
deleted file mode 100644
index dec5b620ab..0000000000
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/index.rst
+++ /dev/null
@@ -1,218 +0,0 @@
-.. _pepper_stable_cpp_index:
-
-.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
-
-############################################
-Pepper C++ API Reference (Stable)
-############################################
-
-This page lists the C++ API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.
-
-`Classes <inherits.html>`_
-==========================
- * `Audio <classpp_1_1_audio.html>`_
-
- * `AudioConfig <classpp_1_1_audio_config.html>`_
-
- * `CompletionCallback <classpp_1_1_completion_callback.html>`_
-
- * `CompletionCallbackFactory <classpp_1_1_completion_callback_factory.html>`_
-
- * `CompletionCallbackWithOutput <classpp_1_1_completion_callback_with_output.html>`_
-
- * `Core <classpp_1_1_core.html>`_
-
- * `DirectoryEntry <classpp_1_1_directory_entry.html>`_
-
- * `FileIO <classpp_1_1_file_i_o.html>`_
-
- * `FileRef <classpp_1_1_file_ref.html>`_
-
- * `FileSystem <classpp_1_1_file_system.html>`_
-
- * `FloatPoint <classpp_1_1_float_point.html>`_
-
- * `Fullscreen <classpp_1_1_fullscreen.html>`_
-
- * `Graphics2D <classpp_1_1_graphics2_d.html>`_
-
- * `Graphics3D <classpp_1_1_graphics3_d.html>`_
-
- * `Graphics3DClient <classpp_1_1_graphics3_d_client.html>`_
-
- * `HostResolver <classpp_1_1_host_resolver.html>`_
-
- * `IMEInputEvent <classpp_1_1_i_m_e_input_event.html>`_
-
- * `ImageData <classpp_1_1_image_data.html>`_
-
- * `InputEvent <classpp_1_1_input_event.html>`_
-
- * `Instance <classpp_1_1_instance.html>`_
-
- * `InstanceHandle <classpp_1_1_instance_handle.html>`_
-
- * `KeyboardInputEvent <classpp_1_1_keyboard_input_event.html>`_
-
- * `MessageLoop <classpp_1_1_message_loop.html>`_
-
- * `Module <classpp_1_1_module.html>`_
-
- * `MouseCursor <classpp_1_1_mouse_cursor.html>`_
-
- * `MouseInputEvent <classpp_1_1_mouse_input_event.html>`_
-
- * `MouseLock <classpp_1_1_mouse_lock.html>`_
-
- * `NetAddress <classpp_1_1_net_address.html>`_
-
- * `NetworkList <classpp_1_1_network_list.html>`_
-
- * `NetworkMonitor <classpp_1_1_network_monitor.html>`_
-
- * `NetworkProxy <classpp_1_1_network_proxy.html>`_
-
- * `Point <classpp_1_1_point.html>`_
-
- * `Rect <classpp_1_1_rect.html>`_
-
- * `Resource <classpp_1_1_resource.html>`_
-
- * `Size <classpp_1_1_size.html>`_
-
- * `TCPSocket <classpp_1_1_t_c_p_socket.html>`_
-
- * `TextInputController <classpp_1_1_text_input_controller.html>`_
-
- * `TouchInputEvent <classpp_1_1_touch_input_event.html>`_
-
- * `TouchPoint <classpp_1_1_touch_point.html>`_
-
- * `UDPSocket <classpp_1_1_u_d_p_socket.html>`_
-
- * `URLLoader <classpp_1_1_u_r_l_loader.html>`_
-
- * `URLRequestInfo <classpp_1_1_u_r_l_request_info.html>`_
-
- * `URLResponseInfo <classpp_1_1_u_r_l_response_info.html>`_
-
- * `Var <classpp_1_1_var.html>`_
-
- * `Var11OutException <classpp_1_1_var_1_1_out_exception.html>`_
-
- * `VarArray <classpp_1_1_var_array.html>`_
-
- * `VarArrayBuffer <classpp_1_1_var_array_buffer.html>`_
-
- * `VarDictionary <classpp_1_1_var_dictionary.html>`_
-
- * `View <classpp_1_1_view.html>`_
-
- * `WebSocket <classpp_1_1_web_socket.html>`_
-
- * `WheelInputEvent <classpp_1_1_wheel_input_event.html>`_
-
- * `Ext::ExtCompletionCallbackWithOutput <classpp_1_1ext_1_1_ext_completion_callback_with_output.html>`_
-
- * `Internal::CompletionCallbackWithOutputBase <classpp_1_1internal_1_1_completion_callback_with_output_base.html>`_
-
- * `Internal::DirectoryEntryArrayOutputAdapterWithStorage <classpp_1_1internal_1_1_directory_entry_array_output_adapter_with_storage.html>`_
-
-
-Files
-=====
- * `audio.h <audio_8h.html>`_
-
- * `audio_config.h <audio__config_8h.html>`_
-
- * `completion_callback.h <completion__callback_8h.html>`_
-
- * `completion_callback_factory.h <completion__callback__factory_8h.html>`_
-
- * `core.h <core_8h.html>`_
-
- * `directory_entry.h <directory__entry_8h.html>`_
-
- * `file_io.h <file__io_8h.html>`_
-
- * `file_ref.h <file__ref_8h.html>`_
-
- * `file_system.h <file__system_8h.html>`_
-
- * `fullscreen.h <fullscreen_8h.html>`_
-
- * `graphics_2d.h <graphics__2d_8h.html>`_
-
- * `graphics_3d.h <graphics__3d_8h.html>`_
-
- * `graphics_3d_client.h <graphics__3d__client_8h.html>`_
-
- * `host_resolver.h <host__resolver_8h.html>`_
-
- * `image_data.h <image__data_8h.html>`_
-
- * `input_event.h <input__event_8h.html>`_
-
- * `instance.h <instance_8h.html>`_
-
- * `instance_handle.h <instance__handle_8h.html>`_
-
- * `logging.h <logging_8h.html>`_
-
- * `message_loop.h <message__loop_8h.html>`_
-
- * `module.h <module_8h.html>`_
-
- * `module_embedder.h <module__embedder_8h.html>`_
-
- * `module_impl.h <module__impl_8h.html>`_
-
- * `mouse_cursor.h <mouse__cursor_8h.html>`_
-
- * `mouse_lock.h <mouse__lock_8h.html>`_
-
- * `net_address.h <net__address_8h.html>`_
-
- * `network_list.h <network__list_8h.html>`_
-
- * `network_monitor.h <network__monitor_8h.html>`_
-
- * `network_proxy.h <network__proxy_8h.html>`_
-
- * `pass_ref.h <pass__ref_8h.html>`_
-
- * `point.h <point_8h.html>`_
-
- * `rect.h <rect_8h.html>`_
-
- * `resource.h <resource_8h.html>`_
-
- * `size.h <size_8h.html>`_
-
- * `tcp_socket.h <tcp__socket_8h.html>`_
-
- * `text_input_controller.h <text__input__controller_8h.html>`_
-
- * `touch_point.h <touch__point_8h.html>`_
-
- * `udp_socket.h <udp__socket_8h.html>`_
-
- * `url_loader.h <url__loader_8h.html>`_
-
- * `url_request_info.h <url__request__info_8h.html>`_
-
- * `url_response_info.h <url__response__info_8h.html>`_
-
- * `var.h <var_8h.html>`_
-
- * `var_array.h <var__array_8h.html>`_
-
- * `var_array_buffer.h <var__array__buffer_8h.html>`_
-
- * `var_dictionary.h <var__dictionary_8h.html>`_
-
- * `view.h <view_8h.html>`_
-
- * `websocket.h <websocket_8h.html>`_
-
diff --git a/native_client_sdk/doc_generated/pepper_stable/index.html b/native_client_sdk/doc_generated/pepper_stable/index.html
index 2dd3b0d088..537ae26a37 100644
--- a/native_client_sdk/doc_generated/pepper_stable/index.html
+++ b/native_client_sdk/doc_generated/pepper_stable/index.html
@@ -2,8 +2,8 @@
<section id="pepper-api-reference-stable">
<h1 id="pepper-api-reference-stable">Pepper API Reference (Stable)</h1>
-<p>This page lists the API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.</p>
+<p>This page lists the API for Pepper 33. Apps that use this API can
+run in Chrome 33 or higher.</p>
<section id="pepper-c-api-reference">
<h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/pepper_stable/c/index.html#pepper-stable-c-index"><em>Pepper C API Reference</em></a></h2>
</section><section id="id1">
diff --git a/native_client_sdk/doc_generated/redirects.json b/native_client_sdk/doc_generated/redirects.json
new file mode 100644
index 0000000000..2f16825253
--- /dev/null
+++ b/native_client_sdk/doc_generated/redirects.json
@@ -0,0 +1,3 @@
+{
+ "": "index"
+}
diff --git a/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html b/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html
index bdc0be98b1..8daa0a6dc4 100644
--- a/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html
+++ b/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html
@@ -36,18 +36,19 @@
</ul>
</li>
<li><a class="reference internal" href="#intrinsic-global-variables" id="id23">Intrinsic Global Variables</a></li>
-<li><p class="first"><a class="reference internal" href="#instruction-reference" id="id24">Instruction Reference</a></p>
+<li><a class="reference internal" href="#errno-and-errors-in-arithmetic-instructions" id="id24">Errno and errors in arithmetic instructions</a></li>
+<li><p class="first"><a class="reference internal" href="#instruction-reference" id="id25">Instruction Reference</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#list-of-allowed-instructions" id="id25">List of allowed instructions</a></li>
-<li><a class="reference internal" href="#alloca" id="id26"><code>alloca</code></a></li>
+<li><a class="reference internal" href="#list-of-allowed-instructions" id="id26">List of allowed instructions</a></li>
+<li><a class="reference internal" href="#alloca" id="id27"><code>alloca</code></a></li>
</ul>
</li>
-<li><p class="first"><a class="reference internal" href="#intrinsic-functions" id="id27">Intrinsic Functions</a></p>
+<li><p class="first"><a class="reference internal" href="#intrinsic-functions" id="id28">Intrinsic Functions</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#list-of-allowed-intrinsics" id="id28">List of allowed intrinsics</a></li>
-<li><a class="reference internal" href="#thread-pointer-related-intrinsics" id="id29">Thread pointer related intrinsics</a></li>
-<li><a class="reference internal" href="#setjmp-and-longjmp" id="id30">Setjmp and Longjmp</a></li>
-<li><a class="reference internal" href="#atomic-intrinsics" id="id31">Atomic intrinsics</a></li>
+<li><a class="reference internal" href="#list-of-allowed-intrinsics" id="id29">List of allowed intrinsics</a></li>
+<li><a class="reference internal" href="#thread-pointer-related-intrinsics" id="id30">Thread pointer related intrinsics</a></li>
+<li><a class="reference internal" href="#setjmp-and-longjmp" id="id31">Setjmp and Longjmp</a></li>
+<li><a class="reference internal" href="#atomic-intrinsics" id="id32">Atomic intrinsics</a></li>
</ul>
</li>
</ul>
@@ -58,11 +59,11 @@
the bitcode on a <em>semantic</em> level; the physical encoding level will be described
elsewhere. For the purpose of this document, the textual form of LLVM IR is
used to describe instructions and other bitcode constructs.</p>
-<p>Since the PNaCl bitcode is based to a large extent on LLVM IR, many sections
-in this document point to a relevant section of the LLVM language reference
-manual. Only the changes, restrictions and variations specific to PNaCl are
-described&#8212;full semantic descriptions are not duplicated from the LLVM
-reference manual.</p>
+<p>Since the PNaCl bitcode is based to a large extent on LLVM IR as of
+version 3.3, many sections in this document point to a relevant section
+of the LLVM language reference manual. Only the changes, restrictions
+and variations specific to PNaCl are described&#8212;full semantic
+descriptions are not duplicated from the LLVM reference manual.</p>
</section><section id="high-level-structure">
<h2 id="high-level-structure">High Level Structure</h2>
<p>A PNaCl portable executable (<strong>pexe</strong> in short) is a single LLVM IR module.</p>
@@ -223,6 +224,13 @@ distributed pexes.</p>
<h2 id="intrinsic-global-variables">Intrinsic Global Variables</h2>
<p><a class="reference external" href="http://llvm.org/releases/3.3/docs/LangRef.html#intrinsic-global-variables">LLVM LangRef: Intrinsic Global Variables</a></p>
<p>PNaCl bitcode does not support intrinsic global variables.</p>
+</section><section id="errno-and-errors-in-arithmetic-instructions">
+<span id="ir-and-errno"></span><h2 id="errno-and-errors-in-arithmetic-instructions"><span id="ir-and-errno"></span>Errno and errors in arithmetic instructions</h2>
+<p>Some arithmetic instructions and intrinsics have the similar semantics to
+libc math functions, but differ in the treatment of <code>errno</code>. While the
+libc functions may set <code>errno</code> for domain errors, the instructions and
+intrinsics do not. This is because the variable <code>errno</code> is not special
+and is not required to be part of the program.</p>
</section><section id="instruction-reference">
<h2 id="instruction-reference">Instruction Reference</h2>
<section id="list-of-allowed-instructions">
@@ -254,7 +262,14 @@ guaranteed to trap in PNaCl bitcode.</p>
<li><code>fsub</code></li>
<li><code>fmul</code></li>
<li><code>fdiv</code></li>
-<li><code>frem</code></li>
+<li><p class="first"><code>frem</code></p>
+<p>The frem instruction has the semantics of the libc fmod function for
+computing the floating point remainder. If the numerator is infinity, or
+denominator is zero, or either are NaN, then the result is NaN.
+Unlike the libc fmod function, this does not set <code>errno</code> when the
+result is NaN (see the <a class="reference internal" href="#ir-and-errno"><em>instructions and errno</em></a>
+section).</p>
+</li>
<li><p class="first"><code>alloca</code></p>
<p>See <a class="reference internal" href="#bitcode-allocainst"><em>alloca instructions</em></a>.</p>
</li>
@@ -325,8 +340,10 @@ C-style GCC builtins).</p>
</li>
<li><p class="first"><code>llvm.sqrt</code></p>
<p>The overloaded <code>llvm.sqrt</code> intrinsic is only supported for float
-and double arguments types. Unlike the standard LLVM intrinsic,
-PNaCl guarantees that llvm.sqrt returns a QNaN for values less than -0.0.</p>
+and double arguments types. This has the same semantics as the libc
+sqrt function, returning NaN for values less than -0.0. However, this
+does not set <code>errno</code> when the result is NaN (see the
+<a class="reference internal" href="#ir-and-errno"><em>instructions and errno</em></a> section).</p>
</li>
<li><code>llvm.stacksave</code></li>
<li><p class="first"><code>llvm.stackrestore</code></p>
diff --git a/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html b/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html
index 1ec228a6d8..78ad20b9fe 100644
--- a/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html
+++ b/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html
@@ -6,26 +6,29 @@
<ul class="small-gap">
<li><p class="first"><a class="reference internal" href="#source-language-support" id="id2">Source language support</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#preprocessor-definitions" id="id3">Preprocessor definitions</a></li>
+<li><a class="reference internal" href="#versions" id="id3">Versions</a></li>
+<li><a class="reference internal" href="#preprocessor-definitions" id="id4">Preprocessor definitions</a></li>
</ul>
</li>
-<li><p class="first"><a class="reference internal" href="#memory-model-and-atomics" id="id4">Memory Model and Atomics</a></p>
+<li><p class="first"><a class="reference internal" href="#memory-model-and-atomics" id="id5">Memory Model and Atomics</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#memory-model-for-concurrent-operations" id="id5">Memory Model for Concurrent Operations</a></li>
-<li><a class="reference internal" href="#atomic-memory-ordering-constraints" id="id6">Atomic Memory Ordering Constraints</a></li>
-<li><a class="reference internal" href="#volatile-memory-accesses" id="id7">Volatile Memory Accesses</a></li>
+<li><a class="reference internal" href="#memory-model-for-concurrent-operations" id="id6">Memory Model for Concurrent Operations</a></li>
+<li><a class="reference internal" href="#atomic-memory-ordering-constraints" id="id7">Atomic Memory Ordering Constraints</a></li>
+<li><a class="reference internal" href="#volatile-memory-accesses" id="id8">Volatile Memory Accesses</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#threading" id="id8">Threading</a></li>
-<li><a class="reference internal" href="#setjmp-and-longjmp" id="id9"><code>setjmp</code> and <code>longjmp</code></a></li>
-<li><a class="reference internal" href="#c-exception-handling" id="id10">C++ Exception Handling</a></li>
-<li><a class="reference internal" href="#inline-assembly" id="id11">Inline Assembly</a></li>
-<li><p class="first"><a class="reference internal" href="#future-directions" id="id12">Future Directions</a></p>
+<li><a class="reference internal" href="#threading" id="id9">Threading</a></li>
+<li><a class="reference internal" href="#setjmp-and-longjmp" id="id10"><code>setjmp</code> and <code>longjmp</code></a></li>
+<li><a class="reference internal" href="#c-exception-handling" id="id11">C++ Exception Handling</a></li>
+<li><a class="reference internal" href="#inline-assembly" id="id12">Inline Assembly</a></li>
+<li><a class="reference internal" href="#undefined-behavior" id="id13">Undefined Behavior</a></li>
+<li><a class="reference internal" href="#floating-point" id="id14">Floating-Point</a></li>
+<li><a class="reference internal" href="#computed-goto" id="id15">Computed <code>goto</code></a></li>
+<li><p class="first"><a class="reference internal" href="#future-directions" id="id16">Future Directions</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#simd" id="id13">SIMD</a></li>
-<li><a class="reference internal" href="#inter-process-communication" id="id14">Inter-Process Communication</a></li>
-<li><a class="reference internal" href="#posix-style-signal-handling" id="id15">POSIX-style Signal Handling</a></li>
-<li><a class="reference internal" href="#computed-goto" id="id16">Computed <code>goto</code></a></li>
+<li><a class="reference internal" href="#simd" id="id17">SIMD</a></li>
+<li><a class="reference internal" href="#inter-process-communication" id="id18">Inter-Process Communication</a></li>
+<li><a class="reference internal" href="#posix-style-signal-handling" id="id19">POSIX-style Signal Handling</a></li>
</ul>
</li>
</ul>
@@ -33,16 +36,24 @@
</div><section id="source-language-support">
<h2 id="source-language-support">Source language support</h2>
<p>The currently supported languages are C and C++. The PNaCl toolchain is
-based on Clang 3.3, which fully supports C++11 and most of C11. A
+based on recent Clang, which fully supports C++11 and most of C11. A
detailed status of the language support is available <a class="reference external" href="http://clang.llvm.org/cxx_status.html">here</a>.</p>
<p>For information on using languages other than C/C++, see the <a class="reference internal" href="/native-client/faq.html#other-languages"><em>FAQ
section on other languages</em></a>.</p>
<p>As for the standard libraries, the PNaCl toolchain is currently based on
-<code>libc++</code>, and the <code>newlib</code> standard C library (version is available
-through the macro <code>NEWLIB_VERSION</code>). <code>libstdc++</code> is also supported
-but its use is discouraged; see <a class="reference internal" href="/native-client/devguide/devcycle/building.html#building-cpp-libraries"><em>C++ standard libraries</em></a> for more
-details.</p>
-<section id="preprocessor-definitions">
+<code>libc++</code>, and the <code>newlib</code> standard C library. <code>libstdc++</code> is also
+supported but its use is discouraged; see <a class="reference internal" href="/native-client/devguide/devcycle/building.html#building-cpp-libraries"><em>C++ standard libraries</em></a>
+for more details.</p>
+<section id="versions">
+<h3 id="versions">Versions</h3>
+<p>Version information can be obtained:</p>
+<ul class="small-gap">
+<li>Clang/LLVM: run <code>pnacl-clang -v</code>.</li>
+<li><code>newlib</code>: use the <code>_NEWLIB_VERSION</code> macro.</li>
+<li><code>libc++</code>: use the <code>_LIBCPP_VERSION</code> macro.</li>
+<li><code>libstdc++</code>: use the <code>_GLIBCXX_VERSION</code> macro.</li>
+</ul>
+</section><section id="preprocessor-definitions">
<h3 id="preprocessor-definitions">Preprocessor definitions</h3>
<p>When compiling C/C++ code, the PNaCl toolchain defines the <code>__pnacl__</code>
macro. In addition, <code>__native_client__</code> is defined for compatibility
@@ -59,7 +70,8 @@ stores is provided on a happens-before basis that relates memory
locations to each other as the C11/C++11 standards do.</p>
<p>Non-atomic memory accesses may be reordered, separated, elided or fused
according to C and C++&#8217;s memory model before the pexe is created as well
-as after its creation.</p>
+as after its creation. Accessing atomic memory location through
+non-atomic primitives is <cite>Undefined Behavior &lt;undefined_behavior&gt;</cite>.</p>
<p>As in C11/C++11 some atomic accesses may be implemented with locks on
certain platforms. The <code>ATOMIC_*_LOCK_FREE</code> macros will always be
<code>1</code>, signifying that all types are sometimes lock-free. The
@@ -168,6 +180,50 @@ prevent reordering of memory accesses to objects which may escape.</p>
<p>NaCl supports a fairly wide subset of inline assembly through GCC&#8217;s
inline assembly syntax, with the restriction that the sandboxing model
for the target architecture has to be respected.</p>
+</section><section id="undefined-behavior">
+<h2 id="undefined-behavior">Undefined Behavior</h2>
+<p>The C and C++ languages expose some undefined behavior which is
+discussed in <cite>PNaCl Undefined Behavior &lt;undefined_behavior&gt;</cite>.</p>
+</section><section id="floating-point">
+<h2 id="floating-point">Floating-Point</h2>
+<p>PNaCl exposes 32-bit and 64-bit floating point operations which are
+mostly IEEE-754 compliant. There are a few caveats:</p>
+<ul class="small-gap">
+<li>Some <a class="reference internal" href="/native-client/reference/pnacl-undefined-behavior.html#undefined-behavior-fp"><em>floating-point behavior is currently left as undefined</em></a>.</li>
+<li>The default rounding mode is round-to-nearest and other rounding modes
+are currently not usable, which isn&#8217;t IEEE-754 compliant. PNaCl could
+support switching modes (the 4 modes exposed by C99 <code>FLT_ROUNDS</code>
+macros).</li>
+<li>Signaling <code>NaN</code> never fault.</li>
+<li><p class="first">Fast-math optimizations are currently supported before <em>pexe</em> creation
+time. A <em>pexe</em> loses all fast-math information when it is
+created. Fast-math translation could be enabled at a later date,
+potentially at a perf-function granularity. This wouldn&#8217;t affect
+already-existing <em>pexe</em>; it would be an opt-in feature.</p>
+<ul class="small-gap">
+<li>Fused-multiply-add have higher precision and often execute faster;
+PNaCl currently disallows them in the <em>pexe</em> because they aren&#8217;t
+supported on all platforms and can&#8217;t realistically be
+emulated. PNaCl could (but currently doesn&#8217;t) only generate them in
+the backend if fast-math were specified and the hardware supports
+the operation.</li>
+<li>Transcendentals aren&#8217;t exposed by PNaCl&#8217;s ABI; they are part of the
+math library that is included in the <em>pexe</em>. PNaCl could, but
+currently doesn&#8217;t, use hardware support if fast-math were provided
+in the <em>pexe</em>.</li>
+</ul>
+</li>
+</ul>
+</section><section id="computed-goto">
+<h2 id="computed-goto">Computed <code>goto</code></h2>
+<p>PNaCl supports computed <code>goto</code>, a non-standard GCC extension to C used
+by some interpreters, by lowering them to <code>switch</code> statements. The
+resulting use of <code>switch</code> might not be as fast as the original
+indirect branches. If you are compiling a program that has a
+compile-time option for using computed <code>goto</code>, it&#8217;s possible that the
+program will run faster with the option turned off (e.g., if the program
+does extra work to take advantage of computed <code>goto</code>).</p>
+<p>NaCl supports computed <code>goto</code> without any transformation.</p>
</section><section id="future-directions">
<h2 id="future-directions">Future Directions</h2>
<section id="simd">
@@ -206,11 +262,6 @@ or suspension of threads.</p>
<p>If PNaCl were to support either of these, the interaction of
<code>volatile</code> and atomics with same-thread signal handling would need
to be carefully detailed.</p>
-</section><section id="computed-goto">
-<h3 id="computed-goto">Computed <code>goto</code></h3>
-<p>PNaCl currently doesn&#8217;t support computed <code>goto</code>, a non-standard
-extension to C used by some interpreters.</p>
-<p>NaCl supports computed <code>goto</code>.</p>
</section></section></section>
{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html b/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html
new file mode 100644
index 0000000000..e10c67bb03
--- /dev/null
+++ b/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html
@@ -0,0 +1,225 @@
+{{+bindTo:partials.standard_nacl_article}}
+
+<section id="pnacl-undefined-behavior">
+<h1 id="pnacl-undefined-behavior">PNaCl Undefined Behavior</h1>
+<div class="contents local" id="contents" style="display: none">
+<ul class="small-gap">
+<li><a class="reference internal" href="#overview" id="id2">Overview</a></li>
+<li><a class="reference internal" href="#specification" id="id3">Specification</a></li>
+<li><p class="first"><a class="reference internal" href="#behavior-in-pnacl-bitcode" id="id4">Behavior in PNaCl Bitcode</a></p>
+<ul class="small-gap">
+<li><a class="reference internal" href="#well-defined" id="id5">Well-Defined</a></li>
+<li><p class="first"><a class="reference internal" href="#not-well-defined" id="id6">Not Well-Defined</a></p>
+<ul class="small-gap">
+<li><a class="reference internal" href="#potentially-fixable" id="id7">Potentially Fixable</a></li>
+<li><a class="reference internal" href="#floating-point" id="id8">Floating-Point</a></li>
+<li><a class="reference internal" href="#hard-to-fix" id="id9">Hard to Fix</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+</div><section id="overview">
+<span id="undefined-behavior"></span><h2 id="overview"><span id="undefined-behavior"></span>Overview</h2>
+<p>C and C++ undefined behavior allows efficient mapping of the source
+language onto hardware, but leads to different behavior on different
+platforms.</p>
+<p>PNaCl exposes undefined behavior in the following ways:</p>
+<ul class="small-gap">
+<li><p class="first">The Clang frontend and optimizations that occur on the developer&#8217;s
+machine determine what behavior will occur, and it will be specified
+deterministically in the <em>pexe</em>. All targets will observe the same
+behavior. In some cases, recompiling with a newer PNaCl SDK version
+will either:</p>
+<ul class="small-gap">
+<li>Reliably emit the same behavior in the resulting <em>pexe</em>.</li>
+<li>Change the behavior that gets specified in the <em>pexe</em>.</li>
+</ul>
+</li>
+<li><p class="first">The behavior specified in the <em>pexe</em> relies on PNaCl&#8217;s bitcode,
+runtime or CPU architecture vagaries.</p>
+<ul class="small-gap">
+<li>In some cases, the behavior using the same PNaCl translator version
+on different architectures will produce different behavior.</li>
+<li>Sometimes runtime parameters determine the behavior, e.g. memory
+allocation determines which out-of-bounds accesses crash versus
+returning garbage.</li>
+<li>In some cases, different versions of the PNaCl translator
+(i.e. after a Chrome update) will compile the code differently and
+cause different behavior.</li>
+<li>In some cases, the same versions of the PNaCl translator, on the
+same architecture, will generate a different <em>nexe</em> for
+defense-in-depth purposes, but may cause code that reads invalid
+stack values or code sections on the heap to observe these
+randomizations.</li>
+</ul>
+</li>
+</ul>
+</section><section id="specification">
+<h2 id="specification">Specification</h2>
+<p>PNaCl&#8217;s goal is that a single <em>pexe</em> should work reliably in the same
+manner on all architectures, irrespective of runtime parameters and
+through Chrome updates. This goal is unfortunately not attainable; PNaCl
+therefore specifies as much as it can and outlines areas for
+improvement.</p>
+<p>One interesting solution is to offer good support for LLVM&#8217;s sanitizer
+tools (including <a class="reference external" href="http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation">UBSan</a>)
+at development time, so that developers can test their code against
+undefined behavior. Shipping code would then still get good performance,
+and diverging behavior would be rare.</p>
+<p>Note that none of these issues are vulnerabilities in PNaCl and Chrome:
+the NaCl sandboxing still constrains the code through Software Fault
+Isolation.</p>
+</section><section id="behavior-in-pnacl-bitcode">
+<h2 id="behavior-in-pnacl-bitcode">Behavior in PNaCl Bitcode</h2>
+<section id="well-defined">
+<h3 id="well-defined">Well-Defined</h3>
+<p>The following are traditionally undefined behavior in C/C++ but are well
+defined at the <em>pexe</em> level:</p>
+<ul class="small-gap">
+<li>Dynamic initialization order dependencies: the order is deterministic
+in the <em>pexe</em>.</li>
+<li>Bool which isn&#8217;t <code>0</code>/<code>1</code>: the bitcode instruction sequence is
+deterministic in the <em>pexe</em>.</li>
+<li>Out-of-range <code>enum</code> value: the backing integer type and bitcode
+instruction sequence is deterministic in the <em>pexe</em>.</li>
+<li>Aggressive optimizations based on type-based alias analysis: TBAA
+optimizations are done before stable bitcode is generated and their
+metadata is stripped from the <em>pexe</em>; behavior is therefore
+deterministic in the <em>pexe</em>.</li>
+<li>Operator and subexpression evaluation order in the same expression
+(e.g. function parameter passing, or pre-increment): the order is
+defined in the <em>pexe</em>.</li>
+<li>Signed integer overflow: two&#8217;s complement integer arithmetic is
+assumed.</li>
+<li>Atomic access to a non-atomic memory location (not declared as
+<code>std::atomic</code>): atomics and <code>volatile</code> variables all lower to the
+same compatible intrinsics or external functions; the behavior is
+therefore deterministic in the <em>pexe</em> (see <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#memory-model-and-atomics"><em>Memory Model and
+Atomics</em></a>).</li>
+<li>Integer divide by zero: always raises a fault (through hardware on
+x86, and through integer divide emulation routine or explicit checks
+on ARM).</li>
+</ul>
+</section><section id="not-well-defined">
+<h3 id="not-well-defined">Not Well-Defined</h3>
+<p>The following are traditionally undefined behavior in C/C++ which also
+exhibit undefined behavior at the <em>pexe</em> level. Some are easier to fix
+than others.</p>
+<section id="potentially-fixable">
+<h4 id="potentially-fixable">Potentially Fixable</h4>
+<ul class="small-gap">
+<li><p class="first">Shift by greater-than-or-equal to left-hand-side&#8217;s bit-width or
+negative (see <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=3604">bug 3604</a>).</p>
+<ul class="small-gap">
+<li>Some of the behavior will be specified in the <em>pexe</em> depending on
+constant propagation and integer type of variables.</li>
+<li>There is still some architecture-specific behavior.</li>
+<li>PNaCl could force-mask the right-hand-side to <cite>bitwidth-1</cite>, which
+could become a no-op on some architectures while ensuring all
+architectures behave similarly. Regular optimizations could also be
+applied, removing redundant masks.</li>
+</ul>
+</li>
+<li><p class="first">Using a virtual pointer of the wrong type, or of an unallocated
+object.</p>
+<ul class="small-gap">
+<li>Will produce wrong results which will depend on what data is treated
+as a <cite>vftable</cite>.</li>
+<li>PNaCl could add runtime checks for this, and elide them when types
+are provably correct (see this CFI <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=3786">bug 3786</a>).</li>
+</ul>
+</li>
+<li><p class="first">Some unaligned load/store (see <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=3445">bug 3445</a>).</p>
+<ul class="small-gap">
+<li>Could force everything to <cite>align 1</cite>; performance cost should be
+measured.</li>
+<li>The frontend could also be more pessimistic when it sees dubious
+casts.</li>
+</ul>
+</li>
+<li>Some values can be marked as <code>undef</code> (see <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=3796">bug 3796</a>).</li>
+<li>Reaching end-of-value-returning-function without returning a value:
+reduces to <code>ret i32 undef</code> in bitcode. This is mostly-defined, but
+could be improved (see <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=3796">bug 3796</a>).</li>
+<li><p class="first">Reaching “unreachable” code.</p>
+<ul class="small-gap">
+<li>LLVM provides an IR instruction called “unreachable” whose effect
+will be undefined. PNaCl could change this to always trap, as the
+<code>llvm.trap</code> intrinsic does.</li>
+</ul>
+</li>
+<li>Zero or negative-sized variable-length array (and <code>alloca</code>) aren&#8217;t
+defined behavior. PNaCl&#8217;s frontend or the translator could insert
+checks with <code>-fsanitize=vla-bound</code>.</li>
+</ul>
+</section><section id="floating-point">
+<span id="undefined-behavior-fp"></span><h4 id="floating-point"><span id="undefined-behavior-fp"></span>Floating-Point</h4>
+<p>PNaCl offers a IEEE-754 implementation which is as correct as the
+underlying hardware allows, with a few limitations. These are a few
+sources of undefined behavior which are believed to be fixable:</p>
+<ul class="small-gap">
+<li>Float cast overflow is currently undefined.</li>
+<li>Float divide by zero is currently undefined.</li>
+<li>The default denormal behavior is currently unspecified, which isn&#8217;t
+IEEE-754 compliant (denormals must be supported in IEEE-754). PNaCl
+could mandate flush-to-zero, and may give an API to enable denormals
+in a future release. The latter is problematic for SIMD and
+vectorization support, where some platforms do not support denormal
+SIMD operations.</li>
+<li><code>NaN</code> values are currently not guaranteed to be canonical; see <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=3536">bug
+3536</a>.</li>
+<li>Passing <code>NaN</code> to STL functions (the math is defined, but the
+function implementation isn&#8217;t, e.g. <code>std::min</code> and <code>std::max</code>), is
+well-defined in the <em>pexe</em>.</li>
+</ul>
+</section><section id="hard-to-fix">
+<h4 id="hard-to-fix">Hard to Fix</h4>
+<ul class="small-gap">
+<li><p class="first">Null pointer/reference has behavior determined by the NaCl sandbox:</p>
+<ul class="small-gap">
+<li>Raises a segmentation fault in the bottom <code>64KiB</code> bytes on all
+platforms, and on some sandboxes there are further non-writable
+pages after the initial <code>64KiB</code>.</li>
+<li>Negative offsets aren&#8217;t handled consistently on all platforms:
+x86-64 and ARM will wrap around to the stack (because they mask the
+address), whereas x86-32 will fault (because of segmentation).</li>
+</ul>
+</li>
+<li><p class="first">Accessing uninitialized/free&#8217;d memory (including out-of-bounds array
+access):</p>
+<ul class="small-gap">
+<li>Might cause a segmentation fault or not, depending on where memory
+is allocated and how it gets reclaimed.</li>
+<li>Added complexity because of the NaCl sandboxing: some of the
+load/stores might be forced back into sandbox range, or eliminated
+entirely if they fall out of the sandbox.</li>
+</ul>
+</li>
+<li><p class="first">Executing non-program data (jumping to an address obtained from a
+non-function pointer is undefined, can only do <code>void(*)()</code> to
+<code>intptr_t</code> to <code>void(*)()</code>).</p>
+<ul class="small-gap">
+<li>Just-In-Time code generation is supported by NaCl, but is not
+currently supported by PNaCl. It is currently not possible to mark
+code as executable.</li>
+<li>Offering full JIT capabilities would reduce PNaCl&#8217;s ability to
+change the sandboxing model. It would also require a &#8220;jump to JIT
+code&#8221; syscall (to guarantee a calling convention), and means that
+JITs aren&#8217;t portable.</li>
+<li>PNaCl could offer &#8220;portable&#8221; JIT capabilities where the code hands
+PNaCl some form of LLVM IR, which PNaCl then JIT-compiles.</li>
+</ul>
+</li>
+<li>Out-of-scope variable usage: will produce unknown data, mostly
+dependent on stack and memory allocation.</li>
+<li>Data races: any two operations that conflict (target overlapping
+memory), at least one of which is a store or atomic read-modify-write,
+and at least one of which is not atomic: this will be very dependent
+on processor and execution sequence, see <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#memory-model-and-atomics"><em>Memory Model and
+Atomics</em></a>.</li>
+</ul>
+</section></section></section></section>
+
+{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html b/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html
index 1ae4041914..32f8a84300 100644
--- a/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html
+++ b/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html
@@ -1,7 +1,7 @@
{{+bindTo:partials.standard_nacl_article}}
<section id="arm-32-bit-sandbox">
-<h1 id="arm-32-bit-sandbox">ARM 32-bit Sandbox</h1>
+<span id="id1"></span><h1 id="arm-32-bit-sandbox"><span id="id1"></span>ARM 32-bit Sandbox</h1>
<p>Native Client for ARM is a sandboxing technology for running
programs&#8212;even malicious ones&#8212;safely, on computers that use 32-bit
ARM processors. The ARM sandbox is an extension of earlier work on
@@ -23,33 +23,33 @@ or any other architecture, but we do assume some familiarity with
assembly languages in general.</p>
<div class="contents local" id="contents" style="display: none">
<ul class="small-gap">
-<li><p class="first"><a class="reference internal" href="#an-introduction-to-the-arm-architecture" id="id2">An Introduction to the ARM Architecture</a></p>
+<li><p class="first"><a class="reference internal" href="#an-introduction-to-the-arm-architecture" id="id3">An Introduction to the ARM Architecture</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#about-arm-and-armv7-a" id="id3">About ARM and ARMv7-A</a></li>
-<li><a class="reference internal" href="#arm-programmer-s-model" id="id4">ARM Programmer&#8217;s Model</a></li>
+<li><a class="reference internal" href="#about-arm-and-armv7-a" id="id4">About ARM and ARMv7-A</a></li>
+<li><a class="reference internal" href="#arm-programmer-s-model" id="id5">ARM Programmer&#8217;s Model</a></li>
</ul>
</li>
-<li><p class="first"><a class="reference internal" href="#the-native-client-approach" id="id5">The Native Client Approach</a></p>
+<li><p class="first"><a class="reference internal" href="#the-native-client-approach" id="id6">The Native Client Approach</a></p>
<ul class="small-gap">
-<li><p class="first"><a class="reference internal" href="#nacl-arm-pure-software-fault-isolation" id="id6">NaCl/ARM: Pure Software Fault Isolation</a></p>
+<li><p class="first"><a class="reference internal" href="#nacl-arm-pure-software-fault-isolation" id="id7">NaCl/ARM: Pure Software Fault Isolation</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#load-and-store" id="id7"><em>Load</em> and <em>Store</em></a></li>
-<li><a class="reference internal" href="#the-stack-pointer-thread-pointer-and-program-counter" id="id8">The Stack Pointer, Thread Pointer, and Program Counter</a></li>
-<li><a class="reference internal" href="#indirect-branch" id="id9"><em>Indirect Branch</em></a></li>
-<li><a class="reference internal" href="#literal-pools-and-data-bundles" id="id10">Literal Pools and Data Bundles</a></li>
+<li><a class="reference internal" href="#load-and-store" id="id8"><em>Load</em> and <em>Store</em></a></li>
+<li><a class="reference internal" href="#the-stack-pointer-thread-pointer-and-program-counter" id="id9">The Stack Pointer, Thread Pointer, and Program Counter</a></li>
+<li><a class="reference internal" href="#indirect-branch" id="id10"><em>Indirect Branch</em></a></li>
+<li><a class="reference internal" href="#literal-pools-and-data-bundles" id="id11">Literal Pools and Data Bundles</a></li>
</ul>
</li>
-<li><p class="first"><a class="reference internal" href="#trampolines-and-memory-layout" id="id11">Trampolines and Memory Layout</a></p>
+<li><p class="first"><a class="reference internal" href="#trampolines-and-memory-layout" id="id12">Trampolines and Memory Layout</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#memory-map" id="id12">Memory Map</a></li>
-<li><a class="reference internal" href="#inside-a-trampoline" id="id13">Inside a Trampoline</a></li>
+<li><a class="reference internal" href="#memory-map" id="id13">Memory Map</a></li>
+<li><a class="reference internal" href="#inside-a-trampoline" id="id14">Inside a Trampoline</a></li>
</ul>
</li>
-<li><p class="first"><a class="reference internal" href="#loose-ends" id="id14">Loose Ends</a></p>
+<li><p class="first"><a class="reference internal" href="#loose-ends" id="id15">Loose Ends</a></p>
<ul class="small-gap">
-<li><a class="reference internal" href="#forbidden-instructions" id="id15">Forbidden Instructions</a></li>
-<li><a class="reference internal" href="#coprocessors" id="id16">Coprocessors</a></li>
-<li><a class="reference internal" href="#validator-code" id="id17">Validator Code</a></li>
+<li><a class="reference internal" href="#forbidden-instructions" id="id16">Forbidden Instructions</a></li>
+<li><a class="reference internal" href="#coprocessors" id="id17">Coprocessors</a></li>
+<li><a class="reference internal" href="#validator-code" id="id18">Validator Code</a></li>
</ul>
</li>
</ul>
@@ -411,9 +411,9 @@ the possible places that any <em>indirect branch</em> can land. On Native
Client for ARM, <em>indirect branch</em> can target any address that has its
bottom four bits clear&#8212;any address that&#8217;s <code>0 mod 16</code>. We call these
16-byte chunks of code &#8220;bundles&#8221;. The validator makes sure that no
-pseudo-instruction straddles a bundle boundary. Compilers must pad with`
-<cite>nop`</cite>s to ensure that every pseudo-instruction fits entirely inside
-one bundle.</p>
+pseudo-instruction straddles a bundle boundary. Compilers must pad with
+<code>nop</code> to ensure that every pseudo-instruction fits entirely inside one
+bundle.</p>
<p>Here is the <em>indirect branch</em> pseudo-instruction. As you can see, it
clears the top two and bottom four bits of the address:</p>
<pre>
@@ -580,6 +580,7 @@ way, if an <em>indirect branch</em> tries to enter the data bundle, the process
will take a fault and the trusted runtime will intervene (by terminating
the program). For example:</p>
<pre>
+.p2align 4
bkpt #0x5BE0 ; Must be aligned 0 mod 16!
.word 0xDEADBEEF ; Arbitrary constants are A-OK.
svc #30 ; Trying to make a syscall? OK!
diff --git a/native_client_sdk/doc_generated/reference/sandbox_internals/index.html b/native_client_sdk/doc_generated/reference/sandbox_internals/index.html
index efaac94f70..053f79f2f9 100644
--- a/native_client_sdk/doc_generated/reference/sandbox_internals/index.html
+++ b/native_client_sdk/doc_generated/reference/sandbox_internals/index.html
@@ -7,6 +7,26 @@ Native Client sandboxing, which is also used by Portable Native
Client. These details can be useful to reimplement a sandbox, or to
write assembly code that follows sandboxing rules for Native Client
(Portable Native Client does not allow platform-specific assembly code).</p>
+<p>As an implementation detail, the Native Client sandboxes described here
+are currently used by Portable Native Client to execute code on the
+corresponding machines in a safe manner. The portable bitcode contained
+in a <strong>pexe</strong> is translated to a machine-specific <strong>nexe</strong> before
+execution. This may change at a point in time: Portable Native Client
+doesn&#8217;t necessarily need these sandboxes to execute code on these
+machines. Note that the Portable Native Client compiler itself is also
+untrusted: it too runs in a Native Client sandbox described below.</p>
+<p>Native Client has sandboxes for:</p>
+<ul class="small-gap">
+<li><a class="reference internal" href="/native-client/reference/sandbox_internals/arm-32-bit-sandbox.html#arm-32-bit-sandbox"><em>ARM 32-bit</em></a>.</li>
+<li>x86-32: the original design is described in <a class="reference external" href="http://research.google.com/pubs/archive/34913.pdf">Native Client: A Sandbox
+for Portable, Untrusted x86 Native Code</a>, the current
+design has changed slightly since then.</li>
+<li>x86-64: the original design is described in <a class="reference external" href="http://research.google.com/pubs/archive/35649.pdf">Adapting Software Fault
+Isolation to Contemporary CPU Architectures</a>, the current
+design has changed slightly since then.</li>
+<li>MIPS32, described in the <a class="reference external" href="https://code.google.com/p/nativeclient/issues/attachmentText?id=2275&amp;aid=22750018000&amp;name=native-client-mips-0.4.txt">overview of Native Client for MIPS</a>,
+and <a class="reference external" href="https://code.google.com/p/nativeclient/issues/detail?id=2275">bug 2275</a>.</li>
+</ul>
</section>
{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/rest-devsite-examples.html b/native_client_sdk/doc_generated/rest-devsite-examples.html
index 636105d1dc..9f912685c3 100644
--- a/native_client_sdk/doc_generated/rest-devsite-examples.html
+++ b/native_client_sdk/doc_generated/rest-devsite-examples.html
@@ -1,50 +1,12 @@
{{+bindTo:partials.standard_nacl_article}}
-<section id="examples-of-rest-markup-for-devsite-document-title">
-<h1 id="examples-of-rest-markup-for-devsite-document-title">Examples of ReST markup for devsite (Document title)</h1>
-<p>This is an auto-generated table of contents for this document. <code>:local:</code> and
-<code>:backlinks: none</code> are required to make the devsite look consistent;
-<code>:depth:</code> level can be controlled.</p>
-<div class="contents local" id="contents" style="display: none">
-<ul class="small-gap">
-<li><a class="reference internal" href="#document-structure" id="id1">Document structure</a></li>
-<li><p class="first"><a class="reference internal" href="#basic-markup" id="id2">Basic markup</a></p>
-<ul class="small-gap">
-<li><a class="reference internal" href="#unicode-samples" id="id3">Unicode samples</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#images" id="id4">Images</a></li>
-<li><p class="first"><a class="reference internal" href="#links" id="id5">Links</a></p>
-<ul class="small-gap">
-<li><a class="reference internal" href="#to-other-documents-within-the-tree" id="id6">To other documents within the tree</a></li>
-<li><a class="reference internal" href="#to-sections-inside-documents" id="id7">To sections inside documents</a></li>
-<li><a class="reference internal" href="#to-external-locations" id="id8">To external locations</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#definition-lists" id="id9">Definition lists</a></li>
-<li><a class="reference internal" href="#notes-and-admonitions" id="id10">Notes and Admonitions</a></li>
-<li><a class="reference internal" href="#source-code" id="id11">Source code</a></li>
-<li><p class="first"><a class="reference internal" href="#section-heading" id="id12">Section heading</a></p>
-<ul class="small-gap">
-<li><a class="reference internal" href="#subsection-heading" id="id13">Subsection heading</a></li>
-</ul>
-</li>
-<li><p class="first"><a class="reference internal" href="#expandable-sections" id="id14">Expandable sections</a></p>
-<ul class="small-gap">
-<li><a class="reference internal" href="#expandable-section" id="id15">Expandable Section</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#lists" id="id16">Lists</a></li>
-<li><a class="reference internal" href="#tables" id="id17">Tables</a></li>
-</ul>
-
-</div><section id="document-structure">
+<section id="examples-of-rest-markup-for-chromesite-document-title">
+<h1 id="examples-of-rest-markup-for-chromesite-document-title">Examples of ReST markup for chromesite (Document title)</h1>
+<section id="document-structure">
<h2 id="document-structure">Document structure</h2>
<p>A document starts with a Sphinx target which serves as the document name
throughout the tree. It can serve as a link target in other documents that want
to link to this one (see the Links section below).</p>
-<p>It follows with the document title (which doesn&#8217;t get generated to the HTML body
-in production mode, but is picked up by the devsite from <code>&lt;head&gt;&lt;title&gt;</code>.</p>
</section><section id="basic-markup">
<h2 id="basic-markup">Basic markup</h2>
<p>In general, follow the rules from <a class="reference external" href="http://sphinx-doc.org/rest.html">http://sphinx-doc.org/rest.html</a></p>
@@ -70,8 +32,8 @@ get adulation by the public, but because it is fun to program.
<section id="to-other-documents-within-the-tree">
<h3 id="to-other-documents-within-the-tree">To other documents within the tree</h3>
<p>Internal links to other documents are created <a class="reference internal" href="/native-client/overview.html"><em>like this</em></a>. The
-document name within the angle brackets is relative to the root dir of the
-devsite doc tree and does not have an extension.</p>
+document name within the angle brackets is relative to the root dir of the doc
+tree and does not have an extension.</p>
<p>Here&#8217;s a link to a document in a subdirectory: <a class="reference internal" href="/native-client/devguide/tutorial/tutorial-part1.html"><em>the tutorial</em></a>. And a link to a subdirectory index page
<a class="reference internal" href="/native-client/devguide/index.html"><em>devguide index</em></a>.</p>
</section><section id="to-sections-inside-documents">
@@ -89,7 +51,7 @@ Section Heading</em></a>.</p>
<h2 id="definition-lists">Definition lists</h2>
<p>Can be used to define a group of related terms. Internal formatting is supported
within the definition. No special formatting needs to be done for the definition
-name/title - it&#8217;s handled by the devsite.</p>
+name/title - it&#8217;s handled by the chromesite documentation server.</p>
<dl class="docutils">
<dt>Apple</dt>
<dd>The apple is the pomaceous fruit of the apple tree, species Malus domestica in
@@ -104,9 +66,9 @@ family Rosaceae.</dd>
</dl>
</section><section id="notes-and-admonitions">
<h2 id="notes-and-admonitions">Notes and Admonitions</h2>
-<p>The devsite supports special &#8220;notes&#8221; that are indented and have a background
-color. We&#8217;ll generate them with the <code>Note</code> directive, providing the class
-explicitly. The class is one of <code>note</code>, <code>caution</code>, <code>warning</code>,
+<p>The documentation server supports special &#8220;notes&#8221; that are indented and have a
+background color. We&#8217;ll generate them with the <code>Note</code> directive, providing
+the class explicitly. The class is one of <code>note</code>, <code>caution</code>, <code>warning</code>,
<code>special</code>.</p>
<aside class="note">
<p>This is a note.</p>
@@ -119,9 +81,8 @@ Caution &#8211; you have been warned.
</aside>
</section><section id="source-code">
<h2 id="source-code">Source code</h2>
-<p>Here&#8217;s source code that will be pretty-printed on the devsite. Outside
-production mode, it&#8217;s just a plain <code>&lt;pre&gt;</code> that presents pre-formatted code
-without coloring:</p>
+<p>Here&#8217;s source code that will be pretty-printed. It&#8217;s just a plain <code>&lt;pre&gt;</code>
+that presents pre-formatted code with coloring:</p>
<pre class="prettyprint">
#include &lt;iostream&gt;
@@ -153,15 +114,7 @@ signes (<code>#</code>) from above and below.</p>
<section id="sub-sub-subsection-heading">
<h5 id="sub-sub-subsection-heading">Sub-sub-subsection heading</h5>
<p>It&#8217;s probably not the best idea to go this far (renders to <code>&lt;h5&gt;</code>).</p>
-</section></section></section></section><section id="expandable-sections">
-<h2 id="expandable-sections">Expandable sections</h2>
-<p>The devsite can render expandable sections when a special <code>class</code> is applied.
-This can be achieved by specifying the <code>rst-class</code> immediately before a
-section (or any other element), as follows:</p>
-<section class="expandable" id="expandable-section">
-<h3 id="expandable-section">Expandable Section</h3>
-<p>Look, ma! I&#8217;m expandable!</p>
-</section></section><section id="lists">
+</section></section></section></section><section id="lists">
<h2 id="lists">Lists</h2>
<p>Auto-numbered ordered lists:</p>
<ol class="arabic simple">
diff --git a/native_client_sdk/doc_generated/sitemap.html b/native_client_sdk/doc_generated/sitemap.html
index d8ac09296a..8295f4b991 100644
--- a/native_client_sdk/doc_generated/sitemap.html
+++ b/native_client_sdk/doc_generated/sitemap.html
@@ -326,6 +326,7 @@
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html#type-system">Type System</a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html#other-values">Other Values</a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html#intrinsic-global-variables">Intrinsic Global Variables</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html#errno-and-errors-in-arithmetic-instructions">Errno and errors in arithmetic instructions</a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html#instruction-reference">Instruction Reference</a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html#intrinsic-functions">Intrinsic Functions</a></li>
</ul>
@@ -337,9 +338,18 @@
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#setjmp-and-longjmp"><code>setjmp</code> and <code>longjmp</code></a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#c-exception-handling">C++ Exception Handling</a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#inline-assembly">Inline Assembly</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#undefined-behavior">Undefined Behavior</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#floating-point">Floating-Point</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#computed-goto">Computed <code>goto</code></a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#future-directions">Future Directions</a></li>
</ul>
</li>
+<li class="toctree-l1"><a class="reference internal" href="/native-client/reference/pnacl-undefined-behavior.html">PNaCl Undefined Behavior</a><ul class="small-gap">
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-undefined-behavior.html#overview">Overview</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-undefined-behavior.html#specification">Specification</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/pnacl-undefined-behavior.html#behavior-in-pnacl-bitcode">Behavior in PNaCl Bitcode</a></li>
+</ul>
+</li>
<li class="toctree-l1"><a class="reference internal" href="/native-client/reference/nacl-manifest-format.html">Native Client Manifest (nmf) Format</a><ul class="small-gap">
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/nacl-manifest-format.html#overview">Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="/native-client/reference/nacl-manifest-format.html#field-summary">Field summary</a></li>
diff --git a/native_client_sdk/src/build_tools/build_projects.py b/native_client_sdk/src/build_tools/build_projects.py
index 3ca794199f..11cc455ebf 100755
--- a/native_client_sdk/src/build_tools/build_projects.py
+++ b/native_client_sdk/src/build_tools/build_projects.py
@@ -6,21 +6,21 @@
import multiprocessing
import optparse
import os
+import posixpath
import sys
+import urllib2
import buildbot_common
import build_version
import generate_make
import parse_dsc
-from build_paths import NACL_DIR, SDK_SRC_DIR, OUT_DIR, SDK_RESOURCE_DIR
+from build_paths import SDK_SRC_DIR, OUT_DIR, SDK_RESOURCE_DIR
from build_paths import GSTORE
from generate_index import LandingPage
sys.path.append(os.path.join(SDK_SRC_DIR, 'tools'))
-sys.path.append(os.path.join(NACL_DIR, 'build'))
import getos
-import http_download
MAKE = 'nacl_sdk/make_3.99.90-26-gf80222c/make.exe'
@@ -73,11 +73,19 @@ def UpdateHelpers(pepperdir, clobber=False):
buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.mk'),
tools_dir)
+ # Copy tools/lib scripts
+ tools_lib_dir = os.path.join(pepperdir, 'tools', 'lib')
+ buildbot_common.MakeDir(tools_lib_dir)
+ buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', 'lib', '*.py'),
+ tools_lib_dir)
+
# On Windows add a prebuilt make
if getos.GetPlatform() == 'win':
buildbot_common.BuildStep('Add MAKE')
- http_download.HttpDownload(GSTORE + MAKE,
- os.path.join(tools_dir, 'make.exe'))
+ make_url = posixpath.join(GSTORE, MAKE)
+ make_exe = os.path.join(tools_dir, 'make.exe')
+ with open(make_exe, 'wb') as f:
+ f.write(urllib2.urlopen(make_url).read())
def ValidateToolchains(toolchains):
diff --git a/native_client_sdk/src/build_tools/build_sdk.py b/native_client_sdk/src/build_tools/build_sdk.py
index 53c0f90579..c4d03fa2fb 100755
--- a/native_client_sdk/src/build_tools/build_sdk.py
+++ b/native_client_sdk/src/build_tools/build_sdk.py
@@ -53,7 +53,7 @@ import oshelpers
CYGTAR = os.path.join(NACL_DIR, 'build', 'cygtar.py')
NACLPORTS_URL = 'https://naclports.googlecode.com/svn/trunk/src'
-NACLPORTS_REV = 954
+NACLPORTS_REV = 1152
GYPBUILD_DIR = 'gypbuild'
@@ -197,18 +197,6 @@ def BuildStepCopyTextFiles(pepperdir, pepper_ver, chrome_revision,
open(os.path.join(pepperdir, 'README'), 'w').write(readme_text)
-def PrunePNaClToolchain(root):
- dirs_to_prune = [
- 'lib-bc-x86-64',
- 'usr-bc-x86-64'
- # TODO(sbc): remove this once its really not needed.
- # Currently we seem to rely on it at least for <bits/stat.h>
- #'sysroot',
- ]
- for dirname in dirs_to_prune:
- buildbot_common.RemoveDir(os.path.join(root, dirname))
-
-
def BuildStepUntarToolchains(pepperdir, toolchains):
buildbot_common.BuildStep('Untar Toolchains')
platform = getos.GetPlatform()
@@ -271,7 +259,6 @@ def BuildStepUntarToolchains(pepperdir, toolchains):
# Then rename/move it to the pepper toolchain directory
pnacldir = os.path.join(pepperdir, 'toolchain', tcname)
buildbot_common.Move(tmpdir, pnacldir)
- PrunePNaClToolchain(pnacldir)
buildbot_common.RemoveDir(tmpdir)
@@ -540,7 +527,7 @@ def GypNinjaBuild_Pnacl(rel_out_dir, target_arch):
out_dir = MakeNinjaRelPath(rel_out_dir)
gyp_file = os.path.join(SRC_DIR, 'ppapi', 'native_client', 'src',
'untrusted', 'pnacl_irt_shim', 'pnacl_irt_shim.gyp')
- targets = ['pnacl_irt_shim']
+ targets = ['pnacl_irt_shim_aot']
GypNinjaBuild(target_arch, gyp_py, gyp_file, targets, out_dir, False)
@@ -555,15 +542,12 @@ def GypNinjaBuild(arch, gyp_py_script, gyp_file, targets,
gyp_defines.append('target_arch=%s' % arch)
if arch == 'arm':
if getos.GetPlatform() == 'linux':
- if os.path.exists("/usr/bin/arm-linux-gnueabihf-gcc"):
- # TODO(sbc): make this conditional once all our linux
- # have the ARM cross compiler installed.
- gyp_env['CC'] = 'arm-linux-gnueabihf-gcc'
- gyp_env['CXX'] = 'arm-linux-gnueabihf-g++'
- gyp_env['AR'] = 'arm-linux-gnueabihf-ar'
- gyp_env['AS'] = 'arm-linux-gnueabihf-as'
- gyp_env['CC_host'] = 'cc'
- gyp_env['CXX_host'] = 'c++'
+ gyp_env['CC'] = 'arm-linux-gnueabihf-gcc'
+ gyp_env['CXX'] = 'arm-linux-gnueabihf-g++'
+ gyp_env['AR'] = 'arm-linux-gnueabihf-ar'
+ gyp_env['AS'] = 'arm-linux-gnueabihf-as'
+ gyp_env['CC_host'] = 'cc'
+ gyp_env['CXX_host'] = 'c++'
gyp_defines += ['armv7=1', 'arm_thumb=0', 'arm_neon=1',
'arm_float_abi=hard']
if force_arm_gcc:
@@ -858,13 +842,17 @@ def BuildStepBuildNaClPorts(pepper_ver, pepperdir):
env['NACLPORTS_NO_ANNOTATE'] = "1"
env['NACLPORTS_NO_UPLOAD'] = "1"
- build_script = 'build_tools/bots/linux/naclports-linux-sdk-bundle.sh'
+ build_script = 'build_tools/naclports-linux-sdk-bundle.sh'
buildbot_common.BuildStep('Build naclports')
- buildbot_common.Run([build_script], env=env, cwd=NACLPORTS_DIR)
bundle_dir = os.path.join(NACLPORTS_DIR, 'out', 'sdk_bundle')
out_dir = os.path.join(bundle_dir, 'pepper_%s' % pepper_ver)
+ # Remove the sdk_bundle directory to remove stale files from previous builds.
+ buildbot_common.RemoveDir(bundle_dir)
+
+ buildbot_common.Run([build_script], env=env, cwd=NACLPORTS_DIR)
+
# Some naclports do not include a standalone LICENSE/COPYING file
# so we explicitly list those here for inclusion.
extra_licenses = ('tinyxml/readme.txt',
@@ -979,8 +967,7 @@ def main(args):
BuildStepMakePepperDirs(pepperdir, ['include', 'toolchain', 'tools'])
BuildStepDownloadToolchains(toolchains)
BuildStepUntarToolchains(pepperdir, toolchains)
-
- BuildStepBuildToolchains(pepperdir, toolchains)
+ BuildStepBuildToolchains(pepperdir, toolchains)
BuildStepUpdateHelpers(pepperdir, True)
BuildStepUpdateUserProjects(pepperdir, toolchains,
diff --git a/native_client_sdk/src/build_tools/json/naclsdk_manifest2.json b/native_client_sdk/src/build_tools/json/naclsdk_manifest2.json
index 401e6a583e..68b6bf5f75 100644
--- a/native_client_sdk/src/build_tools/json/naclsdk_manifest2.json
+++ b/native_client_sdk/src/build_tools/json/naclsdk_manifest2.json
@@ -206,12 +206,45 @@
"version": 30
},
{
- "archives": [],
- "description": "Chrome 31 bundle, revision xxxxx",
+ "archives": [
+ {
+ "checksum": {
+ "sha1": "c669f3d3a31bcb389d36889151a3af6354b5343f"
+ },
+ "host_os": "all",
+ "size": 76764755,
+ "url": "https://commondatastorage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/31.0.1650.57/naclports.tar.bz2"
+ },
+ {
+ "checksum": {
+ "sha1": "bbd7fad94968b7658b7ad9d1c01f831bc61441d0"
+ },
+ "host_os": "linux",
+ "size": 281391254,
+ "url": "https://commondatastorage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/31.0.1650.57/naclsdk_linux.tar.bz2"
+ },
+ {
+ "checksum": {
+ "sha1": "a0b53095e6a6218ad86dc6b85e76850bb7e51c34"
+ },
+ "host_os": "mac",
+ "size": 248249368,
+ "url": "https://commondatastorage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/31.0.1650.57/naclsdk_mac.tar.bz2"
+ },
+ {
+ "checksum": {
+ "sha1": "6c2032210ff8ddef5db31308216f3e81a3532a5c"
+ },
+ "host_os": "win",
+ "size": 267524603,
+ "url": "https://commondatastorage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/31.0.1650.57/naclsdk_win.tar.bz2"
+ }
+ ],
+ "description": "Chrome 31 bundle. Chrome revision: 235101. NaCl revision: 12181",
"name": "pepper_31",
"recommended": "no",
"repath": "pepper_31",
- "revision": 0,
+ "revision": 235101,
"stability": "post_stable",
"version": 31
},
@@ -237,6 +270,16 @@
},
{
"archives": [],
+ "description": "Chrome 34 bundle, revision xxxxx",
+ "name": "pepper_34",
+ "recommended": "no",
+ "repath": "pepper_34",
+ "revision": 0,
+ "stability": "post_stable",
+ "version": 34
+ },
+ {
+ "archives": [],
"description": "Chrome Canary",
"name": "pepper_canary",
"recommended": "no",
diff --git a/native_client_sdk/src/build_tools/sdk_files.list b/native_client_sdk/src/build_tools/sdk_files.list
index cdadcf3dd0..00ac19ed2c 100644
--- a/native_client_sdk/src/build_tools/sdk_files.list
+++ b/native_client_sdk/src/build_tools/sdk_files.list
@@ -421,6 +421,9 @@ tools/host_vc.mk
tools/httpd.py
tools/irt_core_x86_32.nexe
tools/irt_core_x86_64.nexe
+tools/lib/elf.py
+tools/lib/get_shared_deps.py
+tools/lib/quote.py
[win]tools/make.exe
[linux,mac]tools/minidump_dump
[linux,mac]tools/minidump_stackwalk
@@ -432,7 +435,6 @@ tools/nacl_llvm.mk
tools/ncval${EXE_EXT}
tools/ncval.py
tools/oshelpers.py
-tools/quote.py
tools/run.py
tools/sel_ldr.py
tools/sel_ldr_x86_32${EXE_EXT}
diff --git a/native_client_sdk/src/doc/Makefile b/native_client_sdk/src/doc/Makefile
index 0c81812bc2..1b9f28b0c8 100644
--- a/native_client_sdk/src/doc/Makefile
+++ b/native_client_sdk/src/doc/Makefile
@@ -4,7 +4,6 @@
# You can set these variables from the command line.
SPHINXOPTS = -W
SPHINXBUILD = sphinx-build
-PAPER =
BUILDDIR = _build
CHROMESITE_BUILDDIR = $(realpath ../../doc_generated)
@@ -14,156 +13,24 @@ $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx in
endif
# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(SPHINXOPTS) .
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext all
+.PHONY: all help clean linkcheck doctest chromesite chromesite_rst serve
all: chromesite
help:
@echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " xml to make Docutils-native XML files"
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
- @echo " devsite build locally viewable version of docs for developers.google.com"
- @echo " devsite-prod build production docs for developers.google.com"
- @echo " serve start python web server on port server 8009"
- @echo " chromesite build docs for developer.chrome.com"
- @echo " chromesite_rst only build .rst docs; no doxygen"
- @echo " serve_chromesite start python web server for chromesite docs"
+ @echo " chromesite build docs for developer.chrome.com"
+ @echo " chromesite_rst only build .rst docs; no doxygen"
+ @echo " serve start python web server for chromesite docs"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+ @echo " presubmit build docs in a temp directory (for presubmit check)"
clean:
rm -rf $(BUILDDIR)/*
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/NativeClient.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/NativeClient.qhc"
-
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/NativeClient"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/NativeClient"
- @echo "# devhelp"
-
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through platex and dvipdfmx..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@@ -175,37 +42,6 @@ doctest:
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
-xml:
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
- @echo
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
- @echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
-
-devsite-prod:
- $(SPHINXBUILD) -b devsite -D devsite_production_mode=1 -D devsite_foldername=dev $(ALLSPHINXOPTS) $(BUILDDIR)/devsite-prod
- rm -rf $(BUILDDIR)/devsite-prod/images
- cp -r $(BUILDDIR)/devsite-prod/_images $(BUILDDIR)/devsite-prod/images
- rm -rf $(BUILDDIR)/devsite-prod/{_images,peppercpp,searchindex.js}
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/devsite-prod."
-
-devsite-staging:
- $(SPHINXBUILD) -b devsite -D devsite_foldername=$(USER) -D devsite_production_mode=1 $(ALLSPHINXOPTS) $(BUILDDIR)/devsite-staging
- rm -rf $(BUILDDIR)/devsite-staging/images
- cp -r $(BUILDDIR)/devsite-staging/_images $(BUILDDIR)/devsite-staging/images
- cp _reference_toc.yaml $(BUILDDIR)/devsite-staging/
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/devsite-staging."
-
-devsite:
- $(SPHINXBUILD) -b devsite -D devsite_production_mode=0 $(ALLSPHINXOPTS) $(BUILDDIR)/devsite
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/devsite."
-
chromesite:
-rm $(CHROMESITE_BUILDDIR)/.buildinfo
doxygen/generate_docs.py $(CHROMESITE_BUILDDIR)
@@ -217,14 +53,15 @@ chromesite:
@echo "Build finished. The HTML pages are in $(CHROMESITE_BUILDDIR)"
chromesite_rst:
+ -rm $(CHROMESITE_BUILDDIR)/.buildinfo
$(SPHINXBUILD) -b chromesite $(ALLSPHINXOPTS) $(CHROMESITE_BUILDDIR)
rm -rf $(CHROMESITE_BUILDDIR)/images
cp -r $(CHROMESITE_BUILDDIR)/_images $(CHROMESITE_BUILDDIR)/images
rm -rf $(CHROMESITE_BUILDDIR)/{_images,searchindex.js}
+presubmit:
+ -rm $(BUILDDIR)/.buildinfo
+ $(SPHINXBUILD) -b chromesite $(ALLSPHINXOPTS) $(BUILDDIR)
serve:
- cd _build/devsite && python -m SimpleHTTPServer 8009
-
-serve_chromesite:
../../../chrome/common/extensions/docs/server2/preview.py
diff --git a/native_client_sdk/src/doc/PRESUBMIT.py b/native_client_sdk/src/doc/PRESUBMIT.py
index c3001a9dfa..35d7bebe8c 100644
--- a/native_client_sdk/src/doc/PRESUBMIT.py
+++ b/native_client_sdk/src/doc/PRESUBMIT.py
@@ -14,9 +14,7 @@ def _CheckSphinxBuild(input_api, output_api):
"""
try:
- # Don't do a full chromesite build (takes about a minute...), just build
- # the ReST.
- subprocess.check_output(['make', 'chromesite_rst', 'SPHINXOPTS=-Wa'],
+ subprocess.check_output(['make', 'presubmit', 'SPHINXOPTS=-Wa'],
stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
return [output_api.PresubmitNotifyResult('sphinx_build failed:\n' +
diff --git a/native_client_sdk/src/doc/README b/native_client_sdk/src/doc/README
index ff492810a0..878e9dc230 100644
--- a/native_client_sdk/src/doc/README
+++ b/native_client_sdk/src/doc/README
@@ -14,48 +14,27 @@ documentation. Some of the files and directories here are special:
* _static/: Static files, like CSS, for the documentation. This should be seen
as part of the infrastructure - the real CSS comes from the real doc
publishing server.
-* _build/: Build artifacts (not checked into source control).
+* doxygen/: Contains scripts for building doxygen docs.
* Makefile & README
+All output is written to native_client_sdk/doc_generated/...
+
How to build
------------
To build the docs you will needs sphinx installed (and sphinx-build in your
path). On debian/ubuntu this command is part of the ``python-sphinx`` package.
-There are many different output formats that can be generated using the targets
-in the included Makefile. The three most commonly used ones are ``devsite``,
-``devsite-prod`` and ``devsite-staging``.
-
-The ``devsite`` configuration is for generating docs for local viewing and is
-also the default make target. To build this config simply run::
+There are two primary make targets: ``chromesite`` and ``chromesite_rst``. The
+``chromesite`` target will build all documentation, including the doxygen docs.
+This usually takes about a minute. To build this config, run::
make
-To rebuild all the pages always, add ``SPHINXOPTS=-a``, e.g.::
-
- make SPHINXOPTS=-a
-
-To emit docs suitable for pushing to production use::
-
- make devsite-prod
-
-Note that "production use" (and the staging target) are closely tied to the
-Google documentation infrastructure, so it will be of very limited use outside
-Google. Links to related documents here can be google.com specific. Production
-mode contains devsite-specific templating and non-HTML constructs. The
-``devsite-staging`` target is exactly the same except that the html pages are
-all rooted under a folder called $USER, which allows each user to stage his own
-copy of the docs.
-
-When building in production mode you can specify the name of the subfolder in
-which the docs are rooted by specifying ``SPHINXOPTS=-Ddevsite_foldername=``.
-For example::
-
- make devsite-prod SPHINXOPTS=-Ddevsite_foldername=pepper_32
+The ``chromesite_rst`` target will only build the ReST docs. This is usually
+much faster. The default target is ``chromesite``. To build this config, run::
-See https://sites.google.com/a/google.com/nativeclient/documents/how-to-update-developer-documentation#TOC-Staging-ReStructuredText-output-on-devsite
-for more information on staging.
+ make chromesite_rst
Local HTTP server to view the docs
----------------------------------
@@ -68,7 +47,7 @@ run::
This will start a webserver on the local machine, and allows the pages
to be viewed by in a browser by navigating to::
- http://localhost:8009/
+ http://localhost:8000/native-client
Serving through a server and not just file:/// because this way the <link>
relative paths to CSS actually work.
diff --git a/native_client_sdk/src/doc/_book.yaml b/native_client_sdk/src/doc/_book.yaml
index 09555433a3..e097d42e4c 100644
--- a/native_client_sdk/src/doc/_book.yaml
+++ b/native_client_sdk/src/doc/_book.yaml
@@ -75,6 +75,8 @@ toc:
path: /native-client/dev/reference/pnacl-bitcode-abi
- title: "PNaCl C/C++ Language Support"
path: /native-client/dev/reference/pnacl-c-cpp-language-support
+ - title: "PNaCl Undefined Behavior"
+ path: /native-client/dev/reference/pnacl-undefined-behavior
- title: "Sandbox Internals"
section:
- title "ARM 32-bit Sandbox"
diff --git a/native_client_sdk/src/doc/devguide/devcycle/building.rst b/native_client_sdk/src/doc/devguide/devcycle/building.rst
index 3344293d9f..3a630997a2 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/building.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/building.rst
@@ -161,6 +161,8 @@ pnacl-clang
C compiler and compiler driver
pnacl-clang++
C++ compiler and compiler driver
+pnacl-compress
+ Size compresses a finalized **pexe** file for deployment.
pnacl-dis
Disassembler for both **pexe** files and **nexe** files
pnacl-finalize
@@ -324,6 +326,39 @@ The ``create_nmf.py`` tool helps generate an ``.nmf`` file, but ``.nmf``
files can also be written by hand.
+
+Compressing the **pexe** for deployment
+---------------------------------------
+
+Size compression is an optional step for deployment, and reduces the
+size of the pexe file that must be transmitted over the wire. The tool
+``pnacl-compress`` applies compression strategies that are already built
+into the **stable** binary format of a pexe application. As such,
+compressed pexe files do not need any extra time to be decompressed on
+the client's side. All costs are upfront when you call ``pnacl-compress``.
+
+Currently, this tool will compress pexe files by about 25%. However,
+it is somewhat slow (can take from seconds to minutes on large
+appications). Hence, this step is optional.
+
+.. naclcode::
+ :prettyprint: 0
+
+ <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-compress ^
+ hello_world.final.pexe
+
+Tool ``pnacl-compress`` must be called after a pexe file has been finalized
+for deployment (via ``pnacl-finalize``). Alternatively, you can apply this
+step as part of the finalizing step by adding the ``--compress`` flag
+to the pnacl-finalize command line.
+
+Note that this compression step doesn't replace gzip. This compression
+step is in addition to gzipping a file for deployment. One should note
+that while the gzipped version of a compressed pexe file is still
+smaller than the corresponding uncompressed pexe file, the gains is
+somewhat smaller after being gzipped. Expected reduction in size
+(after being gzipped) is more like 7.5% to 10%.
+
The GNU-based toolchains
========================
diff --git a/native_client_sdk/src/doc/doxygen/generate_docs.py b/native_client_sdk/src/doc/doxygen/generate_docs.py
index 8d731cc6f9..79a013c1ec 100755
--- a/native_client_sdk/src/doc/doxygen/generate_docs.py
+++ b/native_client_sdk/src/doc/doxygen/generate_docs.py
@@ -225,7 +225,7 @@ def GenerateDocs(root_dirname, channel, pepper_version, branch):
out_dirname_c = os.path.join(out_dirname, 'c')
doxyfile_c = os.path.join(doxyfile_dirname, 'Doxyfile.c.%s' % channel)
doxyfile_c_template = os.path.join(SCRIPT_DIR, 'Doxyfile.c.template')
- rst_index_c = os.path.join(root_dirname, pepper_dirname, 'c', 'index.rst')
+ rst_index_c = os.path.join(DOC_DIR, pepper_dirname, 'c', 'index.rst')
GenerateDoxyfile(doxyfile_c_template, out_dirname_c, svn_dirname,
doxyfile_c)
RunDoxygen(out_dirname_c, doxyfile_c)
@@ -236,8 +236,7 @@ def GenerateDocs(root_dirname, channel, pepper_version, branch):
out_dirname_cpp = os.path.join(out_dirname, 'cpp')
doxyfile_cpp = os.path.join(doxyfile_dirname, 'Doxyfile.cpp.%s' % channel)
doxyfile_cpp_template = os.path.join(SCRIPT_DIR, 'Doxyfile.cpp.template')
- rst_index_cpp = os.path.join(root_dirname, pepper_dirname, 'cpp',
- 'index.rst')
+ rst_index_cpp = os.path.join(DOC_DIR, pepper_dirname, 'cpp', 'index.rst')
GenerateDoxyfile(doxyfile_cpp_template, out_dirname_cpp, svn_dirname,
doxyfile_cpp)
RunDoxygen(out_dirname_cpp, doxyfile_cpp)
diff --git a/native_client_sdk/src/doc/pepper_dev/c/index.rst b/native_client_sdk/src/doc/pepper_dev/c/index.rst
index afc8a6afaa..acb79bd1f6 100644
--- a/native_client_sdk/src/doc/pepper_dev/c/index.rst
+++ b/native_client_sdk/src/doc/pepper_dev/c/index.rst
@@ -13,9 +13,9 @@ run in Chrome 34 or higher.
=======================================
* `PPB_Audio <struct_p_p_b___audio__1__1.html>`_
- * `PPB_AudioConfig <struct_p_p_b___audio_config__1__1.html>`_
+ * `PPB_AudioBuffer <struct_p_p_b___audio_buffer__0__1.html>`_
- * `PPB_AudioFrame <struct_p_p_b___audio_frame__0__1.html>`_
+ * `PPB_AudioConfig <struct_p_p_b___audio_config__1__1.html>`_
* `PPB_Console <struct_p_p_b___console__1__0.html>`_
@@ -23,6 +23,8 @@ run in Chrome 34 or higher.
* `PPB_FileIO <struct_p_p_b___file_i_o__1__1.html>`_
+ * `PPB_FileMapping <struct_p_p_b___file_mapping__0__1.html>`_
+
* `PPB_FileRef <struct_p_p_b___file_ref__1__2.html>`_
* `PPB_FileSystem <struct_p_p_b___file_system__1__0.html>`_
@@ -45,7 +47,7 @@ run in Chrome 34 or higher.
* `PPB_Instance <struct_p_p_b___instance__1__0.html>`_
- * `PPB_KeyboardInputEvent <struct_p_p_b___keyboard_input_event__1__0.html>`_
+ * `PPB_KeyboardInputEvent <struct_p_p_b___keyboard_input_event__1__2.html>`_
* `PPB_MediaStreamAudioTrack <struct_p_p_b___media_stream_audio_track__0__1.html>`_
@@ -83,7 +85,7 @@ run in Chrome 34 or higher.
* `PPB_URLResponseInfo <struct_p_p_b___u_r_l_response_info__1__0.html>`_
- * `PPB_Var <struct_p_p_b___var__1__1.html>`_
+ * `PPB_Var <struct_p_p_b___var__1__2.html>`_
* `PPB_VarArray <struct_p_p_b___var_array__1__0.html>`_
@@ -209,9 +211,9 @@ Files
* `ppb_audio.h <ppb__audio_8h.html>`_
- * `ppb_audio_config.h <ppb__audio__config_8h.html>`_
+ * `ppb_audio_buffer.h <ppb__audio__buffer_8h.html>`_
- * `ppb_audio_frame.h <ppb__audio__frame_8h.html>`_
+ * `ppb_audio_config.h <ppb__audio__config_8h.html>`_
* `ppb_console.h <ppb__console_8h.html>`_
@@ -219,6 +221,8 @@ Files
* `ppb_file_io.h <ppb__file__io_8h.html>`_
+ * `ppb_file_mapping.h <ppb__file__mapping_8h.html>`_
+
* `ppb_file_ref.h <ppb__file__ref_8h.html>`_
* `ppb_file_system.h <ppb__file__system_8h.html>`_
diff --git a/native_client_sdk/src/doc/pepper_dev/cpp/index.rst b/native_client_sdk/src/doc/pepper_dev/cpp/index.rst
index ae0721671b..ebb773a8d1 100644
--- a/native_client_sdk/src/doc/pepper_dev/cpp/index.rst
+++ b/native_client_sdk/src/doc/pepper_dev/cpp/index.rst
@@ -13,9 +13,9 @@ run in Chrome 34 or higher.
==========================
* `Audio <classpp_1_1_audio.html>`_
- * `AudioConfig <classpp_1_1_audio_config.html>`_
+ * `AudioBuffer <classpp_1_1_audio_buffer.html>`_
- * `AudioFrame <classpp_1_1_audio_frame.html>`_
+ * `AudioConfig <classpp_1_1_audio_config.html>`_
* `CompletionCallback <classpp_1_1_completion_callback.html>`_
@@ -132,9 +132,9 @@ Files
=====
* `audio.h <audio_8h.html>`_
- * `audio_config.h <audio__config_8h.html>`_
+ * `audio_buffer.h <audio__buffer_8h.html>`_
- * `audio_frame.h <audio__frame_8h.html>`_
+ * `audio_config.h <audio__config_8h.html>`_
* `completion_callback.h <completion__callback_8h.html>`_
diff --git a/native_client_sdk/src/doc/pepper_stable/c/index.rst b/native_client_sdk/src/doc/pepper_stable/c/index.rst
index fc17998071..d08a684ae9 100644
--- a/native_client_sdk/src/doc/pepper_stable/c/index.rst
+++ b/native_client_sdk/src/doc/pepper_stable/c/index.rst
@@ -6,8 +6,8 @@
Pepper C API Reference (Stable)
##########################################
-This page lists the C API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.
+This page lists the C API for Pepper 33. Apps that use this API can
+run in Chrome 33 or higher.
`Interfaces <group___interfaces.html>`_
=======================================
diff --git a/native_client_sdk/src/doc/pepper_stable/cpp/index.rst b/native_client_sdk/src/doc/pepper_stable/cpp/index.rst
index dec5b620ab..0d1db3b04c 100644
--- a/native_client_sdk/src/doc/pepper_stable/cpp/index.rst
+++ b/native_client_sdk/src/doc/pepper_stable/cpp/index.rst
@@ -6,8 +6,8 @@
Pepper C++ API Reference (Stable)
############################################
-This page lists the C++ API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.
+This page lists the C++ API for Pepper 33. Apps that use this API can
+run in Chrome 33 or higher.
`Classes <inherits.html>`_
==========================
diff --git a/native_client_sdk/src/doc/pepper_stable/index.rst b/native_client_sdk/src/doc/pepper_stable/index.rst
index 36963d9724..363708ec5a 100644
--- a/native_client_sdk/src/doc/pepper_stable/index.rst
+++ b/native_client_sdk/src/doc/pepper_stable/index.rst
@@ -8,8 +8,8 @@
Pepper API Reference (Stable)
########################################
-This page lists the API for Pepper 32. Apps that use this API can
-run in Chrome 32 or higher.
+This page lists the API for Pepper 33. Apps that use this API can
+run in Chrome 33 or higher.
:ref:`Pepper C API Reference <pepper_stable_c_index>`
===========================================================
diff --git a/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst b/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst
index 0aa9a9929b..9d5225398a 100644
--- a/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst
+++ b/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst
@@ -15,11 +15,11 @@ the bitcode on a *semantic* level; the physical encoding level will be described
elsewhere. For the purpose of this document, the textual form of LLVM IR is
used to describe instructions and other bitcode constructs.
-Since the PNaCl bitcode is based to a large extent on LLVM IR, many sections
-in this document point to a relevant section of the LLVM language reference
-manual. Only the changes, restrictions and variations specific to PNaCl are
-described---full semantic descriptions are not duplicated from the LLVM
-reference manual.
+Since the PNaCl bitcode is based to a large extent on LLVM IR as of
+version 3.3, many sections in this document point to a relevant section
+of the LLVM language reference manual. Only the changes, restrictions
+and variations specific to PNaCl are described---full semantic
+descriptions are not duplicated from the LLVM reference manual.
High Level Structure
====================
@@ -265,6 +265,17 @@ Intrinsic Global Variables
PNaCl bitcode does not support intrinsic global variables.
+.. _ir_and_errno:
+
+Errno and errors in arithmetic instructions
+===========================================
+
+Some arithmetic instructions and intrinsics have the similar semantics to
+libc math functions, but differ in the treatment of ``errno``. While the
+libc functions may set ``errno`` for domain errors, the instructions and
+intrinsics do not. This is because the variable ``errno`` is not special
+and is not required to be part of the program.
+
Instruction Reference
=====================
@@ -305,6 +316,14 @@ Only the LLVM instructions listed here are supported by PNaCl bitcode.
* ``fmul``
* ``fdiv``
* ``frem``
+
+ The frem instruction has the semantics of the libc fmod function for
+ computing the floating point remainder. If the numerator is infinity, or
+ denominator is zero, or either are NaN, then the result is NaN.
+ Unlike the libc fmod function, this does not set ``errno`` when the
+ result is NaN (see the :ref:`instructions and errno <ir_and_errno>`
+ section).
+
* ``alloca``
See :ref:`alloca instructions <bitcode_allocainst>`.
@@ -396,8 +415,10 @@ The only intrinsics supported by PNaCl bitcode are the following.
* ``llvm.sqrt``
The overloaded ``llvm.sqrt`` intrinsic is only supported for float
- and double arguments types. Unlike the standard LLVM intrinsic,
- PNaCl guarantees that llvm.sqrt returns a QNaN for values less than -0.0.
+ and double arguments types. This has the same semantics as the libc
+ sqrt function, returning NaN for values less than -0.0. However, this
+ does not set ``errno`` when the result is NaN (see the
+ :ref:`instructions and errno <ir_and_errno>` section).
* ``llvm.stacksave``
* ``llvm.stackrestore``
diff --git a/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst b/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst
index d63a9439c0..5bb5ac8688 100644
--- a/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst
+++ b/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst
@@ -11,7 +11,7 @@ Source language support
=======================
The currently supported languages are C and C++. The PNaCl toolchain is
-based on Clang 3.3, which fully supports C++11 and most of C11. A
+based on recent Clang, which fully supports C++11 and most of C11. A
detailed status of the language support is available `here
<http://clang.llvm.org/cxx_status.html>`_.
@@ -19,10 +19,19 @@ For information on using languages other than C/C++, see the :ref:`FAQ
section on other languages <other_languages>`.
As for the standard libraries, the PNaCl toolchain is currently based on
-``libc++``, and the ``newlib`` standard C library (version is available
-through the macro ``NEWLIB_VERSION``). ``libstdc++`` is also supported
-but its use is discouraged; see :ref:`building_cpp_libraries` for more
-details.
+``libc++``, and the ``newlib`` standard C library. ``libstdc++`` is also
+supported but its use is discouraged; see :ref:`building_cpp_libraries`
+for more details.
+
+Versions
+--------
+
+Version information can be obtained:
+
+* Clang/LLVM: run ``pnacl-clang -v``.
+* ``newlib``: use the ``_NEWLIB_VERSION`` macro.
+* ``libc++``: use the ``_LIBCPP_VERSION`` macro.
+* ``libstdc++``: use the ``_GLIBCXX_VERSION`` macro.
Preprocessor definitions
------------------------
@@ -49,7 +58,8 @@ locations to each other as the C11/C++11 standards do.
Non-atomic memory accesses may be reordered, separated, elided or fused
according to C and C++'s memory model before the pexe is created as well
-as after its creation.
+as after its creation. Accessing atomic memory location through
+non-atomic primitives is `Undefined Behavior <undefined_behavior>`.
As in C11/C++11 some atomic accesses may be implemented with locks on
certain platforms. The ``ATOMIC_*_LOCK_FREE`` macros will always be
@@ -188,6 +198,55 @@ NaCl supports a fairly wide subset of inline assembly through GCC's
inline assembly syntax, with the restriction that the sandboxing model
for the target architecture has to be respected.
+Undefined Behavior
+==================
+
+The C and C++ languages expose some undefined behavior which is
+discussed in `PNaCl Undefined Behavior <undefined_behavior>`.
+
+Floating-Point
+==============
+
+PNaCl exposes 32-bit and 64-bit floating point operations which are
+mostly IEEE-754 compliant. There are a few caveats:
+
+* Some :ref:`floating-point behavior is currently left as undefined
+ <undefined_behavior_fp>`.
+* The default rounding mode is round-to-nearest and other rounding modes
+ are currently not usable, which isn't IEEE-754 compliant. PNaCl could
+ support switching modes (the 4 modes exposed by C99 ``FLT_ROUNDS``
+ macros).
+* Signaling ``NaN`` never fault.
+* Fast-math optimizations are currently supported before *pexe* creation
+ time. A *pexe* loses all fast-math information when it is
+ created. Fast-math translation could be enabled at a later date,
+ potentially at a perf-function granularity. This wouldn't affect
+ already-existing *pexe*; it would be an opt-in feature.
+
+ * Fused-multiply-add have higher precision and often execute faster;
+ PNaCl currently disallows them in the *pexe* because they aren't
+ supported on all platforms and can't realistically be
+ emulated. PNaCl could (but currently doesn't) only generate them in
+ the backend if fast-math were specified and the hardware supports
+ the operation.
+ * Transcendentals aren't exposed by PNaCl's ABI; they are part of the
+ math library that is included in the *pexe*. PNaCl could, but
+ currently doesn't, use hardware support if fast-math were provided
+ in the *pexe*.
+
+Computed ``goto``
+=================
+
+PNaCl supports computed ``goto``, a non-standard GCC extension to C used
+by some interpreters, by lowering them to ``switch`` statements. The
+resulting use of ``switch`` might not be as fast as the original
+indirect branches. If you are compiling a program that has a
+compile-time option for using computed ``goto``, it's possible that the
+program will run faster with the option turned off (e.g., if the program
+does extra work to take advantage of computed ``goto``).
+
+NaCl supports computed ``goto`` without any transformation.
+
Future Directions
=================
@@ -236,11 +295,3 @@ POSIX-style signal handling really consists of two different features:
If PNaCl were to support either of these, the interaction of
``volatile`` and atomics with same-thread signal handling would need
to be carefully detailed.
-
-Computed ``goto``
------------------
-
-PNaCl currently doesn't support computed ``goto``, a non-standard
-extension to C used by some interpreters.
-
-NaCl supports computed ``goto``.
diff --git a/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst b/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst
new file mode 100644
index 0000000000..30d95f91fb
--- /dev/null
+++ b/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst
@@ -0,0 +1,221 @@
+========================
+PNaCl Undefined Behavior
+========================
+
+.. contents::
+ :local:
+ :backlinks: none
+ :depth: 3
+
+.. _undefined_behavior:
+
+Overview
+========
+
+C and C++ undefined behavior allows efficient mapping of the source
+language onto hardware, but leads to different behavior on different
+platforms.
+
+PNaCl exposes undefined behavior in the following ways:
+
+* The Clang frontend and optimizations that occur on the developer's
+ machine determine what behavior will occur, and it will be specified
+ deterministically in the *pexe*. All targets will observe the same
+ behavior. In some cases, recompiling with a newer PNaCl SDK version
+ will either:
+
+ * Reliably emit the same behavior in the resulting *pexe*.
+ * Change the behavior that gets specified in the *pexe*.
+
+* The behavior specified in the *pexe* relies on PNaCl's bitcode,
+ runtime or CPU architecture vagaries.
+
+ * In some cases, the behavior using the same PNaCl translator version
+ on different architectures will produce different behavior.
+ * Sometimes runtime parameters determine the behavior, e.g. memory
+ allocation determines which out-of-bounds accesses crash versus
+ returning garbage.
+ * In some cases, different versions of the PNaCl translator
+ (i.e. after a Chrome update) will compile the code differently and
+ cause different behavior.
+ * In some cases, the same versions of the PNaCl translator, on the
+ same architecture, will generate a different *nexe* for
+ defense-in-depth purposes, but may cause code that reads invalid
+ stack values or code sections on the heap to observe these
+ randomizations.
+
+Specification
+=============
+
+PNaCl's goal is that a single *pexe* should work reliably in the same
+manner on all architectures, irrespective of runtime parameters and
+through Chrome updates. This goal is unfortunately not attainable; PNaCl
+therefore specifies as much as it can and outlines areas for
+improvement.
+
+One interesting solution is to offer good support for LLVM's sanitizer
+tools (including `UBSan
+<http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation>`_)
+at development time, so that developers can test their code against
+undefined behavior. Shipping code would then still get good performance,
+and diverging behavior would be rare.
+
+Note that none of these issues are vulnerabilities in PNaCl and Chrome:
+the NaCl sandboxing still constrains the code through Software Fault
+Isolation.
+
+Behavior in PNaCl Bitcode
+=========================
+
+Well-Defined
+------------
+
+The following are traditionally undefined behavior in C/C++ but are well
+defined at the *pexe* level:
+
+* Dynamic initialization order dependencies: the order is deterministic
+ in the *pexe*.
+* Bool which isn't ``0``/``1``: the bitcode instruction sequence is
+ deterministic in the *pexe*.
+* Out-of-range ``enum`` value: the backing integer type and bitcode
+ instruction sequence is deterministic in the *pexe*.
+* Aggressive optimizations based on type-based alias analysis: TBAA
+ optimizations are done before stable bitcode is generated and their
+ metadata is stripped from the *pexe*; behavior is therefore
+ deterministic in the *pexe*.
+* Operator and subexpression evaluation order in the same expression
+ (e.g. function parameter passing, or pre-increment): the order is
+ defined in the *pexe*.
+* Signed integer overflow: two's complement integer arithmetic is
+ assumed.
+* Atomic access to a non-atomic memory location (not declared as
+ ``std::atomic``): atomics and ``volatile`` variables all lower to the
+ same compatible intrinsics or external functions; the behavior is
+ therefore deterministic in the *pexe* (see :ref:`Memory Model and
+ Atomics <memory_model_and_atomics>`).
+* Integer divide by zero: always raises a fault (through hardware on
+ x86, and through integer divide emulation routine or explicit checks
+ on ARM).
+
+Not Well-Defined
+----------------
+
+The following are traditionally undefined behavior in C/C++ which also
+exhibit undefined behavior at the *pexe* level. Some are easier to fix
+than others.
+
+Potentially Fixable
+^^^^^^^^^^^^^^^^^^^
+
+* Shift by greater-than-or-equal to left-hand-side's bit-width or
+ negative (see `bug 3604
+ <https://code.google.com/p/nativeclient/issues/detail?id=3604>`_).
+
+ * Some of the behavior will be specified in the *pexe* depending on
+ constant propagation and integer type of variables.
+ * There is still some architecture-specific behavior.
+ * PNaCl could force-mask the right-hand-side to `bitwidth-1`, which
+ could become a no-op on some architectures while ensuring all
+ architectures behave similarly. Regular optimizations could also be
+ applied, removing redundant masks.
+
+* Using a virtual pointer of the wrong type, or of an unallocated
+ object.
+
+ * Will produce wrong results which will depend on what data is treated
+ as a `vftable`.
+ * PNaCl could add runtime checks for this, and elide them when types
+ are provably correct (see this CFI `bug 3786
+ <https://code.google.com/p/nativeclient/issues/detail?id=3786>`_).
+
+* Some unaligned load/store (see `bug 3445
+ <https://code.google.com/p/nativeclient/issues/detail?id=3445>`_).
+
+ * Could force everything to `align 1`; performance cost should be
+ measured.
+ * The frontend could also be more pessimistic when it sees dubious
+ casts.
+
+* Some values can be marked as ``undef`` (see `bug 3796
+ <https://code.google.com/p/nativeclient/issues/detail?id=3796>`_).
+
+* Reaching end-of-value-returning-function without returning a value:
+ reduces to ``ret i32 undef`` in bitcode. This is mostly-defined, but
+ could be improved (see `bug 3796
+ <https://code.google.com/p/nativeclient/issues/detail?id=3796>`_).
+
+* Reaching “unreachable” code.
+
+ * LLVM provides an IR instruction called “unreachable” whose effect
+ will be undefined. PNaCl could change this to always trap, as the
+ ``llvm.trap`` intrinsic does.
+
+* Zero or negative-sized variable-length array (and ``alloca``) aren't
+ defined behavior. PNaCl's frontend or the translator could insert
+ checks with ``-fsanitize=vla-bound``.
+
+.. _undefined_behavior_fp:
+
+Floating-Point
+^^^^^^^^^^^^^^
+
+PNaCl offers a IEEE-754 implementation which is as correct as the
+underlying hardware allows, with a few limitations. These are a few
+sources of undefined behavior which are believed to be fixable:
+
+* Float cast overflow is currently undefined.
+* Float divide by zero is currently undefined.
+* The default denormal behavior is currently unspecified, which isn't
+ IEEE-754 compliant (denormals must be supported in IEEE-754). PNaCl
+ could mandate flush-to-zero, and may give an API to enable denormals
+ in a future release. The latter is problematic for SIMD and
+ vectorization support, where some platforms do not support denormal
+ SIMD operations.
+* ``NaN`` values are currently not guaranteed to be canonical; see `bug
+ 3536 <https://code.google.com/p/nativeclient/issues/detail?id=3536>`_.
+* Passing ``NaN`` to STL functions (the math is defined, but the
+ function implementation isn't, e.g. ``std::min`` and ``std::max``), is
+ well-defined in the *pexe*.
+
+Hard to Fix
+^^^^^^^^^^^
+
+* Null pointer/reference has behavior determined by the NaCl sandbox:
+
+ * Raises a segmentation fault in the bottom ``64KiB`` bytes on all
+ platforms, and on some sandboxes there are further non-writable
+ pages after the initial ``64KiB``.
+ * Negative offsets aren't handled consistently on all platforms:
+ x86-64 and ARM will wrap around to the stack (because they mask the
+ address), whereas x86-32 will fault (because of segmentation).
+
+* Accessing uninitialized/free'd memory (including out-of-bounds array
+ access):
+
+ * Might cause a segmentation fault or not, depending on where memory
+ is allocated and how it gets reclaimed.
+ * Added complexity because of the NaCl sandboxing: some of the
+ load/stores might be forced back into sandbox range, or eliminated
+ entirely if they fall out of the sandbox.
+
+* Executing non-program data (jumping to an address obtained from a
+ non-function pointer is undefined, can only do ``void(*)()`` to
+ ``intptr_t`` to ``void(*)()``).
+
+ * Just-In-Time code generation is supported by NaCl, but is not
+ currently supported by PNaCl. It is currently not possible to mark
+ code as executable.
+ * Offering full JIT capabilities would reduce PNaCl's ability to
+ change the sandboxing model. It would also require a "jump to JIT
+ code" syscall (to guarantee a calling convention), and means that
+ JITs aren't portable.
+ * PNaCl could offer "portable" JIT capabilities where the code hands
+ PNaCl some form of LLVM IR, which PNaCl then JIT-compiles.
+
+* Out-of-scope variable usage: will produce unknown data, mostly
+ dependent on stack and memory allocation.
+* Data races: any two operations that conflict (target overlapping
+ memory), at least one of which is a store or atomic read-modify-write,
+ and at least one of which is not atomic: this will be very dependent
+ on processor and execution sequence, see :ref:`Memory Model and
+ Atomics <memory_model_and_atomics>`.
diff --git a/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst b/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst
index 77ff417ff8..919c3fd119 100644
--- a/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst
+++ b/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst
@@ -1,3 +1,5 @@
+.. _arm-32-bit-sandbox:
+
==================
ARM 32-bit Sandbox
==================
@@ -462,9 +464,9 @@ the possible places that any *indirect branch* can land. On Native
Client for ARM, *indirect branch* can target any address that has its
bottom four bits clear---any address that's ``0 mod 16``. We call these
16-byte chunks of code "bundles". The validator makes sure that no
-pseudo-instruction straddles a bundle boundary. Compilers must pad with`
-`nop``\ s to ensure that every pseudo-instruction fits entirely inside
-one bundle.
+pseudo-instruction straddles a bundle boundary. Compilers must pad with
+``nop`` to ensure that every pseudo-instruction fits entirely inside one
+bundle.
Here is the *indirect branch* pseudo-instruction. As you can see, it
clears the top two and bottom four bits of the address:
@@ -667,6 +669,7 @@ the program). For example:
.. naclcode::
:prettyprint: 0
+ .p2align 4
bkpt #0x5BE0 ; Must be aligned 0 mod 16!
.word 0xDEADBEEF ; Arbitrary constants are A-OK.
svc #30 ; Trying to make a syscall? OK!
diff --git a/native_client_sdk/src/doc/reference/sandbox_internals/index.rst b/native_client_sdk/src/doc/reference/sandbox_internals/index.rst
index 3b5670d119..044da58fd1 100644
--- a/native_client_sdk/src/doc/reference/sandbox_internals/index.rst
+++ b/native_client_sdk/src/doc/reference/sandbox_internals/index.rst
@@ -9,3 +9,28 @@ Native Client sandboxing, which is also used by Portable Native
Client. These details can be useful to reimplement a sandbox, or to
write assembly code that follows sandboxing rules for Native Client
(Portable Native Client does not allow platform-specific assembly code).
+
+As an implementation detail, the Native Client sandboxes described here
+are currently used by Portable Native Client to execute code on the
+corresponding machines in a safe manner. The portable bitcode contained
+in a **pexe** is translated to a machine-specific **nexe** before
+execution. This may change at a point in time: Portable Native Client
+doesn't necessarily need these sandboxes to execute code on these
+machines. Note that the Portable Native Client compiler itself is also
+untrusted: it too runs in a Native Client sandbox described below.
+
+Native Client has sandboxes for:
+
+* :ref:`ARM 32-bit <arm-32-bit-sandbox>`.
+* x86-32: the original design is described in `Native Client: A Sandbox
+ for Portable, Untrusted x86 Native Code
+ <http://research.google.com/pubs/archive/34913.pdf>`_, the current
+ design has changed slightly since then.
+* x86-64: the original design is described in `Adapting Software Fault
+ Isolation to Contemporary CPU Architectures
+ <http://research.google.com/pubs/archive/35649.pdf>`_, the current
+ design has changed slightly since then.
+* MIPS32, described in the `overview of Native Client for MIPS
+ <https://code.google.com/p/nativeclient/issues/attachmentText?id=2275&aid=22750018000&name=native-client-mips-0.4.txt>`_,
+ and `bug 2275
+ <https://code.google.com/p/nativeclient/issues/detail?id=2275>`_.
diff --git a/native_client_sdk/src/doc/rest-devsite-examples.rst b/native_client_sdk/src/doc/rest-devsite-examples.rst
index eeaf505bfe..cc2eef6bc4 100644
--- a/native_client_sdk/src/doc/rest-devsite-examples.rst
+++ b/native_client_sdk/src/doc/rest-devsite-examples.rst
@@ -2,18 +2,9 @@
:orphan:
-####################################################
-Examples of ReST markup for devsite (Document title)
-####################################################
-
-This is an auto-generated table of contents for this document. ``:local:`` and
-``:backlinks: none`` are required to make the devsite look consistent;
-``:depth:`` level can be controlled.
-
-.. contents::
- :local:
- :backlinks: none
- :depth: 2
+#######################################################
+Examples of ReST markup for chromesite (Document title)
+#######################################################
Document structure
==================
@@ -22,9 +13,6 @@ A document starts with a Sphinx target which serves as the document name
throughout the tree. It can serve as a link target in other documents that want
to link to this one (see the Links section below).
-It follows with the document title (which doesn't get generated to the HTML body
-in production mode, but is picked up by the devsite from ``<head><title>``.
-
Basic markup
============
@@ -67,8 +55,8 @@ To other documents within the tree
----------------------------------
Internal links to other documents are created :doc:`like this <overview>`. The
-document name within the angle brackets is relative to the root dir of the
-devsite doc tree and does not have an extension.
+document name within the angle brackets is relative to the root dir of the doc
+tree and does not have an extension.
Here's a link to a document in a subdirectory: :doc:`the tutorial
<devguide/tutorial/tutorial-part1>`. And a link to a subdirectory index page
@@ -96,7 +84,7 @@ Definition lists
Can be used to define a group of related terms. Internal formatting is supported
within the definition. No special formatting needs to be done for the definition
-name/title - it's handled by the devsite.
+name/title - it's handled by the chromesite documentation server.
Apple
The apple is the pomaceous fruit of the apple tree, species Malus domestica in
@@ -112,9 +100,9 @@ Pear
Notes and Admonitions
=====================
-The devsite supports special "notes" that are indented and have a background
-color. We'll generate them with the ``Note`` directive, providing the class
-explicitly. The class is one of ``note``, ``caution``, ``warning``,
+The documentation server supports special "notes" that are indented and have a
+background color. We'll generate them with the ``Note`` directive, providing
+the class explicitly. The class is one of ``note``, ``caution``, ``warning``,
``special``.
.. Note::
@@ -134,9 +122,8 @@ Also:
Source code
===========
-Here's source code that will be pretty-printed on the devsite. Outside
-production mode, it's just a plain ``<pre>`` that presents pre-formatted code
-without coloring:
+Here's source code that will be pretty-printed. It's just a plain ``<pre>``
+that presents pre-formatted code with coloring:
.. naclcode::
@@ -185,20 +172,6 @@ Sub-sub-subsection heading
It's probably not the best idea to go this far (renders to ``<h5>``).
-Expandable sections
-===================
-
-The devsite can render expandable sections when a special ``class`` is applied.
-This can be achieved by specifying the ``rst-class`` immediately before a
-section (or any other element), as follows:
-
-.. rst-class:: expandable
-
-Expandable Section
-------------------
-
-Look, ma! I'm expandable!
-
Lists
=====
diff --git a/native_client_sdk/src/doc/sitemap.rst b/native_client_sdk/src/doc/sitemap.rst
index c7d30bdab1..43156d9faf 100644
--- a/native_client_sdk/src/doc/sitemap.rst
+++ b/native_client_sdk/src/doc/sitemap.rst
@@ -53,6 +53,7 @@ Contents:
reference/index.rst
reference/pnacl-bitcode-abi.rst
reference/pnacl-c-cpp-language-support.rst
+ reference/pnacl-undefined-behavior.rst
reference/nacl-manifest-format.rst
reference/sandbox_internals/index.rst
reference/sandbox_internals/arm-32-bit-sandbox.rst
diff --git a/native_client_sdk/src/examples/api/input_event/input_event.cc b/native_client_sdk/src/examples/api/input_event/input_event.cc
index fee260bf74..583c230091 100644
--- a/native_client_sdk/src/examples/api/input_event/input_event.cc
+++ b/native_client_sdk/src/examples/api/input_event/input_event.cc
@@ -24,10 +24,6 @@
namespace {
-const char* const kDidChangeFocus = "DidChangeFocus";
-const char* const kHaveFocus = "HaveFocus";
-const char* const kDontHaveFocus = "DontHaveFocus";
-
std::string ModifierToString(uint32_t modifier) {
std::string s;
if (modifier & PP_INPUTEVENT_MODIFIER_SHIFTKEY) {
diff --git a/native_client_sdk/src/examples/api/url_loader/url_loader.cc b/native_client_sdk/src/examples/api/url_loader/url_loader.cc
index d000a93cd1..7af8c6e50f 100644
--- a/native_client_sdk/src/examples/api/url_loader/url_loader.cc
+++ b/native_client_sdk/src/examples/api/url_loader/url_loader.cc
@@ -17,11 +17,6 @@
namespace {
const char* const kLoadUrlMethodId = "getUrl";
static const char kMessageArgumentSeparator = ':';
-
-// Exception strings. These are passed back to the browser when errors
-// happen during property accesses or method calls.
-const char* const kExceptionStartFailed = "URLLoaderHandler::Start() failed";
-const char* const kExceptionURLNotAString = "URL is not a string";
} // namespace
class URLLoaderInstance : public pp::Instance {
diff --git a/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc b/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc
index 9291036d41..052c9103c6 100644
--- a/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc
+++ b/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc
@@ -25,8 +25,6 @@ static const char kDeleteCommand[] = "Delete";
static const char kHasKeyCommand[] = "HasKey";
static const char kGetKeysCommand[] = "GetKeys";
-static const char kCommandKey[] = "cmd";
-
pp::Var MakeResult(const char* cmd, const pp::Var& value,
const pp::Var& newDictionary) {
pp::VarDictionary dict;
diff --git a/native_client_sdk/src/examples/demo/earth/earth.cc b/native_client_sdk/src/examples/demo/earth/earth.cc
index eef5c38dcd..420448bb1f 100644
--- a/native_client_sdk/src/examples/demo/earth/earth.cc
+++ b/native_client_sdk/src/examples/demo/earth/earth.cc
@@ -32,7 +32,6 @@ using namespace sdk_util; // For sdk_util::ThreadPool
// Global properties used to setup Earth demo.
namespace {
-const float kHugeZ = 1.0e38f;
const float kPI = M_PI;
const float kTwoPI = kPI * 2.0f;
const float kOneOverPI = 1.0f / kPI;
@@ -45,7 +44,6 @@ const float kZoomMax = 50.0f;
const float kWheelSpeed = 2.0f;
const float kLightMin = 0.0f;
const float kLightMax = 2.0f;
-const int kFrameTimeBufferSize = 512;
// Timer helper for benchmarking. Returns seconds elapsed since program start,
// as a double.
@@ -147,8 +145,6 @@ inline const float AsFloat(const int i) {
}
const long int kOneAsInteger = AsInteger(1.0f);
-const float kScaleUp = float(0x00800000);
-const float kScaleDown = 1.0f / kScaleUp;
inline float inline_quick_sqrt(float x) {
int i;
diff --git a/native_client_sdk/src/gonacl_appengine/src/earth/earth.cc b/native_client_sdk/src/gonacl_appengine/src/earth/earth.cc
index fe697c6864..c421ec3d43 100644
--- a/native_client_sdk/src/gonacl_appengine/src/earth/earth.cc
+++ b/native_client_sdk/src/gonacl_appengine/src/earth/earth.cc
@@ -31,11 +31,14 @@
#include "sdk_util/macros.h"
#include "sdk_util/thread_pool.h"
+// Chromium presubmit prevents checking in changes with calls to printf to
+// prevent spammy output. We'll work around that for this example.
+#define logf printf
+
using namespace sdk_util; // For sdk_util::ThreadPool
// Global properties used to setup Earth demo.
namespace {
-const float kHugeZ = 1.0e38f;
const float kPI = M_PI;
const float kTwoPI = kPI * 2.0f;
const float kOneOverPI = 1.0f / kPI;
@@ -48,7 +51,6 @@ const float kZoomMax = 50.0f;
const float kWheelSpeed = 2.0f;
const float kLightMin = 0.0f;
const float kLightMax = 2.0f;
-const int kFrameTimeBufferSize = 512;
// RGBA helper functions.
inline float ExtractR(uint32_t c) {
@@ -136,8 +138,6 @@ inline const float AsFloat(const int i) {
}
const long int kOneAsInteger = AsInteger(1.0f);
-const float kScaleUp = float(0x00800000);
-const float kScaleDown = 1.0f / kScaleUp;
inline float inline_quick_sqrt(float x) {
int i;
@@ -687,7 +687,7 @@ void Planet::DidChangeView(const pp::View& view) {
void Planet::StartBenchmark() {
// For more consistent benchmark numbers, reset to default state.
Reset();
- printf("Benchmark started...\n");
+ logf("Benchmark started...\n");
benchmark_frame_counter_ = kFramesToBenchmark;
benchmarking_ = true;
benchmark_start_time_ = getseconds();
@@ -695,7 +695,7 @@ void Planet::StartBenchmark() {
void Planet::EndBenchmark() {
benchmark_end_time_ = getseconds();
- printf("Benchmark ended... time: %2.5f\n",
+ logf("Benchmark ended... time: %2.5f\n",
benchmark_end_time_ - benchmark_start_time_);
benchmarking_ = false;
benchmark_frame_counter_ = 0;
@@ -809,7 +809,7 @@ void Planet::HandleMessage(const pp::Var& var) {
}
}
} else {
- printf("Handle message unknown type: %s\n", var.DebugString().c_str());
+ logf("Handle message unknown type: %s\n", var.DebugString().c_str());
}
}
@@ -852,9 +852,9 @@ void Planet::Update() {
void Planet::CreateContext(const pp::Size& size) {
graphics_2d_context_ = new pp::Graphics2D(this, size, false);
if (graphics_2d_context_->is_null())
- printf("Failed to create a 2D resource!\n");
+ logf("Failed to create a 2D resource!\n");
if (!BindGraphics(*graphics_2d_context_))
- printf("Couldn't bind the device context\n");
+ logf("Couldn't bind the device context\n");
image_data_ = new pp::ImageData(this,
PP_IMAGEDATAFORMAT_BGRA_PREMUL,
size,
diff --git a/native_client_sdk/src/gonacl_appengine/src/smoothlife/build.sh b/native_client_sdk/src/gonacl_appengine/src/smoothlife/build.sh
index 550aab28a9..4e641b0983 100755
--- a/native_client_sdk/src/gonacl_appengine/src/smoothlife/build.sh
+++ b/native_client_sdk/src/gonacl_appengine/src/smoothlife/build.sh
@@ -12,7 +12,7 @@ cd ${SCRIPT_DIR}
OUT_DIR=out
SMOOTHLIFE_URL=https://github.com/binji/smoothnacl
SMOOTHLIFE_DIR=${OUT_DIR}/smoothlife
-SMOOTHLIFE_SHA=156fa855933d6ff0b58bdacad74163e5901d8122
+SMOOTHLIFE_SHA=165b31df45b3f1ec76ec227a4086c80823e415cf
if [ -z "${NACL_SDK_ROOT:-}" ]; then
echo "-------------------------------------------------------------------"
diff --git a/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.css b/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.css
new file mode 100644
index 0000000000..16b070070b
--- /dev/null
+++ b/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.css
@@ -0,0 +1,166 @@
+/* Copyright (c) 2014 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. */
+
+* {
+ box-sizing: border-box;
+ -webkit-font-smoothing:antialiased;
+}
+
+html, body {
+ background: #FAFAFA;
+ color: #444;
+ font-family: 'Myriad Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ height: 100%;
+ line-height: 1.35;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ overflow: hidden;
+}
+
+#listener {
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+#rendererContainer {
+ height: 100%;
+ line-height: 0;
+ width: 100%;
+}
+
+#title-box {
+ background-color: rgba(255, 255, 255, 0.9);
+ max-width: 300px;
+ padding: 8px;
+ position: absolute;
+ -webkit-user-select: none;
+ z-index: 1000;
+}
+
+#title-box-toggle-button {
+ color: #000;
+ cursor: pointer;
+ float: right;
+ padding: 8px;
+ text-align: center;
+ transition: color 0.2s;
+}
+
+#title-box-toggle-button.open {
+ text-decoration: none;
+}
+
+#title-box-toggle-button:hover {
+ color: #888;
+}
+
+#title-box-expando {
+ clear: both;
+ overflow: hidden;
+ transition: max-height 0.6s ease-in-out;
+ max-height: 0;
+}
+
+#title-box-expando.open {
+ max-height: 800px;
+}
+
+h1 {
+ border-bottom: 1px solid #bbb;
+ color: #666;
+ font-size: 110%;
+ font-weight: 600;
+ letter-spacing: -0.05em;
+ margin: 0;
+ padding-bottom: 0.1em;
+ text-align: center;
+}
+
+h2 {
+ color: #666;
+ font-size: 100%;
+ font-weight: 600;
+ letter-spacing: -0.05em;
+ margin: 0;
+ padding-bottom: 0.1em;
+ text-align: center;
+}
+
+a {
+ color: #00A3D9;
+}
+
+.small {
+ font-size: 75%;
+}
+
+button {
+ background: #777;
+ color: #FFF;
+ width: calc(100% - 20px);
+ height: 35px;
+ border-radius: 6px;
+ border: none;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-bottom: 4px;
+ cursor: pointer;
+ text-align: center;
+ transition: background-color 0.2s ease-out;
+}
+
+button:hover {
+ background: #333;
+}
+
+#loading-cover{
+ background-color: rgba(255, 255, 255, 0.8);
+ bottom: 0;
+ display: block;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ width: 100%;
+ z-index: 1001;
+}
+
+#message {
+ bottom: 0;
+ font-size: 44px;
+ height: calc(1em + 80px); /* not perfect, but pretty close. */
+ left: 0;
+ margin: auto;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 10;
+}
+
+#statusField {
+ color: #444;
+ font-weight: 700;
+ width: 100%;
+ letter-spacing: -0.06em;
+}
+
+#progress {
+ margin: 20px auto;
+ width: 300px;
+ border-radius: 8px;
+ background: #FFF;
+ box-shadow: 0 3px 8px rgba(0,0,0,0.3);
+}
+
+.progress-bar {
+ border-radius: 8px;
+ height: 40px;
+ background: #6DD900;
+ transition: width 0.1s ease-out;
+}
diff --git a/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.html b/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.html
index f66b5009c9..6892147c46 100644
--- a/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.html
+++ b/native_client_sdk/src/gonacl_appengine/static/bullet/fullscreen.html
@@ -10,6 +10,7 @@
<title>Bullet Physics</title>
+ <link rel="stylesheet" href="fullscreen.css">
<script type="text/javascript" src="NaClAM.js"></script>
<script type="text/javascript" src="NaClAMBullet.js"></script>
<script type="text/javascript" src="//storage.googleapis.com/gonacl/pnacl-demo-bullet/three.min.js"></script>
@@ -17,161 +18,46 @@
<script type="text/javascript" src="world.js"></script>
<script type="text/javascript" src="scenes.js"></script>
- <style>
- * {
- box-sizing: border-box;
- -webkit-font-smoothing:antialiased;
- }
-
- html, body {
- background: #FAFAFA;
- color: #444;
- font-family: 'Myriad Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
- height: 100%;
- line-height: 1.35;
- margin: 0;
- padding: 0;
- width: 100%;
- overflow: hidden;
- }
-
- .intro {
- background-color: #fff;
- border: 1px solid #ccc;
- border-radius: 2px;
- box-shadow: 0 1px 1px rgba(0,0,0,0.3);
- left: 8px;
- max-width: 300px;
- position: absolute;
- top: 8px;
- z-index: 1000;
- }
-
- #listener {
- bottom: 0;
- left: 0;
- position: absolute;
- right: 0;
- top: 0;
- }
-
- #rendererContainer {
- height: 100%;
- line-height: 0;
- width: 100%;
- }
-
- h1 {
- color: #666;
- font-size: 130%;
- font-weight: 600;
- letter-spacing: -0.05em;
- margin: 0;
- text-align: center;
- }
-
- a {
- color: #00A3D9;
- }
-
- .small {
- font-size: 75%;
- }
-
- .controls {
- margin: 1em 0;
- }
-
- #controls-header {
- }
-
- #controls-header-button {
- padding-left: 20px;
- }
-
- #controls-buttons {
- }
-
- button {
- background: #777;
- color: #FFF;
- width: calc(100% - 20px);
- height: 35px;
- border-radius: 6px;
- border: none;
- margin-left: 10px;
- margin-right: 10px;
- margin-bottom: 4px;
- cursor: pointer;
- text-align: center;
- transition: background-color 0.2s ease-out;
- }
-
- button:hover {
- background: #333;
- }
-
- #loading-cover{
- display: block;
- position: fixed;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- width: 100%;
- background-color: rgba(255, 255, 255, 0.8);
- }
-
- #message {
- bottom: 0;
- font-size: 44px;
- height: calc(1em + 80px); /* not perfect, but pretty close. */
- left: 0;
- margin: auto;
- position: absolute;
- right: 0;
- text-align: center;
- top: 0;
- z-index: 10;
- }
-
- #statusField {
- color: #444;
- font-weight: 700;
- width: 100%;
- letter-spacing: -0.06em;
- }
-
- #progress {
- margin: 20px auto;
- width: 300px;
- border-radius: 8px;
- background: #FFF;
- box-shadow: 0 3px 8px rgba(0,0,0,0.3);
- }
-
- .progress-bar {
- border-radius: 8px;
- height: 40px;
- background: #6DD900;
- transition: width 0.1s ease-out;
- }
- </style>
-
+ <script type="text/javascript">
+ var expandoClosedMsg = 'more info';
+ var expandoOpenMsg = '×';
+ var expandoClosed = true;
+
+ function toggleExpando() {
+ var expandoEl = document.getElementById('title-box-expando');
+ var toggleButton = document.getElementById('title-box-toggle-button');
+ toggleButton.classList.toggle('open');
+ expandoEl.classList.toggle('open');
+ expandoClosed = !expandoClosed;
+ if (expandoClosed)
+ toggleButton.textContent = expandoClosedMsg;
+ else
+ toggleButton.textContent = expandoOpenMsg;
+ }
+ </script>
</head>
<body>
<section>
- <div class="intro">
- <div>
- <h1 class="bottom-line">Bullet Physics<br>in Portable Native Client</h1>
- </div>
-
- <div class="controls bottom-line">
- <div id="controls-header">Scenes
- <span id="controls-header-button">+</span>
- </div>
- <div id="controls-buttons" style="display: none">
+ <div id="title-box">
+ <h1>Bullet Physics in Portable Native Client</h1>
+ <span id="title-box-toggle-button" onclick="toggleExpando()"></span>
+ <script type="text/javascript">
+ var toggleButton = document.getElementById('title-box-toggle-button');
+ toggleButton.textContent = expandoClosedMsg;
+ </script>
+ <div id="title-box-expando">
+ <p>
+ <a href="http://bulletphysics.org/wordpress">Bullet Physics</a> is an
+ open-source real-time phsyics simulation.
+ </p>
+ <p>
+ <a href="https://developers.google.com/native-client/dev/">Native
+ Client</a> is a sandbox for running compiled C and C++ code in the
+ browser efficiently and securely.
+ </p>
+ <h2>Scenes</h2>
+ <div>
<div><button type="button" id="jenga10">Block Tower (10 blocks)</button></div>
<div><button type="button" id="jenga20">Block Tower (20 blocks)</button></div>
<div><button type="button" id="randomCube250">Random Cubes (250)</button></div>
@@ -181,17 +67,11 @@
<div><button type="button" id="randomShapes">Random Shapes</button></div>
<div><button type="button" id="reload">Reload Scene</button></div>
</div>
- </div>
-
- <div>
- Curious about Native Client?<br>
- Get Started <a href="https://developers.google.com/native_client/dev">here</a>.
- </div>
-
- <div class="small" style="display: none">
- Simulation Time: <span id="simulationTime">0</span>&mu;s
- <br>
- FPS: <span id="fps">0</span>
+ <p class="small">
+ Simulation Time: <span id="simulationTime">0</span>&mu;s
+ <br>
+ FPS: <span id="fps">0</span>
+ </p>
</div>
</div>
diff --git a/native_client_sdk/src/libraries/gmock/library.dsc b/native_client_sdk/src/libraries/gmock/library.dsc
index 1f4c9421d9..ff42a8762f 100644
--- a/native_client_sdk/src/libraries/gmock/library.dsc
+++ b/native_client_sdk/src/libraries/gmock/library.dsc
@@ -1,5 +1,5 @@
{
- 'TOOLS': ['newlib', 'glibc', 'pnacl', 'linux', 'win'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'pnacl', 'linux', 'win'],
'SEARCH': [
'../../../../testing/gmock/include/gmock',
'../../../../testing/gmock/include/gmock/internal',
diff --git a/native_client_sdk/src/libraries/gtest/library.dsc b/native_client_sdk/src/libraries/gtest/library.dsc
index d0d6d0d075..dd4ee37b8c 100644
--- a/native_client_sdk/src/libraries/gtest/library.dsc
+++ b/native_client_sdk/src/libraries/gtest/library.dsc
@@ -1,5 +1,5 @@
{
- 'TOOLS': ['newlib', 'glibc', 'pnacl', 'win', 'linux'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'pnacl', 'win', 'linux'],
'SEARCH': [
'.',
'../../../../testing/gtest/include/gtest',
@@ -25,6 +25,7 @@
# See comment below about gtest-internal-inl.h
'$(NACL_SDK_ROOT)/include/gtest/internal',
],
+ 'CXXFLAGS': ['-Wno-unused-const-variable'],
}
],
'HEADERS': [
diff --git a/native_client_sdk/src/libraries/jsoncpp/library.dsc b/native_client_sdk/src/libraries/jsoncpp/library.dsc
index 9ccc237b44..26f506a96f 100644
--- a/native_client_sdk/src/libraries/jsoncpp/library.dsc
+++ b/native_client_sdk/src/libraries/jsoncpp/library.dsc
@@ -1,5 +1,5 @@
{
- 'TOOLS': ['newlib', 'glibc', 'pnacl', 'linux', 'win'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'pnacl', 'linux', 'win'],
'SEARCH': [
'../../../../third_party/jsoncpp/overrides/include/json',
'../../../../third_party/jsoncpp/overrides/src/lib_json',
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc
index caadbd5488..aca1ef372d 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc
@@ -4,16 +4,15 @@
#include "nacl_io/kernel_intercept.h"
+#include <assert.h>
#include <errno.h>
#include <string.h>
-#include "nacl_io/dbgprint.h"
#include "nacl_io/kernel_proxy.h"
#include "nacl_io/kernel_wrap.h"
#include "nacl_io/osmman.h"
#include "nacl_io/ossocket.h"
#include "nacl_io/pepper_interface.h"
-#include "nacl_io/pepper_interface.h"
#include "nacl_io/real_pepper_interface.h"
using namespace nacl_io;
@@ -24,59 +23,98 @@ using namespace nacl_io;
return x; \
}
-static KernelProxy* s_kp;
-static bool s_kp_owned;
+struct KernelInterceptState {
+ KernelProxy* kp;
+ bool kp_owned;
+};
+
+static KernelInterceptState s_state;
+
+// The the test code we want to be able to save the previous kernel
+// proxy when intialising and restore it on uninit.
+static KernelInterceptState s_saved_state;
+
+int ki_push_state_for_testing() {
+ assert(s_saved_state.kp == NULL);
+ if (s_saved_state.kp != NULL)
+ return 1;
+ s_saved_state = s_state;
+ s_state.kp = NULL;
+ s_state.kp_owned = false;
+ return 0;
+}
-void ki_init(void* kp) {
- ki_init_ppapi(kp, 0, NULL);
+int ki_init(void* kp) {
+ return ki_init_ppapi(kp, 0, NULL);
}
-void ki_init_ppapi(void* kp,
+int ki_init_ppapi(void* kp,
PP_Instance instance,
PPB_GetInterface get_browser_interface) {
+ assert(!s_state.kp);
+ if (s_state.kp != NULL)
+ return 1;
PepperInterface* ppapi = NULL;
if (instance && get_browser_interface)
ppapi = new RealPepperInterface(instance, get_browser_interface);
- ki_init_interface(kp, ppapi);
+ return ki_init_interface(kp, ppapi);
}
-void ki_init_interface(void* kp, void* pepper_interface) {
+int ki_init_interface(void* kp, void* pepper_interface) {
+ assert(!s_state.kp);
+ if (s_state.kp != NULL)
+ return 1;
PepperInterface* ppapi = static_cast<PepperInterface*>(pepper_interface);
kernel_wrap_init();
if (kp == NULL) {
- s_kp = new KernelProxy();
- s_kp_owned = true;
+ s_state.kp = new KernelProxy();
+ s_state.kp_owned = true;
} else {
- s_kp = static_cast<KernelProxy*>(kp);
- s_kp_owned = false;
+ s_state.kp = static_cast<KernelProxy*>(kp);
+ s_state.kp_owned = false;
}
- s_kp->Init(ppapi);
+ if (s_state.kp->Init(ppapi) != 0)
+ return 1;
+
+ return 0;
}
int ki_register_fs_type(const char* fs_type, struct fuse_operations* fuse_ops) {
- return s_kp->RegisterFsType(fs_type, fuse_ops);
+ return s_state.kp->RegisterFsType(fs_type, fuse_ops);
}
int ki_unregister_fs_type(const char* fs_type) {
- return s_kp->UnregisterFsType(fs_type);
+ return s_state.kp->UnregisterFsType(fs_type);
}
int ki_is_initialized() {
- return s_kp != NULL;
+ return s_state.kp != NULL;
}
void ki_uninit() {
- kernel_wrap_uninit();
- if (s_kp_owned)
- delete s_kp;
- s_kp = NULL;
+ if (s_saved_state.kp == NULL)
+ kernel_wrap_uninit();
+
+ // If we are going to delete the KernelProxy don't do it
+ // until we've swapped it out.
+ KernelProxy* delete_kp = s_state.kp_owned ? s_state.kp : NULL;
+
+ // Swap out the KernelProxy. This will normally reset the
+ // proxy to NULL, aside from in test code that has called
+ // ki_push_state_for_testing().
+ s_state = s_saved_state;
+ s_saved_state.kp = NULL;
+ s_saved_state.kp_owned = false;
+
+ if (delete_kp)
+ delete delete_kp;
}
int ki_chdir(const char* path) {
ON_NOSYS_RETURN(-1);
- return s_kp->chdir(path);
+ return s_state.kp->chdir(path);
}
char* ki_getcwd(char* buf, size_t size) {
@@ -91,248 +129,248 @@ char* ki_getcwd(char* buf, size_t size) {
buf[1] = 0;
return buf;
}
- return s_kp->getcwd(buf, size);
+ return s_state.kp->getcwd(buf, size);
}
char* ki_getwd(char* buf) {
ON_NOSYS_RETURN(NULL);
- return s_kp->getwd(buf);
+ return s_state.kp->getwd(buf);
}
int ki_dup(int oldfd) {
ON_NOSYS_RETURN(-1);
- return s_kp->dup(oldfd);
+ return s_state.kp->dup(oldfd);
}
int ki_dup2(int oldfd, int newfd) {
ON_NOSYS_RETURN(-1);
- return s_kp->dup2(oldfd, newfd);
+ return s_state.kp->dup2(oldfd, newfd);
}
int ki_chmod(const char *path, mode_t mode) {
ON_NOSYS_RETURN(-1);
- return s_kp->chmod(path, mode);
+ return s_state.kp->chmod(path, mode);
}
int ki_fchdir(int fd) {
ON_NOSYS_RETURN(-1);
- return s_kp->fchdir(fd);
+ return s_state.kp->fchdir(fd);
}
int ki_fchmod(int fd, mode_t mode) {
ON_NOSYS_RETURN(-1);
- return s_kp->fchmod(fd, mode);
+ return s_state.kp->fchmod(fd, mode);
}
int ki_stat(const char *path, struct stat *buf) {
ON_NOSYS_RETURN(-1);
- return s_kp->stat(path, buf);
+ return s_state.kp->stat(path, buf);
}
int ki_mkdir(const char *path, mode_t mode) {
ON_NOSYS_RETURN(-1);
- return s_kp->mkdir(path, mode);
+ return s_state.kp->mkdir(path, mode);
}
int ki_rmdir(const char *path) {
ON_NOSYS_RETURN(-1);
- return s_kp->rmdir(path);
+ return s_state.kp->rmdir(path);
}
int ki_mount(const char *source, const char *target, const char *filesystemtype,
unsigned long mountflags, const void *data) {
ON_NOSYS_RETURN(-1);
- return s_kp->mount(source, target, filesystemtype, mountflags, data);
+ return s_state.kp->mount(source, target, filesystemtype, mountflags, data);
}
int ki_umount(const char *path) {
ON_NOSYS_RETURN(-1);
- return s_kp->umount(path);
+ return s_state.kp->umount(path);
}
int ki_open(const char *path, int oflag) {
ON_NOSYS_RETURN(-1);
- return s_kp->open(path, oflag);
+ return s_state.kp->open(path, oflag);
}
int ki_pipe(int pipefds[2]) {
ON_NOSYS_RETURN(-1);
- return s_kp->pipe(pipefds);
+ return s_state.kp->pipe(pipefds);
}
ssize_t ki_read(int fd, void *buf, size_t nbyte) {
ON_NOSYS_RETURN(-1);
- return s_kp->read(fd, buf, nbyte);
+ return s_state.kp->read(fd, buf, nbyte);
}
ssize_t ki_write(int fd, const void *buf, size_t nbyte) {
ON_NOSYS_RETURN(-1);
- return s_kp->write(fd, buf, nbyte);
+ return s_state.kp->write(fd, buf, nbyte);
}
int ki_fstat(int fd, struct stat *buf){
ON_NOSYS_RETURN(-1);
- return s_kp->fstat(fd, buf);
+ return s_state.kp->fstat(fd, buf);
}
int ki_getdents(int fd, void *buf, unsigned int count) {
ON_NOSYS_RETURN(-1);
- return s_kp->getdents(fd, buf, count);
+ return s_state.kp->getdents(fd, buf, count);
}
int ki_ftruncate(int fd, off_t length) {
ON_NOSYS_RETURN(-1);
- return s_kp->ftruncate(fd, length);
+ return s_state.kp->ftruncate(fd, length);
}
int ki_fsync(int fd) {
ON_NOSYS_RETURN(-1);
- return s_kp->fsync(fd);
+ return s_state.kp->fsync(fd);
}
int ki_fdatasync(int fd) {
ON_NOSYS_RETURN(-1);
- return s_kp->fdatasync(fd);
+ return s_state.kp->fdatasync(fd);
}
int ki_isatty(int fd) {
ON_NOSYS_RETURN(0);
- return s_kp->isatty(fd);
+ return s_state.kp->isatty(fd);
}
int ki_close(int fd) {
ON_NOSYS_RETURN(-1);
- return s_kp->close(fd);
+ return s_state.kp->close(fd);
}
off_t ki_lseek(int fd, off_t offset, int whence) {
ON_NOSYS_RETURN(-1);
- return s_kp->lseek(fd, offset, whence);
+ return s_state.kp->lseek(fd, offset, whence);
}
int ki_remove(const char* path) {
ON_NOSYS_RETURN(-1);
- return s_kp->remove(path);
+ return s_state.kp->remove(path);
}
int ki_unlink(const char* path) {
ON_NOSYS_RETURN(-1);
- return s_kp->unlink(path);
+ return s_state.kp->unlink(path);
}
int ki_truncate(const char* path, off_t length) {
ON_NOSYS_RETURN(-1);
- return s_kp->truncate(path, length);
+ return s_state.kp->truncate(path, length);
}
int ki_lstat(const char* path, struct stat* buf) {
ON_NOSYS_RETURN(-1);
- return s_kp->lstat(path, buf);
+ return s_state.kp->lstat(path, buf);
}
int ki_link(const char* oldpath, const char* newpath) {
ON_NOSYS_RETURN(-1);
- return s_kp->link(oldpath, newpath);
+ return s_state.kp->link(oldpath, newpath);
}
int ki_rename(const char* path, const char* newpath) {
ON_NOSYS_RETURN(-1);
- return s_kp->rename(path, newpath);
+ return s_state.kp->rename(path, newpath);
}
int ki_symlink(const char* oldpath, const char* newpath) {
ON_NOSYS_RETURN(-1);
- return s_kp->symlink(oldpath, newpath);
+ return s_state.kp->symlink(oldpath, newpath);
}
int ki_access(const char* path, int amode) {
ON_NOSYS_RETURN(-1);
- return s_kp->access(path, amode);
+ return s_state.kp->access(path, amode);
}
int ki_readlink(const char *path, char *buf, size_t count) {
ON_NOSYS_RETURN(-1);
- return s_kp->readlink(path, buf, count);
+ return s_state.kp->readlink(path, buf, count);
}
int ki_utimes(const char *path, const struct timeval times[2]) {
ON_NOSYS_RETURN(-1);
- return s_kp->utimes(path, times);
+ return s_state.kp->utimes(path, times);
}
void* ki_mmap(void* addr, size_t length, int prot, int flags, int fd,
off_t offset) {
ON_NOSYS_RETURN(MAP_FAILED);
- return s_kp->mmap(addr, length, prot, flags, fd, offset);
+ return s_state.kp->mmap(addr, length, prot, flags, fd, offset);
}
int ki_munmap(void* addr, size_t length) {
ON_NOSYS_RETURN(-1);
- return s_kp->munmap(addr, length);
+ return s_state.kp->munmap(addr, length);
}
int ki_open_resource(const char* file) {
- ON_NOSYS_RETURN(-1); return s_kp->open_resource(file);
+ ON_NOSYS_RETURN(-1); return s_state.kp->open_resource(file);
}
int ki_fcntl(int d, int request, va_list args) {
ON_NOSYS_RETURN(-1);
- return s_kp->fcntl(d, request, args);
+ return s_state.kp->fcntl(d, request, args);
}
int ki_ioctl(int d, int request, va_list args) {
ON_NOSYS_RETURN(-1);
- return s_kp->ioctl(d, request, args);
+ return s_state.kp->ioctl(d, request, args);
}
int ki_chown(const char* path, uid_t owner, gid_t group) {
ON_NOSYS_RETURN(-1);
- return s_kp->chown(path, owner, group);
+ return s_state.kp->chown(path, owner, group);
}
int ki_fchown(int fd, uid_t owner, gid_t group) {
ON_NOSYS_RETURN(-1);
- return s_kp->fchown(fd, owner, group);
+ return s_state.kp->fchown(fd, owner, group);
}
int ki_lchown(const char* path, uid_t owner, gid_t group) {
ON_NOSYS_RETURN(-1);
- return s_kp->lchown(path, owner, group);
+ return s_state.kp->lchown(path, owner, group);
}
int ki_utime(const char* filename, const struct utimbuf* times) {
ON_NOSYS_RETURN(-1);
- return s_kp->utime(filename, times);
+ return s_state.kp->utime(filename, times);
}
int ki_poll(struct pollfd *fds, nfds_t nfds, int timeout) {
- return s_kp->poll(fds, nfds, timeout);
+ return s_state.kp->poll(fds, nfds, timeout);
}
int ki_select(int nfds, fd_set* readfds, fd_set* writefds,
fd_set* exceptfds, struct timeval* timeout) {
- return s_kp->select(nfds, readfds, writefds, exceptfds, timeout);
+ return s_state.kp->select(nfds, readfds, writefds, exceptfds, timeout);
}
int ki_tcflush(int fd, int queue_selector) {
ON_NOSYS_RETURN(-1);
- return s_kp->tcflush(fd, queue_selector);
+ return s_state.kp->tcflush(fd, queue_selector);
}
int ki_tcgetattr(int fd, struct termios* termios_p) {
ON_NOSYS_RETURN(-1);
- return s_kp->tcgetattr(fd, termios_p);
+ return s_state.kp->tcgetattr(fd, termios_p);
}
int ki_tcsetattr(int fd, int optional_actions,
const struct termios *termios_p) {
ON_NOSYS_RETURN(-1);
- return s_kp->tcsetattr(fd, optional_actions, termios_p);
+ return s_state.kp->tcsetattr(fd, optional_actions, termios_p);
}
int ki_kill(pid_t pid, int sig) {
ON_NOSYS_RETURN(-1);
- return s_kp->kill(pid, sig);
+ return s_state.kp->kill(pid, sig);
}
int ki_killpg(pid_t pid, int sig) {
@@ -343,7 +381,7 @@ int ki_killpg(pid_t pid, int sig) {
int ki_sigaction(int signum, const struct sigaction* action,
struct sigaction* oaction) {
ON_NOSYS_RETURN(-1);
- return s_kp->sigaction(signum, action, oaction);
+ return s_state.kp->sigaction(signum, action, oaction);
}
int ki_sigpause(int sigmask) {
@@ -373,7 +411,7 @@ sighandler_t ki_sigset(int signum, sighandler_t handler) {
memset(&action, 0, sizeof(action));
memset(&oaction, 0, sizeof(oaction));
action.sa_handler = handler;
- int rtn = s_kp->sigaction(signum, &action, &oaction);
+ int rtn = s_state.kp->sigaction(signum, &action, &oaction);
if (rtn)
return SIG_ERR;
return oaction.sa_handler;
@@ -383,105 +421,105 @@ sighandler_t ki_sigset(int signum, sighandler_t handler) {
// Socket Functions
int ki_accept(int fd, struct sockaddr* addr, socklen_t* len) {
ON_NOSYS_RETURN(-1);
- return s_kp->accept(fd, addr, len);
+ return s_state.kp->accept(fd, addr, len);
}
int ki_bind(int fd, const struct sockaddr* addr, socklen_t len) {
ON_NOSYS_RETURN(-1);
- return s_kp->bind(fd, addr, len);
+ return s_state.kp->bind(fd, addr, len);
}
int ki_connect(int fd, const struct sockaddr* addr, socklen_t len) {
ON_NOSYS_RETURN(-1);
- return s_kp->connect(fd, addr, len);
+ return s_state.kp->connect(fd, addr, len);
}
struct hostent* ki_gethostbyname(const char* name) {
ON_NOSYS_RETURN(NULL);
- return s_kp->gethostbyname(name);
+ return s_state.kp->gethostbyname(name);
}
int ki_getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res) {
ON_NOSYS_RETURN(EAI_SYSTEM);
- return s_kp->getaddrinfo(node, service, hints, res);
+ return s_state.kp->getaddrinfo(node, service, hints, res);
}
void ki_freeaddrinfo(struct addrinfo *res) {
- s_kp->freeaddrinfo(res);
+ s_state.kp->freeaddrinfo(res);
}
int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len) {
ON_NOSYS_RETURN(-1);
- return s_kp->getpeername(fd, addr, len);
+ return s_state.kp->getpeername(fd, addr, len);
}
int ki_getsockname(int fd, struct sockaddr* addr, socklen_t* len) {
ON_NOSYS_RETURN(-1);
- return s_kp->getsockname(fd, addr, len);
+ return s_state.kp->getsockname(fd, addr, len);
}
int ki_getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len) {
ON_NOSYS_RETURN(-1);
- return s_kp->getsockopt(fd, lvl, optname, optval, len);
+ return s_state.kp->getsockopt(fd, lvl, optname, optval, len);
}
int ki_listen(int fd, int backlog) {
ON_NOSYS_RETURN(-1);
- return s_kp->listen(fd, backlog);
+ return s_state.kp->listen(fd, backlog);
}
ssize_t ki_recv(int fd, void* buf, size_t len, int flags) {
ON_NOSYS_RETURN(-1);
- return s_kp->recv(fd, buf, len, flags);
+ return s_state.kp->recv(fd, buf, len, flags);
}
ssize_t ki_recvfrom(int fd, void* buf, size_t len, int flags,
struct sockaddr* addr, socklen_t* addrlen) {
ON_NOSYS_RETURN(-1);
- return s_kp->recvfrom(fd, buf, len, flags, addr, addrlen);
+ return s_state.kp->recvfrom(fd, buf, len, flags, addr, addrlen);
}
ssize_t ki_recvmsg(int fd, struct msghdr* msg, int flags) {
ON_NOSYS_RETURN(-1);
- return s_kp->recvmsg(fd, msg, flags);
+ return s_state.kp->recvmsg(fd, msg, flags);
}
ssize_t ki_send(int fd, const void* buf, size_t len, int flags) {
ON_NOSYS_RETURN(-1);
- return s_kp->send(fd, buf, len, flags);
+ return s_state.kp->send(fd, buf, len, flags);
}
ssize_t ki_sendto(int fd, const void* buf, size_t len, int flags,
const struct sockaddr* addr, socklen_t addrlen) {
ON_NOSYS_RETURN(-1);
- return s_kp->sendto(fd, buf, len, flags, addr, addrlen);
+ return s_state.kp->sendto(fd, buf, len, flags, addr, addrlen);
}
ssize_t ki_sendmsg(int fd, const struct msghdr* msg, int flags) {
ON_NOSYS_RETURN(-1);
- return s_kp->sendmsg(fd, msg, flags);
+ return s_state.kp->sendmsg(fd, msg, flags);
}
int ki_setsockopt(int fd, int lvl, int optname, const void* optval,
socklen_t len) {
ON_NOSYS_RETURN(-1);
- return s_kp->setsockopt(fd, lvl, optname, optval, len);
+ return s_state.kp->setsockopt(fd, lvl, optname, optval, len);
}
int ki_shutdown(int fd, int how) {
ON_NOSYS_RETURN(-1);
- return s_kp->shutdown(fd, how);
+ return s_state.kp->shutdown(fd, how);
}
int ki_socket(int domain, int type, int protocol) {
ON_NOSYS_RETURN(-1);
- return s_kp->socket(domain, type, protocol);
+ return s_state.kp->socket(domain, type, protocol);
}
int ki_socketpair(int domain, int type, int protocol, int* sv) {
ON_NOSYS_RETURN(-1);
- return s_kp->socketpair(domain, type, protocol, sv);
+ return s_state.kp->socketpair(domain, type, protocol, sv);
}
#endif // PROVIDES_SOCKET_API
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h
index 2092022dea..bcf86b25a9 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h
@@ -33,17 +33,26 @@ struct fuse_operations;
* with NULL will instantiate a default kernel proxy object. ki_init must
* be called before any other ki_XXX function can be used.
*/
-void ki_init(void* kernel_proxy);
-void ki_init_ppapi(void* kernel_proxy,
- PP_Instance instance,
- PPB_GetInterface get_browser_interface);
+int ki_init(void* kernel_proxy);
+
+/*
+ * Saves the current internal state. This is used by test code which can
+ * use this to save the current state before calling ki_init(). The
+ * pushed state is restored in the next call to ki_uninit().
+ */
+int ki_push_state_for_testing();
+
+int ki_init_ppapi(void* kernel_proxy,
+ PP_Instance instance,
+ PPB_GetInterface get_browser_interface);
+
/*
* ki_init_interface() is a variant of ki_init() that can be called with
* a PepperInterface object. The ownership of this object then passes
* to nacl_io and it will be deleted on ki_uninit().
*/
-void ki_init_interface(void* kp, void* pepper_interface);
+int ki_init_interface(void* kernel_proxy, void* pepper_interface);
int ki_register_fs_type(const char* fs_type, struct fuse_operations* fuse_ops);
int ki_unregister_fs_type(const char* fs_type);
diff --git a/native_client_sdk/src/libraries/ppapi/library.dsc b/native_client_sdk/src/libraries/ppapi/library.dsc
index 04fa67d1fc..3f7295ed6e 100644
--- a/native_client_sdk/src/libraries/ppapi/library.dsc
+++ b/native_client_sdk/src/libraries/ppapi/library.dsc
@@ -92,31 +92,17 @@
'FILES': [
'deprecated_bool.h',
'ppb_alarms_dev.h',
- 'ppb_audio_input_dev.h',
- 'ppb_buffer_dev.h',
- 'ppb_char_set_dev.h',
- 'ppb_crypto_dev.h',
'ppb_cursor_control_dev.h',
- 'ppb_device_ref_dev.h',
'ppb_file_chooser_dev.h',
'ppb_find_dev.h',
'ppb_font_dev.h',
- 'ppb_gles_chromium_texture_mapping_dev.h',
- 'ppb_graphics_2d_dev.h',
- 'ppb_ime_input_event_dev.h',
'ppb_memory_dev.h',
'ppb_opengles2ext_dev.h',
'ppb_printing_dev.h',
- 'ppb_scrollbar_dev.h',
- 'ppb_text_input_dev.h',
'ppb_trace_event_dev.h',
'ppb_truetype_font_dev.h',
- 'ppb_url_util_dev.h',
'ppb_var_deprecated.h',
- 'ppb_video_capture_dev.h',
- 'ppb_video_decoder_dev.h',
'ppb_view_dev.h',
- 'ppb_widget_dev.h',
'ppb_zoom_dev.h',
'pp_cursor_type_dev.h',
'pp_optional_structs_dev.h',
@@ -128,12 +114,7 @@
'ppp_scrollbar_dev.h',
'ppp_selection_dev.h',
'ppp_text_input_dev.h',
- 'ppp_video_capture_dev.h',
- 'ppp_video_decoder_dev.h',
- 'ppp_widget_dev.h',
'ppp_zoom_dev.h',
- 'pp_video_capture_dev.h',
- 'pp_video_dev.h',
],
'DEST': 'include/ppapi/c/dev',
},
diff --git a/native_client_sdk/src/libraries/ppapi_cpp/library.dsc b/native_client_sdk/src/libraries/ppapi_cpp/library.dsc
index 2722c40709..ca0c06f44f 100644
--- a/native_client_sdk/src/libraries/ppapi_cpp/library.dsc
+++ b/native_client_sdk/src/libraries/ppapi_cpp/library.dsc
@@ -1,5 +1,5 @@
{
- 'TOOLS': ['newlib', 'glibc', 'pnacl', 'win', 'linux'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'pnacl', 'win', 'linux'],
'SEARCH': [
'../../../../ppapi/cpp',
'../../../../ppapi/cpp/dev',
@@ -63,33 +63,18 @@
# ppapi/cpp/dev
'alarms_dev.cc',
- 'widget_client_dev.cc',
- 'video_capture_client_dev.cc',
- 'video_decoder_client_dev.cc',
- 'crypto_dev.cc',
- 'selection_dev.cc',
- 'buffer_dev.cc',
- 'url_util_dev.cc',
- 'video_capture_dev.cc',
- 'zoom_dev.cc',
- 'ime_input_event_dev.cc',
- 'text_input_dev.cc',
- 'font_dev.cc',
+ 'cursor_control_dev.cc',
+ 'file_chooser_dev.cc',
'find_dev.cc',
- 'view_dev.cc',
+ 'font_dev.cc',
'memory_dev.cc',
- 'truetype_font_dev.cc',
- 'file_chooser_dev.cc',
- 'video_decoder_dev.cc',
- 'cursor_control_dev.cc',
- 'device_ref_dev.cc',
'printing_dev.cc',
'scriptable_object_deprecated.cc',
- 'audio_input_dev.cc',
- 'scrollbar_dev.cc',
+ 'selection_dev.cc',
'string_wrapper_dev.cc',
- 'graphics_2d_dev.cc',
- 'widget_dev.cc',
+ 'truetype_font_dev.cc',
+ 'view_dev.cc',
+ 'zoom_dev.cc',
# ppapi/cpp/extensions/dev
'socket_dev.cc',
@@ -169,36 +154,24 @@
'FILES': [
'alarms_dev.h',
'array_dev.h',
- 'audio_input_dev.h',
- 'buffer_dev.h',
- 'crypto_dev.h',
'cursor_control_dev.h',
- 'device_ref_dev.h',
'file_chooser_dev.h',
'find_dev.h',
'font_dev.h',
- 'graphics_2d_dev.h',
- 'ime_input_event_dev.h',
'may_own_ptr_dev.h',
'memory_dev.h',
'optional_dev.h',
'printing_dev.h',
'scriptable_object_deprecated.h',
- 'scrollbar_dev.h',
'selection_dev.h',
'string_wrapper_dev.h',
'struct_wrapper_output_traits_dev.h',
- 'text_input_dev.h',
'to_c_type_converter_dev.h',
'truetype_font_dev.h',
- 'url_util_dev.h',
'video_capture_client_dev.h',
- 'video_capture_dev.h',
'video_decoder_client_dev.h',
- 'video_decoder_dev.h',
'view_dev.h',
'widget_client_dev.h',
- 'widget_dev.h',
'zoom_dev.h',
],
'DEST': 'include/ppapi/cpp/dev',
diff --git a/native_client_sdk/src/libraries/ppapi_gles2/library.dsc b/native_client_sdk/src/libraries/ppapi_gles2/library.dsc
index bddf8c66b1..6b8b21e29b 100644
--- a/native_client_sdk/src/libraries/ppapi_gles2/library.dsc
+++ b/native_client_sdk/src/libraries/ppapi_gles2/library.dsc
@@ -1,5 +1,5 @@
{
- 'TOOLS': ['newlib', 'glibc', 'pnacl', 'linux', 'win'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'pnacl', 'linux', 'win'],
'SEARCH' : [
'../../../../ppapi/lib/gl/gles2',
'../../../../ppapi/lib/gl/include/EGL',
diff --git a/native_client_sdk/src/libraries/sdk_util/library.dsc b/native_client_sdk/src/libraries/sdk_util/library.dsc
index 7d14db1c47..4066d5bcb7 100644
--- a/native_client_sdk/src/libraries/sdk_util/library.dsc
+++ b/native_client_sdk/src/libraries/sdk_util/library.dsc
@@ -1,5 +1,5 @@
{
- 'TOOLS': ['newlib', 'glibc', 'pnacl', 'win'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'pnacl', 'win'],
'TARGETS': [
{
'NAME' : 'sdk_util',
diff --git a/native_client_sdk/src/libraries/zlib/library.dsc b/native_client_sdk/src/libraries/zlib/library.dsc
index 035479941b..d7409e9730 100644
--- a/native_client_sdk/src/libraries/zlib/library.dsc
+++ b/native_client_sdk/src/libraries/zlib/library.dsc
@@ -1,6 +1,6 @@
{
'DISABLE': True,
- 'TOOLS': ['newlib', 'glibc', 'linux', 'win'],
+ 'TOOLS': ['bionic', 'newlib', 'glibc', 'linux', 'win'],
'SEARCH': [
'../../../../third_party/zlib',
],
diff --git a/native_client_sdk/src/resources/Makefile.library.template b/native_client_sdk/src/resources/Makefile.library.template
index da4e67aedd..266642b8a4 100644
--- a/native_client_sdk/src/resources/Makefile.library.template
+++ b/native_client_sdk/src/resources/Makefile.library.template
@@ -63,7 +63,7 @@ $(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS))))
$(eval $(call LIB_RULE,$(TARGET),$(SOURCES)))
[[if target['TYPE'] != 'static-lib':]]
-ifeq ($(TOOLCHAIN),glibc)
+ifneq (,$(findstring $(TOOLCHAIN),glibc bionic))
$(eval $(call SO_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS)))
endif
[[]]
diff --git a/native_client_sdk/src/test_all.py b/native_client_sdk/src/test_all.py
index 6e433e7c0b..c91e64e59c 100755
--- a/native_client_sdk/src/test_all.py
+++ b/native_client_sdk/src/test_all.py
@@ -10,14 +10,17 @@ import unittest
# add tools folder to sys.path
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.join(SCRIPT_DIR, 'tools', 'tests'))
+sys.path.append(os.path.join(SCRIPT_DIR, 'tools', 'lib', 'tests'))
sys.path.append(os.path.join(SCRIPT_DIR, 'build_tools', 'tests'))
TEST_MODULES = [
'create_html_test',
'create_nmf_test',
'easy_template_test',
+ 'elf_test',
'fix_deps_test',
'getos_test',
+ 'get_shared_deps_test',
'httpd_test',
'nacl_config_test',
'oshelpers_test',
diff --git a/native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc b/native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc
index 84aa65d1e5..bacf6a8b31 100644
--- a/native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc
@@ -317,7 +317,8 @@ class KernelProxyFuseTest : public ::testing::Test {
};
void KernelProxyFuseTest::SetUp() {
- ki_init(&kp_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
// Register a fuse filesystem.
ki_register_fs_type("flatfs", &g_fuse_operations);
diff --git a/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc b/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc
index c3dceb0d5c..642ffd17fd 100644
--- a/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc
@@ -21,7 +21,8 @@ class HostResolverTest : public ::testing::Test {
HostResolverTest() {}
void SetUp() {
- ki_init(NULL);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(NULL));
}
void TearDown() {
@@ -45,7 +46,8 @@ class FakeHostResolverTest : public ::testing::Test {
fake_resolver_->fake_hostname = FAKE_HOSTNAME;
AddFakeAddress(AF_INET);
- ki_init_interface(NULL, pepper_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init_interface(NULL, pepper_));
}
void AddFakeAddress(int family) {
diff --git a/native_client_sdk/src/tests/nacl_io_test/jspipe_test.cc b/native_client_sdk/src/tests/nacl_io_test/jspipe_test.cc
index cd0d1d2828..63872be489 100644
--- a/native_client_sdk/src/tests/nacl_io_test/jspipe_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/jspipe_test.cc
@@ -28,7 +28,8 @@ namespace {
class JSPipeTest : public ::testing::Test {
public:
void SetUp() {
- ki_init(&kp_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
ASSERT_EQ(0, fs_.Access(Path("/jspipe1"), R_OK | W_OK));
ASSERT_EQ(EACCES, fs_.Access(Path("/jspipe1"), X_OK));
ASSERT_EQ(0, fs_.Open(Path("/jspipe1"), O_RDWR, &pipe_dev_));
diff --git a/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc b/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc
index b0790f2d26..bbd7c8201e 100644
--- a/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc
@@ -55,7 +55,8 @@ class KernelProxyTest : public ::testing::Test {
KernelProxyTest() {}
void SetUp() {
- ki_init(&kp_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
// Unmount the passthrough FS and mount a memfs.
EXPECT_EQ(0, kp_.umount("/"));
EXPECT_EQ(0, kp_.mount("", "/", "memfs", 0, NULL));
@@ -559,7 +560,10 @@ class KernelProxyMountTest : public ::testing::Test {
public:
KernelProxyMountTest() {}
- void SetUp() { ki_init(&kp_); }
+ void SetUp() {
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
+ }
void TearDown() { ki_uninit(); }
@@ -653,7 +657,10 @@ class KernelProxyMMapTest : public ::testing::Test {
public:
KernelProxyMMapTest() {}
- void SetUp() { ki_init(&kp_); }
+ void SetUp() {
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
+ }
void TearDown() { ki_uninit(); }
@@ -728,7 +735,8 @@ class KernelProxyErrorTest : public ::testing::Test {
KernelProxyErrorTest() {}
void SetUp() {
- ki_init(&kp_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
// Unmount the passthrough FS and mount a testfs.
EXPECT_EQ(0, kp_.umount("/"));
EXPECT_EQ(0, kp_.mount("", "/", "testfs", 0, NULL));
diff --git a/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc b/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc
index 1ba70ca9da..dd8417f530 100644
--- a/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc
@@ -118,10 +118,16 @@ class KernelWrapTest : public ::testing::Test {
.WillOnce(Return(0))
.WillOnce(Return(0));
- ki_init(&mock);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&mock));
+ }
+
+ void TearDown() {
+ // Uninitialize the kernel proxy so wrapped functions passthrough to their
+ // unwrapped versions.
+ ki_uninit();
}
- virtual void TearDown() { ki_uninit(); }
MockKernelProxy mock;
};
diff --git a/native_client_sdk/src/tests/nacl_io_test/mock_kernel_proxy.cc b/native_client_sdk/src/tests/nacl_io_test/mock_kernel_proxy.cc
index d7da8188ee..7aaeb43d87 100644
--- a/native_client_sdk/src/tests/nacl_io_test/mock_kernel_proxy.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/mock_kernel_proxy.cc
@@ -7,8 +7,4 @@
MockKernelProxy::MockKernelProxy() {}
-MockKernelProxy::~MockKernelProxy() {
- // Uninitialize the kernel proxy so wrapped functions passthrough to their
- // unwrapped versions.
- ki_uninit();
-}
+MockKernelProxy::~MockKernelProxy() {}
diff --git a/native_client_sdk/src/tests/nacl_io_test/socket_test.cc b/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
index 3b0eab30c9..0947e391bb 100644
--- a/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
@@ -32,7 +32,8 @@ class SocketTest : public ::testing::Test {
SocketTest() {}
void SetUp() {
- ki_init(&kp_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
}
void TearDown() {
diff --git a/native_client_sdk/src/tests/nacl_io_test/tty_test.cc b/native_client_sdk/src/tests/nacl_io_test/tty_test.cc
index 80f6645bf9..de9e978170 100644
--- a/native_client_sdk/src/tests/nacl_io_test/tty_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/tty_test.cc
@@ -27,7 +27,8 @@ namespace {
class TtyTest : public ::testing::Test {
public:
void SetUp() {
- ki_init(&kp_);
+ ASSERT_EQ(0, ki_push_state_for_testing());
+ ASSERT_EQ(0, ki_init(&kp_));
ASSERT_EQ(0, fs_.Access(Path("/tty"), R_OK | W_OK));
ASSERT_EQ(EACCES, fs_.Access(Path("/tty"), X_OK));
ASSERT_EQ(0, fs_.Open(Path("/tty"), O_RDWR, &dev_tty_));
diff --git a/native_client_sdk/src/tools/common.mk b/native_client_sdk/src/tools/common.mk
index b90fbafec0..b491631ae4 100644
--- a/native_client_sdk/src/tools/common.mk
+++ b/native_client_sdk/src/tools/common.mk
@@ -14,9 +14,13 @@
# your project only builds in one or the other then this should be overridden
# accordingly.
#
-VALID_TOOLCHAINS ?= pnacl newlib glibc
-TOOLCHAIN ?= $(word 1,$(VALID_TOOLCHAINS))
+ALL_TOOLCHAINS ?= pnacl newlib glibc
+ifneq ($(ENABLE_BIONIC),)
+ALL_TOOLCHAINS += bionic
+endif
+VALID_TOOLCHAINS ?= $(ALL_TOOLCHAINS)
+TOOLCHAIN ?= $(word 1,$(VALID_TOOLCHAINS))
#
# Top Make file, which we want to trigger a rebuild on if it changes
@@ -60,7 +64,7 @@ endef
#
# The target for all versions
#
-USABLE_TOOLCHAINS=$(filter $(OSNAME) pnacl newlib glibc,$(VALID_TOOLCHAINS))
+USABLE_TOOLCHAINS=$(filter $(OSNAME) $(ALL_TOOLCHAINS),$(VALID_TOOLCHAINS))
ifeq ($(NO_HOST_BUILDS),1)
USABLE_TOOLCHAINS:=$(filter-out $(OSNAME),$(USABLE_TOOLCHAINS))
@@ -411,7 +415,7 @@ ifneq (,$(findstring $(TOOLCHAIN),win))
include $(NACL_SDK_ROOT)/tools/host_vc.mk
endif
-ifneq (,$(findstring $(TOOLCHAIN),glibc newlib))
+ifneq (,$(findstring $(TOOLCHAIN),glibc newlib bionic))
include $(NACL_SDK_ROOT)/tools/nacl_gcc.mk
endif
diff --git a/native_client_sdk/src/tools/create_nmf.py b/native_client_sdk/src/tools/create_nmf.py
index 35b270505b..b19b7d0185 100755
--- a/native_client_sdk/src/tools/create_nmf.py
+++ b/native_client_sdk/src/tools/create_nmf.py
@@ -6,45 +6,32 @@
"""Tool for automatically creating .nmf files from .nexe/.pexe executables.
As well as creating the nmf file this tool can also find and stage
-any shared libraries dependancies that the executables might have.
+any shared libraries dependencies that the executables might have.
"""
import errno
import json
import optparse
import os
-import re
+import posixpath
import shutil
-import struct
-import subprocess
import sys
import getos
-import quote
if sys.version_info < (2, 6, 0):
sys.stderr.write("python 2.6 or later is required run this script\n")
sys.exit(1)
-NeededMatcher = re.compile('^ *NEEDED *([^ ]+)\n$')
-FormatMatcher = re.compile('^(.+):\\s*file format (.+)\n$')
-
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+LIB_DIR = os.path.join(SCRIPT_DIR, 'lib')
+
+sys.path.append(LIB_DIR)
+
+import elf
+import get_shared_deps
+import quote
-OBJDUMP_ARCH_MAP = {
- # Names returned by Linux's objdump:
- 'elf64-x86-64': 'x86-64',
- 'elf32-i386': 'x86-32',
- 'elf32-little': 'arm',
- 'elf32-littlearm': 'arm',
- # Names returned by old x86_64-nacl-objdump:
- 'elf64-nacl': 'x86-64',
- 'elf32-nacl': 'x86-32',
- # Names returned by new x86_64-nacl-objdump:
- 'elf64-x86-64-nacl': 'x86-64',
- 'elf32-x86-64-nacl': 'x86-64',
- 'elf32-i386-nacl': 'x86-32',
-}
ARCH_LOCATION = {
'x86-32': 'lib32',
@@ -64,15 +51,6 @@ PORTABLE_KEY = 'portable' # key for portable section of manifest
TRANSLATE_KEY = 'pnacl-translate' # key for translatable objects
-# The proper name of the dynamic linker, as kept in the IRT. This is
-# excluded from the nmf file by convention.
-LD_NACL_MAP = {
- 'x86-32': 'ld-nacl-x86-32.so.1',
- 'x86-64': 'ld-nacl-x86-64.so.1',
- 'arm': None,
-}
-
-
def DebugPrint(message):
if DebugPrint.debug_mode:
sys.stderr.write('%s\n' % message)
@@ -81,6 +59,60 @@ def DebugPrint(message):
DebugPrint.debug_mode = False # Set to True to enable extra debug prints
+def SplitPath(path):
+ """Returns all components of a path as a list.
+
+ e.g.
+ 'foo/bar/baz.blah' => ['foo', 'bar', 'baz.blah']
+ """
+ result = []
+ while path:
+ path, part = os.path.split(path)
+ result.append(part)
+ return result[::-1] # Reverse.
+
+
+def MakePosixPath(path):
+ """Converts from the native format to posixpath format.
+
+ e.g. on Windows, "foo\\bar\\baz.blah" => "foo/bar/baz.blah"
+ on Mac/Linux this is a no-op.
+ """
+ if os.path == posixpath:
+ return path
+ return posixpath.join(*SplitPath(path))
+
+
+def PosixRelPath(path, start):
+ """Takes two paths in native format, and produces a relative path in posix
+ format.
+
+ e.g.
+ For Windows: "foo\\bar\\baz.blah", "foo" => "bar/baz.blah"
+ For Mac/Linux: "foo/bar/baz.blah", "foo" => "bar/baz.blah"
+
+ NOTE: This function uses os.path.realpath to create a canonical path for
+ |path| and |start|.
+ """
+ real_path = os.path.realpath(path)
+ real_start = os.path.realpath(start)
+ return MakePosixPath(os.path.relpath(real_path, real_start))
+
+
+def DirectoryTreeContainsFile(dirname, filename):
+ """Returns True if a file is in a directory, or any of that directory's
+ subdirectories recursively.
+
+ e.g.
+ DirectoryTreeContainsFile("foo", "foo/quux.txt") => True
+ DirectoryTreeContainsFile("foo", "foo/bar/baz/blah.txt") => True
+ DirectoryTreeContainsFile("foo", "bar/blah.txt") => False
+ """
+ real_dirname = os.path.realpath(dirname)
+ real_filename = os.path.realpath(filename)
+ return real_filename.startswith(real_dirname)
+
+
def MakeDir(dirname):
"""Just like os.makedirs but doesn't generate errors when dirname
already exists.
@@ -96,109 +128,31 @@ def MakeDir(dirname):
raise
-class Error(Exception):
- '''Local Error class for this file.'''
- pass
-
-
def ParseElfHeader(path):
- """Determine properties of a nexe by parsing elf header.
- Return tuple of architecture and boolean signalling whether
- the executable is dynamic (has INTERP header) or static.
- """
- # From elf.h:
- # typedef struct
- # {
- # unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
- # Elf64_Half e_type; /* Object file type */
- # Elf64_Half e_machine; /* Architecture */
- # ...
- # } Elf32_Ehdr;
- elf_header_format = '16s2H'
- elf_header_size = struct.calcsize(elf_header_format)
-
- with open(path, 'rb') as f:
- header = f.read(elf_header_size)
-
+ """Wrap elf.ParseElfHeader to return raise this module's Error on failure."""
try:
- header = struct.unpack(elf_header_format, header)
- except struct.error:
- raise Error("error parsing elf header: %s" % path)
- e_ident, _, e_machine = header[:3]
-
- elf_magic = '\x7fELF'
- if e_ident[:4] != elf_magic:
- raise Error('Not a valid NaCl executable: %s' % path)
-
- e_machine_mapping = {
- 3 : 'x86-32',
- 40 : 'arm',
- 62 : 'x86-64'
- }
- if e_machine not in e_machine_mapping:
- raise Error('Unknown machine type: %s' % e_machine)
-
- # Set arch based on the machine type in the elf header
- arch = e_machine_mapping[e_machine]
-
- # Now read the full header in either 64bit or 32bit mode
- dynamic = IsDynamicElf(path, arch == 'x86-64')
- return arch, dynamic
-
-
-def IsDynamicElf(path, is64bit):
- """Examine an elf file to determine if it is dynamically
- linked or not.
- This is determined by searching the program headers for
- a header of type PT_INTERP.
- """
- if is64bit:
- elf_header_format = '16s2HI3QI3H'
- else:
- elf_header_format = '16s2HI3II3H'
-
- elf_header_size = struct.calcsize(elf_header_format)
-
- with open(path, 'rb') as f:
- header = f.read(elf_header_size)
- header = struct.unpack(elf_header_format, header)
- p_header_offset = header[5]
- p_header_entry_size = header[9]
- num_p_header = header[10]
- f.seek(p_header_offset)
- p_headers = f.read(p_header_entry_size*num_p_header)
-
- # Read the first word of each Phdr to find out its type.
- #
- # typedef struct
- # {
- # Elf32_Word p_type; /* Segment type */
- # ...
- # } Elf32_Phdr;
- elf_phdr_format = 'I'
- PT_INTERP = 3
-
- while p_headers:
- p_header = p_headers[:p_header_entry_size]
- p_headers = p_headers[p_header_entry_size:]
- phdr_type = struct.unpack(elf_phdr_format, p_header[:4])[0]
- if phdr_type == PT_INTERP:
- return True
-
- return False
+ return elf.ParseElfHeader(path)
+ except elf.Error, e:
+ raise Error(str(e))
+
+
+class Error(Exception):
+ """Local Error class for this file."""
+ pass
class ArchFile(object):
- '''Simple structure containing information about
+ """Simple structure containing information about an architecture-specific
+ file.
Attributes:
name: Name of this file
path: Full path to this file on the build system
arch: Architecture of this file (e.g., x86-32)
url: Relative path to file in the staged web directory.
- Used for specifying the "url" attribute in the nmf file.'''
+ Used for specifying the "url" attribute in the nmf file."""
- def __init__(self, name, path, url, arch=None):
+ def __init__(self, name, path, url=None, arch=None):
self.name = name
self.path = path
self.url = url
@@ -210,22 +164,18 @@ class ArchFile(object):
return '<ArchFile %s>' % self.path
def __str__(self):
- '''Return the file path when invoked with the str() function'''
+ """Return the file path when invoked with the str() function"""
return self.path
class NmfUtils(object):
- '''Helper class for creating and managing nmf files
-
- Attributes:
- manifest: A JSON-structured dict containing the nmf structure
- needed: A dict with key=filename and value=ArchFile (see GetNeeded)
- '''
+ """Helper class for creating and managing nmf files"""
def __init__(self, main_files=None, objdump=None,
lib_path=None, extra_files=None, lib_prefix=None,
- remap=None, pnacl_optlevel=None):
- '''Constructor
+ nexe_prefix=None, no_arch_prefix=None, remap=None,
+ pnacl_optlevel=None, nmf_root=None):
+ """Constructor
Args:
main_files: List of main entry program files. These will be named
@@ -233,22 +183,34 @@ class NmfUtils(object):
objdump: path to x86_64-nacl-objdump tool (or Linux equivalent)
lib_path: List of paths to library directories
extra_files: List of extra files to include in the nmf
- lib_prefix: A list of path components to prepend to the library paths,
- both for staging the libraries and for inclusion into the nmf file.
- Examples: ['..'], ['lib_dir']
+ lib_prefix: A path prefix to prepend to the library paths, both for
+ staging the libraries and for inclusion into the nmf file.
+ Example: '../lib_dir'
+ nexe_prefix: Like lib_prefix, but is prepended to the nexes instead.
+ no_arch_prefix: Don't prefix shared libraries by lib32/lib64.
remap: Remaps the library name in the manifest.
pnacl_optlevel: Optimization level for PNaCl translation.
- '''
+ nmf_root: Directory of the NMF. All urls are relative to this directory.
+ """
+ assert len(main_files) > 0
self.objdump = objdump
- self.main_files = main_files or []
+ self.main_files = main_files
self.extra_files = extra_files or []
self.lib_path = lib_path or []
self.manifest = None
- self.needed = {}
- self.lib_prefix = lib_prefix or []
+ self.needed = None
+ self.lib_prefix = lib_prefix or ''
+ self.nexe_prefix = nexe_prefix or ''
+ self.no_arch_prefix = no_arch_prefix
self.remap = remap or {}
- self.pnacl = main_files and main_files[0].endswith('pexe')
+ self.pnacl = main_files[0].endswith('pexe')
self.pnacl_optlevel = pnacl_optlevel
+ if nmf_root is not None:
+ self.nmf_root = nmf_root
+ else:
+ # To match old behavior, if there is no nmf_root, use the directory of
+ # the first nexe found in main_files.
+ self.nmf_root = os.path.dirname(main_files[0])
for filename in self.main_files:
if not os.path.exists(filename):
@@ -256,189 +218,103 @@ class NmfUtils(object):
if not os.path.isfile(filename):
raise Error('Input is not a file: %s' % filename)
- def GleanFromObjdump(self, files, arch):
- '''Get architecture and dependency information for given files
-
- Args:
- files: A list of files to examine.
- [ '/path/to/my.nexe',
- '/path/to/lib64/libmy.so',
- '/path/to/mydata.so',
- '/path/to/my.data' ]
- arch: The architecure we are looking for, or None to accept any
- architecture.
-
- Returns: A tuple with the following members:
- input_info: A dict with key=filename and value=ArchFile of input files.
- Includes the input files as well, with arch filled in if absent.
- Example: { '/path/to/my.nexe': ArchFile(my.nexe),
- '/path/to/libfoo.so': ArchFile(libfoo.so) }
- needed: A set of strings formatted as "arch/name". Example:
- set(['x86-32/libc.so', 'x86-64/libgcc.so'])
- '''
- if not self.objdump:
- self.objdump = FindObjdumpExecutable()
- if not self.objdump:
- raise Error('No objdump executable found (see --help for more info)')
-
- full_paths = set()
- for filename in files:
- if os.path.exists(filename):
- full_paths.add(filename)
- else:
- for path in self.FindLibsInPath(filename):
- full_paths.add(path)
-
- cmd = [self.objdump, '-p'] + list(full_paths)
- DebugPrint('GleanFromObjdump[%s](%s)' % (arch, cmd))
- env = {'LANG': 'en_US.UTF-8'}
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.PIPE, bufsize=-1,
- env=env)
-
- input_info = {}
- found_basenames = set()
- needed = set()
- output, err_output = proc.communicate()
- if proc.returncode:
- raise Error('%s\nStdError=%s\nobjdump failed with error code: %d' %
- (output, err_output, proc.returncode))
-
- file_arch = None
- for line in output.splitlines(True):
- # Objdump should display the architecture first and then the dependencies
- # second for each file in the list.
- matched = FormatMatcher.match(line)
- if matched:
- filename = matched.group(1)
- file_arch = OBJDUMP_ARCH_MAP[matched.group(2)]
- if arch and file_arch != arch:
- continue
- name = os.path.basename(filename)
- found_basenames.add(name)
- input_info[filename] = ArchFile(
- arch=file_arch,
- name=name,
- path=filename,
- url='/'.join(self.lib_prefix + [ARCH_LOCATION[file_arch], name]))
- matched = NeededMatcher.match(line)
- if matched:
- assert file_arch is not None
- match = '/'.join([file_arch, matched.group(1)])
- needed.add(match)
- Trace("NEEDED: %s" % match)
-
- for filename in files:
- if os.path.basename(filename) not in found_basenames:
- raise Error('Library not found [%s]: %s' % (arch, filename))
-
- return input_info, needed
-
- def FindLibsInPath(self, name):
- '''Finds the set of libraries matching |name| within lib_path
-
- Args:
- name: name of library to find
-
- Returns:
- A list of system paths that match the given name within the lib_path'''
- files = []
- for dirname in self.lib_path:
- filename = os.path.join(dirname, name)
- if os.path.exists(filename):
- files.append(filename)
- if not files:
- raise Error('cannot find library %s' % name)
- return files
-
def GetNeeded(self):
- '''Collect the list of dependencies for the main_files
+ """Collect the list of dependencies for the main_files
Returns:
A dict with key=filename and value=ArchFile of input files.
Includes the input files as well, with arch filled in if absent.
Example: { '/path/to/my.nexe': ArchFile(my.nexe),
- '/path/to/libfoo.so': ArchFile(libfoo.so) }'''
+ '/path/to/libfoo.so': ArchFile(libfoo.so) }"""
if self.needed:
return self.needed
DebugPrint('GetNeeded(%s)' % self.main_files)
- dynamic = any(ParseElfHeader(f)[1] for f in self.main_files)
-
- if dynamic:
- examined = set()
- all_files, unexamined = self.GleanFromObjdump(self.main_files, None)
- for arch_file in all_files.itervalues():
- arch_file.url = arch_file.path
- if unexamined:
- unexamined.add('/'.join([arch_file.arch, RUNNABLE_LD]))
-
- while unexamined:
- files_to_examine = {}
-
- # Take all the currently unexamined files and group them
- # by architecture.
- for arch_name in unexamined:
- arch, name = arch_name.split('/')
- files_to_examine.setdefault(arch, []).append(name)
-
- # Call GleanFromObjdump() for each architecture.
- needed = set()
- for arch, files in files_to_examine.iteritems():
- new_files, new_needed = self.GleanFromObjdump(files, arch)
- all_files.update(new_files)
- needed |= new_needed
-
- examined |= unexamined
- unexamined = needed - examined
-
- # With the runnable-ld.so scheme we have today, the proper name of
- # the dynamic linker should be excluded from the list of files.
- ldso = [LD_NACL_MAP[arch] for arch in set(OBJDUMP_ARCH_MAP.values())]
- for name, arch_file in all_files.items():
- if arch_file.name in ldso:
- del all_files[name]
-
- self.needed = all_files
- else:
- for filename in self.main_files:
- url = os.path.split(filename)[1]
- archfile = ArchFile(name=os.path.basename(filename),
- path=filename, url=url)
- self.needed[filename] = archfile
+ if not self.objdump:
+ self.objdump = FindObjdumpExecutable()
+
+ try:
+ all_files = get_shared_deps.GetNeeded(self.main_files, self.objdump,
+ self.lib_path)
+ except get_shared_deps.NoObjdumpError:
+ raise Error('No objdump executable found (see --help for more info)')
+ except get_shared_deps.Error, e:
+ raise Error(str(e))
+
+ self.needed = {}
+
+ # all_files is a dictionary mapping filename to architecture. self.needed
+ # should be a dictionary of filename to ArchFile.
+ for filename, arch in all_files.iteritems():
+ name = os.path.basename(filename)
+ self.needed[filename] = ArchFile(name=name, path=filename, arch=arch)
+
+ self._SetArchFileUrls()
return self.needed
+ def _SetArchFileUrls(self):
+ """Fill in the url member of all ArchFiles in self.needed.
+
+ All urls are relative to the nmf_root. In addition, architecture-specific
+ files are relative to the .nexe with the matching architecture. This is
+ useful when making a multi-platform packaged app, so each architecture's
+ files are in a different directory.
+ """
+ # self.GetNeeded() should have already been called.
+ assert self.needed is not None
+
+ main_nexes = [f for f in self.main_files if f.endswith('.nexe')]
+
+ # map from each arch to its corresponding main nexe.
+ arch_to_main_dir = {}
+ for main_file in main_nexes:
+ arch, _ = ParseElfHeader(main_file)
+ main_dir = os.path.dirname(main_file)
+ main_dir = PosixRelPath(main_dir, self.nmf_root)
+ if main_dir == '.':
+ main_dir = ''
+ arch_to_main_dir[arch] = main_dir
+
+ for arch_file in self.needed.itervalues():
+ prefix = ''
+ if DirectoryTreeContainsFile(self.nmf_root, arch_file.path):
+ # This file is already in the nmf_root tree, so it does not need to be
+ # staged. Just make the URL relative to the .nmf.
+ url = PosixRelPath(arch_file.path, self.nmf_root)
+ else:
+ # This file is outside of the nmf_root subtree, so it needs to be
+ # staged. Its path should be relative to the main .nexe with the same
+ # architecture.
+ prefix = arch_to_main_dir[arch_file.arch]
+ url = os.path.basename(arch_file.path)
+
+ if arch_file.name.endswith('.nexe'):
+ prefix = posixpath.join(prefix, self.nexe_prefix)
+ elif self.no_arch_prefix:
+ prefix = posixpath.join(prefix, self.lib_prefix)
+ else:
+ prefix = posixpath.join(
+ prefix, self.lib_prefix, ARCH_LOCATION[arch_file.arch])
+ arch_file.url = posixpath.join(prefix, url)
+
def StageDependencies(self, destination_dir):
- '''Copies over the dependencies into a given destination directory
+ """Copies over the dependencies into a given destination directory
Each library will be put into a subdirectory that corresponds to the arch.
Args:
destination_dir: The destination directory for staging the dependencies
- '''
- nexe_root = os.path.dirname(os.path.abspath(self.main_files[0]))
- nexe_root = os.path.normcase(nexe_root)
-
- needed = self.GetNeeded()
- for arch_file in needed.itervalues():
- urldest = arch_file.url
+ """
+ assert self.needed is not None
+ for arch_file in self.needed.itervalues():
source = arch_file.path
+ destination = os.path.join(destination_dir, arch_file.url)
- # for .nexe and .so files specified on the command line stage
- # them in paths relative to the .nexe (with the .nexe always
- # being staged at the root).
- if source in self.main_files:
- absdest = os.path.normcase(os.path.abspath(urldest))
- if absdest.startswith(nexe_root):
- urldest = os.path.relpath(urldest, nexe_root)
-
- destination = os.path.join(destination_dir, urldest)
-
- if (os.path.normcase(os.path.abspath(source)) ==
- os.path.normcase(os.path.abspath(destination))):
+ if (os.path.normcase(os.path.realpath(source)) ==
+ os.path.normcase(os.path.realpath(destination))):
continue
# make sure target dir exists
@@ -460,7 +336,7 @@ class NmfUtils(object):
self.manifest = manifest
def _GenerateManifest(self):
- '''Create a JSON formatted dict containing the files
+ """Create a JSON formatted dict containing the files
NaCl will map url requests based on architecture. The startup NEXE
can always be found under the top key PROGRAM. Additional files are under
@@ -468,7 +344,8 @@ class NmfUtils(object):
PROGRAM key is populated with urls pointing the runnable-ld.so which acts
as the startup nexe. The application itself is then placed under the
FILES key mapped as 'main.exe' instead of the original name so that the
- loader can find it. '''
+ loader can find it.
+ """
manifest = { FILES_KEY: {}, PROGRAM_KEY: {} }
needed = self.GetNeeded()
@@ -481,8 +358,6 @@ class NmfUtils(object):
url=url))
for key, arch, url in self.extra_files]
- nexe_root = os.path.dirname(os.path.abspath(self.main_files[0]))
-
for need, archinfo in needed.items() + extra_files_kv:
urlinfo = { URL_KEY: archinfo.url }
name = archinfo.name
@@ -494,11 +369,6 @@ class NmfUtils(object):
continue
if need in self.main_files:
- # Ensure that the .nexe and .so names are relative to the root
- # of where the .nexe lives.
- if os.path.abspath(urlinfo[URL_KEY]).startswith(nexe_root):
- urlinfo[URL_KEY] = os.path.relpath(urlinfo[URL_KEY], nexe_root)
-
if need.endswith(".nexe"):
# Place it under program if we aren't using the runnable-ld.so.
if not runnable:
@@ -514,7 +384,7 @@ class NmfUtils(object):
self.manifest = manifest
def GetManifest(self):
- '''Returns a JSON-formatted dict containing the NaCl dependencies'''
+ """Returns a JSON-formatted dict containing the NaCl dependencies"""
if not self.manifest:
if self.pnacl:
self._GeneratePNaClManifest()
@@ -523,7 +393,7 @@ class NmfUtils(object):
return self.manifest
def GetJson(self):
- '''Returns the Manifest as a JSON-formatted string'''
+ """Returns the Manifest as a JSON-formatted string"""
pretty_string = json.dumps(self.GetManifest(), indent=2)
# json.dumps sometimes returns trailing whitespace and does not put
# a newline at the end. This code fixes these problems.
@@ -666,11 +536,21 @@ def main(argv):
help='Add DIRECTORY to library search path',
metavar='DIRECTORY')
parser.add_option('-P', '--path-prefix', dest='path_prefix', default='',
+ help='Deprecated. An alias for --lib-prefix.',
+ metavar='DIRECTORY')
+ parser.add_option('-p', '--lib-prefix', dest='lib_prefix', default='',
help='A path to prepend to shared libraries in the .nmf',
metavar='DIRECTORY')
+ parser.add_option('-N', '--nexe-prefix', dest='nexe_prefix', default='',
+ help='A path to prepend to nexes in the .nmf',
+ metavar='DIRECTORY')
parser.add_option('-s', '--stage-dependencies', dest='stage_dependencies',
help='Destination directory for staging libraries',
metavar='DIRECTORY')
+ parser.add_option('--no-arch-prefix', action='store_true',
+ help='Don\'t put shared libraries in the lib32/lib64 '
+ 'directories. Instead, they will be put in the same '
+ 'directory as the .nexe that matches its architecture.')
parser.add_option('-t', '--toolchain', help='Legacy option, do not use')
parser.add_option('-n', '--name', dest='name',
help='Rename FOO as BAR',
@@ -720,9 +600,7 @@ def main(argv):
remap[parts[0]] = parts[1]
if options.path_prefix:
- path_prefix = options.path_prefix.split('/')
- else:
- path_prefix = []
+ options.lib_prefix = options.path_prefix
for libpath in options.lib_path:
if not os.path.exists(libpath):
@@ -743,15 +621,21 @@ def main(argv):
'warning: PNaCl optlevel %d is unsupported (< 0 or > 3)\n' %
pnacl_optlevel)
+ nmf_root = None
+ if options.output:
+ nmf_root = os.path.dirname(options.output)
+
nmf = NmfUtils(objdump=options.objdump,
main_files=args,
lib_path=options.lib_path,
extra_files=canonicalized,
- lib_prefix=path_prefix,
+ lib_prefix=options.lib_prefix,
+ nexe_prefix=options.nexe_prefix,
+ no_arch_prefix=options.no_arch_prefix,
remap=remap,
- pnacl_optlevel=pnacl_optlevel)
+ pnacl_optlevel=pnacl_optlevel,
+ nmf_root=nmf_root)
- nmf.GetManifest()
if not options.output:
sys.stdout.write(nmf.GetJson())
else:
diff --git a/native_client_sdk/src/tools/lib/elf.py b/native_client_sdk/src/tools/lib/elf.py
new file mode 100644
index 0000000000..2011a2b385
--- /dev/null
+++ b/native_client_sdk/src/tools/lib/elf.py
@@ -0,0 +1,99 @@
+# Copyright 2014 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.
+
+"""Helper script for extracting information from ELF files"""
+
+import struct
+
+
+class Error(Exception):
+ '''Local Error class for this file.'''
+ pass
+
+
+def ParseElfHeader(path):
+ """Determine properties of a nexe by parsing elf header.
+ Return tuple of architecture and boolean signalling whether
+ the executable is dynamic (has INTERP header) or static.
+ """
+ # From elf.h:
+ # typedef struct
+ # {
+ # unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
+ # Elf64_Half e_type; /* Object file type */
+ # Elf64_Half e_machine; /* Architecture */
+ # ...
+ # } Elf32_Ehdr;
+ elf_header_format = '16s2H'
+ elf_header_size = struct.calcsize(elf_header_format)
+
+ with open(path, 'rb') as f:
+ header = f.read(elf_header_size)
+
+ try:
+ header = struct.unpack(elf_header_format, header)
+ except struct.error:
+ raise Error("error parsing elf header: %s" % path)
+ e_ident, _, e_machine = header[:3]
+
+ elf_magic = '\x7fELF'
+ if e_ident[:4] != elf_magic:
+ raise Error('Not a valid NaCl executable: %s' % path)
+
+ e_machine_mapping = {
+ 3 : 'x86-32',
+ 40 : 'arm',
+ 62 : 'x86-64'
+ }
+ if e_machine not in e_machine_mapping:
+ raise Error('Unknown machine type: %s' % e_machine)
+
+ # Set arch based on the machine type in the elf header
+ arch = e_machine_mapping[e_machine]
+
+ # Now read the full header in either 64bit or 32bit mode
+ dynamic = IsDynamicElf(path, arch == 'x86-64')
+ return arch, dynamic
+
+
+def IsDynamicElf(path, is64bit):
+ """Examine an elf file to determine if it is dynamically
+ linked or not.
+ This is determined by searching the program headers for
+ a header of type PT_INTERP.
+ """
+ if is64bit:
+ elf_header_format = '16s2HI3QI3H'
+ else:
+ elf_header_format = '16s2HI3II3H'
+
+ elf_header_size = struct.calcsize(elf_header_format)
+
+ with open(path, 'rb') as f:
+ header = f.read(elf_header_size)
+ header = struct.unpack(elf_header_format, header)
+ p_header_offset = header[5]
+ p_header_entry_size = header[9]
+ num_p_header = header[10]
+ f.seek(p_header_offset)
+ p_headers = f.read(p_header_entry_size*num_p_header)
+
+ # Read the first word of each Phdr to find out its type.
+ #
+ # typedef struct
+ # {
+ # Elf32_Word p_type; /* Segment type */
+ # ...
+ # } Elf32_Phdr;
+ elf_phdr_format = 'I'
+ PT_INTERP = 3
+
+ while p_headers:
+ p_header = p_headers[:p_header_entry_size]
+ p_headers = p_headers[p_header_entry_size:]
+ phdr_type = struct.unpack(elf_phdr_format, p_header[:4])[0]
+ if phdr_type == PT_INTERP:
+ return True
+
+ return False
diff --git a/native_client_sdk/src/tools/lib/get_shared_deps.py b/native_client_sdk/src/tools/lib/get_shared_deps.py
new file mode 100644
index 0000000000..3287474080
--- /dev/null
+++ b/native_client_sdk/src/tools/lib/get_shared_deps.py
@@ -0,0 +1,217 @@
+# Copyright 2014 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.
+
+"""Helper script to close over all transitive dependencies of a given .nexe
+executable.
+
+e.g. Given
+A -> B
+B -> C
+B -> D
+C -> E
+
+where "A -> B" means A depends on B, then GetNeeded(A) will return A, B, C, D
+and E.
+"""
+
+import os
+import re
+import subprocess
+
+import elf
+
+NeededMatcher = re.compile('^ *NEEDED *([^ ]+)\n$')
+FormatMatcher = re.compile('^(.+):\\s*file format (.+)\n$')
+
+RUNNABLE_LD = 'runnable-ld.so' # Name of the dynamic loader
+
+OBJDUMP_ARCH_MAP = {
+ # Names returned by Linux's objdump:
+ 'elf64-x86-64': 'x86-64',
+ 'elf32-i386': 'x86-32',
+ 'elf32-little': 'arm',
+ 'elf32-littlearm': 'arm',
+ # Names returned by old x86_64-nacl-objdump:
+ 'elf64-nacl': 'x86-64',
+ 'elf32-nacl': 'x86-32',
+ # Names returned by new x86_64-nacl-objdump:
+ 'elf64-x86-64-nacl': 'x86-64',
+ 'elf32-x86-64-nacl': 'x86-64',
+ 'elf32-i386-nacl': 'x86-32',
+}
+
+# The proper name of the dynamic linker, as kept in the IRT. This is
+# excluded from the nmf file by convention.
+LD_NACL_MAP = {
+ 'x86-32': 'ld-nacl-x86-32.so.1',
+ 'x86-64': 'ld-nacl-x86-64.so.1',
+ 'arm': None,
+}
+
+
+class Error(Exception):
+ '''Local Error class for this file.'''
+ pass
+
+
+class NoObjdumpError(Error):
+ '''Error raised when objdump is needed but not found'''
+ pass
+
+
+def GetNeeded(main_files, objdump, lib_path):
+ '''Collect the list of dependencies for the main_files
+
+ Args:
+ main_files: A list of files to find dependencies of.
+ objdump: Path to the objdump executable.
+ lib_path: A list of paths to search for shared libraries.
+
+ Returns:
+ A dict with key=filename and value=architecture. The architecture will be
+ one of ('x86_32', 'x86_64', 'arm').
+ '''
+
+ dynamic = any(elf.ParseElfHeader(f)[1] for f in main_files)
+
+ if dynamic:
+ return _GetNeededDynamic(main_files, objdump, lib_path)
+ else:
+ return _GetNeededStatic(main_files)
+
+
+def _GetNeededDynamic(main_files, objdump, lib_path):
+ examined = set()
+ all_files, unexamined = GleanFromObjdump(main_files, None, objdump, lib_path)
+ for arch in all_files.itervalues():
+ if unexamined:
+ unexamined.add((RUNNABLE_LD, arch))
+
+ while unexamined:
+ files_to_examine = {}
+
+ # Take all the currently unexamined files and group them
+ # by architecture.
+ for name, arch in unexamined:
+ files_to_examine.setdefault(arch, []).append(name)
+
+ # Call GleanFromObjdump() for each architecture.
+ needed = set()
+ for arch, files in files_to_examine.iteritems():
+ new_files, new_needed = GleanFromObjdump(files, arch, objdump, lib_path)
+ all_files.update(new_files)
+ needed |= new_needed
+
+ examined |= unexamined
+ unexamined = needed - examined
+
+ # With the runnable-ld.so scheme we have today, the proper name of
+ # the dynamic linker should be excluded from the list of files.
+ ldso = [LD_NACL_MAP[arch] for arch in set(OBJDUMP_ARCH_MAP.values())]
+ for filename, arch in all_files.items():
+ name = os.path.basename(filename)
+ if name in ldso:
+ del all_files[filename]
+
+ return all_files
+
+
+def GleanFromObjdump(files, arch, objdump, lib_path):
+ '''Get architecture and dependency information for given files
+
+ Args:
+ files: A list of files to examine.
+ [ '/path/to/my.nexe',
+ '/path/to/lib64/libmy.so',
+ '/path/to/mydata.so',
+ '/path/to/my.data' ]
+ arch: The architecure we are looking for, or None to accept any
+ architecture.
+ objdump: Path to the objdump executable.
+ lib_path: A list of paths to search for shared libraries.
+
+ Returns: A tuple with the following members:
+ input_info: A dict with key=filename and value=architecture. The
+ architecture will be one of ('x86_32', 'x86_64', 'arm').
+ needed: A set of strings formatted as "arch/name". Example:
+ set(['x86-32/libc.so', 'x86-64/libgcc.so'])
+ '''
+ if not objdump:
+ raise NoObjdumpError('No objdump executable found!')
+
+ full_paths = set()
+ for filename in files:
+ if os.path.exists(filename):
+ full_paths.add(filename)
+ else:
+ for path in _FindLibsInPath(filename, lib_path):
+ full_paths.add(path)
+
+ cmd = [objdump, '-p'] + list(full_paths)
+ env = {'LANG': 'en_US.UTF-8'}
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, bufsize=-1,
+ env=env)
+
+ input_info = {}
+ found_basenames = set()
+ needed = set()
+ output, err_output = proc.communicate()
+ if proc.returncode:
+ raise Error('%s\nStdError=%s\nobjdump failed with error code: %d' %
+ (output, err_output, proc.returncode))
+
+ file_arch = None
+ for line in output.splitlines(True):
+ # Objdump should display the architecture first and then the dependencies
+ # second for each file in the list.
+ matched = FormatMatcher.match(line)
+ if matched:
+ filename = matched.group(1)
+ file_arch = OBJDUMP_ARCH_MAP[matched.group(2)]
+ if arch and file_arch != arch:
+ continue
+ name = os.path.basename(filename)
+ found_basenames.add(name)
+ input_info[filename] = file_arch
+ matched = NeededMatcher.match(line)
+ if matched:
+ if arch and file_arch != arch:
+ continue
+ filename = matched.group(1)
+ new_needed = (filename, file_arch)
+ needed.add(new_needed)
+
+ for filename in files:
+ if os.path.basename(filename) not in found_basenames:
+ raise Error('Library not found [%s]: %s' % (arch, filename))
+
+ return input_info, needed
+
+
+def _FindLibsInPath(name, lib_path):
+ '''Finds the set of libraries matching |name| within lib_path
+
+ Args:
+ name: name of library to find
+ lib_path: A list of paths to search for shared libraries.
+
+ Returns:
+ A list of system paths that match the given name within the lib_path'''
+ files = []
+ for dirname in lib_path:
+ filename = os.path.join(dirname, name)
+ if os.path.exists(filename):
+ files.append(filename)
+ if not files:
+ raise Error('cannot find library %s' % name)
+ return files
+
+
+def _GetNeededStatic(main_files):
+ needed = {}
+ for filename in main_files:
+ arch = elf.ParseElfHeader(filename)[0]
+ needed[filename] = arch
+ return needed
diff --git a/native_client_sdk/src/tools/quote.py b/native_client_sdk/src/tools/lib/quote.py
index 5af64002de..cec0ee47e1 100755
--- a/native_client_sdk/src/tools/quote.py
+++ b/native_client_sdk/src/tools/lib/quote.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Copyright 2014 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.
diff --git a/native_client_sdk/src/tools/lib/tests/data/test.pexe b/native_client_sdk/src/tools/lib/tests/data/test.pexe
new file mode 100644
index 0000000000..e13cd9ada2
--- /dev/null
+++ b/native_client_sdk/src/tools/lib/tests/data/test.pexe
Binary files differ
diff --git a/native_client_sdk/src/tools/tests/data/test_dynamic_x86_32.nexe b/native_client_sdk/src/tools/lib/tests/data/test_dynamic_x86_32.nexe
index 0c46bbd38a..0c46bbd38a 100644
--- a/native_client_sdk/src/tools/tests/data/test_dynamic_x86_32.nexe
+++ b/native_client_sdk/src/tools/lib/tests/data/test_dynamic_x86_32.nexe
Binary files differ
diff --git a/native_client_sdk/src/tools/tests/data/test_dynamic_x86_64.nexe b/native_client_sdk/src/tools/lib/tests/data/test_dynamic_x86_64.nexe
index 71a62fa08a..71a62fa08a 100644
--- a/native_client_sdk/src/tools/tests/data/test_dynamic_x86_64.nexe
+++ b/native_client_sdk/src/tools/lib/tests/data/test_dynamic_x86_64.nexe
Binary files differ
diff --git a/native_client_sdk/src/tools/tests/data/test_static_arm.nexe b/native_client_sdk/src/tools/lib/tests/data/test_static_arm.nexe
index ffa0e4ef7a..ffa0e4ef7a 100644
--- a/native_client_sdk/src/tools/tests/data/test_static_arm.nexe
+++ b/native_client_sdk/src/tools/lib/tests/data/test_static_arm.nexe
Binary files differ
diff --git a/native_client_sdk/src/tools/tests/data/test_static_x86_32.nexe b/native_client_sdk/src/tools/lib/tests/data/test_static_x86_32.nexe
index 94f846b563..94f846b563 100644
--- a/native_client_sdk/src/tools/tests/data/test_static_x86_32.nexe
+++ b/native_client_sdk/src/tools/lib/tests/data/test_static_x86_32.nexe
Binary files differ
diff --git a/native_client_sdk/src/tools/tests/data/test_static_x86_64.nexe b/native_client_sdk/src/tools/lib/tests/data/test_static_x86_64.nexe
index 31144a2e95..31144a2e95 100644
--- a/native_client_sdk/src/tools/tests/data/test_static_x86_64.nexe
+++ b/native_client_sdk/src/tools/lib/tests/data/test_static_x86_64.nexe
Binary files differ
diff --git a/native_client_sdk/src/tools/lib/tests/elf_test.py b/native_client_sdk/src/tools/lib/tests/elf_test.py
new file mode 100755
index 0000000000..8c57e8d9c9
--- /dev/null
+++ b/native_client_sdk/src/tools/lib/tests/elf_test.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+# Copyright 2014 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.
+
+import os
+import sys
+import unittest
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+PARENT_DIR = os.path.dirname(SCRIPT_DIR)
+DATA_DIR = os.path.join(SCRIPT_DIR, 'data')
+
+sys.path.append(PARENT_DIR)
+
+import elf
+
+
+class TestIsDynamicElf(unittest.TestCase):
+ def test_arm(self):
+ static_nexe = os.path.join(DATA_DIR, 'test_static_arm.nexe')
+ self.assertFalse(elf.IsDynamicElf(static_nexe, False))
+
+ def test_x86_32(self):
+ dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_32.nexe')
+ static_nexe = os.path.join(DATA_DIR, 'test_static_x86_32.nexe')
+ self.assertTrue(elf.IsDynamicElf(dyn_nexe, False))
+ self.assertFalse(elf.IsDynamicElf(static_nexe, False))
+
+ def test_x86_64(self):
+ dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_64.nexe')
+ static_nexe = os.path.join(DATA_DIR, 'test_static_x86_64.nexe')
+ self.assertTrue(elf.IsDynamicElf(dyn_nexe, True))
+ self.assertFalse(elf.IsDynamicElf(static_nexe, True))
+
+
+class TestParseElfHeader(unittest.TestCase):
+ def test_invalid_elf(self):
+ self.assertRaises(elf.Error, elf.ParseElfHeader, __file__)
+
+ def test_arm_elf_parse(self):
+ """Test parsing of ARM elf header."""
+ static_nexe = os.path.join(DATA_DIR, 'test_static_arm.nexe')
+ arch, dynamic = elf.ParseElfHeader(static_nexe)
+ self.assertEqual(arch, 'arm')
+ self.assertFalse(dynamic)
+
+ def test_x86_32_elf_parse(self):
+ """Test parsing of x86-32 elf header."""
+ dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_32.nexe')
+ static_nexe = os.path.join(DATA_DIR, 'test_static_x86_32.nexe')
+
+ arch, dynamic = elf.ParseElfHeader(dyn_nexe)
+ self.assertEqual(arch, 'x86-32')
+ self.assertTrue(dynamic)
+
+ arch, dynamic = elf.ParseElfHeader(static_nexe)
+ self.assertEqual(arch, 'x86-32')
+ self.assertFalse(dynamic)
+
+ def test_x86_64_elf_parse(self):
+ """Test parsing of x86-64 elf header."""
+ dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_64.nexe')
+ static_nexe = os.path.join(DATA_DIR, 'test_static_x86_64.nexe')
+
+ arch, dynamic = elf.ParseElfHeader(dyn_nexe)
+ self.assertEqual(arch, 'x86-64')
+ self.assertTrue(dynamic)
+
+ arch, dynamic = elf.ParseElfHeader(static_nexe)
+ self.assertEqual(arch, 'x86-64')
+ self.assertFalse(dynamic)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/native_client_sdk/src/tools/lib/tests/get_shared_deps_test.py b/native_client_sdk/src/tools/lib/tests/get_shared_deps_test.py
new file mode 100755
index 0000000000..d891c4fe58
--- /dev/null
+++ b/native_client_sdk/src/tools/lib/tests/get_shared_deps_test.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+# Copyright 2014 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.
+
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+import unittest
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+LIB_DIR = os.path.dirname(SCRIPT_DIR)
+TOOLS_DIR = os.path.dirname(LIB_DIR)
+DATA_DIR = os.path.join(SCRIPT_DIR, 'data')
+CHROME_SRC = os.path.dirname(os.path.dirname(os.path.dirname(TOOLS_DIR)))
+
+sys.path.append(LIB_DIR)
+sys.path.append(TOOLS_DIR)
+
+import getos
+import get_shared_deps
+
+
+def StripDependencies(deps):
+ '''Strip the dirnames and version suffixes from
+ a list of nexe dependencies.
+
+ e.g:
+ /path/to/libpthread.so.1a2d3fsa -> libpthread.so
+ '''
+ names = []
+ for name in deps:
+ name = os.path.basename(name)
+ if '.so.' in name:
+ name = name.rsplit('.', 1)[0]
+ names.append(name)
+ return names
+
+
+class TestGetNeeded(unittest.TestCase):
+ def setUp(self):
+ self.tempdir = None
+ toolchain = os.path.join(CHROME_SRC, 'native_client', 'toolchain')
+ self.toolchain = os.path.join(toolchain, '%s_x86' % getos.GetPlatform())
+ self.objdump = os.path.join(self.toolchain, 'bin', 'i686-nacl-objdump')
+ if os.name == 'nt':
+ self.objdump += '.exe'
+ self.Mktemp()
+ self.dyn_nexe = self.createTestNexe('test_dynamic_x86_32.nexe', 'i686')
+ self.dyn_deps = set(['libc.so', 'runnable-ld.so',
+ 'libgcc_s.so', 'libpthread.so'])
+
+ def tearDown(self):
+ if self.tempdir:
+ shutil.rmtree(self.tempdir)
+
+ def Mktemp(self):
+ self.tempdir = tempfile.mkdtemp()
+
+ def createTestNexe(self, name, arch):
+ '''Create an empty test .nexe file for use in create_nmf tests.
+
+ This is used rather than checking in test binaries since the
+ checked in binaries depend on .so files that only exist in the
+ certain SDK that built them.
+ '''
+ compiler = os.path.join(self.toolchain, 'bin', '%s-nacl-g++' % arch)
+ if os.name == 'nt':
+ compiler += '.exe'
+ os.environ['CYGWIN'] = 'nodosfilewarning'
+ program = 'int main() { return 0; }'
+ name = os.path.join(self.tempdir, name)
+ cmd = [compiler, '-pthread', '-x' , 'c', '-o', name, '-']
+ p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
+ p.communicate(input=program)
+ self.assertEqual(p.returncode, 0)
+ return name
+
+ def testStatic(self):
+ nexe = os.path.join(DATA_DIR, 'test_static_x86_32.nexe')
+ # GetNeeded should not raise an error if objdump is not set, but the .nexe
+ # is statically linked.
+ objdump = None
+ lib_path = []
+ needed = get_shared_deps.GetNeeded([nexe], objdump, lib_path)
+
+ # static nexe should have exactly one needed file
+ self.assertEqual(len(needed), 1)
+ self.assertEqual(needed.keys()[0], nexe)
+
+ # arch of needed file should be x86-32
+ arch = needed.values()[0]
+ self.assertEqual(arch, 'x86-32')
+
+ def testDynamic(self):
+ libdir = os.path.join(self.toolchain, 'x86_64-nacl', 'lib32')
+ needed = get_shared_deps.GetNeeded([self.dyn_nexe],
+ lib_path=[libdir],
+ objdump=self.objdump)
+ names = needed.keys()
+
+ # this nexe has 5 dependencies
+ expected = set(self.dyn_deps)
+ expected.add(os.path.basename(self.dyn_nexe))
+
+ basenames = set(StripDependencies(names))
+ self.assertEqual(expected, basenames)
+
+ def testMissingArchLibrary(self):
+ libdir = os.path.join(self.toolchain, 'x86_64-nacl', 'lib32')
+ lib_path = [libdir]
+ nexes = ['libgcc_s.so.1']
+ # CreateNmfUtils uses the 32-bit library path, but not the 64-bit one
+ # so searching for a 32-bit library should succeed while searching for
+ # a 64-bit one should fail.
+ get_shared_deps.GleanFromObjdump(nexes, 'x86-32', self.objdump, lib_path)
+ self.assertRaises(get_shared_deps.Error,
+ get_shared_deps.GleanFromObjdump,
+ nexes, 'x86-64', self.objdump, lib_path)
+
+ def testCorrectArch(self):
+ lib_path = [os.path.join(self.toolchain, 'x86_64-nacl', 'lib32'),
+ os.path.join(self.toolchain, 'x86_64-nacl', 'lib')]
+
+ needed = get_shared_deps.GetNeeded([self.dyn_nexe],
+ lib_path=lib_path,
+ objdump=self.objdump)
+ for arch in needed.itervalues():
+ self.assertEqual(arch, 'x86-32')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/native_client_sdk/src/tools/tests/quote_test.py b/native_client_sdk/src/tools/lib/tests/quote_test.py
index f5fb86639c..fe0e6c3605 100755
--- a/native_client_sdk/src/tools/tests/quote_test.py
+++ b/native_client_sdk/src/tools/lib/tests/quote_test.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Copyright 2014 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.
diff --git a/native_client_sdk/src/tools/nacl_config.py b/native_client_sdk/src/tools/nacl_config.py
index b508cbaaab..94294686fe 100755
--- a/native_client_sdk/src/tools/nacl_config.py
+++ b/native_client_sdk/src/tools/nacl_config.py
@@ -44,7 +44,7 @@ ARCH_BASE_NAME = {
'x86_64': 'x86'
}
-NACL_TOOLCHAINS = ('newlib', 'glibc', 'pnacl')
+NACL_TOOLCHAINS = ('newlib', 'glibc', 'pnacl', 'bionic')
HOST_TOOLCHAINS = ('linux', 'mac', 'win')
VALID_TOOLCHAINS = list(HOST_TOOLCHAINS) + list(NACL_TOOLCHAINS) + ['host']
@@ -119,7 +119,8 @@ def CheckValidToolchainArch(toolchain, arch, arch_required=False):
ExpectArch(arch, VALID_ARCHES)
if arch == 'arm':
- Expect(toolchain == 'newlib', 'The arm arch only supports newlib.')
+ Expect(toolchain in ['newlib', 'bionic'],
+ 'The arm arch only supports newlib.')
def GetArchName(arch):
diff --git a/native_client_sdk/src/tools/nacl_gcc.mk b/native_client_sdk/src/tools/nacl_gcc.mk
index 858c735a89..c5c1609601 100644
--- a/native_client_sdk/src/tools/nacl_gcc.mk
+++ b/native_client_sdk/src/tools/nacl_gcc.mk
@@ -13,6 +13,7 @@
# We always link with the C++ compiler but include -Wl,-as-needed flag
# in LDFLAGS so the linker should drop libc++ unless it's actually needed.
#
+ifneq ($(TOOLCHAIN),bionic)
X86_32_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=cc)
X86_32_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=c++)
X86_32_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=c++)
@@ -26,8 +27,9 @@ X86_64_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=c++)
X86_64_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=ar)
X86_64_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=strip)
X86_64_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=nm)
+endif
-ifneq ($(TOOLCHAIN),glibc)
+ifeq (,$(findstring $(TOOLCHAIN),glibc))
ARM_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=cc)
ARM_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=c++)
ARM_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=c++)
@@ -142,8 +144,10 @@ endef
# Determine which architectures to build for. The user can set NACL_ARCH or
# ARCHES in the environment to control this.
#
+ifneq ($(TOOLCHAIN),bionic)
VALID_ARCHES := x86_32 x86_64
-ifeq (newlib,$(TOOLCHAIN))
+endif
+ifneq (glibc,$(TOOLCHAIN))
VALID_ARCHES += arm
endif
@@ -207,6 +211,23 @@ GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_64.so
GLIBC_REMAP += -n lib$(1)_x86_64.so,lib$(1).so
endif
endif
+
+ifneq (,$(findstring arm,$(ARCHES)))
+all: $(OUTDIR)/lib$(1)_arm.so
+$(OUTDIR)/lib$(1)_arm.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm_pic)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
+ $(call LOG,LINK,$$@,$(ARM_LINK) -o $$@ $$(filter %.o,$$^) $(LDFLAGS_SHARED) -marm $(NACL_LDFLAGS) $(ARM_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)))
+ $(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
+
+$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).so
+install: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).so
+$(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_arm.so
+ $(MKDIR) -p $$(dir $$@)
+ $(call LOG,CP ,$$@,$(OSHELPERS) cp $$^ $$@)
+ifneq ($(6),1)
+GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_arm.so
+GLIBC_REMAP += -n lib$(1)_arm.so,lib$(1).so
+endif
+endif
endef
#
diff --git a/native_client_sdk/src/tools/tests/create_nmf_test.py b/native_client_sdk/src/tools/tests/create_nmf_test.py
index c0855ad16c..49bc5bcaaf 100755
--- a/native_client_sdk/src/tools/tests/create_nmf_test.py
+++ b/native_client_sdk/src/tools/tests/create_nmf_test.py
@@ -2,7 +2,9 @@
# 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.
+import json
import os
+import posixpath
import shutil
import subprocess
import sys
@@ -10,74 +12,47 @@ import tempfile
import unittest
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-PARENT_DIR = os.path.dirname(SCRIPT_DIR)
-DATA_DIR = os.path.join(SCRIPT_DIR, 'data')
-CHROME_SRC = os.path.dirname(os.path.dirname(os.path.dirname(PARENT_DIR)))
+TOOLS_DIR = os.path.dirname(SCRIPT_DIR)
+DATA_DIR = os.path.join(TOOLS_DIR, 'lib', 'tests', 'data')
+CHROME_SRC = os.path.dirname(os.path.dirname(os.path.dirname(TOOLS_DIR)))
MOCK_DIR = os.path.join(CHROME_SRC, "third_party", "pymock")
# For the mock library
sys.path.append(MOCK_DIR)
-sys.path.append(PARENT_DIR)
+sys.path.append(TOOLS_DIR)
import create_nmf
import getos
import mock
-class TestIsDynamicElf(unittest.TestCase):
- def test_arm(self):
- static_nexe = os.path.join(DATA_DIR, 'test_static_arm.nexe')
- self.assertFalse(create_nmf.IsDynamicElf(static_nexe, False))
+PosixRelPath = create_nmf.PosixRelPath
- def test_x86_32(self):
- dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_32.nexe')
- static_nexe = os.path.join(DATA_DIR, 'test_static_x86_32.nexe')
- self.assertTrue(create_nmf.IsDynamicElf(dyn_nexe, False))
- self.assertFalse(create_nmf.IsDynamicElf(static_nexe, False))
- def test_x86_64(self):
- dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_64.nexe')
- static_nexe = os.path.join(DATA_DIR, 'test_static_x86_64.nexe')
- self.assertTrue(create_nmf.IsDynamicElf(dyn_nexe, True))
- self.assertFalse(create_nmf.IsDynamicElf(static_nexe, True))
+def StripSo(name):
+ """Strip trailing hexidecimal characters from the name of a shared object.
+ It strips everything after the last '.' in the name, and checks that the new
+ name ends with .so.
-class TestParseElfHeader(unittest.TestCase):
- def test_invalid_elf(self):
- self.assertRaises(create_nmf.Error, create_nmf.ParseElfHeader, __file__)
+ e.g.
- def test_arm_elf_parse(self):
- """Test parsing of ARM elf header."""
- static_nexe = os.path.join(DATA_DIR, 'test_static_arm.nexe')
- arch, dynamic = create_nmf.ParseElfHeader(static_nexe)
- self.assertEqual(arch, 'arm')
- self.assertFalse(dynamic)
+ libc.so.ad6acbfa => libc.so
+ foo.bar.baz => foo.bar.baz
+ """
+ stripped_name = '.'.join(name.split('.')[:-1])
+ if stripped_name.endswith('.so'):
+ return stripped_name
+ return name
- def test_x86_32_elf_parse(self):
- """Test parsing of x86-32 elf header."""
- dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_32.nexe')
- static_nexe = os.path.join(DATA_DIR, 'test_static_x86_32.nexe')
- arch, dynamic = create_nmf.ParseElfHeader(dyn_nexe)
- self.assertEqual(arch, 'x86-32')
- self.assertTrue(dynamic)
-
- arch, dynamic = create_nmf.ParseElfHeader(static_nexe)
- self.assertEqual(arch, 'x86-32')
- self.assertFalse(dynamic)
-
- def test_x86_64_elf_parse(self):
- """Test parsing of x86-64 elf header."""
- dyn_nexe = os.path.join(DATA_DIR, 'test_dynamic_x86_64.nexe')
- static_nexe = os.path.join(DATA_DIR, 'test_static_x86_64.nexe')
-
- arch, dynamic = create_nmf.ParseElfHeader(dyn_nexe)
- self.assertEqual(arch, 'x86-64')
- self.assertTrue(dynamic)
-
- arch, dynamic = create_nmf.ParseElfHeader(static_nexe)
- self.assertEqual(arch, 'x86-64')
- self.assertFalse(dynamic)
+class TestPosixRelPath(unittest.TestCase):
+ def testBasic(self):
+ # Note that PosixRelPath only converts from native path format to posix
+ # path format, that's why we have to use os.path.join here.
+ path = os.path.join(os.path.sep, 'foo', 'bar', 'baz.blah')
+ start = os.path.sep + 'foo'
+ self.assertEqual(PosixRelPath(path, start), 'bar/baz.blah')
class TestDefaultLibpath(unittest.TestCase):
@@ -113,13 +88,9 @@ class TestNmfUtils(unittest.TestCase):
self.objdump = os.path.join(self.toolchain, 'bin', 'i686-nacl-objdump')
if os.name == 'nt':
self.objdump += '.exe'
- self.Mktemp()
- self.dyn_nexe = self.createTestNexe('test_dynamic_x86_32.nexe', True,
- 'i686')
- self.dyn_deps = set(['libc.so', 'runnable-ld.so',
- 'libgcc_s.so', 'libpthread.so'])
+ self._Mktemp()
- def createTestNexe(self, name, dynamic, arch):
+ def _CreateTestNexe(self, name, arch):
"""Create an empty test .nexe file for use in create_nmf tests.
This is used rather than checking in test binaries since the
@@ -132,6 +103,9 @@ class TestNmfUtils(unittest.TestCase):
os.environ['CYGWIN'] = 'nodosfilewarning'
program = 'int main() { return 0; }'
name = os.path.join(self.tempdir, name)
+ dst_dir = os.path.dirname(name)
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
cmd = [compiler, '-pthread', '-x' , 'c', '-o', name, '-']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
p.communicate(input=program)
@@ -142,85 +116,449 @@ class TestNmfUtils(unittest.TestCase):
if self.tempdir:
shutil.rmtree(self.tempdir)
- def Mktemp(self):
+ def _Mktemp(self):
self.tempdir = tempfile.mkdtemp()
- def CreateNmfUtils(self, libdir=None):
- if not libdir:
- libdir = os.path.join(self.toolchain, 'x86_64-nacl', 'lib32')
- return create_nmf.NmfUtils([self.dyn_nexe],
- lib_path=[libdir],
- objdump=self.objdump)
+ def _CreateNmfUtils(self, nexes, **kwargs):
+ if not kwargs.get('lib_path'):
+ # Use lib instead of lib64 (lib64 is a symlink to lib).
+ kwargs['lib_path'] = [
+ os.path.join(self.toolchain, 'x86_64-nacl', 'lib'),
+ os.path.join(self.toolchain, 'x86_64-nacl', 'lib32')]
+ return create_nmf.NmfUtils(nexes,
+ objdump=self.objdump,
+ **kwargs)
+
+ def _CreateStatic(self, arch_path=None, **kwargs):
+ """Copy all static .nexe files from the DATA_DIR to a temporary directory.
+
+ Args:
+ arch_path: A dictionary mapping architecture to the directory to generate
+ the .nexe for the architecture in.
+ kwargs: Keyword arguments to pass through to create_nmf.NmfUtils
+ constructor.
+
+ Returns:
+ A tuple with 2 elements:
+ * The generated NMF as a dictionary (i.e. parsed by json.loads)
+ * A list of the generated .nexe paths
+ """
+ arch_path = arch_path or {}
+ nexes = []
+ for arch in ('x86_64', 'x86_32', 'arm'):
+ nexe_name = 'test_static_%s.nexe' % arch
+ src_nexe = os.path.join(DATA_DIR, nexe_name)
+ dst_nexe = os.path.join(self.tempdir, arch_path.get(arch, ''), nexe_name)
+ dst_dir = os.path.dirname(dst_nexe)
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
+ shutil.copy(src_nexe, dst_nexe)
+ nexes.append(dst_nexe)
+
+ nexes.sort()
+ nmf_utils = self._CreateNmfUtils(nexes, **kwargs)
+ nmf = json.loads(nmf_utils.GetJson())
+ return nmf, nexes
+
+ def _CreateDynamicAndStageDeps(self, arch_path=None, **kwargs):
+ """Create dynamic .nexe files and put them in a temporary directory, with
+ their dependencies staged in the same directory.
+
+ Args:
+ arch_path: A dictionary mapping architecture to the directory to generate
+ the .nexe for the architecture in.
+ kwargs: Keyword arguments to pass through to create_nmf.NmfUtils
+ constructor.
+
+ Returns:
+ A tuple with 2 elements:
+ * The generated NMF as a dictionary (i.e. parsed by json.loads)
+ * A list of the generated .nexe paths
+ """
+ arch_path = arch_path or {}
+ nexes = []
+ for arch in ('x86_64', 'x86_32'):
+ nexe_name = 'test_dynamic_%s.nexe' % arch
+ rel_nexe = os.path.join(arch_path.get(arch, ''), nexe_name)
+ arch_alt = 'i686' if arch == 'x86_32' else arch
+ nexe = self._CreateTestNexe(rel_nexe, arch_alt)
+ nexes.append(nexe)
+
+ nexes.sort()
+ nmf_utils = self._CreateNmfUtils(nexes, **kwargs)
+ nmf = json.loads(nmf_utils.GetJson())
+ nmf_utils.StageDependencies(self.tempdir)
+
+ return nmf, nexes
+
+ def _CreatePexe(self, **kwargs):
+ """Copy test.pexe from the DATA_DIR to a temporary directory.
+
+ Args:
+ kwargs: Keyword arguments to pass through to create_nmf.NmfUtils
+ constructor.
+
+ Returns:
+ A tuple with 2 elements:
+ * The generated NMF as a dictionary (i.e. parsed by json.loads)
+ * A list of the generated .pexe paths
+ """
+ pexe_name = 'test.pexe'
+ src_pexe = os.path.join(DATA_DIR, pexe_name)
+ dst_pexe = os.path.join(self.tempdir, pexe_name)
+ shutil.copy(src_pexe, dst_pexe)
- def testGetNeededStatic(self):
- nexe = os.path.join(DATA_DIR, 'test_static_x86_32.nexe')
- nmf = create_nmf.NmfUtils([nexe])
- needed = nmf.GetNeeded()
+ pexes = [dst_pexe]
+ nmf_utils = self._CreateNmfUtils(pexes, **kwargs)
+ nmf = json.loads(nmf_utils.GetJson())
- # static nexe should have exactly one needed file
- self.assertEqual(len(needed), 1)
- self.assertEqual(needed.keys()[0], nexe)
+ return nmf, pexes
- # arch of needed file should be x86-32
- archfile = needed.values()[0]
- self.assertEqual(archfile.arch, 'x86-32')
+ def assertManifestEquals(self, manifest, expected):
+ """Compare two manifest dictionaries.
- def StripDependencies(self, deps):
- """Strip the dirnames and version suffixes from
- a list of nexe dependencies.
+ The input manifest is regenerated with all string keys and values being
+ processed through StripSo, to remove the random hexidecimal characters at
+ the end of shared object names.
- e.g:
- /path/to/libpthread.so.1a2d3fsa -> libpthread.so
+ Args:
+ manifest: The generated manifest.
+ expected: The expected manifest.
+ """
+ def StripSoCopyDict(d):
+ new_d = {}
+ for k, v in d.iteritems():
+ new_k = StripSo(k)
+ if isinstance(v, (str, unicode)):
+ new_v = StripSo(v)
+ elif type(v) is list:
+ new_v = v[:]
+ elif type(v) is dict:
+ new_v = StripSoCopyDict(v)
+ else:
+ # Assume that anything else can be copied directly.
+ new_v = v
+
+ new_d[new_k] = new_v
+ return new_d
+
+ self.assertEqual(StripSoCopyDict(manifest), expected)
+
+ def assertStagingEquals(self, expected):
+ """Compare the contents of the temporary directory, to an expected
+ directory layout.
+
+ Args:
+ expected: The expected directory layout.
"""
- names = []
- for name in deps:
- name = os.path.basename(name)
- if '.so.' in name:
- name = name.rsplit('.', 1)[0]
- names.append(name)
- return names
-
- def testGetNeededDynamic(self):
- nmf = self.CreateNmfUtils()
- needed = nmf.GetNeeded()
- names = needed.keys()
-
- # this nexe has 5 dependencies
- expected = set(self.dyn_deps)
- expected.add(os.path.basename(self.dyn_nexe))
-
- basenames = set(self.StripDependencies(names))
- self.assertEqual(expected, basenames)
-
- def testStageDependencies(self):
- self.Mktemp()
- nmf = self.CreateNmfUtils()
- #create_nmf.DebugPrint.debug_mode = True
- #create_nmf.Trace.verbose = True
-
- # Stage dependencies
- nmf.StageDependencies(self.tempdir)
-
- # Verify directory contents
- contents = set(os.listdir(self.tempdir))
- expectedContents = set((os.path.basename(self.dyn_nexe), 'lib32'))
- self.assertEqual(contents, expectedContents)
-
- contents = os.listdir(os.path.join(self.tempdir, 'lib32'))
- contents = self.StripDependencies(contents)
- contents = set(contents)
- expectedContents = self.dyn_deps
- self.assertEqual(contents, expectedContents)
-
- def testMissingArchLibrary(self):
- self.Mktemp()
- nmf = self.CreateNmfUtils()
- # CreateNmfUtils uses the 32-bit library path, but not the 64-bit one
- # so searching for a 32-bit library should succeed while searching for
- # a 64-bit one should fail.
- nmf.GleanFromObjdump(['libgcc_s.so.1'], 'x86-32')
- self.assertRaises(create_nmf.Error,
- nmf.GleanFromObjdump, ['libgcc_s.so.1'], 'x86-64')
+ all_files = []
+ for root, _, files in os.walk(self.tempdir):
+ rel_root_posix = PosixRelPath(root, self.tempdir)
+ for f in files:
+ path = posixpath.join(rel_root_posix, StripSo(f))
+ if path.startswith('./'):
+ path = path[2:]
+ all_files.append(path)
+ self.assertEqual(set(expected), set(all_files))
+
+
+ def testStatic(self):
+ nmf, _ = self._CreateStatic()
+ expected_manifest = {
+ 'files': {},
+ 'program': {
+ 'x86-64': {'url': 'test_static_x86_64.nexe'},
+ 'x86-32': {'url': 'test_static_x86_32.nexe'},
+ 'arm': {'url': 'test_static_arm.nexe'},
+ }
+ }
+ self.assertManifestEquals(nmf, expected_manifest)
+
+ def testStaticWithPath(self):
+ arch_dir = {'x86_32': 'x86_32', 'x86_64': 'x86_64', 'arm': 'arm'}
+ nmf, _ = self._CreateStatic(arch_dir, nmf_root=self.tempdir)
+ expected_manifest = {
+ 'files': {},
+ 'program': {
+ 'x86-32': {'url': 'x86_32/test_static_x86_32.nexe'},
+ 'x86-64': {'url': 'x86_64/test_static_x86_64.nexe'},
+ 'arm': {'url': 'arm/test_static_arm.nexe'},
+ }
+ }
+ self.assertManifestEquals(nmf, expected_manifest)
+
+ def testStaticWithPathNoNmfRoot(self):
+ # This case is not particularly useful, but it is similar to how create_nmf
+ # used to work. If there is no nmf_root given, all paths are relative to
+ # the first nexe passed on the commandline. I believe the assumption
+ # previously was that all .nexes would be in the same directory.
+ arch_dir = {'x86_32': 'x86_32', 'x86_64': 'x86_64', 'arm': 'arm'}
+ nmf, _ = self._CreateStatic(arch_dir)
+ expected_manifest = {
+ 'files': {},
+ 'program': {
+ 'x86-32': {'url': '../x86_32/test_static_x86_32.nexe'},
+ 'x86-64': {'url': '../x86_64/test_static_x86_64.nexe'},
+ 'arm': {'url': 'test_static_arm.nexe'},
+ }
+ }
+ self.assertManifestEquals(nmf, expected_manifest)
+
+ def testStaticWithNexePrefix(self):
+ nmf, _ = self._CreateStatic(nexe_prefix='foo')
+ expected_manifest = {
+ 'files': {},
+ 'program': {
+ 'x86-64': {'url': 'foo/test_static_x86_64.nexe'},
+ 'x86-32': {'url': 'foo/test_static_x86_32.nexe'},
+ 'arm': {'url': 'foo/test_static_arm.nexe'},
+ }
+ }
+ self.assertManifestEquals(nmf, expected_manifest)
+
+ def testDynamic(self):
+ nmf, nexes = self._CreateDynamicAndStageDeps()
+ expected_manifest = {
+ 'files': {
+ 'main.nexe': {
+ 'x86-32': {'url': 'test_dynamic_x86_32.nexe'},
+ 'x86-64': {'url': 'test_dynamic_x86_64.nexe'},
+ },
+ 'libc.so': {
+ 'x86-32': {'url': 'lib32/libc.so'},
+ 'x86-64': {'url': 'lib64/libc.so'},
+ },
+ 'libgcc_s.so': {
+ 'x86-32': {'url': 'lib32/libgcc_s.so'},
+ 'x86-64': {'url': 'lib64/libgcc_s.so'},
+ },
+ 'libpthread.so': {
+ 'x86-32': {'url': 'lib32/libpthread.so'},
+ 'x86-64': {'url': 'lib64/libpthread.so'},
+ },
+ },
+ 'program': {
+ 'x86-32': {'url': 'lib32/runnable-ld.so'},
+ 'x86-64': {'url': 'lib64/runnable-ld.so'},
+ }
+ }
+
+ expected_staging = [os.path.basename(f) for f in nexes]
+ expected_staging.extend([
+ 'lib32/libc.so',
+ 'lib32/libgcc_s.so',
+ 'lib32/libpthread.so',
+ 'lib32/runnable-ld.so',
+ 'lib64/libc.so',
+ 'lib64/libgcc_s.so',
+ 'lib64/libpthread.so',
+ 'lib64/runnable-ld.so'])
+
+ self.assertManifestEquals(nmf, expected_manifest)
+ self.assertStagingEquals(expected_staging)
+
+ def testDynamicWithPath(self):
+ arch_dir = {'x86_64': 'x86_64', 'x86_32': 'x86_32'}
+ nmf, nexes = self._CreateDynamicAndStageDeps(arch_dir,
+ nmf_root=self.tempdir)
+ expected_manifest = {
+ 'files': {
+ 'main.nexe': {
+ 'x86-32': {'url': 'x86_32/test_dynamic_x86_32.nexe'},
+ 'x86-64': {'url': 'x86_64/test_dynamic_x86_64.nexe'},
+ },
+ 'libc.so': {
+ 'x86-32': {'url': 'x86_32/lib32/libc.so'},
+ 'x86-64': {'url': 'x86_64/lib64/libc.so'},
+ },
+ 'libgcc_s.so': {
+ 'x86-32': {'url': 'x86_32/lib32/libgcc_s.so'},
+ 'x86-64': {'url': 'x86_64/lib64/libgcc_s.so'},
+ },
+ 'libpthread.so': {
+ 'x86-32': {'url': 'x86_32/lib32/libpthread.so'},
+ 'x86-64': {'url': 'x86_64/lib64/libpthread.so'},
+ },
+ },
+ 'program': {
+ 'x86-32': {'url': 'x86_32/lib32/runnable-ld.so'},
+ 'x86-64': {'url': 'x86_64/lib64/runnable-ld.so'},
+ }
+ }
+
+ expected_staging = [PosixRelPath(f, self.tempdir) for f in nexes]
+ expected_staging.extend([
+ 'x86_32/lib32/libc.so',
+ 'x86_32/lib32/libgcc_s.so',
+ 'x86_32/lib32/libpthread.so',
+ 'x86_32/lib32/runnable-ld.so',
+ 'x86_64/lib64/libc.so',
+ 'x86_64/lib64/libgcc_s.so',
+ 'x86_64/lib64/libpthread.so',
+ 'x86_64/lib64/runnable-ld.so'])
+
+ self.assertManifestEquals(nmf, expected_manifest)
+ self.assertStagingEquals(expected_staging)
+
+ def testDynamicWithRelPath(self):
+ """Test that when the nmf root is a relative path that things work."""
+ arch_dir = {'x86_64': 'x86_64', 'x86_32': 'x86_32'}
+ old_path = os.getcwd()
+ try:
+ os.chdir(self.tempdir)
+ nmf, nexes = self._CreateDynamicAndStageDeps(arch_dir, nmf_root='')
+ expected_manifest = {
+ 'files': {
+ 'main.nexe': {
+ 'x86-32': {'url': 'x86_32/test_dynamic_x86_32.nexe'},
+ 'x86-64': {'url': 'x86_64/test_dynamic_x86_64.nexe'},
+ },
+ 'libc.so': {
+ 'x86-32': {'url': 'x86_32/lib32/libc.so'},
+ 'x86-64': {'url': 'x86_64/lib64/libc.so'},
+ },
+ 'libgcc_s.so': {
+ 'x86-32': {'url': 'x86_32/lib32/libgcc_s.so'},
+ 'x86-64': {'url': 'x86_64/lib64/libgcc_s.so'},
+ },
+ 'libpthread.so': {
+ 'x86-32': {'url': 'x86_32/lib32/libpthread.so'},
+ 'x86-64': {'url': 'x86_64/lib64/libpthread.so'},
+ },
+ },
+ 'program': {
+ 'x86-32': {'url': 'x86_32/lib32/runnable-ld.so'},
+ 'x86-64': {'url': 'x86_64/lib64/runnable-ld.so'},
+ }
+ }
+
+ expected_staging = [PosixRelPath(f, self.tempdir) for f in nexes]
+ expected_staging.extend([
+ 'x86_32/lib32/libc.so',
+ 'x86_32/lib32/libgcc_s.so',
+ 'x86_32/lib32/libpthread.so',
+ 'x86_32/lib32/runnable-ld.so',
+ 'x86_64/lib64/libc.so',
+ 'x86_64/lib64/libgcc_s.so',
+ 'x86_64/lib64/libpthread.so',
+ 'x86_64/lib64/runnable-ld.so'])
+
+ self.assertManifestEquals(nmf, expected_manifest)
+ self.assertStagingEquals(expected_staging)
+ finally:
+ os.chdir(old_path)
+
+ def testDynamicWithPathNoArchPrefix(self):
+ arch_dir = {'x86_64': 'x86_64', 'x86_32': 'x86_32'}
+ nmf, nexes = self._CreateDynamicAndStageDeps(arch_dir,
+ nmf_root=self.tempdir,
+ no_arch_prefix=True)
+ expected_manifest = {
+ 'files': {
+ 'main.nexe': {
+ 'x86-32': {'url': 'x86_32/test_dynamic_x86_32.nexe'},
+ 'x86-64': {'url': 'x86_64/test_dynamic_x86_64.nexe'},
+ },
+ 'libc.so': {
+ 'x86-32': {'url': 'x86_32/libc.so'},
+ 'x86-64': {'url': 'x86_64/libc.so'},
+ },
+ 'libgcc_s.so': {
+ 'x86-32': {'url': 'x86_32/libgcc_s.so'},
+ 'x86-64': {'url': 'x86_64/libgcc_s.so'},
+ },
+ 'libpthread.so': {
+ 'x86-32': {'url': 'x86_32/libpthread.so'},
+ 'x86-64': {'url': 'x86_64/libpthread.so'},
+ },
+ },
+ 'program': {
+ 'x86-32': {'url': 'x86_32/runnable-ld.so'},
+ 'x86-64': {'url': 'x86_64/runnable-ld.so'},
+ }
+ }
+
+ expected_staging = [PosixRelPath(f, self.tempdir) for f in nexes]
+ expected_staging.extend([
+ 'x86_32/libc.so',
+ 'x86_32/libgcc_s.so',
+ 'x86_32/libpthread.so',
+ 'x86_32/runnable-ld.so',
+ 'x86_64/libc.so',
+ 'x86_64/libgcc_s.so',
+ 'x86_64/libpthread.so',
+ 'x86_64/runnable-ld.so'])
+
+ self.assertManifestEquals(nmf, expected_manifest)
+ self.assertStagingEquals(expected_staging)
+
+ def testDynamicWithLibPrefix(self):
+ nmf, nexes = self._CreateDynamicAndStageDeps(lib_prefix='foo')
+ expected_manifest = {
+ 'files': {
+ 'main.nexe': {
+ 'x86-32': {'url': 'test_dynamic_x86_32.nexe'},
+ 'x86-64': {'url': 'test_dynamic_x86_64.nexe'},
+ },
+ 'libc.so': {
+ 'x86-32': {'url': 'foo/lib32/libc.so'},
+ 'x86-64': {'url': 'foo/lib64/libc.so'},
+ },
+ 'libgcc_s.so': {
+ 'x86-32': {'url': 'foo/lib32/libgcc_s.so'},
+ 'x86-64': {'url': 'foo/lib64/libgcc_s.so'},
+ },
+ 'libpthread.so': {
+ 'x86-32': {'url': 'foo/lib32/libpthread.so'},
+ 'x86-64': {'url': 'foo/lib64/libpthread.so'},
+ },
+ },
+ 'program': {
+ 'x86-32': {'url': 'foo/lib32/runnable-ld.so'},
+ 'x86-64': {'url': 'foo/lib64/runnable-ld.so'},
+ }
+ }
+
+ expected_staging = [PosixRelPath(f, self.tempdir) for f in nexes]
+ expected_staging.extend([
+ 'foo/lib32/libc.so',
+ 'foo/lib32/libgcc_s.so',
+ 'foo/lib32/libpthread.so',
+ 'foo/lib32/runnable-ld.so',
+ 'foo/lib64/libc.so',
+ 'foo/lib64/libgcc_s.so',
+ 'foo/lib64/libpthread.so',
+ 'foo/lib64/runnable-ld.so'])
+
+ self.assertManifestEquals(nmf, expected_manifest)
+ self.assertStagingEquals(expected_staging)
+
+ def testPexe(self):
+ nmf, _ = self._CreatePexe()
+ expected_manifest = {
+ 'program': {
+ 'portable': {
+ 'pnacl-translate': {
+ 'url': 'test.pexe'
+ }
+ }
+ }
+ }
+ self.assertManifestEquals(nmf, expected_manifest)
+
+ def testPexeOptLevel(self):
+ nmf, _ = self._CreatePexe(pnacl_optlevel=2)
+ expected_manifest = {
+ 'program': {
+ 'portable': {
+ 'pnacl-translate': {
+ 'url': 'test.pexe',
+ 'optlevel': 2,
+ }
+ }
+ }
+ }
+ self.assertManifestEquals(nmf, expected_manifest)
if __name__ == '__main__':