WebKit 上周回顾
一切都在简化
上周,所有人都热衷于重构。一些人把“春季大扫除”执行得很彻底,许多补丁落地,让 WebKit 更简洁、更干净。
一个很好的改变是关于 Objective-C 对象被 RetainPtr 采用的方式。以前,有3种方式可以采用指针:
RetainPtr<id> foo = adoptNS([...]);
RetainPtr<id> bar(AdoptNS, [...]);
RetainPtr<id> baz;
baz.adoptNS([...]);
Darin Adler 和 Anders Carlsson 撰写了 几个 补丁,将所有代码统一到 adoptNS([…]) 语法背后。在此过程中,一些 bug 也 被发现并修复了。
Darin 和 Anders 另一个出色的重构是将内存的手动管理转换为尽可能使用智能指针。特别是,他们追查了 deleteAllValues() 在各种 数据结构上 的用法 并更新了 它们的存储,使其使用 WTF 的 OwnPtr。新代码更容易理解,并且在这些结构上意外泄露内存变得困难。
还有一些漂亮的头文件清理工作,以使 WTF 中所有内容的定义更加合理。
新行为
和往常一样,修复了许多 bug。一些可见的改变:
- Zalan Bujtas 不得不移除他上周刚启用的 performance.now() API :(。一些网站使用该函数进行 Navigation Timing API 的特性检测。野外存在的 JavaScript 代码将强制 WebKit 一次性启用所有功能。
- Enrica Casucci 的一个不错的修复是 当系统样式参数更新时动态重新计算样式。
- Christophe Dumez 移除了许多接口定义上的 [NoInterfaceObject],使得接口对象在 Window 对象上可见,这符合规范定义。
- Dongseong Hwang 修复了几个 canvas 上下文函数的定义。以前,scale()、rotate()、translate()、transform()、setTransform()、createLinearGradient() 和 createRadialGradient() 被错误地定义为带有可选参数。
谈到 canvas,我花了一点时间改进 Canvas2D 上下文的 fillStyle 和 strokeStyle。我见过的一种模式是代码在每一帧都重新创建 CanvasPattern 或 CanvasGradient。例如:
function draw() { // Bad idea: don't do that for every frame. var gradient = context.createRadialGradient(...); gradient.addColorStop(...); context.strokeStyle = gradient; context.lineTo(...) }
当 Gradient/Pattern 在帧与帧之间保持不变时,最好在开始时初始化这些对象并在每一帧中重复使用它们。不幸的是,许多教程都陷入了丢弃这些对象的陷阱。
引擎工程
- Simon Fraser 正在修复他能找到的每一个合成 bug。
- Andreas Kling 创建了一种方式,当 Web 进程的最后一个页面关闭时,可以更快地关闭它们,从而使 UI 进程响应更迅速。
- Christophe Dumez 修复了生成代码的编码风格,改进了暴露构造函数对象的测试,添加了对 NoInterfaceObject 的支持,并从绑定生成器中移除了对 TransferList 的支持。
- Anders Carlsson 没有睡觉。除了他所做的所有清理和错误修复工作外,他还完成了并启用了 WebKit2 的 UI 进程存储功能。有了这个,各种 Web Storage API 在多个 Web 进程之间具有一致的状态。
本周的 WebKitten 是 Anders Carlsson,他提交了超过50个补丁,让这篇博客很难写。其中一半用于重构和清理代码,另一半则为 WebKit2 添加功能。
展望未来
- Michael Saboff 启动了一个 JavaScriptCore 的 ARM 工具链的 Thumb2 反汇编器。这是一项了不起的工作,我迫不及待地想尝试一下。
- Sergio Villar Senin 修复了 CSS Variables,这带来了希望,表明有人对开发该功能感兴趣 🙂