对许多开发者来说,WebKit就像一个黑盒。我们把HTML、CSS、JS和其他一大堆东西丢进去,然后WebKit魔法般的以某种方式把一个看起来不错的网页展现给我们。但事实上,Paul的同事Ilya Grigorik说:
WebKit才不是个黑盒。它是个白盒。并且,它是个打开的白盒。 所以让我们来花些时间了解这些事儿:
什么是WebKit? 什么不是WebKit?
基于WebKit的浏览器是如何使用WebKit的? 为什么又有不同的WebKit?
现在,特别是Opera宣布将浏览器引擎转换为WebKit之后,我们有很多使用WebKit的浏览器,但是我们很难去界定它们有哪些相同与不同。下面我争取为这个谜团做些解读。而你也将会更懂得判断浏览器的不同,了解如何在正确的地方报告bug,还会了解如何在特定浏览器下高效开发。 标准Web浏览器组件
让我们列举一些现代浏览器的组件:
HTML、XML、CSS、JavsScript解析器 Layout 文字和图形渲染 图像解码 GPU交互 网络访问 硬件加速
这里面哪些是WebKit浏览器共享的?差不多只有前两个。其他部分每个WebKit都有各自的实现,所谓的“port”。现在让我们了解一下这是什么意思…… WebKit Ports是什么?
在WebKit中有不同的“port”,但是这里允许我来让WebKit hacker,Sencha的工程主管Ariya Hidayat来解释:
WebKit最常见的参考实现是Apple在Mac OS X上的实现(这也是最早和最原始的WebKit库)。但是你也能猜到,在Mac OS X下,许多不同的接口在很多不同的原生库下被实现,大部分集中在CoreFoundation。举例来说,如果你定义了一个纯色圆角的按
钮,WebKit知道要去哪里,也知道要如何去绘制这个按钮。但是,绘制按钮的工作最终还是会落到CoreGraphics去。
上面已经提到,CoreGraphics只是Mac port的实现。不过Mac Chrome用的是Skia。 随时间推移,WebKit被“port”(移植)到了各个不同的平台,包括桌面端和移动端。这种做法被称作“WebKit port”。对Windows版Safari来说,Apple通过(有限实现的)Windows版本CoreFoundation 来port WebKit。 ……不过Windows版本的Safari现在已经死掉了。
除此之外,还有很多很多其它的“port”(参见列表)。Google创建并维护着它的Chromium port。这其实也是一个基于Gtk+的WebKitGtk。诺基亚通过收购Trolltech,维护着以QtWebKit module而闻名的WebKit Qt port。 让我们看看其中一些WebKit ports:
Safari
o OS X Safari和Windows Safari使用的是不同的port
o 用于OS X Safari的WebKit Nightly以后会渐渐成为一个边缘版本
Mobile Safari
o 在一个私有代码分支上维护,不过代码现在正在合并到主干
o iOS Chrome(使用了Apple的WebView,不过后面的部分有很多不同)
Chrome(Chromium)
o 安卓Chrome(直接使用Chromium port)
o Chromium也驱动了Yandex Browser、 360 Browser、Sogou Browser,
很快,还会有Opera。
还有很多: Amazon Silk、Dolphin、Blackberry、QtWebKit、WebKitGTK+、
The EFL port (Tizen)、wxWebKit、WebKitWinCE……
不同的port专注于不同的领域。Mac的port注意力集中在浏览器和操作系统的分割上,允许把ObjectC和C++绑定并嵌入原生应用的渲染。Chromium专注在浏览器上。QtWebKit的port在他的跨平台GUI应用架构上给apps提供运行时环境或者渲染引擎。 WebKit浏览器共享了那些东西?
首先,让我们来看看这些WebKit ports的共同之处:
(作者注:很有意思,这些内容我写了很多次,每次Chrome团队成员都给我纠正错误,正如你看到的……)
1. “WebKit在使用相同的方式解析WebKit。”——实际上,Chrome是唯一支持多
线程HTML解析的port。
2. “一旦解析完成,DOM树也会构建成相同的样子。”——实际上Shadow DOM只
有在Chromium才被开启。所以DOM的构造也是不同的。自定义元素也是如此。 3. “WebKit为每个人创建了„window‟对象和„document‟对象。”——是的,尽管它暴
露出的属性和构造函数可以通过feature flags来控制。
4. “CSS解析都是相同的。将CSS解析为对象模型是个相当标准的过程。”——不过,
Chrome只支持-webkit-前缀,而Apple和其他的ports支持遗留的-khtml-和-apple-前缀。
5. “布局定位?这些是基本生计问题啊”—— 尽管Sub-pixel layout和saturated
layout算法是WebKit的一部分,不过各个port的实现效果还是有很多不同。
所以,情况很复杂。
就像Flickr和GitHub通过flag标识来实现自己的功能一样,WebKit也有相同处理。这允许各个port自行决定是否启用WebKit编译特性标签的各种功能。通过命令行开关,或者通过about:flags还可以控制是否通过运行时标识来展示功能特性。 好,现在让我们再尝试一次搞清楚WebKit究竟有哪些相同… 每个WebKit port有哪些共同之处
DOM、winow、document CSS对象模型
CSS解析,键盘事件处理 HTML解析和DOM构建 所有的布局和定位
Chrome开发工具和WebKit检查器的UI与检查器
contenteditable、pushState、文件API、大多数SVG、CSS Transform math、
Web Audio API、localStorage等功能
很多其他功能与特性
这些领域现在有点儿模糊,让我们尝试把事情弄得更清楚一点。 什么是WebKit port们并没有共享的:
GPU相关技术
o 3D转换 o WebGL o 视频解码
将2D图像绘制到屏幕
o 解析方式
o SVG和CSS渐变绘制
文字绘制和断字
网络层(SPDY、预渲染、WebSocket传输) JavaScript引擎
o JavaScriptCore 在WebKit repo中。V8和JavaScriptCore被绑定在
WebKit中。
表单控制器的渲染