XFESystem C# 浏览器后端
此阶段提供真实 Jint 4.11.0 JavaScript 解释器、AngleSharp 1.7.1 HTML DOM,以及复用网站管线的 XFESystem.Documents.MarkdownRenderer。界面适配器实现 IJavaScriptPreviewService:
var browser = new BrowserService();
var page = browser.Navigate("about:Start"); // 真内联 JS 修改 DOM,文本包含 JavaScript ready: 12
var result = browser.PreviewJavaScript("console.log('Answer', 6 * 7)");
var markdown = browser.PreviewMarkdown("# XFESystem\n\n**Hello**");
ExecuteJavaScript 操作当前网页的解释器和有限 DOM;本地文件预览使用 PreviewJavaScript,每次建立新的无 DOM 解释器,不能读取或修改此前网页。每次导航也建立新的解释器。
显式 DOM 包含 document.getElementById/querySelector/createElement、document.title/body/documentElement,元素的 textContent/innerHTML/id/className/value/tagName/parentElement、getAttribute/setAttribute/querySelector/appendChild/remove。投影使用 ObjectInstance、ClrFunction 和属性描述符,不把 CLR 实例反射给网页。
浏览器将 HTML 转为文本及编号链接。完整 CSS 排版、外部脚本、模块、浏览器事件、JavaScript fetch、WebAssembly 尚未实现。 声明 HTTP header 或 meta CSP 的页面会保守禁止全部自动脚本,并显示原因;目前不实现完整 CSP 指令匹配。Markdown 的网页脚本增强功能(KaTeX/Mermaid 等)由 Documents 的完整 HTML 预览在宿主浏览器中单独验收,当前文本后端不会执行这些外部渲染资源。
IWebTransport 是显式网络边界,默认 UnavailableWebTransport 不访问网络/宿主磁盘。HttpWebTransport 仅供已经具备 HttpClient 所需 socket/TLS/时钟/信任根的运行时显式注入;Windows 宿主的网络测试不证明裸机已联网。HTTPS 要求 transport 确认验证证书,不允许降级到 HTTP;适配器使用默认严格证书验证、有限重定向、整次超时及正文大小上限。
可选的 IWebTransportCapabilities 声明已接入后端及其 HTTP/HTTPS 实现,BrowserService 在构造时保存快照。NativeNetworkTransport 表示显式接入裸机适配器,不表示网卡、链路、DHCP、DNS 或远端服务当前可用;每次请求仍须检查运行前提。未声明能力的旧适配器可以继续工作,但不推断其能力。当前 C# 裸机 NativeWebTransport 声明 HTTP 支持、HTTPS 不可用,并在实际 HTTPS 导航时明确拒绝;声明能力不能绕过证书验证。
解释器关闭 CLR、反射、动态字符串编译、模块加载和阻塞式 Atomics.wait,并限制脚本长度、语句数、单次分配、时间、递归、数组、控制台与返回值。DOM 节点/深度/合计文字与属性(含投影的 detached 节点)受限,失败修改回滚。这些是协作式约束,不构成进程安全隔离;Jint 单次分配限额也不是整个进程常驻内存上限。
dotnet test Tests/XFESystem.Browser.Tests/XFESystem.Browser.Tests.csproj
dotnet run --project Samples/XFESystem.BrowserDemo -- --Verify build/CSharp/BrowserDemo/HostVerification.json
测试包括真实 loopback HTTP→重定向→HTML/JS/DOM、真实 TLS 连接拒绝自签证书,以及语句/内存/输出/DOM限额、CSP、预览上下文隔离。报告明确宿主与 guest 验证范围。
NativeAOT 宿主烟测实际通过,但 Jint 4.11.0 保留禁用的动态 CLR 分支,静态分析产生 IL2026/IL2104/IL3053 告警。验证命令只将这些分析告警设为非致命并保留完整日志,未在系统项目禁用分析。发布程序实际运行验证了解释器、DOM、Markdown 与约束;裸机导入仍须由 QEMU 验收。
$Artifacts = Join-Path (Get-Location) 'build/CSharp/BrowserHostArtifacts'
dotnet publish Samples/XFESystem.BrowserDemo -c Release -r win-x64 -p:PublishAot=true "-p:ArtifactsPath=$Artifacts" -p:ILLinkTreatWarningsAsErrors=false -p:IlcTreatWarningsAsErrors=false -o build/CSharp/BrowserDemo/WindowsNativeAot
ArtifactsPath 使用绝对路径,避免多项目同时编译共享默认 obj。