Guida alla migrazione a WebAssembly

Annunci sul ritiro di (P)NaCl

Dato l'impulso del supporto di WebAssembly tra browser, prevediamo di concentrare le nostre attività di codice nativo su WebAssembly in futuro e di rimuovere il supporto di PNaCl nel quarto trimestre del 2019 (tranne per le app di Chrome). Riteniamo che l'ecosistema dinamico di WebAssembly lo renda una scelta migliore per le app web nuove ed esistenti ad alte prestazioni e che l'utilizzo di PNaCl sia sufficientemente basso da giustificarne il ritiro.

A partire da Chrome 76, PNaCl sul web aperto è stato spostato dietro una prova dell'origine, un meccanismo che consente agli sviluppatori web di registrarsi e accedere a una funzionalità non attiva per impostazione predefinita. In genere si tratta di una nuova funzionalità proposta, ma in questo caso è una funzionalità che verrà ritirata. Uno sviluppatore può registrarsi nella console di prova di Origin e ricevere un token, che può essere incorporato in una pagina e attiverà la funzionalità senza che l'utente debba utilizzare un flag. Per ulteriori dettagli, consulta la guida collegata. La prova dovrebbe durare fino a Chrome 78, circa fino a dicembre 2019. Questa modifica non è pensata per influire su NaCl o PNaCl nelle app o nelle estensioni di Chrome e il comando "enable-nacl" Il flag in chrome://flags può essere utilizzato anche per attivare PNaCl localmente per i test (questo flag mantiene anche l'attuale funzione di abilitazione del NaCl "nativo" non PNaCl in qualsiasi pagina.

Di recente abbiamo anche annunciato il ritiro nel primo trimestre del 2018 delle app di Chrome al di fuori di ChromeOS.

Migrazione della toolchain

Per la maggior parte dei casi d'uso di (P)NaCl consigliamo la transizione dall'SDK NaCl a Emscripten. La migrazione è probabilmente ragionevolmente semplice se la tua applicazione è portabile su Linux, utilizza SDL o API POSIX. Sebbene il supporto diretto per le API NaCl / pepper non sia disponibile, abbiamo tentato di elencare gli equivalenti delle API web. Per casi di porting più complessi, contattaci all'indirizzo native-client-discuss@googlegroups.com

Migrazione delle API

Abbiamo descritto qui lo stato delle sostituzioni della piattaforma web per ogni delle API esposte a (P)NaCl. Inoltre, la tabella elenca la libreria o l'opzione in Emscripten che offre il sostituto più simile.

Prevediamo di aggiungere a WebAssembly il supporto dei thread di memoria condivisa nel 2017, in quanto i thread sono cruciali per far leva sull'uso più interessante di (P)NaCl d'uso diversi. Elementi della migrazione che presuppongono il supporto dei thread successivi sono indicati di seguito. Se il controllo del flusso dell'applicazione è fortemente basato sul blocco API, potresti anche notare che il supporto dei thread è necessario per una comoda portabilità.

Abbiamo cercato di essere precisi in questa tabella, ma non c'è dubbio che ci siano errori o omissioni. Se ne riscontri uno, contattaci all'indirizzo native-client-discuss@googlegroups.com

PPAPI

PPB_Audio

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea x SDL (parziale) GAP (parziale) - AudioWorkletNode APPROSSIMATIVAMENTE equivalente AudioWorkletSpec è pronto, ma AudioDeviceClient potrebbe essere più adatto a questa API. AudioDeviceClient è ancora specificato dalla community. Il worklet potrebbe non essere l'equivalente approssimativo di questa API.
GetCurrentConfig SDL AudioContext.* (recupera le impostazioni passate)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetTimestamp SDL AudioBufferSourceNode.start (parametro) Passato ogni volta invece di essere collegato al buffer.
SetTimestamp SDL AudioBufferSourceNode.start (parametro)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: WebAudio utilizza solo valori float a 32 bit, mentre PPAPI utilizza valori int a 16 bit. In teoria, PPAPI supporta più dimensioni di campionamento. In pratica, supporta solo campioni a 16 bit. Sfortunatamente, gli sviluppatori hanno richiesto dimensioni di esempio a 16 bit per risparmiare sulla memoria utilizzata. La prossima versione della specifica Web Audio implementerà il supporto per i sample a 16 bit. Potrebbe essere implementata un'ottimizzazione per AudioBuffer simile a quella di Firefox utilizzando un buffer a 16 bit per l'audio proveniente da decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Metodo PPAPI Assume thread Scritto API Web Limitazioni
CreaStereo16Bit GAP GAP: sono supportati solo i campioni con valori float a 32 bit La versione successiva delle specifiche per l'audio web implementerà il supporto per i campioni a 16 bit.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (dal costrutto predefinito) Un AudioContext avrà la frequenza di campionamento preferita che corrisponde per impostazione predefinita alla frequenza di campionamento effettiva del dispositivo audio hardware.
RecommendSampleFrameCount GAP GAP: verrà gestito con AudioDeviceClient pianificato Esiste un problema aperto per consentire una dimensione specificata dall'utente, ma che è ancora in fase di definizione. Probabilmente è meglio gestire questo problema con AudioDeviceClient, che può indicare le dimensioni appropriate per l'hardware in questione.

PPB_Console

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Log Utime console.log/warn/error/...
LogWithSource GAP GAP L'API Console è considerata una sostituzione sufficientemente completa, a meno che non vengano sollevati casi d'uso specifici dagli sviluppatori per la funzionalità fornita da LogWithSource. Le mappe di origine di DevTools possono essere utilizzate per eseguire il debug del codice JavaScript transcompilato nella lingua di origine originale.

PPB_Core

Metodo PPAPI Assume thread Scritto API Web Limitazioni
getTime Utime new Date().getTime()
getTimeTicks Utime new Date().getTime()
IsMainThread GAP window.document !== non definito
CallOnMainThread GAP Worker.postMessage + Atomics.wait Si può creare una sincronizzazione equivalente.

PPB_FileIO

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea FS (parziale) window.chooseFileSystemEntries() Creare e aprire sono usati in modo diverso, ma i pezzi hanno la stessa potenza.
Apri FS (parziale) window.chooseFileSystemEntries()
Query FS (parziale) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModifica GAP (parziale): è possibile utilizzare anche Blob.type per controllare il tipo MIME. Il tipo di file system, la data di creazione e la data dell'ultimo accesso non possono essere determinati con l'API Native File System.
Tocco FS (parziale) FileSystemDirectoryHandle.getFile("name", {create: true})
Leggi FS (parziale) Blob.slice().arrayBuffer()
Scrittura FS (parziale) FileSystemWriter.write()
SetLength FS (parziale) FileSystemWriter.truncate()
Svuota GAP (parziale) GAP (parziale): i file vengono svuotati quando viene chiamato FileSystemWrite.close() Questa operazione è inteso perché i file dell'API Native File System sono esposti al sistema operativo, pertanto è necessario eseguire un controllo di Navigazione sicura prima che i dati vengano mostrati al sistema operativo.
Chiudi FS (parziale) FileSystemWriter.close() Non annulla le operazioni in attesa, ma esegue lo svuotamento del buffer di tutti i dati scritti fino a quel momento sul disco.
ReadToArray GAP Blob.slice().arrayBuffer() o Blob.arrayBuffer() Consente più letture di sottointervalli in parallelo.

PPB_FileRef

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea FS (parziale) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (parziale) FileSystem.type
GetName FS (parziale) File.name
GetPath FS (parziale) GAP (parziale) - Con l'API file system nativa, il percorso relativo di un file può essere determinato dal riferimento a una directory che contiene il file utilizzando FileSystemHandle.resolve(FileSystemHandle) Non è possibile determinare il percorso assoluto di un file e l'utente deve concedere l'autorizzazione per accedere alla directory contenente il file.
GetParent FS (parziale) GAP (parziale) - Con l'API file system nativa, il percorso relativo di un file può essere determinato dal riferimento a una directory che contiene il file utilizzando FileSystemHandle.resolve(FileSystemHandle) L'utente deve concedere l'autorizzazione per accedere alla directory contenente il file.
MakeDirectory FS (parziale) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Tocco FS (parziale) FileSystemDirectoryHandle.getFile("name", {create: true}) L'ora di modifica può essere aumentata con la scrittura.
Elimina FS (parziale) FileSystemDirectoryHandle.removeEntry() A differenza della API PPAPI, le directory non devono essere vuote.
Rinomina FS (parziale) GAP (parziale): con l'API Native File System, il file può essere scritto con il nuovo nome utilizzando una combinazione di FileSystemFileHandle.getFile() per il nuovo nome e FileSystemFileHandle.createWriter().write() con i contenuti del vecchio file. Quindi FileSystemDirectoryHandle.removeEntry() per eliminare il file precedente. Non esiste un'API diretta che farà questo in un solo passaggio nell'API Native File System.
Query GAP (parziale) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModifica GAP (parziale) - Blob.type può essere utilizzato anche per controllare il tipo MIME. Il tipo di file system, la data di creazione e la data dell'ultimo accesso non possono essere determinati con l'API Native File System.
ReadDirectoryEntries FS (parziale) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea FS (parziale) window.requestFileSystem L'API JS esegue entrambe le operazioni in un solo passaggio
Apri GAP window.requestFileSystem L'API JS esegue entrambe le operazioni in un solo passaggio
GetType GAP FileSystem.type

PPB_Fullscreen

Metodo PPAPI Assume thread Scritto API Web Limitazioni
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Esempio SDL Gamepad.* L'oggetto Gamepad espone un timestamp relativo a NavigationStart. Viene aggiornato quando i dati vengono ricevuti dall'hardware https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL Canvas.getContext('2d')
Descrivi SDL Canvas.clientLarghezza + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Scorri GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (parziale): può essere implementato disegnando il canvas su se stesso con un offset, utilizzando drawImage e poi compilando il resto.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Svuota GAP Nessun equivalente diretto GAP (parziale): alla fine del codice di disegno è sempre presente un aggiornamento implicito; è improbabile che questo cambi. Tuttavia, la combinazione di OffscreenCanvas e ImageBitmapRenderingContext offre funzionalità simili.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (parziale) - l'esposizione di OpenGL ES 3.0 di WebGL 2.0 ed Emscripten supporta framebuffer con multicampionamento definiti dall'utente, in cui è possibile impostare tutti i parametri configurabili tramite PPAPI.
Crea SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPTIONS)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP Nessun equivalente diretto GAP (parziale) - C'è sempre uno svuotamento implicito alla fine del codice di disegno; è improbabile per cambiare. Tuttavia, la combinazione di OffscreenCanvas e ImageBitmapRenderingContext fornisce funzionalità simili.

PPB_ImageData

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetNativeImageDataFormat SDL ImageData impone l'ordine RGBA
IsImageDataFormatSupported SDL ImageData impone un ordine RGBA
Crea SDL CanvasRenderingContext2d.createImageData
Descrivi SDL ImageData non ha mai uno stride
Mappa SDL ImageData.data
Annullamento mappatura SDL ImageData.data

PPB_InputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
RequestInputEvents SDL Nessun equivalente diretto La mancanza di questa funzionalità è probabilmente meno rilevante perché JS/Wasm viene eseguito nel thread principale e può filtrare gli eventi in modo più economico senza dover eseguire un viaggio di andata e ritorno tra i processi.
RequestFilteringInputEvents SDL mouse* tasto* rotellina* tocco* composizione* Eventi
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Discendenti delle classi evento
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL "Dblclick" rispetto a "mousedown" Eventi
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP: deltaMode contiene queste informazioni, ma in modo incompleto. Si discute dell'implementazione di un'API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP: deltaMode contiene queste informazioni, ma in modo incompleto. Si discute dell'implementazione di un'API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (per capirlo da solo)

PPB_IMEInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Nessun equivalente diretto Questi dati possono essere potenzialmente recuperati da ComposeEvent.data.
GetSegmentOffset GAP GAP - Nessun equivalente diretto
GetTargetSegment GAP GAP - Nessun equivalente diretto
GetSelection GAP GAP - Nessun equivalente diretto

PPB_Instance

Metodo PPAPI Assume thread Scritto API Web Limitazioni
BindGraphics SDL Canvas.getContext (moot poiché l'associazione è automatica).
IsFullFrame GAP GAP: nessun equivalente per i gestori dei tipi MIME. Le app NaCl possono essere registrate per gestire un particolare tipo MIME e possedere l'intero documento.
DidCreate N/D <Element>[key] L'accesso generale al DOM ti consente di recuperare gli attributi dei tag
DidDestroy N/D N/D Non attivato per NaCl
DidChangeView N/D Evento "resize" dell'elemento
DidChangeFocus N/D Elemento 'focus', 'focusin', 'focusout' Eventi
HandleDocumentLoad N/D GAP - Nessun modo per registrarsi come gestore di tipi MIME È possibile configurare moduli NaCl tramite app e una voce manifest per gestire particolari tipi MIME.

PPB_MediaStreamAudioTrack

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Configura GAP getUserMedia() I vincoli di getUserMedia() possono fornire i valori di configurazione da utilizzare in MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP: nessun equivalente
RecycleBuffer GAP GAP: nessun equivalente
Chiudi GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP Acquisizione canvas Canvas Capture offre la possibilità di introdurre fotogrammi video in modo programmatico.
Configura GAP applyConstraints(), getUserMedia() GAP (parziale): la portata delle configurazioni disponibili nell'API web può essere diversa dalla PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP - non equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream non può essere precaricato, quindi non eseguirà mai il buffering: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP: nessun equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP: nessun equivalente
RecycleFrame GAP GAP: nessun equivalente
Chiudi GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP - Nessun equivalente
PutFrame GAP GAP: nessun equivalente

PPB_MessageLoop

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea N/D Per lo più disorientanti, i worker ricevono un loop di eventi implicito.
GetForMainThread N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
GetCurrent N/D Per lo più disorientanti, i worker ricevono un loop di eventi implicito.
AttachToCurrentThread N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
Esegui N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
PostWork N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
PostQuit N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.

PPB_Messaging

Metodo PPAPI Assume thread Scritto API Web Limitazioni
PostMessage N/D Window.postMessage
RegisterMessageHandler N/D Window.addEventListener
UnregisterMessageHandler N/D Window.removeEventListener

PPB_MouseCursor

Metodo PPAPI Assume thread Scritto API Web Limitazioni
SetCursor SDL Element.style.cursor È supportato lo stesso insieme di cursori stock. I cursori personalizzati possono essere creati con url(..). I cursori personalizzati dinamici possono essere creati con URI dati. CSS3 supporta la specifica dell'hotspot.

PPB_MouseLock

Metodo PPAPI Assume thread Scritto API Web Limitazioni
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Diversi metodi OpenGLES Funzionalità simile a WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Metodo PPAPI Assume thread Scritto API Web Limitazioni
SetTextInputType GAP GAP: potenziale riempito dall'API Input Method Editor Alcuni sviluppatori vorrebbero poter fornire suggerimenti in questo modo o, preferibilmente, avere la possibilità di intercettare e visualizzare gli eventi/l'output dell'IME in linea all'interno di un canvas.
UpdateCaretPosition GAP GAP: potenziale riempito dall'API Input Method Editor https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP: potenziale riempito dall'API Input Method Editor https://www.w3.org/TR/ime-api/
AggiornaTestoAttorno GAP GAP: potenziale riempito dall'API Input Method Editor https://www.w3.org/TR/ime-api/

PPB_URLLoader

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind new XMLHttpRequest();
Apri embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP: nessun equivalente di XMLHttpRequest
GetUploadProgress embind Evento "progress" di XMLHttpRequest
GAP FetchObserver Non ancora specificato o implementato; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind Evento "progress" di XMLHttpRequest
GAP FetchObserver Non ancora specificato o implementato; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Recupera risposta.*
ReadResponseBody embind XMLHttpRequest.response
embind Testo.* (Response is a Body)
FinishStreamingToFile embind GAP - Nessun equivalente diretto XMLHttpRequest e Fetch sono entrambi presupposti per lo streaming in memoria, anziché direttamente in uno spazio di archiviazione.
Chiudi embind XMLHttpRequest.abort
GAP API Fetch: AbortSignal e AbortController

PPB_URLRequestInfo

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind XMLHttpRequest
embind Richiesta di recupero
SetProperty GAP GAP - Nessun equivalente diretto per XMLHttpRequest XMLHttpRequest non fornisce metodi diretti per limitare le richieste dei seguenti reindirizzamenti, trasmettere in streaming a un file o impostare criteri relativi a referrer o credenziali.
embind Richiesta.*
AppendDataToBody embind XMLHttpRequest.send GAP: entrambi devono avere il corpo completo, non una parte.
embind fetch(.., options:body)
AppendFileToBody GAP Caricamento in streaming di fetch() https://www.chromestatus.com/features/5274139738767360
N/D <form> Potete leggere con FileReader e Caricamento, ma è più simile ad AppendDataToBody

PPB_URLResponseInfo

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetProperty embind XMLHttpRequest.getAllResponseHeaders + altri
embind Recupera risposta.*
GetBodyAsFileRef embind Recupera risposta (corpo) .blob() Presuppone il livello di archiviazione di ottimizzare il trasferimento.

PPB_Var

Metodo PPAPI Assume thread Scritto API Web Limitazioni
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/D N/D
VarToResource N/D N/D

PPB_VarArray

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Get embind Array[i]
Partenza embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind new ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Mappa GAP GAP - Nessun equivalente diretto I moduli Asm.js / Wasm non sono in grado di mappare regioni di un ArrayBuffer diverse dal loro singolo heap di memoria lineare. In futuro, la mappatura della memoria o la presenza di più ricordi potrebbe migliorare la situazione.
Rimuovi mappa GAP GAP - Nessun equivalente diretto

PPB_VarDictionary

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind {}
Get embind <Object>[i]
Partenza embind <Oggetto>[i] = x
Elimina embind delete <oggetto>[i]
HasKey embind x in <Object>
GetKeys embind for (k in <Object>) {} Nessun valore letterale equivalente, ma può essere creato.

PPB_VideoDecoder

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP GAP: viene gestito con l'API WebCodecs proposta utilizzando VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Inizializza GAP GAP: verrà gestito con l'API WebCodecs proposta utilizzando i parametri di inizializzazione 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: verrà gestito con l'API WebCodecs proposta utilizzando ReadableStream.pipeThrough(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: verrà gestito con l'API WebCodecs proposta utilizzando 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: verrà gestito con l'API WebCodecs proposta. Il design attuale ricicla automaticamente le immagini e mantiene attivo il processo di decodifica. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Svuota GAP GAP: verrà gestito con l'API WebCodecs proposta. L'API si chiamerà Flush(), ma è ancora in discussione come verrà sequenziata in relazione alle chiamate di decodifica. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Reimposta GAP GAP: verrà gestito con l'API WebCodecs proposta distruggendo l'istanza VideoDecoder e creandone una nuova. Questo non sarà efficiente come un metodo di ripristino dedicato, ma la semantica di un'API Reset() è ancora in fase di discussione. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP GAP. Verrà gestito con l'API WebCodecs proposta utilizzando VideoEncoder()
GetSupportedProfiles GAP GAP (parziale) - navigator.mediaCapabilities.encodingInfo() I profili supportati devono essere controllati uno alla volta.
Inizializza GAP GAP: verrà gestito con l'API WebCodecs proposta utilizzando i parametri di inizializzazione VideoEncoder()
GetFramesRequired GAP GAP: nessun equivalente È improbabile che il pool di frame utilizzato internamente dall'API Web Codecs sia esposto.
GetFrameCodedSize GAP GAP: nessun equivalente È improbabile che il pool di frame utilizzato internamente dall'API Web Codecs sia esposto.
GetVideoFrame GAP GAP: verrà gestito con l'API WebCodecs proposta utilizzando ReadableStream.pipeThrough(VideoEncoder). In questo modo codificherebbe direttamente i dati nel flusso Leggibile invece di acquisire un singolo frame da riempire con i dati prima della codifica.
Codifica GAP GAP: viene gestito con l'API WebCodecs proposta utilizzando ReadableStream.pipethrough(VideoEncoder)
GetBitstreamBuffer GAP GAP: verrà gestito con l'API WebCodecs proposta. Il design attuale passerà automaticamente attraverso il buffer di bitstream codificato che viene trasmesso. L'API WebCodecs attualmente presuppone che il buffer di bitstream possa essere copiato, anziché essere messo in pool, quindi non sarà necessario riciclarlo.
RecycleBitstreamBuffer GAP GAP: verrà gestito con l'API WebCodecs proposta. Il design attuale ricicla automaticamente il buffer per mantenere in esecuzione il processo di codifica. È improbabile che questa situazione cambi in futuro in quanto le implicazioni sul rendimento sono minori.
RequestEncodingParametersChange GAP GAP: verrà gestito dall'API Web Codecs proposta. Alcuni parametri possono essere modificati in tempo reale, mentre altri richiedono lo smantellamento del codificatore.
Chiudi GAP GAP. Verrà gestito con l'API WebCodecs proposta utilizzando VideoEncoder.Close()

PPB_VideoFrame

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetTimestamp GAP GAP: verrà gestito con l'API WebCodecs proposta.
SetTimestamp GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetFormat GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetSize GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetDataBuffer GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetDataBufferSize GAP GAP: verrà gestito con l'API WebCodecs proposta.

PPB_View

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Riguarda il documento anziché un singolo elemento.
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

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP WebSocket.WebSocket
Connetti GAP WebSocket.WebSocket(url, ...) Evento "open" WebSocket
Chiudi GAP WebSocket.close
ReceiveMessage GAP Evento "message" WebSocket Evento "error" WebSocket Evento "close" WebSocket
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

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Grafica3DContestoperso SDL Evento "webglcontextlost" di Canvas

PPP_InputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Metodo PPAPI Assume thread Scritto API Web Limitazioni
DidCreate N/D &lt;Element&gt;[key] L'accesso generale al DOM ti consente di recuperare gli attributi dei tag
DidDestroy N/D N/D Non attivato per NaCl
DidChangeView N/D Evento "resize" dell'elemento
DidChangeFocus N/D Elemento 'focus', 'focusin', 'focusout' Eventi
HandleDocumentLoad N/D GAP: impossibile registrarsi come gestore di tipi MIME È possibile configurare moduli NaCl tramite app e una voce manifest per gestire particolari tipi MIME.

PPP_MessageHandler

Metodo PPAPI Assume thread Scritto API Web Limitazioni
HandleMessage embind MessagePort "message" Evento Finestra "message" Evento
HandleBlockingMessage N/D GAP - Nessun equivalente diretto Una sincronizzazione simile può essere eseguita al di fuori del thread principale con Atomics.wait. Questa opzione è stata aggiunta per supportare l'emulazione delle API plug-in sincrono.

PPP_Messaging

Metodo PPAPI Assume thread Scritto API Web Limitazioni
HandleMessage embind MessagePort "message" Evento Finestra "message" Evento

PPP_MouseLock

Metodo PPAPI Assume thread Scritto API Web Limitazioni
MouseLockLost SDL Elemento "pointerlockchange", "pointerlockerror" Eventi

IRT

PPB_Audio

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea x SDL (parziale) GAP (parziale) - AudioWorkletNode APPROSSIMATIVAMENTE equivalente AudioWorkletSpec è pronto, ma AudioDeviceClient potrebbe essere più adatto a questa API. AudioDeviceClient è ancora specificato dalla community. Il worklet potrebbe non essere l'equivalente approssimativo di questa API.
GetCurrentConfig SDL AudioContext.* (recupera le impostazioni passate)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetTimestamp SDL AudioBufferSourceNode.start (parametro) Passato ogni volta invece di essere collegato al buffer.
SetTimestamp SDL AudioBufferSourceNode.start (parametro)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: WebAudio utilizza solo valori float a 32 bit, mentre PPAPI utilizza valori int a 16 bit. In teoria, PPAPI supporta più dimensioni di campionamento. In pratica, supporta solo campioni a 16 bit. Sfortunatamente, gli sviluppatori hanno richiesto dimensioni di esempio a 16 bit per risparmiare sulla memoria utilizzata. La prossima versione della specifica Web Audio implementerà il supporto per i sample a 16 bit. Potrebbe essere implementata un'ottimizzazione per AudioBuffer simile a quella di Firefox utilizzando un buffer a 16 bit per l'audio proveniente da decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Metodo PPAPI Assume thread Scritto API Web Limitazioni
CreaStereo16Bit GAP GAP: sono supportati solo i campioni con valori float a 32 bit La versione successiva delle specifiche per l'audio web implementerà il supporto per i campioni a 16 bit.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (dal costrutto predefinito) Un AudioContext avrà la frequenza di campionamento preferita che corrisponde per impostazione predefinita alla frequenza di campionamento effettiva del dispositivo audio hardware.
RecommendSampleFrameCount GAP GAP: verrà gestito con AudioDeviceClient pianificato Esiste un problema aperto per consentire una dimensione specificata dall'utente, ma che è ancora in fase di definizione. Probabilmente è meglio gestire questo problema con AudioDeviceClient, che può indicare le dimensioni appropriate per l'hardware in questione.

PPB_Console

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Log Utime console.log/warn/error/...
LogWithSource GAP GAP L'API Console è considerata una sostituzione sufficientemente completa, a meno che non vengano sollevati casi d'uso specifici dagli sviluppatori per la funzionalità fornita da LogWithSource. Le mappe di origine di DevTools possono essere utilizzate per eseguire il debug del codice JavaScript transcompilato nella lingua di origine originale.

PPB_Core

Metodo PPAPI Assume thread Scritto API Web Limitazioni
getTime Utime new Date().getTime()
getTimeTicks Utime new Date().getTime()
IsMainThread GAP window.document !== non definito
CallOnMainThread GAP Worker.postMessage + Atomics.wait Si può creare una sincronizzazione equivalente.

PPB_FileIO

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea FS (parziale) window.chooseFileSystemEntries() Creare e aprire sono usati in modo diverso, ma i pezzi hanno la stessa potenza.
Apri FS (parziale) window.chooseFileSystemEntries()
Query FS (parziale) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModifica GAP (parziale): è possibile utilizzare anche Blob.type per controllare il tipo MIME. Il tipo di file system, la data di creazione e la data dell'ultimo accesso non possono essere determinati con l'API Native File System.
Tocco FS (parziale) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
Leggi FS (parziale) Blob.slice().arrayBuffer()
Scrittura FS (parziale) FileSystemWriter.write()
SetLength FS (parziale) FileSystemWriter.truncate()
Svuota GAP (parziale) GAP (parziale): i file vengono svuotati quando viene chiamato FileSystemWrite.close() Questa operazione è inteso perché i file dell'API Native File System sono esposti al sistema operativo, pertanto è necessario eseguire un controllo di Navigazione sicura prima che i dati vengano mostrati al sistema operativo.
Chiudi FS (parziale) FileSystemWriter.close() Non annulla le operazioni in attesa, ma esegue lo svuotamento del buffer di tutti i dati scritti fino a quel momento sul disco.
ReadToArray GAP Blob.slice().arrayBuffer() o Blob.arrayBuffer() Consente più letture di sottointervalli in parallelo.

PPB_FileRef

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea FS (parziale) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (parziale) FileSystem.type
GetName FS (parziale) File.name
GetPath FS (parziale) GAP (parziale) - Con l'API file system nativa, il percorso relativo di un file può essere determinato dal riferimento a una directory che contiene il file utilizzando FileSystemHandle.resolve(FileSystemHandle) Non è possibile determinare il percorso assoluto di un file e l'utente deve concedere l'autorizzazione per accedere alla directory contenente il file.
GetParent FS (parziale) GAP (parziale) - Con l'API file system nativa, il percorso relativo di un file può essere determinato dal riferimento a una directory che contiene il file utilizzando FileSystemHandle.resolve(FileSystemHandle) L'utente deve concedere l'autorizzazione per accedere alla directory contenente il file.
MakeDirectory FS (parziale) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Tocco FS (parziale) FileSystemDirectoryHandle.getFile("name", {create: true}) L'ora di modifica può essere aumentata con la scrittura.
Elimina FS (parziale) FileSystemDirectoryHandle.removeEntry() A differenza della API PPAPI, le directory non devono essere vuote.
Rinomina FS (parziale) GAP (parziale): con l'API Native File System, il file può essere scritto con il nuovo nome utilizzando una combinazione di FileSystemFileHandle.getFile() per il nuovo nome e FileSystemFileHandle.createWriter().write() con i contenuti del vecchio file. Quindi FileSystemDirectoryHandle.removeEntry() per eliminare il file precedente. Non esiste un'API diretta che farà questo in un solo passaggio nell'API Native File System.
Query GAP (parziale) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModifica GAP (parziale) - Blob.type può essere utilizzato anche per controllare il tipo MIME. Il tipo di file system, la data di creazione e la data dell'ultimo accesso non possono essere determinati con l'API Native File System.
ReadDirectoryEntries FS (parziale) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea FS (parziale) window.requestFileSystem L'API JS esegue entrambe le operazioni in un solo passaggio
Apri GAP window.requestFileSystem L'API JS esegue entrambe le operazioni in un solo passaggio
GetType GAP FileSystem.type

PPB_Fullscreen

Metodo PPAPI Assume thread Scritto API Web Limitazioni
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Esempio SDL Gamepad.* L'oggetto Gamepad espone un timestamp relativo a NavigationStart. Viene aggiornato quando i dati vengono ricevuti dall'hardware https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL Canvas.getContext('2d')
Descrivi SDL Canvas.clientLarghezza + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Scorri GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (parziale): può essere implementato disegnando il canvas su se stesso con un offset, utilizzando drawImage e poi compilando il resto.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Svuota GAP Nessun equivalente diretto GAP (parziale): alla fine del codice di disegno è sempre presente un aggiornamento implicito; è improbabile che questo cambi. Tuttavia, la combinazione OffscreenCanvas e ImageBitmapRenderingContext offrono funzionalità simili.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (parziale) - l'esposizione di OpenGL ES 3.0 di WebGL 2.0 ed Emscripten supporta framebuffer con multicampionamento definiti dall'utente, in cui è possibile impostare tutti i parametri configurabili tramite PPAPI.
Crea SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPTIONS)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP Nessun equivalente diretto GAP (parziale) - C'è sempre uno svuotamento implicito alla fine del codice di disegno; è improbabile per cambiare. Tuttavia, la combinazione OffscreenCanvas e ImageBitmapRenderingContext offrono funzionalità simili.

PPB_ImageData

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetNativeImageDataFormat SDL ImageData impone l'ordine RGBA
IsImageDataFormatSupported SDL ImageData impone un ordine RGBA
Crea SDL CanvasRenderingContext2d.createImageData
Descrivi SDL ImageData non ha mai uno stride
Mappa SDL ImageData.data
Annullamento mappatura SDL ImageData.data

PPB_InputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
RequestInputEvents SDL Nessun equivalente diretto La mancanza di questa funzionalità è probabilmente meno rilevante perché JS/Wasm viene eseguito nel thread principale e può filtrare gli eventi in modo più economico senza dover eseguire un viaggio di andata e ritorno tra i processi.
RequestFilteringInputEvents SDL mouse* tasto* rotellina* tocco* composizione* Eventi
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Discendenti delle classi evento
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL "Dblclick" rispetto a "mousedown" Eventi
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP: deltaMode contiene queste informazioni, ma in modo incompleto. Si discute dell'implementazione di un'API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP: deltaMode contiene queste informazioni, ma in modo incompleto. Si discute dell'implementazione di un'API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (per capirlo da solo)

PPB_IMEInputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Nessun equivalente diretto Questi dati possono essere potenzialmente recuperati da ComposeEvent.data.
GetSegmentOffset GAP GAP - Nessun equivalente diretto
GetTargetSegment GAP GAP - Nessun equivalente diretto
GetSelection GAP GAP - Nessun equivalente diretto

PPB_Instance

Metodo PPAPI Assume thread Scritto API Web Limitazioni
BindGraphics SDL Canvas.getContext (moot poiché l'associazione è automatica).
IsFullFrame GAP GAP: nessun equivalente per i gestori dei tipi MIME. Le app NaCl possono essere registrate per gestire un particolare tipo MIME e possedere l'intero documento.
DidCreate N/D &lt;Element&gt;[key] L'accesso generale al DOM ti consente di recuperare gli attributi dei tag
DidDestroy N/D N/D Non attivato per NaCl
DidChangeView N/D Evento "resize" dell'elemento
DidChangeFocus N/D Elemento 'focus', 'focusin', 'focusout' Eventi
HandleDocumentLoad N/D GAP - Nessun modo per registrarsi come gestore di tipi MIME È possibile configurare moduli NaCl tramite app e una voce manifest per gestire particolari tipi MIME.

PPB_MediaStreamAudioTrack

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Configura GAP getUserMedia() I vincoli di getUserMedia() possono fornire i valori di configurazione da utilizzare in MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP: nessun equivalente
RecycleBuffer GAP GAP: nessun equivalente
Chiudi GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP Acquisizione canvas Canvas Capture offre la possibilità di introdurre fotogrammi video in modo programmatico.
Configura GAP applyConstraints(), getUserMedia() GAP (parziale): la portata delle configurazioni disponibili nell'API web può essere diversa dalla PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP - non equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream non può essere precaricato, quindi non eseguirà mai il buffering: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP: nessun equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP: nessun equivalente
RecycleFrame GAP GAP: nessun equivalente
Chiudi GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP - Nessun equivalente
PutFrame GAP GAP: nessun equivalente

PPB_MessageLoop

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea N/D Per lo più disorientanti, i worker ricevono un loop di eventi implicito.
GetForMainThread N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
GetCurrent N/D Per lo più disorientanti, i worker ricevono un loop di eventi implicito.
AttachToCurrentThread N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
Esegui N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
PostWork N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.
PostQuit N/D Per lo più irrilevante, i worker ricevono un loop di eventi implicito.

PPB_Messaging

Metodo PPAPI Assume thread Scritto API Web Limitazioni
PostMessage N/D Window.postMessage
RegisterMessageHandler N/D Window.addEventListener
UnregisterMessageHandler N/D Window.removeEventListener

PPB_MouseCursor

Metodo PPAPI Assume thread Scritto API Web Limitazioni
SetCursor SDL Element.style.cursor È supportato lo stesso insieme di cursori stock. I cursori personalizzati possono essere creati con url(..). I cursori personalizzati dinamici possono essere creati con URI dati. CSS3 supporta la specifica dell'hotspot.

PPB_MouseLock

Metodo PPAPI Assume thread Scritto API Web Limitazioni
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Diversi metodi OpenGLES Funzionalità simile a WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Metodo PPAPI Assume thread Scritto API Web Limitazioni
SetTextInputType GAP GAP: potenziale riempito dall'API Input Method Editor Alcuni sviluppatori vorrebbero poter fornire suggerimenti in questo modo o, preferibilmente, avere la possibilità di intercettare e visualizzare gli eventi/l'output dell'IME in linea all'interno di un canvas.
UpdateCaretPosition GAP GAP: potenziale riempito dall'API Input Method Editor https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP: potenziale riempito dall'API Input Method Editor https://www.w3.org/TR/ime-api/
AggiornaTestoAttorno GAP GAP: potenziale riempito dall'API Input Method Editor https://www.w3.org/TR/ime-api/

PPB_URLLoader

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind new XMLHttpRequest();
Apri embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP: nessun equivalente di XMLHttpRequest
GetUploadProgress embind Evento "progress" di XMLHttpRequest
GAP FetchObserver Non ancora specificato o implementato; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind Evento "progress" di XMLHttpRequest
GAP FetchObserver Non ancora specificato o implementato; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Recupera risposta.*
ReadResponseBody embind XMLHttpRequest.response
embind Testo.* (Response is a Body)
FinishStreamingToFile embind GAP - Nessun equivalente diretto XMLHttpRequest e Fetch sono entrambi presupposti per lo streaming in memoria, anziché direttamente in uno spazio di archiviazione.
Chiudi embind XMLHttpRequest.abort
GAP API Fetch: AbortSignal e AbortController

PPB_URLRequestInfo

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind XMLHttpRequest
embind Richiesta di recupero
SetProperty GAP GAP - Nessun equivalente diretto per XMLHttpRequest XMLHttpRequest non fornisce metodi diretti per limitare le richieste dei seguenti reindirizzamenti, trasmettere in streaming a un file o impostare criteri relativi a referrer o credenziali.
embind Richiesta.*
AppendDataToBody embind XMLHttpRequest.send GAP: entrambi devono avere il corpo completo, non una parte.
embind fetch(.., options:body)
AppendFileToBody GAP Caricamento in streaming di fetch() https://www.chromestatus.com/features/5274139738767360
N/D &lt;form&gt; Potete leggere con FileReader e Caricamento, ma è più simile ad AppendDataToBody

PPB_URLResponseInfo

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetProperty embind XMLHttpRequest.getAllResponseHeaders + altri
embind Recupera risposta.*
GetBodyAsFileRef embind Recupera risposta (corpo) .blob() Presuppone il livello di archiviazione di ottimizzare il trasferimento.

PPB_Var

Metodo PPAPI Assume thread Scritto API Web Limitazioni
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/D N/D
VarToResource N/D N/D

PPB_VarArray

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Get embind Array[i]
Partenza embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind new ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Mappa GAP GAP - Nessun equivalente diretto I moduli Asm.js / Wasm non sono in grado di mappare regioni di un ArrayBuffer diverse dal loro singolo heap di memoria lineare. In futuro, la mappatura della memoria o la presenza di più ricordi potrebbe migliorare la situazione.
Rimuovi mappa GAP GAP - Nessun equivalente diretto

PPB_VarDictionary

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea embind {}
Get embind <Object>[i]
Partenza embind <Oggetto>[i] = x
Elimina embind delete <oggetto>[i]
HasKey embind x in <Object>
GetKeys embind for (k in <Object>) {} Nessun valore letterale equivalente, ma può essere creato.

PPB_VideoDecoder

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP GAP: viene gestito con l'API WebCodecs proposta utilizzando VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Inizializza GAP GAP: verrà gestito con l'API WebCodecs proposta utilizzando i parametri di inizializzazione 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: verrà gestito con l'API WebCodecs proposta utilizzando ReadableStream.pipeThrough(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: verrà gestito con l'API WebCodecs proposta utilizzando 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: verrà gestito con l'API WebCodecs proposta. Il design attuale ricicla automaticamente le immagini e mantiene attivo il processo di decodifica. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Svuota GAP GAP: verrà gestito con l'API WebCodecs proposta. L'API si chiamerà Flush(), ma è ancora in discussione come verrà sequenziata in relazione alle chiamate di decodifica. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Reimposta GAP GAP: verrà gestito con l'API WebCodecs proposta distruggendo l'istanza VideoDecoder e creandone una nuova. Questo non sarà efficiente come un metodo di ripristino dedicato, ma la semantica di un'API Reset() è ancora in fase di discussione. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP GAP. Verrà gestito con l'API WebCodecs proposta utilizzando VideoEncoder()
GetSupportedProfiles GAP GAP (parziale) - navigator.mediaCapabilities.encodingInfo() I profili supportati devono essere controllati uno alla volta.
Inizializza GAP GAP: verrà gestito con l'API WebCodecs proposta utilizzando i parametri di inizializzazione VideoEncoder()
GetFramesRequired GAP GAP: nessun equivalente È improbabile che il pool di frame utilizzato internamente dall'API Web Codecs sia esposto.
GetFrameCodedSize GAP GAP: nessun equivalente È improbabile che il pool di frame utilizzato internamente dall'API Web Codecs sia esposto.
GetVideoFrame GAP GAP: verrà gestito con l'API WebCodecs proposta utilizzando ReadableStream.pipeThrough(VideoEncoder). In questo modo codificherebbe direttamente i dati nel flusso Leggibile invece di acquisire un singolo frame da riempire con i dati prima della codifica.
Codifica GAP GAP: viene gestito con l'API WebCodecs proposta utilizzando ReadableStream.pipethrough(VideoEncoder)
GetBitstreamBuffer GAP GAP: verrà gestito con l'API WebCodecs proposta. Il design attuale passerà automaticamente attraverso il buffer di bitstream codificato che viene trasmesso. L'API WebCodecs attualmente presuppone che il buffer di bitstream possa essere copiato, anziché essere messo in pool, quindi non sarà necessario riciclarlo.
RecycleBitstreamBuffer GAP GAP: verrà gestito con l'API WebCodecs proposta. Il design attuale ricicla automaticamente il buffer per mantenere in esecuzione il processo di codifica. È improbabile che questa situazione cambi in futuro in quanto le implicazioni sul rendimento sono minori.
RequestEncodingParametersChange GAP GAP: verrà gestito dall'API Web Codecs proposta. Alcuni parametri possono essere modificati in tempo reale, mentre altri richiedono lo smantellamento del codificatore.
Chiudi GAP GAP. Verrà gestito con l'API WebCodecs proposta utilizzando VideoEncoder.Close()

PPB_VideoFrame

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetTimestamp GAP GAP: verrà gestito con l'API WebCodecs proposta.
SetTimestamp GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetFormat GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetSize GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetDataBuffer GAP GAP: verrà gestito con l'API WebCodecs proposta.
GetDataBufferSize GAP GAP: verrà gestito con l'API WebCodecs proposta.

PPB_View

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Riguarda il documento anziché un singolo elemento.
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

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea GAP WebSocket.WebSocket
Connetti GAP WebSocket.WebSocket(url, ...) Evento "open" WebSocket
Chiudi GAP WebSocket.close
ReceiveMessage GAP Evento "message" WebSocket Evento "error" WebSocket Evento "close" WebSocket
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

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Grafica3DContestoperso SDL Evento "webglcontextlost" di Canvas

PPP_InputEvent

Metodo PPAPI Assume thread Scritto API Web Limitazioni
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Metodo PPAPI Assume thread Scritto API Web Limitazioni
DidCreate N/D &lt;Element&gt;[key] L'accesso generale al DOM ti consente di recuperare gli attributi dei tag
DidDestroy N/D N/D Non attivato per NaCl
DidChangeView N/D Evento "resize" dell'elemento
DidChangeFocus N/D Elemento 'focus', 'focusin', 'focusout' Eventi
HandleDocumentLoad N/D GAP: impossibile registrarsi come gestore di tipi MIME È possibile configurare moduli NaCl tramite app e una voce manifest per gestire particolari tipi MIME.

PPP_MessageHandler

Metodo PPAPI Assume thread Scritto API Web Limitazioni
HandleMessage embind MessagePort "message" Evento Finestra "message" Evento
HandleBlockingMessage N/D GAP - Nessun equivalente diretto Una sincronizzazione simile può essere eseguita al di fuori del thread principale con Atomics.wait. Questa opzione è stata aggiunta per supportare l'emulazione delle API plug-in sincrono.

PPP_Messaging

Metodo PPAPI Assume thread Scritto API Web Limitazioni
HandleMessage embind MessagePort "message" Evento Finestra "message" Evento

PPP_MouseLock

Metodo PPAPI Assume thread Scritto API Web Limitazioni
MouseLockLost SDL Elemento "pointerlockchange", "pointerlockerror" Eventi

PPAPI (app)

PPB_HostResolver

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea x GAP GAP (parziale) - Nessun equivalente diretto
Risolvi x GAP GAP (parziale) - Nessun equivalente diretto
GetCanonicalName x GAP GAP (parziale) - Nessun equivalente diretto
GetNetAddressCount x GAP GAP (parziale) - Nessun equivalente diretto
GetNetAddress x GAP GAP (parziale) - Nessun equivalente diretto

PPB_NetAddress

Metodo PPAPI Assume thread Scritto API Web Limitazioni
CreateFromIPv4Address x GAP GAP (parziale) - Nessun equivalente diretto
CreateFromIPv6Address x GAP GAP (parziale) - Nessun equivalente diretto
GetFamily x GAP GAP (parziale) - Nessun equivalente diretto
DescribeAsString x GAP GAP (parziale) - Nessun equivalente diretto
DescribeAsIPv4Address x GAP GAP (parziale) - Nessun equivalente diretto
DescribeAsIPv6Address x GAP GAP (parziale) - Nessun equivalente diretto

PPB_NetworkList

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetCount x GAP GAP - Nessun equivalente diretto
GetName x GAP GAP - Nessun equivalente diretto
GetType x GAP GAP: nessun equivalente diretto
GetState x GAP GAP - Nessun equivalente diretto
GetIpAddress x GAP GAP - Nessun equivalente diretto
GetDisplayName x GAP GAP: nessun equivalente diretto
GetMTU x GAP GAP - Nessun equivalente diretto

PPB_NetworkMonitor

Metodo PPAPI Assume thread Scritto API Web Limitazioni
Crea x GAP GAP - Nessun equivalente diretto
AggiornaNetworkList x GAP GAP - Nessun equivalente diretto

PPB_NetworkProxy

Metodo PPAPI Assume thread Scritto API Web Limitazioni
GetProxyForURL x GAP GAP - Nessun equivalente diretto

PPB_TCPSocket e PPB_UDPSocket

Non esiste un mapping diretto 1:1 per la migrazione. Di seguito abbiamo invece descritto alcuni scenari utente e il percorso di migrazione consigliato.

Caso d'uso Consigli
Condivisione schermo getDisplayMedia e WebRTC ( demo)
Caricamento da un server locale per ridurre al minimo l'utilizzo della larghezza di banda XHR, recupero, flussi, service worker, API cache
Caricamento da un istanza locale di un'app web / Connessione a un'istanza locale di un'app web WebRTC
Chat WebSocket*
In tempo reale comunicazione audio/video WebRTC
Collaborazione WebSocket*
In tempo reale giochi multiplayer WebTransport** a meno che P2P, in questo caso WebRTC (o WebTransport su RTCIceTransport)
Streaming interattivo in tempo reale WebTransport**
Comunicazione con il server legacy Server proxy o middleware per la conversione del protocollo. Feedback per bit.ly/network-api-gaps

*: o WebTransport in futuro

**: per verificare la disponibilità, visita la pagina chromestatus