-
2017-10-23 14:31:24
转载请注明出处:http://blog.csdn.net/yunchao_he/article/details/41577097
本文大部分内容转载于朱永盛的博客,原文地址:
http://blog.csdn.net/milado_nju/article/details/7292164
http://blog.csdn.net/milado_nju/article/details/7300074
本文将两篇原文合并,略有删改。并加入了一些新内容,比如添加了Blink的介绍。
在介绍各个专题之前,有必要先解释一下极其容易混淆的几个概念,它们是WebKit和WebKit2,Chromium和Chrome, Blink。
首先来了解WebKit。广义上来说,WebKit是一个开源项目,其前身来源于KDE的KHTML和KJS,由Apple发起并主导。该项目专注于网页内容的展示,并发展壮大为一流的网页渲染引擎。它不是浏览器,而且也不想成为浏览器。 该项目包含两个部分,第一部分是WebCore,其中包含了对HTML,CSS等很多W3C规范的实现;第二部分就是狭义上的WebKit,它主要是各个平台的的移植并提供相对应的Web接口,也就是WebView或者类似WebView的组件,这些接口提供操作和显示网页的能力。目前使用WebKit的主流的浏览器或者WebView包括Chrome, Safari, QtWebKit, Android Browser, IOS平台的WKWebView以及众多的移动平台的浏览器和WebView。
WebKit2相对于狭义上的WebKit而言,它不是WebKit简单的第二个版本,它是一个新的API层,其最主要的变化在于将网页的渲染置于单独的进程,而接口层(API层)则在另外一个进程,它们之间通过IPC来通讯。对于接口的调用者来说,中间的IPC和底下的实现是透明的,调用者感知不到它的存在,当然也无法做定制。这样做的好处有很多,一个很明显的好处是,当网页的渲染出现问题时,不会阻碍Web接口的调用者进程,这会在很大程度上解决或者帮助解决浏览器或者这些调用者的稳定性和安全性等问题。
Chromium是一个建立在WebKit之上的浏览器开源项目,由Google发起并主导。该项目被创建以来发展迅速,很多先进的技术被采用,如跨进程模型,沙箱模型等等。同时,很多新的规范被支持,例如WebGL,Canvas2D,CSS3以及其他很多的HTML5特性,基本上每天你都可以看到它的变化,它的版本升级很快,现在没6个月升级一个版本。在性能方面,它也备受称赞,包括快速启动,网页加载迅速等。
Chrome是Google公司的浏览器产品,它基于chromium开源项目,一般选择稳定的版本作为它的基础,它和chromium的不同点在于chromium是开源试验场,会尝试很多新的东西,当这些东西稳定之后,chrome才会集成进来,这也就是说chrome的版本会落后于chromium。另外,chrome会加入一些私有的codec,比如私有的音视频编解码器,这些仅在chrome中才会出现,而Chromium里相应的组件往往使用开源项目。再次,chrome还会整合Google的很多服务。 最后chrome还会有自动更新的功能,这也是chromium所没有的。
2013年5月,Google将WebKit从WebKit开源项目中克隆出来,称为Blink。这样,Google对Blink的改造将自由得多,不像对WebKit的改动时刻受Apple掣肘。从此,Blink与WebKit并驾齐驱,彼此不相关联。总体上,Blink的功能和WebKit相同,是Chromium的绘制引擎。当然,时至今日,Google对Blink在构架上做了一些改动,以更好的适应于Chromium项目。另外,Blink并不是一个完全独立的项目,而是作为Chromium项目的一部分。
简单来讲,WebKit/Blink是一个渲染引擎,Chromium是一个浏览器,它们那么分别包含哪些不同的功能模块?它们是如何划分地?下面为大家详细解读WebKit/Blink的功能。
WebKit/Blink:
1. HTML解析::负责HTML语言的解析
2. CSS解析:负责CSS的解析工作
3. 图片解码:支持不同编码格式的图片
4. JavaScript引擎:JavaScript语言的解析引擎,缺省的是JavaScriptCore,但是目前Google 的V8 JavaScript被广泛使用
5. 正则表达式
6. 布局:负责布局(layout)的计算和更新工作
7. 文档对象模型(DOM):DOM是W3C定义的对象模型,该部分负责DOM树及其相应的接口
8. 渲染:与渲染相关的基础设施,例如渲染树,渲染层次树等等
9. SVG:对SVG的支持
10. XML解析:XML语言的解析
11. XSLT:XSLT语言的解析执行
12. URL解析器:URL规范的解析
13. Unicode编解码器:各种编码解码工作
14. 移植:WebKit中比较大的一部分,因为WebKit要工作需要不同平台上有具体的实现,因而不同的移植有不同的实现。chromium的移植很复杂,因为其支持跨平台,所以它的移植需要在windows,linux和mac上工作。
... ...
由上面的模块大致可以看出,WebKit主要是跟网页的解析和渲染相关的工作,其不涉及浏览器的历史,书签,下载,cookie管理等等方面的工作。实际上,这些和浏览器紧密相关的功能在Chromium中,Chromium的功能模块包括:
Chromium:
1. Cookie管理器:cookie生命周期的管理
2. 历史管理器:历史记录的管理
3. 密码管理器:网页中密码登录信息管理
4. 窗口管理:多个Tab窗口的管理和切换
5. 地址栏:地址栏功能,智能地址填充与书签的协同工作
6. 安全浏览黑名单管理:安全浏览机制
7. 网络栈:与网络传输相关的工作,其有很多创新的东西
8. SSL/TLS:网络传输安全
9. 磁盘缓存:磁盘缓存页面及其替换策略等生命周期的管理
10. 下载管理器:管理下载相关
11. 粘帖板:clipboard的功能
12.书签管理:书签的组织和管理
13. URL解析器:同WebKit
14. Unicode编解码器:同WebKit
... ...
Chromium主要是实现浏览器相关的功能,如上面中的网络栈等等。其实以上只是一些浏览器基本功能,chromium实现的远不止这些,这其中包含沙箱模型,NaCl,扩展机制,硬件加速架构等等。这些我们将在之后的章节中逐一介绍它们。
URL解析器和Unicode编解码器在两者中都存在是因为它们都要使用到。
更多相关内容 -
lightdm-webkit2-theme-minimal:最小的lightdm-webkit2-greeter主题
2021-05-27 14:30:50最小的lightdm-webkit2-greeter主题 一个带有webkit2迎接程序的lightdm显示管理器的简单主题。 安装 克隆或下载此仓库 将仓库的内容复制到/usr/share/lightdm-webkit/themes/minimal 安装lightdm和lightdm-webkit2-... -
golang-webkit:go、gtk、go-webkit2 和 webloop(无头浏览器)的 Docker 镜像
2021-07-08 14:06:17是一个形象,报价与gtk3 Ubuntu的,去-webkit2和webloop捆绑。 用法 在您的 golang 应用程序目录中创建一个 Dockerfile,内容如下: FROM rverton/golang-webkit 通过在应用程序目录中运行以下命令来构建容器映像... -
【读书笔记】【WebKit 技术内 幕(一)】浏览器架构与浏览器内核;chromium、webkit和blink的...webkit2架构
2022-01-28 18:14:17浏览器架构与浏览器内核;chromium、webkit和blink的渲染过程;chromium、webkit的架构与代码结构;webkit2架构文章目录
前言
Something great
- render :渲染
- Blink: chromium渲染引擎的名称
- parser: 解析器
- AST :(Abstract Syntax Tree,抽象语法树)
- openGL :(Open Graphics Library,开放图形库);一个大部分平台都支持的 底层图形库的 API 标准。
- DirectX:(Direct eXtension,简称DX)微软的多媒体API。
- 沙箱(sandBox):操作系统对 进程的可访问的内存地址所做的限制。
- 渲染进程被 Sandbox 隔离,网页 web 代码内容必须通过 IPC 通道才能与浏览器内核进程通信,通信过程会进行安全的检查。
- 沙箱运行:渲染器在单独的进程中运行,通过沙箱限制其对系统资源(文件、网络、显示、击键)的访问,而须通过父浏览器进程访问
- 插件:浏览器的插件用于显示网页特定内容
- 扩展:浏览器的扩展用于增加浏览器新功能的软件或压缩包
- inspector:(web inspector,调试页面))
第1章 浏览器和浏览器内核
浏览器
-
通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,浏览器内核主要包括以下三个技术分支:排版渲染引擎、 JavaScript引擎,以及其他。
- 渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。
- Google V8引擎是一个JavaScript引擎实现,使用C++开发。
-
-
Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎。WebCore是苹果公司开发的排版引擎,由排版引擎“KHTML”的基础上而来。
-
Blink是一个由Google和Opera Software开发的浏览器排版引擎,这一渲染引擎是开源引擎WebKit中WebCore组件的一个分支
用户代理和浏览器行为
- 用户代理和浏览器行为体现了客制化,是浏览器的内卷结果。
- 用户代理(User Agent)用于表明浏览器的身份,因而互联网的内容供应商能够知道发送请求的浏览器身份,浏览器能够支持什么样的功能。
- 例如:服务器为Chrome的桌面版和Android版,发送不同的网页内容以适应屏幕和操作系统的差别,或者是因为不同的浏览器支持的标准不一样。
- 这样做的目的当然是为了避免浏览器不支持的功能以及获得更好的用户体验。
- 用户代理(User Agent)用于表明浏览器的身份,因而互联网的内容供应商能够知道发送请求的浏览器身份,浏览器能够支持什么样的功能。
- 实践:
- 通过设置用户代理为
chrome -android mobile
刷新后,可以看到页面是为安卓系统设计的,更适合手机交互。
- 通过设置用户代理为
内核特征
- 渲染引擎的功能主要包括:HTML解释器、CSS解释器、布局(lay out)、JS引擎。
- HTML解释器:将HTML文本解释成DOM.
- CSS解释器:为DOM各个元素计算出样式信息,为布局提供基础设施。
- 布局:将DOM元素对象和样式信息结合,计算大小位置等布局信息,形成一个内部表示模型。
- JS引擎:js可以修改网页内容,JS引擎解析js并通过DOM接口和CSSOM接口修改网页内容和样式信息,从而改变渲染结果。
- 绘图:使用图形库,将布局计算后的网页节点绘制成图像结果。
- 渲染引擎依赖了:网络、存储、2D/3D图形、音频和视频、图片解码器。
- 同样一起依赖了OS的支持(如线程、文件等)。
-
- 同样一起依赖了OS的支持(如线程、文件等)。
WebKit与blink
- 2001年WebKit来自KHTML,05年被苹果开源。
- 2013年 blink fork 自WebKit。
第2章 HTML网页和结构
网页构成与结构
- html 是一种半结构化数据表现方式,结构特征有:树状、层次、框结构。
- js代码用于控制网页内部逻辑。即控制用户端逻辑。
- CSS用于描述网页显示信息。
- HTML5 :
- 2D、3D图形以及多媒体方面的支持。使得2D、3D图形以及多媒体 被浏览器原生支持。不需要第三方插件。
- 网页结构:
- 框结构:
- 每个框结构包含一个HTML文档,使用元素嵌套框。桌面端应用较为广泛。
- 层次结构:
-
层次结构指:网页中元素可能分布在不同层次中,webkit 为他们构建新层,是为了渲染引擎在处理上的方便和高效。
- 如:创建新层可以更有效的处理视频解码器和浏览器之间的交互和渲染问题。
- 如:层1为
video
创建的层;;层2为需要3D变换的div
创建的层;层3、4对应canvas
,有着HTML5中的2D、3D绘图操作。 - 可以使用浏览器的
show composited layer borders
打开网页的层次结构显示详细观看。
- 如:层1为
- 如:创建新层可以更有效的处理视频解码器和浏览器之间的交互和渲染问题。
-
- 框结构:
WebKit的网页渲染过程
- 网页比我们屏幕可视面积要大,当前可见区域成为视图。
- 渲染分为三个阶段:URL到DOM、DOM到构建绘图上下文、绘图上下文到最终图像
- URL到DOM:
- js可能修改DOM树结构,如步骤7 。
- 节点可能需要依赖其他资源,如图片、CSS、视频等,要异步加载他们,如步骤8 。
- 如果是加载URL,没有标记异步方式,则需要停止DOM构建直到资源加载完。
- 当DOM构建完成时,发出
DOMconent
事件 - 当DOM构建完成、网页所依赖资源都加载完之后,发出
onload
事件。- 因为资源加载不一定影响DOM树创建,所以这两个事件不一定同时发生。
-
- DOM到绘图上下文:
- webkit 利用CSS和DOM树,构建renderObject树,直到绘图上下文。
- CSS文件被CSS解释器解释成内部表示结构
- CSS解释器结束后,在DOM上附加解释后的样式信息,就是renderObject树
- renderObject 节点创建同时,webkit 根据网页层次结构创建 renderLayer树,同时构建一个虚拟的绘图上下文。
- renderObject树的创建并不会让DOM树销毁,这四个结构一直存在,直到网页被销毁,因为都对网页渲染有很大作用。
-
- webkit 利用CSS和DOM树,构建renderObject树,直到绘图上下文。
- 绘图上下文到最终图像:
- 这个过程主要依赖2D、3D图形库。
- 绘图上下文是个与平台无关的抽象类,将每个绘图操作桥接至不同具体绘图实现类。
- 绘图实现类,在chromium 中需要其合成器完成复杂的多进程与GPU加速机制。
- 绘图实现类,将2D、3D图形库绘制的结果保存下来,交给浏览器和UI一起显示。
- 这个过程主要依赖2D、3D图形库。
-
- URL到DOM:
- 如今网页多是动态网页,渲染完成后,由于动画与交互,浏览器一直重复执行渲染过程。
第3章WebKit架构和模块
WebKit架构及模块 及 源代码结构
-
WebKit支持不同浏览器,为了不同需求,有些代码是共享的,有些是不同的,不同的部分成为WebKit的移植(ports)。
-
-
- 虚线框部分:该模块在不同浏览器使用 webkit的实现不一样。
- 第三方库是WebKit的运行基础,WebKit是这些库的使用者。
- Webcore 部分是共享的,是网页加载和渲染的基础部分。(web inspector,调试页面))
- jscore 是WebKit的js引擎,chromium中替换为了V8引擎。
- WebKit ports 是非共享部分。由于平台差异、依赖第三方库、和需求不同,所以实现方式不同。
- 嵌入式编程接口: 提供给浏览器调用。因为接口与移植有关,所以有个浏览器相关的绑定层。(???)
- WebKit中其实还包括了测试用例,一般包括布局测试用例(layout tests)、性能测试用例(performance tests)。
-
-
WebKit源代码结构:
-
- 主要目录有四个。
- WTF是基础类库,像是C++的 STL库。
- webcore:
- 按照目录组织了webcore 的模块代码。
- webkit2:
- 主要包含两种类型目录
- 各个进程代码:
- 如 web进程、UI进程、网络进程、插件进程以及它们的共享代码。
- 各移植的简单主函数入口:
- 一个构建webkit2接口的简单的可执行程序。
- 各个进程代码:
- 主要包含两种类型目录
- 主要目录有四个。
基于Blink的Chromium浏览器结构 及 代码结构
-
- content模块和content API,是chromium 对渲染网页功能的抽象。
- 沙箱模型、跨进程GPU硬件加速、众多HTML5功能在content层实现
- content模块和content API 将渲染机制、安全机制、插件机制封装一个接口层。
- 接口层被上层模块使用,内部调用包括了chromium浏览器、content shell,外部包括CEF(chromium enbedded framework)、opera浏览器等。
- chromium浏览器拥有完整功能,但是外壳没开源?
- content shell 是使用content shell包装的简单的壳,用于验证功能有效性和作为开发的demo。
- android 中,开发者大多依赖 content shell 进行移植开发。
- 接口层被上层模块使用,内部调用包括了chromium浏览器、content shell,外部包括CEF(chromium enbedded framework)、opera浏览器等。
- android webview 为了满足android 系统的webview设计,即利用chromium 替换原来的android 默认webview。(这都是历史了吧)
- content模块和content API,是chromium 对渲染网页功能的抽象。
-
多进程模型:
-
chromium常用多进程模型:
-
-
- 连接线代表IPC,可以看到NPAPI插件没有定义使用FPU进行加速的接口。
-
多进程模型的好处:
- 避免单个页面的不响应或崩溃影响整个浏览器的稳定性。
- 第三方插件崩溃不影响浏览器稳定性。
- 方便了安全模式的实施,沙箱模型基于多线程。
-
主要进程类型:
- browser 进程:浏览器主进程,负责浏览器界面显示、页面管理,是其他类型进程的祖先,负责他们的创建与销毁。仅有一个。
- renderer 进程: 网页渲染进程,renderer进程数量和网页数量的关系不一定,根据配置改变。沙箱模型启动情况下,该进程会发生变化。
- 插件进程: 每个类型插件创建一次,多个网页使用一种类型插件时,为每个使用者创造一个实例,即插件进程是被共享的。
- GPU进程:最多一个,用于对3D图形加速调用的实现。
-
进程模型特征:
- browser 进程和页面渲染分开,保证页面渲染导致崩溃不影响浏览器主界面崩溃。
- 每个网页独立进程,保证页面互不影响
- 插件进程独立,保证插件问题不影响浏览器主界面和网页。
- GPU硬件加速进程也独立。
-
render 进程创建的类型有:
Process-per-site-instance
Process-per-site
Process-per-tab
Single process
-
renderer和 browser进程:
- renderer和 browser进程代码层次如图:
-
- 首先是webkit接口层, 一般基于webkit接口层的浏览器直接在上面构建,不引入复杂的多进程架构。
- 然后是黏附层,是个桥阶层,用于处理chromium和webkit内部的不一致。
- renderer 主要处理进程间的通信,接受来自browser 进程的请求,并调用相应webkit 接口层。
- browser进程 中的 rendererHost 与renderer 对应, 用于处理和renderer 之间的IPC。
- web contents 表示网页内容。
-
- renderer和 browser进程代码层次如图:
-
-
多线程模型:
- browser进程:多线程为了保持用户界面的高响应度,保证UI线程对用户操作的响应。
- 主要有主线程、IO线程、还有很多其他线程,用于处理视频、存储、网络、文件、音频、浏览历史等,因为可能这些操作可能阻塞,所以需要置于单独的线程。
- renderer进程: 将渲染过程管线化,利用多核优势。
- 将blink的渲染过程解耦,创建新线程,利用CPU多核能力,加速渲染,像流水线处理一样,提高并发性。
- 网页加载和渲染过程的基本工作方式:
- browser进程收到用户请求,UI线程处理,将任务转给IO线程,然后任务被传递到 renderer 进程。
- renderer进程 的IO线程经过简单解释后交给渲染线程。 渲染线程加载网页并渲染网页,其中可能需要browser进程获取资、需要GPU进程来帮助渲染。 最后renderer 进程将结果通过IO线程传递给browser进程。
- browser进程 将结果绘制出来。
- 线程同步与通信:
- 多线程容易造成死锁、资源竞争与冲突。chromium 使用事件、任务传递机制,仅在不得已时才使用锁或者线程安全对象。
- 线程内部的消息和任务,在第九章 js引擎部分讲解。
- 多线程容易造成死锁、资源竞争与冲突。chromium 使用事件、任务传递机制,仅在不得已时才使用锁或者线程安全对象。
- browser进程:多线程为了保持用户界面的高响应度,保证UI线程对用户操作的响应。
-
content 接口:
- 提供了一层对多进程进行渲染的抽象接口。为了支持HTML5功能、GPU硬件加速功能、沙箱机制。
- 相关部分分为:embedder调用的接口、embedder应该实现的回调接口(用于参与具体实现逻辑或事件监听)。
- APP:包括了应用程序或进程的创建与初始化,被所有进程使用,处理一些进程公共操作。
- Browser:HTML5功能等的实现参与,content模块需要调用他们实现HTML5功能;
- Common:一些renderer、browser 共享的公共接口。
- Plugin:通知embedder plugin进程何时被创建的接口类。
- Renderer
- Utility:
-
chromium 代码结构:
- chromiumOS 是一个基于web的OS,仅支持web网页和web 应用程序。
- 还有个很重要的目录:
third_party
- 里面包含了
Blink
和一些依赖的第三方开源项目。
- 里面包含了
- content 目录基本对应了多进程模型中的各种进程类型。
WebKit2 架构、模块
- webkit2 是一套全新结构与接口,同chromium一致,讲渲染过程放在单独进程中,独立于用户界面。
-
- 这里的web进程对应chromium 的rederer进程。UI进程对应chromium 的browser 进程。
-
- webkit2 和chromium 多进程模型和接口。
- webkit 和chromium 多进程的关系:
-
- renderer进程直接调用webkit 接口。
- content接口允许应用程序注入,并参与content之下各个进程的内部逻辑。
-
- webkit2 接口希望将多进程结构隐藏,不让应用程序纠缠内部细节。
- webkit 是给 chromium提供content 接口以便构建浏览器,其本身目标不是提供嵌入式接口。
- webkit 和chromium 多进程的关系:
chromium 的渲染
- 渲染:将web content,转换为正确的 openGL 调用,让其显示在屏幕上。
渲染过程
- 样式计算 :渲染进程的主线程解析CSS,确定每个DOM节点的计算样式
- 布局 - layout : 渲染进程知道每个节点的文档结构和样式。布局是查找元素几何的过程。
- 布局过程主线程 遍历DOM并计算样式,并创建布局树(layout tree, 包含坐标和边界框大小等信息)。
确定页面布局的挑战: - 从上到下的块流须考虑字体的大小以及在哪里划分它们,最终影响段落的大小和形状,影响下一段的位置
CSS可以使元素浮动到一侧,屏蔽溢出项,并更改写入方向
- 布局过程主线程 遍历DOM并计算样式,并创建布局树(layout tree, 包含坐标和边界框大小等信息)。
- 绘制 - Paint : 主线程遍历布局树以创建绘制记录(知道元素的大小,形状和位置,但是不知道绘制的顺序。)
- 合成 :
- 合成是一种将页面的各个部分分层,分别栅格化,并在合成器线程的单独线程中合成为页面的技术。
- 如果发生滚动,图层已经被栅格化需要合成一个新帧。通过移动图层和合成新帧,可以以相同的方式实现动画。
- 浏览器知道文档的结构、每个元素的样式、页面的几何形状和绘制顺序,需将信息转换为屏幕上的像素,称为光栅化。
- 渲染难点:
- 布局树变化:在每个步骤中,前一个操作的结果用于创建新数据。例如,如果布局树中的某些内容发生更改,则需要为文档的受影响部分重新生成“绘制”顺序。
- 动画:动画对人眼来说会很平滑(视觉停留效应),但是如果动画错过了两者之间的帧或程序运行JS时,则页面将出现卡顿。需要将JS操作划分成小块,并安排在每个帧上运行
- 布局树变化:在每个步骤中,前一个操作的结果用于创建新数据。例如,如果布局树中的某些内容发生更改,则需要为文档的受影响部分重新生成“绘制”顺序。
渲染步骤
- 渲染的第一步需要解析HTML的标签,生成能反映该HTML结构的对象模型,即DOM(文档对象模型,document object model )。 V8 引擎 通过blindings system 将DOM简单包装后 暴露为:DOM web APIs。
- web content 有 HTML、CSS、JS、video、etc。
- DOM:用于作为页面的内部表示、将查询或修改渲染的API暴露给JS。
-
- V8 引擎 通过blindings system 将DOM简单包装后 暴露为:DOM web APIs
- CSS 的样式属性(style propertys) 是web 开发者用来自定义DOM元素渲染的控制选项(control knob)
-
- 样式属性很多,怎么确定样式作用于哪些元素也越来越复杂,(样式可能被多重规定,可能有冲突)。
-
- 样式引擎用于整理这些样式属性。
HTML
- HTML的标签给了文档赋予了语义上的层级结构。
- 如 div 可以分为多个文本段落
- HTML标签可以嵌套
DOM
- DOM:
- 作为页面的内部表示;
- 作为暴漏给JS 以查询、修改的API;
- V8 引擎 通过blindings system 将DOM简单包装后 暴露为:DOM web APIs。
CSS
- CSS 的selector 选择的就是DOM树的节点,然后将对应的 property 应用于对应节点。
- web 开发者用 properties 定义DOM元素 的渲染。(形变、格式、颜色、边距、位置等)
- 解析CSS 难点在于解析 property具体作用于哪些元素。
浏览器架构
-
整体架构:
- 操作系统:WebKit可以运行在不同的操作系统上,如Chromium浏览器支持Windows、Linux、Android等系统;
- 第三方库:这些库是WebKit运行的基础,包括2D图形库、3D图形库、网络库、存储库、音视频库等;
- WebCore:WebKit加载和渲染网页的基础,是不同浏览器所使用的WebKit中共享的部分,包括HTML解析器、CSS解析器、SVG、布局、渲染树等等;
- JavaScript引擎:JavaScript解析器,WebKit默认的引擎是JavaScriptCore,Google的Blink为V8引擎;
- WebKit Ports:WebKit中的移植部分,包括网络栈、音视频解码、硬件加速等模块,这部分对WebKit的功能和性能影响比较大。
- WebKit嵌入式接口:WebKit对外暴露的接口层,这个接口是提供给浏览器调用的,如给chromium调用,因为接口与具体的移植也有关系,所以中间会有一个WebKit绑定层
-
JavaScriptCore(用于Safari)
- JavaSript Parser,JSON Parser
- 字节编译器:使用内部字节码格式
- 汇编程序:在运行时使用代码修补 - >它需要可写代码内存
- 数据流图:基于编译时推测优化生成代码的新举措
- 解释器:运行生成的字节码
- Regexp引擎:支持JIT
- 垃圾收集器:标记和扫描
- 运行时:所有JS全局对象(日期,字符串,数字等)
- 调试器,Profiler
-
WebCore
- 资源加载器:HTML和XML解析器,DOM
- SVG和SMIL
- CSS:分析器,选择器,动画
- 渲染和布局
- 绑定生成器:IDL文件:JSC,V8,ObjC
- HTML5:音频,视频,画布,WebGL,通知功能
- WebInspector
- 平台集成:图形,字体,声音,视频
浏览器工作原理概述
先后经过页面导航、渲染、资源加载、样式计算、布局、绘制、合成到栅格化,最后完成GPU展示
- 浏览器内核经过了 Loader、Parser、Layout和Paint模块
-
Loader 负责处理HTTP请求、网络资源缓存。
- 通常有两个IO管道,一个负责页面下载,另一个负责外链资源下载(js、CSS、image)。
- 因为JS可能改变页面,因此需要保持执行顺序和下载管道后续处理的阻塞。
-
Parser 负责解析HTML页面,从HTML文本到HTML语法树到文档对象树(DOM) 的映射过程。
- HTML 语法树生成主要包括词法解析和语法解析。
- 词法解析:依靠词法规则将HTML 文本分割成大量标记(token)。(词法规则如正则表达式);
- 语法解析:按照语法规则匹配token序列生成语法树。(通产有自上而下、自下而上两种匹配方式);
- CSSParse解析CSS后,将CSS解析为对应树结构。 // problem
- js由单独的脚本引擎解析执行。用于动态改变DOM树,如为DOM接天添加事件响应处理函数,即根据时间或事件映射一颗DOM树到另一个DOM树。
简单的说,Parser将页面文本转换为带CSS style、会相应自定义事件的styled DOM树。
- layout 负责排版。包括创建布局树(渲染树、render tree)、计算布局。
-
布局树与DOM树同时存在于内核,render树是DOM树的排版表示,用以计算可视DOM节点的布局信息(坐标、高、宽)和后续阶段的绘制显示。
- // 并非所偶的DOM节点都可视,这些节点没有在render树中对应,如标签。// DOM树可视节点的CSS style 就是对应render树节点的style。
- // 并非所偶的DOM节点都可视,这些节点没有在render树中对应,如标签。// DOM树可视节点的CSS style 就是对应render树节点的style。
-
计算布局就是安排和计算页面中每个元素大小位置等几何信息的过程。
- HTML采用流式布局模型,基本原则为页面元素在顺序遍历过程中依次从左到右、上到下的排列方式确定各自位置 区域。
-
-
参考
-
WebKit2.NET
2013-01-27 22:12:49WebKit2是WebKit的新的,完全不阻塞API层,它引入了一个分裂的过程模型 - web进程是孤立的UI过程中提供更好的稳定性和更好的嵌入应用程序的响应能力。 WebKit2.NET。NET绑定WebKit2。 WebKit2.NET是不是一个控件库... -
[WebKit]WebKit2多进程机制的解析
2013-02-25 22:54:58在WebKit模块化分析>>中说到WebKit2中的多进程模型。多进程模型已经是浏览器的基本架构要素,下面展开分析一下WebKit2中的多进程模型。 协作决定接口,确立责任分工后,对于模块或系统间最重要的事莫过于接口...在<<WebKit模块化分析>>中说到WebKit2中的多进程模型。多进程模型已经是浏览器的基本架构要素,下面展开分析一下WebKit2中的多进程模型。
协作决定接口,确立责任分工后,对于模块或系统间最重要的事莫过于接口定义,而且是有着简洁明确的定义。对于WebKit2中三个进程中的交互也是相当频繁和多样,如果使用传统的查表法对应解析执行,就会面临巨大的维护成本。WebKit2使用了Encoder和Decoder的概念的很好地将消息解析的工作放到各个功能上。于是提供的公共接口主要关注于消息的分发,而不再是似乎拥有一切的解析执行功能。
WebKit2在多进程接口上Process Launcher、CoreIPC以及WorkQueue构成了核心控制功能 (进程本身的Run Loop自然也是,但非此处的关注点),Encoder/Decoder/FunctionWrapper则是重要的工具类。下面就是对它们进行的学习和分析。
多线程模型的基本架构
先从基本结构看起。多进程模型是在WebKit中实现的,由WebKit中的三个Process分别处理应用主进程,网页处理进程及插件进程。它们在具体的实现上是基于Process Launcher(WebKit2/UIProcess/Launcher)进行进程管理,再通过Core IPC进行跨进程通讯(IPC)。
CoreIPC做为一个公共,且由各个进程共享的模块,日后会被放置到WebCore或WTF中。放在WTF中较为合适,因为它在模块化的角色就是公共功能模块。
Process Launcher具体创建进程的代码需要平台适配,它使用了如下的方式:ProcessLauncher.h和ProcessLauncher.cpp有通用的定义和公共代码的实现。再为不同平台建立不同的单元文件来实现平台差异的部分。负责创建新进程的launchProcess就在其中。
Core IPC也是类似的实现方式。在不同的平台下使用不同的IPC技术。Mach Port是Mac OS下类似pipes技术的实现,而XPC则是新推出一种更为安全的IPC技术,目前国内相关的中文资料并不多,还是要花时研究官方文档(Creating XPC Services)和示例代码(SandboxedFetch)。另外网友rainbird还推荐一个对XPC的封装。
多进程模型的交互机制
WebKit2中使用来Proxy来与其它进程进行通讯。WebProcessProxy与PluginProcessProxy均会继承自ProcessLauncher::Client, 最后是通过CoreIPC::Connection来完成通讯。因为存在页面上的对应关系,所以消息传递时都会带一个Page ID来标识,这样在共享Web Process时就不会出现混淆的问题。
下图是一个进程通讯的架构, CoreIPC::Connection会通过与其它几个类一起完成进程间消息传递:流程也很容易理解,消息发送者通过Encoder对要发送的信息进行编码,再由Work Queue控制触发发送或接收操作,最后由Decoder进行解码,最后交由目标类解析执行。消息发送者Sender Class会继承自CoreIPC::MessageSender,而接收者Target Class会继承自CoreIPC::MessageReceiver。
Encoder的实现与平台无关。 Work Queue自己会有队列管理机制触发发送操作,再由注册回调函数触发接收操作。无论发送和接收的函数都是由Connection通Function Wrapper提供的,Work Queue就是负责在适当的时机下触发。它在不同平台使用了不同的技术:关于GCD可以参考一下这篇文章:Windows下的Thread Pool的说明可以看这里:
下面Work Queue的类图:
.dispatch用于发送时,由Connection调用并传入负责发送的函数句柄。.executeFunction则是用于执行指定的函数指针。.invalidate则是用于清除当前排入的任务队列。.platformXXX表示的是对应于各个平台的不同实现。其跨平台模式类似于ProcessLauncher。.registerXXX与unregisterXXX用于注册和取消处理接收到新消息的回调函数,这个函数也是由Connection指定的( Mac OS下和Windows下的函数名不同)。
下面是Connection与WorkQueue交互示意的序列图:
多进程模型中消息数据设计
上面提到了消息在传递过程中外发的消息(outgoing message)和收到的消息(incoming message)都由CoreIPC::Connection类来管理,而且包含一个编解码的过程。
1. 消息
每一个消息都有一个特定的定义。如下所示,Arguement1和Argument2是两个模板。
首先CoreIPC为不同数量参数的消息定义了一套模板,就是ArgumentX, X从1到8,就是最大表示8个参数的消息,模板数据类型指定的是各个参数的类型。其中一部分使用了修饰模式。不同参数的模板都采用对前一个模板的实现来达到复用的目的。 这种定义方式和一般的查表法是不同的,目的在于消息本身就能表示自己,而不需要再做额外的对消息的映射。
下面是LoadURL消息的定义:struct LoadURL : CoreIPC::Arguments2<constWTF::String&, constWebKit::SandboxExtension::Handle&> {
static const Kind messageID = LoadURLID;
static CoreIPC::StringReference receiverName() { return messageReceiverName(); }
staticCoreIPC::StringReference name() { returnCoreIPC::StringReference("LoadURL"); }
staticconstbool isSync = false;
typedefCoreIPC::Arguments2<constWTF::String&, constWebKit::SandboxExtension::Handle&> DecodeType;
LoadURL(const WTF::String& url, const WebKit::SandboxExtension::Handle& sandboxExtensionHandle)
: CoreIPC::Arguments2<const WTF::String&, const WebKit::SandboxExtension::Handle&>(url, sandboxExtensionHandle)
{
}
};
2. Encoder
所谓Encoder就是信息的各个参数组装到一个buffer中的操作。Encode操作都是通过CoreIPC::MessageEncoder来完成的。它对Message的Message Name, Receiver Name, Destination ID(即Page ID)以及各个参数进行编码。*encode方法有不同类型的副本。*m_inlineBuffer是字符数组,会比m_buffer动态分配的方式效率要高。
下面Encode的结果(以loadURL为例):
实际发送时就是将这个buffer的内容发送出去。再由接收到使用对应的Decoder解析出来。
通过ReceiverName可以创建一个MessageReceiver对象,即此消息的处理对象。就这样,这个消息就确定应当由谁来处理了。bool MessageReceiverMap::dispatchMessage(Connection* connection, MessageID messageID, MessageDecoder& decoder)
{
if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) {
ASSERT(!decoder.destinationID());
messageReceiver->didReceiveMessage(connection, messageID, decoder);
return true;
}
……}
和传统的处理方式相比,是不是简洁很多。虽然Recevier Names还是要有表存在,但相对常常的switch/case或查表法,它的变动性已经被极大的缩小了,也就降低了日后的维护成本。如果要接受消息处理,只要调用MessageReceiverMap::addMessageReceiver()添加一项Receiver,而参数就是Receiver的名称和类的实例。
再到具体的Message处理对象中处理,对于要接受消息处理的类,会继承自MessageReceiver,使得它们都有一个消息处理的入口。如:void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder){……if (decoder.messageName() == Messages::WebPage::LoadURL::name()) {
CoreIPC::handleMessage<Messages::WebPage::LoadURL>(decoder, this, &WebPage::loadURL);
return;
}
……}
最终通过 callMemberFunction()来执行消息对应的函数,即上面代码指定的this和&WebPage::loadURL,decoder中则存储着参数。
3. Function Wrapper
Function Wrapper的功能就是将函数或者某个对象的成员封装成函数指针。在Work Queue与Connection的函数调用过程都是使用Function Wrapper来完成的。Function Wrapper也是一个模板类,用于达到多态以支持不同的函数类型。比如下面支持类成员函数的定义(Functional.h):template<typename R, typename C>
class FunctionWrapper<R (C::*)()> {
public:
typedef R ResultType;
static const bool shouldRefFirstParameter = HasRefAndDeref<C>::value;
static const bool shouldValidateFirstParameter = true;
explicit FunctionWrapper(R (C::*function)())
: m_function(function)
{
}
R operator()(C* c)
{
return (c->*m_function)();
}
private:
R (C::*m_function)();
};
Function Wrapper对Work Queue要封装就是Connection::sendOutgoingMessage和Connection:: dispatchOneMessage()两个分别用于处理发送和收到的消息。
多进程模型的交互序列图示例
以下是一个交互的序列图,方便更好地理解它的设计。
在UI上加载页面时,UIProcess中的WebPageProxy向WebProcess中的WebPage发起loadURL请求。首先会通过调用Connection增加一个message到自己的outgoing message queue中。然后将自身的发送函数(sendOutgoingMessages)发送给WorkQueue对象执行,而不是直接把消息发送到WorkQueue中执行。所以WorkQueue只是一个控件类,而不是接口类。WorkQueue会在适当的时机执行提交的任务,由executeFunction来执行相应的发送函数,将消息通过系统的机制发送出去。
而在WebProcess中,它会先在WorkQueue(不同的实例对象)中注册一个事件处理函数,当事件进来后,它就会被执行到。进行触发Connection对新的消息进行解析并加入到自己的incoming message queue中。
Web Process会在自己的Run Loop中要求Connection解析收到的消息,并在解析后调用对应的对象的处理函数。通过callMemberFunction()就最终调用到了WebPage::loadURL()函数。
转载请注明出处:http://blog.csdn.net/horkychen
-
lightdm-webkit-theme-litarvan:Litarvan 的 LightDM HTML 主题
2021-08-04 22:59:38Litarvan 的 LightDM WebKit2 主题 => 下面的截图 自定义发布 背景可以添加到/usr/share/backgrounds并在主题视图(设置视图的右下角)中选择。 在/usr/share/lightdm-webkit/themes/litarvan/img/os.xxxxxxxx.png... -
webkit和webkit2的区别
2013-07-10 16:01:24原文地址:https://trac.webkit.org/wiki/WebKit2 ...webkit2为了在API层支持多进程改变了webkit的栈式结构 webkit进程架构 每个模块都在一个进程里面,API边界在应用程序和webkit转自:http://blog.csdn.net/shunzi__1984/article/details/6196483
原文地址:https://trac.webkit.org/wiki/WebKit2
webkit2为了在API层支持多进程改变了webkit的栈式结构
webkit进程架构
每个模块都在一个进程里面,API边界在应用程序和webkit API之间,这是一种简单的模型。应用程序比较容易重用Webkit API
webkit2进程架构
注意这里有一个进程边界, 他是在API边界只下,webkit的部分操作在UI进程,应用程序的logic也在那个进程里。webkit的其余都在web进程。web进程与UI进程分离,这样也能够在职责划分,健壮性,安全性(通过web进程的沙盒),并且能够更好的利用多核CPU,这是非常简单的API,能够为你管理底下的进程细节.
chromium webkit的多进程模型有什么不一样?
chrome进程框架
注意,在这种情况下,进程边界在API边界之上,chromeium webkit并没有直接提供一个多进程的框架,
-
[WebKit]WebKit2 API解析
2013-02-18 23:44:35WebKit提供了灵活的回调机制用来支持客户端与内核的交互,在API中有一些Set Client类的函数,Client一般就是用于注册针对某一功能的回调函数。 如向WKContext注册history item处理的回调函数,就会使用下面这个结构... -
webkit实例代码,实现JS和C++、HTML相互操作
2017-10-07 16:37:06webkit实例代码,实现JS和C++、HTML相互操作,已经经过测试,里面包含JS和HTML的测试网页 -
css -webkit-line-clamp WebKit的CSS扩展(WebKit是私有属性)
2020-12-12 14:14:18-webkit-line-clamp 概述: -webkit-line-clamp 是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中。 限制在一个块元素显示的文本的行数。 为了实现该效果,它需要组合其他外来的... -
Webkit_webkit浏览器_webkit_android_
2021-10-01 06:18:58基于Webkit的新手级浏览器源码是一个简易web浏览器,基于安卓Webkit开发的。 -
Qtwebkit安装库适用于QT5.14版本.zip
2021-11-01 14:12:06Qtwebkit安装库适用于QT5.14版本。 包含了MinGw730 、VS2017 编译器的的32和64位库。 qtwebkit-Windows-Windows_7-Mingw73-Windows-Windows_7-X86.7z qtwebkit-Windows-Windows_10-Mingw73-Windows-Windows_10-X86_... -
WebKit_vbwebkit_VBWebKit_webkit
2021-09-11 16:45:27VBWebKit 实例,此例子来源于网上收集 -
VB6WebKit插件_浏览器_magic2of_.Resources\en.lproj_wagon1eu_webkitvb调用
2021-10-02 08:30:55支持vb6 -
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍
2012-02-25 10:17:03在介绍本系列各个专题之前,有必要先解释一下极其容易混淆的几个概念,它们是WebKit,WebKit2,Chromium和Chrome。 首先来了解WebKit。广义上来说,WebKit是一个开源的项目,其前身是来源于KDE的KHTML和KJS。该项 -
qt5-qtwebkit*
2020-04-23 16:06:58CentOS / RHEL 安装 Teamviewer ,解决缺少依赖包 报 “libQt5...qt5-qtwebkit-5.9.1-2.el7.x86_64.rpm,适用于 CentOS / RHEL 7.*; qt5-qtwebkit-5.212.0-0.36.alpha2.el8.x86_64.rpm,适用于 CentOS / RHEL 7.*。 -
Qt5WebKit.dll
2021-10-11 15:36:19解决安装QXDM时候出现download of QtWebkit failed报错,直接替换即可 -
webkit浏览器
2019-01-12 09:35:17webkit做一个简易的webkit浏览器,供参考吧!!!!!!做一个简易的webkit浏览器,供参考吧 -
CSS -webkit-box-orient: vertical属性编译后丢失问题详解
2021-01-19 21:21:28-webkit-line-clamp: 2; -webkit-box-orient: vertical; 后来发现代码里写的好好的,一到页面上居然没有反应,和没写一个样,f12看了下,原来是-webkit-box-orient: vertical;这个属性丢失,导致了不生效,在Styles... -
Webkit内核,含导入WebKit.Interop.dll
2021-03-18 17:01:32Webkit内核,含导入WebKit.Interop.dll,辛苦才搞来 Webkit内核,含导入WebKit.Interop.dll,辛苦才搞来 -
html5 CSS过度-webkit-transition使用介绍
2020-12-13 22:01:57复制代码代码如下: -webkit-transition: all 0.5s; color: #b91003; margin-left: 40px !important; 效果是 在0.5秒内容字体颜色逐渐红 向左边逐渐margin-left直到40px -
Qt5Webkit.dll
2020-08-11 20:42:57qt5webkit.dll解决安装QXDM打开提示无法运行QXDM4或者QXDM5,解决QXDM安装打开问题,直接替换就可以 -
WebKit.NET-0.5-Chrome的内核WebKit的NET版.zip
2020-07-14 14:31:01WebKit.NET-0.5-Chrome的内核WebKit的NET版.zip -
QTwebkit编译文档
2017-11-27 16:47:57win7操作系统下用VS2013动态编译QTWebkit,尝试了QT5.5.0版本和了QT5.6.3版本(参照了网上的一些资料,记录了个人编译过程) -
webkit与C#winform相互调用
2019-03-04 17:38:26demo说明:C#加载webkit作为内置浏览器,并实现了winform与html页面的相互调用。 -
易语言-webkit引擎界面系统(HTML+CSS+JS+JQ)
2021-06-25 23:19:282、HTML所有标签都是容器,CSS调试效果方便 3、最重要的一点,让做界面的去界面,写程序的去写程序吧,界面与程序分享得更彻底 4、支持js、jq和易语言交互! 5、窗口尺寸自适应; 6、支持FLASH; 7、网页文件可以...