Guide de migration vers WebAssembly

Annonces d'abandon de (P)NaCl

Compte tenu de l'élan de la prise en charge de WebAssembly entre les navigateurs, nous prévoyons de concentrer nos efforts sur le code natif WebAssembly à l'avenir et de supprimer la prise en charge de PNaCl au quatrième trimestre 2019 (à l'exception des applications Chrome). Nous pensons que l'écosystème dynamique autour de WebAssembly le rend plus adapté aux nouvelles applications Web hautes performances et aux applications existantes, et que l'utilisation de PNaCl est suffisamment faible pour justifier son abandon.

À partir de Chrome 76, PNaCl sur le Web ouvert a été déplacé Phase d'évaluation, qui permet aux développeurs Web de s'inscrire et d'accéder à une fonctionnalité qui n'est pas activée par défaut. Il s'agit généralement d'une nouvelle fonctionnalité proposée, mais dans le cas présent, il s'agit d'une fonctionnalité en cours d'abandon. Les développeurs peuvent s'inscrire sur la console d'évaluation Origin Trial et reçoivent un jeton, qui peut être intégré dans une page et active la fonctionnalité sans que l'utilisateur ait besoin d'utiliser un indicateur. (Pour en savoir plus, consultez le guide associé.) L'essai devrait se poursuivre jusqu'à Chrome 78, soit jusqu'en décembre 2019 environ. Ce changement n'a pas d'incidence sur NaCl ou PNaCl dans les applications ou les extensions Chrome, ni sur l'attribut "enable-nacl". L'indicateur dans chrome://flags peut également être utilisé pour activer PNaCl en local à des fins de test. (cet indicateur conserve également sa fonction actuelle d'activation de NaCl "native" non-PNaCl sur n'importe quelle page).

Nous avons également récemment annoncé l'abandon des applications Chrome en dehors de ChromeOS au premier trimestre 2018.

Migration de la chaîne d'outils

Pour la plupart des cas d'utilisation de (P)NaCl, nous vous recommandons de passer du SDK NaCl à Emscripten. La migration est susceptible d'être relativement simple si votre application est portable vers Linux, utilise SDL ou des API POSIX. Bien que l'assistance directe pour les API NaCl / Pepper ne soit pas disponible, nous avons tenté de lister les API Web équivalentes. Pour les cas de port plus difficiles, veuillez nous contacter sur native-client-discuss@googlegroups.com.

Migration de l'API

Nous avons indiqué ici l'état des substituts de la plate-forme Web pour chaque des API exposées à la (P)NaCl. En outre, le tableau liste la bibliothèque ou l'option dans Emscripten. qui offre le substitut le plus proche.

Nous prévoyons d'ajouter la prise en charge des threads de mémoire partagée à WebAssembly en 2017, car les fils de discussion sont essentiels pour faire correspondre l'utilisation la plus intéressante de (P)NaCl cas d'utilisation. Éléments de migration qui supposent la compatibilité des threads à venir sont indiquées ci-dessous. Si le contrôle de flux de votre application repose en grande partie sur le blocage API, vous constaterez peut-être que la prise en charge des threads est nécessaire pour faciliter le portage.

Même si nous nous sommes efforcés d'être précis dans ce tableau, qu'il ne fait aucun doute d'erreurs ou d'omissions. Si vous en rencontrez un, veuillez nous contacter au native-client-discuss@googlegroups.com

PPAPI

PPB_Audio

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer x SDL (partiel) GAP (partiel) : équivalence approximative d'AudioWorkletNode AudioWorkletSpec est terminé, mais AudioDeviceClient est peut-être plus adapté à cette API. La communauté est toujours en train de spécifier AudioDeviceClient. Le Worklet n'est peut-être pas l'équivalent approximatif de cette API.
GetCurrentConfig SDL AudioContext.* (renvoie les paramètres transmis)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetTimestamp SDL AudioBufferSourceNode.start (paramètre) Transmis à chaque fois au lieu d'être associé au tampon.
SetTimestamp SDL AudioBufferSourceNode.start (paramètre)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP : WebAudio n'utilise que des nombres à virgule flottante 32 bits, PPAPI utilise des entiers 16 bits. PPAPI accepte théoriquement plusieurs tailles d'échantillonnage. En pratique, il n'accepte que les échantillons 16 bits. Malheureusement, les développeurs ont demandé des tailles d'échantillon de 16 bits afin de réduire l'utilisation de la mémoire. La prochaine version de la spécification Web Audio sera compatible avec les échantillons 16 bits. Une optimisation pour AudioBuffer peut être mise en œuvre comme pour Firefox en utilisant un tampon 16 bits pour le contenu audio provenant de decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Méthode PPAPI Suppose des threads Emscripten API Web Limites
CreateStereo16Bit GAP GAP : seuls les échantillons de nombres à virgule flottante 32 bits sont acceptés La prochaine version de la spécification Web Audio sera compatible avec les échantillons 16 bits.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (à partir de la construction par défaut) Par défaut, le taux d'échantillonnage préféré d'un AudioContext correspond au taux d'échantillonnage réel de l'appareil audio matériel.
RecommendSampleFrameCount GAP GAP : serait géré avec le Client AudioDeviceClient prévu Un problème est en cours pour permettre une taille spécifiée par l'utilisateur, mais il est encore en cours de définition. Pour ce faire, utilisez AudioDeviceClient, qui vous indique la taille adaptée au matériel donné.

PPB_Console

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Journal utime console.log/warn/error/...
LogWithSource GAP GAP L'API Console est considérée comme une solution de remplacement suffisamment complète, sauf si des cas d'utilisation spécifiques sont signalés par les développeurs pour la fonctionnalité fournie par LogWithSource. Les cartes sources DevTools peuvent être utilisées pour déboguer le code JavaScript transcompilé dans sa langue source d'origine.

PPB_Core

Méthode PPAPI Suppose des threads Emscripten API Web Limites
getTime utime nouveau Date().getTime()
getTimeTicks utime nouveau Date().getTime()
IsMainThread GAP window.document !== undefined
CallOnMainThread GAP Worker.postMessage + Atomics.wait Vous pouvez créer une synchronisation équivalente.

PPB_FileIO

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer FS (partiel) window.chooseFileSystemEntries() Les pièces "Créer" et "Ouvrir" sont utilisées différemment, mais elles ont la même puissance.
Ouvrir SF (partielle) window.chooseFileSystemEntries()
Requête SF (partielle) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (partial) : vous pouvez également utiliser Blob.type pour vérifier le type MIME. Le type du système de fichiers, l'heure de création et l'heure du dernier accès ne peuvent pas être déterminés avec l'API Native File System.
Toucher SF (partielle) FileSystemDirectoryHandle.getFile("name", {create: true})
Lire FS (partiel) Blob.slice().arrayBuffer()
Écriture SF (partielle) FileSystemWriter.write()
SetLength FS (partiel) FileSystemWriter.truncate()
Vider GAP (partielle) GAP (partiel) : les fichiers sont effacés lorsque FileSystemWrite.close() est appelé C'est normal, car les fichiers de l'API Native File System sont exposés au système d'exploitation. Par conséquent, une vérification de la navigation sécurisée doit être effectuée avant que les données ne soient présentées à l'OS.
Fermer SF (partielle) FileSystemWriter.close() N'annule pas les opérations en attente, mais vide les données écrites jusqu'à présent sur le disque.
ReadToArray GAP Blob.slice().arrayBuffer() ou Blob.arrayBuffer() Autorise plusieurs lectures de sous-plages en parallèle.

PPB_FileRef

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SF (partielle) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType SF (partielle) FileSystem.type
GetName SF (partielle) File.name
GetPath SF (partielle) GAP (partial) : avec l'API Native File System, le chemin relatif d'un fichier peut être déterminé à partir d'une référence à un répertoire qui contient le fichier à l'aide de FileSystemHandle.resolve(FileSystemHandle) Le chemin absolu d'un fichier ne peut pas être déterminé et l'utilisateur doit autoriser l'accès au répertoire contenant le fichier.
GetParent FS (partiel) BROKEN (partiel) : avec l'API Native File System, le chemin relatif d'un fichier peut être déterminé à partir d'une référence à un répertoire contenant le fichier à l'aide de FileSystemHandle.resolve(FileSystemHandle) L'utilisateur doit accorder l'autorisation d'accéder au répertoire contenant le fichier.
MakeDirectory SF (partielle) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Toucher SF (partielle) FileSystemDirectoryHandle.getFile("name", {create: true}) La date et l'heure de modification peuvent être modifiées par écrit.
Supprimer FS (partiel) FileSystemDirectoryHandle.removeEntry() Contrairement à la PPAPI, les répertoires ne doivent pas être vides.
Renommer FS (partiel) Espace négatif (partiel) : avec l'API Native File System, le fichier peut être écrit avec le nouveau nom à l'aide d'une combinaison de FileSystemFileHandle.getFile() pour le nouveau nom et FileSystemFileHandle.createWriter().write() avec le contenu de l'ancien fichier. Ensuite, FileSystemDirectoryHandle.removeEntry() pour supprimer l'ancien fichier. Aucune API directe ne permet d'effectuer cette opération en une seule étape dans l'API Native File System.
Requête GAP (partielle) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (partiel) : Blob.type peut également être utilisé pour vérifier le type MIME. Le type du système de fichiers, l'heure de création et l'heure du dernier accès ne peuvent pas être déterminés avec l'API Native File System.
ReadDirectoryEntries FS (partiel) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SF (partielle) window.requestFileSystem L'API JavaScript effectue les deux opérations en une seule étape.
Ouvrir GAP window.requestFileSystem L'API JavaScript effectue les deux opérations en une seule étape.
GetType GAP FileSystem.type

PPB_Fullscreen

Méthode PPAPI Suppose des threads Emscripten API Web Limites
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Échantillon SDL Manette de jeu*. L'objet Gamepad expose un code temporel relatif à navigationStart. Il est mis à jour lorsque les données sont reçues depuis le matériel https://www.w3.org/TR/gamepad/#gamepad-interface.

PPB_Graphics2D

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL Canvas.getContext('2d')
Décrire SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Faire défiler GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (partiel) : peut être implémenté en dessinant le canevas sur lui-même, avec un décalage, à l'aide de drawImage, puis en remplissant le reste.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Vider GAP Aucun équivalent direct GAP (partielle) – Il y a toujours un vidage implicite à la fin du code de dessin. c'est peu probable à modifier. Cependant, la combinaison de OffscreenCanvas et <ph type="x-smartling-placeholder"></ph> ImageBitmapRenderingContext fournissent des fonctionnalités similaires.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (partial) : l'exposition d'OpenGL ES 3.0 par WebGL 2.0 et Emscripten prend en charge des tampons de trame multi-échantillonnés définis par l'utilisateur, dans lesquels tous les paramètres configurables via PPAPI peuvent être définis.
Créer 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 Aucun équivalent direct GAP (partielle) – Il y a toujours un vidage implicite à la fin du code de dessin. c'est peu probable à modifier. Cependant, la combinaison de OffscreenCanvas et <ph type="x-smartling-placeholder"></ph> ImageBitmapRenderingContext offrent des fonctionnalités similaires.

PPB_ImageData

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetNativeImageDataFormat SDL ImageData exige une commande RVBA
IsImageDataFormatSupported SDL ImageData exige une commande RVBA
Créer SDL CanvasRenderingContext2d.createImageData
Décrire SDL ImageData n'a jamais de foulée
Carte SDL ImageData.data
Annuler le mappage SDL ImageData.data

PPB_InputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
RequestInputEvents SDL Aucun équivalent direct L'absence de cette fonctionnalité est probablement moins pertinente, car JS/Wasm s'exécute sur le thread principal et peut filtrer les événements plus économiquement sans entraîner de va-et-vient entre les processus.
RequestFilteringInputEvents SDL Événements mouse* key* wheel* touch* composition*
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Descendants de la classe d'événement
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL dblclick ou "mousedown" Événements
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP : deltaMode contient en quelque sorte ces informations, mais de manière incomplète. Une discussion est en cours sur l'implémentation d'une API WheelEvent.deltaMode : https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP : deltaMode contient en quelque sorte ces informations, mais de manière incomplète. Il y a une discussion sur l'implémentation d'une API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifier (pour le savoir vous-même)

PPB_IMEInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - No direct equivalent Ces données peuvent être récupérées à partir de CompositionEvent.data.
GetSegmentOffset GAP GAP - No direct equivalent
GetTargetSegment GAP GAP - Aucun équivalent direct
GetSelection GAP GAP - Aucun équivalent direct

PPB_Instance

Méthode PPAPI Suppose des threads Emscripten API Web Limites
BindGraphics SDL Canvas.getContext (la fonctionnalité de liaison est automatique).
IsFullFrame GAP GAP : pas d'équivalent aux gestionnaires de types MIME. Les applications NaCl peuvent être enregistrées pour gérer un type MIME particulier et être propriétaires de l'ensemble du document.
DidCreate N/A <Element>[clé] L'accès général au DOM vous permet de récupérer des attributs de balises
DidDestroy N/A N/A Non déclenché pour NaCl
DidChangeView N/A Événement "resize" de l'élément
DidChangeFocus N/A Élément "focus", "focusin", "focusout" Événements
HandleDocumentLoad N/A GAP : impossible de s'inscrire en tant que gestionnaire de type MIME Les modules NaCl via des applications et une entrée de fichier manifeste peuvent être configurés pour gérer des types mime particuliers.

PPB_MediaStreamAudioTrack

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Configurer GAP getUserMedia() Les contraintes de getUserMedia() peuvent fournir les valeurs de configuration à utiliser dans MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP : aucun équivalent
RecycleBuffer GAP GAP - Aucun équivalent
Fermer GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP Capture de canevas Canvas Capture permet d'intégrer des images vidéo par programmation.
Configurer GAP applyConstraints(), getUserMedia() GAP (partielle) : le nombre de configurations disponibles dans l'API Web peut être différent de celui disponible dans l'API protégeant la confidentialité.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP : aucun équivalent de PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream ne peut pas être préchargé et ne sera donc jamais mis en mémoire tampon: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP : aucun équivalent à PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP - Aucun équivalent
RecycleFrame GAP GAP - Aucun équivalent
Fermer GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP : aucun équivalent
PutFrame GAP GAP - Aucun équivalent

PPB_MessageLoop

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
GetForMainThread N/A La plupart du temps, les nœuds de calcul reçoivent une boucle d'événements implicite.
GetCurrent N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
AttachToCurrentThread N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
Exécuter N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
PostWork N/A La plupart du temps, les nœuds de calcul reçoivent une boucle d'événements implicite.
PostQuit N/A La plupart du temps, les nœuds de calcul reçoivent une boucle d'événements implicite.

PPB_Messaging

Méthode PPAPI Suppose des threads Emscripten API Web Limites
PostMessage N/A Window.postMessage
RegisterMessageHandler N/A Window.addEventListener
UnregisterMessageHandler N/A Window.removeEventListener

PPB_MouseCursor

Méthode PPAPI Suppose des threads Emscripten API Web Limites
SetCursor SDL Element.style.cursor Le même ensemble de curseurs d'actions est accepté. Les curseurs personnalisés peuvent être créés avec url(..). Les curseurs personnalisés dynamiques peuvent être créés avec des URI de données. CSS3 permet de spécifier le point d'accès.

PPB_MouseLock

Méthode PPAPI Suppose des threads Emscripten API Web Limites
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Plusieurs méthodes OpenGLES Fonctionnalité proche de celle de WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Méthode PPAPI Suppose des threads Emscripten API Web Limites
SetTextInputType GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie Certains développeurs aimeraient pouvoir donner des indices de cette manière, ou de préférence intercepter et afficher les événements/sorties IME en ligne dans un canevas.
UpdateCaretPosition GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie https://www.w3.org/TR/ime-api/

PPB_URLLoader

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind new XMLHttpRequest()
Ouvrir embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP - Aucun équivalent XMLHTTPRequest
GetUploadProgress embind "progress" de XMLHttpRequest Événement
GAP FetchObserver pas encore spécifiée ni implémentée ; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind "progress" de XMLHttpRequest Événement
GAP FetchObserver Pas encore spécifié ni implémenté : https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Extraire la réponse*.
ReadResponseBody embind XMLHttpRequest.response
embind Body.* (La réponse est un corps)
FinishStreamingToFile embind GAP - No direct equivalent XMLHttpRequest et Fetch partent du principe qu'un flux est envoyé en mémoire plutôt que directement dans un espace de stockage.
Fermer embind XMLHttpRequest.abort
GAP API Fetch : AbortSignal et AbortController

PPB_URLRequestInfo

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind XMLHttpRequest
embind Requête de récupération
SetProperty GAP GAP : aucun équivalent direct pour XMLHttpRequest XMLHttpRequest ne permet pas directement de limiter par requête une redirection après redirection, un flux vers un fichier, ou encore une règle concernant l'URL de provenance ou les identifiants.
embind Requête.*
AppendDataToBody embind XMLHttpRequest.send GAP : les deux doivent comporter l'intégralité du corps, et non un fragment.
embind récupérer(.., options:corps)
AppendFileToBody GAP Streaming d'importation fetch() https://www.chromestatus.com/features/5274139738767360
N/A &lt;form&gt; Vous pouvez également lire avec FileReader et importer, mais c'est plus comme AppendDataToBody.

PPB_URLResponseInfo

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetProperty embind XMLHttpRequest.getAllResponseHeaders et autres
embind Extraire la réponse*
GetBodyAsFileRef embind Récupérer la réponse (corps) .blob() Suppose que la couche de stockage optimise le transfert.

PPB_Var

Méthode PPAPI Suppose des threads Emscripten API Web Limites
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/A N/A
VarToResource N/A N/A

PPB_VarArray

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Télécharger embind tableau[i]
Prêt ? embind tableau[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind nouveau ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Carte GAP GAP - Aucun équivalent direct Les modules Asm.js / Wasm ne peuvent pas mapper les régions d'un objet ArrayBuffer autres que leur tas de mémoire linéaire unique. La mise en correspondance de plusieurs mémoires ou de plusieurs mémoires peut améliorer ce processus.
Annuler le mappage GAP GAP - No direct equivalent

PPB_VarDictionary

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind {}
Télécharger embind <Object>[i]
Prêt ? embind <Objet>[i] = x
Supprimer embind supprimer <Object>[i]
HasKey embind x dans <Object>
GetKeys embind for (k in <Object>) {} Il n'existe pas d'équivalent littéral, mais il peut être créé.

PPB_VideoDecoder

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide de VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Initialiser GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide des paramètres d'initialisation 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 : serait géré avec l'API WebCodecs proposée à l'aide de 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 : serait géré avec l'API WebCodecs proposée à l'aide de 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 : Serait géré avec l'API WebCodecs proposée. La conception actuelle recycle automatiquement les images et fait avancer le processus de décodage. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Vider GAP GAP : Serait géré avec l'API WebCodecs proposée. L'API s'appellera Flush(), mais des discussions sont encore en cours sur la façon dont elle sera séquencée par rapport aux appels de décodage. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Réinitialiser GAP GAP : serait géré avec l'API WebCodecs proposée en détruisant l'instance VideoDecoder et en en créant une autre. Cette méthode ne sera pas aussi efficace qu'une méthode de réinitialisation dédiée, mais la sémantique d'une API Reset() est toujours en cours de discussion. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP GAP : serait géré avec l'API WebCodecs proposée à l'aide de VideoEncoder().
GetSupportedProfiles GAP GAP (partiel) - navigator.mediaCapabilities.encodingInfo() Les profils compatibles doivent être vérifiés un par un.
Initialiser GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide des paramètres d'initialisation VideoEncoder()
GetFramesRequired GAP GAP : aucun équivalent Il est peu probable que le pool de cadres utilisé en interne par l'API Web Codecs soit exposé.
GetFrameCodedSize GAP GAP : aucun équivalent Il est peu probable que le pool de cadres utilisé en interne par l'API Web Codecs soit exposé.
GetVideoFrame GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide de ReadableStream.pipeThrough(VideoEncoder). Cela encoderait directement les données dans le flux lisible au lieu de saisir un seul frame à remplir de données avant l'encodage.
Encoder GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide de ReadableStream.pipeThrough(VideoEncoder)
GetBitstreamBuffer GAP GAP : Serait géré avec l'API WebCodecs proposée. La conception actuelle passe automatiquement par le tampon de flux de bits encodé qui transite. L'API WebCodecs suppose actuellement que le tampon de flux de bits peut être copié plutôt que mis en commun. Il n'a donc pas besoin d'être recyclé.
RecycleBitstreamBuffer GAP GAP : Serait géré avec l'API WebCodecs proposée. La conception actuelle recycle automatiquement le tampon pour poursuivre le processus d'encodage. Il est peu probable que cela change à l'avenir, car les conséquences sur les performances sont moins importantes.
RequestEncodingParametersChange GAP GAP : serait géré par la proposition d'API Web Codecs. Certains paramètres peuvent être modifiés instantanément, tandis que d'autres nécessitent la destruction de l'encodeur.
Fermer GAP GAP : serait géré avec l'API WebCodecs proposée à l'aide de VideoEncoder.Close().

PPB_VideoFrame

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetTimestamp GAP GAP : Serait géré avec l'API WebCodecs proposée.
SetTimestamp GAP GAP : Serait géré avec l'API WebCodecs proposée.
GetFormat GAP GAP : Serait géré avec l'API WebCodecs proposée.
GetSize GAP GAP : Serait géré avec l'API WebCodecs proposée.
GetDataBuffer GAP GAP : sera géré avec l'API WebCodecs proposée.
GetDataBufferSize GAP GAP : Serait géré avec l'API WebCodecs proposée.

PPB_View

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Concerne le document et non un seul élément.
IsVisible embind IntersectionObserver
IsPageVisible embind document.visibilityState
GetClipRect embind IntersectionObserver
GetDeviceScale embind window.devicePixelRatio
GetCSSScale embind <Élément>.getBoundingClientRect().width / <Element>.offsetWidth
GetScrollOffset embind <Element>.scrollTop / <Element>.scrollLeft

PPB_WebSocket

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP WebSocket.WebSocket
Connecter GAP WebSocket.WebSocket(url, ...) Événement WebSocket "open"
Fermer GAP WebSocket.close
ReceiveMessage GAP Événement "message" WebSocket Événement "error" WebSocket Événement "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

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Graphics3DContextLost SDL Canevas "webglcontextlost" Événement

PPP_InputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Méthode PPAPI Suppose des threads Emscripten API Web Limites
DidCreate N/A <Element>[clé] L'accès général au DOM vous permet de récupérer des attributs de balises
DidDestroy N/A N/A Non déclenché pour NaCl
DidChangeView N/A Événement "resize" de l'élément
DidChangeFocus N/A Élément "focus", "focusin", "focusout" Événements
HandleDocumentLoad N/A GAP - No way to register as a mime type handler Les modules NaCl via des applications et une entrée de fichier manifeste peuvent être configurés pour gérer des types mime particuliers.

PPP_MessageHandler

Méthode PPAPI Suppose des threads Emscripten API Web Limites
HandleMessage embind Événement "message" de MessagePort Événement "message" de la fenêtre
HandleBlockingMessage N/A GAP - Aucun équivalent direct Une synchronisation similaire peut être effectuée en dehors du thread principal à l'aide d'Atomics.wait. Ajouté pour permettre l'émulation d'API de plug-ins synchrones.

PPP_Messaging

Méthode PPAPI Suppose des threads Emscripten API Web Limites
HandleMessage embind MessagePort "message" Événement Fenêtre "message" Événement

PPP_MouseLock

Méthode PPAPI Suppose des threads Emscripten API Web Limites
MouseLockLost SDL Élément "pointerlockchange", "pointerlockerror" Événements

IRT

PPB_Audio

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer x SDL (partiel) GAP (partiel) : équivalence approximative d'AudioWorkletNode AudioWorkletSpec est terminé, mais AudioDeviceClient est peut-être plus adapté à cette API. La communauté est toujours en train de spécifier AudioDeviceClient. Le Worklet n'est peut-être pas l'équivalent approximatif de cette API.
GetCurrentConfig SDL AudioContext.* (renvoie les paramètres transmis)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetTimestamp SDL AudioBufferSourceNode.start (paramètre) Transmis à chaque fois au lieu d'être associé au tampon.
SetTimestamp SDL AudioBufferSourceNode.start (paramètre)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP : WebAudio n'utilise que des nombres à virgule flottante 32 bits, PPAPI utilise des entiers 16 bits. PPAPI accepte théoriquement plusieurs tailles d'échantillonnage. En pratique, il n'accepte que les échantillons 16 bits. Malheureusement, les développeurs ont demandé des tailles d'échantillon de 16 bits afin de réduire l'utilisation de la mémoire. La prochaine version de la spécification Web Audio sera compatible avec les échantillons 16 bits. Une optimisation pour AudioBuffer peut être mise en œuvre comme pour Firefox en utilisant un tampon 16 bits pour le contenu audio provenant de decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Méthode PPAPI Suppose des threads Emscripten API Web Limites
CreateStereo16Bit GAP GAP : seuls les échantillons de nombres à virgule flottante 32 bits sont acceptés La prochaine version de la spécification Web Audio sera compatible avec les échantillons 16 bits.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (à partir de la construction par défaut) Par défaut, le taux d'échantillonnage préféré d'un AudioContext correspond au taux d'échantillonnage réel de l'appareil audio matériel.
RecommendSampleFrameCount GAP GAP : serait géré avec le Client AudioDeviceClient prévu Un problème est en cours pour permettre une taille spécifiée par l'utilisateur, mais il est encore en cours de définition. Pour ce faire, utilisez AudioDeviceClient, qui vous indique la taille adaptée au matériel donné.

PPB_Console

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Journal utime console.log/warn/error/...
LogWithSource GAP GAP L'API Console est considérée comme une solution de remplacement suffisamment complète, sauf si des cas d'utilisation spécifiques sont signalés par les développeurs pour la fonctionnalité fournie par LogWithSource. Les cartes sources DevTools peuvent être utilisées pour déboguer le code JavaScript transcompilé dans sa langue source d'origine.

PPB_Core

Méthode PPAPI Suppose des threads Emscripten API Web Limites
getTime utime nouveau Date().getTime()
getTimeTicks utime nouveau Date().getTime()
IsMainThread GAP window.document !== undefined
CallOnMainThread GAP Worker.postMessage + Atomics.wait Vous pouvez créer une synchronisation équivalente.

PPB_FileIO

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer FS (partiel) window.chooseFileSystemEntries() Les pièces "Créer" et "Ouvrir" sont utilisées différemment, mais elles ont la même puissance.
Ouvrir SF (partielle) window.chooseFileSystemEntries()
Requête SF (partielle) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (partial) : vous pouvez également utiliser Blob.type pour vérifier le type MIME. Le type du système de fichiers, l'heure de création et l'heure du dernier accès ne peuvent pas être déterminés avec l'API Native File System.
Toucher SF (partielle) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
Lire FS (partiel) Blob.slice().arrayBuffer()
Écriture SF (partielle) FileSystemWriter.write()
SetLength FS (partiel) FileSystemWriter.truncate()
Vider GAP (partielle) GAP (partiel) : les fichiers sont effacés lorsque FileSystemWrite.close() est appelé C'est normal, car les fichiers de l'API Native File System sont exposés au système d'exploitation. Par conséquent, une vérification de la navigation sécurisée doit être effectuée avant que les données ne soient présentées à l'OS.
Fermer SF (partielle) FileSystemWriter.close() N'annule pas les opérations en attente, mais vide les données écrites jusqu'à présent sur le disque.
ReadToArray GAP Blob.slice().arrayBuffer() ou Blob.arrayBuffer() Autorise plusieurs lectures de sous-plages en parallèle.

PPB_FileRef

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SF (partielle) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType SF (partielle) FileSystem.type
GetName SF (partielle) File.name
GetPath SF (partielle) GAP (partial) : avec l'API Native File System, le chemin relatif d'un fichier peut être déterminé à partir d'une référence à un répertoire qui contient le fichier à l'aide de FileSystemHandle.resolve(FileSystemHandle) Le chemin absolu d'un fichier ne peut pas être déterminé et l'utilisateur doit autoriser l'accès au répertoire contenant le fichier.
GetParent FS (partiel) BROKEN (partiel) : avec l'API Native File System, le chemin relatif d'un fichier peut être déterminé à partir d'une référence à un répertoire contenant le fichier à l'aide de FileSystemHandle.resolve(FileSystemHandle) L'utilisateur doit accorder l'autorisation d'accéder au répertoire contenant le fichier.
MakeDirectory SF (partielle) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Toucher SF (partielle) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true}) La date et l'heure de modification peuvent être modifiées par écrit.
Supprimer FS (partiel) FileSystemDirectoryHandle.removeEntry() Contrairement à la PPAPI, les répertoires ne doivent pas être vides.
Renommer FS (partiel) Espace négatif (partiel) : avec l'API Native File System, le fichier peut être écrit avec le nouveau nom à l'aide d'une combinaison de FileSystemFileHandle.getFile() pour le nouveau nom et FileSystemFileHandle.createWriter().write() avec le contenu de l'ancien fichier. Ensuite, FileSystemDirectoryHandle.removeEntry() pour supprimer l'ancien fichier. Aucune API directe ne permet d'effectuer cette opération en une seule étape dans l'API Native File System.
Requête GAP (partielle) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (partiel) : Blob.type peut également être utilisé pour vérifier le type MIME. Le type du système de fichiers, l'heure de création et l'heure du dernier accès ne peuvent pas être déterminés avec l'API Native File System.
ReadDirectoryEntries FS (partiel) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SF (partielle) window.requestFileSystem L'API JavaScript effectue les deux opérations en une seule étape.
Ouvrir GAP window.requestFileSystem L'API JavaScript effectue les deux opérations en une seule étape.
GetType GAP FileSystem.type

PPB_Fullscreen

Méthode PPAPI Suppose des threads Emscripten API Web Limites
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Échantillon SDL Manette de jeu*. L'objet Gamepad expose un code temporel relatif à navigationStart. Il est mis à jour lorsque les données sont reçues depuis le matériel https://www.w3.org/TR/gamepad/#gamepad-interface.

PPB_Graphics2D

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL Canvas.getContext('2d')
Décrire SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Faire défiler GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (partiel) : peut être implémenté en dessinant le canevas sur lui-même, avec un décalage, à l'aide de drawImage, puis en remplissant le reste.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Vider GAP Aucun équivalent direct GAP (partielle) – Il y a toujours un vidage implicite à la fin du code de dessin. c'est peu probable à modifier. Cependant, la combinaison de OffscreenCanvas et <ph type="x-smartling-placeholder"></ph> ImageBitmapRenderingContext fournissent des fonctionnalités similaires.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (partial) : l'exposition d'OpenGL ES 3.0 par WebGL 2.0 et Emscripten prend en charge des tampons de trame multi-échantillonnés définis par l'utilisateur, dans lesquels tous les paramètres configurables via PPAPI peuvent être définis.
Créer 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 Aucun équivalent direct GAP (partielle) – Il y a toujours un vidage implicite à la fin du code de dessin. c'est peu probable à modifier. Cependant, la combinaison de OffscreenCanvas et <ph type="x-smartling-placeholder"></ph> ImageBitmapRenderingContext offrent des fonctionnalités similaires.

PPB_ImageData

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetNativeImageDataFormat SDL ImageData exige une commande RVBA
IsImageDataFormatSupported SDL ImageData exige une commande RVBA
Créer SDL CanvasRenderingContext2d.createImageData
Décrire SDL ImageData n'a jamais de foulée
Carte SDL ImageData.data
Annuler le mappage SDL ImageData.data

PPB_InputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
RequestInputEvents SDL Aucun équivalent direct L'absence de cette fonctionnalité est probablement moins pertinente, car JS/Wasm s'exécute sur le thread principal et peut filtrer les événements plus économiquement sans entraîner de va-et-vient entre les processus.
RequestFilteringInputEvents SDL Événements mouse* key* wheel* touch* composition*
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Descendants de la classe d'événement
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL dblclick ou "mousedown" Événements
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP : deltaMode contient en quelque sorte ces informations, mais de manière incomplète. Une discussion est en cours sur l'implémentation d'une API WheelEvent.deltaMode : https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP : deltaMode contient en quelque sorte ces informations, mais de manière incomplète. Il y a une discussion sur l'implémentation d'une API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifier (pour le savoir vous-même)

PPB_IMEInputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - No direct equivalent Ces données peuvent être récupérées à partir de CompositionEvent.data.
GetSegmentOffset GAP GAP - No direct equivalent
GetTargetSegment GAP GAP - Aucun équivalent direct
GetSelection GAP GAP - Aucun équivalent direct

PPB_Instance

Méthode PPAPI Suppose des threads Emscripten API Web Limites
BindGraphics SDL Canvas.getContext (la fonctionnalité de liaison est automatique).
IsFullFrame GAP GAP : pas d'équivalent aux gestionnaires de types MIME. Les applications NaCl peuvent être enregistrées pour gérer un type MIME particulier et être propriétaires de l'ensemble du document.
DidCreate N/A <Element>[clé] L'accès général au DOM vous permet de récupérer des attributs de balises
DidDestroy N/A N/A Non déclenché pour NaCl
DidChangeView N/A Événement "resize" de l'élément
DidChangeFocus N/A Élément "focus", "focusin", "focusout" Événements
HandleDocumentLoad N/A GAP : impossible de s'inscrire en tant que gestionnaire de type MIME Les modules NaCl via des applications et une entrée de fichier manifeste peuvent être configurés pour gérer des types mime particuliers.

PPB_MediaStreamAudioTrack

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Configurer GAP getUserMedia() Les contraintes de getUserMedia() peuvent fournir les valeurs de configuration à utiliser dans MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP : aucun équivalent
RecycleBuffer GAP GAP - Aucun équivalent
Fermer GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP Capture de canevas Canvas Capture permet d'intégrer des images vidéo par programmation.
Configurer GAP applyConstraints(), getUserMedia() GAP (partielle) : le nombre de configurations disponibles dans l'API Web peut être différent de celui disponible dans l'API protégeant la confidentialité.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP : aucun équivalent de PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream ne peut pas être préchargé et ne sera donc jamais mis en mémoire tampon: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP : aucun équivalent à PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP - Aucun équivalent
RecycleFrame GAP GAP - Aucun équivalent
Fermer GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP : aucun équivalent
PutFrame GAP GAP - Aucun équivalent

PPB_MessageLoop

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
GetForMainThread N/A La plupart du temps, les nœuds de calcul reçoivent une boucle d'événements implicite.
GetCurrent N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
AttachToCurrentThread N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
Exécuter N/A En grande partie sans objet, les nœuds de calcul reçoivent une boucle d'événements implicite.
PostWork N/A La plupart du temps, les nœuds de calcul reçoivent une boucle d'événements implicite.
PostQuit N/A La plupart du temps, les nœuds de calcul reçoivent une boucle d'événements implicite.

PPB_Messaging

Méthode PPAPI Suppose des threads Emscripten API Web Limites
PostMessage N/A Window.postMessage
RegisterMessageHandler N/A Window.addEventListener
UnregisterMessageHandler N/A Window.removeEventListener

PPB_MouseCursor

Méthode PPAPI Suppose des threads Emscripten API Web Limites
SetCursor SDL Element.style.cursor Le même ensemble de curseurs d'actions est accepté. Les curseurs personnalisés peuvent être créés avec url(..). Les curseurs personnalisés dynamiques peuvent être créés avec des URI de données. CSS3 permet de spécifier le point d'accès.

PPB_MouseLock

Méthode PPAPI Suppose des threads Emscripten API Web Limites
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Plusieurs méthodes OpenGLES Fonctionnalité proche de celle de WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Méthode PPAPI Suppose des threads Emscripten API Web Limites
SetTextInputType GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie Certains développeurs aimeraient pouvoir donner des indices de cette manière, ou de préférence intercepter et afficher les événements/sorties IME en ligne dans un canevas.
UpdateCaretPosition GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP – Peut être rempli par l'API de l'éditeur du mode de saisie https://www.w3.org/TR/ime-api/

PPB_URLLoader

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind new XMLHttpRequest()
Ouvrir embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP - Aucun équivalent XMLHTTPRequest
GetUploadProgress embind "progress" de XMLHttpRequest Événement
GAP FetchObserver pas encore spécifiée ni implémentée ; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind "progress" de XMLHttpRequest Événement
GAP FetchObserver Pas encore spécifié ni implémenté : https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Extraire la réponse*.
ReadResponseBody embind XMLHttpRequest.response
embind Body.* (La réponse est un corps)
FinishStreamingToFile embind GAP - No direct equivalent XMLHttpRequest et Fetch partent du principe qu'un flux est envoyé en mémoire plutôt que directement dans un espace de stockage.
Fermer embind XMLHttpRequest.abort
GAP API Fetch : AbortSignal et AbortController

PPB_URLRequestInfo

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind XMLHttpRequest
embind Requête de récupération
SetProperty GAP GAP : aucun équivalent direct pour XMLHttpRequest XMLHttpRequest ne permet pas directement de limiter par requête une redirection après redirection, un flux vers un fichier, ou encore une règle concernant l'URL de provenance ou les identifiants.
embind Requête.*
AppendDataToBody embind XMLHttpRequest.send GAP : les deux doivent comporter l'intégralité du corps, et non un fragment.
embind récupérer(.., options:corps)
AppendFileToBody GAP Streaming d'importation fetch() https://www.chromestatus.com/features/5274139738767360
N/A &lt;form&gt; Vous pouvez également lire avec FileReader et importer, mais c'est plus comme AppendDataToBody.

PPB_URLResponseInfo

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetProperty embind XMLHttpRequest.getAllResponseHeaders et autres
embind Extraire la réponse*
GetBodyAsFileRef embind Récupérer la réponse (corps) .blob() Suppose que la couche de stockage optimise le transfert.

PPB_Var

Méthode PPAPI Suppose des threads Emscripten API Web Limites
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/A N/A
VarToResource N/A N/A

PPB_VarArray

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Télécharger embind tableau[i]
Prêt ? embind tableau[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind nouveau ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Carte GAP GAP - Aucun équivalent direct Les modules Asm.js / Wasm ne peuvent pas mapper les régions d'un objet ArrayBuffer autres que leur tas de mémoire linéaire unique. La mise en correspondance de plusieurs mémoires ou de plusieurs mémoires peut améliorer ce processus.
Annuler le mappage GAP GAP - No direct equivalent

PPB_VarDictionary

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer embind {}
Télécharger embind <Object>[i]
Prêt ? embind <Objet>[i] = x
Supprimer embind supprimer <Object>[i]
HasKey embind x dans <Object>
GetKeys embind for (k in <Object>) {} Il n'existe pas d'équivalent littéral, mais il peut être créé.

PPB_VideoDecoder

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide de VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Initialiser GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide des paramètres d'initialisation 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 : serait géré avec l'API WebCodecs proposée à l'aide de 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 : serait géré avec l'API WebCodecs proposée à l'aide de 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 : Serait géré avec l'API WebCodecs proposée. La conception actuelle recycle automatiquement les images et fait avancer le processus de décodage. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Vider GAP GAP : Serait géré avec l'API WebCodecs proposée. L'API s'appellera Flush(), mais des discussions sont encore en cours sur la façon dont elle sera séquencée par rapport aux appels de décodage. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Réinitialiser GAP GAP : serait géré avec l'API WebCodecs proposée en détruisant l'instance VideoDecoder et en en créant une autre. Cette méthode ne sera pas aussi efficace qu'une méthode de réinitialisation dédiée, mais la sémantique d'une API Reset() est toujours en cours de discussion. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP GAP : serait géré avec l'API WebCodecs proposée à l'aide de VideoEncoder().
GetSupportedProfiles GAP GAP (partiel) - navigator.mediaCapabilities.encodingInfo() Les profils compatibles doivent être vérifiés un par un.
Initialiser GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide des paramètres d'initialisation VideoEncoder()
GetFramesRequired GAP GAP : aucun équivalent Il est peu probable que le pool de cadres utilisé en interne par l'API Web Codecs soit exposé.
GetFrameCodedSize GAP GAP : aucun équivalent Il est peu probable que le pool de cadres utilisé en interne par l'API Web Codecs soit exposé.
GetVideoFrame GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide de ReadableStream.pipeThrough(VideoEncoder). Cela encoderait directement les données dans le flux lisible au lieu de saisir un seul frame à remplir de données avant l'encodage.
Encoder GAP GAP : sera géré avec l'API WebCodecs proposée à l'aide de ReadableStream.pipeThrough(VideoEncoder)
GetBitstreamBuffer GAP GAP : Serait géré avec l'API WebCodecs proposée. La conception actuelle passe automatiquement par le tampon de flux de bits encodé qui transite. L'API WebCodecs suppose actuellement que le tampon de flux de bits peut être copié plutôt que mis en commun. Il n'a donc pas besoin d'être recyclé.
RecycleBitstreamBuffer GAP GAP : Serait géré avec l'API WebCodecs proposée. La conception actuelle recycle automatiquement le tampon pour poursuivre le processus d'encodage. Il est peu probable que cela change à l'avenir, car les conséquences sur les performances sont moins importantes.
RequestEncodingParametersChange GAP GAP : serait géré par la proposition d'API Web Codecs. Certains paramètres peuvent être modifiés instantanément, tandis que d'autres nécessitent la destruction de l'encodeur.
Fermer GAP GAP : serait géré avec l'API WebCodecs proposée à l'aide de VideoEncoder.Close().

PPB_VideoFrame

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetTimestamp GAP GAP : Serait géré avec l'API WebCodecs proposée.
SetTimestamp GAP GAP : Serait géré avec l'API WebCodecs proposée.
GetFormat GAP GAP : Serait géré avec l'API WebCodecs proposée.
GetSize GAP GAP : Serait géré avec l'API WebCodecs proposée.
GetDataBuffer GAP GAP : sera géré avec l'API WebCodecs proposée.
GetDataBufferSize GAP GAP : Serait géré avec l'API WebCodecs proposée.

PPB_View

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Concerne le document et non un seul élément.
IsVisible embind IntersectionObserver
IsPageVisible embind document.visibilityState
GetClipRect embind IntersectionObserver
GetDeviceScale embind window.devicePixelRatio
GetCSSScale embind <Élément>.getBoundingClientRect().width / <Element>.offsetWidth
GetScrollOffset embind <Element>.scrollTop / <Element>.scrollLeft

PPB_WebSocket

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer GAP WebSocket.WebSocket
Connecter GAP WebSocket.WebSocket(url, ...) Événement WebSocket "open"
Fermer GAP WebSocket.close
ReceiveMessage GAP Événement "message" WebSocket Événement "error" WebSocket Événement "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

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Graphics3DContextLost SDL Canevas "webglcontextlost" Événement

PPP_InputEvent

Méthode PPAPI Suppose des threads Emscripten API Web Limites
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Méthode PPAPI Suppose des threads Emscripten API Web Limites
DidCreate N/A <Element>[clé] L'accès général au DOM vous permet de récupérer des attributs de balises
DidDestroy N/A N/A Non déclenché pour NaCl
DidChangeView N/A Événement "resize" de l'élément
DidChangeFocus N/A Élément "focus", "focusin", "focusout" Événements
HandleDocumentLoad N/A GAP - No way to register as a mime type handler Les modules NaCl via des applications et une entrée de fichier manifeste peuvent être configurés pour gérer des types mime particuliers.

PPP_MessageHandler

Méthode PPAPI Suppose des threads Emscripten API Web Limites
HandleMessage embind Événement "message" de MessagePort Événement "message" de la fenêtre
HandleBlockingMessage N/A GAP - Aucun équivalent direct Une synchronisation similaire peut être effectuée en dehors du thread principal à l'aide d'Atomics.wait. Ajouté pour permettre l'émulation d'API de plug-ins synchrones.

PPP_Messaging

Méthode PPAPI Suppose des threads Emscripten API Web Limites
HandleMessage embind MessagePort "message" Événement Fenêtre "message" Événement

PPP_MouseLock

Méthode PPAPI Suppose des threads Emscripten API Web Limites
MouseLockLost SDL Élément "pointerlockchange", "pointerlockerror" Événements

PPAPI (applications)

PPB_HostResolver

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer x GAP GAP (partielle) – Aucun équivalent direct
Résoudre x GAP GAP (partielle) – Aucun équivalent direct
GetCanonicalName x GAP GAP (partiel) – Aucun équivalent direct
GetNetAddressCount x GAP GAP (partielle) – Aucun équivalent direct
GetNetAddress x GAP GAP (partiel) – Aucun équivalent direct

PPB_NetAddress

Méthode PPAPI Suppose des threads Emscripten API Web Limites
CreateFromIPv4Address x GAP GAP (partiel) – Aucun équivalent direct
CreateFromIPv6Address x GAP GAP (partiel) – Aucun équivalent direct
GetFamily x GAP GAP (partiel) – Aucun équivalent direct
DescribeAsString x GAP GAP (partiel) – Aucun équivalent direct
DescribeAsIPv4Address x GAP GAP (partiel) – Aucun équivalent direct
DescribeAsIPv6Address x GAP GAP (partielle) – Aucun équivalent direct

PPB_NetworkList

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetCount x GAP GAP - Aucun équivalent direct
GetName x GAP GAP - No direct equivalent
GetType x GAP GAP - Aucun équivalent direct
GetState x GAP GAP - No direct equivalent
GetIpAddress x GAP GAP - Aucun équivalent direct
GetDisplayName x GAP GAP - No direct equivalent
GetMTU x GAP GAP - Aucun équivalent direct

PPB_NetworkMonitor

Méthode PPAPI Suppose des threads Emscripten API Web Limites
Créer x GAP GAP - Aucun équivalent direct
UpdateNetworkList x GAP GAP - Aucun équivalent direct

PPB_NetworkProxy

Méthode PPAPI Suppose des threads Emscripten API Web Limites
GetProxyForURL x GAP GAP - No direct equivalent

PPB_TCPSocket et PPB_UDPSocket

Il n'existe pas de mappage direct 1:1 pour la migration. Au lieu de cela, nous avons décrit certaines des scénarios utilisateur ci-dessous et le chemin de migration recommandé.

Cas d'utilisation Recommandations
Partage d'écran getDisplayMedia et WebRTC (démonstration)
Chargement à partir d'un serveur local pour minimiser l'utilisation de la bande passante API XHR, Fetch, Streams, Service Worker et Cache
Chargement à partir d'un instance locale d'une application Web / Connexion à une instance locale d'une application Web WebRTC
Chat WebSocket*
Communication audio/vidéo en temps réel WebRTC
Collaboration WebSocket*
Jeux multijoueurs en temps réel WebTransport**, sauf en cas de P2P, auquel cas WebRTC (ou WebTransport sur RTCIceTransport)
Streaming interactif en temps réel WebTransport**
Communication avec l'ancien serveur Serveur proxy ou middleware pour effectuer la conversion de protocole. Commentaires sur bit.ly/network-api-gaps

*: Ou WebTransport à l'avenir

**: consultez chromestatus pour connaître leur disponibilité.