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。一些可见的改变:

谈到 canvas,我花了一点时间改进 Canvas2D 上下文的 fillStylestrokeStyle。我见过的一种模式是代码在每一帧都重新创建 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 进程之间具有一致的状态。

本周的 WebKittenAnders Carlsson,他提交了超过50个补丁,让这篇博客很难写。其中一半用于重构和清理代码,另一半则为 WebKit2 添加功能。

展望未来