Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: native_client_sdk/doc_generated/migration/index.html

Issue 2875303003: Add migration to WebAssembly information to PNaCl / NaCl docs. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 {{+bindTo:partials.standard_nacl_article}}
2
3 <section id="p-nacl-migration-guide">
4 <span id="migration"></span><h1 id="p-nacl-migration-guide"><span id="migration" ></span>(P)NaCl Migration Guide</h1>
5 <h2 id="deprecation-announcements">Deprecation Announcements</h2>
6 <p>We recently announced the deprecation of Portable NativeClient
7 as well as the deprecation of
8 <a class="reference external" href="https://blog.chromium.org/2016/08/from-chrom e-apps-to-web.html">Chrome Apps</a>
9 outside of ChromeOS.
10 As a result, in the near future, PNaCl will no longer be supported in Chrome.
11 And NaCl will be supported only in the context of ChromeOS and Extensions.</p>
12 <p>We appreciate the investment you&#8217;ve made bringing native code to the We b
13 with these pioneering solutions, but have now refocused our efforts
14 on the cross browser <a class="reference external" href="http://webassembly.org" >WebAssembly</a> standard
15 in order to bring similar functionality to the Web in general.
16 While WebAssembly currently cannot match all of (P)NaCl&#8217;s capabilities,
17 we are working to expand its capabilities in tandem with other
18 browsers, and believe most use cases will soon be covered.</p>
19 <h2 id="toolchain-migration">Toolchain Migration</h2>
20 <p>For the majority of (P)NaCl uses cases we recommend transitioning
21 from the NaCl SDK to <a class="reference external" href="http://webassembly.org/ getting-started/developers-guide/">Emscripten</a>.
22 While direct support for NaCl / Pepper APIs in not available,
23 we&#8217;ve attempted to list equivalents.
24 Migration is likely to be reasonably straightforward
25 if your application is portable to Linux, uses SDL, or POSIX APIs.
26 For more challenging porting cases, please reach out on
27 <a class="reference external" href="mailto:native-client-discuss&#37;&#52;&#48;g ooglegroups&#46;com">native-client-discuss<span>&#64;</span>googlegroups<span>&# 46;</span>com</a></p>
28 <h2 id="api-migration">API Migration</h2>
29 <p>We&#8217;ve outlined here the status of Web Platform substitutes for each
30 of the APIs exposed to (P)NaCl.
31 Additionally, the table lists the library or option in Emscripten
32 that offers the closest substitute.</p>
33 <p>We expect to add shared memory threads support to WebAssembly in 2017,
34 as threads are crucial to matching (P)NaCl&#8217;s most interesting use
35 cases. Migration items which assume forthcoming threads support
36 are marked below. If your application&#8217;s flow control relies heavily on blo cking
37 APIs, you may also find threads support is required for convenient porting.</p>
38 <p>While we&#8217;ve tried to be accurate in this table,
39 there are no doubt errors or omissions.
40 If you encounter one, please reach out to us on
41 <a class="reference external" href="mailto:native-client-discuss&#37;&#52;&#48;g ooglegroups&#46;com">native-client-discuss<span>&#64;</span>googlegroups<span>&# 46;</span>com</a></p>
42 <h2 id="ppapi">PPAPI</h2>
43 <table>
44 </table>
45 <h3>PPB_Audio</h3>
46 <table>
47 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
48 <td>PPAPI Method </td>
49 <td>State </td>
50 <td>Assumes Threads </td>
51 <td>Emscripten </td>
52 <td>Web API </td>
53 <td>Limitations </td>
54 </tr>
55
56 <tr>
57 <td>Create </td>
58 <td>M14/M31 </td>
59 <td>x </td>
60 <td>SDL (partial) </td>
61 <td bgcolor="#ffeecc">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</t d>
62 <td>Still being standardized. </td>
63 </tr>
64
65 <tr>
66 <td>GetCurrentConfig </td>
67 <td>M14 </td>
68 <td> </td>
69 <td>SDL </td>
70 <td>AudioContext.* (gets back settings passed in) </td>
71 <td> </td>
72 </tr>
73
74 <tr>
75 <td>StartPlayback </td>
76 <td>M14 </td>
77 <td> </td>
78 <td>SDL </td>
79 <td>AudioBufferSourceNode.start </td>
80 <td> </td>
81 </tr>
82
83 <tr>
84 <td>StopPlayback </td>
85 <td>M14 </td>
86 <td> </td>
87 <td>SDL </td>
88 <td>AudioBufferSourceNode.stop </td>
89 <td> </td>
90 </tr>
91
92 </table>
93 <h3>PPB_AudioBuffer</h3>
94 <table>
95 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
96 <td>PPAPI Method </td>
97 <td>State </td>
98 <td>Assumes Threads </td>
99 <td>Emscripten </td>
100 <td>Web API </td>
101 <td>Limitations </td>
102 </tr>
103
104 <tr>
105 <td>GetTimestamp </td>
106 <td>M35 </td>
107 <td> </td>
108 <td>SDL </td>
109 <td>AudioBufferSourceNode.start (parameter) </td>
110 <td>Passed in each time instead of attached to the buffer. </td>
111 </tr>
112
113 <tr>
114 <td>SetTimestamp </td>
115 <td>M35 </td>
116 <td> </td>
117 <td>SDL </td>
118 <td>AudioBufferSourceNode.start (parameter) </td>
119 <td> </td>
120 </tr>
121
122 <tr>
123 <td>GetSampleRate </td>
124 <td>M35 </td>
125 <td> </td>
126 <td>SDL </td>
127 <td>AudioBuffer.sampleRate </td>
128 <td> </td>
129 </tr>
130
131 <tr>
132 <td>GetSampleSize </td>
133 <td>M35 </td>
134 <td> </td>
135 <td bgcolor="#ffcccc">GAP</td>
136 <td bgcolor="#ffcccc">GAP - WebAudio only uses 32-bit float, PPAPI does 16-b it int.</td>
137 <td>PPAPI theoretically supports multiple sampling sizes. In practice, it on ly supports 16-bit samples. Unfortunately, developers like Unity have requested 16-bit sample sizes. </td>
138 </tr>
139
140 <tr>
141 <td>GetNumberOfChannels </td>
142 <td>M35 </td>
143 <td> </td>
144 <td>SDL </td>
145 <td>AudioBuffer.numberOfChannels </td>
146 <td> </td>
147 </tr>
148
149 <tr>
150 <td>GetDataBuffer </td>
151 <td>M35 </td>
152 <td> </td>
153 <td>SDL </td>
154 <td>AudioBuffer.getChannelData </td>
155 <td> </td>
156 </tr>
157
158 <tr>
159 <td>GetBufferSize </td>
160 <td>M35 </td>
161 <td> </td>
162 <td>SDL </td>
163 <td>AudioBuffer.length </td>
164 <td> </td>
165 </tr>
166
167 </table>
168 <h3>PPB_AudioConfig</h3>
169 <table>
170 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
171 <td>PPAPI Method </td>
172 <td>State </td>
173 <td>Assumes Threads </td>
174 <td>Emscripten </td>
175 <td>Web API </td>
176 <td>Limitations </td>
177 </tr>
178
179 <tr>
180 <td>CreateStereo16Bit </td>
181 <td>M14 </td>
182 <td> </td>
183 <td bgcolor="#ffcccc">GAP</td>
184 <td bgcolor="#ffcccc">GAP - Only 32-bit float samples supported</td>
185 <td> </td>
186 </tr>
187
188 <tr>
189 <td>GetSampleRate </td>
190 <td>M14 </td>
191 <td> </td>
192 <td>SDL </td>
193 <td>AudioContext.sampleRate </td>
194 <td> </td>
195 </tr>
196
197 <tr>
198 <td>GetSampleFrameCount </td>
199 <td>M14 </td>
200 <td> </td>
201 <td>SDL </td>
202 <td>AudioBuffer.length </td>
203 <td> </td>
204 </tr>
205
206 <tr>
207 <td>RecommendSampleRate </td>
208 <td>M19 </td>
209 <td> </td>
210 <td>SDL </td>
211 <td>AudioContext.sampleRate (from default construct) </td>
212 <td>An AudioContext will have the preferred sampling rate by default. </td>
213 </tr>
214
215 <tr>
216 <td>RecommendSampleFrameCount </td>
217 <td>M14(d)/M19 </td>
218 <td> </td>
219 <td bgcolor="#ffcccc">GAP</td>
220 <td bgcolor="#ffcccc">GAP - No mechanism to get a recomended buffer size.</t d>
221 <td> </td>
222 </tr>
223
224 </table>
225 <h3>PPB_Console</h3>
226 <table>
227 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
228 <td>PPAPI Method </td>
229 <td>State </td>
230 <td>Assumes Threads </td>
231 <td>Emscripten </td>
232 <td>Web API </td>
233 <td>Limitations </td>
234 </tr>
235
236 <tr>
237 <td>Log </td>
238 <td>M25 </td>
239 <td> </td>
240 <td>utime </td>
241 <td>console.log/warn/error/... </td>
242 <td> </td>
243 </tr>
244
245 <tr>
246 <td>LogWithSource </td>
247 <td>M25 </td>
248 <td> </td>
249 <td bgcolor="#ffcccc">GAP</td>
250 <td bgcolor="#ffcccc">GAP</td>
251 <td>PPAPI provides a way to override the source filename and line number in a console message.
252 (Though JS API provides way to style text). </td>
253 </tr>
254
255 </table>
256 <h3>PPB_Core</h3>
257 <table>
258 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
259 <td>PPAPI Method </td>
260 <td>State </td>
261 <td>Assumes Threads </td>
262 <td>Emscripten </td>
263 <td>Web API </td>
264 <td>Limitations </td>
265 </tr>
266
267 <tr>
268 <td>getTime </td>
269 <td>M14 </td>
270 <td> </td>
271 <td>utime </td>
272 <td>new Date().getTime() </td>
273 <td> </td>
274 </tr>
275
276 <tr>
277 <td>getTimeTicks </td>
278 <td>M14 </td>
279 <td> </td>
280 <td>utime </td>
281 <td>new Date().getTime() </td>
282 <td> </td>
283 </tr>
284
285 <tr>
286 <td>IsMainThread </td>
287 <td>M14 </td>
288 <td> </td>
289 <td bgcolor="#ffcccc">GAP</td>
290 <td>window.document !== undefined </td>
291 <td> </td>
292 </tr>
293
294 <tr>
295 <td>CallOnMainThread </td>
296 <td>M14 </td>
297 <td> </td>
298 <td bgcolor="#ffcccc">GAP</td>
299 <td>Worker.postMessage + Atomics.wait </td>
300 <td>Equivalent synchronization can be built. </td>
301 </tr>
302
303 </table>
304 <h3>PPB_FileIO</h3>
305 <table>
306 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
307 <td>PPAPI Method </td>
308 <td>State </td>
309 <td>Assumes Threads </td>
310 <td>Emscripten </td>
311 <td>Web API </td>
312 <td>Limitations </td>
313 </tr>
314
315 <tr>
316 <td>Create </td>
317 <td>M14 </td>
318 <td> </td>
319 <td>FS (partial) </td>
320 <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
321 <td>Create and open are used differently, but the pieces are of equal power. </td>
322 </tr>
323
324 <tr>
325 <td>Open </td>
326 <td>M14/M29 </td>
327 <td> </td>
328 <td>FS (partial) </td>
329 <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
330 <td> </td>
331 </tr>
332
333 <tr>
334 <td>Query </td>
335 <td>M14 </td>
336 <td> </td>
337 <td>FS (partial) </td>
338 <td>Entry.getMetadata </td>
339 <td> </td>
340 </tr>
341
342 <tr>
343 <td>Touch </td>
344 <td>M14 </td>
345 <td> </td>
346 <td>FS (partial) </td>
347 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access ti me either.</td>
348 <td>Modify time can be bumped by writing. </td>
349 </tr>
350
351 <tr>
352 <td>Read </td>
353 <td>M14 </td>
354 <td> </td>
355 <td>FS (partial) </td>
356 <td>Entry.getFile + Blob.slice + FileReader.getBinaryData </td>
357 <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>
358 </tr>
359
360 <tr>
361 <td>Write </td>
362 <td>M14 </td>
363 <td> </td>
364 <td>FS (partial) </td>
365 <td>FileWriter.seek + FileWriter.write 'write*' Events </td>
366 <td> </td>
367 </tr>
368
369 <tr>
370 <td>SetLength </td>
371 <td>M14 </td>
372 <td> </td>
373 <td>FS (partial) </td>
374 <td>FileWriter.truncate + 'write*' Events </td>
375 <td> </td>
376 </tr>
377
378 <tr>
379 <td>Flush </td>
380 <td>M14 </td>
381 <td> </td>
382 <td bgcolor="#ffcccc">GAP</td>
383 <td bgcolor="#ffcccc">GAP - No equivalent, no way to flush.</td>
384 <td> </td>
385 </tr>
386
387 <tr>
388 <td>Close </td>
389 <td>M14 </td>
390 <td> </td>
391 <td>FS (partial) </td>
392 <td>No equivalent, open files and directories are implicitly closed. </td>
393 <td> </td>
394 </tr>
395
396 <tr>
397 <td>ReadToArray </td>
398 <td>M25 </td>
399 <td> </td>
400 <td bgcolor="#ffcccc">GAP</td>
401 <td bgcolor="#ffcccc">GAP - No equivalent.</td>
402 <td>Allows multiple subrange reads in parallel. </td>
403 </tr>
404
405 </table>
406 <h3>PPB_FileRef</h3>
407 <table>
408 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
409 <td>PPAPI Method </td>
410 <td>State </td>
411 <td>Assumes Threads </td>
412 <td>Emscripten </td>
413 <td>Web API </td>
414 <td>Limitations </td>
415 </tr>
416
417 <tr>
418 <td>Create </td>
419 <td>M14 </td>
420 <td> </td>
421 <td>FS (partial) </td>
422 <td>Entry.getFile(..., {create:true}) </td>
423 <td> </td>
424 </tr>
425
426 <tr>
427 <td>GetFileSystemType </td>
428 <td>M14 </td>
429 <td> </td>
430 <td>FS (partial) </td>
431 <td>FileSystem.type </td>
432 <td> </td>
433 </tr>
434
435 <tr>
436 <td>GetName </td>
437 <td>M14 </td>
438 <td> </td>
439 <td>FS (partial) </td>
440 <td>Entry.name </td>
441 <td> </td>
442 </tr>
443
444 <tr>
445 <td>GetPath </td>
446 <td>M14 </td>
447 <td> </td>
448 <td>FS (partial) </td>
449 <td>Entry.fullPath </td>
450 <td> </td>
451 </tr>
452
453 <tr>
454 <td>GetParent </td>
455 <td>M14 </td>
456 <td> </td>
457 <td>FS (partial) </td>
458 <td>Entry.getParent </td>
459 <td> </td>
460 </tr>
461
462 <tr>
463 <td>MakeDirectory </td>
464 <td>M34 </td>
465 <td> </td>
466 <td>FS (partial) </td>
467 <td>Entry.getDirectory(..., {create:true}) </td>
468 <td> </td>
469 </tr>
470
471 <tr>
472 <td>Touch </td>
473 <td>M14 </td>
474 <td> </td>
475 <td>FS (partial) </td>
476 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access ti me either.</td>
477 <td>Modify time can be bumped by writing. </td>
478 </tr>
479
480 <tr>
481 <td>Delete </td>
482 <td>M14 </td>
483 <td> </td>
484 <td>FS (partial) </td>
485 <td>Entry.remove </td>
486 <td> </td>
487 </tr>
488
489 <tr>
490 <td>Rename </td>
491 <td>M14 </td>
492 <td> </td>
493 <td>FS (partial) </td>
494 <td>Entry.moveTo </td>
495 <td> </td>
496 </tr>
497
498 <tr>
499 <td>Query </td>
500 <td>M28 </td>
501 <td> </td>
502 <td bgcolor="#ffcccc">GAP</td>
503 <td>Entry.getMetadata </td>
504 <td bgcolor="#ffcccc">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td>
505 </tr>
506
507 <tr>
508 <td>ReadDirectoryEntries </td>
509 <td>M28 </td>
510 <td> </td>
511 <td>FS (partial) </td>
512 <td>Directory.readEntries </td>
513 <td> </td>
514 </tr>
515
516 </table>
517 <h3>PPB_FileSystem</h3>
518 <table>
519 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
520 <td>PPAPI Method </td>
521 <td>State </td>
522 <td>Assumes Threads </td>
523 <td>Emscripten </td>
524 <td>Web API </td>
525 <td>Limitations </td>
526 </tr>
527
528 <tr>
529 <td>Create </td>
530 <td>M14 </td>
531 <td> </td>
532 <td>FS (partial) </td>
533 <td>window.requestFileSystem </td>
534 <td>JS API does both in one step </td>
535 </tr>
536
537 <tr>
538 <td>Open </td>
539 <td>M14 </td>
540 <td> </td>
541 <td bgcolor="#ffcccc">GAP</td>
542 <td>window.requestFileSystem </td>
543 <td bgcolor="#ffcccc">GAP - Filesystems API is chrome only. IndexedDB has ad ditional performance limitations around subrange writes.</td>
544 </tr>
545
546 <tr>
547 <td>GetType </td>
548 <td>M14 </td>
549 <td> </td>
550 <td bgcolor="#ffcccc">GAP</td>
551 <td>FileSystem.type </td>
552 <td> </td>
553 </tr>
554
555 </table>
556 <h3>PPB_Fullscreen</h3>
557 <table>
558 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
559 <td>PPAPI Method </td>
560 <td>State </td>
561 <td>Assumes Threads </td>
562 <td>Emscripten </td>
563 <td>Web API </td>
564 <td>Limitations </td>
565 </tr>
566
567 <tr>
568 <td>IsFullScreen </td>
569 <td>M16 </td>
570 <td> </td>
571 <td>html5.h </td>
572 <td>Document.fullscreenEnabled </td>
573 <td> </td>
574 </tr>
575
576 <tr>
577 <td>SetFullscreen </td>
578 <td>M16 </td>
579 <td> </td>
580 <td>html5.h </td>
581 <td>Document.requestFullscreen </td>
582 <td> </td>
583 </tr>
584
585 <tr>
586 <td>GetScreenSize </td>
587 <td>M16 </td>
588 <td> </td>
589 <td>html5.h </td>
590 <td>Document.exitFullscreen </td>
591 <td> </td>
592 </tr>
593
594 </table>
595 <h3>PPB_Gamepad</h3>
596 <table>
597 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
598 <td>PPAPI Method </td>
599 <td>State </td>
600 <td>Assumes Threads </td>
601 <td>Emscripten </td>
602 <td>Web API </td>
603 <td>Limitations </td>
604 </tr>
605
606 <tr>
607 <td>Sample </td>
608 <td>M19 </td>
609 <td> </td>
610 <td>SDL </td>
611 <td>Gamepad.* </td>
612 <td bgcolor="#ffcccc">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is speced).</td>
613 </tr>
614
615 </table>
616 <h3>PPB_Graphics2D</h3>
617 <table>
618 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
619 <td>PPAPI Method </td>
620 <td>State </td>
621 <td>Assumes Threads </td>
622 <td>Emscripten </td>
623 <td>Web API </td>
624 <td>Limitations </td>
625 </tr>
626
627 <tr>
628 <td>Create </td>
629 <td>M14 </td>
630 <td> </td>
631 <td>SDL </td>
632 <td>Canvas.getContext('2d') </td>
633 <td> </td>
634 </tr>
635
636 <tr>
637 <td>Describe </td>
638 <td>M14 </td>
639 <td> </td>
640 <td>SDL </td>
641 <td>Canvas.clientWidth + Canvas.clientHeight </td>
642 <td> </td>
643 </tr>
644
645 <tr>
646 <td>PaintImageData </td>
647 <td>M14 </td>
648 <td> </td>
649 <td>SDL </td>
650 <td>CanvasRenderingContext2d.putImageData </td>
651 <td> </td>
652 </tr>
653
654 <tr>
655 <td>Scroll </td>
656 <td>M14 </td>
657 <td> </td>
658 <td bgcolor="#ffcccc">GAP</td>
659 <td>CanvasRenderingContext2d.scrollIntoView </td>
660 <td bgcolor="#ffeecc">GAP (partial) - Not an exact match (might have to reso rt to getImageData + putImageData which will be slow). Not a cross-browser stand ard.</td>
661 </tr>
662
663 <tr>
664 <td>ReplaceContents </td>
665 <td>M14 </td>
666 <td> </td>
667 <td>SDL </td>
668 <td>CanvasRenderingContext2d.drawImage </td>
669 <td> </td>
670 </tr>
671
672 <tr>
673 <td>Flush </td>
674 <td>M14 </td>
675 <td> </td>
676 <td bgcolor="#ffcccc">GAP</td>
677 <td bgcolor="#ffcccc">GAP - Only returning to the event loop triggers the fl ush.</td>
678 <td> </td>
679 </tr>
680
681 <tr>
682 <td>SetScale </td>
683 <td>M27 </td>
684 <td> </td>
685 <td>SDL </td>
686 <td>CanvasRenderingContext2d.scale </td>
687 <td> </td>
688 </tr>
689
690 <tr>
691 <td>GetScale </td>
692 <td>M27 </td>
693 <td> </td>
694 <td>SDL </td>
695 <td>CanvasRenderingContext2d.currentTransform </td>
696 <td> </td>
697 </tr>
698
699 <tr>
700 <td>SetLayerTransform </td>
701 <td>M52 </td>
702 <td> </td>
703 <td>SDL </td>
704 <td>CanvasRenderingContext2d.setTransform
705 CanvasRenderingContext2d.scale
706 CanvasRenderingContext2d.translate </td>
707 <td> </td>
708 </tr>
709
710 </table>
711 <h3>PPB_Graphics3D</h3>
712 <table>
713 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
714 <td>PPAPI Method </td>
715 <td>State </td>
716 <td>Assumes Threads </td>
717 <td>Emscripten </td>
718 <td>Web API </td>
719 <td>Limitations </td>
720 </tr>
721
722 <tr>
723 <td>GetAttribMaxValue </td>
724 <td>M15 </td>
725 <td> </td>
726 <td bgcolor="#ffcccc">GAP</td>
727 <td bgcolor="#ffcccc">GAP - Canvas.getContext lets you set booleans requesti ng depth / stencil buffers of certain sizes, but does not have a way to query wh at's possible (or get anything other than on or off for each)</td>
728 <td> </td>
729 </tr>
730
731 <tr>
732 <td>Create </td>
733 <td>M15 </td>
734 <td> </td>
735 <td>SDL </td>
736 <td>Canvas.getContext </td>
737 <td> </td>
738 </tr>
739
740 <tr>
741 <td>GetAttribs </td>
742 <td>M15 </td>
743 <td> </td>
744 <td>SDL </td>
745 <td>WebGLRenderingContext.getContextAttributes </td>
746 <td> </td>
747 </tr>
748
749 <tr>
750 <td>SetAttribs </td>
751 <td>M15 </td>
752 <td> </td>
753 <td>SDL </td>
754 <td>Canvas.getContext(.., OPTIONS) </td>
755 <td> </td>
756 </tr>
757
758 <tr>
759 <td>GetError </td>
760 <td>M15 </td>
761 <td> </td>
762 <td>SDL </td>
763 <td>WebGLRenderingContext.getError </td>
764 <td> </td>
765 </tr>
766
767 <tr>
768 <td>ResizeBuffers </td>
769 <td>M15 </td>
770 <td> </td>
771 <td>SDL </td>
772 <td>&lt;Canvas&gt;.width = w; &lt;Canvas&gt;.height = h; </td>
773 <td> </td>
774 </tr>
775
776 <tr>
777 <td>SwapBuffers </td>
778 <td>M15 </td>
779 <td> </td>
780 <td bgcolor="#ffcccc">GAP</td>
781 <td bgcolor="#ffcccc">GAP - No way to explicitly flip a frame, must return t o the event loop.</td>
782 <td> </td>
783 </tr>
784
785 </table>
786 <h3>PPB_ImageData</h3>
787 <table>
788 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
789 <td>PPAPI Method </td>
790 <td>State </td>
791 <td>Assumes Threads </td>
792 <td>Emscripten </td>
793 <td>Web API </td>
794 <td>Limitations </td>
795 </tr>
796
797 <tr>
798 <td>GetNativeImageDataFormat </td>
799 <td>M14 </td>
800 <td> </td>
801 <td>SDL </td>
802 <td>ImageData mandates RGBA order </td>
803 <td> </td>
804 </tr>
805
806 <tr>
807 <td>IsImageDataFormatSupported </td>
808 <td>M14 </td>
809 <td> </td>
810 <td>SDL </td>
811 <td>ImageData mandates RGBA order </td>
812 <td> </td>
813 </tr>
814
815 <tr>
816 <td>Create </td>
817 <td>M14 </td>
818 <td> </td>
819 <td>SDL </td>
820 <td>CanvasRenderingContext2d.createImageData </td>
821 <td> </td>
822 </tr>
823
824 <tr>
825 <td>Describe </td>
826 <td>M14 </td>
827 <td> </td>
828 <td>SDL </td>
829 <td>ImageData never has a stride </td>
830 <td> </td>
831 </tr>
832
833 <tr>
834 <td>Map </td>
835 <td>M14 </td>
836 <td> </td>
837 <td>SDL </td>
838 <td>ImageData.data </td>
839 <td> </td>
840 </tr>
841
842 <tr>
843 <td>Unmap </td>
844 <td>M14 </td>
845 <td> </td>
846 <td>SDL </td>
847 <td>ImageData.data </td>
848 <td> </td>
849 </tr>
850
851 </table>
852 <h3>PPB_InputEvent</h3>
853 <table>
854 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
855 <td>PPAPI Method </td>
856 <td>State </td>
857 <td>Assumes Threads </td>
858 <td>Emscripten </td>
859 <td>Web API </td>
860 <td>Limitations </td>
861 </tr>
862
863 <tr>
864 <td>RequestInputEvents </td>
865 <td>M13 </td>
866 <td> </td>
867 <td>SDL </td>
868 <td>No direct equivalent </td>
869 <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 pro cess round-trip. </td>
870 </tr>
871
872 <tr>
873 <td>RequestFilteringInputEvents </td>
874 <td>M13 </td>
875 <td> </td>
876 <td>SDL </td>
877 <td>mouse* key* wheel* touch* composition* Events </td>
878 <td> </td>
879 </tr>
880
881 <tr>
882 <td> </td>
883 <td> </td>
884 <td> </td>
885 <td>SDL </td>
886 <td>Element.addEventListener </td>
887 <td> </td>
888 </tr>
889
890 <tr>
891 <td>ClearInputEventRequest </td>
892 <td>M13 </td>
893 <td> </td>
894 <td>SDL </td>
895 <td>Element.removeEventListener </td>
896 <td> </td>
897 </tr>
898
899 <tr>
900 <td>GetType </td>
901 <td>M13 </td>
902 <td> </td>
903 <td>SDL </td>
904 <td>Event class descendants </td>
905 <td> </td>
906 </tr>
907
908 <tr>
909 <td>GetTimeStamp </td>
910 <td>M13 </td>
911 <td> </td>
912 <td>SDL </td>
913 <td>Event.timeStamp </td>
914 <td> </td>
915 </tr>
916
917 <tr>
918 <td>GetModifiers </td>
919 <td>M13/M55 </td>
920 <td> </td>
921 <td>SDL </td>
922 <td>*Event.altKey/shiftKey/metaKey/ctrlKey </td>
923 <td> </td>
924 </tr>
925
926 </table>
927 <h3>PPB_MouseInputEvent</h3>
928 <table>
929 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
930 <td>PPAPI Method </td>
931 <td>State </td>
932 <td>Assumes Threads </td>
933 <td>Emscripten </td>
934 <td>Web API </td>
935 <td>Limitations </td>
936 </tr>
937
938 <tr>
939 <td>Create </td>
940 <td>M13/M14 </td>
941 <td> </td>
942 <td>SDL </td>
943 <td>MouseEvent </td>
944 <td> </td>
945 </tr>
946
947 <tr>
948 <td>GetButton </td>
949 <td>M13 </td>
950 <td> </td>
951 <td>SDL </td>
952 <td>MouseEvent.button </td>
953 <td> </td>
954 </tr>
955
956 <tr>
957 <td>GetPosition </td>
958 <td>M13 </td>
959 <td> </td>
960 <td>SDL </td>
961 <td>MouseEvent.client*/page*/offset* </td>
962 <td> </td>
963 </tr>
964
965 <tr>
966 <td>GetClickCount </td>
967 <td>M13 </td>
968 <td> </td>
969 <td>SDL </td>
970 <td>dblclick' vs 'mousedown' Events </td>
971 <td> </td>
972 </tr>
973
974 <tr>
975 <td>GetMovement </td>
976 <td>M14 </td>
977 <td> </td>
978 <td>SDL </td>
979 <td>MouseEvent.movement* </td>
980 <td> </td>
981 </tr>
982
983 </table>
984 <h3>PPB_WheelInputEvent</h3>
985 <table>
986 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
987 <td>PPAPI Method </td>
988 <td>State </td>
989 <td>Assumes Threads </td>
990 <td>Emscripten </td>
991 <td>Web API </td>
992 <td>Limitations </td>
993 </tr>
994
995 <tr>
996 <td>Create </td>
997 <td>M13 </td>
998 <td> </td>
999 <td>SDL </td>
1000 <td>WheelEvent </td>
1001 <td> </td>
1002 </tr>
1003
1004 <tr>
1005 <td>GetDelta </td>
1006 <td>M13 </td>
1007 <td> </td>
1008 <td>SDL </td>
1009 <td>WheelEvent.delta* </td>
1010 <td> </td>
1011 </tr>
1012
1013 <tr>
1014 <td>GetTicks </td>
1015 <td>M13 </td>
1016 <td> </td>
1017 <td bgcolor="#ffcccc">GAP</td>
1018 <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incom pletely.</td>
1019 <td> </td>
1020 </tr>
1021
1022 <tr>
1023 <td>GetScrollByPage </td>
1024 <td>M13 </td>
1025 <td> </td>
1026 <td bgcolor="#ffcccc">GAP</td>
1027 <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incom pletely.</td>
1028 <td> </td>
1029 </tr>
1030
1031 </table>
1032 <h3>PPB_KeyboardInputEvent</h3>
1033 <table>
1034 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1035 <td>PPAPI Method </td>
1036 <td>State </td>
1037 <td>Assumes Threads </td>
1038 <td>Emscripten </td>
1039 <td>Web API </td>
1040 <td>Limitations </td>
1041 </tr>
1042
1043 <tr>
1044 <td>Create </td>
1045 <td>M13/M34 </td>
1046 <td> </td>
1047 <td>SDL </td>
1048 <td>KeyboardEvent </td>
1049 <td> </td>
1050 </tr>
1051
1052 <tr>
1053 <td>GetKeyCode </td>
1054 <td>M13 </td>
1055 <td> </td>
1056 <td>SDL </td>
1057 <td>KeyboardEvent.keyCode </td>
1058 <td> </td>
1059 </tr>
1060
1061 <tr>
1062 <td>GetCharacterText </td>
1063 <td>M13 </td>
1064 <td> </td>
1065 <td>SDL </td>
1066 <td>KeyboardEvent.key </td>
1067 <td> </td>
1068 </tr>
1069
1070 <tr>
1071 <td>GetCode </td>
1072 <td>M34 </td>
1073 <td> </td>
1074 <td>SDL </td>
1075 <td>KeyboardEvent.code </td>
1076 <td> </td>
1077 </tr>
1078
1079 </table>
1080 <h3>PPB_TouchInputEvent</h3>
1081 <table>
1082 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1083 <td>PPAPI Method </td>
1084 <td>State </td>
1085 <td>Assumes Threads </td>
1086 <td>Emscripten </td>
1087 <td>Web API </td>
1088 <td>Limitations </td>
1089 </tr>
1090
1091 <tr>
1092 <td>Create </td>
1093 <td>M13 </td>
1094 <td> </td>
1095 <td>SDL </td>
1096 <td>TouchEvent </td>
1097 <td> </td>
1098 </tr>
1099
1100 <tr>
1101 <td>AddTouchPoint </td>
1102 <td>M13 </td>
1103 <td> </td>
1104 <td>SDL </td>
1105 <td>TouchEvent.touches.push </td>
1106 <td> </td>
1107 </tr>
1108
1109 <tr>
1110 <td>GetTouchCount </td>
1111 <td>M13 </td>
1112 <td> </td>
1113 <td>SDL </td>
1114 <td>TouchEvent.touches.length </td>
1115 <td> </td>
1116 </tr>
1117
1118 <tr>
1119 <td>GetTouchByIndex </td>
1120 <td>M13 </td>
1121 <td> </td>
1122 <td>SDL </td>
1123 <td>TouchEvent.touches[i] </td>
1124 <td> </td>
1125 </tr>
1126
1127 <tr>
1128 <td>GetTouchById </td>
1129 <td>M13 </td>
1130 <td> </td>
1131 <td>SDL </td>
1132 <td>Touch.indentifer (to figure this out yourself) </td>
1133 <td> </td>
1134 </tr>
1135
1136 </table>
1137 <h3>PPB_IMEInputEvent</h3>
1138 <table>
1139 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1140 <td>PPAPI Method </td>
1141 <td>State </td>
1142 <td>Assumes Threads </td>
1143 <td>Emscripten </td>
1144 <td>Web API </td>
1145 <td>Limitations </td>
1146 </tr>
1147
1148 <tr>
1149 <td>Create </td>
1150 <td>M13 </td>
1151 <td> </td>
1152 <td bgcolor="#ffcccc">GAP</td>
1153 <td>CompositionEvent </td>
1154 <td> </td>
1155 </tr>
1156
1157 <tr>
1158 <td>GetText </td>
1159 <td>M13 </td>
1160 <td> </td>
1161 <td bgcolor="#ffcccc">GAP</td>
1162 <td>CompositionEvent.data </td>
1163 <td> </td>
1164 </tr>
1165
1166 <tr>
1167 <td>GetSegmentNumber </td>
1168 <td>M13 </td>
1169 <td> </td>
1170 <td bgcolor="#ffcccc">GAP</td>
1171 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
1172 <td> </td>
1173 </tr>
1174
1175 <tr>
1176 <td>GetSegmentOffset </td>
1177 <td>M13 </td>
1178 <td> </td>
1179 <td bgcolor="#ffcccc">GAP</td>
1180 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
1181 <td> </td>
1182 </tr>
1183
1184 <tr>
1185 <td>GetTargetSegment </td>
1186 <td>M13 </td>
1187 <td> </td>
1188 <td bgcolor="#ffcccc">GAP</td>
1189 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
1190 <td> </td>
1191 </tr>
1192
1193 <tr>
1194 <td>GetSelection </td>
1195 <td>M13 </td>
1196 <td> </td>
1197 <td bgcolor="#ffcccc">GAP</td>
1198 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
1199 <td> </td>
1200 </tr>
1201
1202 </table>
1203 <h3>PPB_Instance</h3>
1204 <table>
1205 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1206 <td>PPAPI Method </td>
1207 <td>State </td>
1208 <td>Assumes Threads </td>
1209 <td>Emscripten </td>
1210 <td>Web API </td>
1211 <td>Limitations </td>
1212 </tr>
1213
1214 <tr>
1215 <td>BindGraphics </td>
1216 <td>M14 </td>
1217 <td> </td>
1218 <td>SDL </td>
1219 <td>Canvas.getContext (moot as binding is automatic). </td>
1220 <td> </td>
1221 </tr>
1222
1223 <tr>
1224 <td>IsFullFrame </td>
1225 <td>M14 </td>
1226 <td> </td>
1227 <td bgcolor="#ffcccc">GAP</td>
1228 <td bgcolor="#ffcccc">GAP - No equivalent to mime type handlers.</td>
1229 <td>NaCl apps can be registered to handle a particular mime type and own the whole document. </td>
1230 </tr>
1231
1232 </table>
1233 <h3>PPB_MediaStreamAudioTrack</h3>
1234 <table>
1235 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1236 <td>PPAPI Method </td>
1237 <td>State </td>
1238 <td>Assumes Threads </td>
1239 <td>Emscripten </td>
1240 <td>Web API </td>
1241 <td>Limitations </td>
1242 </tr>
1243
1244 <tr>
1245 <td>Configure </td>
1246 <td>M35 </td>
1247 <td> </td>
1248 <td bgcolor="#ffcccc">GAP</td>
1249 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1250 <td> </td>
1251 </tr>
1252
1253 <tr>
1254 <td>GetAttrib </td>
1255 <td>M35 </td>
1256 <td> </td>
1257 <td bgcolor="#ffcccc">GAP</td>
1258 <td>MediaStreamSettings.channelCount </td>
1259 <td> </td>
1260 </tr>
1261
1262 <tr>
1263 <td> </td>
1264 <td> </td>
1265 <td> </td>
1266 <td bgcolor="#ffcccc">GAP</td>
1267 <td>MediaStreamSettings.sampleSize </td>
1268 <td> </td>
1269 </tr>
1270
1271 <tr>
1272 <td> </td>
1273 <td> </td>
1274 <td> </td>
1275 <td bgcolor="#ffcccc">GAP</td>
1276 <td>MediaStreamSettings.sampleRate </td>
1277 <td> </td>
1278 </tr>
1279
1280 <tr>
1281 <td> </td>
1282 <td> </td>
1283 <td> </td>
1284 <td bgcolor="#ffcccc">GAP</td>
1285 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB _BUFFERS</td>
1286 <td> </td>
1287 </tr>
1288
1289 <tr>
1290 <td> </td>
1291 <td> </td>
1292 <td> </td>
1293 <td bgcolor="#ffcccc">GAP</td>
1294 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB _DURATION</td>
1295 <td> </td>
1296 </tr>
1297
1298 <tr>
1299 <td>GetId </td>
1300 <td>M35 </td>
1301 <td> </td>
1302 <td bgcolor="#ffcccc">GAP</td>
1303 <td>MediaStream.id </td>
1304 <td> </td>
1305 </tr>
1306
1307 <tr>
1308 <td>HasEnded </td>
1309 <td>M35 </td>
1310 <td> </td>
1311 <td bgcolor="#ffcccc">GAP</td>
1312 <td>MediaStream.ended </td>
1313 <td> </td>
1314 </tr>
1315
1316 <tr>
1317 <td>GetBuffer </td>
1318 <td>M35 </td>
1319 <td> </td>
1320 <td bgcolor="#ffcccc">GAP</td>
1321 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1322 <td> </td>
1323 </tr>
1324
1325 <tr>
1326 <td>RecycleBuffer </td>
1327 <td>M35 </td>
1328 <td> </td>
1329 <td bgcolor="#ffcccc">GAP</td>
1330 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1331 <td> </td>
1332 </tr>
1333
1334 <tr>
1335 <td>Close </td>
1336 <td>M35 </td>
1337 <td> </td>
1338 <td bgcolor="#ffcccc">GAP</td>
1339 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1340 <td> </td>
1341 </tr>
1342
1343 </table>
1344 <h3>PPB_MediaStreamVideoTrack</h3>
1345 <table>
1346 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1347 <td>PPAPI Method </td>
1348 <td>State </td>
1349 <td>Assumes Threads </td>
1350 <td>Emscripten </td>
1351 <td>Web API </td>
1352 <td>Limitations </td>
1353 </tr>
1354
1355 <tr>
1356 <td>Create </td>
1357 <td>M36(dev) </td>
1358 <td> </td>
1359 <td bgcolor="#ffcccc">GAP</td>
1360 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1361 <td>Ability to create synthetic stream. </td>
1362 </tr>
1363
1364 <tr>
1365 <td>Configure </td>
1366 <td>M35 </td>
1367 <td> </td>
1368 <td bgcolor="#ffcccc">GAP</td>
1369 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1370 <td> </td>
1371 </tr>
1372
1373 <tr>
1374 <td>GetAttrib </td>
1375 <td>M35 </td>
1376 <td> </td>
1377 <td bgcolor="#ffcccc">GAP</td>
1378 <td>MediaStreamSettings.width </td>
1379 <td> </td>
1380 </tr>
1381
1382 <tr>
1383 <td> </td>
1384 <td> </td>
1385 <td> </td>
1386 <td bgcolor="#ffcccc">GAP</td>
1387 <td>MediaStreamSettings.height </td>
1388 <td> </td>
1389 </tr>
1390
1391 <tr>
1392 <td> </td>
1393 <td> </td>
1394 <td> </td>
1395 <td bgcolor="#ffcccc">GAP</td>
1396 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB _BUFFERED_FRAMES</td>
1397 <td> </td>
1398 </tr>
1399
1400 <tr>
1401 <td> </td>
1402 <td> </td>
1403 <td> </td>
1404 <td bgcolor="#ffcccc">GAP</td>
1405 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB _FORMAT</td>
1406 <td> </td>
1407 </tr>
1408
1409 <tr>
1410 <td>GetId </td>
1411 <td>M35 </td>
1412 <td> </td>
1413 <td bgcolor="#ffcccc">GAP</td>
1414 <td>MediaStream.id </td>
1415 <td> </td>
1416 </tr>
1417
1418 <tr>
1419 <td>HasEnded </td>
1420 <td>M35 </td>
1421 <td> </td>
1422 <td bgcolor="#ffcccc">GAP</td>
1423 <td>MediaStream.ended </td>
1424 <td> </td>
1425 </tr>
1426
1427 <tr>
1428 <td>GetFrame </td>
1429 <td>M35 </td>
1430 <td> </td>
1431 <td bgcolor="#ffcccc">GAP</td>
1432 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1433 <td> </td>
1434 </tr>
1435
1436 <tr>
1437 <td>RecycleFrame </td>
1438 <td>M35 </td>
1439 <td> </td>
1440 <td bgcolor="#ffcccc">GAP</td>
1441 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1442 <td> </td>
1443 </tr>
1444
1445 <tr>
1446 <td>Close </td>
1447 <td>M35 </td>
1448 <td> </td>
1449 <td bgcolor="#ffcccc">GAP</td>
1450 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1451 <td> </td>
1452 </tr>
1453
1454 <tr>
1455 <td>GetEmptyFrame </td>
1456 <td>M36(dev) </td>
1457 <td> </td>
1458 <td bgcolor="#ffcccc">GAP</td>
1459 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1460 <td> </td>
1461 </tr>
1462
1463 <tr>
1464 <td>PutFrame </td>
1465 <td>M36(dev) </td>
1466 <td> </td>
1467 <td bgcolor="#ffcccc">GAP</td>
1468 <td bgcolor="#ffcccc">GAP - No equivalent</td>
1469 <td> </td>
1470 </tr>
1471
1472 </table>
1473 <h3>PPB_MessageLoop</h3>
1474 <table>
1475 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1476 <td>PPAPI Method </td>
1477 <td>State </td>
1478 <td>Assumes Threads </td>
1479 <td>Emscripten </td>
1480 <td>Web API </td>
1481 <td>Limitations </td>
1482 </tr>
1483
1484 <tr>
1485 <td>Create </td>
1486 <td>M25 </td>
1487 <td> </td>
1488 <td>N/A </td>
1489 <td>Mostly moot, workers get an implicit event loop. </td>
1490 <td> </td>
1491 </tr>
1492
1493 <tr>
1494 <td>GetForMainThread </td>
1495 <td>M25 </td>
1496 <td> </td>
1497 <td>N/A </td>
1498 <td>Mostly moot, workers get an implicit event loop. </td>
1499 <td> </td>
1500 </tr>
1501
1502 <tr>
1503 <td>GetCurrent </td>
1504 <td>M25 </td>
1505 <td> </td>
1506 <td>N/A </td>
1507 <td>Mostly moot, workers get an implicit event loop. </td>
1508 <td> </td>
1509 </tr>
1510
1511 <tr>
1512 <td>AttachToCurrentThread </td>
1513 <td>M25 </td>
1514 <td> </td>
1515 <td>N/A </td>
1516 <td>Mostly moot, workers get an implicit event loop. </td>
1517 <td> </td>
1518 </tr>
1519
1520 <tr>
1521 <td>Run </td>
1522 <td>M25 </td>
1523 <td> </td>
1524 <td>N/A </td>
1525 <td>Mostly moot, workers get an implicit event loop. </td>
1526 <td> </td>
1527 </tr>
1528
1529 <tr>
1530 <td>PostWork </td>
1531 <td>M25 </td>
1532 <td> </td>
1533 <td>N/A </td>
1534 <td>Mostly moot, workers get an implicit event loop. </td>
1535 <td> </td>
1536 </tr>
1537
1538 <tr>
1539 <td>PostQuit </td>
1540 <td>M25 </td>
1541 <td> </td>
1542 <td>N/A </td>
1543 <td>Mostly moot, workers get an implicit event loop. </td>
1544 <td> </td>
1545 </tr>
1546
1547 </table>
1548 <h3>PPB_Messaging</h3>
1549 <table>
1550 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1551 <td>PPAPI Method </td>
1552 <td>State </td>
1553 <td>Assumes Threads </td>
1554 <td>Emscripten </td>
1555 <td>Web API </td>
1556 <td>Limitations </td>
1557 </tr>
1558
1559 <tr>
1560 <td>PostMessage </td>
1561 <td>M14 </td>
1562 <td> </td>
1563 <td>N/A </td>
1564 <td>Window.postMessage </td>
1565 <td> </td>
1566 </tr>
1567
1568 <tr>
1569 <td>RegisterMessageHandler </td>
1570 <td>M39 </td>
1571 <td> </td>
1572 <td>N/A </td>
1573 <td>Window.addEventListener </td>
1574 <td> </td>
1575 </tr>
1576
1577 <tr>
1578 <td>UnregisterMessageHandler </td>
1579 <td>M39 </td>
1580 <td> </td>
1581 <td>N/A </td>
1582 <td>Window.removeEventListener </td>
1583 <td> </td>
1584 </tr>
1585
1586 </table>
1587 <h3>PPB_MouseCursor</h3>
1588 <table>
1589 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1590 <td>PPAPI Method </td>
1591 <td>State </td>
1592 <td>Assumes Threads </td>
1593 <td>Emscripten </td>
1594 <td>Web API </td>
1595 <td>Limitations </td>
1596 </tr>
1597
1598 <tr>
1599 <td>SetCursor </td>
1600 <td>M19 </td>
1601 <td> </td>
1602 <td>SDL </td>
1603 <td>Element.style.cursor </td>
1604 <td>Same set of stock cursors are supported.
1605 Custom cursors can be done with url(..).
1606 Dynamic custom cursors can be done with data URIs.
1607 CSS3 supports specifying the hotspot. </td>
1608 </tr>
1609
1610 </table>
1611 <h3>PPB_MouseLock</h3>
1612 <table>
1613 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1614 <td>PPAPI Method </td>
1615 <td>State </td>
1616 <td>Assumes Threads </td>
1617 <td>Emscripten </td>
1618 <td>Web API </td>
1619 <td>Limitations </td>
1620 </tr>
1621
1622 <tr>
1623 <td>LockMouse </td>
1624 <td>M16 </td>
1625 <td> </td>
1626 <td>SDL </td>
1627 <td>Element.requestPointerLock </td>
1628 <td> </td>
1629 </tr>
1630
1631 <tr>
1632 <td>UnlockMouse </td>
1633 <td>M16 </td>
1634 <td> </td>
1635 <td>SDL </td>
1636 <td>Element.exitPointerLock </td>
1637 <td> </td>
1638 </tr>
1639
1640 </table>
1641 <h3>PPB_OpenGLES2</h3>
1642 <table>
1643 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1644 <td>PPAPI Method </td>
1645 <td>State </td>
1646 <td>Assumes Threads </td>
1647 <td>Emscripten </td>
1648 <td>Web API </td>
1649 <td>Limitations </td>
1650 </tr>
1651
1652 <tr>
1653 <td>Several Methods </td>
1654 <td>M39 </td>
1655 <td> </td>
1656 <td>OpenGLES </td>
1657 <td>Close to WebGL 1.0 in functionality. </td>
1658 <td>TODO(bradnelson): more detail </td>
1659 </tr>
1660
1661 <tr>
1662 <td> </td>
1663 <td> </td>
1664 <td>x </td>
1665 <td> </td>
1666 <td bgcolor="#ffcccc">GAP - Without offscreen canvas, rendering must be done on the main thread.</td>
1667 <td> </td>
1668 </tr>
1669
1670 </table>
1671 <h3>PPB_TextInputController</h3>
1672 <table>
1673 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1674 <td>PPAPI Method </td>
1675 <td>State </td>
1676 <td>Assumes Threads </td>
1677 <td>Emscripten </td>
1678 <td>Web API </td>
1679 <td>Limitations </td>
1680 </tr>
1681
1682 <tr>
1683 <td>SetTextInputType </td>
1684 <td>M30 </td>
1685 <td> </td>
1686 <td bgcolor="#ffcccc">GAP</td>
1687 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
1688 <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 / outpu t inline inside a canvas. </td>
1689 </tr>
1690
1691 <tr>
1692 <td>UpdateCaretPosition </td>
1693 <td>M30 </td>
1694 <td> </td>
1695 <td bgcolor="#ffcccc">GAP</td>
1696 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
1697 <td> </td>
1698 </tr>
1699
1700 <tr>
1701 <td>CancelCompositionText </td>
1702 <td>M30 </td>
1703 <td> </td>
1704 <td bgcolor="#ffcccc">GAP</td>
1705 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
1706 <td> </td>
1707 </tr>
1708
1709 <tr>
1710 <td>UpdateSurroundingText </td>
1711 <td>M30 </td>
1712 <td> </td>
1713 <td bgcolor="#ffcccc">GAP</td>
1714 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
1715 <td> </td>
1716 </tr>
1717
1718 </table>
1719 <h3>PPB_URLLoader</h3>
1720 <table>
1721 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1722 <td>PPAPI Method </td>
1723 <td>State </td>
1724 <td>Assumes Threads </td>
1725 <td>Emscripten </td>
1726 <td>Web API </td>
1727 <td>Limitations </td>
1728 </tr>
1729
1730 <tr>
1731 <td>Create </td>
1732 <td>M14 </td>
1733 <td> </td>
1734 <td>embind </td>
1735 <td>new XMLHttpRequest(); </td>
1736 <td> </td>
1737 </tr>
1738
1739 <tr>
1740 <td>Open </td>
1741 <td>M14 </td>
1742 <td> </td>
1743 <td>embind </td>
1744 <td>XMLHttpRequest.open </td>
1745 <td> </td>
1746 </tr>
1747
1748 <tr>
1749 <td>FollowRedirect </td>
1750 <td>M14 </td>
1751 <td> </td>
1752 <td>embind </td>
1753 <td>Request.redirect </td>
1754 <td> </td>
1755 </tr>
1756
1757 <tr>
1758 <td> </td>
1759 <td> </td>
1760 <td> </td>
1761 <td bgcolor="#ffcccc">GAP</td>
1762 <td bgcolor="#ffcccc">GAP - No XMLHTTPRequest equivalent</td>
1763 <td> </td>
1764 </tr>
1765
1766 <tr>
1767 <td>GetUploadProgress </td>
1768 <td>M14 </td>
1769 <td> </td>
1770 <td>embind </td>
1771 <td>XMLHttpRequest 'progress' Event </td>
1772 <td> </td>
1773 </tr>
1774
1775 <tr>
1776 <td> </td>
1777 <td> </td>
1778 <td> </td>
1779 <td bgcolor="#ffcccc">GAP</td>
1780 <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td>
1781 <td> </td>
1782 </tr>
1783
1784 <tr>
1785 <td>GetDownloadProgress </td>
1786 <td>M14 </td>
1787 <td> </td>
1788 <td>embind </td>
1789 <td>XMLHttpRequest 'progress' Event </td>
1790 <td> </td>
1791 </tr>
1792
1793 <tr>
1794 <td> </td>
1795 <td> </td>
1796 <td> </td>
1797 <td bgcolor="#ffcccc">GAP</td>
1798 <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td>
1799 <td> </td>
1800 </tr>
1801
1802 <tr>
1803 <td>GetResponseInfo </td>
1804 <td>M14 </td>
1805 <td> </td>
1806 <td>embind </td>
1807 <td>XMLHttpRequest.getAllResponseHeaders </td>
1808 <td> </td>
1809 </tr>
1810
1811 <tr>
1812 <td> </td>
1813 <td> </td>
1814 <td> </td>
1815 <td>embind </td>
1816 <td>Fetch Response.* </td>
1817 <td> </td>
1818 </tr>
1819
1820 <tr>
1821 <td>ReadResponseBody </td>
1822 <td>M14 </td>
1823 <td> </td>
1824 <td>embind </td>
1825 <td>XMLHttpRequest.response </td>
1826 <td> </td>
1827 </tr>
1828
1829 <tr>
1830 <td> </td>
1831 <td> </td>
1832 <td> </td>
1833 <td>embind </td>
1834 <td>Body.* (Response is a Body) </td>
1835 <td> </td>
1836 </tr>
1837
1838 <tr>
1839 <td>FinishStreamingToFile </td>
1840 <td>M14 </td>
1841 <td> </td>
1842 <td>embind </td>
1843 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
1844 <td>XMLHttpRequest and Fetch both assume streaming to memory, rather than di rectly to a storage. </td>
1845 </tr>
1846
1847 <tr>
1848 <td>Close </td>
1849 <td>M14 </td>
1850 <td> </td>
1851 <td>embind </td>
1852 <td>XMLHttpRequest.abort </td>
1853 <td> </td>
1854 </tr>
1855
1856 <tr>
1857 <td> </td>
1858 <td> </td>
1859 <td> </td>
1860 <td bgcolor="#ffcccc">GAP</td>
1861 <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td>
1862 <td> </td>
1863 </tr>
1864
1865 </table>
1866 <h3>PPB_URLRequestInfo</h3>
1867 <table>
1868 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1869 <td>PPAPI Method </td>
1870 <td>State </td>
1871 <td>Assumes Threads </td>
1872 <td>Emscripten </td>
1873 <td>Web API </td>
1874 <td>Limitations </td>
1875 </tr>
1876
1877 <tr>
1878 <td>Create </td>
1879 <td>M14 </td>
1880 <td> </td>
1881 <td>embind </td>
1882 <td>XMLHttpRequest </td>
1883 <td> </td>
1884 </tr>
1885
1886 <tr>
1887 <td> </td>
1888 <td> </td>
1889 <td> </td>
1890 <td>embind </td>
1891 <td>Fetch Request </td>
1892 <td>No way to stream to a file. </td>
1893 </tr>
1894
1895 <tr>
1896 <td>SetProperty </td>
1897 <td>M14 </td>
1898 <td> </td>
1899 <td bgcolor="#ffcccc">GAP</td>
1900 <td bgcolor="#ffcccc">GAP - No direct equivalent for XMLHttpRequest</td>
1901 <td>XMLHttpRequest doesn't provide direct ways to per-request limit followin g redirects, stream to a file, set referrer or credentials policy. </td>
1902 </tr>
1903
1904 <tr>
1905 <td> </td>
1906 <td> </td>
1907 <td> </td>
1908 <td>embind </td>
1909 <td>Request.* </td>
1910 <td> </td>
1911 </tr>
1912
1913 <tr>
1914 <td>AppendDataToBody </td>
1915 <td>M14 </td>
1916 <td> </td>
1917 <td>embind </td>
1918 <td>XMLHttpRequest.send </td>
1919 <td bgcolor="#ffcccc">GAP - Both must have the whole body, rather than a chu nk.</td>
1920 </tr>
1921
1922 <tr>
1923 <td> </td>
1924 <td> </td>
1925 <td> </td>
1926 <td>embind </td>
1927 <td>fetch(.., options:body) </td>
1928 <td> </td>
1929 </tr>
1930
1931 <tr>
1932 <td>AppendFileToBody </td>
1933 <td>M14 </td>
1934 <td> </td>
1935 <td bgcolor="#ffcccc">GAP</td>
1936 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
1937 <td> </td>
1938 </tr>
1939
1940 <tr>
1941 <td> </td>
1942 <td> </td>
1943 <td> </td>
1944 <td>N/A </td>
1945 <td>&lt;form&gt; </td>
1946 <td>You can also read with FileReader and upload, but that's more like Appen dDataToBody </td>
1947 </tr>
1948
1949 </table>
1950 <h3>PPB_URLResponseInfo</h3>
1951 <table>
1952 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1953 <td>PPAPI Method </td>
1954 <td>State </td>
1955 <td>Assumes Threads </td>
1956 <td>Emscripten </td>
1957 <td>Web API </td>
1958 <td>Limitations </td>
1959 </tr>
1960
1961 <tr>
1962 <td>GetProperty </td>
1963 <td>M14 </td>
1964 <td> </td>
1965 <td>embind </td>
1966 <td>XMLHttpRequest.getAllResponseHeaders + others </td>
1967 <td> </td>
1968 </tr>
1969
1970 <tr>
1971 <td> </td>
1972 <td> </td>
1973 <td> </td>
1974 <td>embind </td>
1975 <td>Fetch Response.* </td>
1976 <td> </td>
1977 </tr>
1978
1979 <tr>
1980 <td>GetBodyAsFileRef </td>
1981 <td>M14 </td>
1982 <td> </td>
1983 <td>embind </td>
1984 <td>Fetch Response (Body) .blob() </td>
1985 <td>Assumes storage layer optimizes transfer. </td>
1986 </tr>
1987
1988 </table>
1989 <h3>PPB_Var</h3>
1990 <table>
1991 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
1992 <td>PPAPI Method </td>
1993 <td>State </td>
1994 <td>Assumes Threads </td>
1995 <td>Emscripten </td>
1996 <td>Web API </td>
1997 <td>Limitations </td>
1998 </tr>
1999
2000 <tr>
2001 <td>VarFromUtf8 </td>
2002 <td>M18 </td>
2003 <td> </td>
2004 <td>embind </td>
2005 <td>TextDecoder.decode </td>
2006 <td> </td>
2007 </tr>
2008
2009 <tr>
2010 <td>VarToUtf8 </td>
2011 <td>M14 </td>
2012 <td> </td>
2013 <td>embind </td>
2014 <td>TextEncoder.encode </td>
2015 <td> </td>
2016 </tr>
2017
2018 <tr>
2019 <td>VarFromResource </td>
2020 <td>M34 </td>
2021 <td> </td>
2022 <td>N/A </td>
2023 <td>N/A </td>
2024 <td> </td>
2025 </tr>
2026
2027 <tr>
2028 <td>VarToResource </td>
2029 <td>M34 </td>
2030 <td> </td>
2031 <td>N/A </td>
2032 <td>N/A </td>
2033 <td> </td>
2034 </tr>
2035
2036 </table>
2037 <h3>PPB_VarArray</h3>
2038 <table>
2039 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2040 <td>PPAPI Method </td>
2041 <td>State </td>
2042 <td>Assumes Threads </td>
2043 <td>Emscripten </td>
2044 <td>Web API </td>
2045 <td>Limitations </td>
2046 </tr>
2047
2048 <tr>
2049 <td>Get </td>
2050 <td>M29 </td>
2051 <td> </td>
2052 <td>embind </td>
2053 <td>Array[i] </td>
2054 <td> </td>
2055 </tr>
2056
2057 <tr>
2058 <td>Set </td>
2059 <td>M29 </td>
2060 <td> </td>
2061 <td>embind </td>
2062 <td>Array[i] = x </td>
2063 <td> </td>
2064 </tr>
2065
2066 <tr>
2067 <td>GetLength </td>
2068 <td>M29 </td>
2069 <td> </td>
2070 <td>embind </td>
2071 <td>Array.length </td>
2072 <td> </td>
2073 </tr>
2074
2075 <tr>
2076 <td>SetLength </td>
2077 <td>M29 </td>
2078 <td> </td>
2079 <td>embind </td>
2080 <td>Array.length = n </td>
2081 <td> </td>
2082 </tr>
2083
2084 </table>
2085 <h3>PPB_VarArrayBuffer</h3>
2086 <table>
2087 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2088 <td>PPAPI Method </td>
2089 <td>State </td>
2090 <td>Assumes Threads </td>
2091 <td>Emscripten </td>
2092 <td>Web API </td>
2093 <td>Limitations </td>
2094 </tr>
2095
2096 <tr>
2097 <td>Create </td>
2098 <td>M18 </td>
2099 <td> </td>
2100 <td>embind </td>
2101 <td>new ArrayBuffer(n) </td>
2102 <td> </td>
2103 </tr>
2104
2105 <tr>
2106 <td>ByteLength </td>
2107 <td>M18 </td>
2108 <td> </td>
2109 <td>embind </td>
2110 <td>ArrayBuffer.byteLength </td>
2111 <td> </td>
2112 </tr>
2113
2114 <tr>
2115 <td>Map </td>
2116 <td>M18 </td>
2117 <td> </td>
2118 <td bgcolor="#ffcccc">GAP</td>
2119 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
2120 <td>Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap.
2121 Future multiple memories or memory mapping might improve this. </td>
2122 </tr>
2123
2124 <tr>
2125 <td>Unmap </td>
2126 <td>M18 </td>
2127 <td> </td>
2128 <td bgcolor="#ffcccc">GAP</td>
2129 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
2130 <td> </td>
2131 </tr>
2132
2133 </table>
2134 <h3>PPB_VarDictionary</h3>
2135 <table>
2136 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2137 <td>PPAPI Method </td>
2138 <td>State </td>
2139 <td>Assumes Threads </td>
2140 <td>Emscripten </td>
2141 <td>Web API </td>
2142 <td>Limitations </td>
2143 </tr>
2144
2145 <tr>
2146 <td>Create </td>
2147 <td>M29 </td>
2148 <td> </td>
2149 <td>embind </td>
2150 <td>{} </td>
2151 <td> </td>
2152 </tr>
2153
2154 <tr>
2155 <td>Get </td>
2156 <td>M29 </td>
2157 <td> </td>
2158 <td>embind </td>
2159 <td>&lt;Object&gt;[i] </td>
2160 <td> </td>
2161 </tr>
2162
2163 <tr>
2164 <td>Set </td>
2165 <td>M29 </td>
2166 <td> </td>
2167 <td>embind </td>
2168 <td>&lt;Object&gt;[i] = x </td>
2169 <td> </td>
2170 </tr>
2171
2172 <tr>
2173 <td>Delete </td>
2174 <td>M29 </td>
2175 <td> </td>
2176 <td>embind </td>
2177 <td>delete &lt;Object&gt;[i] </td>
2178 <td> </td>
2179 </tr>
2180
2181 <tr>
2182 <td>HasKey </td>
2183 <td>M29 </td>
2184 <td> </td>
2185 <td>embind </td>
2186 <td>x in &lt;Object&gt; </td>
2187 <td> </td>
2188 </tr>
2189
2190 <tr>
2191 <td>GetKeys </td>
2192 <td>M29 </td>
2193 <td> </td>
2194 <td>embind </td>
2195 <td>for (k in &lt;Object&gt;) {} </td>
2196 <td>No literal equivalent, but it can be built. </td>
2197 </tr>
2198
2199 </table>
2200 <h3>PPB_VideoDecoder</h3>
2201 <table>
2202 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2203 <td>PPAPI Method </td>
2204 <td>State </td>
2205 <td>Assumes Threads </td>
2206 <td>Emscripten </td>
2207 <td>Web API </td>
2208 <td>Limitations </td>
2209 </tr>
2210
2211 <tr>
2212 <td>Create </td>
2213 <td>M36 </td>
2214 <td> </td>
2215 <td bgcolor="#ffcccc">GAP</td>
2216 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2217 <td> </td>
2218 </tr>
2219
2220 <tr>
2221 <td>Initialize </td>
2222 <td>M39/M46 </td>
2223 <td> </td>
2224 <td bgcolor="#ffcccc">GAP</td>
2225 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2226 <td> </td>
2227 </tr>
2228
2229 <tr>
2230 <td>Decode </td>
2231 <td>M36 </td>
2232 <td> </td>
2233 <td bgcolor="#ffcccc">GAP</td>
2234 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2235 <td> </td>
2236 </tr>
2237
2238 <tr>
2239 <td>GetPicture </td>
2240 <td>M40 </td>
2241 <td> </td>
2242 <td bgcolor="#ffcccc">GAP</td>
2243 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2244 <td> </td>
2245 </tr>
2246
2247 <tr>
2248 <td>RecyclePicture </td>
2249 <td>M36 </td>
2250 <td> </td>
2251 <td bgcolor="#ffcccc">GAP</td>
2252 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2253 <td> </td>
2254 </tr>
2255
2256 <tr>
2257 <td>Flush </td>
2258 <td>M36 </td>
2259 <td> </td>
2260 <td bgcolor="#ffcccc">GAP</td>
2261 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2262 <td> </td>
2263 </tr>
2264
2265 <tr>
2266 <td>Reset </td>
2267 <td>M36 </td>
2268 <td> </td>
2269 <td bgcolor="#ffcccc">GAP</td>
2270 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2271 <td> </td>
2272 </tr>
2273
2274 </table>
2275 <h3>PPB_VideoEncoder</h3>
2276 <table>
2277 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2278 <td>PPAPI Method </td>
2279 <td>State </td>
2280 <td>Assumes Threads </td>
2281 <td>Emscripten </td>
2282 <td>Web API </td>
2283 <td>Limitations </td>
2284 </tr>
2285
2286 <tr>
2287 <td>Create </td>
2288 <td>M44 </td>
2289 <td> </td>
2290 <td bgcolor="#ffcccc">GAP</td>
2291 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2292 <td>Overlap with MediaRecorder API, but not exact. </td>
2293 </tr>
2294
2295 <tr>
2296 <td>GetSupportedProfiles </td>
2297 <td>M44 </td>
2298 <td> </td>
2299 <td bgcolor="#ffcccc">GAP</td>
2300 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2301 <td> </td>
2302 </tr>
2303
2304 <tr>
2305 <td>Initialize </td>
2306 <td>M44 </td>
2307 <td> </td>
2308 <td bgcolor="#ffcccc">GAP</td>
2309 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2310 <td> </td>
2311 </tr>
2312
2313 <tr>
2314 <td>GetFramesRequired </td>
2315 <td>M44 </td>
2316 <td> </td>
2317 <td bgcolor="#ffcccc">GAP</td>
2318 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2319 <td> </td>
2320 </tr>
2321
2322 <tr>
2323 <td>GetFrameCodedSize </td>
2324 <td>M44 </td>
2325 <td> </td>
2326 <td bgcolor="#ffcccc">GAP</td>
2327 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2328 <td> </td>
2329 </tr>
2330
2331 <tr>
2332 <td>GetVideoFrame </td>
2333 <td>M44 </td>
2334 <td> </td>
2335 <td bgcolor="#ffcccc">GAP</td>
2336 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2337 <td> </td>
2338 </tr>
2339
2340 <tr>
2341 <td>Encode </td>
2342 <td>M44 </td>
2343 <td> </td>
2344 <td bgcolor="#ffcccc">GAP</td>
2345 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2346 <td> </td>
2347 </tr>
2348
2349 <tr>
2350 <td>GetBitstreamBuffer </td>
2351 <td>M44 </td>
2352 <td> </td>
2353 <td bgcolor="#ffcccc">GAP</td>
2354 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2355 <td> </td>
2356 </tr>
2357
2358 <tr>
2359 <td>RecycleBitstreamBuffer </td>
2360 <td>M44 </td>
2361 <td> </td>
2362 <td bgcolor="#ffcccc">GAP</td>
2363 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2364 <td> </td>
2365 </tr>
2366
2367 <tr>
2368 <td>RequestEncodingParametersChange </td>
2369 <td>M44 </td>
2370 <td> </td>
2371 <td bgcolor="#ffcccc">GAP</td>
2372 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2373 <td> </td>
2374 </tr>
2375
2376 <tr>
2377 <td>Close </td>
2378 <td>M44 </td>
2379 <td> </td>
2380 <td bgcolor="#ffcccc">GAP</td>
2381 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2382 <td> </td>
2383 </tr>
2384
2385 </table>
2386 <h3>PPB_VideoFrame</h3>
2387 <table>
2388 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2389 <td>PPAPI Method </td>
2390 <td>State </td>
2391 <td>Assumes Threads </td>
2392 <td>Emscripten </td>
2393 <td>Web API </td>
2394 <td>Limitations </td>
2395 </tr>
2396
2397 <tr>
2398 <td>GetTimestamp </td>
2399 <td>M35 </td>
2400 <td> </td>
2401 <td bgcolor="#ffcccc">GAP</td>
2402 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2403 <td> </td>
2404 </tr>
2405
2406 <tr>
2407 <td>SetTimestamp </td>
2408 <td>M35 </td>
2409 <td> </td>
2410 <td bgcolor="#ffcccc">GAP</td>
2411 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2412 <td> </td>
2413 </tr>
2414
2415 <tr>
2416 <td>GetFormat </td>
2417 <td>M35 </td>
2418 <td> </td>
2419 <td bgcolor="#ffcccc">GAP</td>
2420 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2421 <td> </td>
2422 </tr>
2423
2424 <tr>
2425 <td>GetSize </td>
2426 <td>M35 </td>
2427 <td> </td>
2428 <td bgcolor="#ffcccc">GAP</td>
2429 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2430 <td> </td>
2431 </tr>
2432
2433 <tr>
2434 <td>GetDataBuffer </td>
2435 <td>M35 </td>
2436 <td> </td>
2437 <td bgcolor="#ffcccc">GAP</td>
2438 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2439 <td> </td>
2440 </tr>
2441
2442 <tr>
2443 <td>GetDataBufferSize </td>
2444 <td>M35 </td>
2445 <td> </td>
2446 <td bgcolor="#ffcccc">GAP</td>
2447 <td bgcolor="#ffcccc">GAP - No equivalent</td>
2448 <td> </td>
2449 </tr>
2450
2451 </table>
2452 <h3>PPB_View</h3>
2453 <table>
2454 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2455 <td>PPAPI Method </td>
2456 <td>State </td>
2457 <td>Assumes Threads </td>
2458 <td>Emscripten </td>
2459 <td>Web API </td>
2460 <td>Limitations </td>
2461 </tr>
2462
2463 <tr>
2464 <td>GetRect </td>
2465 <td>M18 </td>
2466 <td> </td>
2467 <td>embind </td>
2468 <td>Element.getBoundingClientRect </td>
2469 <td> </td>
2470 </tr>
2471
2472 <tr>
2473 <td>IsFullscreen </td>
2474 <td>M18 </td>
2475 <td> </td>
2476 <td>embind </td>
2477 <td>Document.fullScreenEnabled </td>
2478 <td>Pertains to document instead of just single element. </td>
2479 </tr>
2480
2481 <tr>
2482 <td>IsVisible </td>
2483 <td>M18 </td>
2484 <td> </td>
2485 <td>embind </td>
2486 <td>IntersectionObserver </td>
2487 <td> </td>
2488 </tr>
2489
2490 <tr>
2491 <td>IsPageVisible </td>
2492 <td>M18 </td>
2493 <td> </td>
2494 <td>embind </td>
2495 <td>document.visibilityState </td>
2496 <td> </td>
2497 </tr>
2498
2499 <tr>
2500 <td>GetClipRect </td>
2501 <td>M18 </td>
2502 <td> </td>
2503 <td>embind </td>
2504 <td>IntersectionObserver </td>
2505 <td> </td>
2506 </tr>
2507
2508 <tr>
2509 <td>GetDeviceScale </td>
2510 <td>M28 </td>
2511 <td> </td>
2512 <td>embind </td>
2513 <td>window.devicePixelRatio </td>
2514 <td> </td>
2515 </tr>
2516
2517 <tr>
2518 <td>GetCSSScale </td>
2519 <td>M28 </td>
2520 <td> </td>
2521 <td>embind </td>
2522 <td>&lt;Element&gt;.getBoundingClientRect().width / &lt;Element&gt;.offsetWi dth </td>
2523 <td> </td>
2524 </tr>
2525
2526 <tr>
2527 <td>GetScrollOffset </td>
2528 <td>M37 </td>
2529 <td> </td>
2530 <td>embind </td>
2531 <td>&lt;Element&gt;.scrollTop / &lt;Element&gt;.scrollLeft </td>
2532 <td> </td>
2533 </tr>
2534
2535 </table>
2536 <h3>PPB_WebSocket</h3>
2537 <table>
2538 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2539 <td>PPAPI Method </td>
2540 <td>State </td>
2541 <td>Assumes Threads </td>
2542 <td>Emscripten </td>
2543 <td>Web API </td>
2544 <td>Limitations </td>
2545 </tr>
2546
2547 <tr>
2548 <td>Create </td>
2549 <td>M18 </td>
2550 <td> </td>
2551 <td bgcolor="#ffcccc">GAP</td>
2552 <td>WebSocket.WebSocket </td>
2553 <td> </td>
2554 </tr>
2555
2556 <tr>
2557 <td>Connect </td>
2558 <td>M18 </td>
2559 <td> </td>
2560 <td bgcolor="#ffcccc">GAP</td>
2561 <td>WebSocket.WebSocket(url, ...)
2562 WebSocket 'open' Event </td>
2563 <td> </td>
2564 </tr>
2565
2566 <tr>
2567 <td>Close </td>
2568 <td>M18 </td>
2569 <td> </td>
2570 <td bgcolor="#ffcccc">GAP</td>
2571 <td>WebSocket.close </td>
2572 <td> </td>
2573 </tr>
2574
2575 <tr>
2576 <td>ReceiveMessage </td>
2577 <td>M18 </td>
2578 <td> </td>
2579 <td bgcolor="#ffcccc">GAP</td>
2580 <td>WebSocket 'message' Event
2581 WebSocket 'error' Event
2582 WebSocket 'close' Event </td>
2583 <td> </td>
2584 </tr>
2585
2586 <tr>
2587 <td>SendMessage </td>
2588 <td>M18 </td>
2589 <td> </td>
2590 <td bgcolor="#ffcccc">GAP</td>
2591 <td>WebSocket.send </td>
2592 <td> </td>
2593 </tr>
2594
2595 <tr>
2596 <td>GetBufferedAmount </td>
2597 <td>M18 </td>
2598 <td> </td>
2599 <td bgcolor="#ffcccc">GAP</td>
2600 <td>WebSocket.bufferedAmount </td>
2601 <td> </td>
2602 </tr>
2603
2604 <tr>
2605 <td>GetCloseCode </td>
2606 <td>M18 </td>
2607 <td> </td>
2608 <td bgcolor="#ffcccc">GAP</td>
2609 <td>CloseEvent.code </td>
2610 <td> </td>
2611 </tr>
2612
2613 <tr>
2614 <td>GetCloseReason </td>
2615 <td>M18 </td>
2616 <td> </td>
2617 <td bgcolor="#ffcccc">GAP</td>
2618 <td>CloseEvent.reason </td>
2619 <td> </td>
2620 </tr>
2621
2622 <tr>
2623 <td>GetCloseWasClean </td>
2624 <td>M18 </td>
2625 <td> </td>
2626 <td bgcolor="#ffcccc">GAP</td>
2627 <td>CloseEvent.wasClean </td>
2628 <td> </td>
2629 </tr>
2630
2631 <tr>
2632 <td>GetExtensions </td>
2633 <td>M18 </td>
2634 <td> </td>
2635 <td bgcolor="#ffcccc">GAP</td>
2636 <td>WebSocket.extensions </td>
2637 <td> </td>
2638 </tr>
2639
2640 <tr>
2641 <td>GetProtocol </td>
2642 <td>M18 </td>
2643 <td> </td>
2644 <td bgcolor="#ffcccc">GAP</td>
2645 <td>WebSocket.protocol </td>
2646 <td> </td>
2647 </tr>
2648
2649 <tr>
2650 <td>GetReadyState </td>
2651 <td>M18 </td>
2652 <td> </td>
2653 <td bgcolor="#ffcccc">GAP</td>
2654 <td>WebSocket.readyState </td>
2655 <td> </td>
2656 </tr>
2657
2658 <tr>
2659 <td>GetURL </td>
2660 <td>M18 </td>
2661 <td> </td>
2662 <td bgcolor="#ffcccc">GAP</td>
2663 <td>WebSocket.url </td>
2664 <td> </td>
2665 </tr>
2666
2667 </table>
2668 <h3>PPP_Graphics3D</h3>
2669 <table>
2670 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2671 <td>PPAPI Method </td>
2672 <td>State </td>
2673 <td>Assumes Threads </td>
2674 <td>Emscripten </td>
2675 <td>Web API </td>
2676 <td>Limitations </td>
2677 </tr>
2678
2679 <tr>
2680 <td>Graphics3DContextLost </td>
2681 <td>M15 </td>
2682 <td> </td>
2683 <td>SDL </td>
2684 <td>Canvas 'webglcontextlost' Event </td>
2685 <td> </td>
2686 </tr>
2687
2688 </table>
2689 <h3>PPP_InputEvent</h3>
2690 <table>
2691 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2692 <td>PPAPI Method </td>
2693 <td>State </td>
2694 <td>Assumes Threads </td>
2695 <td>Emscripten </td>
2696 <td>Web API </td>
2697 <td>Limitations </td>
2698 </tr>
2699
2700 <tr>
2701 <td>HandleInputEvent </td>
2702 <td>M14 </td>
2703 <td> </td>
2704 <td>SDL </td>
2705 <td>Element.addEventListener </td>
2706 <td> </td>
2707 </tr>
2708
2709 </table>
2710 <h3>PPP_Instance</h3>
2711 <table>
2712 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2713 <td>PPAPI Method </td>
2714 <td>State </td>
2715 <td>Assumes Threads </td>
2716 <td>Emscripten </td>
2717 <td>Web API </td>
2718 <td>Limitations </td>
2719 </tr>
2720
2721 <tr>
2722 <td>DidCreate </td>
2723 <td>M14 </td>
2724 <td> </td>
2725 <td>N/A </td>
2726 <td>&lt;Element&gt;[key] </td>
2727 <td>General DOM access lets you fish out tag attributes </td>
2728 </tr>
2729
2730 <tr>
2731 <td>DidDestroy </td>
2732 <td>M14 </td>
2733 <td> </td>
2734 <td>N/A </td>
2735 <td>N/A </td>
2736 <td>Not triggered for NaCl </td>
2737 </tr>
2738
2739 <tr>
2740 <td>DidChangeView </td>
2741 <td>M14/M17 </td>
2742 <td> </td>
2743 <td>N/A </td>
2744 <td>Element 'resize' Event </td>
2745 <td> </td>
2746 </tr>
2747
2748 <tr>
2749 <td>DidChangeFocus </td>
2750 <td>M14 </td>
2751 <td> </td>
2752 <td>N/A </td>
2753 <td>Element 'focus', 'focusin', 'focusout' Events </td>
2754 <td> </td>
2755 </tr>
2756
2757 <tr>
2758 <td>HandleDocumentLoad </td>
2759 <td>M14 </td>
2760 <td> </td>
2761 <td>N/A </td>
2762 <td bgcolor="#ffcccc">GAP - No way to register as a mime type handler</td>
2763 <td>NaCl modules via apps + a manifest entry can be set up to handle particu lar mime types. </td>
2764 </tr>
2765
2766 </table>
2767 <h3>PPP_MessageHandler</h3>
2768 <table>
2769 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2770 <td>PPAPI Method </td>
2771 <td>State </td>
2772 <td>Assumes Threads </td>
2773 <td>Emscripten </td>
2774 <td>Web API </td>
2775 <td>Limitations </td>
2776 </tr>
2777
2778 <tr>
2779 <td>HandleMessage </td>
2780 <td>M39 </td>
2781 <td> </td>
2782 <td>embind </td>
2783 <td>MessagePort 'message' Event
2784 Window 'message' Event </td>
2785 <td> </td>
2786 </tr>
2787
2788 <tr>
2789 <td>HandleBlockingMessage </td>
2790 <td>M39 </td>
2791 <td> </td>
2792 <td>N/A </td>
2793 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
2794 <td>Similar synchronization can be done off main thread with Atomics.wait. T his was added to support emulation of synchronous plugin APIs. </td>
2795 </tr>
2796
2797 </table>
2798 <h3>PPP_Messaging</h3>
2799 <table>
2800 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2801 <td>PPAPI Method </td>
2802 <td>State </td>
2803 <td>Assumes Threads </td>
2804 <td>Emscripten </td>
2805 <td>Web API </td>
2806 <td>Limitations </td>
2807 </tr>
2808
2809 <tr>
2810 <td>HandleMessage </td>
2811 <td>M14 </td>
2812 <td> </td>
2813 <td>embind </td>
2814 <td>MessagePort 'message' Event
2815 Window 'message' Event </td>
2816 <td> </td>
2817 </tr>
2818
2819 </table>
2820 <h3>PPP_MouseLock</h3>
2821 <table>
2822 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2823 <td>PPAPI Method </td>
2824 <td>State </td>
2825 <td>Assumes Threads </td>
2826 <td>Emscripten </td>
2827 <td>Web API </td>
2828 <td>Limitations </td>
2829 </tr>
2830
2831 <tr>
2832 <td>MouseLockLost </td>
2833 <td>M14 </td>
2834 <td> </td>
2835 <td>SDL </td>
2836 <td>Element 'pointerlockchange', 'pointerlockerror' Events </td>
2837 <td> </td>
2838 </tr>
2839
2840 </table>
2841 <h2 id="irt">IRT</h2>
2842 <table>
2843 </table>
2844 <h3>PPB_Audio</h3>
2845 <table>
2846 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2847 <td>PPAPI Method </td>
2848 <td>State </td>
2849 <td>Assumes Threads </td>
2850 <td>Emscripten </td>
2851 <td>Web API </td>
2852 <td>Limitations </td>
2853 </tr>
2854
2855 <tr>
2856 <td>Create </td>
2857 <td>M14/M31 </td>
2858 <td>x </td>
2859 <td>SDL (partial) </td>
2860 <td bgcolor="#ffeecc">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</t d>
2861 <td>Still being standardized. </td>
2862 </tr>
2863
2864 <tr>
2865 <td>GetCurrentConfig </td>
2866 <td>M14 </td>
2867 <td> </td>
2868 <td>SDL </td>
2869 <td>AudioContext.* (gets back settings passed in) </td>
2870 <td> </td>
2871 </tr>
2872
2873 <tr>
2874 <td>StartPlayback </td>
2875 <td>M14 </td>
2876 <td> </td>
2877 <td>SDL </td>
2878 <td>AudioBufferSourceNode.start </td>
2879 <td> </td>
2880 </tr>
2881
2882 <tr>
2883 <td>StopPlayback </td>
2884 <td>M14 </td>
2885 <td> </td>
2886 <td>SDL </td>
2887 <td>AudioBufferSourceNode.stop </td>
2888 <td> </td>
2889 </tr>
2890
2891 </table>
2892 <h3>PPB_AudioBuffer</h3>
2893 <table>
2894 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2895 <td>PPAPI Method </td>
2896 <td>State </td>
2897 <td>Assumes Threads </td>
2898 <td>Emscripten </td>
2899 <td>Web API </td>
2900 <td>Limitations </td>
2901 </tr>
2902
2903 <tr>
2904 <td>GetTimestamp </td>
2905 <td>M35 </td>
2906 <td> </td>
2907 <td>SDL </td>
2908 <td>AudioBufferSourceNode.start (parameter) </td>
2909 <td>Passed in each time instead of attached to the buffer. </td>
2910 </tr>
2911
2912 <tr>
2913 <td>SetTimestamp </td>
2914 <td>M35 </td>
2915 <td> </td>
2916 <td>SDL </td>
2917 <td>AudioBufferSourceNode.start (parameter) </td>
2918 <td> </td>
2919 </tr>
2920
2921 <tr>
2922 <td>GetSampleRate </td>
2923 <td>M35 </td>
2924 <td> </td>
2925 <td>SDL </td>
2926 <td>AudioBuffer.sampleRate </td>
2927 <td> </td>
2928 </tr>
2929
2930 <tr>
2931 <td>GetSampleSize </td>
2932 <td>M35 </td>
2933 <td> </td>
2934 <td bgcolor="#ffcccc">GAP</td>
2935 <td bgcolor="#ffcccc">GAP - WebAudio only uses 32-bit float, PPAPI does 16-b it int.</td>
2936 <td>PPAPI theoretically supports multiple sampling sizes. In practice, it on ly supports 16-bit samples. Unfortunately, developers like Unity have requested 16-bit sample sizes. </td>
2937 </tr>
2938
2939 <tr>
2940 <td>GetNumberOfChannels </td>
2941 <td>M35 </td>
2942 <td> </td>
2943 <td>SDL </td>
2944 <td>AudioBuffer.numberOfChannels </td>
2945 <td> </td>
2946 </tr>
2947
2948 <tr>
2949 <td>GetDataBuffer </td>
2950 <td>M35 </td>
2951 <td> </td>
2952 <td>SDL </td>
2953 <td>AudioBuffer.getChannelData </td>
2954 <td> </td>
2955 </tr>
2956
2957 <tr>
2958 <td>GetBufferSize </td>
2959 <td>M35 </td>
2960 <td> </td>
2961 <td>SDL </td>
2962 <td>AudioBuffer.length </td>
2963 <td> </td>
2964 </tr>
2965
2966 </table>
2967 <h3>PPB_AudioConfig</h3>
2968 <table>
2969 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
2970 <td>PPAPI Method </td>
2971 <td>State </td>
2972 <td>Assumes Threads </td>
2973 <td>Emscripten </td>
2974 <td>Web API </td>
2975 <td>Limitations </td>
2976 </tr>
2977
2978 <tr>
2979 <td>CreateStereo16Bit </td>
2980 <td>M14 </td>
2981 <td> </td>
2982 <td bgcolor="#ffcccc">GAP</td>
2983 <td bgcolor="#ffcccc">GAP - Only 32-bit float samples supported</td>
2984 <td> </td>
2985 </tr>
2986
2987 <tr>
2988 <td>GetSampleRate </td>
2989 <td>M14 </td>
2990 <td> </td>
2991 <td>SDL </td>
2992 <td>AudioContext.sampleRate </td>
2993 <td> </td>
2994 </tr>
2995
2996 <tr>
2997 <td>GetSampleFrameCount </td>
2998 <td>M14 </td>
2999 <td> </td>
3000 <td>SDL </td>
3001 <td>AudioBuffer.length </td>
3002 <td> </td>
3003 </tr>
3004
3005 <tr>
3006 <td>RecommendSampleRate </td>
3007 <td>M19 </td>
3008 <td> </td>
3009 <td>SDL </td>
3010 <td>AudioContext.sampleRate (from default construct) </td>
3011 <td>An AudioContext will have the preferred sampling rate by default. </td>
3012 </tr>
3013
3014 <tr>
3015 <td>RecommendSampleFrameCount </td>
3016 <td>M14(d)/M19 </td>
3017 <td> </td>
3018 <td bgcolor="#ffcccc">GAP</td>
3019 <td bgcolor="#ffcccc">GAP - No mechanism to get a recomended buffer size.</t d>
3020 <td> </td>
3021 </tr>
3022
3023 </table>
3024 <h3>PPB_Console</h3>
3025 <table>
3026 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3027 <td>PPAPI Method </td>
3028 <td>State </td>
3029 <td>Assumes Threads </td>
3030 <td>Emscripten </td>
3031 <td>Web API </td>
3032 <td>Limitations </td>
3033 </tr>
3034
3035 <tr>
3036 <td>Log </td>
3037 <td>M25 </td>
3038 <td> </td>
3039 <td>utime </td>
3040 <td>console.log/warn/error/... </td>
3041 <td> </td>
3042 </tr>
3043
3044 <tr>
3045 <td>LogWithSource </td>
3046 <td>M25 </td>
3047 <td> </td>
3048 <td bgcolor="#ffcccc">GAP</td>
3049 <td bgcolor="#ffcccc">GAP</td>
3050 <td>PPAPI provides a way to override the source filename and line number in a console message.
3051 (Though JS API provides way to style text). </td>
3052 </tr>
3053
3054 </table>
3055 <h3>PPB_Core</h3>
3056 <table>
3057 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3058 <td>PPAPI Method </td>
3059 <td>State </td>
3060 <td>Assumes Threads </td>
3061 <td>Emscripten </td>
3062 <td>Web API </td>
3063 <td>Limitations </td>
3064 </tr>
3065
3066 <tr>
3067 <td>getTime </td>
3068 <td>M14 </td>
3069 <td> </td>
3070 <td>utime </td>
3071 <td>new Date().getTime() </td>
3072 <td> </td>
3073 </tr>
3074
3075 <tr>
3076 <td>getTimeTicks </td>
3077 <td>M14 </td>
3078 <td> </td>
3079 <td>utime </td>
3080 <td>new Date().getTime() </td>
3081 <td> </td>
3082 </tr>
3083
3084 <tr>
3085 <td>IsMainThread </td>
3086 <td>M14 </td>
3087 <td> </td>
3088 <td bgcolor="#ffcccc">GAP</td>
3089 <td>window.document !== undefined </td>
3090 <td> </td>
3091 </tr>
3092
3093 <tr>
3094 <td>CallOnMainThread </td>
3095 <td>M14 </td>
3096 <td> </td>
3097 <td bgcolor="#ffcccc">GAP</td>
3098 <td>Worker.postMessage + Atomics.wait </td>
3099 <td>Equivalent synchronization can be built. </td>
3100 </tr>
3101
3102 </table>
3103 <h3>PPB_FileIO</h3>
3104 <table>
3105 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3106 <td>PPAPI Method </td>
3107 <td>State </td>
3108 <td>Assumes Threads </td>
3109 <td>Emscripten </td>
3110 <td>Web API </td>
3111 <td>Limitations </td>
3112 </tr>
3113
3114 <tr>
3115 <td>Create </td>
3116 <td>M14 </td>
3117 <td> </td>
3118 <td>FS (partial) </td>
3119 <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
3120 <td>Create and open are used differently, but the pieces are of equal power. </td>
3121 </tr>
3122
3123 <tr>
3124 <td>Open </td>
3125 <td>M14/M29 </td>
3126 <td> </td>
3127 <td>FS (partial) </td>
3128 <td>FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
3129 <td> </td>
3130 </tr>
3131
3132 <tr>
3133 <td>Query </td>
3134 <td>M14 </td>
3135 <td> </td>
3136 <td>FS (partial) </td>
3137 <td>Entry.getMetadata </td>
3138 <td> </td>
3139 </tr>
3140
3141 <tr>
3142 <td>Touch </td>
3143 <td>M14 </td>
3144 <td> </td>
3145 <td>FS (partial) </td>
3146 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access ti me either.</td>
3147 <td>Modify time can be bumped by writing. </td>
3148 </tr>
3149
3150 <tr>
3151 <td>Read </td>
3152 <td>M14 </td>
3153 <td> </td>
3154 <td>FS (partial) </td>
3155 <td>Entry.getFile + Blob.slice + FileReader.getBinaryData </td>
3156 <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>
3157 </tr>
3158
3159 <tr>
3160 <td>Write </td>
3161 <td>M14 </td>
3162 <td> </td>
3163 <td>FS (partial) </td>
3164 <td>FileWriter.seek + FileWriter.write 'write*' Events </td>
3165 <td> </td>
3166 </tr>
3167
3168 <tr>
3169 <td>SetLength </td>
3170 <td>M14 </td>
3171 <td> </td>
3172 <td>FS (partial) </td>
3173 <td>FileWriter.truncate + 'write*' Events </td>
3174 <td> </td>
3175 </tr>
3176
3177 <tr>
3178 <td>Flush </td>
3179 <td>M14 </td>
3180 <td> </td>
3181 <td bgcolor="#ffcccc">GAP</td>
3182 <td bgcolor="#ffcccc">GAP - No equivalent, no way to flush.</td>
3183 <td> </td>
3184 </tr>
3185
3186 <tr>
3187 <td>Close </td>
3188 <td>M14 </td>
3189 <td> </td>
3190 <td>FS (partial) </td>
3191 <td>No equivalent, open files and directories are implicitly closed. </td>
3192 <td> </td>
3193 </tr>
3194
3195 <tr>
3196 <td>ReadToArray </td>
3197 <td>M25 </td>
3198 <td> </td>
3199 <td bgcolor="#ffcccc">GAP</td>
3200 <td bgcolor="#ffcccc">GAP - No equivalent.</td>
3201 <td>Allows multiple subrange reads in parallel. </td>
3202 </tr>
3203
3204 </table>
3205 <h3>PPB_FileRef</h3>
3206 <table>
3207 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3208 <td>PPAPI Method </td>
3209 <td>State </td>
3210 <td>Assumes Threads </td>
3211 <td>Emscripten </td>
3212 <td>Web API </td>
3213 <td>Limitations </td>
3214 </tr>
3215
3216 <tr>
3217 <td>Create </td>
3218 <td>M14 </td>
3219 <td> </td>
3220 <td>FS (partial) </td>
3221 <td>Entry.getFile(..., {create:true}) </td>
3222 <td> </td>
3223 </tr>
3224
3225 <tr>
3226 <td>GetFileSystemType </td>
3227 <td>M14 </td>
3228 <td> </td>
3229 <td>FS (partial) </td>
3230 <td>FileSystem.type </td>
3231 <td> </td>
3232 </tr>
3233
3234 <tr>
3235 <td>GetName </td>
3236 <td>M14 </td>
3237 <td> </td>
3238 <td>FS (partial) </td>
3239 <td>Entry.name </td>
3240 <td> </td>
3241 </tr>
3242
3243 <tr>
3244 <td>GetPath </td>
3245 <td>M14 </td>
3246 <td> </td>
3247 <td>FS (partial) </td>
3248 <td>Entry.fullPath </td>
3249 <td> </td>
3250 </tr>
3251
3252 <tr>
3253 <td>GetParent </td>
3254 <td>M14 </td>
3255 <td> </td>
3256 <td>FS (partial) </td>
3257 <td>Entry.getParent </td>
3258 <td> </td>
3259 </tr>
3260
3261 <tr>
3262 <td>MakeDirectory </td>
3263 <td>M34 </td>
3264 <td> </td>
3265 <td>FS (partial) </td>
3266 <td>Entry.getDirectory(..., {create:true}) </td>
3267 <td> </td>
3268 </tr>
3269
3270 <tr>
3271 <td>Touch </td>
3272 <td>M14 </td>
3273 <td> </td>
3274 <td>FS (partial) </td>
3275 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent, but no access ti me either.</td>
3276 <td>Modify time can be bumped by writing. </td>
3277 </tr>
3278
3279 <tr>
3280 <td>Delete </td>
3281 <td>M14 </td>
3282 <td> </td>
3283 <td>FS (partial) </td>
3284 <td>Entry.remove </td>
3285 <td> </td>
3286 </tr>
3287
3288 <tr>
3289 <td>Rename </td>
3290 <td>M14 </td>
3291 <td> </td>
3292 <td>FS (partial) </td>
3293 <td>Entry.moveTo </td>
3294 <td> </td>
3295 </tr>
3296
3297 <tr>
3298 <td>Query </td>
3299 <td>M28 </td>
3300 <td> </td>
3301 <td bgcolor="#ffcccc">GAP</td>
3302 <td>Entry.getMetadata </td>
3303 <td bgcolor="#ffcccc">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td>
3304 </tr>
3305
3306 <tr>
3307 <td>ReadDirectoryEntries </td>
3308 <td>M28 </td>
3309 <td> </td>
3310 <td>FS (partial) </td>
3311 <td>Directory.readEntries </td>
3312 <td> </td>
3313 </tr>
3314
3315 </table>
3316 <h3>PPB_FileSystem</h3>
3317 <table>
3318 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3319 <td>PPAPI Method </td>
3320 <td>State </td>
3321 <td>Assumes Threads </td>
3322 <td>Emscripten </td>
3323 <td>Web API </td>
3324 <td>Limitations </td>
3325 </tr>
3326
3327 <tr>
3328 <td>Create </td>
3329 <td>M14 </td>
3330 <td> </td>
3331 <td>FS (partial) </td>
3332 <td>window.requestFileSystem </td>
3333 <td>JS API does both in one step </td>
3334 </tr>
3335
3336 <tr>
3337 <td>Open </td>
3338 <td>M14 </td>
3339 <td> </td>
3340 <td bgcolor="#ffcccc">GAP</td>
3341 <td>window.requestFileSystem </td>
3342 <td bgcolor="#ffcccc">GAP - Filesystems API is chrome only. IndexedDB has ad ditional performance limitations around subrange writes.</td>
3343 </tr>
3344
3345 <tr>
3346 <td>GetType </td>
3347 <td>M14 </td>
3348 <td> </td>
3349 <td bgcolor="#ffcccc">GAP</td>
3350 <td>FileSystem.type </td>
3351 <td> </td>
3352 </tr>
3353
3354 </table>
3355 <h3>PPB_Fullscreen</h3>
3356 <table>
3357 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3358 <td>PPAPI Method </td>
3359 <td>State </td>
3360 <td>Assumes Threads </td>
3361 <td>Emscripten </td>
3362 <td>Web API </td>
3363 <td>Limitations </td>
3364 </tr>
3365
3366 <tr>
3367 <td>IsFullScreen </td>
3368 <td>M16 </td>
3369 <td> </td>
3370 <td>html5.h </td>
3371 <td>Document.fullscreenEnabled </td>
3372 <td> </td>
3373 </tr>
3374
3375 <tr>
3376 <td>SetFullscreen </td>
3377 <td>M16 </td>
3378 <td> </td>
3379 <td>html5.h </td>
3380 <td>Document.requestFullscreen </td>
3381 <td> </td>
3382 </tr>
3383
3384 <tr>
3385 <td>GetScreenSize </td>
3386 <td>M16 </td>
3387 <td> </td>
3388 <td>html5.h </td>
3389 <td>Document.exitFullscreen </td>
3390 <td> </td>
3391 </tr>
3392
3393 </table>
3394 <h3>PPB_Gamepad</h3>
3395 <table>
3396 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3397 <td>PPAPI Method </td>
3398 <td>State </td>
3399 <td>Assumes Threads </td>
3400 <td>Emscripten </td>
3401 <td>Web API </td>
3402 <td>Limitations </td>
3403 </tr>
3404
3405 <tr>
3406 <td>Sample </td>
3407 <td>M19 </td>
3408 <td> </td>
3409 <td>SDL </td>
3410 <td>Gamepad.* </td>
3411 <td bgcolor="#ffcccc">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is speced).</td>
3412 </tr>
3413
3414 </table>
3415 <h3>PPB_Graphics2D</h3>
3416 <table>
3417 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3418 <td>PPAPI Method </td>
3419 <td>State </td>
3420 <td>Assumes Threads </td>
3421 <td>Emscripten </td>
3422 <td>Web API </td>
3423 <td>Limitations </td>
3424 </tr>
3425
3426 <tr>
3427 <td>Create </td>
3428 <td>M14 </td>
3429 <td> </td>
3430 <td>SDL </td>
3431 <td>Canvas.getContext('2d') </td>
3432 <td> </td>
3433 </tr>
3434
3435 <tr>
3436 <td>Describe </td>
3437 <td>M14 </td>
3438 <td> </td>
3439 <td>SDL </td>
3440 <td>Canvas.clientWidth + Canvas.clientHeight </td>
3441 <td> </td>
3442 </tr>
3443
3444 <tr>
3445 <td>PaintImageData </td>
3446 <td>M14 </td>
3447 <td> </td>
3448 <td>SDL </td>
3449 <td>CanvasRenderingContext2d.putImageData </td>
3450 <td> </td>
3451 </tr>
3452
3453 <tr>
3454 <td>Scroll </td>
3455 <td>M14 </td>
3456 <td> </td>
3457 <td bgcolor="#ffcccc">GAP</td>
3458 <td>CanvasRenderingContext2d.scrollIntoView </td>
3459 <td bgcolor="#ffeecc">GAP (partial) - Not an exact match (might have to reso rt to getImageData + putImageData which will be slow). Not a cross-browser stand ard.</td>
3460 </tr>
3461
3462 <tr>
3463 <td>ReplaceContents </td>
3464 <td>M14 </td>
3465 <td> </td>
3466 <td>SDL </td>
3467 <td>CanvasRenderingContext2d.drawImage </td>
3468 <td> </td>
3469 </tr>
3470
3471 <tr>
3472 <td>Flush </td>
3473 <td>M14 </td>
3474 <td> </td>
3475 <td bgcolor="#ffcccc">GAP</td>
3476 <td bgcolor="#ffcccc">GAP - Only returning to the event loop triggers the fl ush.</td>
3477 <td> </td>
3478 </tr>
3479
3480 <tr>
3481 <td>SetScale </td>
3482 <td>M27 </td>
3483 <td> </td>
3484 <td>SDL </td>
3485 <td>CanvasRenderingContext2d.scale </td>
3486 <td> </td>
3487 </tr>
3488
3489 <tr>
3490 <td>GetScale </td>
3491 <td>M27 </td>
3492 <td> </td>
3493 <td>SDL </td>
3494 <td>CanvasRenderingContext2d.currentTransform </td>
3495 <td> </td>
3496 </tr>
3497
3498 <tr>
3499 <td>SetLayerTransform </td>
3500 <td>M52 </td>
3501 <td> </td>
3502 <td>SDL </td>
3503 <td>CanvasRenderingContext2d.setTransform
3504 CanvasRenderingContext2d.scale
3505 CanvasRenderingContext2d.translate </td>
3506 <td> </td>
3507 </tr>
3508
3509 </table>
3510 <h3>PPB_Graphics3D</h3>
3511 <table>
3512 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3513 <td>PPAPI Method </td>
3514 <td>State </td>
3515 <td>Assumes Threads </td>
3516 <td>Emscripten </td>
3517 <td>Web API </td>
3518 <td>Limitations </td>
3519 </tr>
3520
3521 <tr>
3522 <td>GetAttribMaxValue </td>
3523 <td>M15 </td>
3524 <td> </td>
3525 <td bgcolor="#ffcccc">GAP</td>
3526 <td bgcolor="#ffcccc">GAP - Canvas.getContext lets you set booleans requesti ng depth / stencil buffers of certain sizes, but does not have a way to query wh at's possible (or get anything other than on or off for each)</td>
3527 <td> </td>
3528 </tr>
3529
3530 <tr>
3531 <td>Create </td>
3532 <td>M15 </td>
3533 <td> </td>
3534 <td>SDL </td>
3535 <td>Canvas.getContext </td>
3536 <td> </td>
3537 </tr>
3538
3539 <tr>
3540 <td>GetAttribs </td>
3541 <td>M15 </td>
3542 <td> </td>
3543 <td>SDL </td>
3544 <td>WebGLRenderingContext.getContextAttributes </td>
3545 <td> </td>
3546 </tr>
3547
3548 <tr>
3549 <td>SetAttribs </td>
3550 <td>M15 </td>
3551 <td> </td>
3552 <td>SDL </td>
3553 <td>Canvas.getContext(.., OPTIONS) </td>
3554 <td> </td>
3555 </tr>
3556
3557 <tr>
3558 <td>GetError </td>
3559 <td>M15 </td>
3560 <td> </td>
3561 <td>SDL </td>
3562 <td>WebGLRenderingContext.getError </td>
3563 <td> </td>
3564 </tr>
3565
3566 <tr>
3567 <td>ResizeBuffers </td>
3568 <td>M15 </td>
3569 <td> </td>
3570 <td>SDL </td>
3571 <td>&lt;Canvas&gt;.width = w; &lt;Canvas&gt;.height = h; </td>
3572 <td> </td>
3573 </tr>
3574
3575 <tr>
3576 <td>SwapBuffers </td>
3577 <td>M15 </td>
3578 <td> </td>
3579 <td bgcolor="#ffcccc">GAP</td>
3580 <td bgcolor="#ffcccc">GAP - No way to explicitly flip a frame, must return t o the event loop.</td>
3581 <td> </td>
3582 </tr>
3583
3584 </table>
3585 <h3>PPB_ImageData</h3>
3586 <table>
3587 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3588 <td>PPAPI Method </td>
3589 <td>State </td>
3590 <td>Assumes Threads </td>
3591 <td>Emscripten </td>
3592 <td>Web API </td>
3593 <td>Limitations </td>
3594 </tr>
3595
3596 <tr>
3597 <td>GetNativeImageDataFormat </td>
3598 <td>M14 </td>
3599 <td> </td>
3600 <td>SDL </td>
3601 <td>ImageData mandates RGBA order </td>
3602 <td> </td>
3603 </tr>
3604
3605 <tr>
3606 <td>IsImageDataFormatSupported </td>
3607 <td>M14 </td>
3608 <td> </td>
3609 <td>SDL </td>
3610 <td>ImageData mandates RGBA order </td>
3611 <td> </td>
3612 </tr>
3613
3614 <tr>
3615 <td>Create </td>
3616 <td>M14 </td>
3617 <td> </td>
3618 <td>SDL </td>
3619 <td>CanvasRenderingContext2d.createImageData </td>
3620 <td> </td>
3621 </tr>
3622
3623 <tr>
3624 <td>Describe </td>
3625 <td>M14 </td>
3626 <td> </td>
3627 <td>SDL </td>
3628 <td>ImageData never has a stride </td>
3629 <td> </td>
3630 </tr>
3631
3632 <tr>
3633 <td>Map </td>
3634 <td>M14 </td>
3635 <td> </td>
3636 <td>SDL </td>
3637 <td>ImageData.data </td>
3638 <td> </td>
3639 </tr>
3640
3641 <tr>
3642 <td>Unmap </td>
3643 <td>M14 </td>
3644 <td> </td>
3645 <td>SDL </td>
3646 <td>ImageData.data </td>
3647 <td> </td>
3648 </tr>
3649
3650 </table>
3651 <h3>PPB_InputEvent</h3>
3652 <table>
3653 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3654 <td>PPAPI Method </td>
3655 <td>State </td>
3656 <td>Assumes Threads </td>
3657 <td>Emscripten </td>
3658 <td>Web API </td>
3659 <td>Limitations </td>
3660 </tr>
3661
3662 <tr>
3663 <td>RequestInputEvents </td>
3664 <td>M13 </td>
3665 <td> </td>
3666 <td>SDL </td>
3667 <td>No direct equivalent </td>
3668 <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 pro cess round-trip. </td>
3669 </tr>
3670
3671 <tr>
3672 <td>RequestFilteringInputEvents </td>
3673 <td>M13 </td>
3674 <td> </td>
3675 <td>SDL </td>
3676 <td>mouse* key* wheel* touch* composition* Events </td>
3677 <td> </td>
3678 </tr>
3679
3680 <tr>
3681 <td> </td>
3682 <td> </td>
3683 <td> </td>
3684 <td>SDL </td>
3685 <td>Element.addEventListener </td>
3686 <td> </td>
3687 </tr>
3688
3689 <tr>
3690 <td>ClearInputEventRequest </td>
3691 <td>M13 </td>
3692 <td> </td>
3693 <td>SDL </td>
3694 <td>Element.removeEventListener </td>
3695 <td> </td>
3696 </tr>
3697
3698 <tr>
3699 <td>GetType </td>
3700 <td>M13 </td>
3701 <td> </td>
3702 <td>SDL </td>
3703 <td>Event class descendants </td>
3704 <td> </td>
3705 </tr>
3706
3707 <tr>
3708 <td>GetTimeStamp </td>
3709 <td>M13 </td>
3710 <td> </td>
3711 <td>SDL </td>
3712 <td>Event.timeStamp </td>
3713 <td> </td>
3714 </tr>
3715
3716 <tr>
3717 <td>GetModifiers </td>
3718 <td>M13/M55 </td>
3719 <td> </td>
3720 <td>SDL </td>
3721 <td>*Event.altKey/shiftKey/metaKey/ctrlKey </td>
3722 <td> </td>
3723 </tr>
3724
3725 </table>
3726 <h3>PPB_MouseInputEvent</h3>
3727 <table>
3728 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3729 <td>PPAPI Method </td>
3730 <td>State </td>
3731 <td>Assumes Threads </td>
3732 <td>Emscripten </td>
3733 <td>Web API </td>
3734 <td>Limitations </td>
3735 </tr>
3736
3737 <tr>
3738 <td>Create </td>
3739 <td>M13/M14 </td>
3740 <td> </td>
3741 <td>SDL </td>
3742 <td>MouseEvent </td>
3743 <td> </td>
3744 </tr>
3745
3746 <tr>
3747 <td>GetButton </td>
3748 <td>M13 </td>
3749 <td> </td>
3750 <td>SDL </td>
3751 <td>MouseEvent.button </td>
3752 <td> </td>
3753 </tr>
3754
3755 <tr>
3756 <td>GetPosition </td>
3757 <td>M13 </td>
3758 <td> </td>
3759 <td>SDL </td>
3760 <td>MouseEvent.client*/page*/offset* </td>
3761 <td> </td>
3762 </tr>
3763
3764 <tr>
3765 <td>GetClickCount </td>
3766 <td>M13 </td>
3767 <td> </td>
3768 <td>SDL </td>
3769 <td>dblclick' vs 'mousedown' Events </td>
3770 <td> </td>
3771 </tr>
3772
3773 <tr>
3774 <td>GetMovement </td>
3775 <td>M14 </td>
3776 <td> </td>
3777 <td>SDL </td>
3778 <td>MouseEvent.movement* </td>
3779 <td> </td>
3780 </tr>
3781
3782 </table>
3783 <h3>PPB_WheelInputEvent</h3>
3784 <table>
3785 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3786 <td>PPAPI Method </td>
3787 <td>State </td>
3788 <td>Assumes Threads </td>
3789 <td>Emscripten </td>
3790 <td>Web API </td>
3791 <td>Limitations </td>
3792 </tr>
3793
3794 <tr>
3795 <td>Create </td>
3796 <td>M13 </td>
3797 <td> </td>
3798 <td>SDL </td>
3799 <td>WheelEvent </td>
3800 <td> </td>
3801 </tr>
3802
3803 <tr>
3804 <td>GetDelta </td>
3805 <td>M13 </td>
3806 <td> </td>
3807 <td>SDL </td>
3808 <td>WheelEvent.delta* </td>
3809 <td> </td>
3810 </tr>
3811
3812 <tr>
3813 <td>GetTicks </td>
3814 <td>M13 </td>
3815 <td> </td>
3816 <td bgcolor="#ffcccc">GAP</td>
3817 <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incom pletely.</td>
3818 <td> </td>
3819 </tr>
3820
3821 <tr>
3822 <td>GetScrollByPage </td>
3823 <td>M13 </td>
3824 <td> </td>
3825 <td bgcolor="#ffcccc">GAP</td>
3826 <td bgcolor="#ffcccc">GAP - deltaMode kinda of contains this info, but incom pletely.</td>
3827 <td> </td>
3828 </tr>
3829
3830 </table>
3831 <h3>PPB_KeyboardInputEvent</h3>
3832 <table>
3833 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3834 <td>PPAPI Method </td>
3835 <td>State </td>
3836 <td>Assumes Threads </td>
3837 <td>Emscripten </td>
3838 <td>Web API </td>
3839 <td>Limitations </td>
3840 </tr>
3841
3842 <tr>
3843 <td>Create </td>
3844 <td>M13/M34 </td>
3845 <td> </td>
3846 <td>SDL </td>
3847 <td>KeyboardEvent </td>
3848 <td> </td>
3849 </tr>
3850
3851 <tr>
3852 <td>GetKeyCode </td>
3853 <td>M13 </td>
3854 <td> </td>
3855 <td>SDL </td>
3856 <td>KeyboardEvent.keyCode </td>
3857 <td> </td>
3858 </tr>
3859
3860 <tr>
3861 <td>GetCharacterText </td>
3862 <td>M13 </td>
3863 <td> </td>
3864 <td>SDL </td>
3865 <td>KeyboardEvent.key </td>
3866 <td> </td>
3867 </tr>
3868
3869 <tr>
3870 <td>GetCode </td>
3871 <td>M34 </td>
3872 <td> </td>
3873 <td>SDL </td>
3874 <td>KeyboardEvent.code </td>
3875 <td> </td>
3876 </tr>
3877
3878 </table>
3879 <h3>PPB_TouchInputEvent</h3>
3880 <table>
3881 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3882 <td>PPAPI Method </td>
3883 <td>State </td>
3884 <td>Assumes Threads </td>
3885 <td>Emscripten </td>
3886 <td>Web API </td>
3887 <td>Limitations </td>
3888 </tr>
3889
3890 <tr>
3891 <td>Create </td>
3892 <td>M13 </td>
3893 <td> </td>
3894 <td>SDL </td>
3895 <td>TouchEvent </td>
3896 <td> </td>
3897 </tr>
3898
3899 <tr>
3900 <td>AddTouchPoint </td>
3901 <td>M13 </td>
3902 <td> </td>
3903 <td>SDL </td>
3904 <td>TouchEvent.touches.push </td>
3905 <td> </td>
3906 </tr>
3907
3908 <tr>
3909 <td>GetTouchCount </td>
3910 <td>M13 </td>
3911 <td> </td>
3912 <td>SDL </td>
3913 <td>TouchEvent.touches.length </td>
3914 <td> </td>
3915 </tr>
3916
3917 <tr>
3918 <td>GetTouchByIndex </td>
3919 <td>M13 </td>
3920 <td> </td>
3921 <td>SDL </td>
3922 <td>TouchEvent.touches[i] </td>
3923 <td> </td>
3924 </tr>
3925
3926 <tr>
3927 <td>GetTouchById </td>
3928 <td>M13 </td>
3929 <td> </td>
3930 <td>SDL </td>
3931 <td>Touch.indentifer (to figure this out yourself) </td>
3932 <td> </td>
3933 </tr>
3934
3935 </table>
3936 <h3>PPB_IMEInputEvent</h3>
3937 <table>
3938 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
3939 <td>PPAPI Method </td>
3940 <td>State </td>
3941 <td>Assumes Threads </td>
3942 <td>Emscripten </td>
3943 <td>Web API </td>
3944 <td>Limitations </td>
3945 </tr>
3946
3947 <tr>
3948 <td>Create </td>
3949 <td>M13 </td>
3950 <td> </td>
3951 <td bgcolor="#ffcccc">GAP</td>
3952 <td>CompositionEvent </td>
3953 <td> </td>
3954 </tr>
3955
3956 <tr>
3957 <td>GetText </td>
3958 <td>M13 </td>
3959 <td> </td>
3960 <td bgcolor="#ffcccc">GAP</td>
3961 <td>CompositionEvent.data </td>
3962 <td> </td>
3963 </tr>
3964
3965 <tr>
3966 <td>GetSegmentNumber </td>
3967 <td>M13 </td>
3968 <td> </td>
3969 <td bgcolor="#ffcccc">GAP</td>
3970 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
3971 <td> </td>
3972 </tr>
3973
3974 <tr>
3975 <td>GetSegmentOffset </td>
3976 <td>M13 </td>
3977 <td> </td>
3978 <td bgcolor="#ffcccc">GAP</td>
3979 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
3980 <td> </td>
3981 </tr>
3982
3983 <tr>
3984 <td>GetTargetSegment </td>
3985 <td>M13 </td>
3986 <td> </td>
3987 <td bgcolor="#ffcccc">GAP</td>
3988 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
3989 <td> </td>
3990 </tr>
3991
3992 <tr>
3993 <td>GetSelection </td>
3994 <td>M13 </td>
3995 <td> </td>
3996 <td bgcolor="#ffcccc">GAP</td>
3997 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
3998 <td> </td>
3999 </tr>
4000
4001 </table>
4002 <h3>PPB_Instance</h3>
4003 <table>
4004 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4005 <td>PPAPI Method </td>
4006 <td>State </td>
4007 <td>Assumes Threads </td>
4008 <td>Emscripten </td>
4009 <td>Web API </td>
4010 <td>Limitations </td>
4011 </tr>
4012
4013 <tr>
4014 <td>BindGraphics </td>
4015 <td>M14 </td>
4016 <td> </td>
4017 <td>SDL </td>
4018 <td>Canvas.getContext (moot as binding is automatic). </td>
4019 <td> </td>
4020 </tr>
4021
4022 <tr>
4023 <td>IsFullFrame </td>
4024 <td>M14 </td>
4025 <td> </td>
4026 <td bgcolor="#ffcccc">GAP</td>
4027 <td bgcolor="#ffcccc">GAP - No equivalent to mime type handlers.</td>
4028 <td>NaCl apps can be registered to handle a particular mime type and own the whole document. </td>
4029 </tr>
4030
4031 </table>
4032 <h3>PPB_MediaStreamAudioTrack</h3>
4033 <table>
4034 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4035 <td>PPAPI Method </td>
4036 <td>State </td>
4037 <td>Assumes Threads </td>
4038 <td>Emscripten </td>
4039 <td>Web API </td>
4040 <td>Limitations </td>
4041 </tr>
4042
4043 <tr>
4044 <td>Configure </td>
4045 <td>M35 </td>
4046 <td> </td>
4047 <td bgcolor="#ffcccc">GAP</td>
4048 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4049 <td> </td>
4050 </tr>
4051
4052 <tr>
4053 <td>GetAttrib </td>
4054 <td>M35 </td>
4055 <td> </td>
4056 <td bgcolor="#ffcccc">GAP</td>
4057 <td>MediaStreamSettings.channelCount </td>
4058 <td> </td>
4059 </tr>
4060
4061 <tr>
4062 <td> </td>
4063 <td> </td>
4064 <td> </td>
4065 <td bgcolor="#ffcccc">GAP</td>
4066 <td>MediaStreamSettings.sampleSize </td>
4067 <td> </td>
4068 </tr>
4069
4070 <tr>
4071 <td> </td>
4072 <td> </td>
4073 <td> </td>
4074 <td bgcolor="#ffcccc">GAP</td>
4075 <td>MediaStreamSettings.sampleRate </td>
4076 <td> </td>
4077 </tr>
4078
4079 <tr>
4080 <td> </td>
4081 <td> </td>
4082 <td> </td>
4083 <td bgcolor="#ffcccc">GAP</td>
4084 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB _BUFFERS</td>
4085 <td> </td>
4086 </tr>
4087
4088 <tr>
4089 <td> </td>
4090 <td> </td>
4091 <td> </td>
4092 <td bgcolor="#ffcccc">GAP</td>
4093 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB _DURATION</td>
4094 <td> </td>
4095 </tr>
4096
4097 <tr>
4098 <td>GetId </td>
4099 <td>M35 </td>
4100 <td> </td>
4101 <td bgcolor="#ffcccc">GAP</td>
4102 <td>MediaStream.id </td>
4103 <td> </td>
4104 </tr>
4105
4106 <tr>
4107 <td>HasEnded </td>
4108 <td>M35 </td>
4109 <td> </td>
4110 <td bgcolor="#ffcccc">GAP</td>
4111 <td>MediaStream.ended </td>
4112 <td> </td>
4113 </tr>
4114
4115 <tr>
4116 <td>GetBuffer </td>
4117 <td>M35 </td>
4118 <td> </td>
4119 <td bgcolor="#ffcccc">GAP</td>
4120 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4121 <td> </td>
4122 </tr>
4123
4124 <tr>
4125 <td>RecycleBuffer </td>
4126 <td>M35 </td>
4127 <td> </td>
4128 <td bgcolor="#ffcccc">GAP</td>
4129 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4130 <td> </td>
4131 </tr>
4132
4133 <tr>
4134 <td>Close </td>
4135 <td>M35 </td>
4136 <td> </td>
4137 <td bgcolor="#ffcccc">GAP</td>
4138 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4139 <td> </td>
4140 </tr>
4141
4142 </table>
4143 <h3>PPB_MediaStreamVideoTrack</h3>
4144 <table>
4145 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4146 <td>PPAPI Method </td>
4147 <td>State </td>
4148 <td>Assumes Threads </td>
4149 <td>Emscripten </td>
4150 <td>Web API </td>
4151 <td>Limitations </td>
4152 </tr>
4153
4154 <tr>
4155 <td>Create </td>
4156 <td>M36(dev) </td>
4157 <td> </td>
4158 <td bgcolor="#ffcccc">GAP</td>
4159 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4160 <td>Ability to create synthetic stream. </td>
4161 </tr>
4162
4163 <tr>
4164 <td>Configure </td>
4165 <td>M35 </td>
4166 <td> </td>
4167 <td bgcolor="#ffcccc">GAP</td>
4168 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4169 <td> </td>
4170 </tr>
4171
4172 <tr>
4173 <td>GetAttrib </td>
4174 <td>M35 </td>
4175 <td> </td>
4176 <td bgcolor="#ffcccc">GAP</td>
4177 <td>MediaStreamSettings.width </td>
4178 <td> </td>
4179 </tr>
4180
4181 <tr>
4182 <td> </td>
4183 <td> </td>
4184 <td> </td>
4185 <td bgcolor="#ffcccc">GAP</td>
4186 <td>MediaStreamSettings.height </td>
4187 <td> </td>
4188 </tr>
4189
4190 <tr>
4191 <td> </td>
4192 <td> </td>
4193 <td> </td>
4194 <td bgcolor="#ffcccc">GAP</td>
4195 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB _BUFFERED_FRAMES</td>
4196 <td> </td>
4197 </tr>
4198
4199 <tr>
4200 <td> </td>
4201 <td> </td>
4202 <td> </td>
4203 <td bgcolor="#ffcccc">GAP</td>
4204 <td bgcolor="#ffcccc">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB _FORMAT</td>
4205 <td> </td>
4206 </tr>
4207
4208 <tr>
4209 <td>GetId </td>
4210 <td>M35 </td>
4211 <td> </td>
4212 <td bgcolor="#ffcccc">GAP</td>
4213 <td>MediaStream.id </td>
4214 <td> </td>
4215 </tr>
4216
4217 <tr>
4218 <td>HasEnded </td>
4219 <td>M35 </td>
4220 <td> </td>
4221 <td bgcolor="#ffcccc">GAP</td>
4222 <td>MediaStream.ended </td>
4223 <td> </td>
4224 </tr>
4225
4226 <tr>
4227 <td>GetFrame </td>
4228 <td>M35 </td>
4229 <td> </td>
4230 <td bgcolor="#ffcccc">GAP</td>
4231 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4232 <td> </td>
4233 </tr>
4234
4235 <tr>
4236 <td>RecycleFrame </td>
4237 <td>M35 </td>
4238 <td> </td>
4239 <td bgcolor="#ffcccc">GAP</td>
4240 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4241 <td> </td>
4242 </tr>
4243
4244 <tr>
4245 <td>Close </td>
4246 <td>M35 </td>
4247 <td> </td>
4248 <td bgcolor="#ffcccc">GAP</td>
4249 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4250 <td> </td>
4251 </tr>
4252
4253 <tr>
4254 <td>GetEmptyFrame </td>
4255 <td>M36(dev) </td>
4256 <td> </td>
4257 <td bgcolor="#ffcccc">GAP</td>
4258 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4259 <td> </td>
4260 </tr>
4261
4262 <tr>
4263 <td>PutFrame </td>
4264 <td>M36(dev) </td>
4265 <td> </td>
4266 <td bgcolor="#ffcccc">GAP</td>
4267 <td bgcolor="#ffcccc">GAP - No equivalent</td>
4268 <td> </td>
4269 </tr>
4270
4271 </table>
4272 <h3>PPB_MessageLoop</h3>
4273 <table>
4274 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4275 <td>PPAPI Method </td>
4276 <td>State </td>
4277 <td>Assumes Threads </td>
4278 <td>Emscripten </td>
4279 <td>Web API </td>
4280 <td>Limitations </td>
4281 </tr>
4282
4283 <tr>
4284 <td>Create </td>
4285 <td>M25 </td>
4286 <td> </td>
4287 <td>N/A </td>
4288 <td>Mostly moot, workers get an implicit event loop. </td>
4289 <td> </td>
4290 </tr>
4291
4292 <tr>
4293 <td>GetForMainThread </td>
4294 <td>M25 </td>
4295 <td> </td>
4296 <td>N/A </td>
4297 <td>Mostly moot, workers get an implicit event loop. </td>
4298 <td> </td>
4299 </tr>
4300
4301 <tr>
4302 <td>GetCurrent </td>
4303 <td>M25 </td>
4304 <td> </td>
4305 <td>N/A </td>
4306 <td>Mostly moot, workers get an implicit event loop. </td>
4307 <td> </td>
4308 </tr>
4309
4310 <tr>
4311 <td>AttachToCurrentThread </td>
4312 <td>M25 </td>
4313 <td> </td>
4314 <td>N/A </td>
4315 <td>Mostly moot, workers get an implicit event loop. </td>
4316 <td> </td>
4317 </tr>
4318
4319 <tr>
4320 <td>Run </td>
4321 <td>M25 </td>
4322 <td> </td>
4323 <td>N/A </td>
4324 <td>Mostly moot, workers get an implicit event loop. </td>
4325 <td> </td>
4326 </tr>
4327
4328 <tr>
4329 <td>PostWork </td>
4330 <td>M25 </td>
4331 <td> </td>
4332 <td>N/A </td>
4333 <td>Mostly moot, workers get an implicit event loop. </td>
4334 <td> </td>
4335 </tr>
4336
4337 <tr>
4338 <td>PostQuit </td>
4339 <td>M25 </td>
4340 <td> </td>
4341 <td>N/A </td>
4342 <td>Mostly moot, workers get an implicit event loop. </td>
4343 <td> </td>
4344 </tr>
4345
4346 </table>
4347 <h3>PPB_Messaging</h3>
4348 <table>
4349 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4350 <td>PPAPI Method </td>
4351 <td>State </td>
4352 <td>Assumes Threads </td>
4353 <td>Emscripten </td>
4354 <td>Web API </td>
4355 <td>Limitations </td>
4356 </tr>
4357
4358 <tr>
4359 <td>PostMessage </td>
4360 <td>M14 </td>
4361 <td> </td>
4362 <td>N/A </td>
4363 <td>Window.postMessage </td>
4364 <td> </td>
4365 </tr>
4366
4367 <tr>
4368 <td>RegisterMessageHandler </td>
4369 <td>M39 </td>
4370 <td> </td>
4371 <td>N/A </td>
4372 <td>Window.addEventListener </td>
4373 <td> </td>
4374 </tr>
4375
4376 <tr>
4377 <td>UnregisterMessageHandler </td>
4378 <td>M39 </td>
4379 <td> </td>
4380 <td>N/A </td>
4381 <td>Window.removeEventListener </td>
4382 <td> </td>
4383 </tr>
4384
4385 </table>
4386 <h3>PPB_MouseCursor</h3>
4387 <table>
4388 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4389 <td>PPAPI Method </td>
4390 <td>State </td>
4391 <td>Assumes Threads </td>
4392 <td>Emscripten </td>
4393 <td>Web API </td>
4394 <td>Limitations </td>
4395 </tr>
4396
4397 <tr>
4398 <td>SetCursor </td>
4399 <td>M19 </td>
4400 <td> </td>
4401 <td>SDL </td>
4402 <td>Element.style.cursor </td>
4403 <td>Same set of stock cursors are supported.
4404 Custom cursors can be done with url(..).
4405 Dynamic custom cursors can be done with data URIs.
4406 CSS3 supports specifying the hotspot. </td>
4407 </tr>
4408
4409 </table>
4410 <h3>PPB_MouseLock</h3>
4411 <table>
4412 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4413 <td>PPAPI Method </td>
4414 <td>State </td>
4415 <td>Assumes Threads </td>
4416 <td>Emscripten </td>
4417 <td>Web API </td>
4418 <td>Limitations </td>
4419 </tr>
4420
4421 <tr>
4422 <td>LockMouse </td>
4423 <td>M16 </td>
4424 <td> </td>
4425 <td>SDL </td>
4426 <td>Element.requestPointerLock </td>
4427 <td> </td>
4428 </tr>
4429
4430 <tr>
4431 <td>UnlockMouse </td>
4432 <td>M16 </td>
4433 <td> </td>
4434 <td>SDL </td>
4435 <td>Element.exitPointerLock </td>
4436 <td> </td>
4437 </tr>
4438
4439 </table>
4440 <h3>PPB_OpenGLES2</h3>
4441 <table>
4442 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4443 <td>PPAPI Method </td>
4444 <td>State </td>
4445 <td>Assumes Threads </td>
4446 <td>Emscripten </td>
4447 <td>Web API </td>
4448 <td>Limitations </td>
4449 </tr>
4450
4451 <tr>
4452 <td>Several Methods </td>
4453 <td>M39 </td>
4454 <td> </td>
4455 <td>OpenGLES </td>
4456 <td>Close to WebGL 1.0 in functionality. </td>
4457 <td>TODO(bradnelson): more detail </td>
4458 </tr>
4459
4460 <tr>
4461 <td> </td>
4462 <td> </td>
4463 <td>x </td>
4464 <td> </td>
4465 <td bgcolor="#ffcccc">GAP - Without offscreen canvas, rendering must be done on the main thread.</td>
4466 <td> </td>
4467 </tr>
4468
4469 </table>
4470 <h3>PPB_TextInputController</h3>
4471 <table>
4472 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4473 <td>PPAPI Method </td>
4474 <td>State </td>
4475 <td>Assumes Threads </td>
4476 <td>Emscripten </td>
4477 <td>Web API </td>
4478 <td>Limitations </td>
4479 </tr>
4480
4481 <tr>
4482 <td>SetTextInputType </td>
4483 <td>M30 </td>
4484 <td> </td>
4485 <td bgcolor="#ffcccc">GAP</td>
4486 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
4487 <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 / outpu t inline inside a canvas. </td>
4488 </tr>
4489
4490 <tr>
4491 <td>UpdateCaretPosition </td>
4492 <td>M30 </td>
4493 <td> </td>
4494 <td bgcolor="#ffcccc">GAP</td>
4495 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
4496 <td> </td>
4497 </tr>
4498
4499 <tr>
4500 <td>CancelCompositionText </td>
4501 <td>M30 </td>
4502 <td> </td>
4503 <td bgcolor="#ffcccc">GAP</td>
4504 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
4505 <td> </td>
4506 </tr>
4507
4508 <tr>
4509 <td>UpdateSurroundingText </td>
4510 <td>M30 </td>
4511 <td> </td>
4512 <td bgcolor="#ffcccc">GAP</td>
4513 <td bgcolor="#ffcccc">GAP - No equivalent hints to browser about canvas cont aining input.</td>
4514 <td> </td>
4515 </tr>
4516
4517 </table>
4518 <h3>PPB_URLLoader</h3>
4519 <table>
4520 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4521 <td>PPAPI Method </td>
4522 <td>State </td>
4523 <td>Assumes Threads </td>
4524 <td>Emscripten </td>
4525 <td>Web API </td>
4526 <td>Limitations </td>
4527 </tr>
4528
4529 <tr>
4530 <td>Create </td>
4531 <td>M14 </td>
4532 <td> </td>
4533 <td>embind </td>
4534 <td>new XMLHttpRequest(); </td>
4535 <td> </td>
4536 </tr>
4537
4538 <tr>
4539 <td>Open </td>
4540 <td>M14 </td>
4541 <td> </td>
4542 <td>embind </td>
4543 <td>XMLHttpRequest.open </td>
4544 <td> </td>
4545 </tr>
4546
4547 <tr>
4548 <td>FollowRedirect </td>
4549 <td>M14 </td>
4550 <td> </td>
4551 <td>embind </td>
4552 <td>Request.redirect </td>
4553 <td> </td>
4554 </tr>
4555
4556 <tr>
4557 <td> </td>
4558 <td> </td>
4559 <td> </td>
4560 <td bgcolor="#ffcccc">GAP</td>
4561 <td bgcolor="#ffcccc">GAP - No XMLHTTPRequest equivalent</td>
4562 <td> </td>
4563 </tr>
4564
4565 <tr>
4566 <td>GetUploadProgress </td>
4567 <td>M14 </td>
4568 <td> </td>
4569 <td>embind </td>
4570 <td>XMLHttpRequest 'progress' Event </td>
4571 <td> </td>
4572 </tr>
4573
4574 <tr>
4575 <td> </td>
4576 <td> </td>
4577 <td> </td>
4578 <td bgcolor="#ffcccc">GAP</td>
4579 <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td>
4580 <td> </td>
4581 </tr>
4582
4583 <tr>
4584 <td>GetDownloadProgress </td>
4585 <td>M14 </td>
4586 <td> </td>
4587 <td>embind </td>
4588 <td>XMLHttpRequest 'progress' Event </td>
4589 <td> </td>
4590 </tr>
4591
4592 <tr>
4593 <td> </td>
4594 <td> </td>
4595 <td> </td>
4596 <td bgcolor="#ffcccc">GAP</td>
4597 <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td>
4598 <td> </td>
4599 </tr>
4600
4601 <tr>
4602 <td>GetResponseInfo </td>
4603 <td>M14 </td>
4604 <td> </td>
4605 <td>embind </td>
4606 <td>XMLHttpRequest.getAllResponseHeaders </td>
4607 <td> </td>
4608 </tr>
4609
4610 <tr>
4611 <td> </td>
4612 <td> </td>
4613 <td> </td>
4614 <td>embind </td>
4615 <td>Fetch Response.* </td>
4616 <td> </td>
4617 </tr>
4618
4619 <tr>
4620 <td>ReadResponseBody </td>
4621 <td>M14 </td>
4622 <td> </td>
4623 <td>embind </td>
4624 <td>XMLHttpRequest.response </td>
4625 <td> </td>
4626 </tr>
4627
4628 <tr>
4629 <td> </td>
4630 <td> </td>
4631 <td> </td>
4632 <td>embind </td>
4633 <td>Body.* (Response is a Body) </td>
4634 <td> </td>
4635 </tr>
4636
4637 <tr>
4638 <td>FinishStreamingToFile </td>
4639 <td>M14 </td>
4640 <td> </td>
4641 <td>embind </td>
4642 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
4643 <td>XMLHttpRequest and Fetch both assume streaming to memory, rather than di rectly to a storage. </td>
4644 </tr>
4645
4646 <tr>
4647 <td>Close </td>
4648 <td>M14 </td>
4649 <td> </td>
4650 <td>embind </td>
4651 <td>XMLHttpRequest.abort </td>
4652 <td> </td>
4653 </tr>
4654
4655 <tr>
4656 <td> </td>
4657 <td> </td>
4658 <td> </td>
4659 <td bgcolor="#ffcccc">GAP</td>
4660 <td bgcolor="#ffcccc">GAP - No Fetch API equivalent</td>
4661 <td> </td>
4662 </tr>
4663
4664 </table>
4665 <h3>PPB_URLRequestInfo</h3>
4666 <table>
4667 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4668 <td>PPAPI Method </td>
4669 <td>State </td>
4670 <td>Assumes Threads </td>
4671 <td>Emscripten </td>
4672 <td>Web API </td>
4673 <td>Limitations </td>
4674 </tr>
4675
4676 <tr>
4677 <td>Create </td>
4678 <td>M14 </td>
4679 <td> </td>
4680 <td>embind </td>
4681 <td>XMLHttpRequest </td>
4682 <td> </td>
4683 </tr>
4684
4685 <tr>
4686 <td> </td>
4687 <td> </td>
4688 <td> </td>
4689 <td>embind </td>
4690 <td>Fetch Request </td>
4691 <td>No way to stream to a file. </td>
4692 </tr>
4693
4694 <tr>
4695 <td>SetProperty </td>
4696 <td>M14 </td>
4697 <td> </td>
4698 <td bgcolor="#ffcccc">GAP</td>
4699 <td bgcolor="#ffcccc">GAP - No direct equivalent for XMLHttpRequest</td>
4700 <td>XMLHttpRequest doesn't provide direct ways to per-request limit followin g redirects, stream to a file, set referrer or credentials policy. </td>
4701 </tr>
4702
4703 <tr>
4704 <td> </td>
4705 <td> </td>
4706 <td> </td>
4707 <td>embind </td>
4708 <td>Request.* </td>
4709 <td> </td>
4710 </tr>
4711
4712 <tr>
4713 <td>AppendDataToBody </td>
4714 <td>M14 </td>
4715 <td> </td>
4716 <td>embind </td>
4717 <td>XMLHttpRequest.send </td>
4718 <td bgcolor="#ffcccc">GAP - Both must have the whole body, rather than a chu nk.</td>
4719 </tr>
4720
4721 <tr>
4722 <td> </td>
4723 <td> </td>
4724 <td> </td>
4725 <td>embind </td>
4726 <td>fetch(.., options:body) </td>
4727 <td> </td>
4728 </tr>
4729
4730 <tr>
4731 <td>AppendFileToBody </td>
4732 <td>M14 </td>
4733 <td> </td>
4734 <td bgcolor="#ffcccc">GAP</td>
4735 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
4736 <td> </td>
4737 </tr>
4738
4739 <tr>
4740 <td> </td>
4741 <td> </td>
4742 <td> </td>
4743 <td>N/A </td>
4744 <td>&lt;form&gt; </td>
4745 <td>You can also read with FileReader and upload, but that's more like Appen dDataToBody </td>
4746 </tr>
4747
4748 </table>
4749 <h3>PPB_URLResponseInfo</h3>
4750 <table>
4751 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4752 <td>PPAPI Method </td>
4753 <td>State </td>
4754 <td>Assumes Threads </td>
4755 <td>Emscripten </td>
4756 <td>Web API </td>
4757 <td>Limitations </td>
4758 </tr>
4759
4760 <tr>
4761 <td>GetProperty </td>
4762 <td>M14 </td>
4763 <td> </td>
4764 <td>embind </td>
4765 <td>XMLHttpRequest.getAllResponseHeaders + others </td>
4766 <td> </td>
4767 </tr>
4768
4769 <tr>
4770 <td> </td>
4771 <td> </td>
4772 <td> </td>
4773 <td>embind </td>
4774 <td>Fetch Response.* </td>
4775 <td> </td>
4776 </tr>
4777
4778 <tr>
4779 <td>GetBodyAsFileRef </td>
4780 <td>M14 </td>
4781 <td> </td>
4782 <td>embind </td>
4783 <td>Fetch Response (Body) .blob() </td>
4784 <td>Assumes storage layer optimizes transfer. </td>
4785 </tr>
4786
4787 </table>
4788 <h3>PPB_Var</h3>
4789 <table>
4790 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4791 <td>PPAPI Method </td>
4792 <td>State </td>
4793 <td>Assumes Threads </td>
4794 <td>Emscripten </td>
4795 <td>Web API </td>
4796 <td>Limitations </td>
4797 </tr>
4798
4799 <tr>
4800 <td>VarFromUtf8 </td>
4801 <td>M18 </td>
4802 <td> </td>
4803 <td>embind </td>
4804 <td>TextDecoder.decode </td>
4805 <td> </td>
4806 </tr>
4807
4808 <tr>
4809 <td>VarToUtf8 </td>
4810 <td>M14 </td>
4811 <td> </td>
4812 <td>embind </td>
4813 <td>TextEncoder.encode </td>
4814 <td> </td>
4815 </tr>
4816
4817 <tr>
4818 <td>VarFromResource </td>
4819 <td>M34 </td>
4820 <td> </td>
4821 <td>N/A </td>
4822 <td>N/A </td>
4823 <td> </td>
4824 </tr>
4825
4826 <tr>
4827 <td>VarToResource </td>
4828 <td>M34 </td>
4829 <td> </td>
4830 <td>N/A </td>
4831 <td>N/A </td>
4832 <td> </td>
4833 </tr>
4834
4835 </table>
4836 <h3>PPB_VarArray</h3>
4837 <table>
4838 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4839 <td>PPAPI Method </td>
4840 <td>State </td>
4841 <td>Assumes Threads </td>
4842 <td>Emscripten </td>
4843 <td>Web API </td>
4844 <td>Limitations </td>
4845 </tr>
4846
4847 <tr>
4848 <td>Get </td>
4849 <td>M29 </td>
4850 <td> </td>
4851 <td>embind </td>
4852 <td>Array[i] </td>
4853 <td> </td>
4854 </tr>
4855
4856 <tr>
4857 <td>Set </td>
4858 <td>M29 </td>
4859 <td> </td>
4860 <td>embind </td>
4861 <td>Array[i] = x </td>
4862 <td> </td>
4863 </tr>
4864
4865 <tr>
4866 <td>GetLength </td>
4867 <td>M29 </td>
4868 <td> </td>
4869 <td>embind </td>
4870 <td>Array.length </td>
4871 <td> </td>
4872 </tr>
4873
4874 <tr>
4875 <td>SetLength </td>
4876 <td>M29 </td>
4877 <td> </td>
4878 <td>embind </td>
4879 <td>Array.length = n </td>
4880 <td> </td>
4881 </tr>
4882
4883 </table>
4884 <h3>PPB_VarArrayBuffer</h3>
4885 <table>
4886 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4887 <td>PPAPI Method </td>
4888 <td>State </td>
4889 <td>Assumes Threads </td>
4890 <td>Emscripten </td>
4891 <td>Web API </td>
4892 <td>Limitations </td>
4893 </tr>
4894
4895 <tr>
4896 <td>Create </td>
4897 <td>M18 </td>
4898 <td> </td>
4899 <td>embind </td>
4900 <td>new ArrayBuffer(n) </td>
4901 <td> </td>
4902 </tr>
4903
4904 <tr>
4905 <td>ByteLength </td>
4906 <td>M18 </td>
4907 <td> </td>
4908 <td>embind </td>
4909 <td>ArrayBuffer.byteLength </td>
4910 <td> </td>
4911 </tr>
4912
4913 <tr>
4914 <td>Map </td>
4915 <td>M18 </td>
4916 <td> </td>
4917 <td bgcolor="#ffcccc">GAP</td>
4918 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
4919 <td>Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap.
4920 Future multiple memories or memory mapping might improve this. </td>
4921 </tr>
4922
4923 <tr>
4924 <td>Unmap </td>
4925 <td>M18 </td>
4926 <td> </td>
4927 <td bgcolor="#ffcccc">GAP</td>
4928 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
4929 <td> </td>
4930 </tr>
4931
4932 </table>
4933 <h3>PPB_VarDictionary</h3>
4934 <table>
4935 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
4936 <td>PPAPI Method </td>
4937 <td>State </td>
4938 <td>Assumes Threads </td>
4939 <td>Emscripten </td>
4940 <td>Web API </td>
4941 <td>Limitations </td>
4942 </tr>
4943
4944 <tr>
4945 <td>Create </td>
4946 <td>M29 </td>
4947 <td> </td>
4948 <td>embind </td>
4949 <td>{} </td>
4950 <td> </td>
4951 </tr>
4952
4953 <tr>
4954 <td>Get </td>
4955 <td>M29 </td>
4956 <td> </td>
4957 <td>embind </td>
4958 <td>&lt;Object&gt;[i] </td>
4959 <td> </td>
4960 </tr>
4961
4962 <tr>
4963 <td>Set </td>
4964 <td>M29 </td>
4965 <td> </td>
4966 <td>embind </td>
4967 <td>&lt;Object&gt;[i] = x </td>
4968 <td> </td>
4969 </tr>
4970
4971 <tr>
4972 <td>Delete </td>
4973 <td>M29 </td>
4974 <td> </td>
4975 <td>embind </td>
4976 <td>delete &lt;Object&gt;[i] </td>
4977 <td> </td>
4978 </tr>
4979
4980 <tr>
4981 <td>HasKey </td>
4982 <td>M29 </td>
4983 <td> </td>
4984 <td>embind </td>
4985 <td>x in &lt;Object&gt; </td>
4986 <td> </td>
4987 </tr>
4988
4989 <tr>
4990 <td>GetKeys </td>
4991 <td>M29 </td>
4992 <td> </td>
4993 <td>embind </td>
4994 <td>for (k in &lt;Object&gt;) {} </td>
4995 <td>No literal equivalent, but it can be built. </td>
4996 </tr>
4997
4998 </table>
4999 <h3>PPB_VideoDecoder</h3>
5000 <table>
5001 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5002 <td>PPAPI Method </td>
5003 <td>State </td>
5004 <td>Assumes Threads </td>
5005 <td>Emscripten </td>
5006 <td>Web API </td>
5007 <td>Limitations </td>
5008 </tr>
5009
5010 <tr>
5011 <td>Create </td>
5012 <td>M36 </td>
5013 <td> </td>
5014 <td bgcolor="#ffcccc">GAP</td>
5015 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5016 <td> </td>
5017 </tr>
5018
5019 <tr>
5020 <td>Initialize </td>
5021 <td>M39/M46 </td>
5022 <td> </td>
5023 <td bgcolor="#ffcccc">GAP</td>
5024 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5025 <td> </td>
5026 </tr>
5027
5028 <tr>
5029 <td>Decode </td>
5030 <td>M36 </td>
5031 <td> </td>
5032 <td bgcolor="#ffcccc">GAP</td>
5033 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5034 <td> </td>
5035 </tr>
5036
5037 <tr>
5038 <td>GetPicture </td>
5039 <td>M40 </td>
5040 <td> </td>
5041 <td bgcolor="#ffcccc">GAP</td>
5042 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5043 <td> </td>
5044 </tr>
5045
5046 <tr>
5047 <td>RecyclePicture </td>
5048 <td>M36 </td>
5049 <td> </td>
5050 <td bgcolor="#ffcccc">GAP</td>
5051 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5052 <td> </td>
5053 </tr>
5054
5055 <tr>
5056 <td>Flush </td>
5057 <td>M36 </td>
5058 <td> </td>
5059 <td bgcolor="#ffcccc">GAP</td>
5060 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5061 <td> </td>
5062 </tr>
5063
5064 <tr>
5065 <td>Reset </td>
5066 <td>M36 </td>
5067 <td> </td>
5068 <td bgcolor="#ffcccc">GAP</td>
5069 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5070 <td> </td>
5071 </tr>
5072
5073 </table>
5074 <h3>PPB_VideoEncoder</h3>
5075 <table>
5076 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5077 <td>PPAPI Method </td>
5078 <td>State </td>
5079 <td>Assumes Threads </td>
5080 <td>Emscripten </td>
5081 <td>Web API </td>
5082 <td>Limitations </td>
5083 </tr>
5084
5085 <tr>
5086 <td>Create </td>
5087 <td>M44 </td>
5088 <td> </td>
5089 <td bgcolor="#ffcccc">GAP</td>
5090 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5091 <td>Overlap with MediaRecorder API, but not exact. </td>
5092 </tr>
5093
5094 <tr>
5095 <td>GetSupportedProfiles </td>
5096 <td>M44 </td>
5097 <td> </td>
5098 <td bgcolor="#ffcccc">GAP</td>
5099 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5100 <td> </td>
5101 </tr>
5102
5103 <tr>
5104 <td>Initialize </td>
5105 <td>M44 </td>
5106 <td> </td>
5107 <td bgcolor="#ffcccc">GAP</td>
5108 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5109 <td> </td>
5110 </tr>
5111
5112 <tr>
5113 <td>GetFramesRequired </td>
5114 <td>M44 </td>
5115 <td> </td>
5116 <td bgcolor="#ffcccc">GAP</td>
5117 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5118 <td> </td>
5119 </tr>
5120
5121 <tr>
5122 <td>GetFrameCodedSize </td>
5123 <td>M44 </td>
5124 <td> </td>
5125 <td bgcolor="#ffcccc">GAP</td>
5126 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5127 <td> </td>
5128 </tr>
5129
5130 <tr>
5131 <td>GetVideoFrame </td>
5132 <td>M44 </td>
5133 <td> </td>
5134 <td bgcolor="#ffcccc">GAP</td>
5135 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5136 <td> </td>
5137 </tr>
5138
5139 <tr>
5140 <td>Encode </td>
5141 <td>M44 </td>
5142 <td> </td>
5143 <td bgcolor="#ffcccc">GAP</td>
5144 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5145 <td> </td>
5146 </tr>
5147
5148 <tr>
5149 <td>GetBitstreamBuffer </td>
5150 <td>M44 </td>
5151 <td> </td>
5152 <td bgcolor="#ffcccc">GAP</td>
5153 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5154 <td> </td>
5155 </tr>
5156
5157 <tr>
5158 <td>RecycleBitstreamBuffer </td>
5159 <td>M44 </td>
5160 <td> </td>
5161 <td bgcolor="#ffcccc">GAP</td>
5162 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5163 <td> </td>
5164 </tr>
5165
5166 <tr>
5167 <td>RequestEncodingParametersChange </td>
5168 <td>M44 </td>
5169 <td> </td>
5170 <td bgcolor="#ffcccc">GAP</td>
5171 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5172 <td> </td>
5173 </tr>
5174
5175 <tr>
5176 <td>Close </td>
5177 <td>M44 </td>
5178 <td> </td>
5179 <td bgcolor="#ffcccc">GAP</td>
5180 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5181 <td> </td>
5182 </tr>
5183
5184 </table>
5185 <h3>PPB_VideoFrame</h3>
5186 <table>
5187 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5188 <td>PPAPI Method </td>
5189 <td>State </td>
5190 <td>Assumes Threads </td>
5191 <td>Emscripten </td>
5192 <td>Web API </td>
5193 <td>Limitations </td>
5194 </tr>
5195
5196 <tr>
5197 <td>GetTimestamp </td>
5198 <td>M35 </td>
5199 <td> </td>
5200 <td bgcolor="#ffcccc">GAP</td>
5201 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5202 <td> </td>
5203 </tr>
5204
5205 <tr>
5206 <td>SetTimestamp </td>
5207 <td>M35 </td>
5208 <td> </td>
5209 <td bgcolor="#ffcccc">GAP</td>
5210 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5211 <td> </td>
5212 </tr>
5213
5214 <tr>
5215 <td>GetFormat </td>
5216 <td>M35 </td>
5217 <td> </td>
5218 <td bgcolor="#ffcccc">GAP</td>
5219 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5220 <td> </td>
5221 </tr>
5222
5223 <tr>
5224 <td>GetSize </td>
5225 <td>M35 </td>
5226 <td> </td>
5227 <td bgcolor="#ffcccc">GAP</td>
5228 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5229 <td> </td>
5230 </tr>
5231
5232 <tr>
5233 <td>GetDataBuffer </td>
5234 <td>M35 </td>
5235 <td> </td>
5236 <td bgcolor="#ffcccc">GAP</td>
5237 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5238 <td> </td>
5239 </tr>
5240
5241 <tr>
5242 <td>GetDataBufferSize </td>
5243 <td>M35 </td>
5244 <td> </td>
5245 <td bgcolor="#ffcccc">GAP</td>
5246 <td bgcolor="#ffcccc">GAP - No equivalent</td>
5247 <td> </td>
5248 </tr>
5249
5250 </table>
5251 <h3>PPB_View</h3>
5252 <table>
5253 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5254 <td>PPAPI Method </td>
5255 <td>State </td>
5256 <td>Assumes Threads </td>
5257 <td>Emscripten </td>
5258 <td>Web API </td>
5259 <td>Limitations </td>
5260 </tr>
5261
5262 <tr>
5263 <td>GetRect </td>
5264 <td>M18 </td>
5265 <td> </td>
5266 <td>embind </td>
5267 <td>Element.getBoundingClientRect </td>
5268 <td> </td>
5269 </tr>
5270
5271 <tr>
5272 <td>IsFullscreen </td>
5273 <td>M18 </td>
5274 <td> </td>
5275 <td>embind </td>
5276 <td>Document.fullScreenEnabled </td>
5277 <td>Pertains to document instead of just single element. </td>
5278 </tr>
5279
5280 <tr>
5281 <td>IsVisible </td>
5282 <td>M18 </td>
5283 <td> </td>
5284 <td>embind </td>
5285 <td>IntersectionObserver </td>
5286 <td> </td>
5287 </tr>
5288
5289 <tr>
5290 <td>IsPageVisible </td>
5291 <td>M18 </td>
5292 <td> </td>
5293 <td>embind </td>
5294 <td>document.visibilityState </td>
5295 <td> </td>
5296 </tr>
5297
5298 <tr>
5299 <td>GetClipRect </td>
5300 <td>M18 </td>
5301 <td> </td>
5302 <td>embind </td>
5303 <td>IntersectionObserver </td>
5304 <td> </td>
5305 </tr>
5306
5307 <tr>
5308 <td>GetDeviceScale </td>
5309 <td>M28 </td>
5310 <td> </td>
5311 <td>embind </td>
5312 <td>window.devicePixelRatio </td>
5313 <td> </td>
5314 </tr>
5315
5316 <tr>
5317 <td>GetCSSScale </td>
5318 <td>M28 </td>
5319 <td> </td>
5320 <td>embind </td>
5321 <td>&lt;Element&gt;.getBoundingClientRect().width / &lt;Element&gt;.offsetWi dth </td>
5322 <td> </td>
5323 </tr>
5324
5325 <tr>
5326 <td>GetScrollOffset </td>
5327 <td>M37 </td>
5328 <td> </td>
5329 <td>embind </td>
5330 <td>&lt;Element&gt;.scrollTop / &lt;Element&gt;.scrollLeft </td>
5331 <td> </td>
5332 </tr>
5333
5334 </table>
5335 <h3>PPB_WebSocket</h3>
5336 <table>
5337 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5338 <td>PPAPI Method </td>
5339 <td>State </td>
5340 <td>Assumes Threads </td>
5341 <td>Emscripten </td>
5342 <td>Web API </td>
5343 <td>Limitations </td>
5344 </tr>
5345
5346 <tr>
5347 <td>Create </td>
5348 <td>M18 </td>
5349 <td> </td>
5350 <td bgcolor="#ffcccc">GAP</td>
5351 <td>WebSocket.WebSocket </td>
5352 <td> </td>
5353 </tr>
5354
5355 <tr>
5356 <td>Connect </td>
5357 <td>M18 </td>
5358 <td> </td>
5359 <td bgcolor="#ffcccc">GAP</td>
5360 <td>WebSocket.WebSocket(url, ...)
5361 WebSocket 'open' Event </td>
5362 <td> </td>
5363 </tr>
5364
5365 <tr>
5366 <td>Close </td>
5367 <td>M18 </td>
5368 <td> </td>
5369 <td bgcolor="#ffcccc">GAP</td>
5370 <td>WebSocket.close </td>
5371 <td> </td>
5372 </tr>
5373
5374 <tr>
5375 <td>ReceiveMessage </td>
5376 <td>M18 </td>
5377 <td> </td>
5378 <td bgcolor="#ffcccc">GAP</td>
5379 <td>WebSocket 'message' Event
5380 WebSocket 'error' Event
5381 WebSocket 'close' Event </td>
5382 <td> </td>
5383 </tr>
5384
5385 <tr>
5386 <td>SendMessage </td>
5387 <td>M18 </td>
5388 <td> </td>
5389 <td bgcolor="#ffcccc">GAP</td>
5390 <td>WebSocket.send </td>
5391 <td> </td>
5392 </tr>
5393
5394 <tr>
5395 <td>GetBufferedAmount </td>
5396 <td>M18 </td>
5397 <td> </td>
5398 <td bgcolor="#ffcccc">GAP</td>
5399 <td>WebSocket.bufferedAmount </td>
5400 <td> </td>
5401 </tr>
5402
5403 <tr>
5404 <td>GetCloseCode </td>
5405 <td>M18 </td>
5406 <td> </td>
5407 <td bgcolor="#ffcccc">GAP</td>
5408 <td>CloseEvent.code </td>
5409 <td> </td>
5410 </tr>
5411
5412 <tr>
5413 <td>GetCloseReason </td>
5414 <td>M18 </td>
5415 <td> </td>
5416 <td bgcolor="#ffcccc">GAP</td>
5417 <td>CloseEvent.reason </td>
5418 <td> </td>
5419 </tr>
5420
5421 <tr>
5422 <td>GetCloseWasClean </td>
5423 <td>M18 </td>
5424 <td> </td>
5425 <td bgcolor="#ffcccc">GAP</td>
5426 <td>CloseEvent.wasClean </td>
5427 <td> </td>
5428 </tr>
5429
5430 <tr>
5431 <td>GetExtensions </td>
5432 <td>M18 </td>
5433 <td> </td>
5434 <td bgcolor="#ffcccc">GAP</td>
5435 <td>WebSocket.extensions </td>
5436 <td> </td>
5437 </tr>
5438
5439 <tr>
5440 <td>GetProtocol </td>
5441 <td>M18 </td>
5442 <td> </td>
5443 <td bgcolor="#ffcccc">GAP</td>
5444 <td>WebSocket.protocol </td>
5445 <td> </td>
5446 </tr>
5447
5448 <tr>
5449 <td>GetReadyState </td>
5450 <td>M18 </td>
5451 <td> </td>
5452 <td bgcolor="#ffcccc">GAP</td>
5453 <td>WebSocket.readyState </td>
5454 <td> </td>
5455 </tr>
5456
5457 <tr>
5458 <td>GetURL </td>
5459 <td>M18 </td>
5460 <td> </td>
5461 <td bgcolor="#ffcccc">GAP</td>
5462 <td>WebSocket.url </td>
5463 <td> </td>
5464 </tr>
5465
5466 </table>
5467 <h3>PPP_Graphics3D</h3>
5468 <table>
5469 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5470 <td>PPAPI Method </td>
5471 <td>State </td>
5472 <td>Assumes Threads </td>
5473 <td>Emscripten </td>
5474 <td>Web API </td>
5475 <td>Limitations </td>
5476 </tr>
5477
5478 <tr>
5479 <td>Graphics3DContextLost </td>
5480 <td>M15 </td>
5481 <td> </td>
5482 <td>SDL </td>
5483 <td>Canvas 'webglcontextlost' Event </td>
5484 <td> </td>
5485 </tr>
5486
5487 </table>
5488 <h3>PPP_InputEvent</h3>
5489 <table>
5490 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5491 <td>PPAPI Method </td>
5492 <td>State </td>
5493 <td>Assumes Threads </td>
5494 <td>Emscripten </td>
5495 <td>Web API </td>
5496 <td>Limitations </td>
5497 </tr>
5498
5499 <tr>
5500 <td>HandleInputEvent </td>
5501 <td>M14 </td>
5502 <td> </td>
5503 <td>SDL </td>
5504 <td>Element.addEventListener </td>
5505 <td> </td>
5506 </tr>
5507
5508 </table>
5509 <h3>PPP_Instance</h3>
5510 <table>
5511 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5512 <td>PPAPI Method </td>
5513 <td>State </td>
5514 <td>Assumes Threads </td>
5515 <td>Emscripten </td>
5516 <td>Web API </td>
5517 <td>Limitations </td>
5518 </tr>
5519
5520 <tr>
5521 <td>DidCreate </td>
5522 <td>M14 </td>
5523 <td> </td>
5524 <td>N/A </td>
5525 <td>&lt;Element&gt;[key] </td>
5526 <td>General DOM access lets you fish out tag attributes </td>
5527 </tr>
5528
5529 <tr>
5530 <td>DidDestroy </td>
5531 <td>M14 </td>
5532 <td> </td>
5533 <td>N/A </td>
5534 <td>N/A </td>
5535 <td>Not triggered for NaCl </td>
5536 </tr>
5537
5538 <tr>
5539 <td>DidChangeView </td>
5540 <td>M14/M17 </td>
5541 <td> </td>
5542 <td>N/A </td>
5543 <td>Element 'resize' Event </td>
5544 <td> </td>
5545 </tr>
5546
5547 <tr>
5548 <td>DidChangeFocus </td>
5549 <td>M14 </td>
5550 <td> </td>
5551 <td>N/A </td>
5552 <td>Element 'focus', 'focusin', 'focusout' Events </td>
5553 <td> </td>
5554 </tr>
5555
5556 <tr>
5557 <td>HandleDocumentLoad </td>
5558 <td>M14 </td>
5559 <td> </td>
5560 <td>N/A </td>
5561 <td bgcolor="#ffcccc">GAP - No way to register as a mime type handler</td>
5562 <td>NaCl modules via apps + a manifest entry can be set up to handle particu lar mime types. </td>
5563 </tr>
5564
5565 </table>
5566 <h3>PPP_MessageHandler</h3>
5567 <table>
5568 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5569 <td>PPAPI Method </td>
5570 <td>State </td>
5571 <td>Assumes Threads </td>
5572 <td>Emscripten </td>
5573 <td>Web API </td>
5574 <td>Limitations </td>
5575 </tr>
5576
5577 <tr>
5578 <td>HandleMessage </td>
5579 <td>M39 </td>
5580 <td> </td>
5581 <td>embind </td>
5582 <td>MessagePort 'message' Event
5583 Window 'message' Event </td>
5584 <td> </td>
5585 </tr>
5586
5587 <tr>
5588 <td>HandleBlockingMessage </td>
5589 <td>M39 </td>
5590 <td> </td>
5591 <td>N/A </td>
5592 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5593 <td>Similar synchronization can be done off main thread with Atomics.wait. T his was added to support emulation of synchronous plugin APIs. </td>
5594 </tr>
5595
5596 </table>
5597 <h3>PPP_Messaging</h3>
5598 <table>
5599 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5600 <td>PPAPI Method </td>
5601 <td>State </td>
5602 <td>Assumes Threads </td>
5603 <td>Emscripten </td>
5604 <td>Web API </td>
5605 <td>Limitations </td>
5606 </tr>
5607
5608 <tr>
5609 <td>HandleMessage </td>
5610 <td>M14 </td>
5611 <td> </td>
5612 <td>embind </td>
5613 <td>MessagePort 'message' Event
5614 Window 'message' Event </td>
5615 <td> </td>
5616 </tr>
5617
5618 </table>
5619 <h3>PPP_MouseLock</h3>
5620 <table>
5621 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5622 <td>PPAPI Method </td>
5623 <td>State </td>
5624 <td>Assumes Threads </td>
5625 <td>Emscripten </td>
5626 <td>Web API </td>
5627 <td>Limitations </td>
5628 </tr>
5629
5630 <tr>
5631 <td>MouseLockLost </td>
5632 <td>M14 </td>
5633 <td> </td>
5634 <td>SDL </td>
5635 <td>Element 'pointerlockchange', 'pointerlockerror' Events </td>
5636 <td> </td>
5637 </tr>
5638
5639 </table>
5640 <h2 id="ppapi-apps">PPAPI (Apps)</h2>
5641 <table>
5642 </table>
5643 <h3>PPB_HostResolver</h3>
5644 <table>
5645 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5646 <td>PPAPI Method </td>
5647 <td>State </td>
5648 <td>Assumes Threads </td>
5649 <td>Emscripten </td>
5650 <td>Web API </td>
5651 <td>Limitations </td>
5652 </tr>
5653
5654 <tr>
5655 <td>Create </td>
5656 <td>M29 </td>
5657 <td>x </td>
5658 <td bgcolor="#ffcccc">GAP</td>
5659 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5660 <td> </td>
5661 </tr>
5662
5663 <tr>
5664 <td>Resolve </td>
5665 <td>M29 </td>
5666 <td>x </td>
5667 <td bgcolor="#ffcccc">GAP</td>
5668 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5669 <td> </td>
5670 </tr>
5671
5672 <tr>
5673 <td>GetCanonicalName </td>
5674 <td>M29 </td>
5675 <td>x </td>
5676 <td bgcolor="#ffcccc">GAP</td>
5677 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5678 <td> </td>
5679 </tr>
5680
5681 <tr>
5682 <td>GetNetAddressCount </td>
5683 <td>M29 </td>
5684 <td>x </td>
5685 <td bgcolor="#ffcccc">GAP</td>
5686 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5687 <td> </td>
5688 </tr>
5689
5690 <tr>
5691 <td>GetNetAddress </td>
5692 <td>M29 </td>
5693 <td>x </td>
5694 <td bgcolor="#ffcccc">GAP</td>
5695 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5696 <td> </td>
5697 </tr>
5698
5699 </table>
5700 <h3>PPB_NetAddress</h3>
5701 <table>
5702 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5703 <td>PPAPI Method </td>
5704 <td>State </td>
5705 <td>Assumes Threads </td>
5706 <td>Emscripten </td>
5707 <td>Web API </td>
5708 <td>Limitations </td>
5709 </tr>
5710
5711 <tr>
5712 <td>CreateFromIPv4Address </td>
5713 <td>M29 </td>
5714 <td>x </td>
5715 <td bgcolor="#ffcccc">GAP</td>
5716 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5717 <td> </td>
5718 </tr>
5719
5720 <tr>
5721 <td>CreateFromIPv6Address </td>
5722 <td>M29 </td>
5723 <td>x </td>
5724 <td bgcolor="#ffcccc">GAP</td>
5725 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5726 <td> </td>
5727 </tr>
5728
5729 <tr>
5730 <td>GetFamily </td>
5731 <td>M29 </td>
5732 <td>x </td>
5733 <td bgcolor="#ffcccc">GAP</td>
5734 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5735 <td> </td>
5736 </tr>
5737
5738 <tr>
5739 <td>DescribeAsString </td>
5740 <td>M29 </td>
5741 <td>x </td>
5742 <td bgcolor="#ffcccc">GAP</td>
5743 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5744 <td> </td>
5745 </tr>
5746
5747 <tr>
5748 <td>DescribeAsIPv4Address </td>
5749 <td>M29 </td>
5750 <td>x </td>
5751 <td bgcolor="#ffcccc">GAP</td>
5752 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5753 <td> </td>
5754 </tr>
5755
5756 <tr>
5757 <td>DescribeAsIPv6Address </td>
5758 <td>M29 </td>
5759 <td>x </td>
5760 <td bgcolor="#ffcccc">GAP</td>
5761 <td bgcolor="#ffeecc">GAP (partial) - No direct equivalent</td>
5762 <td> </td>
5763 </tr>
5764
5765 </table>
5766 <h3>PPB_NetworkList</h3>
5767 <table>
5768 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5769 <td>PPAPI Method </td>
5770 <td>State </td>
5771 <td>Assumes Threads </td>
5772 <td>Emscripten </td>
5773 <td>Web API </td>
5774 <td>Limitations </td>
5775 </tr>
5776
5777 <tr>
5778 <td>GetCount </td>
5779 <td>M31 </td>
5780 <td>x </td>
5781 <td bgcolor="#ffcccc">GAP</td>
5782 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5783 <td> </td>
5784 </tr>
5785
5786 <tr>
5787 <td>GetName </td>
5788 <td>M31 </td>
5789 <td>x </td>
5790 <td bgcolor="#ffcccc">GAP</td>
5791 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5792 <td> </td>
5793 </tr>
5794
5795 <tr>
5796 <td>GetType </td>
5797 <td>M31 </td>
5798 <td>x </td>
5799 <td bgcolor="#ffcccc">GAP</td>
5800 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5801 <td> </td>
5802 </tr>
5803
5804 <tr>
5805 <td>GetState </td>
5806 <td>M31 </td>
5807 <td>x </td>
5808 <td bgcolor="#ffcccc">GAP</td>
5809 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5810 <td> </td>
5811 </tr>
5812
5813 <tr>
5814 <td>GetIpAddress </td>
5815 <td>M31 </td>
5816 <td>x </td>
5817 <td bgcolor="#ffcccc">GAP</td>
5818 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5819 <td> </td>
5820 </tr>
5821
5822 <tr>
5823 <td>GetDisplayName </td>
5824 <td>M31 </td>
5825 <td>x </td>
5826 <td bgcolor="#ffcccc">GAP</td>
5827 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5828 <td> </td>
5829 </tr>
5830
5831 <tr>
5832 <td>GetMTU </td>
5833 <td>M31 </td>
5834 <td>x </td>
5835 <td bgcolor="#ffcccc">GAP</td>
5836 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5837 <td> </td>
5838 </tr>
5839
5840 </table>
5841 <h3>PPB_NetworkMonitor</h3>
5842 <table>
5843 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5844 <td>PPAPI Method </td>
5845 <td>State </td>
5846 <td>Assumes Threads </td>
5847 <td>Emscripten </td>
5848 <td>Web API </td>
5849 <td>Limitations </td>
5850 </tr>
5851
5852 <tr>
5853 <td>Create </td>
5854 <td>M31 </td>
5855 <td>x </td>
5856 <td bgcolor="#ffcccc">GAP</td>
5857 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5858 <td> </td>
5859 </tr>
5860
5861 <tr>
5862 <td>UpdateNetworkList </td>
5863 <td>M31 </td>
5864 <td>x </td>
5865 <td bgcolor="#ffcccc">GAP</td>
5866 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5867 <td> </td>
5868 </tr>
5869
5870 </table>
5871 <h3>PPB_NetworkProxy</h3>
5872 <table>
5873 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5874 <td>PPAPI Method </td>
5875 <td>State </td>
5876 <td>Assumes Threads </td>
5877 <td>Emscripten </td>
5878 <td>Web API </td>
5879 <td>Limitations </td>
5880 </tr>
5881
5882 <tr>
5883 <td>GetProxyForURL </td>
5884 <td>M29 </td>
5885 <td>x </td>
5886 <td bgcolor="#ffcccc">GAP</td>
5887 <td bgcolor="#ffcccc">GAP - No direct equivalent</td>
5888 <td> </td>
5889 </tr>
5890
5891 </table>
5892 <h3>PPB_TCPSocket</h3>
5893 <table>
5894 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
5895 <td>PPAPI Method </td>
5896 <td>State </td>
5897 <td>Assumes Threads </td>
5898 <td>Emscripten </td>
5899 <td>Web API </td>
5900 <td>Limitations </td>
5901 </tr>
5902
5903 <tr>
5904 <td>Create </td>
5905 <td>M29 </td>
5906 <td>x </td>
5907 <td bgcolor="#ffcccc">GAP</td>
5908 <td>chrome.sockets.tcp.create </td>
5909 <td>WebSockets / WebRTC closest practical equivalent on open Web. </td>
5910 </tr>
5911
5912 <tr>
5913 <td> </td>
5914 <td> </td>
5915 <td>x </td>
5916 <td bgcolor="#ffcccc">GAP</td>
5917 <td>chrome.sockets.tcpServer.create </td>
5918 <td> </td>
5919 </tr>
5920
5921 <tr>
5922 <td>Bind </td>
5923 <td>M29/M31 </td>
5924 <td>x </td>
5925 <td bgcolor="#ffcccc">GAP</td>
5926 <td>chrome.sockets.tcpServer.create </td>
5927 <td> </td>
5928 </tr>
5929
5930 <tr>
5931 <td>Connect </td>
5932 <td>M29/M31 </td>
5933 <td>x </td>
5934 <td bgcolor="#ffcccc">GAP</td>
5935 <td>chrome.sockets.tcp.connect </td>
5936 <td> </td>
5937 </tr>
5938
5939 <tr>
5940 <td>GetLocalAddress </td>
5941 <td>M29 </td>
5942 <td>x </td>
5943 <td bgcolor="#ffcccc">GAP</td>
5944 <td>chrome.sockets.udp.SocketInfo </td>
5945 <td> </td>
5946 </tr>
5947
5948 <tr>
5949 <td>GetRemoteAddress </td>
5950 <td>M29 </td>
5951 <td>x </td>
5952 <td bgcolor="#ffcccc">GAP</td>
5953 <td>chrome.sockets.udp.SocketInfo </td>
5954 <td> </td>
5955 </tr>
5956
5957 <tr>
5958 <td>Read </td>
5959 <td>M29 </td>
5960 <td>x </td>
5961 <td bgcolor="#ffcccc">GAP</td>
5962 <td>onReceive* Events </td>
5963 <td> </td>
5964 </tr>
5965
5966 <tr>
5967 <td>Write </td>
5968 <td>M29 </td>
5969 <td>x </td>
5970 <td bgcolor="#ffcccc">GAP</td>
5971 <td>chrome.sockets.tcp.send </td>
5972 <td> </td>
5973 </tr>
5974
5975 <tr>
5976 <td>Listen </td>
5977 <td>M29/M31 </td>
5978 <td>x </td>
5979 <td bgcolor="#ffcccc">GAP</td>
5980 <td>chrome.sockets.tcpServer.listen </td>
5981 <td> </td>
5982 </tr>
5983
5984 <tr>
5985 <td>Accept </td>
5986 <td>M29/M31 </td>
5987 <td>x </td>
5988 <td bgcolor="#ffcccc">GAP</td>
5989 <td>onAccept* Events </td>
5990 <td> </td>
5991 </tr>
5992
5993 <tr>
5994 <td>Close </td>
5995 <td>M29 </td>
5996 <td>x </td>
5997 <td bgcolor="#ffcccc">GAP</td>
5998 <td>chrome.sockets.tcp.close </td>
5999 <td> </td>
6000 </tr>
6001
6002 <tr>
6003 <td> </td>
6004 <td> </td>
6005 <td>x </td>
6006 <td bgcolor="#ffcccc">GAP</td>
6007 <td>chrome.sockets.tcpServer.close </td>
6008 <td> </td>
6009 </tr>
6010
6011 <tr>
6012 <td>SetOption </td>
6013 <td>M41 </td>
6014 <td>x </td>
6015 <td bgcolor="#ffcccc">GAP</td>
6016 <td>chrome.sockets.tcp.update </td>
6017 <td> </td>
6018 </tr>
6019
6020 <tr>
6021 <td> </td>
6022 <td> </td>
6023 <td>x </td>
6024 <td bgcolor="#ffcccc">GAP</td>
6025 <td>chrome.sockets.tcpServer.update </td>
6026 <td> </td>
6027 </tr>
6028
6029 </table>
6030 <h3>PPB_UDPSocket</h3>
6031 <table>
6032 <tr bgcolor="#77ccff" style="color:white; text-decoration: underline">
6033 <td>PPAPI Method </td>
6034 <td>State </td>
6035 <td>Assumes Threads </td>
6036 <td>Emscripten </td>
6037 <td>Web API </td>
6038 <td>Limitations </td>
6039 </tr>
6040
6041 <tr>
6042 <td>Create </td>
6043 <td>M29 </td>
6044 <td>x </td>
6045 <td bgcolor="#ffcccc">GAP</td>
6046 <td>chrome.sockets.udp.create </td>
6047 <td bgcolor="#ffeecc">GAP (partial) - WebRTC closest practical open Web equi valent</td>
6048 </tr>
6049
6050 <tr>
6051 <td>Bind </td>
6052 <td>M29 </td>
6053 <td>x </td>
6054 <td bgcolor="#ffcccc">GAP</td>
6055 <td>chrome.sockets.udp.bind </td>
6056 <td> </td>
6057 </tr>
6058
6059 <tr>
6060 <td>GetBoundAddress </td>
6061 <td>M29 </td>
6062 <td>x </td>
6063 <td bgcolor="#ffcccc">GAP</td>
6064 <td>chrome.sockets.udp.SocketInfo </td>
6065 <td> </td>
6066 </tr>
6067
6068 <tr>
6069 <td>RecvFrom </td>
6070 <td>M29 </td>
6071 <td>x </td>
6072 <td bgcolor="#ffcccc">GAP</td>
6073 <td>onReceive* Events </td>
6074 <td> </td>
6075 </tr>
6076
6077 <tr>
6078 <td>SendTo </td>
6079 <td>M29 </td>
6080 <td>x </td>
6081 <td bgcolor="#ffcccc">GAP</td>
6082 <td>chrome.sockets.udp.send </td>
6083 <td> </td>
6084 </tr>
6085
6086 <tr>
6087 <td>Close </td>
6088 <td>M29 </td>
6089 <td>x </td>
6090 <td bgcolor="#ffcccc">GAP</td>
6091 <td>chrome.sockets.udp.close </td>
6092 <td> </td>
6093 </tr>
6094
6095 <tr>
6096 <td>SetOption </td>
6097 <td>M41/M43 </td>
6098 <td>x </td>
6099 <td bgcolor="#ffcccc">GAP</td>
6100 <td>chrome.sockets.udp.update </td>
6101 <td> </td>
6102 </tr>
6103
6104 <tr>
6105 <td>JoinGroup </td>
6106 <td>M43 </td>
6107 <td>x </td>
6108 <td bgcolor="#ffcccc">GAP</td>
6109 <td>chrome.sockets.udp.joinGroup </td>
6110 <td> </td>
6111 </tr>
6112
6113 <tr>
6114 <td>LeaveGroup </td>
6115 <td>M43 </td>
6116 <td>x </td>
6117 <td bgcolor="#ffcccc">GAP</td>
6118 <td>chrome.sockets.udp.leaveGroup </td>
6119 <td> </td>
6120 </tr>
6121
6122 </table>
6123 </section>
6124
6125 {{/partials.standard_nacl_article}}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698