YSU
总览

0.1.0 发布说明

第一个公开版本。内核(YSU)与外壳(Vexo)都还没到功能完整的状态,但整条链路是通的:给一个网址,它取回来、排版、画到屏幕上,可以滚动、可以点链接、可以开多个标签页、可以打开本地文件。

第一个公开版本。内核(YSU)与外壳(Vexo)都还没到功能完整的状态,但整条链路是通的:给一个网址,它取回来、排版、画到屏幕上,可以滚动、可以点链接、可以开多个标签页、可以打开本地文件。

这一版有什么

渲染内核 YSU。 HTML 词法与树构建跟着 WHATWG 规范走,字符引用是完整表(2231 条具名实体,从规范的 entities.json 生成,含数字引用与 Windows-1252 的 C1 映射)。CSS 词法、选择器、层叠、继承、计算样式各自成模块。布局有块级、行内、文本、弹性、表格。绘制产出显示列表,渲染器是 wgpu 的两条实例化管线。

外壳 Vexo。 C++17 与 Qt6。工具栏、地址栏、标签栏、状态栏都是 Qt 部件。视口部件把内核交出的像素贴到屏幕上。

C ABI。 26 个 extern "C" 函数,静态库产出。边界上只有像素,外壳碰不到 wgpu。

脚本引擎 JSE。 词法与语法分析完成,ast::dump 能把语法树按可断言的格式导出。执行部分还没有。

功能一览

能力状态
打开网址✅ HTTP/1.1 与 HTTPS,跟随重定向
HTML 解析与树构建✅ 含插入模式、收养机构、外来内容
CSS 解析与选择器匹配✅ 含 :is():where():not():nth-child() 系列
层叠与继承✅ 来源顺序、!important、内置默认样式表
块级与行内布局✅ 含外边距合并、auto 外边距居中
弹性布局✅ 单行
表格布局✅ 列宽按内容求解
文本排版✅ 断行、对齐、空白处理,由 cosmic-text 整形
绘制与渲染✅ 背景、边框、圆角、文字、裁剪
外部样式表✅ 逐个取回并应用
标签页、导航、缩放
打开本地文件✅ 命令行、拖放、文件对话框
本地文件里的外部样式表✅ 从磁盘读
网页脚本<script> 不执行
图片❌ 不显示
浮动与定位❌ 不生效
书签、下载、设置、开发者工具

需要知道的取舍

渲染按需进行。 滚动、加载完、改尺寸、改缩放时才画一次,空闲时一帧都不画。改状态之后忘了请求重绘,界面就会停在那里不动——写外壳代码时容易踩。

外壳必须链对静态库。 改了 C ABI 的签名之后要重新构建 libysu_capi.a。链到旧库会在启动时被版本号拦下,弹窗退出。

一次只有一份文档在渲染。 每个标签页有自己的内核实例,各自付各自的渲染代价。标签开多了内存会涨,没有共享。

没有连接池。 每取一个资源都是一条新连接,取完就断。取很多小样式表的页面会慢。

没有压缩传输。 请求不发 Accept-Encoding,也不解 gzip。对端返回未压缩内容,流量比主流浏览器大。

没有缓存。 刷新会重新取。

内核能力的边界

按特性分类的支持情况在支持范围,表现为「看着该动却没动」的那些在已知限制。两条值得在这里点出来:

position 能解析进计算样式,但布局阶段从不读它——absolutefixed 都按常规流处理。float 连字段都没有。

<img> 不产生任何替换内容,background-image 不生效。DrawCommand::Image 这个变体有定义,但没有任何地方生产它。

构建

Linux x86_64 上验证通过。需要 Rust 1.98.1、CMake 3.16 以上、Qt6 的 Core / Gui / Widgets。步骤见准备环境

Windows 与 macOS 上的 Rust 侧应当可以直接构建,外壳那层没有验证过。见其他平台的构建

下一个版本的方向

<script> 跑起来,把 JSE 接进内核:定义宿主接口、在 YSU 里实现它、接上事件体系。图片的采集、解码、固有尺寸、纹理上传这条链也是一整块空白。

positionfloat 是布局层最明显的两个洞——它们不补上,很多真实页面的版式就是错的。表格的 colspan / rowspan 和边框合并同理。

On this page