v0.1首个版本化设计基线查看版本范围
Developer

print

print 把 guest 已有的静态文档交给系统打印界面。宿主验证格式、在可信页面中预览并让用户选择打印机;guest 不获得打印设备、驱动、真实临时 URL 或后台打印权。

基本示例

async function printInvoice() {
  const pdf = buildInvoicePdf();
  const result = await host.print.open(pdf, 'application/pdf');
  if (result === null) showMessage('已取消打印');
}

调用必须来自用户点击等可信操作。返回成功只表示系统打印流程已接受,不保证纸张最终输出。

适用场景

  • 发票、报告、标签和静态画布结果。
  • 让用户在系统界面选择打印机、页数和份数。
  • 不需要 guest 观察设备信息的本地交付。

后台静默打印、打印机枚举、驱动设置、队列状态、原始打印协议和网络打印机发现不在 v0.1。

能力声明

{
  "capabilities": ["host:print.open"]
}

Reference

print.open(document: ByteSource, mime) -> { accepted: true } | null

v0.1 支持 application/pdf 和明确列入白名单的静态栅格格式。用户关闭可信打印 UI 时返回 null

栅格图示例

const png = encodeCanvasResultAsPng();
await host.print.open(png, 'image/png');

guest 负责形成完整、自包含文档;宿主不解析 HTML、执行脚本或加载文档中的外部 URL。

原生 WASM 示例

uint8_t *pdf;
size_t pdf_len = build_report_pdf(&pdf);
PrintResult result = host_print_open(
  byte_source(pdf, pdf_len),
  "application/pdf"
);

调用期间绑定层可以复制或流式交付数据,但不能在返回后继续引用 guest 可变内存。

用户流程

  1. guest 在可信用户操作中提交自包含文档。
  2. 宿主验证 MIME、魔数、结构和预算。
  3. 宿主在可信 UI 中显示预览与应用身份。
  4. 用户选择打印或取消。
  5. 宿主把文档交给系统打印设施,只向 guest 返回接受/取消。

guest 不能传回跳 URL、窗口特征、打印机名或任意系统选项。

安全与预算

  • 信任档位:green,前提是用户可见、本地、write-only、无回程且有预算与审计。
  • 单次文档字节、页数、解码像素、并发打印流程和调用速率必须有上限。
  • PDF 解析在隔离、受预算的组件中完成;拒绝加密、嵌入脚本、外部引用或平台不支持的复杂特性。
  • 临时文档和预览 URL 不返回 guest,流程结束后及时销毁。
  • 审计记录应用、时间和结果,不记录文档内容。

错误与测试

特有错误包括 activation-requiredunsupported-formatinvalid-documentlimit-exceededplatform-unavailable。一致性测试至少覆盖取消、损坏 PDF、伪造 MIME、超大页、解码炸弹、重复点击、页面失焦、临时文件清理和无返回通道。

Host API 版本与分层概览Host API v0.1版本非正式提议提议canvas API呈现canvas.getInfo()方法canvas.draw()方法canvas.present()方法canvas.measureText()方法canvas.frame event事件canvas.resize event事件asset API呈现asset.read()方法asset.loadFont()方法playback API呈现playback.open()方法playback.write()方法playback.stop()方法playback.ready event事件playback.ended event事件input API输入input.focus()方法input.pointer event事件input.key event事件input.wheel event事件ime API输入ime.openSession()方法ime.updateState()方法ime.updateGeometry()方法ime.closeSession()方法ime.textUpdate event事件ime.composition event事件ime.formatUpdate event事件ime.characterBoundsRequest event事件capture API输入capture.requestCamera()方法capture.requestMic()方法capture.frame()方法capture.readAudio()方法capture.stop()方法capture.ended event事件store API数据store.get()方法store.put()方法store.delete()方法store.list()方法store.deletePrefix()方法clipboard API数据clipboard.readText()方法clipboard.writeText()方法clipboard.readImage()方法clipboard.writeImage()方法net API网络net.fetch()方法identity API身份identity.status()方法identity.login()方法identity.logout()方法env API平台集成env.snapshot()方法env.change event事件print API平台集成print.open()方法开始调用 Host API指南构建交互式绘图应用指南构建自绘文本编辑器指南管理媒体采集与播放指南组织本地数据与同步指南