
WebKit研究
学习分析WebKit的各个模块的设计与实现,包括加载、解析、排版、渲染、多媒体及JavaScriptCore模块。
Horky
爱探索、爱技术!简单地快乐着!
展开
-
[WebKit]C++类的数据结构及在反汇编上的应用
在反汇编常常要在无法使用调试信息和源代码的情况下查看数据内容,数据结构比较好处理,如果是C++的类,就需要做些总结了。基础 - POD?C++的成员变量的排列顺序关键在于区别是不是POD(Plain Old Data)类型,从而确定是否需要有VPTR。POD类型会保持和struct相同的数据排列顺序,但在类的定义中不能出现虚函数、析构函数及拷贝的赋值函数等,否则编译器会增加一个Vi原创 2013-06-17 23:56:17 · 4427 阅读 · 1 评论 -
WebKit加载流程 - 概述
之前写了几篇加载流程的说明,是从下向上看,有点只见树木不见森林的感觉。经过最近一段时间的学习,有了能加以概括抽象的方法。WebKit加载流程和页面组成是直接相关的,页面就是WebKit要加载的对象。所以WebKit负责加载的类也与负责页面管理的类相对应。Apple关于WebView的说明里清楚表现了页面视图上的MVC结构:一个页面从元素上也有其层次结构,并且和加载类对应。原创 2014-05-21 06:52:00 · 7584 阅读 · 5 评论 -
使用VS2010编译Webkit r116410 ( Nightly Build @ 2012-5-8 )
转载请注明出处:http://blog.youkuaiyun.com/horkychen Webkit Night Build不能直接支持VS2010,需要自己多做些事情。和VS2005不同的是有一些工程转换上的问题和nullptr的支持的问题。简单说一下吧,供需要的同学参考。a. 如果本机已经安装了Python或 Perl,先从Path中移除。因为编译过程会有不少的python脚本要执行原创 2012-05-12 23:57:19 · 7330 阅读 · 3 评论 -
HTTP缓存思考
HTTP Cache的一个很重要的应用,它包含两个重要的领域: HTTP & Cache。 两个方面都有清楚的定义,很多人进行着各种研究,相关的文档也是数不胜数。下面是整理的一个思维导图,以后再展开。原创 2014-02-10 00:11:15 · 4307 阅读 · 0 评论 -
[WebKit]WebCore之页面加载的设计与实现(三)
关于页面加载,RFC2616(HTTP 1.1)做了很多的定义,WebKit的流程也是遵循这些定义的实现。这部分的实现主要放在之前提出的WebCore Loaders和HTTP Stack中。比如Chrome Net Stack(里面包含了HTTP Stack的实现)中实现了HTTP Cache, 而Android浏览器则是HTTP Client中实现了HTTP Cache。原创 2014-02-06 23:57:56 · 6136 阅读 · 0 评论 -
[WebKit]WebCore之页面加载的设计与实现(二)
从上次学习WebKit加载已经过去了大半年了,终于又有时间理一次加载流程。期望逐步完善细节,最后能有一个系统的总结。首先可以这样理解WebKit的加载逻辑,涉及三个主要的组件, 其中HTTP stack为各个平台下使用的HTTP协议模块,WebCore Loaders则依据页面加载及解析过程对加载不同HTML Element的控制,Loading Controller则具体实现了资源加原创 2014-02-05 00:07:26 · 6977 阅读 · 2 评论 -
Google Chrome中的高性能网络 (三)
.使用预连接优化了的TCP连接管理.使用预连接优化了TCP连接管理.应用Browser Prefreshing优化资源加载.使用预渲染优化页面浏览翻译 2013-09-02 00:24:15 · 17632 阅读 · 0 评论 -
Google Chrome中的高性能网络(二)
Chrome会随着使用变得更快。 它这个特性是通过一个单例对象Predictor来实现的。这个对象在浏览器内核进程(Browser Kernel Process)中实例化,它唯一的职责就是观察和学习当前网络活动方式,提前预估用户下一步的操作。翻译 2013-08-28 01:06:54 · 8434 阅读 · 2 评论 -
Google Chrome中的高性能网络(一)
驱动Chrome继续前进的核心原则包括: *Speed: 做最快的(fastest)的浏览器. *Security:为用户提供最为安全的(most secure)的上网环境。 *Stability: 提供一个分健壮且稳定的(resilient and stable)的Web应用平台。 *Simplicity: 以简练的用户体验(simple user experience)封装精益求精的技术(sophisticated technology)。本文关将注于第一点,速度。翻译 2013-08-01 21:45:17 · 11448 阅读 · 0 评论 -
[WebKit] JavaScriptCore解析--高级篇(三) Register Allocation & Trampoline
Register Allocation对于一个JIT而言,寄存器分配对系统的消耗通常是一个瓶径。之前有Graph Coloring Allocators, Chaitin style等分配方式,现在要介绍的是DFG JIT使用的Linear Scan算法。其基本工作方式是将占用寄存器的变量根据生命周期长短排列出来,在使用时查看可以回收哪些寄存器加以利用。先看一些定义:•Live原创 2013-06-12 08:18:14 · 5621 阅读 · 2 评论 -
[WebKit] JavaScriptCore解析--高级篇(二) 类型推导(Type Inference)
类型推导是DFG JIT最重要的一个基础,WebKit官网对此做了一点解释,翻译如下做为学习参考。Type inference通过profiling values来做到的,先是预测对哪些类型操作进行分析,再添加类型检查,最后基于类型检查的结果建立类型统计数据。用下面的例子来说明这个过程:o.x * o.x + o.y * o.y其中o是一个对象,x和翻译 2013-06-11 09:44:57 · 4344 阅读 · 0 评论 -
[WebKit] JavaScriptCore解析--高级篇(一) SSA (static single assignment)
在编译器优化领域,数据结构的选择会直接影响程序优化的有效性。SSA是一种编译器使用的中间语言(intermediate language), 作为编译优化的基础(也是DFG JIT的基础),它和Control Dependence Graph一起被用来表示程序的数据流和控制流。大家都知道编译器是这样工作的:解析、优化,最后生成代码。中间会使用到一个中间语言的进行过度,好的中间语言一定要原创 2013-06-11 15:55:00 · 5888 阅读 · 0 评论 -
Safari插件机制研究(二) 插件的视图管理
Note:首先相对于WebKit官网的代码,iOS上的版本使用WAKView代替了NSView。 比如Mac OS中将PlatformWidget定义为 NSView*, 而在iOS中则是WAKView *. 详细的内容可以参考Hursing的博客。Overview观察一份含有视频的页面的视图结构:Hierarchy of UIWebView | |原创 2013-06-06 20:31:56 · 3540 阅读 · 0 评论 -
Safari插件机制研究(一)
Overview在Safari里有一个单例对象WebPluginDatabase负责管理本地的插件,每个plugin对应一个WebBasePluginPackage,存放在plugins里。在第一次调用sharedDatabase()会遍历当前系统有哪些可用的插件,并加到列表中管理。每个插件有其支持的MIME types和文件扩展名(Extension),在加载完成后,还会向Web原创 2013-06-05 18:18:04 · 5770 阅读 · 0 评论 -
[WebKit]WebCore之页面加载的设计与实现(一)
这里主要分析WebContentProcess中加载页面的过程,主要针对HTTP请求的处理。主要结构WebKit2从接受到loadURL开始,就会准备尝试加载网络数据。不同平台用于处理HTTP请求的网络模块不同,可以简单得描述为下面这个块图: *Mac OS平台上现在默认使用的是NSURLConnection. *NSURLConnection的使用方式可以参考这里原创 2013-05-05 23:24:52 · 5082 阅读 · 1 评论 -
[WebKit] JavaScriptCore解析--基础篇(四) 页面解析与JavaScript元素的执行
很多地方都已经介绍了JavaScript在浏览器是如何被执行的,这里介绍一下WebKit是如何实现的。主要涉及JS的async,defer及普通脚本的解析与执行过程的代码实现。1. 概要说明先概要说明一下浏览器如何执行JavaScript的。 首先浏览器的页面解析器(Document Parser)遇到就会发起下载(脚本内容在页面内的就不用下载了)。然后针对不同情况执行的方式有所不原创 2013-06-01 07:00:47 · 13897 阅读 · 0 评论 -
WebKit的JS Binding解析
转载请注明出处:http://blog.youkuaiyun.com/horkychenWebCore与JavaScriptCore之间使用了Proxy模式,WebCore为JSC提供了一层binding层做为封装。Webkit参照W3C Web IDL(之前称为Language Bindings for DOM Specifications)描述DOM接口,但不完全相同。其完整的名称为WebKi原创 2012-05-31 23:43:09 · 12583 阅读 · 4 评论 -
JavaScriptCore内存分配的战争
原文来自:http://webkit.sed.hu/content/war-allocators-javascriptcore-another-participant由zoltan.horvath发表于02/22/2010,虽然现在的状况已经不同了,但还是有一定的参考价值。 世界上有很多的自定义内存分配库,让我们尝试下另一个后起之秀,它就是DLMalloc, 由Doug L翻译 2012-06-01 00:32:49 · 4647 阅读 · 0 评论 -
[WebKit]为JavaScript Binding添加新DOM对象的三种方式及实作
转载请注明出处:http://blog.youkuaiyun.com/horkychen 一.基础知识首先WebKit IDL并非完全遵循Web IDL,只是借鉴使用。WebKit官网提供了一份说明(WebKitIDL),比如Web IDL称"operation”(操作), 而WebKitIDL称为"method"(方法), 另外Web IDL也不像WebKitIDL那样将属性和参数分开。原创 2012-06-06 22:34:10 · 13701 阅读 · 8 评论 -
[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现
前面说了一些解析、生成ByteCode直至JIT的基本概念,下面是对照JavaScriptCore源代码来大致了解它的实现。从JS Script到Byte Code首先说明Lexer, Parser和ByteCode的生成都是由ProgramExecutable初始化过程完成的。先在JSC的API evaluate()中会创建ProgramExecutable并指定脚本代码。然后传原创 2013-05-23 00:34:17 · 14580 阅读 · 0 评论 -
开发者应当了解的WebKit知识
对一些开发者而言,WebKit就是一个黑盒子。丢进去HTML、CSS、JS等一连串的东西,而WebKit就能变魔术一般显示出一个很棒的网页出来。实际上,正我的同事IlyaGroriks提到的: WebKit不但是白盒,而且是一个开放的白盒。让我们花点时间来理解以下这些问题:什么是WebKit? 什么不是WebKit? 浏览器是如何使用WebKit的? 为什么WebKit分翻译 2013-03-02 22:46:22 · 72027 阅读 · 6 评论 -
为什么V8引擎这么快?
转载请注明出处:http://blog.youkuaiyun.com/horkychenGoogle研发的V8 JavaScript引擎性能优异。我们请熟悉内部程序实现的作者依源代码来看看V8是如何加速的。作者:Community Engine公司研发部研发工程师Hajime MoritaGoogle的Chrome中的V8 JavaScript引擎,由于性能良好吸引了相当的注目。它是G翻译 2012-07-18 23:47:01 · 66360 阅读 · 10 评论 -
JavaScriptCore, WebKit的JS实现(完)
什么是method JIT? 什么是DFG JIT? JSC的DFG JIT与V8 Crankshaft相比有何优劣?JIT:一个方法式的JIT(a method jit)*关于method JIT,可以参考另一份档案。关于解释器(interpreter)和堆栈(stack,也就是寄存器文件,register file)都是应用了方法式JIT(method JIT). 所谓简单方法JI翻译 2012-08-23 00:07:46 · 10518 阅读 · 1 评论 -
JavaScriptCore, WebKit的JS实现(一)
目前,JavaScript的实现已经成为编译领域的一个重要组成部分。主要包括Google的V8, Mozilla的SpiderMonkey, 还有Webkit使用的JavaScriptCore。 jsc:WebKit的JS引擎( js for webkit)JavaScriptCore (JSC)正是WebKit的JavaScript实现。 起初,JavaScriptCore是翻译 2012-08-21 01:03:36 · 11455 阅读 · 1 评论 -
Webkit中HTML5 Video的实现分析 (一) - 基本结构及HTMLMediaElement & MediaPlayer
以下为针对Webkit中HTML5 Video实现原理的分析和学习总结。至于其中的UML图档,可以到下面的github链接中下载。首先预览一下Webkit中和Video相关的主要的类的层次结构:其中主要的类为HTMLMediaElement, MediaPlayer以及RenderVideo(左下角).HTMLMediaElement代表了DOM结点,其继承关系可以追溯到Nod原创 2012-08-11 23:14:05 · 21930 阅读 · 3 评论 -
Webkit中HTML5 Video的实现分析 (二) - MediaPlayerFactory & RenderVideo的绘制操作
MediaPlayerFactoryMediaPlayerFactory像是一个解码库一样,初始化时,各个可用的播放器(MediaPlayerPrivate)向它注册。当需要解码时,由它给出一个合适的播放器(呼叫MediaPlayerPrivate::constructor,即MediaPlayerPrivate::create)创建一个实例[由MediaPlayer:: loadWith原创 2012-08-14 00:11:51 · 14212 阅读 · 2 评论 -
Webkit中HTML5 Video的实现分析 (三) - MediaPlayer & MediaPlayerPrivate的生命周期
明确主要类的生命周期有助于更好理解Webkit中视频的工作流程。下图展示了类间的引用关系。如HTMLVideoElement与一个MediaPlayer对应,MediaPlayer与MediaPlayerPrivate一一对应,它们都是一个组合关系,当所有者自身被析构时,会自动释放引用的实例。这个过程都是使用OwnPtr智能指针来实现的。 OwnPtr赋值操作的代码:原创 2012-08-17 01:00:59 · 10423 阅读 · 0 评论 -
Webkit中HTML5 Video的实现分析 (四) - 视频加载及播放的时序图
MediaPlayer同MediaPlayerPrivateInterface,再同播放控件的交互过程应当要简单、清晰。MediaPlayer通过自身的状态(Network States 和 Ready States)来控制操作的步骤。MediaPlayerPrivateInterface具体到不同的平台和视频格式,使用的具体的播放控件会不同。这里仅贴一张时序图,其中没有特别区分HTM原创 2012-08-21 23:45:13 · 15867 阅读 · 1 评论 -
Webkit中HTML5 Video的实现分析(五) - WebKit中视频事件的传递
HTML的每个元素都可以让JavaScript在某些事件发生时,进行处理。就比如onclick="clickButton()"之类的属性设定。像下面这篇博客所讲的一样,在WebKit中每个元素都有其对应的JS绑定的实现:[WebKit]为JavaScript Binding添加新DOM对象的三种方式及实作对于视频元素,可以对应看看JSHTMLMediaElement原创 2012-10-22 00:15:41 · 8097 阅读 · 1 评论 -
Webkit中HTML5 Video的实现分析(六) - Safari视频机制分析
Safari中的视频相关操作封装在QuickTime Plugin里面,存放于/Library/Internet Plugin目录下。 下图是相关类的class diagram:其中的QuickTime Plugin是通过已淘汰的Apple之前定义的Webkit Plugin协议来实现的,而不是现在支持的Netscape API的机制。可以参考以下文档:原创 2012-12-17 23:48:06 · 5241 阅读 · 3 评论 -
[WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
这一篇主要说明解释器的基本工作过程和JSC的核心组件的实现。作为一个语言,就像人在的平时交流时一样,当接收到信息后,包含两个过程:先理解再行动。理解的过程就是语言解析的过程,行动就是根据解析的结果执行对应的行为。在计算机领域,理解就是编译或解释,这个已经被研究的很透彻了,并且有了工具来辅助。而执行则千变万化,也是性能优化的重心。下面就来看看JSC是如何来理解、执行JavaScript脚原创 2013-05-15 08:18:05 · 8590 阅读 · 2 评论 -
[WebKit] JavaScriptCore解析--基础篇 (一)JSC与WebCore
先看一下官方的基本介绍,短短几句就塞满了关键字。SquirrelFish,正式名称是JavaScriptCore,包括register-based(基于寄存器的虚拟机), direct-threaded, high-level bytecode engine(字节码引擎).它使用基于内置copy propagation(复制性传播算法)的一次性编译器(one-pass compiler),原创 2013-05-12 00:02:47 · 15686 阅读 · 2 评论 -
[WebKit]WebKit2多进程机制的解析
在WebKit模块化分析>>中说到WebKit2中的多进程模型。多进程模型已经是浏览器的基本架构要素,下面展开分析一下WebKit2中的多进程模型。协作决定接口,确立责任分工后,对于模块或系统间最重要的事莫过于接口定义,而且是有着简洁明确的定义。对于WebKit2中三个进程中的交互也是相当频繁和多样,如果使用传统的查表法对应解析执行,就会面临巨大的维护成本。WebKit2使用了En原创 2013-02-25 22:54:58 · 7416 阅读 · 1 评论 -
[WebKit]WebKit2 API解析
这里是对上一篇>的进一步展开。先从API层开始。API概览主要类图WebKit提供了灵活的回调机制用来支持客户端与内核的交互,在API中有一些Set Client类的函数,Client一般就是用于注册针对某一功能的回调函数。如向WKContext注册history item处理的回调函数,就会使用下面这个结构(WKContext.h):struct WKCo原创 2013-02-18 23:44:35 · 11010 阅读 · 0 评论 -
WebKit模块化分析
模块化 软件的首要技术使命是管理复杂度(Complexity)。这是>中的一个标题。软件本质性困难的根源都在于复杂性。Dijkstra指出没有谁的大脑能容得下一计算机程序。正如社会进步催生社会分工一样,软件行业也自然而然地发展出来了模块化方法,将整个系统分解为多个子系统来降低问题的复杂度,分而治之。它有两个主要的目的: 1. 分工 (角色与责任) 2. 信息隐藏 (原创 2013-01-03 22:51:17 · 14285 阅读 · 12 评论