窗口与协议
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 模板。
- Window、Webview、WebviewWindow:窗口和 webview 各一张按标签索引的表,
WebviewWindow只是一对同名的组合;同名时先报 webview 已存在;unstable下一个窗口放多个 webview;close()先CloseRequested后Destroyed,页面监听了 close-requested 时 Rust 会替它拦下关窗。 - 初始化脚本:从 WKWebView 里倒出实际注入的 12 段脚本,逐段对上 wry、
prepare_pending_webview、init.js模板、插件和用户脚本;withGlobalTauri加一段 41 KB 的独立脚本,freezePrototype是init.js的第一句;macOS 上它们都不进 iframe。 - tauri:// 协议与 CSP:资源按原路径、
.html、/index.html、index.html四级回退,不存在的/foo.js拿到 200 和index.html;配了 CSP 时每次返回 HTML 都换新 nonce、追加哈希,script-src里的'unsafe-inline'因此失效;Windows 上源是http://tauri.localhost。 - 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 的文档。
💬 关联讨论
发起讨论加载中...