Index: native_client_sdk/doc_generated/migration/index.html |
diff --git a/native_client_sdk/doc_generated/migration/index.html b/native_client_sdk/doc_generated/migration/index.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0680d0383a774e6872c83ae7323fb9a5017dca66 |
--- /dev/null |
+++ b/native_client_sdk/doc_generated/migration/index.html |
@@ -0,0 +1,6125 @@ |
+{{+bindTo:partials.standard_nacl_article}} |
+ |
+<section id="p-nacl-migration-guide"> |
+<span id="migration"></span><h1 id="p-nacl-migration-guide"><span id="migration"></span>(P)NaCl Migration Guide</h1> |
+<h2 id="deprecation-announcements">Deprecation Announcements</h2> |
+<p>We recently announced the deprecation of Portable NativeClient |
+as well as the deprecation of |
+<a class="reference external" href="https://blog.chromium.org/2016/08/from-chrome-apps-to-web.html">Chrome Apps</a> |
+outside of ChromeOS. |
+As a result, in the near future, PNaCl will no longer be supported in Chrome. |
+And NaCl will be supported only in the context of ChromeOS and Extensions.</p> |
+<p>We appreciate the investment you’ve made bringing native code to the Web |
+with these pioneering solutions, but have now refocused our efforts |
+on the cross browser <a class="reference external" href="http://webassembly.org">WebAssembly</a> standard |
+in order to bring similar functionality to the Web in general. |
+While WebAssembly currently cannot match all of (P)NaCl’s capabilities, |
+we are working to expand its capabilities in tandem with other |
+browsers, and believe most use cases will soon be covered.</p> |
+<h2 id="toolchain-migration">Toolchain Migration</h2> |
+<p>For the majority of (P)NaCl uses cases we recommend transitioning |
+from the NaCl SDK to <a class="reference external" href="http://webassembly.org/getting-started/developers-guide/">Emscripten</a>. |
+While direct support for NaCl / Pepper APIs in not available, |
+we’ve attempted to list equivalents. |
+Migration is likely to be reasonably straightforward |
+if your application is portable to Linux, uses SDL, or POSIX APIs. |
+For more challenging porting cases, please reach out on |
+<a class="reference external" href="mailto:native-client-discuss%40googlegroups.com">native-client-discuss<span>@</span>googlegroups<span>.</span>com</a></p> |
+<h2 id="api-migration">API Migration</h2> |
+<p>We’ve outlined here the status of Web Platform substitutes for each |
+of the APIs exposed to (P)NaCl. |
+Additionally, the table lists the library or option in Emscripten |
+that offers the closest substitute.</p> |
+<p>We expect to add shared memory threads support to WebAssembly in 2017, |
+as threads are crucial to matching (P)NaCl’s most interesting use |
+cases. Migration items which assume forthcoming threads support |
+are marked below. If your application’s flow control relies heavily on blocking |
+APIs, you may also find threads support is required for convenient porting.</p> |
+<p>While we’ve tried to be accurate in this table, |
+there are no doubt errors or omissions. |
+If you encounter one, please reach out to us on |
+<a class="reference external" href="mailto:native-client-discuss%40googlegroups.com">native-client-discuss<span>@</span>googlegroups<span>.</span>com</a></p> |
+<h2 id="ppapi">PPAPI</h2> |
+<table> |
+</table> |
+<h3>PPB_Audio</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14/M31 </td> |
+ <td>x </td> |
+ <td>SDL (partial) </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</td> |
+ <td>Still being standardized. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCurrentConfig </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioContext.* (gets back settings passed in) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>StartPlayback </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.start </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>StopPlayback </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.stop </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_AudioBuffer</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.start (parameter) </td> |
+ <td>Passed in each time instead of attached to the buffer. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.start (parameter) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleRate </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.sampleRate </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - WebAudio only uses 32-bit float, PPAPI does 16-bit int.</td> |
+ <td>PPAPI theoretically supports multiple sampling sizes. In practice, it only supports 16-bit samples. Unfortunately, developers like Unity have requested 16-bit sample sizes. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetNumberOfChannels </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.numberOfChannels </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDataBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.getChannelData </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBufferSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_AudioConfig</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CreateStereo16Bit </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - Only 32-bit float samples supported</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleRate </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioContext.sampleRate </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleFrameCount </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecommendSampleRate </td> |
+ <td>M19 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioContext.sampleRate (from default construct) </td> |
+ <td>An AudioContext will have the preferred sampling rate by default. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecommendSampleFrameCount </td> |
+ <td>M14(d)/M19 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No mechanism to get a recomended buffer size.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Console</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Log </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>utime </td> |
+ <td>console.log/warn/error/... </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>LogWithSource </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>PPAPI provides a way to override the source filename and line number in a console message. |
+(Though JS API provides way to style text). </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Core</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>getTime </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>utime </td> |
+ <td>new Date().getTime() </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>getTimeTicks </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>utime </td> |
+ <td>new Date().getTime() </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsMainThread </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>window.document !== undefined </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CallOnMainThread </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>Worker.postMessage + Atomics.wait </td> |
+ <td>Equivalent synchronization can be built. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_FileIO</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td> |
+ <td>Create and open are used differently, but the pieces are of equal power. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Open </td> |
+ <td>M14/M29 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Query </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getMetadata </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Touch </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access time either.</td> |
+ <td>Modify time can be bumped by writing. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Read </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getFile + Blob.slice + FileReader.getBinaryData </td> |
+ <td>Note, this API requires an extra copy to get a read into linear memory, and may be worse than that if Blob slices are not optimizes to use mmap. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Write </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileWriter.seek + FileWriter.write 'write*' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetLength </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileWriter.truncate + 'write*' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Flush </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent, no way to flush.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>No equivalent, open files and directories are implicitly closed. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReadToArray </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent.</td> |
+ <td>Allows multiple subrange reads in parallel. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_FileRef</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getFile(..., {create:true}) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFileSystemType </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileSystem.type </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetName </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.name </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetPath </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.fullPath </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetParent </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getParent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>MakeDirectory </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getDirectory(..., {create:true}) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Touch </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access time either.</td> |
+ <td>Modify time can be bumped by writing. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Delete </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.remove </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Rename </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.moveTo </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Query </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>Entry.getMetadata </td> |
+ <td bgcolor="#ffcccc">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReadDirectoryEntries </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Directory.readEntries </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_FileSystem</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>window.requestFileSystem </td> |
+ <td>JS API does both in one step </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Open </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>window.requestFileSystem </td> |
+ <td bgcolor="#ffcccc">GAP - Filesystems API is chrome only. IndexedDB has additional performance limitations around subrange writes.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetType </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>FileSystem.type </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Fullscreen</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsFullScreen </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>html5.h </td> |
+ <td>Document.fullscreenEnabled </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetFullscreen </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>html5.h </td> |
+ <td>Document.requestFullscreen </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScreenSize </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>html5.h </td> |
+ <td>Document.exitFullscreen </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Gamepad</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Sample </td> |
+ <td>M19 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Gamepad.* </td> |
+ <td bgcolor="#ffcccc">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is speced).</td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Graphics2D</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext('2d') </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Describe </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.clientWidth + Canvas.clientHeight </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PaintImageData </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.putImageData </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Scroll </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CanvasRenderingContext2d.scrollIntoView </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - Not an exact match (might have to resort to getImageData + putImageData which will be slow). Not a cross-browser standard.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReplaceContents </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.drawImage </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Flush </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - Only returning to the event loop triggers the flush.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetScale </td> |
+ <td>M27 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.scale </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScale </td> |
+ <td>M27 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.currentTransform </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetLayerTransform </td> |
+ <td>M52 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.setTransform |
+CanvasRenderingContext2d.scale |
+CanvasRenderingContext2d.translate </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Graphics3D</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttribMaxValue </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - Canvas.getContext lets you set booleans requesting depth / stencil buffers of certain sizes, but does not have a way to query what's possible (or get anything other than on or off for each)</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttribs </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WebGLRenderingContext.getContextAttributes </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetAttribs </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext(.., OPTIONS) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetError </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WebGLRenderingContext.getError </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ResizeBuffers </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td><Canvas>.width = w; <Canvas>.height = h; </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SwapBuffers </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No way to explicitly flip a frame, must return to the event loop.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_ImageData</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetNativeImageDataFormat </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData mandates RGBA order </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsImageDataFormatSupported </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData mandates RGBA order </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.createImageData </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Describe </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData never has a stride </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Map </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData.data </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Unmap </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData.data </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_InputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RequestInputEvents </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>No direct equivalent </td> |
+ <td>The lack of this feature is probably less relevant as JS / Wasm runs on the main thread and can more cheaply filter events without incurring a cross process round-trip. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RequestFilteringInputEvents </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>mouse* key* wheel* touch* composition* Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.addEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ClearInputEventRequest </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.removeEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetType </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Event class descendants </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTimeStamp </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Event.timeStamp </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetModifiers </td> |
+ <td>M13/M55 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>*Event.altKey/shiftKey/metaKey/ctrlKey </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MouseInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13/M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetButton </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent.button </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetPosition </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent.client*/page*/offset* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetClickCount </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>dblclick' vs 'mousedown' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetMovement </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent.movement* </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_WheelInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WheelEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDelta </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WheelEvent.delta* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTicks </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incompletely.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScrollByPage </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incompletely.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_KeyboardInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13/M34 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetKeyCode </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent.keyCode </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCharacterText </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent.key </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCode </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent.code </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_TouchInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AddTouchPoint </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent.touches.push </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTouchCount </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent.touches.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTouchByIndex </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent.touches[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTouchById </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Touch.indentifer (to figure this out yourself) </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_IMEInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CompositionEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetText </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CompositionEvent.data </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSegmentNumber </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSegmentOffset </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTargetSegment </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSelection </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Instance</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>BindGraphics </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext (moot as binding is automatic). </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsFullFrame </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent to mime type handlers.</td> |
+ <td>NaCl apps can be registered to handle a particular mime type and own the whole document. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MediaStreamAudioTrack</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Configure </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttrib </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.channelCount </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.sampleSize </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.sampleRate </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetId </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.id </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HasEnded </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.ended </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecycleBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MediaStreamVideoTrack</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M36(dev) </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td>Ability to create synthetic stream. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Configure </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttrib </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.width </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.height </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetId </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.id </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HasEnded </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.ended </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFrame </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecycleFrame </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetEmptyFrame </td> |
+ <td>M36(dev) </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PutFrame </td> |
+ <td>M36(dev) </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MessageLoop</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetForMainThread </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCurrent </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AttachToCurrentThread </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Run </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PostWork </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PostQuit </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Messaging</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PostMessage </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Window.postMessage </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RegisterMessageHandler </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Window.addEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UnregisterMessageHandler </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Window.removeEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MouseCursor</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetCursor </td> |
+ <td>M19 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.style.cursor </td> |
+ <td>Same set of stock cursors are supported. |
+Custom cursors can be done with url(..). |
+Dynamic custom cursors can be done with data URIs. |
+CSS3 supports specifying the hotspot. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MouseLock</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>LockMouse </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.requestPointerLock </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UnlockMouse </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.exitPointerLock </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_OpenGLES2</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Several Methods </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>OpenGLES </td> |
+ <td>Close to WebGL 1.0 in functionality. </td> |
+ <td>TODO(bradnelson): more detail </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td>x </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP - Without offscreen canvas, rendering must be done on the main thread.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_TextInputController</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetTextInputType </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td>Unity has specifically raised a desire to either be able to hint in this fashion, or preferrably the ability to intercept and display IME events / output inline inside a canvas. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UpdateCaretPosition </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CancelCompositionText </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UpdateSurroundingText </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_URLLoader</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>new XMLHttpRequest(); </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Open </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.open </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>FollowRedirect </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Request.redirect </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No XMLHTTPRequest equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetUploadProgress </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest 'progress' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDownloadProgress </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest 'progress' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetResponseInfo </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.getAllResponseHeaders </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Response.* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReadResponseBody </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.response </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Body.* (Response is a Body) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>FinishStreamingToFile </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td>XMLHttpRequest and Fetch both assume streaming to memory, rather than directly to a storage. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.abort </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_URLRequestInfo</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Request </td> |
+ <td>No way to stream to a file. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetProperty </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent for XMLHttpRequest</td> |
+ <td>XMLHttpRequest doesn't provide direct ways to per-request limit following redirects, stream to a file, set referrer or credentials policy. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Request.* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AppendDataToBody </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.send </td> |
+ <td bgcolor="#ffcccc">GAP - Both must have the whole body, rather than a chunk.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>fetch(.., options:body) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AppendFileToBody </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td><form> </td> |
+ <td>You can also read with FileReader and upload, but that's more like AppendDataToBody </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_URLResponseInfo</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetProperty </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.getAllResponseHeaders + others </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Response.* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBodyAsFileRef </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Response (Body) .blob() </td> |
+ <td>Assumes storage layer optimizes transfer. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Var</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarFromUtf8 </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>TextDecoder.decode </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarToUtf8 </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>TextEncoder.encode </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarFromResource </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>N/A </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarToResource </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>N/A </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VarArray</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Get </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Set </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array[i] = x </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetLength </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetLength </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array.length = n </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VarArrayBuffer</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>new ArrayBuffer(n) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ByteLength </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>ArrayBuffer.byteLength </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Map </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td>Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap. |
+Future multiple memories or memory mapping might improve this. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Unmap </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VarDictionary</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>{} </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Get </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Object>[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Set </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Object>[i] = x </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Delete </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>delete <Object>[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HasKey </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>x in <Object> </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetKeys </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>for (k in <Object>) {} </td> |
+ <td>No literal equivalent, but it can be built. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VideoDecoder</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Initialize </td> |
+ <td>M39/M46 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Decode </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetPicture </td> |
+ <td>M40 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecyclePicture </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Flush </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Reset </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VideoEncoder</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td>Overlap with MediaRecorder API, but not exact. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSupportedProfiles </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Initialize </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFramesRequired </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFrameCodedSize </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetVideoFrame </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Encode </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBitstreamBuffer </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecycleBitstreamBuffer </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RequestEncodingParametersChange </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VideoFrame</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFormat </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDataBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDataBufferSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_View</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetRect </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Element.getBoundingClientRect </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsFullscreen </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Document.fullScreenEnabled </td> |
+ <td>Pertains to document instead of just single element. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsVisible </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>IntersectionObserver </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsPageVisible </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>document.visibilityState </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetClipRect </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>IntersectionObserver </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDeviceScale </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>window.devicePixelRatio </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCSSScale </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Element>.getBoundingClientRect().width / <Element>.offsetWidth </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScrollOffset </td> |
+ <td>M37 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Element>.scrollTop / <Element>.scrollLeft </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_WebSocket</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.WebSocket </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Connect </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.WebSocket(url, ...) |
+WebSocket 'open' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.close </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReceiveMessage </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket 'message' Event |
+WebSocket 'error' Event |
+WebSocket 'close' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SendMessage </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.send </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBufferedAmount </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.bufferedAmount </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCloseCode </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CloseEvent.code </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCloseReason </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CloseEvent.reason </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCloseWasClean </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CloseEvent.wasClean </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetExtensions </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.extensions </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetProtocol </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.protocol </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetReadyState </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.readyState </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetURL </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.url </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_Graphics3D</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Graphics3DContextLost </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas 'webglcontextlost' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_InputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleInputEvent </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.addEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_Instance</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidCreate </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td><Element>[key] </td> |
+ <td>General DOM access lets you fish out tag attributes </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidDestroy </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>N/A </td> |
+ <td>Not triggered for NaCl </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidChangeView </td> |
+ <td>M14/M17 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Element 'resize' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidChangeFocus </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Element 'focus', 'focusin', 'focusout' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleDocumentLoad </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td bgcolor="#ffcccc">GAP - No way to register as a mime type handler</td> |
+ <td>NaCl modules via apps + a manifest entry can be set up to handle particular mime types. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_MessageHandler</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleMessage </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>MessagePort 'message' Event |
+Window 'message' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleBlockingMessage </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td>Similar synchronization can be done off main thread with Atomics.wait. This was added to support emulation of synchronous plugin APIs. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_Messaging</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleMessage </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>MessagePort 'message' Event |
+Window 'message' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_MouseLock</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>MouseLockLost </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element 'pointerlockchange', 'pointerlockerror' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h2 id="irt">IRT</h2> |
+<table> |
+</table> |
+<h3>PPB_Audio</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14/M31 </td> |
+ <td>x </td> |
+ <td>SDL (partial) </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</td> |
+ <td>Still being standardized. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCurrentConfig </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioContext.* (gets back settings passed in) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>StartPlayback </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.start </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>StopPlayback </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.stop </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_AudioBuffer</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.start (parameter) </td> |
+ <td>Passed in each time instead of attached to the buffer. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBufferSourceNode.start (parameter) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleRate </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.sampleRate </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - WebAudio only uses 32-bit float, PPAPI does 16-bit int.</td> |
+ <td>PPAPI theoretically supports multiple sampling sizes. In practice, it only supports 16-bit samples. Unfortunately, developers like Unity have requested 16-bit sample sizes. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetNumberOfChannels </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.numberOfChannels </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDataBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.getChannelData </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBufferSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_AudioConfig</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CreateStereo16Bit </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - Only 32-bit float samples supported</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleRate </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioContext.sampleRate </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSampleFrameCount </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioBuffer.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecommendSampleRate </td> |
+ <td>M19 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>AudioContext.sampleRate (from default construct) </td> |
+ <td>An AudioContext will have the preferred sampling rate by default. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecommendSampleFrameCount </td> |
+ <td>M14(d)/M19 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No mechanism to get a recomended buffer size.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Console</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Log </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>utime </td> |
+ <td>console.log/warn/error/... </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>LogWithSource </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>PPAPI provides a way to override the source filename and line number in a console message. |
+(Though JS API provides way to style text). </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Core</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>getTime </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>utime </td> |
+ <td>new Date().getTime() </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>getTimeTicks </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>utime </td> |
+ <td>new Date().getTime() </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsMainThread </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>window.document !== undefined </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CallOnMainThread </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>Worker.postMessage + Atomics.wait </td> |
+ <td>Equivalent synchronization can be built. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_FileIO</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td> |
+ <td>Create and open are used differently, but the pieces are of equal power. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Open </td> |
+ <td>M14/M29 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Query </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getMetadata </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Touch </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access time either.</td> |
+ <td>Modify time can be bumped by writing. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Read </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getFile + Blob.slice + FileReader.getBinaryData </td> |
+ <td>Note, this API requires an extra copy to get a read into linear memory, and may be worse than that if Blob slices are not optimizes to use mmap. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Write </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileWriter.seek + FileWriter.write 'write*' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetLength </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileWriter.truncate + 'write*' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Flush </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent, no way to flush.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>No equivalent, open files and directories are implicitly closed. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReadToArray </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent.</td> |
+ <td>Allows multiple subrange reads in parallel. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_FileRef</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getFile(..., {create:true}) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFileSystemType </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>FileSystem.type </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetName </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.name </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetPath </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.fullPath </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetParent </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getParent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>MakeDirectory </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.getDirectory(..., {create:true}) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Touch </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access time either.</td> |
+ <td>Modify time can be bumped by writing. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Delete </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.remove </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Rename </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Entry.moveTo </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Query </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>Entry.getMetadata </td> |
+ <td bgcolor="#ffcccc">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReadDirectoryEntries </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>Directory.readEntries </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_FileSystem</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>FS (partial) </td> |
+ <td>window.requestFileSystem </td> |
+ <td>JS API does both in one step </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Open </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>window.requestFileSystem </td> |
+ <td bgcolor="#ffcccc">GAP - Filesystems API is chrome only. IndexedDB has additional performance limitations around subrange writes.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetType </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>FileSystem.type </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Fullscreen</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsFullScreen </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>html5.h </td> |
+ <td>Document.fullscreenEnabled </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetFullscreen </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>html5.h </td> |
+ <td>Document.requestFullscreen </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScreenSize </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>html5.h </td> |
+ <td>Document.exitFullscreen </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Gamepad</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Sample </td> |
+ <td>M19 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Gamepad.* </td> |
+ <td bgcolor="#ffcccc">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is speced).</td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Graphics2D</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext('2d') </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Describe </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.clientWidth + Canvas.clientHeight </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PaintImageData </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.putImageData </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Scroll </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CanvasRenderingContext2d.scrollIntoView </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - Not an exact match (might have to resort to getImageData + putImageData which will be slow). Not a cross-browser standard.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReplaceContents </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.drawImage </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Flush </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - Only returning to the event loop triggers the flush.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetScale </td> |
+ <td>M27 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.scale </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScale </td> |
+ <td>M27 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.currentTransform </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetLayerTransform </td> |
+ <td>M52 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.setTransform |
+CanvasRenderingContext2d.scale |
+CanvasRenderingContext2d.translate </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Graphics3D</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttribMaxValue </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - Canvas.getContext lets you set booleans requesting depth / stencil buffers of certain sizes, but does not have a way to query what's possible (or get anything other than on or off for each)</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttribs </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WebGLRenderingContext.getContextAttributes </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetAttribs </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext(.., OPTIONS) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetError </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WebGLRenderingContext.getError </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ResizeBuffers </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td><Canvas>.width = w; <Canvas>.height = h; </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SwapBuffers </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No way to explicitly flip a frame, must return to the event loop.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_ImageData</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetNativeImageDataFormat </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData mandates RGBA order </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsImageDataFormatSupported </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData mandates RGBA order </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>CanvasRenderingContext2d.createImageData </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Describe </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData never has a stride </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Map </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData.data </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Unmap </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>ImageData.data </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_InputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RequestInputEvents </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>No direct equivalent </td> |
+ <td>The lack of this feature is probably less relevant as JS / Wasm runs on the main thread and can more cheaply filter events without incurring a cross process round-trip. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RequestFilteringInputEvents </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>mouse* key* wheel* touch* composition* Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.addEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ClearInputEventRequest </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.removeEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetType </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Event class descendants </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTimeStamp </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Event.timeStamp </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetModifiers </td> |
+ <td>M13/M55 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>*Event.altKey/shiftKey/metaKey/ctrlKey </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MouseInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13/M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetButton </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent.button </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetPosition </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent.client*/page*/offset* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetClickCount </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>dblclick' vs 'mousedown' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetMovement </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>MouseEvent.movement* </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_WheelInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WheelEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDelta </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>WheelEvent.delta* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTicks </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incompletely.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScrollByPage </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incompletely.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_KeyboardInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13/M34 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetKeyCode </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent.keyCode </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCharacterText </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent.key </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCode </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>KeyboardEvent.code </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_TouchInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AddTouchPoint </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent.touches.push </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTouchCount </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent.touches.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTouchByIndex </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>TouchEvent.touches[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTouchById </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Touch.indentifer (to figure this out yourself) </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_IMEInputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CompositionEvent </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetText </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CompositionEvent.data </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSegmentNumber </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSegmentOffset </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTargetSegment </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSelection </td> |
+ <td>M13 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Instance</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>BindGraphics </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas.getContext (moot as binding is automatic). </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsFullFrame </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent to mime type handlers.</td> |
+ <td>NaCl apps can be registered to handle a particular mime type and own the whole document. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MediaStreamAudioTrack</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Configure </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttrib </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.channelCount </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.sampleSize </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.sampleRate </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetId </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.id </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HasEnded </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.ended </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecycleBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MediaStreamVideoTrack</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M36(dev) </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td>Ability to create synthetic stream. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Configure </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetAttrib </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.width </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStreamSettings.height </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetId </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.id </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HasEnded </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>MediaStream.ended </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFrame </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecycleFrame </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetEmptyFrame </td> |
+ <td>M36(dev) </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PutFrame </td> |
+ <td>M36(dev) </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MessageLoop</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetForMainThread </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCurrent </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AttachToCurrentThread </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Run </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PostWork </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PostQuit </td> |
+ <td>M25 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Mostly moot, workers get an implicit event loop. </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Messaging</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>PostMessage </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Window.postMessage </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RegisterMessageHandler </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Window.addEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UnregisterMessageHandler </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Window.removeEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MouseCursor</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetCursor </td> |
+ <td>M19 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.style.cursor </td> |
+ <td>Same set of stock cursors are supported. |
+Custom cursors can be done with url(..). |
+Dynamic custom cursors can be done with data URIs. |
+CSS3 supports specifying the hotspot. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_MouseLock</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>LockMouse </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.requestPointerLock </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UnlockMouse </td> |
+ <td>M16 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.exitPointerLock </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_OpenGLES2</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Several Methods </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>OpenGLES </td> |
+ <td>Close to WebGL 1.0 in functionality. </td> |
+ <td>TODO(bradnelson): more detail </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td>x </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP - Without offscreen canvas, rendering must be done on the main thread.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_TextInputController</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetTextInputType </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td>Unity has specifically raised a desire to either be able to hint in this fashion, or preferrably the ability to intercept and display IME events / output inline inside a canvas. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UpdateCaretPosition </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CancelCompositionText </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UpdateSurroundingText </td> |
+ <td>M30 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas containing input.</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_URLLoader</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>new XMLHttpRequest(); </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Open </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.open </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>FollowRedirect </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Request.redirect </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No XMLHTTPRequest equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetUploadProgress </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest 'progress' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDownloadProgress </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest 'progress' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetResponseInfo </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.getAllResponseHeaders </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Response.* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReadResponseBody </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.response </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Body.* (Response is a Body) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>FinishStreamingToFile </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td>XMLHttpRequest and Fetch both assume streaming to memory, rather than directly to a storage. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.abort </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_URLRequestInfo</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Request </td> |
+ <td>No way to stream to a file. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetProperty </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent for XMLHttpRequest</td> |
+ <td>XMLHttpRequest doesn't provide direct ways to per-request limit following redirects, stream to a file, set referrer or credentials policy. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Request.* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AppendDataToBody </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.send </td> |
+ <td bgcolor="#ffcccc">GAP - Both must have the whole body, rather than a chunk.</td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>fetch(.., options:body) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>AppendFileToBody </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td><form> </td> |
+ <td>You can also read with FileReader and upload, but that's more like AppendDataToBody </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_URLResponseInfo</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetProperty </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>XMLHttpRequest.getAllResponseHeaders + others </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Response.* </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBodyAsFileRef </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Fetch Response (Body) .blob() </td> |
+ <td>Assumes storage layer optimizes transfer. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_Var</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarFromUtf8 </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>TextDecoder.decode </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarToUtf8 </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>TextEncoder.encode </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarFromResource </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>N/A </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>VarToResource </td> |
+ <td>M34 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>N/A </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VarArray</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Get </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Set </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array[i] = x </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetLength </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array.length </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetLength </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Array.length = n </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VarArrayBuffer</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>new ArrayBuffer(n) </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ByteLength </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>ArrayBuffer.byteLength </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Map </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td>Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap. |
+Future multiple memories or memory mapping might improve this. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Unmap </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VarDictionary</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>{} </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Get </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Object>[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Set </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Object>[i] = x </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Delete </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>delete <Object>[i] </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HasKey </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>x in <Object> </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetKeys </td> |
+ <td>M29 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>for (k in <Object>) {} </td> |
+ <td>No literal equivalent, but it can be built. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VideoDecoder</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Initialize </td> |
+ <td>M39/M46 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Decode </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetPicture </td> |
+ <td>M40 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecyclePicture </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Flush </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Reset </td> |
+ <td>M36 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VideoEncoder</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td>Overlap with MediaRecorder API, but not exact. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSupportedProfiles </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Initialize </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFramesRequired </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFrameCodedSize </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetVideoFrame </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Encode </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBitstreamBuffer </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecycleBitstreamBuffer </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RequestEncodingParametersChange </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M44 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_VideoFrame</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetTimestamp </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFormat </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDataBuffer </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDataBufferSize </td> |
+ <td>M35 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_View</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetRect </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Element.getBoundingClientRect </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsFullscreen </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>Document.fullScreenEnabled </td> |
+ <td>Pertains to document instead of just single element. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsVisible </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>IntersectionObserver </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>IsPageVisible </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>document.visibilityState </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetClipRect </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>IntersectionObserver </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDeviceScale </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>window.devicePixelRatio </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCSSScale </td> |
+ <td>M28 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Element>.getBoundingClientRect().width / <Element>.offsetWidth </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetScrollOffset </td> |
+ <td>M37 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td><Element>.scrollTop / <Element>.scrollLeft </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_WebSocket</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.WebSocket </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Connect </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.WebSocket(url, ...) |
+WebSocket 'open' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.close </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>ReceiveMessage </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket 'message' Event |
+WebSocket 'error' Event |
+WebSocket 'close' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SendMessage </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.send </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBufferedAmount </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.bufferedAmount </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCloseCode </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CloseEvent.code </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCloseReason </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CloseEvent.reason </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCloseWasClean </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>CloseEvent.wasClean </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetExtensions </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.extensions </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetProtocol </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.protocol </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetReadyState </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.readyState </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetURL </td> |
+ <td>M18 </td> |
+ <td> </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>WebSocket.url </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_Graphics3D</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Graphics3DContextLost </td> |
+ <td>M15 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Canvas 'webglcontextlost' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_InputEvent</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleInputEvent </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element.addEventListener </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_Instance</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidCreate </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td><Element>[key] </td> |
+ <td>General DOM access lets you fish out tag attributes </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidDestroy </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>N/A </td> |
+ <td>Not triggered for NaCl </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidChangeView </td> |
+ <td>M14/M17 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Element 'resize' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DidChangeFocus </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td>Element 'focus', 'focusin', 'focusout' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleDocumentLoad </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td bgcolor="#ffcccc">GAP - No way to register as a mime type handler</td> |
+ <td>NaCl modules via apps + a manifest entry can be set up to handle particular mime types. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_MessageHandler</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleMessage </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>MessagePort 'message' Event |
+Window 'message' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleBlockingMessage </td> |
+ <td>M39 </td> |
+ <td> </td> |
+ <td>N/A </td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td>Similar synchronization can be done off main thread with Atomics.wait. This was added to support emulation of synchronous plugin APIs. </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_Messaging</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>HandleMessage </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>embind </td> |
+ <td>MessagePort 'message' Event |
+Window 'message' Event </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPP_MouseLock</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>MouseLockLost </td> |
+ <td>M14 </td> |
+ <td> </td> |
+ <td>SDL </td> |
+ <td>Element 'pointerlockchange', 'pointerlockerror' Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h2 id="ppapi-apps">PPAPI (Apps)</h2> |
+<table> |
+</table> |
+<h3>PPB_HostResolver</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Resolve </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCanonicalName </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetNetAddressCount </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetNetAddress </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_NetAddress</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CreateFromIPv4Address </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>CreateFromIPv6Address </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetFamily </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DescribeAsString </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DescribeAsIPv4Address </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>DescribeAsIPv6Address </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_NetworkList</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetCount </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetName </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetType </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetState </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetIpAddress </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetDisplayName </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetMTU </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_NetworkMonitor</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>UpdateNetworkList </td> |
+ <td>M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_NetworkProxy</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetProxyForURL </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td bgcolor="#ffcccc">GAP - No direct equivalent</td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_TCPSocket</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcp.create </td> |
+ <td>WebSockets / WebRTC closest practical equivalent on open Web. </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcpServer.create </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Bind </td> |
+ <td>M29/M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcpServer.create </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Connect </td> |
+ <td>M29/M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcp.connect </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetLocalAddress </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.SocketInfo </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetRemoteAddress </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.SocketInfo </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Read </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>onReceive* Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Write </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcp.send </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Listen </td> |
+ <td>M29/M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcpServer.listen </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Accept </td> |
+ <td>M29/M31 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>onAccept* Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcp.close </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcpServer.close </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetOption </td> |
+ <td>M41 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcp.update </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td> </td> |
+ <td> </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.tcpServer.update </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+<h3>PPB_UDPSocket</h3> |
+<table> |
+ <tr bgcolor="#77ccff" style="color:white; text-decoration: underline"> |
+ <td>PPAPI Method </td> |
+ <td>State </td> |
+ <td>Assumes Threads </td> |
+ <td>Emscripten </td> |
+ <td>Web API </td> |
+ <td>Limitations </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Create </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.create </td> |
+ <td bgcolor="#ffeecc">GAP (partial) - WebRTC closest practical open Web equivalent</td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Bind </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.bind </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>GetBoundAddress </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.SocketInfo </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>RecvFrom </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>onReceive* Events </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SendTo </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.send </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>Close </td> |
+ <td>M29 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.close </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>SetOption </td> |
+ <td>M41/M43 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.update </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>JoinGroup </td> |
+ <td>M43 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.joinGroup </td> |
+ <td> </td> |
+ </tr> |
+ |
+ <tr> |
+ <td>LeaveGroup </td> |
+ <td>M43 </td> |
+ <td>x </td> |
+ <td bgcolor="#ffcccc">GAP</td> |
+ <td>chrome.sockets.udp.leaveGroup </td> |
+ <td> </td> |
+ </tr> |
+ |
+</table> |
+</section> |
+ |
+{{/partials.standard_nacl_article}} |