Rust in Everything
基于 tauri 2.12.5

窗口与协议

03 运行时讲到 wry 怎么把协议变成 WKURLSchemeHandler、把脚本变成 WKUserScript 为止,04 应用与管理器讲到 setup 时按配置建窗口为止。这一部分讲两者之间 tauri 本体做的事:建窗口时往 PendingWebview 上补了哪些脚本、挂了哪些 scheme,这些 scheme 收到请求后按什么规则回应。源码集中在 window/mod.rs、webview/mod.rs、webview/webview_window.rs、manager/window.rs、manager/webview.rs、manager/mod.rs 里的 get_asset 和 set_csp、protocol/ 目录和 scope/fs.rs,以及 scripts/ 下的 JS 模板。

  1. Window、Webview、WebviewWindow:窗口和 webview 各一张按标签索引的表,WebviewWindow 只是一对同名的组合;同名时先报 webview 已存在;unstable 下一个窗口放多个 webview;close() 先 CloseRequested 后 Destroyed,页面监听了 close-requested 时 Rust 会替它拦下关窗。
  2. 初始化脚本:从 WKWebView 里倒出实际注入的 12 段脚本,逐段对上 wry、prepare_pending_webview、init.js 模板、插件和用户脚本;withGlobalTauri 加一段 41 KB 的独立脚本,freezePrototype 是 init.js 的第一句;macOS 上它们都不进 iframe。
  3. tauri:// 协议与 CSP:资源按原路径、.html、/index.html、index.html 四级回退,不存在的 /foo.js 拿到 200 和 index.html;配了 CSP 时每次返回 HTML 都换新 nonce、追加哈希,script-src 里的 'unsafe-inline' 因此失效;Windows 上源是 http://tauri.localhost。
  4. asset:// 协议与文件作用域:convertFileSrc 生成的 URL,..、作用域外、拒绝表、点文件都回空的 403,没开 feature 时请求直接失败;Range 每次最多 1000 KiB,416 响应缺 CORS 头。
flowchart TB
  wwb["WebviewWindowBuilder::build"] --> tables["窗口表 与 webview 表"]
  wwb --> ppw["prepare_pending_webview"]
  ppw --> scripts["初始化脚本"]
  ppw --> schemes["挂 scheme"]
  schemes --> tauri["tauri 内嵌资源 加 CSP"]
  schemes --> ipc["ipc 见 06"]
  schemes --> asset["asset 本地文件 加作用域"]
  tables --> close["close 与 Destroyed"]

ipc scheme 和 ipc-protocol.js 属于调用主线,在 06 IPC;CSP、freezePrototype 和 isolation 模式作为安全机制在 07 安全。

本部分的实验都在 M2 Max、macOS 27、rustc 1.99.0 上用真实的 Wry 运行时跑,窗口一律隐藏;Windows 和 Linux 上的行为只读了源码和 wry 的文档。

💬 关联讨论

发起讨论
加载中...