Panduan Migrasi WebAssembly

Pengumuman Penghentian (P)NaCl

Mengingat momentum dukungan WebAssembly lintas browser, kami berencana untuk upaya kode native di WebAssembly ke depannya dan berencana menghapus dukungan untuk PNaCl pada K4 2019 (kecuali untuk Aplikasi Chrome). Kami percaya bahwa lingkungan ekosistem di sekitar WebAssembly membuatnya lebih cocok untuk aset berperforma tinggi baru dan lama aplikasi web dan bahwa penggunaan PNaCl cukup rendah sehingga diperlukan penghentian penggunaan.

Mulai Chrome 76, PNaCl di web terbuka telah dipindahkan ke dalam Uji Coba Origin, yang merupakan mekanisme bagi developer web untuk mendaftar dan mendapatkan akses ke fitur yang tidak diaktifkan secara default. Fitur ini biasanya adalah fitur baru yang diusulkan, tetapi dalam kasus ini, fitur tersebut tidak digunakan lagi. Developer dapat mendaftar di Konsol Uji Coba Origin dan menerima token, yang dapat disematkan ke halaman dan akan mengaktifkan fitur tanpa perlu menggunakan flag. (Untuk detail selengkapnya, lihat panduan tertaut). Uji coba ini dijadwalkan akan berlangsung hingga Chrome 78, kira-kira hingga Desember 2019. Perubahan ini tidak dimaksudkan untuk memengaruhi NaCl atau PNaCl di ekstensi atau Aplikasi Chrome, dan “enable-nacl” tanda di chrome://flags juga dapat digunakan untuk mengaktifkan PNaCl secara lokal untuk pengujian (tanda ini juga mempertahankan fungsinya saat ini untuk mengaktifkan NaCl “asli” non-PNaCl di halaman mana pun).

Kami juga baru-baru ini mengumumkan penghentian Aplikasi Chrome di luar ChromeOS pada Kuartal 1 2018.

Migrasi Toolchain

Untuk sebagian besar kasus penggunaan (P)NaCl, sebaiknya bertransisi dari NaCl SDK ke Emscripten. Migrasi cenderung cukup mudah jika aplikasi Anda portabel untuk Linux, menggunakan SDL, atau POSIX API. Meskipun dukungan langsung untuk NaCl/Pepper API tidak tersedia, kami telah mencoba mencantumkan Web API yang setara. Untuk kasus transfer yang lebih sulit, silakan hubungi native-client-discuss@googlegroups.com

Migrasi API

Di sini, kami telah menguraikan status pengganti Platform Web untuk masing-masing dari API yang diekspos ke (P)NaCl. Selain itu, tabel akan mencantumkan library atau opsi di Emscripten yang menawarkan pengganti terdekat.

Kami berharap dapat menambahkan dukungan thread memori bersama ke WebAssembly pada tahun 2017, karena thread sangat penting untuk mencocokkan kasus penggunaan (P)NaCl yang paling menarik. Item migrasi yang mengasumsikan dukungan thread mendatang ditandai di bawah. Jika kontrol alur aplikasi Anda sangat bergantung pada pemblokiran API, Anda mungkin juga menemukan bahwa dukungan thread diperlukan untuk porting yang mudah.

Meskipun kami telah mencoba untuk akurat dalam tabel ini, mungkin ada kesalahan atau kelalaian. Jika Anda mengalaminya, hubungi kami di native-client-discuss@googlegroups.com

PPAPI

PPB_Audio

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat x SDL (sebagian) GAP (sebagian) - AudioWorkletNode setara dengan ROUGH AudioWorkletSpec sudah selesai, tetapi AudioDeviceClient mungkin lebih cocok untuk API ini. AudioDeviceClient masih ditentukan oleh komunitas. Worklet mungkin bukan setara kasar untuk API ini.
GetCurrentConfig SDL Konteks Audio.* (mendapatkan kembali setelan yang diteruskan)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetTimestamp SDL AudioBufferSourceNode.start (parameter) Dilewati setiap kali, bukan dilampirkan ke buffering.
SetTimestamp SDL AudioBufferSourceNode.start (parameter)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP - WebAudio hanya menggunakan float 32-bit, PPAPI melakukan int 16-bit. PPAPI secara teori mendukung beberapa ukuran pengambilan sampel. Dalam praktiknya, ini hanya mendukung sampel 16-bit. Sayangnya, developer telah meminta ukuran sampel 16-bit untuk menghemat penggunaan memori. Versi berikutnya dari spesifikasi Audio Web akan menerapkan dukungan untuk sampel 16-bit. Pengoptimalan AudioBuffer dapat diterapkan seperti pada Firefox, dengan menggunakan buffer 16-bit untuk audio yang berasal dari decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
CreateStereo16Bit GAP GAP - Hanya sampel float 32-bit yang didukung Versi berikutnya dari spesifikasi Audio Web akan menerapkan dukungan untuk sampel 16-bit.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (dari konstruksi default) AudioContext akan memiliki frekuensi sampling pilihan yang cocok dengan frekuensi sampel sebenarnya dari perangkat audio hardware secara default.
RecommendSampleFrameCount GAP GAP - Akan ditangani dengan AudioDeviceClient yang direncanakan Ada masalah terbuka untuk mengizinkan ukuran yang ditentukan pengguna, tetapi hal itu masih dalam proses penentuan. Hal ini mungkin sebaiknya ditangani dengan AudioDeviceClient yang dapat memberi tahu Anda ukuran yang sesuai untuk hardware tertentu.

PPB_Console

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Log Utime console.log/warn/error/...
LogWithSource GAP GAP Console API dianggap sebagai pengganti yang cukup lengkap, kecuali jika ada kasus penggunaan tertentu yang diajukan oleh developer untuk fungsi yang disediakan oleh LogWithSource. Source Maps DevTools dapat digunakan untuk men-debug JavaScript yang ditranspil dalam bahasa sumber aslinya.

PPB_Core

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
getTime utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== undefined
CallOnMainThread GAP Worker.postMessage + Atomics.wait Sinkronisasi yang setara dapat dibuat.

PPB_FileIO

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat FS (sebagian) window.chooseFileSystemEntries() Buat dan buka digunakan secara berbeda, tetapi bagian-bagiannya memiliki kekuatan yang sama.
Buka FS (sebagian) window.chooseFileSystemEntries()
Kueri FS (sebagian) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (sebagian) - Blob.type juga dapat digunakan untuk memeriksa jenis MIME. Jenis sistem file, waktu pembuatan, dan waktu akses terakhir tidak dapat ditentukan dengan Native File System API.
Sentuh FS (sebagian) FileSystemDirectoryHandle.getFile("name", {create: true})
Baca FS (sebagian) Blob.slice().arrayBuffer()
Tulis FS (sebagian) FileSystemWriter.write()
SetLength FS (sebagian) FileSystemWriter.truncate()
Flush GAP (sebagian) GAP (sebagian) - File dibersihkan saat FileSystemWrite.close() dipanggil Hal ini disengaja karena file Native File System API diekspos ke OS, sehingga pemeriksaan Safe Browsing perlu dilakukan sebelum data ditampilkan ke OS.
Tutup FS (sebagian) FileSystemWriter.close() Tidak membatalkan operasi yang tertunda, tetapi menghapus data apa pun yang ditulis sejauh ini ke disk.
ReadToArray GAP Blob.slice().arrayBuffer() atau Blob.arrayBuffer() Memungkinkan beberapa operasi baca subrentang secara paralel.

PPB_FileRef

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat FS (sebagian) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (sebagian) FileSystem.type
GetName FS (sebagian) File.name
GetPath FS (sebagian) GAP (sebagian) - Dengan Native File System API, jalur relatif file dapat ditentukan dari referensi ke direktori yang berisi file menggunakan FileSystemHandle.resolve(FileSystemHandle) Jalur absolut file tidak dapat ditentukan, dan pengguna harus memberikan izin untuk mengakses direktori yang berisi file tersebut.
GetParent FS (sebagian) GAP (sebagian) - Dengan Native File System API, jalur relatif file dapat ditentukan dari referensi ke direktori yang berisi file menggunakan FileSystemHandle.resolve(FileSystemHandle) Pengguna harus memberikan izin untuk mengakses direktori yang berisi file.
MakeDirectory FS (sebagian) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Sentuh FS (sebagian) FileSystemDirectoryHandle.getFile("name", {create: true}) Waktu modifikasi dapat diubah dengan menulis.
Hapus FS (sebagian) FileSystemDirectoryHandle.removeEntry() Tidak seperti PPAPI, direktori tidak harus kosong.
Ganti nama FS (sebagian) GAP (sebagian) - Dengan Native File System API, file dapat ditulis dengan nama baru menggunakan kombinasi FileSystemFileHandle.getFile() untuk nama baru dan FileSystemFileHandle.createWriter().write() dengan konten file lama. Kemudian, FileSystemDirectoryHandle.removeEntry() untuk menghapus file lama. Tidak ada API langsung yang akan melakukan ini dalam satu langkah di Native File System API.
Kueri GAP (sebagian) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (sebagian) - Blob.type juga dapat digunakan untuk memeriksa jenis MIME. Jenis sistem file, waktu pembuatan, dan waktu akses terakhir tidak dapat ditentukan dengan Native File System API.
ReadDirectoryEntries FS (sebagian) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat FS (sebagian) window.requestFileSystem JS API melakukan keduanya dalam satu langkah
Buka GAP window.requestFileSystem JS API melakukan keduanya dalam satu langkah
GetType GAP FileSystem.type

PPB_Fullscreen

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Contoh SDL Gamepad.* Objek Gamepad mengekspos stempel waktu yang terkait dengan navigationStart. Update ini diperbarui ketika data diterima dari hardware https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL Canvas.getContext('2d')
Deskripsikan SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Scroll GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (sebagian) - Dapat diterapkan dengan menggambar kanvas ke kanvas itu sendiri, dengan offset, menggunakan drawImage, lalu mengisi bagian lainnya.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Flush GAP Tidak ada padanan langsung GAP (sebagian) - Selalu ada flush implisit di akhir kode gambar; hal ini tidak mungkin berubah. Namun, kombinasi OffscreenCanvas dan ImageBitmapRenderingContext memberikan fungsi yang serupa.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (sebagian) - Eksposur OpenGL ES 3.0 dari WebGL 2.0 dan Emscripten mendukung framebuffer multisampel multisampel yang ditentukan pengguna, tempat semua parameter yang dapat dikonfigurasi melalui PPAPI dapat ditetapkan.
Buat SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPSI)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP Tidak ada padanan langsung GAP (sebagian) - Selalu ada flush implisit di akhir kode gambar; tidak mungkin berubah. Namun, kombinasi OffscreenCanvas dan ImageBitmapRenderingContext memberikan fungsi yang serupa.

PPB_ImageData

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetNativeImageDataFormat SDL ImageData mewajibkan urutan RGBA
IsImageDataFormatSupported SDL ImageData mewajibkan urutan RGBA
Buat SDL CanvasRenderingContext2d.createImageData
Menjelaskan SDL ImageData tidak pernah memiliki langkah
Peta SDL ImageData.data
Batalkan peta SDL ImageData.data

PPB_InputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
RequestInputEvents SDL Tidak ada padanan langsung Ketiadaan fitur ini mungkin kurang relevan karena JS/Wasm berjalan di thread utama dan dapat memfilter peristiwa dengan lebih murah tanpa menimbulkan perjalanan bolak-balik lintas proses.
RequestFilteringInputEvents SDL mouse* tombol* roda* sentuh* komposisi* Peristiwa
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Turunan class peristiwa
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL Peristiwa 'dblclick' vs. 'mousedown'
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode berisi info ini, tetapi tidak lengkap. Ada diskusi tentang penerapan WheelEvent.deltaMode API: https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP - deltaMode berisi info ini, tetapi tidak lengkap. Ada diskusi tentang penerapan WheelEvent.deltaMode API: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (untuk mengetahuinya sendiri)

PPB_IMEInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Tidak ada padanan langsung Data ini berpotensi diambil dari CompositionEvent.data.
GetSegmentOffset GAP GAP - Tidak ada padanan langsung
GetTargetSegment GAP GAP - Tidak ada padanan langsung
GetSelection GAP GAP - Tidak ada padanan langsung

PPB_Instance

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
BindGraphics SDL Canvas.getContext (tidak relevan karena binding bersifat otomatis).
IsFullFrame GAP GAP - Tidak setara dengan pengendali jenis mime. Aplikasi NaCl dapat didaftarkan untuk menangani jenis mime tertentu dan memiliki seluruh dokumen.
DidCreate T/A <Element>[key] Akses DOM umum memungkinkan Anda mencari atribut tag
DidDestroy T/A T/A Tidak dipicu untuk NaCl
DidChangeView T/A Peristiwa 'resize' Elemen
DidChangeFocus T/A Elemen 'fokus', 'fokus', 'fokus' Acara
HandleDocumentLoad T/A GAP - Tidak ada cara untuk mendaftar sebagai pengendali jenis mime Modul NaCl melalui aplikasi + entri manifes dapat disiapkan untuk menangani jenis mime tertentu.

PPB_MediaStreamAudioTrack

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Konfigurasi GAP getUserMedia() Batasan dari getUserMedia() dapat memberikan nilai konfigurasi yang akan digunakan di MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP - Tidak ada padanan
RecycleBuffer GAP GAP - Tidak ada padanan
Tutup GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP Canvas Capture Canvas Capture menyediakan kemampuan untuk memperkenalkan frame video secara terprogram.
Konfigurasi GAP applyConstraints(), getUserMedia() GAP (sebagian) - Cakupan konfigurasi yang tersedia di Web API mungkin berbeda dengan PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP - tidak setara dengan PP_MEDIASTREAMVIDEOTracking_ATTRIB_BUFFERED_FRAMES MediaStream tidak dapat dimuat sebelumnya, sehingga tidak akan pernah di-buffer: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP - tidak setara dengan PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP - Tidak ada padanan
RecycleFrame GAP GAP - Tidak ada padanan
Tutup GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP - Tidak ada padanan
PutFrame GAP GAP - Tidak ada padanan

PPB_MessageLoop

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
GetForMainThread T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
GetCurrent T/A Sebagian besar tidak relevan, pekerja mendapatkan loop peristiwa implisit.
AttachToCurrentThread T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
Jalankan T/A Sebagian besar tidak relevan, pekerja mendapatkan loop peristiwa implisit.
PostWork T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
PostQuit T/A Sebagian besar tidak relevan, pekerja mendapatkan loop peristiwa implisit.

PPB_Messaging

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
PostMessage T/A Window.postMessage
RegisterMessageHandler T/A Window.addEventListener
UnregisterMessageHandler T/A Window.removeEventListener

PPB_MouseCursor

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
SetCursor SDL Element.style.cursor Kumpulan kursor stok yang sama didukung. Kursor kustom dapat dilakukan dengan URL(..). Kursor kustom dinamis dapat dilakukan dengan URI data. CSS3 mendukung penentuan hotspot.

PPB_MouseLock

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Beberapa Metode OpenGLES Fungsinya hampir sama dengan WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
SetTextInputType GAP GAP - Berpotensi diisi oleh Input Method Editor API Beberapa developer ingin dapat memberikan petunjuk dengan cara ini, atau sebaiknya kemampuan untuk mencegat dan menampilkan peristiwa / output IME secara inline di dalam kanvas.
UpdateCaretPosition GAP GAP - Berpotensi diisi oleh Input Method Editor API https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP - Berpotensi diisi oleh Input Method Editor API https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP - Berpotensi diisi oleh Input Method Editor API https://www.w3.org/TR/ime-api/

PPB_URLLoader

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind new XMLHttpRequest();
Buka embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP - Tidak ada padanan XMLHTTPRequest
GetUploadProgress embind Peristiwa 'progres' XMLHttpRequest
GAP FetchObserver Belum ditentukan spesifikasinya atau belum diterapkan; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind Peristiwa 'progres' XMLHttpRequest
GAP FetchObserver Belum ditentukan spesifikasinya atau belum diterapkan; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Ambil Respons.*
ReadResponseBody embind XMLHttpRequest.response
embind Isi.* (Respons adalah Isi)
FinishStreamingToFile embind GAP - Tidak ada padanan langsung XMLHttpRequest dan Fetch mengasumsikan streaming ke memori, bukan langsung ke penyimpanan.
Tutup embind XMLHttpRequest.abort
GAP Fetch API: AbortSignal dan AbortController

PPB_URLRequestInfo

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind XMLHttpRequest
embind Permintaan Pengambilan
SetProperty GAP GAP - Tidak ada padanan langsung untuk XMLHttpRequest XMLHttpRequest tidak menyediakan cara langsung untuk batas per permintaan pengalihan berikut, mengalirkan ke file, menetapkan kebijakan perujuk atau kredensial.
embind Permintaan.*
AppendDataToBody embind XMLHttpRequest.send GAP - Keduanya harus memiliki keseluruhan tubuh, bukan sepotong.
embind fetch(.., options:body)
AppendFileToBody GAP Streaming upload fetch() https://www.chromestatus.com/features/5274139738767360
T/A <form> Anda juga dapat membaca dengan FileReader dan mengupload, tetapi lebih mirip dengan AppendDataToBody

PPB_URLResponseInfo

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetProperty embind XMLHttpRequest.getAllResponseHeaders + lainnya
embind Ambil Respons.*
GetBodyAsFileRef embind Respons Pengambilan (Isi) .blob() Mengasumsikan lapisan penyimpanan mengoptimalkan transfer.

PPB_Var

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource T/A T/A
VarToResource T/A T/A

PPB_VarArray

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Dapatkan embind Array[i]
Setel embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind ArrayBuffer(n) baru
ByteLength embind ArrayBuffer.byteLength
Peta GAP GAP - Tidak ada padanan langsung Modul Asm.js/Wasm tidak dapat memetakan region ArrayBuffer selain heap memori linear tunggalnya. Beberapa memori atau pemetaan memori di masa mendatang mungkin dapat meningkatkan kualitas ini.
Batalkan peta GAP GAP - Tidak ada padanan langsung

PPB_VarDictionary

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind {}
Dapatkan embind &lt;Object&gt;[i]
Setel embind <Objek>[i] = x
Hapus embind hapus <Object>[i]
HasKey embind x di <Object>
GetKeys embind for (k in <Object>) {} Tidak ada padanan literal, tetapi dapat dibuat.

PPB_VideoDecoder

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Lakukan inisialisasi GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan parameter inisialisasi VideoDecoder() (VideoDecoderInitParameters) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipe Through(VideoDecoder) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
GetPicture GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
RecyclePicture GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. Desain saat ini akan otomatis mendaur ulang gambar dan melanjutkan proses decoding. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Flush GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. API tersebut akan disebut Flush(), tetapi masih ada diskusi tentang cara pengurutannya sehubungan dengan panggilan dekode. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Reset GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan dengan menghancurkan instance VideoDecoder dan membuat instance baru. Ini tidak akan seefisien metode reset khusus, tetapi semantik untuk Reset() API masih dibahas. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan VideoEncoder()
GetSupportedProfiles GAP GAP (sebagian) - navigator.mediaCapabilities.encodingInfo() Profil yang didukung harus diperiksa satu per satu.
Lakukan inisialisasi GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan parameter inisialisasi VideoEncoder()
GetFramesRequired GAP GAP - Tidak ada padanan Kumpulan frame yang digunakan secara internal oleh Web Codecs API kemungkinan tidak terekspos.
GetFrameCodedSize GAP GAP - Tidak ada padanan Kemungkinan besar kumpulan frame yang digunakan secara internal oleh Web Codecs API tidak akan diekspos.
GetVideoFrame GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipe Through(VideoEncoder). Tindakan ini akan langsung mengenkode data dalam aliran Readable, bukan mengambil satu frame untuk diisi dengan data sebelum encoding.
Encoding GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipeThrough(VideoEncoder)
GetBitstreamBuffer GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. Desain saat ini akan otomatis melewati buffer bitstream yang dienkode yang disalurkan. WebCodecs API saat ini mengasumsikan bahwa buffering bitstream dapat disalin, bukan digabungkan, sehingga tidak perlu didaur ulang.
RecycleBitstreamBuffer GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. Desain saat ini akan otomatis mendaur ulang buffering untuk melanjutkan proses encoding. Hal ini tidak mungkin berubah di masa mendatang karena implikasi performa lebih kecil.
RequestEncodingParametersChange GAP GAP - Akan ditangani oleh Web Codecs API yang diusulkan. Beberapa parameter tertentu dapat diubah dengan cepat, sedangkan parameter lainnya akan memerlukan encoder untuk dihapus.
Tutup GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan VideoEncoder.Close()

PPB_VideoFrame

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetTimestamp GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
SetTimestamp GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetFormat GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetSize GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetDataBuffer GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetDataBufferSize GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.

PPB_View

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Berkaitan dengan dokumen, bukan hanya satu elemen.
IsVisible embind IntersectionObserver
IsPageVisible embind document.visibilityState
GetClipRect embind IntersectionObserver
GetDeviceScale embind window.devicePixelRatio
GetCSSScale embind <Element>.getBoundingClientRect().width / <Element>.offsetWidth
GetScrollOffset embind <Element>.scrollTop/<Element>.scrollLeft

PPB_WebSocket

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP WebSocket.WebSocket
Connect GAP WebSocket.WebSocket(url, ...) Peristiwa 'buka' WebSocket
Tutup GAP WebSocket.close
ReceiveMessage GAP 'Pesan' WebSocket Acara 'Error' WebSocket Acara 'close' WebSocket Acara
SendMessage GAP WebSocket.send
GetBufferedAmount GAP WebSocket.bufferedAmount
GetCloseCode GAP CloseEvent.code
GetCloseReason GAP CloseEvent.reason
GetCloseWasClean GAP CloseEvent.wasClean
GetExtensions GAP WebSocket.extensions
GetProtocol GAP WebSocket.protocol
GetReadyState GAP WebSocket.readyState
GetURL GAP WebSocket.url

PPP_Graphics3D

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Graphics3DContextHilang SDL Peristiwa 'webglcontextlost' Kanvas

PPP_InputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
DidCreate T/A &lt;Element&gt;[key] Akses DOM umum memungkinkan Anda mencari atribut tag
DidDestroy T/A T/A Tidak dipicu untuk NaCl
DidChangeView T/A Peristiwa 'resize' Elemen
DidChangeFocus T/A Elemen 'fokus', 'fokus', 'fokus' Acara
HandleDocumentLoad T/A GAP - Tidak ada cara untuk mendaftar sebagai pengendali jenis mime Modul NaCl melalui aplikasi + entri manifes dapat disiapkan untuk menangani jenis mime tertentu.

PPP_MessageHandler

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
HandleMessage embind 'Message' MessagePort Acara 'Pesan' jendela Acara
HandleBlockingMessage T/A GAP - Tidak ada padanan langsung Sinkronisasi serupa dapat dilakukan di luar thread utama dengan Atomics.wait. Class ini ditambahkan untuk mendukung emulasi API plugin sinkron.

PPP_Messaging

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
HandleMessage embind Peristiwa 'message' MessagePort Peristiwa 'message' Jendela

PPP_MouseLock

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
MouseLockLost SDL Elemen 'pointerlockchange', 'pointerlockerror' Acara

IRT

PPB_Audio

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat x SDL (sebagian) GAP (sebagian) - AudioWorkletNode setara dengan ROUGH AudioWorkletSpec sudah selesai, tetapi AudioDeviceClient mungkin lebih cocok untuk API ini. AudioDeviceClient masih ditentukan oleh komunitas. Worklet mungkin bukan setara kasar untuk API ini.
GetCurrentConfig SDL Konteks Audio.* (mendapatkan kembali setelan yang diteruskan)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetTimestamp SDL AudioBufferSourceNode.start (parameter) Dilewati setiap kali, bukan dilampirkan ke buffering.
SetTimestamp SDL AudioBufferSourceNode.start (parameter)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP - WebAudio hanya menggunakan float 32-bit, PPAPI melakukan int 16-bit. PPAPI secara teori mendukung beberapa ukuran pengambilan sampel. Dalam praktiknya, ini hanya mendukung sampel 16-bit. Sayangnya, developer telah meminta ukuran sampel 16-bit untuk menghemat penggunaan memori. Versi berikutnya dari spesifikasi Audio Web akan menerapkan dukungan untuk sampel 16-bit. Pengoptimalan AudioBuffer dapat diterapkan seperti pada Firefox, dengan menggunakan buffer 16-bit untuk audio yang berasal dari decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
CreateStereo16Bit GAP GAP - Hanya sampel float 32-bit yang didukung Versi berikutnya dari spesifikasi Audio Web akan menerapkan dukungan untuk sampel 16-bit.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (dari konstruksi default) AudioContext akan memiliki frekuensi sampling pilihan yang cocok dengan frekuensi sampel sebenarnya dari perangkat audio hardware secara default.
RecommendSampleFrameCount GAP GAP - Akan ditangani dengan AudioDeviceClient yang direncanakan Ada masalah terbuka untuk mengizinkan ukuran yang ditentukan pengguna, tetapi hal itu masih dalam proses penentuan. Hal ini mungkin sebaiknya ditangani dengan AudioDeviceClient yang dapat memberi tahu Anda ukuran yang sesuai untuk hardware tertentu.

PPB_Console

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Log Utime console.log/warn/error/...
LogWithSource GAP GAP Console API dianggap sebagai pengganti yang cukup lengkap, kecuali jika ada kasus penggunaan tertentu yang diajukan oleh developer untuk fungsi yang disediakan oleh LogWithSource. Source Maps DevTools dapat digunakan untuk men-debug JavaScript yang ditranspil dalam bahasa sumber aslinya.

PPB_Core

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
getTime utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== undefined
CallOnMainThread GAP Worker.postMessage + Atomics.wait Sinkronisasi yang setara dapat dibuat.

PPB_FileIO

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat FS (sebagian) window.chooseFileSystemEntries() Buat dan buka digunakan secara berbeda, tetapi bagian-bagiannya memiliki kekuatan yang sama.
Buka FS (sebagian) window.chooseFileSystemEntries()
Kueri FS (sebagian) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (sebagian) - Blob.type juga dapat digunakan untuk memeriksa jenis MIME. Jenis sistem file, waktu pembuatan, dan waktu akses terakhir tidak dapat ditentukan dengan Native File System API.
Sentuh FS (sebagian) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
Baca FS (sebagian) Blob.slice().arrayBuffer()
Tulis FS (sebagian) FileSystemWriter.write()
SetLength FS (sebagian) FileSystemWriter.truncate()
Flush GAP (sebagian) GAP (sebagian) - File dibersihkan saat FileSystemWrite.close() dipanggil Hal ini disengaja karena file Native File System API diekspos ke OS, sehingga pemeriksaan Safe Browsing perlu dilakukan sebelum data ditampilkan ke OS.
Tutup FS (sebagian) FileSystemWriter.close() Tidak membatalkan operasi yang tertunda, tetapi menghapus data apa pun yang ditulis sejauh ini ke disk.
ReadToArray GAP Blob.slice().arrayBuffer() atau Blob.arrayBuffer() Memungkinkan beberapa operasi baca subrentang secara paralel.

PPB_FileRef

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat FS (sebagian) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
GetFileSystemType FS (sebagian) FileSystem.type
GetName FS (sebagian) File.name
GetPath FS (sebagian) GAP (sebagian) - Dengan Native File System API, jalur relatif file dapat ditentukan dari referensi ke direktori yang berisi file menggunakan FileSystemHandle.resolve(FileSystemHandle) Jalur absolut file tidak dapat ditentukan, dan pengguna harus memberikan izin untuk mengakses direktori yang berisi file tersebut.
GetParent FS (sebagian) GAP (sebagian) - Dengan Native File System API, jalur relatif file dapat ditentukan dari referensi ke direktori yang berisi file menggunakan FileSystemHandle.resolve(FileSystemHandle) Pengguna harus memberikan izin untuk mengakses direktori yang berisi file.
MakeDirectory FS (sebagian) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Sentuh FS (sebagian) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true}) Waktu modifikasi dapat diubah dengan menulis.
Hapus FS (sebagian) FileSystemDirectoryHandle.removeEntry() Tidak seperti PPAPI, direktori tidak harus kosong.
Ganti nama FS (sebagian) GAP (sebagian) - Dengan Native File System API, file dapat ditulis dengan nama baru menggunakan kombinasi FileSystemFileHandle.getFile() untuk nama baru dan FileSystemFileHandle.createWriter().write() dengan konten file lama. Kemudian, FileSystemDirectoryHandle.removeEntry() untuk menghapus file lama. Tidak ada API langsung yang akan melakukan ini dalam satu langkah di Native File System API.
Kueri GAP (sebagian) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (sebagian) - Blob.type juga dapat digunakan untuk memeriksa jenis MIME. Jenis sistem file, waktu pembuatan, dan waktu akses terakhir tidak dapat ditentukan dengan Native File System API.
ReadDirectoryEntries FS (sebagian) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat FS (sebagian) window.requestFileSystem JS API melakukan keduanya dalam satu langkah
Buka GAP window.requestFileSystem JS API melakukan keduanya dalam satu langkah
GetType GAP FileSystem.type

PPB_Fullscreen

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Contoh SDL Gamepad.* Objek Gamepad mengekspos stempel waktu yang terkait dengan navigationStart. Update ini diperbarui ketika data diterima dari hardware https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL Canvas.getContext('2d')
Deskripsikan SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Scroll GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (sebagian) - Dapat diterapkan dengan menggambar kanvas ke kanvas itu sendiri, dengan offset, menggunakan drawImage, lalu mengisi bagian lainnya.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Flush GAP Tidak ada padanan langsung GAP (sebagian) - Selalu ada flush implisit di akhir kode gambar; hal ini tidak mungkin berubah. Namun, kombinasi dari OffscreenCanvas dan ImageBitmapRenderingContext menyediakan fungsi serupa.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (sebagian) - Eksposur OpenGL ES 3.0 dari WebGL 2.0 dan Emscripten mendukung framebuffer multisampel multisampel yang ditentukan pengguna, tempat semua parameter yang dapat dikonfigurasi melalui PPAPI dapat ditetapkan.
Buat SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPSI)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP Tidak ada padanan langsung GAP (sebagian) - Selalu ada flush implisit di akhir kode gambar; tidak mungkin berubah. Namun, kombinasi OffscreenCanvas dan ImageBitmapRenderingContext memberikan fungsi yang serupa.

PPB_ImageData

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetNativeImageDataFormat SDL ImageData mewajibkan urutan RGBA
IsImageDataFormatSupported SDL ImageData mewajibkan urutan RGBA
Buat SDL CanvasRenderingContext2d.createImageData
Menjelaskan SDL ImageData tidak pernah memiliki langkah
Peta SDL ImageData.data
Batalkan peta SDL ImageData.data

PPB_InputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
RequestInputEvents SDL Tidak ada padanan langsung Ketiadaan fitur ini mungkin kurang relevan karena JS/Wasm berjalan di thread utama dan dapat memfilter peristiwa dengan lebih murah tanpa menimbulkan perjalanan bolak-balik lintas proses.
RequestFilteringInputEvents SDL mouse* tombol* roda* sentuh* komposisi* Peristiwa
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Turunan class peristiwa
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL Peristiwa 'dblclick' vs. 'mousedown'
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode berisi info ini, tetapi tidak lengkap. Ada diskusi tentang penerapan WheelEvent.deltaMode API: https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP - deltaMode berisi info ini, tetapi tidak lengkap. Ada diskusi tentang penerapan WheelEvent.deltaMode API: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (untuk mengetahuinya sendiri)

PPB_IMEInputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Tidak ada padanan langsung Data ini berpotensi diambil dari CompositionEvent.data.
GetSegmentOffset GAP GAP - Tidak ada padanan langsung
GetTargetSegment GAP GAP - Tidak ada padanan langsung
GetSelection GAP GAP - Tidak ada padanan langsung

PPB_Instance

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
BindGraphics SDL Canvas.getContext (tidak relevan karena binding bersifat otomatis).
IsFullFrame GAP GAP - Tidak setara dengan pengendali jenis mime. Aplikasi NaCl dapat didaftarkan untuk menangani jenis mime tertentu dan memiliki seluruh dokumen.
DidCreate T/A &lt;Element&gt;[key] Akses DOM umum memungkinkan Anda mencari atribut tag
DidDestroy T/A T/A Tidak dipicu untuk NaCl
DidChangeView T/A Peristiwa 'resize' Elemen
DidChangeFocus T/A Elemen 'fokus', 'fokus', 'fokus' Acara
HandleDocumentLoad T/A GAP - Tidak ada cara untuk mendaftar sebagai pengendali jenis mime Modul NaCl melalui aplikasi + entri manifes dapat disiapkan untuk menangani jenis mime tertentu.

PPB_MediaStreamAudioTrack

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Konfigurasi GAP getUserMedia() Batasan dari getUserMedia() dapat memberikan nilai konfigurasi yang akan digunakan di MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP - Tidak ada padanan
RecycleBuffer GAP GAP - Tidak ada padanan
Tutup GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP Canvas Capture Canvas Capture menyediakan kemampuan untuk memperkenalkan frame video secara terprogram.
Konfigurasi GAP applyConstraints(), getUserMedia() GAP (sebagian) - Cakupan konfigurasi yang tersedia di Web API mungkin berbeda dengan PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP - tidak setara dengan PP_MEDIASTREAMVIDEOTracking_ATTRIB_BUFFERED_FRAMES MediaStream tidak dapat dimuat sebelumnya, sehingga tidak akan pernah di-buffer: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP - tidak setara dengan PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP - Tidak ada padanan
RecycleFrame GAP GAP - Tidak ada padanan
Tutup GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP - Tidak ada padanan
PutFrame GAP GAP - Tidak ada padanan

PPB_MessageLoop

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
GetForMainThread T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
GetCurrent T/A Sebagian besar tidak relevan, pekerja mendapatkan loop peristiwa implisit.
AttachToCurrentThread T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
Jalankan T/A Sebagian besar tidak relevan, pekerja mendapatkan loop peristiwa implisit.
PostWork T/A Sebagian besar diperdebatkan, pekerja mendapatkan loop peristiwa implisit.
PostQuit T/A Sebagian besar tidak relevan, pekerja mendapatkan loop peristiwa implisit.

PPB_Messaging

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
PostMessage T/A Window.postMessage
RegisterMessageHandler T/A Window.addEventListener
UnregisterMessageHandler T/A Window.removeEventListener

PPB_MouseCursor

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
SetCursor SDL Element.style.cursor Kumpulan kursor stok yang sama didukung. Kursor kustom dapat dilakukan dengan URL(..). Kursor kustom dinamis dapat dilakukan dengan URI data. CSS3 mendukung penentuan hotspot.

PPB_MouseLock

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Beberapa Metode OpenGLES Fungsinya hampir sama dengan WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
SetTextInputType GAP GAP - Berpotensi diisi oleh Input Method Editor API Beberapa developer ingin dapat memberikan petunjuk dengan cara ini, atau sebaiknya kemampuan untuk mencegat dan menampilkan peristiwa / output IME secara inline di dalam kanvas.
UpdateCaretPosition GAP GAP - Berpotensi diisi oleh Input Method Editor API https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP - Berpotensi diisi oleh Input Method Editor API https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP - Berpotensi diisi oleh Input Method Editor API https://www.w3.org/TR/ime-api/

PPB_URLLoader

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind new XMLHttpRequest();
Buka embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP - Tidak ada padanan XMLHTTPRequest
GetUploadProgress embind Peristiwa 'progres' XMLHttpRequest
GAP FetchObserver Belum ditentukan spesifikasinya atau belum diterapkan; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind Peristiwa 'progres' XMLHttpRequest
GAP FetchObserver Belum ditentukan spesifikasinya atau belum diterapkan; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Ambil Respons.*
ReadResponseBody embind XMLHttpRequest.response
embind Isi.* (Respons adalah Isi)
FinishStreamingToFile embind GAP - Tidak ada padanan langsung XMLHttpRequest dan Fetch mengasumsikan streaming ke memori, bukan langsung ke penyimpanan.
Tutup embind XMLHttpRequest.abort
GAP Fetch API: AbortSignal dan AbortController

PPB_URLRequestInfo

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind XMLHttpRequest
embind Permintaan Pengambilan
SetProperty GAP GAP - Tidak ada padanan langsung untuk XMLHttpRequest XMLHttpRequest tidak menyediakan cara langsung untuk batas per permintaan pengalihan berikut, mengalirkan ke file, menetapkan kebijakan perujuk atau kredensial.
embind Permintaan.*
AppendDataToBody embind XMLHttpRequest.send GAP - Keduanya harus memiliki keseluruhan tubuh, bukan sepotong.
embind fetch(.., options:body)
AppendFileToBody GAP Streaming upload fetch() https://www.chromestatus.com/features/5274139738767360
T/A <form> Anda juga dapat membaca dengan FileReader dan mengupload, tetapi lebih mirip dengan AppendDataToBody

PPB_URLResponseInfo

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetProperty embind XMLHttpRequest.getAllResponseHeaders + lainnya
embind Ambil Respons.*
GetBodyAsFileRef embind Respons Pengambilan (Isi) .blob() Mengasumsikan lapisan penyimpanan mengoptimalkan transfer.

PPB_Var

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource T/A T/A
VarToResource T/A T/A

PPB_VarArray

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Dapatkan embind Array[i]
Setel embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind ArrayBuffer(n) baru
ByteLength embind ArrayBuffer.byteLength
Peta GAP GAP - Tidak ada padanan langsung Modul Asm.js/Wasm tidak dapat memetakan region ArrayBuffer selain heap memori linear tunggalnya. Beberapa memori atau pemetaan memori di masa mendatang mungkin dapat meningkatkan kualitas ini.
Batalkan peta GAP GAP - Tidak ada padanan langsung

PPB_VarDictionary

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat embind {}
Dapatkan embind &lt;Object&gt;[i]
Setel embind <Objek>[i] = x
Hapus embind hapus <Object>[i]
HasKey embind x di <Object>
GetKeys embind for (k in <Object>) {} Tidak ada padanan literal, tetapi dapat dibuat.

PPB_VideoDecoder

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Lakukan inisialisasi GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan parameter inisialisasi VideoDecoder() (VideoDecoderInitParameters) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipe Through(VideoDecoder) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
GetPicture GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
RecyclePicture GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. Desain saat ini akan otomatis mendaur ulang gambar dan melanjutkan proses decoding. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Flush GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. API tersebut akan disebut Flush(), tetapi masih ada diskusi tentang cara pengurutannya sehubungan dengan panggilan dekode. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Reset GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan dengan menghancurkan instance VideoDecoder dan membuat instance baru. Ini tidak akan seefisien metode reset khusus, tetapi semantik untuk Reset() API masih dibahas. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan VideoEncoder()
GetSupportedProfiles GAP GAP (sebagian) - navigator.mediaCapabilities.encodingInfo() Profil yang didukung harus diperiksa satu per satu.
Lakukan inisialisasi GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan parameter inisialisasi VideoEncoder()
GetFramesRequired GAP GAP - Tidak ada padanan Kumpulan frame yang digunakan secara internal oleh Web Codecs API kemungkinan tidak terekspos.
GetFrameCodedSize GAP GAP - Tidak ada padanan Kemungkinan besar kumpulan frame yang digunakan secara internal oleh Web Codecs API tidak akan diekspos.
GetVideoFrame GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipe Through(VideoEncoder). Tindakan ini akan langsung mengenkode data dalam aliran Readable, bukan mengambil satu frame untuk diisi dengan data sebelum encoding.
Encoding GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan ReadableStream.pipeThrough(VideoEncoder)
GetBitstreamBuffer GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. Desain saat ini akan otomatis melewati buffer bitstream yang dienkode yang disalurkan. WebCodecs API saat ini mengasumsikan bahwa buffering bitstream dapat disalin, bukan digabungkan, sehingga tidak perlu didaur ulang.
RecycleBitstreamBuffer GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan. Desain saat ini akan otomatis mendaur ulang buffering untuk melanjutkan proses encoding. Hal ini tidak mungkin berubah di masa mendatang karena implikasi performa lebih kecil.
RequestEncodingParametersChange GAP GAP - Akan ditangani oleh Web Codecs API yang diusulkan. Beberapa parameter tertentu dapat diubah dengan cepat, sedangkan parameter lainnya akan memerlukan encoder untuk dihapus.
Tutup GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan menggunakan VideoEncoder.Close()

PPB_VideoFrame

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetTimestamp GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
SetTimestamp GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetFormat GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetSize GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetDataBuffer GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.
GetDataBufferSize GAP GAP - Akan ditangani dengan WebCodecs API yang diusulkan.

PPB_View

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Berkaitan dengan dokumen, bukan hanya satu elemen.
IsVisible embind IntersectionObserver
IsPageVisible embind document.visibilityState
GetClipRect embind IntersectionObserver
GetDeviceScale embind window.devicePixelRatio
GetCSSScale embind <Element>.getBoundingClientRect().width / <Element>.offsetWidth
GetScrollOffset embind <Element>.scrollTop/<Element>.scrollLeft

PPB_WebSocket

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat GAP WebSocket.WebSocket
Connect GAP WebSocket.WebSocket(url, ...) Peristiwa 'buka' WebSocket
Tutup GAP WebSocket.close
ReceiveMessage GAP 'Pesan' WebSocket Acara 'Error' WebSocket Acara 'close' WebSocket Acara
SendMessage GAP WebSocket.send
GetBufferedAmount GAP WebSocket.bufferedAmount
GetCloseCode GAP CloseEvent.code
GetCloseReason GAP CloseEvent.reason
GetCloseWasClean GAP CloseEvent.wasClean
GetExtensions GAP WebSocket.extensions
GetProtocol GAP WebSocket.protocol
GetReadyState GAP WebSocket.readyState
GetURL GAP WebSocket.url

PPP_Graphics3D

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Graphics3DContextHilang SDL Peristiwa 'webglcontextlost' Kanvas

PPP_InputEvent

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
DidCreate T/A &lt;Element&gt;[key] Akses DOM umum memungkinkan Anda mencari atribut tag
DidDestroy T/A T/A Tidak dipicu untuk NaCl
DidChangeView T/A Peristiwa 'resize' Elemen
DidChangeFocus T/A Elemen 'fokus', 'fokus', 'fokus' Acara
HandleDocumentLoad T/A GAP - Tidak ada cara untuk mendaftar sebagai pengendali jenis mime Modul NaCl melalui aplikasi + entri manifes dapat disiapkan untuk menangani jenis mime tertentu.

PPP_MessageHandler

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
HandleMessage embind 'Message' MessagePort Acara 'Pesan' jendela Acara
HandleBlockingMessage T/A GAP - Tidak ada padanan langsung Sinkronisasi serupa dapat dilakukan di luar thread utama dengan Atomics.wait. Class ini ditambahkan untuk mendukung emulasi API plugin sinkron.

PPP_Messaging

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
HandleMessage embind Peristiwa 'message' MessagePort Peristiwa 'message' Jendela

PPP_MouseLock

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
MouseLockLost SDL Peristiwa Elemen 'pointerlockchange', 'pointerlockerror'

PPAPI (Aplikasi)

PPB_HostResolver

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat x GAP GAP (sebagian) - Tidak ada padanan langsung
Selesaikan x GAP GAP (sebagian) - Tidak ada padanan langsung
GetCanonicalName x GAP GAP (sebagian) - Tidak ada padanan langsung
GetNetAddressCount x GAP GAP (sebagian) - Tidak ada padanan langsung
GetNetAddress x GAP GAP (sebagian) - Tidak ada padanan langsung

PPB_NetAddress

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
CreateFromIPv4Address x GAP GAP (sebagian) - Tidak ada padanan langsung
CreateFromIPv6Address x GAP GAP (sebagian) - Tidak ada padanan langsung
GetFamily x GAP GAP (sebagian) - Tidak ada padanan langsung
DescribeAsString x GAP GAP (sebagian) - Tidak ada padanan langsung
DescribeAsIPv4Address x GAP GAP (sebagian) - Tidak ada padanan langsung
DescribeAsIPv6Address x GAP GAP (sebagian) - Tidak ada padanan langsung

PPB_NetworkList

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetCount x GAP GAP - Tidak ada padanan langsung
GetName x GAP GAP - Tidak ada padanan langsung
GetType x GAP GAP - Tidak ada padanan langsung
GetState x GAP GAP - Tidak ada padanan langsung
GetIpAddress x GAP GAP - Tidak ada padanan langsung
GetDisplayName x GAP GAP - Tidak ada padanan langsung
GetMTU x GAP GAP - Tidak ada padanan langsung

PPB_NetworkMonitor

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
Buat x GAP GAP - Tidak ada padanan langsung
UpdateNetworkList x GAP GAP - Tidak ada padanan langsung

PPB_NetworkProxy

Metode PPAPI Mengasumsikan Threads Emscripten Web API Batasan
GetProxyForURL x GAP GAP - Tidak ada padanan langsung

PPB_TCPSocket dan PPB_UDPSocket

Tidak ada pemetaan 1:1 langsung untuk migrasi. Sebagai gantinya, kami telah menguraikan beberapa skenario pengguna di bawah dan jalur migrasi yang direkomendasikan.

Kasus Penggunaan Rekomendasi
Berbagi layar getDisplayMedia dan WebRTC ( demo)
Memuat dari server lokal untuk meminimalkan penggunaan bandwidth XHR, Fetch, Streams, Service Worker, Cache API
Memuat dari instance lokal aplikasi web / Menghubungkan ke instance lokal aplikasi web WebRTC
Chat WebSocket*
Real-Time komunikasi audio/video WebRTC
Kolaborasi WebSocket*
Game multiplayer real-time WebTransport** kecuali P2P, dalam hal ini WebRTC (atau WebTransport melalui RTCIceTransport)
Streaming interaktif real-time WebTransport**
Berkomunikasi dengan server lama Server {i>proxy<i} atau {i>middleware<i} untuk melakukan konversi protokol. Masukan ke bit.ly/network-api-gaps

*: Atau WebTransport pada masa mendatang

**: Lihat chromestatus untuk mengetahui ketersediaan