随着Google Chrome浏览器攻城略地,市场份额逐步提升,其使用的WebKit网页渲染引擎也逐渐步入开发者的视野。在国内越来越多的第三方浏览器厂商开始尝试使用WebKit渲染引擎,并结合中国的具体国情(网银插件使用ActiveX,网页使用大量的IE专有技术扩展)提出了双核(双渲染引擎)浏览器的概念。双核浏览器通过巧妙的技术手段绕过了切换浏览器带来的用户身份的重新认证等诸多问题,在速度与兼容性方面实现了平衡。
双核浏览器并非新概念,早在2005年,浏览器大战烽火重新燃时,WebKit引擎还是Apple和Linux以及移动设备上的小众渲染引擎,而Mozilla的Gecko引擎是唯一成熟的开源浏览器渲染引擎。日本就有一家浏览器厂商Sleipnir推出了基于Gecko渲染引擎的双核浏览器。在Firefox方面,则有IE Tab等扩展,可以在Firefox浏览器中使用IE的Trident渲染引擎。在某种意义上,国内一些爱好者打包的包含IE Tab扩展的Firefox发行版,也是一种双核浏览器。
随着Google Chrome 在2008年的推出,WebKit引擎在Windows的系统兼容性和稳定性有了非常明显的提升,使用WebKit引擎作为普通用户日常工作使用的浏览器渲染引擎渐渐成为了一个可能的选择。国内也涌现出了很多以WebKit为主要渲染引擎的浏览器,主要的有Maxthon 3、Sogou浏览器、QQ浏览器(测试版)等。在技术架构上,这些基于Chrome或WebKit的浏览器都或多或少地参考借鉴了Chrome设计的多进程架构。默认都支持多进程浏览、崩溃恢复和防假死等特性。
双核浏览器的特殊性
双核浏览器在具体技术开发上,仍然需要面临因为有两套渲染引擎而带来的独特问题。
首先,因为两套引擎有不同的Cookie存储机制,需要在渲染器切换时,保留Cookie。在Trident引擎上,可以通过API接口实现自定义的Cookie存储,但是在实践中,经常发现丢失Cookie数据的情况。因此,另外一种常见的方式是截获HTTP Response,手工解析处理Cookie。
其次,我们在目前的国产浏览器切换渲染引擎后,在网页上点击鼠标右键,可以看到右键的弹出菜单有明显的不同。UI的不一致性会给普通用户带来困扰,典型的是在电话、文档的交流中。从这个方面看,国产的双核浏览器在用户界面上,仍然没有摆脱两张皮的嫌疑。在系统设置方面,也存在同样的问题。由于IE的某些Bug,系统设置中某些条目(安全相关)无法通过API编程接口设置,只能通过反向工程或其他手段直接修改。
最后,因为引入了双核,实际引入了双倍的被攻击的风险。在安全性方面需要投入更多的资源。由于中国的具体国情,IE浏览器长期一家独大,导致很多网页(政府网站和网上银行等)专门为IE浏览器设计优化。用户使用WebKit渲染引擎的浏览器浏览会遇到很多问题,从页面错乱、点击按钮无响应、文字乱码等不一而足。为此,国内的浏览器厂商也在与IE专有特性的兼容性方面做了很多的工作。
兼容IE特性的几个层面
改进WebKit或Gecko内核(以下不区分WebKit或Gecko,统称为内核),使之兼容IE的扩展特性是一个非常大的方向,具体包括下面几个兼容层面。
DOM的兼容:增加目前不被内核支持的DOM元素及DOM元素属性。这个层面的兼容开发最简单,引入的副作用最小。
CSS的兼容:在兼容模式下,修改CSS的行为(典型的Box模型),增加IE扩展的属性。但这个层面上不可避免地会引入IE带来的对CSS的错误实现,这个实现是IE开发团队本身也想修改的。而且,由于同一个CSS样式的定义有不同的实现,也就是意味着浏览器内核有两种运行模式——原生模式和兼容模式,而且更要命的是这两种模式不是网页作者可以通过DTD选择的,必须通过用户的手动或者某种人工智能算法予以选择。这种情况下,和直接使用双核没有区别。
脚本的语法特性:IE的架构设计上支持多种脚本语言,对JavaScript的语法本身做了一定程度的扩展。如果要兼容IE的行为,对于JavaScript的解析器也要做一定的改动。万幸的是,VBScript已经用得越来越少了。
IE的扩展模块:为了方便做网页,IE也扩展了一些模块,如:XML数据岛技术、HTML Application、Behavior、VML等。如果需要兼容,这些模块也都是不小的工程。
ActiveX的兼容:国内的网络银行等应用使用ActiveX,无论WebKit还是Gecko,使用的插件协议都是nsplugin,而在技术上,实现nsplugin到ActiveX的Wrap是可能的。
渲染顺序的兼容:不同浏览器对于渲染时间(生成元素的先后顺序)有各自的实现,导致某些使用脚本动态创建DOM树节点的页面因为找不到对应的页面元素而报错。而修改这个行为可能会非常影响内核的渲染速度。
兼容IE特性的反思
遇到不兼容的网页,常用解决方案往往只有两个修改网页或修改浏览器。因为国内的历史网页实在太多,大家的目光的焦点就都放在修改浏览器渲染引擎上了。可这真的正确吗?
现代浏览器是非常复杂的系统软件。Mozilla开发社区曾经有句名言:“没人知道Mozilla是什么”,因为Mozilla项目太大了,以至于超过人类个体能够理解的范围,某个细节行为的修改,很有可能在意想不到的地方带来副作用。
从安全方面看,我们说浏览器安全或不安全往往是指在针对该浏览器的攻击手段有多少。历史的经验也证明了,Firefox成为主流浏览器后,爆出的安全漏洞并不比IE少多少。而国产浏览器新开发了这些兼容特性后,是否引入了新的安全漏洞是一个值得仔细慎重考虑的问题。
从法律方面,由于软件专利的存在,IE的某些专有特性,不单是一个软件的技术规格,更是被美国专利法保护的专利。在国产浏览器厂商普遍缺少浏览器方面的专利池保护的现状下,而贸然开发IE的专有功能的兼容模块,会给自己带来相当大的法律风险。在周星驰的《功夫》中曾有名言“天下武功,无坚不摧,唯快不破!”历史遗留的问题就交给历史解决吧!现今的浏览器离给用户带来舒适无缝的互联体验还差得很远,与其把资源投入历史,不如脚踏实地的去改进用户的浏览体验。“唯创新不败。”
作者简介:
李沫南,系统分析师。863 “Linux下兼容IE扩展的功能增强性浏览器”项目技术负责人。Coreseek.com创始人,基于Sphinx提供全文检索的技术咨询、支持与优化。
本文来源:程序员 作者:佚名