WebKit 粗解

對一些開發者而言,WebKit就是一個黑盒子。丟進去HTML、CSS、JS等一連串的東西,而WebKit就能變魔術一般顯示出一個很棒的網頁出來。實際上,正我的同事IlyaGroriks提到的:

  WebKit不但是白盒,而且是一個開放的白盒。

讓我們花點時間來理解以下這些問題:

什麼是WebKit? 
什麼不是
WebKit? 
瀏覽器是如何使用
WebKit的? 
爲什麼
WebKit分支各不相同?

最近連Opera都轉到WebKit平臺上。下面的內容可以讓你能夠識別瀏覽器間的差異,去到合適的tracker上報Bug, 同時可以瞭解如何更有效的在各個瀏覽器上開發。

 

標準的瀏覽器組件

以下是現代瀏覽器的一些組件:

·        解析(Parsing) (HTML, XML, CSS, JavaScript)

·        排版(Layout)

·        渲染(Text and graphics rendering)

·        圖片解碼(Image decoding)

·        圖形加速(GPU interaction)

·        網絡訪問(Network access)

·        硬件加速(Hardware acceleration)

只有前兩項是被所有WebKit瀏覽器所共享的。其它的部分由不同的WebKit ports來實現。什麼意思?

 

WebKit的移植版本(Ports)

現在有很多WebKit的移植版本,先看一下WebKit hacker(也是SenchaDirectorAriya Hidayat的解釋:

WebKit最爲公認的參考是Apple自己運行在Mac OS X上的分支,也是最初和原裝的WebKit庫。在Mac OS X上不,圍繞着CoreFundation等不同的原生系統庫實現出了不同的接口。比如讓WebKit之所以知道如何繪製出一個帶有圓角的flat button,其實最終是由CoreGraphics負責的。


在Mac移值版本上使用的是CoreGraphics(CG),Mac上的Chrome則使用的是Skia

 WebKit不斷地被移植到不同的平臺上,包括桌面版本和Mobile版本,它們通常被稱爲一從此WebKit portApple自己也基於CoreFoundation庫的Windows版本移植了一份Windows版本的WebKit


不過Windows版的Safari已經死去.


除此之外,還有許多其它的ports (完整列表)Google創建並維護着Chromium port還有基於Gtk+WebKitGtkNokia (實際上是Trolltech)維護着Qt port,就是知名的QtWebKitmodule.

 

WebKit ports介紹

·        Safari

       o   SafariOS X版本Windows版本是兩個不同的移植版本。

       o   WebKitnightly是基於SafariMac OS版本的。稍後詳述……

·        Mobile Safari

       o   是專屬維護的分支,但隨後就成了主流版本

       o   Chrome on iOS(使用的是Apple提供的 WebView,隨後會說明它們的不同部分)

·        Chrome (Chromium)

       o   Chrome onAndroid (直接使用Chromiumport)

       o   Yandex Browser, 360 Browser, Sogou Browser使用Chromium,還有Opera.

·        Android Browser

       o   緊跟WebKit的最新版本。

·        更多的移值版本: Amazon Silk, Dolphin, Blackberry, QtWebKit,WebKitGTK+, EFL port (Tizen), wxWebKit, WebKitWinCE等。

 

不同port的關注不同。Mac port關於於將瀏覽器從系統中分離,引入Obj-CC++的綁定(binding)以方便在應用中使用WebKit渲染引擎。Chromium則純粹關注於瀏覽器。QtWebKit則爲其跨平臺應用提供運行時或渲染引擎。

 

WebKit瀏覽器的共性

所有WebKit ports的共性包括以下部分。(這段作者寫了多次,每次都有Chrome工程加以糾正,各項後面的斜體部分。)

1.      WebKit用相同的方式解析HTML目前只有Chromium支持了多線程的HTML解析(threaded HTMLparsing) .

2.      使用相同的方式構建DOM Tree. 實際上只有Chromium支持Shadow DOM

3.      WebKit都會創建一個window 對象和document 對象 不過可用的屬性和建構函數可以通過功能選項來控制。

4.      CSS解析。儘管如此,還是應當讓你的CSS遵循CSSOM標準。 Chrome接受-webkit-前綴,相對的Apple和其它ports則接受-khtml- –apple-前綴.

5.      排版(Layout)和定位(positioning) WebKit包括了Sub-pixel排版和對比排版(saturated layout) 算法但每個port的實現是不同的。

6.      基礎是相同的。

 

就像FlickrGithub透過flags來指定實現的功能,WebKit允許通過指定編譯期功能選項(WebKit’scompile-time Feature Flags)來啓用和禁用一系列的功能。還有運行時標誌來管理一些功能,通過命令行(command lineswitches (Chromium’s here)  或配置的方式(about:flags)指定。

 

WebKit port共性列表

·        DOM, window, document

·        CSSOM

·        CSS解析, property/value處理

         o   sans vendorprefix handling

·        HTML parsing and DOM construction

         o   same if wesuspended belief in Web Components

·        排版與定位

         o   Flexbox,Floats, block formatting contexts… all shared

·        Chrome開發工具,也稱爲WebKit Inspector.

         o   去年四月開始,Safari開始使用自己的Safari Inspector.

·        部分功能,如Content Editable, Push State, File API,大部分SVG API, CSS Transform math, Web Audio API, Local Storage

         o   後臺(backend)並不相同.比如不同的port會爲local storageWeb Audio API使用不同的實現方法。

·        其它一些功能和特性

 

WebKit ports不同的部分

·        GPU的運用

          o   3D Transforms

          o   WebGL

          o   Video解碼(decoding)

·        2D繪製

          o   Anti-aliasing方法

          o   SVG & CSS梯度渲染(gradientrendering)

·        文本渲染和斷字處理(rendering & hyphenation)

·        Network stack (SPDY,預讀(pre-rendering), WebSocket transport)

·        JavaScript引擎

          o   WebKit中的JSC(也支持V8),以及Chrome中的V8

·        表格(forms)的渲染

·        音頻和視頻元素的行爲 (包括codec的支持)

·        圖片解碼(Image decoding)

·        導航(Navigating back/forward)

          o   pushState()的導航部分

·        SSL特性(Strict Transport SecurityPublic Key Pins)

 

下圖是2D graphics 在不同port中的依賴關係,幾乎是各自使用了完全不同的庫來實現繪製操作:

       

舉一個更細節的例子,一個剛被引入的特性CSS.supports()只有winwincairo兩個移植版本沒有支持,因爲它們並沒有啓用css3特性。

 

簡單地說共享的組件就是WebCore。它其實就是通常意義上大家所說的WebKit,一個排版、渲染引擎,同時是HTMLSVG解析庫。而WebKitWebCoreports之間的綁定層(bindinglayer),平時的交流並不太在意它。

如下圖所示:


WebKit中的許多元件是可以替換的 (上圖中的灰色部分)


比如WebKit的默認JavaScript引擎JSC(JavaScriptCore,當由KHTML開始創建WebKit的同時基於KDEKJS實現而來),Chromium portV8替換,並用獨特的DOM bindings(關於DOM Binding可以參考這裏)


字體和文字的渲染也嚴重依賴於平臺。WebKit中有兩種不同Text Path: Fast and Complex。每一項都需要平臺(port-side)支持。Fast只需要知道如何貼上位圖輪廓(blit glyphs)就可以了,WebKit會爲平臺準備數據。而Complex則完全依賴於平臺去處理,它僅僅請求:”請畫出這個

“WebKit就像一個三明治,而 Chromium更像一個墨西哥玉米卷(taco) Dimitri Glazkov, ChromeWebKit hacker. Web ComponentsShadow DOM的擁護者。

 (爲什麼是taco,看這裏就可以了.)


下表中列出了5WebKit port的塊圖,瞭解一下它們之間的異同。

-                   

Chrome (OS X)

Safari (OS X)

QtWebKit

Android Browser

Chrome for iOS

Rendering

Skia

CoreGraphics

QtGui

Android stack/Skia

CoreGraphics

Networking

Chromium network stack

CFNetwork

QtNetwork

Fork of Chromium’s network stack

Chromium stack

Fonts

CoreText via Skia

CoreText

Qt internals

Android stack

CoreText

JavaScript

V8

JavaScriptCore

JSC (V8 is used elsewhere in Qt)

V8

JavaScriptCore (without JITting) *

注意iOS上的Chrome使用的是系統控件UIWebView,因此它只能使用和Mobile Safari一樣的渲染引擎(rendering layers),以及JavaScriptCore和單進程模型(single-process model)。當然  Chromium還是有它的應用的 諸如網絡層(network layer),同步和書籤的基礎組件(sync and bookmarks infrastructure), Omnibox,metrics及崩潰報告(crashreporting). (之所值得這樣做,是因爲 JavaScript很少會成爲移動端的瓶頸,而帶有JIT的編譯器的影響也會很小。)

 

WebKit瀏覽器間差異之大,何去何從?

大可不必!WebKit中提供了LayoutTest提供了大量的測試用例(28,000),不但針對已存在的功能,還包括迴歸測試。事實上,無論你何時發現了一些新奇的DOM/CSS/HTML5特性,LayoutTest通常已經提供了一個簡化版的演示。(參考:深入分析LayoutTest)

另外W3C也正增加其在頁面一致性測試上的投入。這表示不同的WebKit ports和所有瀏覽器會針對相同的頁面進行測試,將帶來更少的私有特性(quirks)和更多可以共同操作的頁面。

 

Opera將如何轉換?

Robert NymanRob Hawkes分析過了,但值得注意的是Opera會採用Chromium。這表示WebGL, Canvas, HTML5 forms, 2D graphics等實現會和Chrome一樣。相同的APIst和相同的後臺(backends)實現。所以OperaChromium-based, OperaChrome會保持同步兼容。

 

並且所有Opera瀏覽器都會採用Chromium,甚至包括Opera Mini,會將原本Presto實現的在服務器端的渲染方式放棄,轉而使用Chromium提供的渲染功能。

 

什麼是WebKit Nightly

它是WebKitMac Port,和Safari內部運行的版本是一致的(除了一小部分的基礎庫會被替換掉)。所以它的行爲和功能是和Safari一致的。你也可以這樣理解WebKit Nightly就是Safari,Chromium就是Chrome

 

Chrome Canary 也會與WebKit保持像是一天內的代碼同步。

 

擴展閱讀:

·        WebKitinternals technical articles | webkit.org

·        WebKit: AnObjective View | Robert Nyman & Rob Hawkes

·        Your webkitport is special (just like every other port) | Ariya Hidayat

·        GettingStarted With the WebKit Layout Code | Adobe Web Platform Blog

·        WebKitDocumentation Overview | Arun Patole

·        Rendering inWebKit, by Eric Seidel | YouTube

·        Webperformance for the curious | Ilya Grigorik

 

 原文地址: WebKit for Developers

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章