(P)NaCl 弃用公告
考虑到跨浏览器 WebAssembly 支持乃是大势所趋,我们计划今后主要依靠 WebAssembly 构建原生代码,并计划于 2019 年第 4 季度停用对 PNaCl 的支持(Chrome 应用除外)。我们相信,
围绕 WebAssembly 打造的生态系统,
因此更适合新的和现有的高性能
Web 应用,并且 PNaCl 的使用率足够低,足以保证弃用。
从 Chrome 76 开始,开放网络上的 PNaCl 功能已
源试用,
这是一种机制,供 Web 开发者注册并获取默认情况下未开启的功能。
这通常是建议的新功能,但在本例中是已弃用的功能。
开发者可以在源试用控制台中注册
并接收令牌,该令牌可以嵌入到页面中,并且可以在无需用户使用标记的情况下启用该功能。
(如需了解详情,请参阅链接的指南)。试用计划将持续到 Chrome 78,大约持续到 2019 年 12 月。
此变更不会影响 Chrome 应用或扩展程序中的 NaCl 或 PNaCl 以及“enable-nacl”
chrome://flags 中的标记还可用于在本地启用 PNaCl 以进行测试
(此标记还保留其当前功能,即在任何页面上启用非 PNaCl“原生”NaCl)。
我们最近还宣布了在 2018 年第 1 季度弃用
Chrome 应用
。
对于大多数 (P)NaCl 使用情形,我们建议从 NaCl SDK 迁移到 Emscripten。如果您的应用可移植到 Linux、使用 SDL 或 POSIX API,迁移可能非常简单。虽然无法直接支持 NaCl / Pepper API,
我们已尝试列出 Web API 等效项。
如果您有更具挑战性的携号转网请求,请联系
native-client-discuss@googlegroups.com
API 迁移
我们在此概述了面向 (P)NaCl 公开的每个 API 的 Web 平台替代项的状态。此外,该表格还列出了 Emscripten 中的库或选项
可提供最接近的替代品
我们预计会在 2017 年为 WebAssembly 添加共享内存线程支持,因为线程对于匹配 (P)NaCl 最有趣的用例至关重要。下方会标记假定即将推出的线程支持的迁移项。如果您的应用的流控制在很大程度上依赖于阻塞
API 时,您可能还会发现需要线程支持才能方便地进行移植。
虽然我们一直努力在此表格中提供准确的数据,
并且不存在任何错误或遗漏问题。
如果您遇到此类问题,请发送电子邮件至 native-client-discuss@googlegroups.com 与我们联系
PPAPI
PPB_Audio
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
x |
SDL(部分) |
GAP(部分)- AudioWorkletNode 大致等效 |
AudioWorkletSpec 已完成,但 AudioDeviceClient 可能更适合此 API。AudioDeviceClient 仍由社区指定。此 API 可能没有大致等效的工作流。 |
GetCurrentConfig |
|
SDL |
AudioContext.* (获取传入的设置) |
|
StartPlayback |
|
SDL |
AudioBufferSourceNode.start |
|
StopPlayback |
|
SDL |
AudioBufferSourceNode.stop |
|
PPB_AudioBuffer
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetTimestamp |
|
SDL |
AudioBufferSourceNode.start(参数) |
每次传入,而不是附加到缓冲区。 |
SetTimestamp |
|
SDL |
AudioBufferSourceNode.start(参数) |
|
GetSampleRate |
|
SDL |
AudioBuffer.sampleRate |
|
GetSampleSize |
|
GAP |
GAP - WebAudio 仅使用 32 位浮点数,而 PPAPI 使用 16 位整数。 |
从理论上讲,PPAPI 支持多种抽样规模。实际上,它仅支持 16 位样本。遗憾的是,开发者请求使用 16 位采样大小以节省内存用量。Web Audio 规范的下一版本将实现对 16 位采样的支持。可以通过对来自 decodeAudioData 的音频使用 16 位缓冲区,实现与 Firefox 类似的 AudioBuffer 优化 |
GetNumberOfChannels |
|
SDL |
AudioBuffer.numberOfChannels |
|
GetDataBuffer |
|
SDL |
AudioBuffer.getChannelData |
|
GetBufferSize |
|
SDL |
AudioBuffer.length |
|
PPB_AudioConfig
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
CreateStereo16Bit |
|
GAP |
GAP - 仅支持 32 位浮点样本 |
下一版网络音频规范将实现对 16 位样本的支持。 |
GetSampleRate |
|
SDL |
AudioContext.sampleRate |
|
GetSampleFrameCount |
|
SDL |
AudioBuffer.length |
|
RecommendSampleRate |
|
SDL |
AudioContext.sampleRate(来自默认构造函数) |
默认情况下,AudioContext 的首选采样率与硬件音频设备的实际采样率一致。 |
RecommendSampleFrameCount |
|
GAP |
GAP - 将使用计划中的 AudioDeviceClient 进行处理 |
我们有一个开放的问题,即允许用户指定大小,但该功能仍在定义中。最好使用 AudioDeviceClient 来处理此问题,因为它可以告诉您给定硬件的适当大小。 |
PPB_Console
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
日志 |
|
Utime |
console.log/warn/error/... |
|
LogWithSource |
|
GAP |
GAP |
除非开发者提出了针对 LogWithSource 提供的功能的特定用例,否则 Console API 被视为足够完整的替代方案。DevTools Source Maps 可用于调试以原始源语言编写的转译 JavaScript。 |
PPB_Core
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
getTime |
|
Utime |
new Date().getTime() |
|
getTimeTicks |
|
Utime |
新 Date().getTime() |
|
IsMainThread |
|
GAP |
window.document !== undefined |
|
CallOnMainThread |
|
GAP |
Worker.postMessage + Atomics.wait |
可以构建等效的同步。 |
PPB_FileIO
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
FS(部分) |
window.chooseFileSystemEntries() |
create 和 open 的使用方式不同,但它们的作用相同。 |
打开 |
|
FS(部分) |
window.chooseFileSystemEntries() |
|
查询 |
|
FS(部分) |
Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified |
GAP(部分)- Blob.type 也可用于检查 MIME 类型。无法使用 Native File System API 确定文件系统类型、创建时间和上次访问时间。 |
触摸 |
|
FS(部分) |
FileSystemDirectoryHandle.getFile("name", {create: true}) |
|
读取 |
|
FS(部分) |
Blob.slice().arrayBuffer() |
|
写入 |
|
FS(部分) |
FileSystemWriter.write() |
|
SetLength |
|
FS(部分) |
FileSystemWriter.truncate() |
|
吸顶式 |
|
GAP(部分) |
GAP(部分)- 调用 FileSystemWrite.close() 时,系统将刷新文件 |
这是特意设计的,因为 Native File System API 文件会向操作系统公开,因此在向操作系统显示数据之前,需要先执行安全浏览检查。 |
关闭 |
|
FS(部分) |
FileSystemWriter.close() |
不会取消待处理的操作,但会将迄今为止写入的所有数据刷新到磁盘。 |
ReadToArray |
|
GAP |
Blob.slice().arrayBuffer() 或 Blob.arrayBuffer() |
允许并行执行多个子范围读取。 |
PPB_FileRef
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
FS(部分) |
FileSystemDirectoryHandle.getFile("name", {create: true}) |
|
GetFileSystemType |
|
FS(部分) |
FileSystem.type |
|
GetName |
|
FS(部分) |
File.name |
|
GetPath |
|
FS(部分) |
差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 |
无法确定文件的绝对路径,并且用户必须授予访问包含该文件的目录的权限。 |
GetParent |
|
FS(部分) |
差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 |
用户必须授予访问包含相应文件的目录的权限。 |
MakeDirectory |
|
FS(部分) |
FileSystemHandle.getDirectory(..., {createIfNotExists: true}) |
|
触摸 |
|
FS(部分) |
FileSystemDirectoryHandle.getFile("name", {create: true}) |
写入可能会被提升修改时间。 |
删除 |
|
FS(部分) |
FileSystemDirectoryHandle.removeEntry() |
与 PPAPI 不同,目录不必为空。 |
重命名 |
|
FS(部分) |
GAP(部分)- 使用 Native File System API 时,可以使用新名称 FileSystemFileHandle.getFile() 和 FileSystemFileHandle.createWriter().write() 与旧文件的内容组合来写入文件。然后使用 FileSystemDirectoryHandle.removeEntry() 删除旧文件。 |
在原生文件系统 API 中,没有一个直接 API 可以一步完成此工作。 |
查询 |
|
GAP(部分) |
Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified |
GAP(部分)- Blob.type 还可用于检查 MIME 类型。无法使用原生文件系统 API 确定文件系统类型、创建时间和上次访问时间。 |
ReadDirectoryEntries |
|
FS(部分) |
FileSystemDirectoryHandle.getEntries() |
|
PPB_FileSystem
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
FS(部分) |
window.requestFileSystem |
JS API 只需一步即可搞定 |
打开 |
|
GAP |
window.requestFileSystem |
JS API 只需一步即可搞定 |
GetType |
|
GAP |
FileSystem.type |
|
PPB_Fullscreen
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
IsFullScreen |
|
html5.h |
Document.fullscreenEnabled |
|
SetFullscreen |
|
html5.h |
Document.requestFullscreen |
|
GetScreenSize |
|
html5.h |
Document.exitFullscreen |
|
PPB_Gamepad
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
试阅内容 |
|
SDL |
Gamepad.* |
Gamepad 对象公开相对于 navigationStart 的时间戳。当从硬件收到数据时,该值会更新 https://www.w3.org/TR/gamepad/#gamepad-interface |
PPB_Graphics2D
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
Canvas.getContext('2d') 中的资源 |
|
描述 |
|
SDL |
Canvas.clientWidth + Canvas.clientHeight |
|
PaintImageData |
|
SDL |
CanvasRenderingContext2D.putImageData |
|
滚动 |
|
GAP |
CanvasRenderingContext2D.scrollIntoView、CanvasRenderingContext2D.drawImage |
GAP(部分)- 可通过以下方法实现:使用偏移将画布绘制到其自身上,使用 drawImage,然后填充其余部分。 |
ReplaceContents |
|
SDL |
CanvasRenderingContext2D.drawImage |
|
吸顶式 |
|
GAP |
无直接对等项 |
GAP(部分)-
绘制代码末尾始终存在隐式 flush;不太可能
进行更改。不过,OffscreenCanvas 和 ImageBitmapRenderingContext 的组合可提供类似的功能。 |
SetScale |
|
SDL |
CanvasRenderingContext2D.scale |
|
GetScale |
|
SDL |
CanvasRenderingContext2D.currentTransform |
|
SetLayerTransform |
|
SDL |
CanvasRenderingContext2D.setTransform
CanvasRenderingContext2D.scale
CanvasRenderingContext2D.translate |
|
PPB_Graphics3D
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetAttribMaxValue |
|
OpenGL ES 3.0 |
WebGL 2.0 |
GAP(部分)- WebGL 2.0 和 Emscripten 提供的 OpenGL ES 3.0 支持用户定义的多重采样帧缓冲区,其中所有可通过 PPAPI 配置的参数均可设置。 |
制作 |
|
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 |
无直接对等项 |
GAP(部分)-
绘制代码末尾始终存在隐式 flush;不太可能
进行更改。不过,
OffscreenCanvas
和
ImageBitmapRenderingContext
提供类似的功能。 |
PPB_ImageData
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetNativeImageDataFormat |
|
SDL |
ImageData 要求 RGBA 顺序 |
|
IsImageDataFormatSupported |
|
SDL |
ImageData 要求 RGBA 顺序 |
|
制作 |
|
SDL |
CanvasRenderingContext2d.createImageData |
|
描述 |
|
SDL |
ImageData 从不具有 stride |
|
地图 |
|
SDL |
ImageData.data |
|
取消映射 |
|
SDL |
ImageData.data |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
RequestInputEvents |
|
SDL |
无直接对等项 |
由于 JS / Wasm 在主线程上运行,因此缺少此功能的相关程度较低,并且能够以更便宜的方式过滤事件,而不会产生跨进程往返。 |
RequestFilteringInputEvents |
|
SDL |
鼠标* 键* 滚轮* 触摸* 组合* 事件 |
|
|
|
SDL |
Element.addEventListener |
|
ClearInputEventRequest |
|
SDL |
Element.removeEventListener |
|
GetType |
|
SDL |
事件类后代 |
|
GetTimeStamp |
|
SDL |
Event.timeStamp |
|
GetModifiers |
|
SDL |
*Event.altKey/shiftKey/metaKey/ctrlKey |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
MouseEvent |
|
GetButton |
|
SDL |
MouseEvent.button |
|
GetPosition |
|
SDL |
MouseEvent.client*/page*/offset* |
|
GetClickCount |
|
SDL |
“dblclick”与“mousedown”事件 |
|
GetMovement |
|
SDL |
MouseEvent.movement* |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
WheelEvent |
|
GetDelta |
|
SDL |
WheelEvent.delta* |
|
GetTicks |
|
GAP |
GAP - deltaMode 种类包含此信息,但并未完全包含。 |
以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 |
GetScrollByPage |
|
GAP |
GAP - deltaMode 种类包含此信息,但并未完全包含。 |
以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 |
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
KeyboardEvent |
|
GetKeyCode |
|
SDL |
KeyboardEvent.keyCode |
|
GetCharacterText |
|
SDL |
KeyboardEvent.key |
|
GetCode |
|
SDL |
KeyboardEvent.code |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
TouchEvent |
|
AddTouchPoint |
|
SDL |
TouchEvent.touches.push |
|
GetTouchCount |
|
SDL |
TouchEvent.touches.length |
|
GetTouchByIndex |
|
SDL |
TouchEvent.touches[i] |
|
GetTouchById |
|
SDL |
Touch.indentifer(请自行确定) |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
CompositionEvent |
|
GetText |
|
GAP |
CompositionEvent.data |
|
GetSegmentNumber |
|
GAP |
GAP - 无直接对等项 |
这些数据可能会从 CompositionEvent.data 中检索。 |
GetSegmentOffset |
|
GAP |
GAP - 无直接对等项 |
|
GetTargetSegment |
|
GAP |
GAP - 无直接对等项 |
|
GetSelection |
|
GAP |
GAP - 无直接对等项 |
|
PPB_Instance
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
BindGraphics |
|
SDL |
Canvas.getContext(由于绑定是自动进行的,因此无效)。 |
|
IsFullFrame |
|
GAP |
GAP - 没有等同于 MIME 类型处理程序的功能。 |
NaCl 应用可以注册以处理特定 MIME 类型并拥有整个文档。 |
DidCreate |
|
不适用 |
<Element>[key] |
借助通用 DOM 访问权限,您可以提取标记属性 |
DidDestroy |
|
不适用 |
不适用 |
不会因 NaCl 而触发 |
DidChangeView |
|
不适用 |
元素“resize”事件 |
|
DidChangeFocus |
|
不适用 |
元素“focus”“focusin”“focusout”事件 |
|
HandleDocumentLoad |
|
不适用 |
GAP - 无法注册为 MIME 类型处理程序 |
NaCl 模块(通过应用 + 清单条目)可设置为处理特定的 MIME 类型。 |
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
配置 |
|
GAP |
getUserMedia() |
getUserMedia() 中的约束条件可以提供要在 MediaStreamTrack 中使用的配置值。 |
GetAttrib |
|
GAP |
MediaStreamTrack.getSettings() |
|
GetId |
|
GAP |
MediaStreamTrack.id |
|
HasEnded |
|
GAP |
MediaStreamTrack.readyState |
|
GetBuffer |
|
GAP |
GAP - 无对等方法 |
|
RecycleBuffer |
|
GAP |
GAP - 无对等项 |
|
关闭 |
|
GAP |
MediaStreamTrack.stop() |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
画布截图 |
Canvas Capture 支持以编程方式引入视频帧。 |
配置 |
|
GAP |
applyConstraints(), getUserMedia() |
差距(部分)- Web API 中可用的配置范围可能与 PPAPI 不同。 |
GetAttrib |
|
GAP |
MediaStreamSettings.width |
|
|
|
GAP |
MediaStreamSettings.height |
|
|
|
GAP |
GAP - 无与 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES 对等项 |
MediaStream 无法预加载,因此绝不会缓冲:https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements |
|
|
GAP |
GAP - 没有等效于 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT |
|
GetId |
|
GAP |
MediaStreamTrack.id |
|
HasEnded |
|
GAP |
MediaStreamTrack.readyState |
|
GetFrame |
|
GAP |
GAP - 无等效项 |
|
RecycleFrame |
|
GAP |
GAP - 无对等项 |
|
关闭 |
|
GAP |
MediaStreamTrack.stop() |
|
GetEmptyFrame |
|
GAP |
GAP - 无等效项 |
|
PutFrame |
|
GAP |
GAP - 无对等方法 |
|
PPB_MessageLoop
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
GetForMainThread |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
GetCurrent |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
AttachToCurrentThread |
|
不适用 |
大多数情况下没有问题,工作器会获得隐式事件循环。 |
|
您可以在 |
|
不适用 |
大多数情况下没有问题,工作器会获得隐式事件循环。 |
|
PostWork |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
PostQuit |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
PPB_Messaging
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
PostMessage |
|
不适用 |
Window.postMessage |
|
RegisterMessageHandler |
|
不适用 |
Window.addEventListener |
|
UnregisterMessageHandler |
|
不适用 |
Window.removeEventListener |
|
PPB_MouseCursor
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
SetCursor |
|
SDL |
Element.style.cursor |
支持使用同一组常用光标。
可以使用 url(..) 实现自定义光标。
您可以使用数据 URI 实现动态自定义光标。
CSS3 支持指定热点。 |
PPB_MouseLock
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
LockMouse |
|
SDL |
Element.requestPointerLock |
|
UnlockMouse |
|
SDL |
Element.exitPointerLock |
|
PPB_OpenGLES2
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
多种方法 |
|
OpenGLES |
功能接近 WebGL 1.0。 |
|
|
x |
|
OffscreenCanvas |
|
PPB_TextInputController
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
SetTextInputType |
|
GAP |
GAP - 可能被 Input Method Editor API 填充 |
有些开发者希望能够以这种方式进行提示,或者更喜欢在画布内拦截并显示 IME 事件 / 输出内嵌的功能。 |
UpdateCaretPosition |
|
GAP |
GAP - 可能由输入法编辑器 API 填充 |
https://www.w3.org/TR/ime-api/ |
CancelCompositionText |
|
GAP |
GAP - 可能由输入法编辑器 API 填充 |
https://www.w3.org/TR/ime-api/ |
UpdateSurroundingText |
|
GAP |
GAP - 可能由输入法编辑器 API 填充 |
https://www.w3.org/TR/ime-api/ |
PPB_URLLoader
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
new XMLHttpRequest(); |
|
未解决 |
|
embind |
XMLHttpRequest.open |
|
FollowRedirect |
|
embind |
Request.redirect |
|
|
|
GAP |
GAP - 无 XMLHTTPRequest 等效项 |
|
GetUploadProgress |
|
embind |
XMLHttpRequest “progress”事件 |
|
|
|
GAP |
FetchObserver |
尚未指定或实现;https://github.com/whatwg/fetch/issues/607 |
GetDownloadProgress |
|
embind |
XMLHttpRequest “progress”事件 |
|
|
|
GAP |
FetchObserver |
尚未说明或实施;https://github.com/whatwg/fetch/issues/607 |
GetResponseInfo |
|
embind |
XMLHttpRequest.getAllResponseHeaders |
|
|
|
embind |
提取响应。* |
|
ReadResponseBody |
|
embind |
XMLHttpRequest.response |
|
|
|
embind |
正文。*(响应是正文) |
|
FinishStreamingToFile |
|
embind |
GAP - 无直接对等项 |
XMLHttpRequest 和 Fetch 都假定流式传输到内存,而不是直接传输到存储空间。 |
关闭 |
|
embind |
XMLHttpRequest.abort |
|
|
|
GAP |
Fetch API:AbortSignal 和 AbortController |
|
PPB_URLRequestInfo
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
XMLHttpRequest |
|
|
|
embind |
提取请求 |
|
SetProperty |
|
GAP |
GAP - 没有 XMLHttpRequest 的直接等效项 |
XMLHttpRequest 不提供根据请求限制以下重定向、流式传输到文件、设置引荐来源网址或凭据政策的直接方法。 |
|
|
embind |
请求。* |
|
AppendDataToBody |
|
embind |
XMLHttpRequest.send |
GAP - 两者都必须有完整的身体,而不是部分。 |
|
|
embind |
fetch(.., options:body) |
|
AppendFileToBody |
|
GAP |
fetch() 上传流式传输 |
https://www.chromestatus.com/features/5274139738767360 |
|
|
不适用 |
<form> |
您也可以使用 FileReader 进行读取和上传,但这更类似于 AppendDataToBody |
PPB_URLResponseInfo
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetProperty |
|
embind |
XMLHttpRequest.getAllResponseHeaders + 其他 |
|
|
|
embind |
提取响应。* |
|
GetBodyAsFileRef |
|
embind |
提取响应(正文).blob() |
假设存储层会优化传输。 |
PPB_Var
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
VarFromUtf8 |
|
embind |
TextDecoder.decode |
|
VarToUtf8 |
|
embind |
TextEncoder.encode |
|
VarFromResource |
|
不适用 |
不适用 |
|
VarToResource |
|
不适用 |
不适用 |
|
PPB_VarArray
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
立即体验 |
|
embind |
Array[i] |
|
将 |
|
embind |
Array[i] = x |
|
GetLength |
|
embind |
Array.length |
|
SetLength |
|
embind |
Array.length = n |
|
PPB_VarArrayBuffer
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
新的 ArrayBuffer(n) |
|
ByteLength |
|
embind |
ArrayBuffer.byteLength |
|
地图 |
|
GAP |
GAP - 无直接对等项 |
Asm.js / Wasm 模块无法映射 ArrayBuffer 的单线性内存堆以外的区域。
将来使用多个记忆或内存映射可能会改善这种情况。 |
取消映射 |
|
GAP |
GAP - 无直接对等项 |
|
PPB_VarDictionary
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
{} |
|
立即体验 |
|
embind |
<Object>[i] |
|
将 |
|
embind |
<对象>[i] = x |
|
删除 |
|
embind |
delete <Object>[i] |
|
HasKey |
|
embind |
<Object> 中的 x |
|
GetKeys |
|
embind |
(<Object> 中的 k){} |
没有文字等效项,但可以构建。 |
PPB_VideoDecoder
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 进行处理 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
初始化 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 初始化参数 (VideoDecoderInitParameters) 进行处理 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
解码 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 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 - 将通过提议的 WebCodecs API 使用 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 - 将使用提议的 WebCodecs API 进行处理。当前设计会自动回收图片,并继续执行解码过程。 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
刷新 |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。API 将被命名为 Flush(),但是对于与解码调用相关的如何排序,我们还在讨论。 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
重置 |
|
GAP |
GAP - 将通过销毁 VideoDecoder 实例并创建新实例来使用建议的 WebCodecs API 进行处理。这不如专用重置方法高效,但 Reset() API 的语义仍在讨论中。 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
PPB_VideoEncoder
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
GAP - 将使用提议的 WebCodecs API 使用 VideoEncoder() 进行处理 |
|
GetSupportedProfiles |
|
GAP |
GAP(部分)- navigator.mediaCapabilities.encodingInfo() |
您必须逐个检查支持的配置文件。 |
初始化 |
|
GAP |
GAP - 将使用提议的 WebCodecs API 和 VideoEncoder() 初始化参数进行处理 |
|
GetFramesRequired |
|
GAP |
GAP - 无对等项 |
Web Codecs API 内部使用的帧池不太可能公开。 |
GetFrameCodedSize |
|
GAP |
GAP - 无对等项 |
Web Codecs API 内部使用的帧池不太可能公开。 |
GetVideoFrame |
|
GAP |
GAP - 将使用提议的 WebCodecs API 通过 ReadableStream.pipeThrough(VideoEncoder) 进行处理。这会直接在 Readable 流中编码数据,而不是在编码前抓取单个帧来填充数据。 |
|
编码 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoEncoder) 进行处理 |
|
GetBitstreamBuffer |
|
GAP |
GAP - 将使用提议的 WebCodecs API 进行处理。当前设计会自动检查通过管道传输的编码比特流缓冲区。 |
WebCodecs API 目前假定可以复制比特流缓冲区,而不是将其加入池,因此无需回收。 |
RecycleBitstreamBuffer |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。当前设计将自动回收缓冲区,以保持编码过程的顺利进行。 |
将来这一点不太可能改变,因为对性能的影响会更小。 |
RequestEncodingParametersChange |
|
GAP |
GAP - 将由提议的 Web Codecs API 处理。某些参数可以动态更改,而另一些参数则需要拆解编码器。 |
|
关闭 |
|
GAP |
GAP - 将使用提议的 WebCodecs API 通过使用 VideoEncoder.Close() 进行处理 |
|
PPB_VideoFrame
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetTimestamp |
|
GAP |
GAP - 将使用提议的 WebCodecs API 进行处理。 |
|
SetTimestamp |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetFormat |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetSize |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetDataBuffer |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetDataBufferSize |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
PPB_View
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetRect |
|
embind |
Element.getBoundingClientRect |
|
IsFullscreen |
|
embind |
Document.fullScreenEnabled |
适用于文档,而不仅仅是单个元素。 |
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
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
WebSocket.WebSocket |
|
关联 |
|
GAP |
WebSocket.WebSocket(url, ...)
WebSocket “open”事件 |
|
关闭 |
|
GAP |
WebSocket.close |
|
ReceiveMessage |
|
GAP |
WebSocket “message”事件
WebSocket“error”事件
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
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
图形 3D 上下文丢失 |
|
SDL |
画布“webglcontextlost”事件 |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
HandleInputEvent |
|
SDL |
Element.addEventListener |
|
PPP_Instance
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
DidCreate |
|
不适用 |
<Element>[key] |
借助通用 DOM 访问权限,您可以提取标记属性 |
DidDestroy |
|
不适用 |
不适用 |
不会因 NaCl 而触发 |
DidChangeView |
|
不适用 |
元素“resize”事件 |
|
DidChangeFocus |
|
不适用 |
元素“focus”“focusin”“focusout”事件 |
|
HandleDocumentLoad |
|
不适用 |
GAP - 无法注册为 MIME 类型处理程序 |
您可以通过应用 + 清单条目设置 NaCl 模块来处理特定 MIME 类型。 |
PPP_MessageHandler
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
HandleMessage |
|
embind |
MessagePort“message”事件
窗口“消息”事件 |
|
HandleBlockingMessage |
|
不适用 |
GAP - 无直接对等项 |
类似的同步可以使用 Atomics.wait 在主线程外完成。添加此 API 是为了支持模拟同步插件 API。 |
PPP_Messaging
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
HandleMessage |
|
embind |
MessagePort“message”事件
窗口“消息”事件 |
|
PPP_MouseLock
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
MouseLockLost |
|
SDL |
元素“pointerlockchange”“pointerlockerror”事件 |
|
IRT
PPB_Audio
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
x |
SDL(部分) |
GAP(部分)- AudioWorkletNode 大致等效 |
AudioWorkletSpec 已完成,但 AudioDeviceClient 可能更适合此 API。AudioDeviceClient 仍由社区指定。此 API 可能没有大致等效的工作流。 |
GetCurrentConfig |
|
SDL |
AudioContext.* (获取传入的设置) |
|
StartPlayback |
|
SDL |
AudioBufferSourceNode.start |
|
StopPlayback |
|
SDL |
AudioBufferSourceNode.stop |
|
PPB_AudioBuffer
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetTimestamp |
|
SDL |
AudioBufferSourceNode.start(参数) |
每次传入,而不是附加到缓冲区。 |
SetTimestamp |
|
SDL |
AudioBufferSourceNode.start(参数) |
|
GetSampleRate |
|
SDL |
AudioBuffer.sampleRate |
|
GetSampleSize |
|
GAP |
GAP - WebAudio 仅使用 32 位浮点数,而 PPAPI 使用 16 位整数。 |
从理论上讲,PPAPI 支持多种抽样规模。实际上,它仅支持 16 位样本。遗憾的是,开发者请求使用 16 位采样大小以节省内存用量。Web Audio 规范的下一版本将实现对 16 位采样的支持。可以通过对来自 decodeAudioData 的音频使用 16 位缓冲区,实现与 Firefox 类似的 AudioBuffer 优化 |
GetNumberOfChannels |
|
SDL |
AudioBuffer.numberOfChannels |
|
GetDataBuffer |
|
SDL |
AudioBuffer.getChannelData |
|
GetBufferSize |
|
SDL |
AudioBuffer.length |
|
PPB_AudioConfig
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
CreateStereo16Bit |
|
GAP |
GAP - 仅支持 32 位浮点样本 |
下一版网络音频规范将实现对 16 位样本的支持。 |
GetSampleRate |
|
SDL |
AudioContext.sampleRate |
|
GetSampleFrameCount |
|
SDL |
AudioBuffer.length |
|
RecommendSampleRate |
|
SDL |
AudioContext.sampleRate(来自默认构造函数) |
默认情况下,AudioContext 的首选采样率与硬件音频设备的实际采样率一致。 |
RecommendSampleFrameCount |
|
GAP |
GAP - 将使用计划中的 AudioDeviceClient 进行处理 |
我们有一个开放的问题,即允许用户指定大小,但该功能仍在定义中。最好使用 AudioDeviceClient 来处理此问题,因为它可以告诉您给定硬件的适当大小。 |
PPB_Console
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
日志 |
|
Utime |
console.log/warn/error/... |
|
LogWithSource |
|
GAP |
GAP |
除非开发者提出了针对 LogWithSource 提供的功能的特定用例,否则 Console API 被视为足够完整的替代方案。DevTools Source Maps 可用于调试以原始源语言编写的转译 JavaScript。 |
PPB_Core
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
getTime |
|
Utime |
new Date().getTime() |
|
getTimeTicks |
|
Utime |
新 Date().getTime() |
|
IsMainThread |
|
GAP |
window.document !== undefined |
|
CallOnMainThread |
|
GAP |
Worker.postMessage + Atomics.wait |
可以构建等效的同步。 |
PPB_FileIO
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
FS(部分) |
window.chooseFileSystemEntries() |
create 和 open 的使用方式不同,但它们的作用相同。 |
打开 |
|
FS(部分) |
window.chooseFileSystemEntries() |
|
查询 |
|
FS(部分) |
Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified |
GAP(部分)- Blob.type 也可用于检查 MIME 类型。无法使用 Native File System API 确定文件系统类型、创建时间和上次访问时间。 |
触摸 |
|
FS(部分) |
FileSystemDirectoryHandle.getFile("name", {create: true}) |
|
读取 |
|
FS(部分) |
Blob.slice().arrayBuffer() |
|
写入 |
|
FS(部分) |
FileSystemWriter.write() |
|
SetLength |
|
FS(部分) |
FileSystemWriter.truncate() |
|
吸顶式 |
|
GAP(部分) |
GAP(部分)- 调用 FileSystemWrite.close() 时,系统将刷新文件 |
这是特意设计的,因为 Native File System API 文件会向操作系统公开,因此在向操作系统显示数据之前,需要先执行安全浏览检查。 |
关闭 |
|
FS(部分) |
FileSystemWriter.close() |
不会取消待处理的操作,但会将迄今为止写入的所有数据刷新到磁盘。 |
ReadToArray |
|
GAP |
Blob.slice().arrayBuffer() 或 Blob.arrayBuffer() |
允许并行执行多个子范围读取。 |
PPB_FileRef
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
FS(部分) |
FileSystemDirectoryHandle.getFile("name", {create: true}) |
|
GetFileSystemType |
|
FS(部分) |
FileSystem.type |
|
GetName |
|
FS(部分) |
File.name |
|
GetPath |
|
FS(部分) |
差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 |
无法确定文件的绝对路径,并且用户必须授予访问包含该文件的目录的权限。 |
GetParent |
|
FS(部分) |
差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 |
用户必须授予访问包含相应文件的目录的权限。 |
MakeDirectory |
|
FS(部分) |
FileSystemHandle.getDirectory(..., {createIfNotExists: true}) |
|
触摸 |
|
FS(部分) |
FileSystemDirectoryHandle.getFile("name", {create: true}) |
写入可能会被提升修改时间。 |
删除 |
|
FS(部分) |
FileSystemDirectoryHandle.removeEntry() |
与 PPAPI 不同,目录不必为空。 |
重命名 |
|
FS(部分) |
GAP(部分)- 使用 Native File System API 时,可以使用新名称 FileSystemFileHandle.getFile() 和 FileSystemFileHandle.createWriter().write() 与旧文件的内容组合来写入文件。然后使用 FileSystemDirectoryHandle.removeEntry() 删除旧文件。 |
在原生文件系统 API 中,没有一个直接 API 可以一步完成此工作。 |
查询 |
|
GAP(部分) |
Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified |
GAP(部分)- Blob.type 还可用于检查 MIME 类型。无法使用原生文件系统 API 确定文件系统类型、创建时间和上次访问时间。 |
ReadDirectoryEntries |
|
FS(部分) |
FileSystemDirectoryHandle.getEntries() |
|
PPB_FileSystem
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
FS(部分) |
window.requestFileSystem |
JS API 只需一步即可搞定 |
打开 |
|
GAP |
window.requestFileSystem |
JS API 只需一步即可搞定 |
GetType |
|
GAP |
FileSystem.type |
|
PPB_Fullscreen
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
IsFullScreen |
|
html5.h |
Document.fullscreenEnabled |
|
SetFullscreen |
|
html5.h |
Document.requestFullscreen |
|
GetScreenSize |
|
html5.h |
Document.exitFullscreen |
|
PPB_Gamepad
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
试阅内容 |
|
SDL |
Gamepad.* |
Gamepad 对象公开相对于 navigationStart 的时间戳。当从硬件收到数据时,该值会更新 https://www.w3.org/TR/gamepad/#gamepad-interface |
PPB_Graphics2D
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
Canvas.getContext('2d') 中的资源 |
|
描述 |
|
SDL |
Canvas.clientWidth + Canvas.clientHeight |
|
PaintImageData |
|
SDL |
CanvasRenderingContext2D.putImageData |
|
滚动 |
|
GAP |
CanvasRenderingContext2D.scrollIntoView、CanvasRenderingContext2D.drawImage |
GAP(部分)- 可通过以下方法实现:使用偏移将画布绘制到其自身上,使用 drawImage,然后填充其余部分。 |
ReplaceContents |
|
SDL |
CanvasRenderingContext2D.drawImage |
|
吸顶式 |
|
GAP |
无直接对等项 |
GAP(部分)- 绘制代码的末尾始终会有一个隐式刷新;这种情况不太可能发生变化。不过,
OffscreenCanvas
和
ImageBitmapRenderingContext
提供类似的功能。 |
SetScale |
|
SDL |
CanvasRenderingContext2D.scale |
|
GetScale |
|
SDL |
CanvasRenderingContext2D.currentTransform |
|
SetLayerTransform |
|
SDL |
CanvasRenderingContext2D.setTransform
CanvasRenderingContext2D.scale
CanvasRenderingContext2D.translate |
|
PPB_Graphics3D
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetAttribMaxValue |
|
OpenGL ES 3.0 |
WebGL 2.0 |
GAP(部分)- WebGL 2.0 和 Emscripten 提供的 OpenGL ES 3.0 支持用户定义的多重采样帧缓冲区,其中所有可通过 PPAPI 配置的参数均可设置。 |
制作 |
|
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 |
无直接对等项 |
GAP(部分)-
绘制代码末尾始终存在隐式 flush;不太可能
进行更改。不过,
OffscreenCanvas
和
ImageBitmapRenderingContext
提供类似的功能。 |
PPB_ImageData
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetNativeImageDataFormat |
|
SDL |
ImageData 要求 RGBA 顺序 |
|
IsImageDataFormatSupported |
|
SDL |
ImageData 要求 RGBA 顺序 |
|
制作 |
|
SDL |
CanvasRenderingContext2d.createImageData |
|
描述 |
|
SDL |
ImageData 从不具有 stride |
|
地图 |
|
SDL |
ImageData.data |
|
取消映射 |
|
SDL |
ImageData.data |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
RequestInputEvents |
|
SDL |
无直接对等项 |
由于 JS / Wasm 在主线程上运行,因此缺少此功能的相关程度较低,并且能够以更便宜的方式过滤事件,而不会产生跨进程往返。 |
RequestFilteringInputEvents |
|
SDL |
鼠标* 键* 滚轮* 触摸* 组合* 事件 |
|
|
|
SDL |
Element.addEventListener |
|
ClearInputEventRequest |
|
SDL |
Element.removeEventListener |
|
GetType |
|
SDL |
事件类后代 |
|
GetTimeStamp |
|
SDL |
Event.timeStamp |
|
GetModifiers |
|
SDL |
*Event.altKey/shiftKey/metaKey/ctrlKey |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
MouseEvent |
|
GetButton |
|
SDL |
MouseEvent.button |
|
GetPosition |
|
SDL |
MouseEvent.client*/page*/offset* |
|
GetClickCount |
|
SDL |
“dblclick”与“mousedown”事件 |
|
GetMovement |
|
SDL |
MouseEvent.movement* |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
WheelEvent |
|
GetDelta |
|
SDL |
WheelEvent.delta* |
|
GetTicks |
|
GAP |
GAP - deltaMode 种类包含此信息,但并未完全包含。 |
以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 |
GetScrollByPage |
|
GAP |
GAP - deltaMode 种类包含此信息,但并未完全包含。 |
以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 |
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
KeyboardEvent |
|
GetKeyCode |
|
SDL |
KeyboardEvent.keyCode |
|
GetCharacterText |
|
SDL |
KeyboardEvent.key |
|
GetCode |
|
SDL |
KeyboardEvent.code |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
SDL |
TouchEvent |
|
AddTouchPoint |
|
SDL |
TouchEvent.touches.push |
|
GetTouchCount |
|
SDL |
TouchEvent.touches.length |
|
GetTouchByIndex |
|
SDL |
TouchEvent.touches[i] |
|
GetTouchById |
|
SDL |
Touch.indentifer(请自行确定) |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
CompositionEvent |
|
GetText |
|
GAP |
CompositionEvent.data |
|
GetSegmentNumber |
|
GAP |
GAP - 无直接对等项 |
这些数据可能会从 CompositionEvent.data 中检索。 |
GetSegmentOffset |
|
GAP |
GAP - 无直接对等项 |
|
GetTargetSegment |
|
GAP |
GAP - 无直接对等项 |
|
GetSelection |
|
GAP |
GAP - 无直接对等项 |
|
PPB_Instance
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
BindGraphics |
|
SDL |
Canvas.getContext(由于绑定是自动进行的,因此无效)。 |
|
IsFullFrame |
|
GAP |
GAP - 没有等同于 MIME 类型处理程序的功能。 |
NaCl 应用可以注册以处理特定 MIME 类型并拥有整个文档。 |
DidCreate |
|
不适用 |
<Element>[key] |
借助通用 DOM 访问权限,您可以提取标记属性 |
DidDestroy |
|
不适用 |
不适用 |
不会因 NaCl 而触发 |
DidChangeView |
|
不适用 |
元素“resize”事件 |
|
DidChangeFocus |
|
不适用 |
元素“focus”“focusin”“focusout”事件 |
|
HandleDocumentLoad |
|
不适用 |
GAP - 无法注册为 MIME 类型处理程序 |
NaCl 模块(通过应用 + 清单条目)可设置为处理特定的 MIME 类型。 |
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
配置 |
|
GAP |
getUserMedia() |
getUserMedia() 中的约束条件可以提供要在 MediaStreamTrack 中使用的配置值。 |
GetAttrib |
|
GAP |
MediaStreamTrack.getSettings() |
|
GetId |
|
GAP |
MediaStreamTrack.id |
|
HasEnded |
|
GAP |
MediaStreamTrack.readyState |
|
GetBuffer |
|
GAP |
GAP - 无对等方法 |
|
RecycleBuffer |
|
GAP |
GAP - 无对等项 |
|
关闭 |
|
GAP |
MediaStreamTrack.stop() |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
画布截图 |
Canvas Capture 支持以编程方式引入视频帧。 |
配置 |
|
GAP |
applyConstraints(), getUserMedia() |
差距(部分)- Web API 中可用的配置范围可能与 PPAPI 不同。 |
GetAttrib |
|
GAP |
MediaStreamSettings.width |
|
|
|
GAP |
MediaStreamSettings.height |
|
|
|
GAP |
GAP - 无与 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES 对等项 |
MediaStream 无法预加载,因此绝不会缓冲:https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements |
|
|
GAP |
GAP - 没有等效于 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT |
|
GetId |
|
GAP |
MediaStreamTrack.id |
|
HasEnded |
|
GAP |
MediaStreamTrack.readyState |
|
GetFrame |
|
GAP |
GAP - 无等效项 |
|
RecycleFrame |
|
GAP |
GAP - 无对等项 |
|
关闭 |
|
GAP |
MediaStreamTrack.stop() |
|
GetEmptyFrame |
|
GAP |
GAP - 无等效项 |
|
PutFrame |
|
GAP |
GAP - 无对等方法 |
|
PPB_MessageLoop
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
GetForMainThread |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
GetCurrent |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
AttachToCurrentThread |
|
不适用 |
大多数情况下没有问题,工作器会获得隐式事件循环。 |
|
您可以在 |
|
不适用 |
大多数情况下没有问题,工作器会获得隐式事件循环。 |
|
PostWork |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
PostQuit |
|
不适用 |
工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 |
|
PPB_Messaging
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
PostMessage |
|
不适用 |
Window.postMessage |
|
RegisterMessageHandler |
|
不适用 |
Window.addEventListener |
|
UnregisterMessageHandler |
|
不适用 |
Window.removeEventListener |
|
PPB_MouseCursor
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
SetCursor |
|
SDL |
Element.style.cursor |
支持使用同一组常用光标。
可以使用 url(..) 实现自定义光标。
您可以使用数据 URI 实现动态自定义光标。
CSS3 支持指定热点。 |
PPB_MouseLock
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
LockMouse |
|
SDL |
Element.requestPointerLock |
|
UnlockMouse |
|
SDL |
Element.exitPointerLock |
|
PPB_OpenGLES2
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
多种方法 |
|
OpenGLES |
功能接近 WebGL 1.0。 |
|
|
x |
|
OffscreenCanvas |
|
PPB_TextInputController
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
SetTextInputType |
|
GAP |
GAP - 可能被 Input Method Editor API 填充 |
有些开发者希望能够以这种方式进行提示,或者更喜欢在画布内拦截并显示 IME 事件 / 输出内嵌的功能。 |
UpdateCaretPosition |
|
GAP |
GAP - 可能由输入法编辑器 API 填充 |
https://www.w3.org/TR/ime-api/ |
CancelCompositionText |
|
GAP |
GAP - 可能由输入法编辑器 API 填充 |
https://www.w3.org/TR/ime-api/ |
UpdateSurroundingText |
|
GAP |
GAP - 可能由输入法编辑器 API 填充 |
https://www.w3.org/TR/ime-api/ |
PPB_URLLoader
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
new XMLHttpRequest(); |
|
未解决 |
|
embind |
XMLHttpRequest.open |
|
FollowRedirect |
|
embind |
Request.redirect |
|
|
|
GAP |
GAP - 无 XMLHTTPRequest 等效项 |
|
GetUploadProgress |
|
embind |
XMLHttpRequest “progress”事件 |
|
|
|
GAP |
FetchObserver |
尚未指定或实现;https://github.com/whatwg/fetch/issues/607 |
GetDownloadProgress |
|
embind |
XMLHttpRequest “progress”事件 |
|
|
|
GAP |
FetchObserver |
尚未说明或实施;https://github.com/whatwg/fetch/issues/607 |
GetResponseInfo |
|
embind |
XMLHttpRequest.getAllResponseHeaders |
|
|
|
embind |
提取响应。* |
|
ReadResponseBody |
|
embind |
XMLHttpRequest.response |
|
|
|
embind |
正文。*(响应是正文) |
|
FinishStreamingToFile |
|
embind |
GAP - 无直接对等项 |
XMLHttpRequest 和 Fetch 都假定流式传输到内存,而不是直接传输到存储空间。 |
关闭 |
|
embind |
XMLHttpRequest.abort |
|
|
|
GAP |
Fetch API:AbortSignal 和 AbortController |
|
PPB_URLRequestInfo
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
XMLHttpRequest |
|
|
|
embind |
提取请求 |
|
SetProperty |
|
GAP |
GAP - 没有 XMLHttpRequest 的直接等效项 |
XMLHttpRequest 不提供根据请求限制以下重定向、流式传输到文件、设置引荐来源网址或凭据政策的直接方法。 |
|
|
embind |
请求。* |
|
AppendDataToBody |
|
embind |
XMLHttpRequest.send |
GAP - 两者都必须有完整的身体,而不是部分。 |
|
|
embind |
fetch(.., options:body) |
|
AppendFileToBody |
|
GAP |
fetch() 上传流式传输 |
https://www.chromestatus.com/features/5274139738767360 |
|
|
不适用 |
<form> |
您也可以使用 FileReader 进行读取和上传,但这更类似于 AppendDataToBody |
PPB_URLResponseInfo
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetProperty |
|
embind |
XMLHttpRequest.getAllResponseHeaders + 其他 |
|
|
|
embind |
提取响应。* |
|
GetBodyAsFileRef |
|
embind |
提取响应(正文).blob() |
假设存储层会优化传输。 |
PPB_Var
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
VarFromUtf8 |
|
embind |
TextDecoder.decode |
|
VarToUtf8 |
|
embind |
TextEncoder.encode |
|
VarFromResource |
|
不适用 |
不适用 |
|
VarToResource |
|
不适用 |
不适用 |
|
PPB_VarArray
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
立即体验 |
|
embind |
Array[i] |
|
将 |
|
embind |
Array[i] = x |
|
GetLength |
|
embind |
Array.length |
|
SetLength |
|
embind |
Array.length = n |
|
PPB_VarArrayBuffer
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
新的 ArrayBuffer(n) |
|
ByteLength |
|
embind |
ArrayBuffer.byteLength |
|
地图 |
|
GAP |
GAP - 无直接对等项 |
Asm.js / Wasm 模块无法映射 ArrayBuffer 的单线性内存堆以外的区域。
将来使用多个记忆或内存映射可能会改善这种情况。 |
取消映射 |
|
GAP |
GAP - 无直接对等项 |
|
PPB_VarDictionary
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
embind |
{} |
|
立即体验 |
|
embind |
<Object>[i] |
|
将 |
|
embind |
<对象>[i] = x |
|
删除 |
|
embind |
delete <Object>[i] |
|
HasKey |
|
embind |
<Object> 中的 x |
|
GetKeys |
|
embind |
(<Object> 中的 k){} |
没有文字等效项,但可以构建。 |
PPB_VideoDecoder
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 进行处理 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
初始化 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 初始化参数 (VideoDecoderInitParameters) 进行处理 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
解码 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 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 - 将通过提议的 WebCodecs API 使用 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 - 将使用提议的 WebCodecs API 进行处理。当前设计会自动回收图片,并继续执行解码过程。 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
刷新 |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。API 将被命名为 Flush(),但是对于与解码调用相关的如何排序,我们还在讨论。 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
重置 |
|
GAP |
GAP - 将通过销毁 VideoDecoder 实例并创建新实例来使用建议的 WebCodecs API 进行处理。这不如专用重置方法高效,但 Reset() API 的语义仍在讨论中。 |
https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming |
PPB_VideoEncoder
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
GAP - 将使用提议的 WebCodecs API 使用 VideoEncoder() 进行处理 |
|
GetSupportedProfiles |
|
GAP |
GAP(部分)- navigator.mediaCapabilities.encodingInfo() |
您必须逐个检查支持的配置文件。 |
初始化 |
|
GAP |
GAP - 将使用提议的 WebCodecs API 和 VideoEncoder() 初始化参数进行处理 |
|
GetFramesRequired |
|
GAP |
GAP - 无对等项 |
Web Codecs API 内部使用的帧池不太可能公开。 |
GetFrameCodedSize |
|
GAP |
GAP - 无对等项 |
Web Codecs API 内部使用的帧池不太可能公开。 |
GetVideoFrame |
|
GAP |
GAP - 将使用提议的 WebCodecs API 通过 ReadableStream.pipeThrough(VideoEncoder) 进行处理。这会直接在 Readable 流中编码数据,而不是在编码前抓取单个帧来填充数据。 |
|
编码 |
|
GAP |
GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoEncoder) 进行处理 |
|
GetBitstreamBuffer |
|
GAP |
GAP - 将使用提议的 WebCodecs API 进行处理。当前设计会自动检查通过管道传输的编码比特流缓冲区。 |
WebCodecs API 目前假定可以复制比特流缓冲区,而不是将其加入池,因此无需回收。 |
RecycleBitstreamBuffer |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。当前设计将自动回收缓冲区,以保持编码过程的顺利进行。 |
将来这一点不太可能改变,因为对性能的影响会更小。 |
RequestEncodingParametersChange |
|
GAP |
GAP - 将由提议的 Web Codecs API 处理。某些参数可以动态更改,而另一些参数则需要拆解编码器。 |
|
关闭 |
|
GAP |
GAP - 将使用提议的 WebCodecs API 通过使用 VideoEncoder.Close() 进行处理 |
|
PPB_VideoFrame
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetTimestamp |
|
GAP |
GAP - 将使用提议的 WebCodecs API 进行处理。 |
|
SetTimestamp |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetFormat |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetSize |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetDataBuffer |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
GetDataBufferSize |
|
GAP |
GAP - 将通过建议的 WebCodecs API 进行处理。 |
|
PPB_View
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetRect |
|
embind |
Element.getBoundingClientRect |
|
IsFullscreen |
|
embind |
Document.fullScreenEnabled |
适用于文档,而不仅仅是单个元素。 |
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
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
|
GAP |
WebSocket.WebSocket |
|
关联 |
|
GAP |
WebSocket.WebSocket(url, ...)
WebSocket “open”事件 |
|
关闭 |
|
GAP |
WebSocket.close |
|
ReceiveMessage |
|
GAP |
WebSocket “message”事件
WebSocket“error”事件
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
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
图形 3D 上下文丢失 |
|
SDL |
画布“webglcontextlost”事件 |
|
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
HandleInputEvent |
|
SDL |
Element.addEventListener |
|
PPP_Instance
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
DidCreate |
|
不适用 |
<Element>[key] |
借助通用 DOM 访问权限,您可以提取标记属性 |
DidDestroy |
|
不适用 |
不适用 |
不会因 NaCl 而触发 |
DidChangeView |
|
不适用 |
元素“resize”事件 |
|
DidChangeFocus |
|
不适用 |
元素“focus”“focusin”“focusout”事件 |
|
HandleDocumentLoad |
|
不适用 |
GAP - 无法注册为 MIME 类型处理程序 |
您可以通过应用 + 清单条目设置 NaCl 模块来处理特定 MIME 类型。 |
PPP_MessageHandler
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
HandleMessage |
|
embind |
MessagePort“message”事件
窗口“消息”事件 |
|
HandleBlockingMessage |
|
不适用 |
GAP - 无直接对等项 |
类似的同步可以使用 Atomics.wait 在主线程外完成。添加此 API 是为了支持模拟同步插件 API。 |
PPP_Messaging
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
HandleMessage |
|
embind |
MessagePort“message”事件
窗口“消息”事件 |
|
PPP_MouseLock
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
MouseLockLost |
|
SDL |
元素“pointerlockchange”“pointerlockerror”活动 |
|
PPAPI(应用)
PPB_HostResolver
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
x |
GAP |
差距(部分)- 无直接对等项 |
|
解决 |
x |
GAP |
GAP(部分)- 无直接对等项 |
|
GetCanonicalName |
x |
GAP |
差距(部分)- 无直接对等项 |
|
GetNetAddressCount |
x |
GAP |
差距(部分)- 无直接对等项 |
|
GetNetAddress |
x |
GAP |
差距(部分)- 无直接对等项 |
|
PPB_NetAddress
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
CreateFromIPv4Address |
x |
GAP |
GAP(部分)- 无直接对等项 |
|
CreateFromIPv6Address |
x |
GAP |
差距(部分)- 无直接对等项 |
|
GetFamily |
x |
GAP |
差距(部分)- 无直接对等项 |
|
DescribeAsString |
x |
GAP |
差距(部分)- 无直接对等项 |
|
DescribeAsIPv4Address |
x |
GAP |
差距(部分)- 无直接对等项 |
|
DescribeAsIPv6Address |
x |
GAP |
GAP(部分)- 无直接对等项 |
|
PPB_NetworkList
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetCount |
x |
GAP |
GAP - 无直接对等项 |
|
GetName |
x |
GAP |
GAP - 无直接对等项 |
|
GetType |
x |
GAP |
GAP - 无直接对等项 |
|
GetState |
x |
GAP |
GAP - 无直接对等项 |
|
GetIpAddress |
x |
GAP |
GAP - 无直接对等项 |
|
GetDisplayName |
x |
GAP |
GAP - 无直接对等项 |
|
GetMTU |
x |
GAP |
GAP - 无直接对等项 |
|
PPB_NetworkMonitor
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
制作 |
x |
GAP |
GAP - 无直接对等项 |
|
UpdateNetworkList |
x |
GAP |
GAP - 无直接对等项 |
|
PPB_NetworkProxy
PPAPI 方法 |
假设线程 |
Emscripten |
网络 API |
限制 |
GetProxyForURL |
x |
GAP |
GAP - 无直接对等项 |
|
PPB_TCPSocket 和 PPB_UDPSocket
没有用于迁移的直接 1 对 1 映射。不过,我们在下文中列出了一些用户场景以及建议的迁移路径。
*:未来可能为 WebTransport
**: 请访问 chromestatus,了解可用情况