Loading AI tools
網路瀏覽器引擎 来自维基百科,自由的百科全书
WebKit是一個開源的Web瀏覽器引擎(Web browser engine)[5]。它被用於Apple Safari。
![]() | 此條目需要更新。 (2017年3月31日) |
Webkit亦被使用於Apple iOS、BlackBerry Tablet OS及Amazon Kindle的預設瀏覽器。WebKit的C++應用程式介面提供了一系列的Class以在視窗上顯示網頁內容,並且實現了一些瀏覽器的特色,如使用者連結點擊、管理前後頁面列表及近期歷史頁面等等。
WebKit的HTML及JavaScript程式碼源自KDE的KHTML及KJS函式庫的一個分支[6],現已由KDE、Apple、Google、Nokia、Bitstream、BlackBerry及Igalia等獨立開發[7]。OS X、Windows、GNU/Linux以及其他類Unix系統作業系統,皆支援這個專案[8]。2013年4月3日,Google宣佈它建立了WebKit中WebCore元件的分支—Blink,Blink用於新版Google Chrome與Opera[9][10]。
WebKit的WebCore及JavaScriptCore元件使用GNU較寬鬆公共授權條款,其他元件則採用BSD授權條款[11]。
WebKit的程式碼源自1998年所開發的KDE的HTML排版引擎KHTML及KDE的JavaScript引擎KJS的程式碼。Apple的Don Melton於2001年6月25日開始了WebKit這個專案[13],當時WebKit僅為KHTML及KJS的復刻,Melton在電子郵件中向KDE開發者解釋[2],KHTML及KJS比起其他技術有著更容易開發、更輕巧(少於140000行程式碼)、更加乾淨的設計,以及更與標準相容的優勢,KHTML及KJS將會透過連接器函式庫(adapter library)的幫忙被移植到OS X,並重新命名為WebCore及JavaScriptCore[2]。JavaScriptCore在2002年6月,於KDE的郵件列表(mailing list)中首度發表,包含著蘋果公司首次釋出的部分[14]。WebCore在2003年1月,首度發佈於Macworld Expo中由蘋果公司CEO Steve Jobs發表的Safari瀏覽器。當WebCore首次使用在第一個Safari的測試版本的同時,JavaScriptCore首次並以私有framework的方式包進Mac OS X v10.2,蘋果公司將其使用在Sherlock軟體。Mac OS X v10.3是第一個Apple發佈內建WebKit的作業系統,儘管它已經被內建在10.2內了。
Apple表示,有些牽涉到OSX的特定功能(例如:Objective-C、KWQ[15]及OS X特定函式)將會在KDE的KHTML中缺席,這行為被稱為不同的發展策略[16]。
由於這兩個分支(KHTML及WebCore)有著不同的目的而進行開發,所以他們程式碼互相補丁(patch)的難度越來越高[17]。 KHTML的開發者認為,他們不喜歡接受蘋果公司對於KHTML的改變,並宣稱兩個組織的關係有些不好(a bitter failure)[18],蘋果提交他們相當大的補丁,其中包含相當大數目的改變,但是卻缺少相關檔案,並且經常包含著未來的擴充,然而這些補丁對於KDE的開發者而言,要整合回KHTML是相當困難的[19],此外,蘋果公司要求開發者閱覽Apple的程式碼之前必須簽署保密條款(non-disclosure agreements),甚至還不能存取蘋果公司的bug資料庫[來源請求]。
在公佈分裂的期間,KDE開發者Kurt Pfeifle(pipitas)貼出了一篇文章,宣稱KHTML開發者已經設法從WebCore移植許多(但非全部)Safari所改進的項目回KHTML,而他們一直都希望這些改進是來自於蘋果公司。這篇文章讓Apple開始聯絡KHTML的開發者,並討論有關增進彼起關係的方法及未來的合作模式[20],事實上KDE專案確實有能力合併一些項目,來改進KHTML的彩現速度以及加入一些新的功能特色,包含Acid2彩現測試的改進[21]。
自從新聞播報了fork事件之後,Apple在CVS[22]發布了他們自己維護的WebKit版本,在他們發布代碼後,Apple及KHTML開發者已經加深了合作關係,許多KHTML的開發者也成為了WebKit SVN代碼庫的審查(Reviewer)及提交者(Submitter)。
WebKit工作團隊同時也逆轉許多Webkit程式碼當中,專為蘋果特定的修正,並且實現了一個平台特定的抽象層,可使彩現的程式碼於其他平台可以更順利的運作[23]。
在2007年7月,Ars Technica網站發佈一篇文章,指出KDE開發團隊將從KHTML轉移到WebKit[24],再經由多年的整合,KDE開發平台4.5於2010年8月釋出,它同時支援WebKit及KHTML,而KHTML的開發仍在繼續[25]。
在2005年6月7日,Safari開發者戴夫·海厄特(Dave Hyatt)於他的blog宣布Apple將把Webkit開源(之前僅有WebCore及JavaScriptCore開源),並且開放了WebKit的CVS程式庫以及bug資料庫工具[22]。這項訊息由蘋果公司軟體工程的高階副總(Senior Vice President)Bertrand Serlet於蘋果公司2005年的Worldwide Developers Conference公開。
在2005年12月中,可縮放向量圖形的支援被加入了標準版本[26],在2006年1月初,這項程式碼從CVS轉移至Subversion。
WebKit的JavaScriptCore及WebCore元件目前以GNU較寬鬆公共授權條款方式授權,而其他的WebKit元件則是以BSD授權公開。
在2007年一開始,開發團隊開始實現層疊樣式表(CSS)的擴充,包含動畫、轉換(transitions)以及2D和3D的轉場(transform)[27],這樣的擴充在2009年W3C的標準中被列入草案[28]。
在2007年11月,這項專案宣布,他們已經完成了HTML5媒體特色的支援,允許頁面中以原生的方式嵌入影片,並且可以被script所控制[29]。
在2008年6月2日,WebKit專案宣布他們重寫了JavaScriptCore,被稱為"SquirrelFish",它是一個位元組碼直譯器(Bytecode Interpreter)[30][31],這項專案驗後來變成SquirrelFish Extreme(SFX),它可將JavaScript編譯為機器語言而不再需要直譯器,這樣的做法加速了JavaScript的執行[32],這項專案於2008年9月18日發布。一開始,SFX僅支援x86架構,於2009年1月底,SFX於OSX支援了x86-64架構,並且在該平台通過了所有的測試[33]。
WebKit中WebCore元件被Chromium開源方案所採用,隨著兩邊開發差異越來越大,蘋果在WebKit的WebCore添加許多專有的代碼(如Objective-C)Chromium用不到卻要花時間去編譯,反而拖累了Chromium開發及發展。Chromium的多進程架構(Multi-Process)難以合併入WebCore代碼中,且蘋果也不願妥協採用,選擇自行開發自己的WebKit2多進程架構。
因此Chromium的開發者由於希望在瀏覽器的開發上擁有更大的自由度,同時避免與上游衝突,更可透過移除Chrome沒有使用的元件而簡化自己的程式庫,所以決定開發WebKit的WebCore分支版本Blink,於2013年4月3日釋出,被用於基於Chromium的網頁瀏覽器,如Microsoft Edge與Google Chrome等。
WebKit2發佈於2010年4月8日,WebKit2的目標是將元件抽象化,並提供更乾淨的網頁彩現,它會利用從周圍的介面或是應用程式的殻,建立一個環境使網頁的內容(JavaScript、HTML、排版等等)將會在另外一個行程(Process)運行,比起WebKit,這個抽象化的做法打算令WebKit2可重覆使用一個更簡單的程式。因為WebKit2對比起WebKit有一個不相容的API,所以導致他的名字被改變為WebKit2[34]。
作為彩現引擎使用的WebKit,被使用在Safari及Google Chrome瀏覽器於Windows、OS X、iOS及Android平台(然而,Chrome僅僅使用WebCore,而JavaScript引擎及多工系統則自行開發)[37]。其他的在OS X底下的應用程式也使用WebKit,例如Apple的e-mail使用者端軟體Mail以及微軟的個人資訊管理系統Microsoft Entourage 2008,皆使用WebKit來彩現HTML內容的e-mail訊息。
Opera軟體公司於2013年初宣布,他們將停止他們自行開發的Presto排版引擎,由Webkit專案取代,在未來將會以Webkit來取代,並貢獻給Webkit專案[38]。
2007年6月29日,iPhone上市,WebKit通過Safari瀏覽器進入iOS平台,而且立即成為當時iOS平台唯一的排版引擎。
新的網頁瀏覽器已經內建了WebKit,例如Symbian手機的S60瀏覽器[40]、BlackBerry瀏覽器(ver 6.0+)、Midori、Chrome瀏覽器[41][42]、Android網頁瀏覽器、PlayStation_3_系統軟體4.0以上所使用的瀏覽器[43]、KDE的Rekonq瀏覽器以及Plasma Workspaces都使用WebKit作為原生的網頁彩現引擎。WebKit已經被OmniWeb、iCab及Web(前面所說的Epiphany)採用,並取代原有的彩現引擎,Sleipnir於2012年開始在他們的瀏覽器開發WebKit,並於2012年5月17日進入第三個Alpha階段[44]。Epiphany同時支援Gecko及WebKit,但他們的團隊描述Gecko的發佈週期及未來的開發計劃將會令他們對於Gecko的支援太過笨重。HP的WebOS使用WebKit作為它應用程式執行時期的基礎[45]。Valve Corporation的Steam最新更新的介面,使用WebKit作為它介面的彩現以及內建的瀏覽器[46]。WebKit在Adobe_AIR中被使用在彩現HTML及執行JavaScript,在Adobe Creative Suite CS5,WebKit用來彩現部分元件的使用介面。
截至2010年上半年,分析估計內建WebKit瀏覽器的行動裝置已經達到3億5千萬[47],截至2012年2月[update],WebKit的市場份額已經達到36%,同等於Internet Explorer所使用的Trident/MSHTML引擎的市場份額[48],如果這個成長持續下去,使用WebKit的總和(Chrome、Safari以及智慧型手機/平板)於2012年底將會超過50%,而WebKit將會是市場的領導者[49]。
在Hyatt發佈WebKit開源之後的那一周,Nokia宣布他們將移植WebKit到Symbian作業系統,並為S60開發一個基於WebKit的行動裝置瀏覽器,現在已經被命名為Web Browser for S60,它被使用在Nokia、Samsung、LG及其他使用Symbian S60的行動電話。Apple也已經移植WebKit到iOS並將其運行於iPhone、iPod Touch及iPad,它被使用在這些裝置的網頁瀏覽器及電子郵件軟體。[50]Android行動電話平台也使用WebKit作為它網頁瀏覽器的基礎[51],而於2009年1月發佈的Palm Pre使用WebKit作為它的介面[52]。Amazon Kindle 3包含著一個以WebKit打造實驗性質的瀏覽器[53]。
在2007年6月,Apple宣布WebKit已經被移植到iOS,並作為Safari的一部分,還有一些正在進行中的項目,將WebKit移植到開源的作業系統Syllable[54]、Haiku[55]以及AROS Research Operating System(AROS).[56]。
WebKit也被移植到許多Toolkits使其支援多平台,例如GTK+ toolkit[57][58]、Qt framework,[59]、Adobe AIR、Enlightenment Foundation Libraries (EFL)以及Clutter toolkit[60]。Qt Software(Digia所擁有)於Qt 4.4包含Qt port,Qt port的WebKit也可使用在Konqueror 4.1版本之後[24]。在Qt底下的Iris Browser也使用WebKit。The Enlightenment Foundation Libraries (EFL)的移植還在進行(經由Samsung及ProFUSION[61]),他們將專注在嵌入式及行動系統,並將其作為一個獨立運行的瀏覽器、Widgets/Gadgets、檔案閱讀及修改軟體。Clutter的移植是由Collabora所開放,由Bosch所贊助。
還有一個專案與WebKit同步(由Pleyo所贊助)[62],被稱之為Origyn Web Browser,他提供了一個多元的移植方式,將其移植到抽象的平台,目的是讓移植到嵌入式或是輕量系統可以更快速簡單[63]。這個移植被使用在嵌入式裝置,例如set-top boxes、PMP,而他已經被移植到AmigaOS[64][65]、AROS[66]及MorphOS,MorphOS 1.7是第一個支援HTML5媒體標籤的Origyn Web Browser (OWB)[67][68]。
2008年3月18日,Safari 3.1 for Windows轉正,解決了Windows平台下WebKit一直存在的部分相容性問題。同年9月3日推出的Google Chrome使得這一平台進一步成熟。而在Windows Mobile戰線,領先推出穩定版的是拓馳公司的Iris Browser。
2008年10月22日投入市場的Android,其內建瀏覽器Google Chrome Lite代表著脫胎於Linux的Webkit核心「回歸」Linux平台。儘管WebKit的原型Khtml是由Qt寫成,但Linux下當前最受矚目的WebKit專案卻是Gnome領導的WebKit/Gtk+。不過隨著奇趣科技於2008年6月被Nokia收購,Qt方面[71]也加快了WebKit的開發行程。目前,Google Chrome,Xfce的Midori,GNOME的Epiphany、KDE的Konqueror,Arora以及QupZilla是Linux系統下最流行的Webkit核心瀏覽器。
2005年,諾基亞公司的S60團隊成為手機端WebKit的先驅,他們將WebKit框架移植到了Symbian S60平台,作為S60第三版的瀏覽器核心。
在2013年4月3日,Google宣布他將自行開發WebCore的分支,也就是Blink引擎。Chrome的開發者由於希望在瀏覽器的開發上擁有更大的自由度,同時避免與上游衝突,更可透過移除Chrome沒有使用的元件而簡化自己的程式庫,所以決定開發WebKit的分支版本。同時Opera軟體在同年稍早也宣布,他們將自有引擎轉換到Chromium的程式庫,在此時也同時轉換到Blink的分支[37]。根據這份聲明,WebKit的開發者開始討論移除Chrome相關程式碼的可能性,以精簡整個WebKit程式庫[72]。
WebCore是一個由WebKit專案所開發的佈局(Layout)、彩現(Rendering)及HTML和SVG的DOM函式庫,完整的程式碼皆由GNU較寬鬆公共授權條款所授權,WebKit框架包裝了WebCore及JavaScriptCore,並提供一個Objective-C應用程式介面來接介由C++所開發的WebCore彩現引擎及JavaScriptCore指令碼引擎,透過Cocoa API就可以在應用程式中很簡單的使用這些元件。之後的版本同時包含了一個跨平台的C++抽象平台,並且提供各種API使用。
WebKit通過Acid2及Acid3的測試,包含完美像素的彩現(pixel-perfect rendering)以及沒有任何時間及不順的問題[73]。
JavaScriptCore是一個在WebKit中提供JavaScript引擎的框架,而且在OS X作為其他內容的指令碼引擎[14][74]。JavaScriptCore最初是為KDE的JavaScript引擎(KJS)函式庫及PCRE正規表示式函式庫,JavaScriptCore從KJS及PCRE復刻之後,已比原先進步了許多,有了新的特色以及極大的效能改進[75]。
在2008年6月2日,WebKit專案宣布,將被重寫為"SquirrelFish",它是一個位元組碼直譯器[30][31],這個專案演變成SquirrelFish Extreme(簡稱為SFX,市場稱之為Nitro),首次公開於2008年9月18日,它會將Javascript編譯為原生的機器語言,不再需要位元組碼直譯器,同時加速了JavaScript的執行效率[32]。
Drosera是一個JavaScript除錯工具,它被包含在每日編譯的WebKit版本內[76][77]。它被命名為茅膏菜屬,這是一種食蟲植物。Drosera目前已經被Web Inspector取代了[78]。
Avant Browser | 當前最新正式版2018 build 1 採用Trident/WebKit/Gecko三引擎。[79] |
Lunascape | 當前最新正式版6.15.1 採用Trident/WebKit/Gecko三引擎。[80] |
Safari | 當前最新版。 |
Sleipnir | 當前最新正式版6.2.10 採用WebKit引擎。 所用的引擎版本是 Blink 537.36 (Chromium 64.0.3282.140)[81] |
搜狗高速瀏覽器 | 當前最新正式版7.5.8.27113 其2.0版開始採用Trident/WebKit雙引擎。[82] |
傲遊瀏覽器 | 當前最新正式版5.1.6.3000。 |
QQ瀏覽器 | 當前最新正式版9.6.11165.400 騰訊公司的瀏覽器產品,採用Trident/WebKit雙引擎。[83] |
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.