C# 浏览器第五轮开发预览
本轮实现自研的有界 CSS 浏览器管线:HTML DOM → 样式级联 → 布局盒 → 绘制清单 → 原生 framebuffer,以及输入事件、任务队列和外部资源加载。参考 Chromium 的渲染分层,没有嵌入 Chromium、Edge 或宿主网页控件。HTML 解析复用 AngleSharp,JavaScript 解释复用 Jint。
使用
打开桌面 Browser。点击地址栏或按 Ctrl+L,输入地址后按 Enter;点击页面可聚焦内容,键盘输入送到页面,Ctrl+L 可随时返回地址栏。链接可直接点击,滚轮先发送可取消的 DOM wheel 事件,再执行页面滚动。每个浏览器窗口拥有独立 DOM、JavaScript 全局对象和任务队列。
输入 about:Monaco,或点击起始页的 Monaco 链接,加载官方 Monaco Editor 0.52.2。默认使用官方 editor.api 和 JavaScript 语法经固定 esbuild 0.25.11 构建的核心资源,JS 2,289,080 字节、CSS 66,405 字节;来源、许可证、全部输入和输出哈希见 Core/TransformationManifest.json。浏览器程序集仅内嵌这两个 core 资源和许可证,无需 CDN;原始 AMD 资源和原清单完整留在源码与发行包 BrowserAssets/Monaco/0.52.2/,不再整体嵌入内核占用常驻内存。没有替换或伪造 Monaco API。此 profile 保留真实模型、编辑、选择和 JavaScript Monarch 着色;未移植 Web Workers / TypeScript 语言服务,未宣称智能补全、语言服务器或完整 VS Code 功能。示例文件仅在本次 RAM 会话内。
本轮 Monaco 使用 1 GiB RAM 验收。 启动器从验收记录读取 MemoryMiB,保持测试配置;不要把桌面/轻量网页的 512 MiB 配置推广到 Monaco。最新 512 MiB 在编辑申请 46,368 字节时仍 OOM,512 MiB 编辑目标尚未完成。
本轮范围
- 样式:选择器、优先级、继承、CSS 变量、盒模型、块与行内流、基础 flex、绝对/固定定位、溢出裁剪、颜色、字号、有限平移,以及 hover / active / focus 状态。有界 CSS 解析缓存复用未变样式,动态 style/link 内容、顺序与相关 DOM 变化使缓存失效并重新布局。
- 资源:外部样式表、经典 JavaScript、defer、动态 script / link 和 load / error。网络请求有数量、单项和总字符预算;校验状态、MIME、HTTPS 验证结果及混合内容。异步资源采用单线程确定性队列,没有并行网络加载或模块加载器。
- 事件:捕获、目标、冒泡、取消默认动作、焦点、鼠标/指针、键盘、beforeinput / input、DOMContentLoaded / load、真实 Promise 微任务、定时器、requestAnimationFrame,以及有限 MutationObserver / ResizeObserver。
- DOM:真实节点身份和
insertAdjacentHTML、insertAdjacentText、insertAdjacentElement,位置与输入受有界检查,变更更新实际 DOM 和布局。 - Canvas:有界 2D 像素 backing store、矩形、图像数据和真实平台字体栅格。没有 WebGL 或 GPU Canvas。
CSS 并非完整标准实现:grid、完整 table / flex wrapping、浮动、复杂堆叠上下文、旋转/倾斜、网页字体、双向文字与复杂塑形等仍未完成。脚本为受限解释器,未实现 ES modules、WebAssembly、Fetch/XHR、Worker 和完整浏览器 API。普通页面保持较小预算;仅固定内置 Monaco 页面使用较大预算。声明 CSP 的页面保守禁用自动脚本与作者样式,不能将其称为完整 CSP 实现。
原生网络仍只支持已验收的 HTTP;HTTPS/TLS 尚未移植,连接会明确拒绝。浏览器与内核共享地址空间,资源预算不等于进程安全隔离。文件、外观配置和编辑内容关机后消失。
项目仅在私有构建副本修补 Jint 的异常清理(299/300 个 finally;复杂迭代器清理仍未覆盖)和 Cosmos 的两处精确 GC 栈尾截断,保留原 GC。活动 catch 记录容量从 64 增至 4096,真正超限时明确停止。没有修改全局 .NET 或 NuGet。真实原生已通过 321 帧独立闭包/父对象、两次强制 GC,及 81 层重抛与异常后的 4 项恢复检查;启动还检查 21 项事件/异常后作用域恢复。不将这些局部修复称为完整通用异常展开。鼠标输入使用无分配有界队列,保留短按/释放顺序,溢出显式取消捕获,不合成点击。
两处分配失败防护输出 XFE_RUNTIME_OOM 并停止整个来宾,避免空分配结果继续成为托管对象;并不恢复页面或提供进程隔离。独立 512 MiB 负测申请 1 GiB ArrayBuffer 后,已验证标记、无 CPU 页错误和 QMP 清理。早期 ArgumentNull(destinationArray) 和最新 512 MiB 编辑 OOM 失败日志均保留。
最终宿主测试 575 项通过(Browser184),另有私有运行时宿主 36 项、默认生产 Monaco11 项。宿主探针用真实固定 TTF 离屏栅格,不调用宿主浏览器。最终原生浏览器 build/CSharpBoot/Proof-1791957529461874000/Result.json 在 1 GiB / 3840×2160 / 200% 通过 8 组:实际 QEMU 输入新增第四行 xfenativeedit,真实 Monaco 模型同步变化,截图增加 734 个文字墨迹像素;无需以宿主截图冒充来宾画面。内核 SHA256 为 4bea6cbfc43c19a5c50c8a9fa29fb409cd8b31df7c69e1ea67be4b8b85b7a159,镜像 SHA256 为 140021a13d1088253fd4b71cb3dc29d58200b66a4b54dc091d2dfce8a1004967。
同镜像 TCG 桌面 28 项已通过;完整 WHPX51 组验收也已通过,最终记录已由发行报告汇总。1 GiB 通过不等于 512 MiB 通过,也不证明任意网站、完整 Monaco 功能或持续 240Hz 可见呈现。
本轮发行包为 dist/XFESystem-CSharp-Preview5-Final-20261014.zip,最终结果见 Validation/CSharpBrowserPreview5-20261014-Final.json;历史 Preview4 和失败证据保留。