本文主要介绍浏览器的结构、内核、进程模型以及相关的一些自动化测试的内容,可以作为浏览器测试的基础。
By 嫣梦
主流的浏览器的结构如下图所示,包含七个部分:
内核简介
主流浏览器内核包括:
常说的浏览器的内核,也就是浏览器最核心的部分——rendering engine,一般都叫“渲染引擎”,主要解析页面语法(包括html,css,javascript等)并且渲染页面。有时候也认为浏览器内核包含排版引擎和渲染引擎,js的引擎不分在内,只是个分类的方式,这里统一都在一起。
浏览器内核也就是浏览器所采用的render内核,它决定了最终网页时以什么内容和什么格式。不同内核对网页语法的解释不同,所以同一个网页在不同内核的浏览器中,渲染效果是不同的,也就是最终看到的网页显示不同。
出现了显示问题,一般需要两个方法验证:
用不同内核的浏览器进行测试来确定渲染问题(渲染不标准)
检查网站代码的编写(编写不标准)
更多请见: http://baike.baidu.com/view/1369399.htm?fr=aladdin
Trident(IE内核)
微软在Mosaic代码的基础之上修改而来,借windows上位,长期一家独大
问题:
由于一家独大,老的IE对w3c标准支持很差,很多网站专门为了IE6写的页面,在IE6下正常;新的IE对w3c支持比较好,所以很多以前IE6下正常的页面在IE9下显示不正常,这不是兼容性的问题,是老的网页本身并不标准。
更多:
http://baike.baidu.com/subview/682014/8049760.htm?fr=aladdin Gecko内核
netscape6 最早使用的内核,现在主要由Mozilla基金会进行维护,开源的浏览器内核;
SpiderMonkey应用在Mozilla Firefox 1.0-3.0,TraceMonkey应用在Mozilla Firefox 3.5-3.6版本,JaegerMonkey应用在Mozilla Firefox 4.0及后续的版本。
更多: http://baike.baidu.com/view/404125.htm?fr=aladdin
webkit 内核
Chromium同样使用webkit内核,但是花费了很大的精力将它重新整理了。
引擎方法:
V8 应用于Chrome、傲游3
Javascript 引擎
演变过程:
Linear A/Linear B/ Futhark / Carakan
Linear A->Opera 4.0-6.1
Linear B->Opera 7.0~9.2
Futhark->Opera 9.5-10.2
Carakan->Opera 10.5及后续
渲染流程
#:DOM即Document Object Model
Render进程解析html,将其中的各种标签和属性转化为dom节点,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树——render树。
Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。
Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。
需要注意的是,解析和呈现的过程,是并行的——也就是,解析了一部分就呈现一部分。这是为了提高用户的体验,一边网络在请求,一边html开始解析,一边在浏览器页面上呈现。
Gecko vs. Webkit
1.主流程相同
2.Gecko中每个元素成为一个frame,最终格式化组成的结构叫做frame树,webkit中使用render树这个名词来命名由渲染对象组成的树;
3.Webkit中元素的定位称为布局,Gecko中这个过程叫回流;
4.Webkit称利用dom节点及样式信息去构建render树的过程为attachment,Gecko中叫做frame constructor;
5.Gecko中,html和dom之间有一个内容接收的部分,叫做content sink
解析
1.解析一个文档即将其转换为具有一定意义的结构——编码可以理解和使用的东西。解析的结果通常是表达文档结构的节点树,称为解析树或语法树;解析可以分为两个子过程——语法分析及词法分析
2.每种可被解析的格式必须具有由词汇及语法规则组成的特定的文法,称为上下文无关文法
Html 解析
特点:
完成的解析算法参考:
1. HTML DTD (Document Type Definition文档类型定义), http://www.w3.org/TR/html4/strict.dtd
2.DOM标准: http://www.w3.org/DOM/DOMTR
参考资料:
符号识别算法( The tokenization algorithm )
算法输出html符号,该算法用状态机表示。每次读取输入流中的一个或多个字符,并根据这些字符转移到下一个状态,当前的符号状态及构建树状态共同影响结果,这意味着,读取同样的字符,可能因为当前状态的不同,得到不同的结果以进入下一个正确的状态。
树的构建算法( Tree construction algorithm )
在树的构建阶段,将修改以Document为根的DOM树,将元素附加到树上。每个由符号识别器识别生成的节点将会被树构造器进行处理,规范中定义了每个符号相对应的Dom元素,对应的Dom元素将会被创建。这些元素除了会被添加到Dom树上,还将被添加到开放元素堆栈中。这个堆栈用来纠正嵌套的未匹配和未闭合标签,这个算法也是用状态机来描述,所有的状态采用插入模式。
浏览器 容错
你从来不会在一个html页面上看到“无效语法”这样的错误!
webkit给出一些官方“ 错误典范 ”:
渲染树构建
目的:正确的绘制文档内容——文档的可视化过程
特点:
Dom和render tree并非一一对应,比如:
DOM对应的是整体的页面结构,包含“看到的”和“看不到的”,而render对应的是要展示的东东。
布局(回流)
目的:将render树中的元素按照属性找到位置和大小过程特点:
Dirty bit 系统
为了不因为每个小变化都全部重新布局,浏览器使用一个dirty bit系统,一个渲染对象发生了变化或是被添加了,就标记它及它的children为dirty——需要layout。存在两个标识——dirty及children are dirty,children are dirty说明即使这个渲染对象可能没问题,但它至少有一个child需要layout。
layout过程:
1. parent渲染对象决定它的宽度
2. parent渲染对象读取chilidren,并:
a. 放置child渲染对象(设置它的x和y)
b. 在需要时(它们当前为dirty或是处于全局layout或者其他原因)调用child渲染对象的layout,这将计算child的高度
c. parent渲染对象使用child渲染对象的累积高度,以及margin和padding的高度来设置自己的高度-这将被parent渲染对象的parent使用
d. 将dirty标识设置为false
目的:遍历render树并调用它们的绘制方法在屏幕上绘制
过程特点:
动态变化
特点:以最小的动作响应一个变化行为特征:
这些就是浏览器随着页面不断加载而展示不同内容的原因,另外如js的一些局部变动也都属于动态的范畴。
进程模型
特点:#关于共享内存的技术,请先了解IPC相关内容
IPC 可以参考: http://www.ibm.com/developerworks/cn/linux/l-ipc
Chrome进程设定方式:
Chrome进程模型参考: http://www.cnblogs.com/duguguiyu/archive/2008/10/12/1308876.html
IE和Chrome对比:
IErender进程是直接将页面信息画在渲染进程上的,它有窗口句柄,父子进程权限一样;
Chrome进程间相互隔离,和主进程依靠共享内存进行交互;
Render进程比较
优缺点是什么呢?
插件进程
进程特点:注意:NPAPI插件进程是不在沙箱内的,PPAPI是把插件进程放在了沙箱内,像render进程来降低插件进程的权限,以保证安全。详情: http://blog.csdn.net/milado_nju/article/details/11661287