Guia de migração do WebAssembly

Avisos de descontinuação do (P)NaCl

Considerando o impulso do suporte a vários navegadores do WebAssembly, planejamos concentrar nossos esforços de código nativo no WebAssembly e remover o suporte para PNaCl no 4º trimestre de 2019 (exceto para apps do Chrome). Acreditamos que a ecossistema em torno do WebAssembly o torna mais adequado para aplicativos novos e atuais de alto desempenho aplicativos da Web e que o uso do PNaCl seja baixo o suficiente para justificar a descontinuação.

A partir do Chrome 76, o PNaCl na Web aberta foi movido para um teste de origem, que é um mecanismo para que os desenvolvedores da Web se registrem e tenham acesso a um recurso que não está ativado por padrão. Geralmente, esse é um novo recurso proposto, mas, neste caso, é um recurso que está sendo descontinuado. Um desenvolvedor pode se registrar no Console de teste de origem. e receber um token, que pode ser incorporado a uma página e ativará o recurso sem que o usuário precise usar uma sinalização. Para mais detalhes, consulte o guia vinculado. O teste está programado para durar até o Chrome 78, aproximadamente até dezembro de 2019. Essa mudança não afeta o NaCl ou o PNaCl em apps ou extensões do Chrome, e a flag "enable-nacl" em chrome://flags também pode ser usada para ativar o PNaCl localmente para testes. Essa flag também mantém a função atual de ativar o NaCl "nativo" não PNaCl em qualquer página.

Também anunciamos recentemente a descontinuação dos apps do Chrome fora do ChromeOS no primeiro trimestre de 2018.

Migração do conjunto de ferramentas

Para a maioria dos casos de uso (P)NaCl, recomendamos a transição do SDK NaCl para o Emscripten. A migração provavelmente será razoavelmente simples se o aplicativo for portátil para Linux, usar SDL ou APIs POSIX. Embora o suporte direto para APIs NaCl / Pepper não esteja disponível, tentamos listar equivalentes da API Web. Para casos de portabilidade mais desafiadores, entre em contato em native-client-discuss@googlegroups.com

Migração da API

Descrevemos aqui o status dos substitutos da Plataforma da Web para cada uma das APIs expostas a (P)NaCl. Além disso, a tabela lista a biblioteca ou opção em Emscripten que ofereça o substituto mais próximo.

Esperamos adicionar suporte a linhas de execução de memória compartilhada ao WebAssembly em 2017, já que as linhas de execução são essenciais para corresponder aos casos de uso mais interessantes do (P)NaCl. Os itens de migração que assumem a compatibilidade com linhas de execução futuras estão marcados abaixo. Se o controle de fluxo de seu aplicativo depende muito do bloqueio APIs, você também pode achar que o suporte a linhas de execução é necessário para uma portabilidade conveniente.

Embora tenhamos tentado ser precisos nesta tabela, é possível que haja erros ou omissões. Se você encontrar alguma, entre em contato conosco pelo native-client-discuss@googlegroups.com

PPAPI

PPB_Audio

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar x SDL (parcial) GAP (parcial): AudioWorkletNode MAIS OU MENOS equivalente O AudioWorkletSpec foi concluído, mas o AudioDeviceClient pode ser mais adequado para essa API. O AudioDeviceClient ainda está sendo especificado pela comunidade. O worklet pode não ser o equivalente aproximado para essa API.
GetCurrentConfig SDL AudioContext.* (recupera as configurações transmitidas)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetTimestamp SDL AudioBufferSourceNode.start (parâmetro) São transmitidos toda vez, em vez de serem anexados ao buffer.
SetTimestamp SDL AudioBufferSourceNode.start (parâmetro)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: o WebAudio só usa float de 32 bits, e a PPAPI usa int de 16 bits. Teoricamente, a PPAPI oferece suporte a vários tamanhos de amostragem. Na prática, ele é compatível apenas com amostras de 16 bits. Infelizmente, os desenvolvedores solicitaram tamanhos de amostra de 16 bits para economizar no uso de memória. A próxima versão da especificação de áudio da Web vai implementar o suporte a amostras de 16 bits. Uma otimização para o AudioBuffer pode ser implementada de forma similar ao Firefox usando um buffer de 16 bits para o áudio que vem do decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
CreateStereo16Bit GAP GAP: apenas amostras de ponto flutuante de 32 bits são aceitas. A próxima versão da especificação Web Audio implementará o suporte para amostras de 16 bits.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (da construção padrão) Um AudioContext terá a taxa de amostragem preferencial que corresponde à taxa de amostragem real do dispositivo de áudio de hardware por padrão.
RecommendSampleFrameCount GAP GAP: seria processado com o AudioDeviceClient planejado. Há um problema em aberto para permitir um tamanho especificado pelo usuário, mas isso ainda está sendo definido. Provavelmente, isso funciona melhor com o AudioDeviceClient, que pode dizer qual seria o tamanho adequado para o hardware fornecido.

PPB_Console

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Registro Utime console.log/warn/error/...
LogWithSource GAP GAP A API Console é considerada uma substituição suficientemente completa, a menos que haja casos de uso específicos levantados pelos desenvolvedores para a funcionalidade fornecida pelo LogWithSource. Os mapas de origem do DevTools podem ser usados para depurar o JavaScript transcompilado no idioma de origem original.

PPB_Core

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
getTime Utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== indefinido
CallOnMainThread GAP Worker.postMessage + Atomics.wait É possível criar uma sincronização equivalente.

PPB_FileIO

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar FS (parcial) window.chooseFileSystemEntries() Criar e abrir são usados de forma diferente, mas as peças têm a mesma potência.
Abrir FS (parcial) window.chooseFileSystemEntries()
Consultar FS (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial) - Blob.type também pode ser usado para verificar o tipo MIME. O tipo de sistema de arquivos, o horário de criação e o horário do último acesso não podem ser determinados com a API Native File System.
Toque FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true})
Ler FS (parcial) Blob.slice().arrayBuffer()
Gravação FS (parcial) FileSystemWriter.write()
SetLength FS (parcial) FileSystemWriter.truncate()
Flush GAP (parcial) GAP (parcial): os arquivos são apagados quando FileSystemWrite.close() é chamado. Isso é intencional, porque os arquivos da API do sistema de arquivos nativo são expostos ao SO. Portanto, uma verificação da Navegação segura precisa ser realizada antes que os dados sejam mostrados ao SO.
Fechar FS (parcial) FileSystemWriter.close() Não cancela operações pendentes, mas limpa todos os dados gravados até o momento no disco.
ReadToArray GAP Blob.slice().arrayBuffer() ou Blob.arrayBuffer() Permite várias leituras de subintervalos em paralelo.

PPB_FileRef

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (parcial) FileSystem.type
GetName FS (parcial) File.name
GetPath FS (parcial) GAP (parcial): com a API Native File System, o caminho relativo de um arquivo pode ser determinado a partir da referência a um diretório que contenha o arquivo usando FileSystemHandle.resolve(FileSystemHandle) O caminho absoluto de um arquivo não pode ser determinado, e o usuário precisa conceder permissão para acessar o diretório que contém o arquivo.
GetParent FS (parcial) GAP (parcial): com a API Native File System, o caminho relativo de um arquivo pode ser determinado a partir da referência a um diretório que contenha o arquivo usando FileSystemHandle.resolve(FileSystemHandle) O usuário precisa conceder permissão para acessar o diretório que contém o arquivo.
MakeDirectory FS (parcial) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Toque FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true}) O tempo de modificação pode ser alterado por escrito.
Excluir FS (parcial) FileSystemDirectoryHandle.removeEntry() Ao contrário da PPAPI, os diretórios não precisam estar vazios.
Renomear FS (parcial) GAP (parcial): com a API Native File System, o arquivo pode ser escrito com o novo nome usando uma combinação de FileSystemFileHandle.getFile() para o novo nome e FileSystemFileHandle.createWriter().write() com o conteúdo do arquivo antigo. Em seguida, use FileSystemDirectoryHandle.removeEntry() para excluir o arquivo antigo. Não há uma API direta que faça isso em uma etapa na API Native File System.
Consultar GAP (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial) - Blob.type também pode ser usado para verificar o tipo MIME. O tipo de sistema de arquivos, o horário de criação e o horário do último acesso não podem ser determinados com a API Native File System.
ReadDirectoryEntries FS (parcial) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar FS (parcial) window.requestFileSystem A API JS faz as duas coisas em uma única etapa
Abrir GAP window.requestFileSystem A API JS faz as duas coisas em uma única etapa
GetType GAP FileSystem.type

PPB_Fullscreen

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Exemplo SDL Gamepad.* O objeto Gamepad expõe um carimbo de data/hora relativo a navigationStart. Ela é atualizada quando os dados são recebidos do hardware: https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL Canvas.getContext('2d')
Descrever SDL Canvas.clientWidth + Canvas.clientHeight.
PaintImageData SDL CanvasRenderingContext2D.putImageData
Rolagem GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (parcial): pode ser implementado desenhando a tela em si mesma, com um deslocamento, usando drawImage e preenchendo o restante.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Flush GAP Sem equivalente direto GAP (parcial): sempre há um flush implícito no final do código de exibição. Isso provavelmente não vai mudar. No entanto, a combinação OffscreenCanvas e ImageBitmapRenderingContext oferecem funcionalidades semelhantes.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (parcial): a exposição do WebGL 2.0 e do Emscripten ao OpenGL ES 3.0 é compatível com framebuffers multiamostrados definidos pelo usuário, nos quais todos os parâmetros configuráveis por meio de PPAPI podem ser configurados.
Criar 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 Sem equivalente direto GAP (parcial) - Sempre há uma limpeza implícita no final do código do desenho. isso é improvável mudar. No entanto, a combinação de OffscreenCanvas e ImageBitmapRenderingContext fornecem funcionalidades semelhantes.

PPB_ImageData

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetNativeImageDataFormat SDL ImageData exige a ordem RGBA
IsImageDataFormatSupported SDL ImageData exige a ordem RGBA
Criar SDL CanvasRenderingContext2d.createImageData
Descrição SDL ImageData nunca tem um salto
Mapa SDL ImageData.data
Desmapear SDL ImageData.data

PPB_InputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
RequestInputEvents SDL Sem equivalente direto A falta desse recurso provavelmente é menos relevante, já que o JS / Wasm é executado na linha de execução principal e pode filtrar eventos de maneira mais econômica sem incorrer em uma ida e volta de processo cruzado.
RequestFilteringInputEvents SDL Eventos de composição* de mouse*, tecla*, roda*, toque*
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Descendentes da classe do evento
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL clique duplo' em comparação a "mousedown" Eventos
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode contém essas informações, mas de forma incompleta. Há uma discussão sobre a implementação de uma API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP - deltaMode contém essas informações, mas de forma incompleta. Há uma discussão sobre a implementação de uma API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (para descobrir por conta própria)

PPB_IMEInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Sem equivalente direto Esses dados podem ser recuperados de CompositionEvent.data.
GetSegmentOffset GAP GAP: não há equivalente direto
GetTargetSegment GAP GAP - Sem equivalente direto
GetSelection GAP GAP - Sem equivalente direto

PPB_Instance

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
BindGraphics SDL Canvas.getContext (impossível, porque a vinculação é automática).
IsFullFrame GAP GAP: não há equivalente aos processadores de tipo MIME. Os apps NaCl podem ser registrados para processar um tipo MIME específico e serem proprietários de todo o documento.
DidCreate N/A <Element>[key] O acesso geral ao DOM permite filtrar atributos de tag
DidDestroy N/A N/A Não acionada para NaCl
DidChangeView N/A Evento de redimensionamento do elemento
DidChangeFocus N/A Elemento "foco", "foco", "foco" Eventos
HandleDocumentLoad N/A GAP - Não há maneira de se registrar como gerenciador de tipo MIME Módulos NaCl via apps + uma entrada de manifesto pode ser configurada para processar determinados tipos MIME.

PPB_MediaStreamAudioTrack

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Configurar GAP getUserMedia() As restrições de getUserMedia() podem fornecer os valores de configuração a serem usados no MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP: sem equivalente
RecycleBuffer GAP GAP: sem equivalente
Fechar GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP Canvas Capture A captura de tela oferece a capacidade de introduzir frames de vídeo de forma programática.
Configurar GAP applyConstraints(), getUserMedia() GAP (parcial): o escopo das configurações disponíveis na API da Web pode ser diferente do da PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP: não é equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES Não é possível pré-carregar o MediaStream, por isso ele nunca será armazenado em buffer: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP: não há equivalente para PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP: sem equivalente
RecycleFrame GAP GAP: sem equivalente
Fechar GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP: sem equivalente
PutFrame GAP GAP: sem equivalente

PPB_MessageLoop

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
GetForMainThread N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
GetCurrent N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
AttachToCurrentThread N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
Executar N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
PostWork N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
PostQuit N/A Na maioria das vezes, os workers recebem um loop de evento implícito.

PPB_Messaging

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
PostMessage N/A Window.postMessage
RegisterMessageHandler N/A Window.addEventListener
UnregisterMessageHandler N/A Window.removeEventListener

PPB_MouseCursor

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
SetCursor SDL Element.style.cursor É possível usar o mesmo conjunto de cursores de estoque. Os cursores personalizados podem ser feitos com url(..). Os cursores personalizados dinâmicos podem ser feitos com URIs de dados. O CSS3 oferece suporte à especificação do ponto de acesso.

PPB_MouseLock

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Vários métodos OpenGLES Funcionalidade parecida com a WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
SetTextInputType GAP GAP: possivelmente preenchido pela API Input Method Editor. Alguns desenvolvedores gostariam de poder dar dicas dessa maneira ou, preferivelmente, a capacidade de interceptar e exibir eventos / saídas do IME (editor de método de entrada, na sigla em inglês) inline dentro de uma tela.
UpdateCaretPosition GAP GAP: potencialmente preenchido pela API Input Method Editor https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP: potencialmente preenchido pela API Input Method Editor https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP: potencialmente preenchido pela API Input Method Editor https://www.w3.org/TR/ime-api/

PPB_URLLoader

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind new XMLHttpRequest();
Abrir embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP: sem XMLHTTPRequest equivalente
GetUploadProgress embind XMLHttpRequest 'progress' Evento
GAP FetchObserver Ainda não foi especificado ou implementado: https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind XMLHttpRequest 'progress' Evento
GAP FetchObserver Ainda não foi especificado ou implementado: https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Buscar resposta.*
ReadResponseBody embind XMLHttpRequest.response
embind Corpo.* (A resposta é um corpo)
FinishStreamingToFile embind GAP - Sem equivalente direto XMLHttpRequest e Fetch assumem o streaming para a memória, em vez de diretamente para um armazenamento.
Fechar embind XMLHttpRequest.abort
GAP API Fetch: AbortSignal e AbortController

PPB_URLRequestInfo

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind XMLHttpRequest
embind Solicitação de busca
SetProperty GAP GAP - Nenhum equivalente direto para XMLHttpRequest O XMLHttpRequest não oferece maneiras diretas de limitar por solicitação após redirecionamentos, transmitir para um arquivo, definir o redirecionamento ou a política de credenciais.
embind Solicitação.*
AppendDataToBody embind XMLHttpRequest.send GAP: ambos precisam ter o corpo inteiro, não apenas um pedaço.
embind fetch(.., options:body)
AppendFileToBody GAP streaming de upload de busca https://www.chromestatus.com/features/5274139738767360
N/A &lt;form&gt; Você também pode ler com o FileReader e fazer upload, mas isso é mais parecido com AppendDataToBody.

PPB_URLResponseInfo

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetProperty embind XMLHttpRequest.getAllResponseHeaders + outros
embind Buscar resposta.*
GetBodyAsFileRef embind Buscar resposta (corpo) .blob() Assume que a camada de armazenamento otimiza a transferência.

PPB_Var

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/A N/A
VarToResource N/A N/A

PPB_VarArray

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Get embind Matriz[i]
Definir embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind new ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Mapa GAP GAP - Sem equivalente direto Os módulos Asm.js / Wasm não conseguem mapear regiões de um ArrayBuffer diferente de sua única heap de memória linear. Futuras recordações ou mapeamentos de memória podem melhorar isso.
Desmapear GAP GAP - Sem equivalente direto

PPB_VarDictionary

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind {}
Get embind &lt;Object&gt;[i]
Definir embind <Objeto>[i] = x
Excluir embind excluir <Objeto>[i]
HasKey embind x em <Object>
GetKeys embind for (k in <Object>) {} Não há equivalente literal, mas pode ser criado.

PPB_VideoDecoder

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP GAP - Seria tratado com a API WebCodecs proposta usando VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Inicializar GAP GAP: seria processado com a API WebCodecs proposta usando parâmetros de inicialização 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: seria processado com a API WebCodecs proposta usando 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 - Seria tratado com a API WebCodecs proposta usando ReadableStream.pipe Through(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 - Seria tratado com a API WebCodecs proposta. O design atual recicla automaticamente as imagens e mantém o processo de decodificação em andamento. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Flush GAP GAP: seria processado com a API WebCodecs proposta. A API será chamada de Flush(), mas ainda há discussão sobre como ela será sequenciada em relação a chamadas de decodificação. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Redefinir GAP GAP: seria processado com a API WebCodecs proposta, destruindo a instância VideoDecoder e criando uma nova. Isso não será tão eficiente quanto um método de redefinição dedicado, mas a semântica da API reset() ainda está sendo discutida. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP GAP: seria processado com a API WebCodecs proposta usando VideoEncoder().
GetSupportedProfiles GAP GAP (parcial) - Navigator.mediaCapabilities.encodingInfo() Os perfis compatíveis precisam ser verificados um por um.
Inicializar GAP GAP - Seria tratado com a API WebCodecs proposta usando parâmetros de inicialização VideoEncoder()
GetFramesRequired GAP GAP: sem equivalente É improvável que o pool de frames usado internamente pela API Web Codecs seja exposto.
GetFrameCodedSize GAP GAP: sem equivalente É improvável que o pool de frames usado internamente pela API Web Codecs seja exposto.
GetVideoFrame GAP GAP - Seria tratado com a API WebCodecs proposta usando ReadableStream.pipe Through(VideoEncoder). Isso codificaria diretamente os dados no fluxo legível em vez de capturar um único frame para preencher com dados antes da codificação.
Codificação GAP GAP - Será tratado com a API WebCodecs proposta usando ReadableStream.pipe Through(VideoEncoder)
GetBitstreamBuffer GAP GAP - Seria tratado com a API WebCodecs proposta. O design atual passará automaticamente pelo buffer de bitstream codificado que é transmitido. Atualmente, a API WebCodecs pressupõe que o buffer de bitstream pode ser copiado em vez de estar em pool, por isso não precisa ser reciclado.
RecycleBitstreamBuffer GAP GAP: seria processado com a API WebCodecs proposta. O design atual recicla automaticamente o buffer para manter o processo de codificação. É improvável que isso mude no futuro, já que as implicações de performance são menores.
RequestEncodingParametersChange GAP GAP - Seria tratado pela API Web Codecs proposta. Certos parâmetros podem ser alterados em tempo real, enquanto outros exigem a desativação do codificador.
Fechar GAP GAP - Seria tratado com a API WebCodecs proposta usando VideoEncoder.Close()

PPB_VideoFrame

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetTimestamp GAP GAP - Seria tratado com a API WebCodecs proposta.
SetTimestamp GAP GAP - Seria tratado com a API WebCodecs proposta.
GetFormat GAP GAP: seria processado com a API WebCodecs proposta.
GetSize GAP GAP: seria processado com a API WebCodecs proposta.
GetDataBuffer GAP GAP - Seria tratado com a API WebCodecs proposta.
GetDataBufferSize GAP GAP - Seria tratado com a API WebCodecs proposta.

PPB_View

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Pertence ao documento, não apenas a um único 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

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP WebSocket.WebSocket
Connect GAP WebSocket.WebSocket(url, ...) Evento "open" do WebSocket
Fechar GAP WebSocket.close
ReceiveMessage GAP "Mensagem" do WebSocket Evento "Erro" de WebSocket Evento "fechar" WebSocket Evento
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étodo PPAPI Assume linhas de execução Emscripten API da Web Limitações
Gráficos3DContextLost SDL Tela "webglcontextlost" Evento

PPP_InputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
DidCreate N/A <Element>[key] O acesso geral ao DOM permite filtrar atributos de tag
DidDestroy N/A N/A Não acionada para NaCl
DidChangeView N/A Evento de redimensionamento do elemento
DidChangeFocus N/A Elemento "foco", "foco", "foco" Eventos
HandleDocumentLoad N/A GAP - Não há maneira de se registrar como gerenciador de tipo MIME Módulos NaCl via apps + uma entrada de manifesto pode ser configurada para lidar com determinados tipos MIME.

PPP_MessageHandler

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
HandleMessage embind Evento "message" da MessagePort Evento "message" da janela
HandleBlockingMessage N/A GAP: não há equivalente direto Uma sincronização semelhante pode ser feita fora da linha de execução principal com Atomics.wait. Isso foi adicionado para oferecer suporte à emulação de APIs de plug-in síncrono.

PPP_Messaging

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
HandleMessage embind "Mensagem" do MessagePort Evento Janela "message" Evento

PPP_MouseLock

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
MouseLockLost SDL Eventos "pointerlockchange" e "pointerlockerror" do elemento

IRT

PPB_Audio

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar x SDL (parcial) GAP (parcial): AudioWorkletNode MAIS OU MENOS equivalente O AudioWorkletSpec foi concluído, mas o AudioDeviceClient pode ser mais adequado para essa API. O AudioDeviceClient ainda está sendo especificado pela comunidade. O worklet pode não ser o equivalente aproximado para essa API.
GetCurrentConfig SDL AudioContext.* (recupera as configurações transmitidas)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetTimestamp SDL AudioBufferSourceNode.start (parâmetro) São transmitidos toda vez, em vez de serem anexados ao buffer.
SetTimestamp SDL AudioBufferSourceNode.start (parâmetro)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: o WebAudio só usa float de 32 bits, e a PPAPI usa int de 16 bits. Teoricamente, a PPAPI oferece suporte a vários tamanhos de amostragem. Na prática, ele é compatível apenas com amostras de 16 bits. Infelizmente, os desenvolvedores solicitaram tamanhos de amostra de 16 bits para economizar no uso de memória. A próxima versão da especificação de áudio da Web vai implementar o suporte a amostras de 16 bits. Uma otimização para o AudioBuffer pode ser implementada de forma similar ao Firefox usando um buffer de 16 bits para o áudio que vem do decodeAudioData
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
CreateStereo16Bit GAP GAP: apenas amostras de ponto flutuante de 32 bits são aceitas. A próxima versão da especificação Web Audio implementará o suporte para amostras de 16 bits.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (da construção padrão) Um AudioContext terá a taxa de amostragem preferencial que corresponde à taxa de amostragem real do dispositivo de áudio de hardware por padrão.
RecommendSampleFrameCount GAP GAP: seria processado com o AudioDeviceClient planejado. Há um problema em aberto para permitir um tamanho especificado pelo usuário, mas isso ainda está sendo definido. Provavelmente, isso funciona melhor com o AudioDeviceClient, que pode dizer qual seria o tamanho adequado para o hardware fornecido.

PPB_Console

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Registro Utime console.log/warn/error/...
LogWithSource GAP GAP A API Console é considerada uma substituição suficientemente completa, a menos que haja casos de uso específicos levantados pelos desenvolvedores para a funcionalidade fornecida pelo LogWithSource. Os mapas de origem do DevTools podem ser usados para depurar o JavaScript transcompilado no idioma de origem original.

PPB_Core

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
getTime Utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== indefinido
CallOnMainThread GAP Worker.postMessage + Atomics.wait É possível criar uma sincronização equivalente.

PPB_FileIO

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar FS (parcial) window.chooseFileSystemEntries() Criar e abrir são usados de forma diferente, mas as peças têm a mesma potência.
Abrir FS (parcial) window.chooseFileSystemEntries()
Consultar FS (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial) - Blob.type também pode ser usado para verificar o tipo MIME. O tipo de sistema de arquivos, o horário de criação e o horário do último acesso não podem ser determinados com a API Native File System.
Toque FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true})
Ler FS (parcial) Blob.slice().arrayBuffer()
Gravação FS (parcial) FileSystemWriter.write()
SetLength FS (parcial) FileSystemWriter.truncate()
Flush GAP (parcial) GAP (parcial): os arquivos são apagados quando FileSystemWrite.close() é chamado. Isso é intencional, porque os arquivos da API do sistema de arquivos nativo são expostos ao SO. Portanto, uma verificação da Navegação segura precisa ser realizada antes que os dados sejam mostrados ao SO.
Fechar FS (parcial) FileSystemWriter.close() Não cancela operações pendentes, mas limpa todos os dados gravados até o momento no disco.
ReadToArray GAP Blob.slice().arrayBuffer() ou Blob.arrayBuffer() Permite várias leituras de subintervalos em paralelo.

PPB_FileRef

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar FS (parcial) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
GetFileSystemType FS (parcial) FileSystem.type
GetName FS (parcial) File.name
GetPath FS (parcial) GAP (parcial): com a API Native File System, o caminho relativo de um arquivo pode ser determinado a partir da referência a um diretório que contenha o arquivo usando FileSystemHandle.resolve(FileSystemHandle) O caminho absoluto de um arquivo não pode ser determinado, e o usuário precisa conceder permissão para acessar o diretório que contém o arquivo.
GetParent FS (parcial) GAP (parcial): com a API Native File System, o caminho relativo de um arquivo pode ser determinado a partir da referência a um diretório que contenha o arquivo usando FileSystemHandle.resolve(FileSystemHandle) O usuário precisa conceder permissão para acessar o diretório que contém o arquivo.
MakeDirectory FS (parcial) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Toque FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true}) O tempo de modificação pode ser alterado por escrito.
Excluir FS (parcial) FileSystemDirectoryHandle.removeEntry() Ao contrário da PPAPI, os diretórios não precisam estar vazios.
Renomear FS (parcial) GAP (parcial): com a API Native File System, o arquivo pode ser escrito com o novo nome usando uma combinação de FileSystemFileHandle.getFile() para o novo nome e FileSystemFileHandle.createWriter().write() com o conteúdo do arquivo antigo. Em seguida, use FileSystemDirectoryHandle.removeEntry() para excluir o arquivo antigo. Não há uma API direta que faça isso em uma etapa na API Native File System.
Consultar GAP (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial) - Blob.type também pode ser usado para verificar o tipo MIME. O tipo de sistema de arquivos, o horário de criação e o horário do último acesso não podem ser determinados com a API Native File System.
ReadDirectoryEntries FS (parcial) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar FS (parcial) window.requestFileSystem A API JS faz as duas coisas em uma única etapa
Abrir GAP window.requestFileSystem A API JS faz as duas coisas em uma única etapa
GetType GAP FileSystem.type

PPB_Fullscreen

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Exemplo SDL Gamepad.* O objeto Gamepad expõe um carimbo de data/hora relativo a navigationStart. Ela é atualizada quando os dados são recebidos do hardware: https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL Canvas.getContext('2d')
Descrever SDL Canvas.clientWidth + Canvas.clientHeight.
PaintImageData SDL CanvasRenderingContext2D.putImageData
Rolagem GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (parcial): pode ser implementado desenhando a tela em si mesma, com um deslocamento, usando drawImage e preenchendo o restante.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Flush GAP Sem equivalente direto GAP (parcial) - Sempre há uma limpeza implícita no final do código do desenho. isso é improvável mudar. No entanto, a combinação de OffscreenCanvas e ImageBitmapRenderingContext oferecem funcionalidades semelhantes.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (parcial): a exposição do WebGL 2.0 e do Emscripten ao OpenGL ES 3.0 é compatível com framebuffers multiamostrados definidos pelo usuário, nos quais todos os parâmetros configuráveis por meio de PPAPI podem ser configurados.
Criar 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 Sem equivalente direto GAP (parcial): sempre há um flush implícito no final do código de exibição. Isso provavelmente não vai mudar. No entanto, a combinação OffscreenCanvas e ImageBitmapRenderingContext oferecem funcionalidade semelhante.

PPB_ImageData

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetNativeImageDataFormat SDL ImageData exige a ordem RGBA
IsImageDataFormatSupported SDL ImageData exige a ordem RGBA
Criar SDL CanvasRenderingContext2d.createImageData
Descrição SDL ImageData nunca tem um salto
Mapa SDL ImageData.data
Desmapear SDL ImageData.data

PPB_InputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
RequestInputEvents SDL Sem equivalente direto A falta desse recurso provavelmente é menos relevante, já que o JS / Wasm é executado na linha de execução principal e pode filtrar eventos de maneira mais econômica sem incorrer em uma ida e volta de processo cruzado.
RequestFilteringInputEvents SDL Eventos de composição* de mouse*, tecla*, roda*, toque*
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Descendentes da classe do evento
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL clique duplo' em comparação a "mousedown" Eventos
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode contém essas informações, mas de forma incompleta. Há uma discussão sobre a implementação de uma API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP - deltaMode contém essas informações, mas de forma incompleta. Há uma discussão sobre a implementação de uma API WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (para descobrir por conta própria)

PPB_IMEInputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Sem equivalente direto Esses dados podem ser recuperados de CompositionEvent.data.
GetSegmentOffset GAP GAP: não há equivalente direto
GetTargetSegment GAP GAP - Sem equivalente direto
GetSelection GAP GAP - Sem equivalente direto

PPB_Instance

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
BindGraphics SDL Canvas.getContext (impossível, porque a vinculação é automática).
IsFullFrame GAP GAP: não há equivalente aos processadores de tipo MIME. Os apps NaCl podem ser registrados para processar um tipo MIME específico e serem proprietários de todo o documento.
DidCreate N/A <Element>[key] O acesso geral ao DOM permite filtrar atributos de tag
DidDestroy N/A N/A Não acionada para NaCl
DidChangeView N/A Evento de redimensionamento do elemento
DidChangeFocus N/A Elemento "foco", "foco", "foco" Eventos
HandleDocumentLoad N/A GAP - Não há maneira de se registrar como gerenciador de tipo MIME Módulos NaCl via apps + uma entrada de manifesto pode ser configurada para processar determinados tipos MIME.

PPB_MediaStreamAudioTrack

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Configurar GAP getUserMedia() As restrições de getUserMedia() podem fornecer os valores de configuração a serem usados no MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP: sem equivalente
RecycleBuffer GAP GAP: sem equivalente
Fechar GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP Canvas Capture A captura de tela oferece a capacidade de introduzir frames de vídeo de forma programática.
Configurar GAP applyConstraints(), getUserMedia() GAP (parcial): o escopo das configurações disponíveis na API da Web pode ser diferente do da PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP: não é equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES Não é possível pré-carregar o MediaStream, por isso ele nunca será armazenado em buffer: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP: não há equivalente para PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP: sem equivalente
RecycleFrame GAP GAP: sem equivalente
Fechar GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP: sem equivalente
PutFrame GAP GAP: sem equivalente

PPB_MessageLoop

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
GetForMainThread N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
GetCurrent N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
AttachToCurrentThread N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
Executar N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
PostWork N/A Na maioria das vezes, os workers recebem um loop de evento implícito.
PostQuit N/A Na maioria das vezes, os workers recebem um loop de evento implícito.

PPB_Messaging

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
PostMessage N/A Window.postMessage
RegisterMessageHandler N/A Window.addEventListener
UnregisterMessageHandler N/A Window.removeEventListener

PPB_MouseCursor

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
SetCursor SDL Element.style.cursor É possível usar o mesmo conjunto de cursores de estoque. Os cursores personalizados podem ser feitos com url(..). Os cursores personalizados dinâmicos podem ser feitos com URIs de dados. O CSS3 oferece suporte à especificação do ponto de acesso.

PPB_MouseLock

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Vários métodos OpenGLES Funcionalidade parecida com a WebGL 1.0.
x OffscreenCanvas

PPB_TextInputController

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
SetTextInputType GAP GAP: possivelmente preenchido pela API Input Method Editor. Alguns desenvolvedores gostariam de poder dar dicas dessa maneira ou, preferivelmente, a capacidade de interceptar e exibir eventos / saídas do IME (editor de método de entrada, na sigla em inglês) inline dentro de uma tela.
UpdateCaretPosition GAP GAP: potencialmente preenchido pela API Input Method Editor https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP: potencialmente preenchido pela API Input Method Editor https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP: potencialmente preenchido pela API Input Method Editor https://www.w3.org/TR/ime-api/

PPB_URLLoader

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind new XMLHttpRequest();
Abrir embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP: sem XMLHTTPRequest equivalente
GetUploadProgress embind XMLHttpRequest 'progress' Evento
GAP FetchObserver Ainda não foi especificado ou implementado: https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind XMLHttpRequest 'progress' Evento
GAP FetchObserver Ainda não foi especificado ou implementado: https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Buscar resposta.*
ReadResponseBody embind XMLHttpRequest.response
embind Corpo.* (A resposta é um corpo)
FinishStreamingToFile embind GAP - Sem equivalente direto XMLHttpRequest e Fetch assumem o streaming para a memória, em vez de diretamente para um armazenamento.
Fechar embind XMLHttpRequest.abort
GAP API Fetch: AbortSignal e AbortController

PPB_URLRequestInfo

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind XMLHttpRequest
embind Solicitação de busca
SetProperty GAP GAP - Nenhum equivalente direto para XMLHttpRequest O XMLHttpRequest não oferece maneiras diretas de limitar por solicitação após redirecionamentos, transmitir para um arquivo, definir o redirecionamento ou a política de credenciais.
embind Solicitação.*
AppendDataToBody embind XMLHttpRequest.send GAP: ambos precisam ter o corpo inteiro, não apenas um pedaço.
embind fetch(.., options:body)
AppendFileToBody GAP streaming de upload de busca https://www.chromestatus.com/features/5274139738767360
N/A &lt;form&gt; Você também pode ler com o FileReader e fazer upload, mas isso é mais parecido com AppendDataToBody.

PPB_URLResponseInfo

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetProperty embind XMLHttpRequest.getAllResponseHeaders + outros
embind Buscar resposta.*
GetBodyAsFileRef embind Buscar resposta (corpo) .blob() Assume que a camada de armazenamento otimiza a transferência.

PPB_Var

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/A N/A
VarToResource N/A N/A

PPB_VarArray

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Get embind Matriz[i]
Definir embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind new ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Mapa GAP GAP - Sem equivalente direto Os módulos Asm.js / Wasm não conseguem mapear regiões de um ArrayBuffer diferente de sua única heap de memória linear. Futuras recordações ou mapeamentos de memória podem melhorar isso.
Desmapear GAP GAP - Sem equivalente direto

PPB_VarDictionary

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar embind {}
Get embind &lt;Object&gt;[i]
Definir embind <Objeto>[i] = x
Excluir embind excluir <Objeto>[i]
HasKey embind x em <Object>
GetKeys embind for (k in <Object>) {} Não há equivalente literal, mas pode ser criado.

PPB_VideoDecoder

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP GAP - Seria tratado com a API WebCodecs proposta usando VideoDecoder() https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Inicializar GAP GAP: seria processado com a API WebCodecs proposta usando parâmetros de inicialização 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: seria processado com a API WebCodecs proposta usando 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 - Seria tratado com a API WebCodecs proposta usando ReadableStream.pipe Through(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 - Seria tratado com a API WebCodecs proposta. O design atual recicla automaticamente as imagens e mantém o processo de decodificação em andamento. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Flush GAP GAP: seria processado com a API WebCodecs proposta. A API será chamada de Flush(), mas ainda há discussão sobre como ela será sequenciada em relação a chamadas de decodificação. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Redefinir GAP GAP: seria processado com a API WebCodecs proposta, destruindo a instância VideoDecoder e criando uma nova. Isso não será tão eficiente quanto um método de redefinição dedicado, mas a semântica da API reset() ainda está sendo discutida. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP GAP: seria processado com a API WebCodecs proposta usando VideoEncoder().
GetSupportedProfiles GAP GAP (parcial) - Navigator.mediaCapabilities.encodingInfo() Os perfis compatíveis precisam ser verificados um por um.
Inicializar GAP GAP - Seria tratado com a API WebCodecs proposta usando parâmetros de inicialização VideoEncoder()
GetFramesRequired GAP GAP: sem equivalente É improvável que o pool de frames usado internamente pela API Web Codecs seja exposto.
GetFrameCodedSize GAP GAP: sem equivalente É improvável que o pool de frames usado internamente pela API Web Codecs seja exposto.
GetVideoFrame GAP GAP - Seria tratado com a API WebCodecs proposta usando ReadableStream.pipe Through(VideoEncoder). Isso codificaria diretamente os dados no fluxo legível em vez de capturar um único frame para preencher com dados antes da codificação.
Codificação GAP GAP - Será tratado com a API WebCodecs proposta usando ReadableStream.pipe Through(VideoEncoder)
GetBitstreamBuffer GAP GAP - Seria tratado com a API WebCodecs proposta. O design atual passará automaticamente pelo buffer de bitstream codificado que é transmitido. Atualmente, a API WebCodecs pressupõe que o buffer de bitstream pode ser copiado em vez de estar em pool, por isso não precisa ser reciclado.
RecycleBitstreamBuffer GAP GAP: seria processado com a API WebCodecs proposta. O design atual recicla automaticamente o buffer para manter o processo de codificação. É improvável que isso mude no futuro, já que as implicações de performance são menores.
RequestEncodingParametersChange GAP GAP - Seria tratado pela API Web Codecs proposta. Certos parâmetros podem ser alterados em tempo real, enquanto outros exigem a desativação do codificador.
Fechar GAP GAP - Seria tratado com a API WebCodecs proposta usando VideoEncoder.Close()

PPB_VideoFrame

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetTimestamp GAP GAP - Seria tratado com a API WebCodecs proposta.
SetTimestamp GAP GAP - Seria tratado com a API WebCodecs proposta.
GetFormat GAP GAP: seria processado com a API WebCodecs proposta.
GetSize GAP GAP: seria processado com a API WebCodecs proposta.
GetDataBuffer GAP GAP - Seria tratado com a API WebCodecs proposta.
GetDataBufferSize GAP GAP - Seria tratado com a API WebCodecs proposta.

PPB_View

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Pertence ao documento, não apenas a um único 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

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar GAP WebSocket.WebSocket
Connect GAP WebSocket.WebSocket(url, ...) Evento "open" do WebSocket
Fechar GAP WebSocket.close
ReceiveMessage GAP "Mensagem" do WebSocket Evento "Erro" de WebSocket Evento "fechar" WebSocket Evento
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étodo PPAPI Assume linhas de execução Emscripten API da Web Limitações
Gráficos3DContextLost SDL Tela "webglcontextlost" Evento

PPP_InputEvent

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
DidCreate N/A <Element>[key] O acesso geral ao DOM permite filtrar atributos de tag
DidDestroy N/A N/A Não acionada para NaCl
DidChangeView N/A Evento de redimensionamento do elemento
DidChangeFocus N/A Elemento "foco", "foco", "foco" Eventos
HandleDocumentLoad N/A GAP - Não há maneira de se registrar como gerenciador de tipo MIME Módulos NaCl via apps + uma entrada de manifesto pode ser configurada para lidar com determinados tipos MIME.

PPP_MessageHandler

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
HandleMessage embind Evento "message" da MessagePort Evento "message" da janela
HandleBlockingMessage N/A GAP: não há equivalente direto Uma sincronização semelhante pode ser feita fora da linha de execução principal com Atomics.wait. Isso foi adicionado para oferecer suporte à emulação de APIs de plug-in síncrono.

PPP_Messaging

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
HandleMessage embind "Mensagem" do MessagePort Evento Janela "message" Evento

PPP_MouseLock

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
MouseLockLost SDL Eventos "pointerlockchange" e "pointerlockerror" do elemento

PPAPI (apps)

PPB_HostResolver

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar x GAP GAP (parcial): sem equivalente direto
Resolver x GAP GAP (parcial) - Sem equivalente direto
GetCanonicalName x GAP GAP (parcial) - Sem equivalente direto
GetNetAddressCount x GAP GAP (parcial) - Sem equivalente direto
GetNetAddress x GAP GAP (parcial): sem equivalente direto

PPB_NetAddress

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
CreateFromIPv4Address x GAP GAP (parcial): sem equivalente direto
CreateFromIPv6Address x GAP GAP (parcial): sem equivalente direto
GetFamily x GAP GAP (parcial) - Sem equivalente direto
DescribeAsString x GAP GAP (parcial): sem equivalente direto
DescribeAsIPv4Address x GAP GAP (parcial) - Sem equivalente direto
DescribeAsIPv6Address x GAP GAP (parcial): sem equivalente direto

PPB_NetworkList

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetCount x GAP GAP: não há equivalente direto
GetName x GAP GAP - Sem equivalente direto
GetType x GAP GAP - Sem equivalente direto
GetState x GAP GAP - Sem equivalente direto
GetIpAddress x GAP GAP - Sem equivalente direto
GetDisplayName x GAP GAP: não há equivalente direto
GetMTU x GAP GAP - Sem equivalente direto

PPB_NetworkMonitor

Método da PPAPI Assume linhas de execução Emscripten API da Web Limitações
Criar x GAP GAP: não há equivalente direto
UpdateNetworkList x GAP GAP - Sem equivalente direto

PPB_NetworkProxy

Método PPAPI Assume linhas de execução Emscripten API da Web Limitações
GetProxyForURL x GAP GAP: não há equivalente direto

PPB_TCPSocket e PPB_UDPSocket

Não há um mapeamento direto para a migração. Em vez disso, destacamos alguns nos cenários de usuário abaixo e qual é o caminho recomendado.

Caso de uso Recomendações
Compartilhamento de tela getDisplayMedia e WebRTC ( demonstração)
Carregar de um servidor local para minimizar o uso da largura de banda XHR, busca, streams, service worker, APIs de cache
Como carregar de uma instância local de um app da Web / Como se conectar a uma instância local de um app da Web WebRTC
Chat WebSocket*
Comunicação de áudio/vídeo em tempo real WebRTC
Colaboração WebSocket*
Jogos multiplayer em tempo real WebTransport** a menos que P2P, caso em que WebRTC (ou WebTransport sobre RTCIceTransport)
Tempo real streaming interativo WebTransport**
comunicação com o servidor legado Servidor proxy ou middleware para conversão de protocolo. Feedback para bit.ly/network-api-gaps

*: Ou WebTransport no futuro

**: confira a disponibilidade no chromestatus