WebKit
Horky
爱探索、爱技术!简单地快乐着!
展开
-
iOS Safari阅读模式分析过程
本文为Safari阅读模式分析过程记录,没有做很好的整理。详细看另外一篇<iOS Safari阅读模式研究>.原创 2016-03-23 00:19:15 · 7919 阅读 · 0 评论 -
[WebKit]WebCore之页面加载的设计与实现(二)
从上次学习WebKit加载已经过去了大半年了,终于又有时间理一次加载流程。期望逐步完善细节,最后能有一个系统的总结。首先可以这样理解WebKit的加载逻辑,涉及三个主要的组件, 其中HTTP stack为各个平台下使用的HTTP协议模块,WebCore Loaders则依据页面加载及解析过程对加载不同HTML Element的控制,Loading Controller则具体实现了资源加原创 2014-02-05 00:07:26 · 6946 阅读 · 2 评论 -
网络性能评价
从考察网络的性能角度上来看网络,总是难以捉摸,其中涉及的因素很多。各种网络参数和各类概率事件相互作用,最终表现出一个不断变化的系统环境。作为一个学习运用网络的开发者,不能仅将网络视为一个黑盒,反而是要尝试着深入了解它,更有效的利用它的特性。 好在自从网络诞生之日起就不断的有人进行研究,试图加以系统分析。原创 2013-12-24 00:42:57 · 5811 阅读 · 2 评论 -
Google Chrome中的高性能网络(二)
Chrome会随着使用变得更快。 它这个特性是通过一个单例对象Predictor来实现的。这个对象在浏览器内核进程(Browser Kernel Process)中实例化,它唯一的职责就是观察和学习当前网络活动方式,提前预估用户下一步的操作。翻译 2013-08-28 01:06:54 · 8331 阅读 · 2 评论 -
[Chrome Net Stack]用户行为统计算法
Chrome为了让用户有更好的上网体验,提供了一些以统计为基础的策略。目的在于预知用户的下一步行为,并提前发起操作,以减少用户等待时间。详细的内容可以参考之前的翻译:Google Chrome中的高性能网络>> 。主要的类图如下: 其中应用的就是统计中的预测方法:指数平滑预测方法(Smoothing Parameter)。指数平滑算法属于时间序原创 2013-11-05 23:04:34 · 3383 阅读 · 0 评论 -
Google Chrome中的高性能网络 (三)
.使用预连接优化了的TCP连接管理.使用预连接优化了TCP连接管理.应用Browser Prefreshing优化资源加载.使用预渲染优化页面浏览翻译 2013-09-02 00:24:15 · 17563 阅读 · 0 评论 -
[Android Webkit]JNI基础及Java层与C++层的交互
1. JNI 注册1.1. JNI的基础结构 JAVA == JNI == Native Code JNI(Java Native Interface)是Java与Native Code(C/C++/...)代码交互的中介,Java+JNI构成主程序, JNI+Native Code以动态库的形式供程序调用。原创 2013-09-02 23:30:55 · 9044 阅读 · 0 评论 -
Android平台webkit组件java层代码分析
转自ITeye: constGU本文将围绕android平台webkit组件中,java层的几个主要类进行分析,说明各个类的职责以及类之间的关系。若有错误疏漏之处,望不吝指出。(源码所在目录 ${framework_sourcecode_loc}\core\java\android\webkit )一、概述Android平台webkit组件java层封装了一系列浏转载 2013-09-02 22:56:19 · 3785 阅读 · 0 评论 -
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 · 11388 阅读 · 0 评论 -
C++的RAII在WebKit中的应用
先看下面这段WebKit中的代码:{ NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); //Do something else...}看看NestingLevelIncrementer的实现,就知道与另一种写法看似是等价的:{ ++m_scriptNesting原创 2013-05-30 19:46:25 · 2097 阅读 · 0 评论 -
[WebKit] JavaScriptCore解析--高级篇(一) SSA (static single assignment)
在编译器优化领域,数据结构的选择会直接影响程序优化的有效性。SSA是一种编译器使用的中间语言(intermediate language), 作为编译优化的基础(也是DFG JIT的基础),它和Control Dependence Graph一起被用来表示程序的数据流和控制流。大家都知道编译器是这样工作的:解析、优化,最后生成代码。中间会使用到一个中间语言的进行过度,好的中间语言一定要原创 2013-06-11 15:55:00 · 5838 阅读 · 0 评论 -
[WebKit] JavaScriptCore解析--基础篇(四) 页面解析与JavaScript元素的执行
很多地方都已经介绍了JavaScript在浏览器是如何被执行的,这里介绍一下WebKit是如何实现的。主要涉及JS的async,defer及普通脚本的解析与执行过程的代码实现。1. 概要说明先概要说明一下浏览器如何执行JavaScript的。 首先浏览器的页面解析器(Document Parser)遇到就会发起下载(脚本内容在页面内的就不用下载了)。然后针对不同情况执行的方式有所不原创 2013-06-01 07:00:47 · 13838 阅读 · 0 评论 -
[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现
前面说了一些解析、生成ByteCode直至JIT的基本概念,下面是对照JavaScriptCore源代码来大致了解它的实现。从JS Script到Byte Code首先说明Lexer, Parser和ByteCode的生成都是由ProgramExecutable初始化过程完成的。先在JSC的API evaluate()中会创建ProgramExecutable并指定脚本代码。然后传原创 2013-05-23 00:34:17 · 14504 阅读 · 0 评论 -
[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 · 15568 阅读 · 2 评论 -
[WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
这一篇主要说明解释器的基本工作过程和JSC的核心组件的实现。作为一个语言,就像人在的平时交流时一样,当接收到信息后,包含两个过程:先理解再行动。理解的过程就是语言解析的过程,行动就是根据解析的结果执行对应的行为。在计算机领域,理解就是编译或解释,这个已经被研究的很透彻了,并且有了工具来辅助。而执行则千变万化,也是性能优化的重心。下面就来看看JSC是如何来理解、执行JavaScript脚原创 2013-05-15 08:18:05 · 8502 阅读 · 2 评论 -
Safari插件机制研究(二) 插件的视图管理
Note:首先相对于WebKit官网的代码,iOS上的版本使用WAKView代替了NSView。 比如Mac OS中将PlatformWidget定义为 NSView*, 而在iOS中则是WAKView *. 详细的内容可以参考Hursing的博客。Overview观察一份含有视频的页面的视图结构:Hierarchy of UIWebView | |原创 2013-06-06 20:31:56 · 3519 阅读 · 0 评论 -
[WebKit]WebCore之页面加载的设计与实现(一)
这里主要分析WebContentProcess中加载页面的过程,主要针对HTTP请求的处理。主要结构WebKit2从接受到loadURL开始,就会准备尝试加载网络数据。不同平台用于处理HTTP请求的网络模块不同,可以简单得描述为下面这个块图: *Mac OS平台上现在默认使用的是NSURLConnection. *NSURLConnection的使用方式可以参考这里原创 2013-05-05 23:24:52 · 5050 阅读 · 1 评论 -
HTTP缓存思考
HTTP Cache的一个很重要的应用,它包含两个重要的领域: HTTP & Cache。 两个方面都有清楚的定义,很多人进行着各种研究,相关的文档也是数不胜数。下面是整理的一个思维导图,以后再展开。原创 2014-02-10 00:11:15 · 4289 阅读 · 0 评论 -
iOS Safari阅读模式研究
Safari阅读模式的三个要点: (1) 阅读模式的检测 (2) 阅读模式的执行 (3) 阅读模式页面的控制 这是一篇在2013年准备的资料,现在分享出来,供有需要的同学参考。原创 2016-03-23 00:08:58 · 10896 阅读 · 2 评论 -
网络性能评价方法
目前度量网络的品质的方法如果仅以网络连接类型来区分,比如2G, 3G, Wifi等,无法有效感知到当时的网络状态。在同一网络连接类型下,网络的品质仍有大幅波动,可能会因为阻塞以及线路上问题导致延迟上抖动(jitter)、丢失数据包、数据包损坏等情况。本文基于对一段时间的网络数据的记录,进行算法处理,可以测出一个衡量当时网络状态的指标。原创 2016-03-08 00:41:45 · 17135 阅读 · 2 评论 -
WebKit历史项管理的实现
历史项管理根据标准定义,由Page管理一个Joint Session History, 包含了各个子Frame的历史项。逻辑上分为三个层次:Page,Frame,以及JS Binding的接口。页面加载的核心是由Frame通过FrameLoader来完成的,HistoryController及BackForwardController可以视为页面加载进行历史项操作的接口。 Frame层次中通过HistoryController, Page层次中通过BackForwardController进行历史项操作。原创 2014-10-21 00:22:03 · 4569 阅读 · 3 评论 -
WebKit的历史项管理
讲解页面历史项管理的标信,及WebKit实现,分析两个比较隐蔽的问题。原创 2014-10-19 15:55:22 · 4071 阅读 · 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 · 5570 阅读 · 2 评论 -
应用程序启动速度优化
Mozilla工程师通过优化Static Initializer(静态初始化,或全局建构函数, Global Constructor)和Binary布局来提升FireFox启动速度的文章,非常有参考价值。文章中以x86及x86-64平台为基础,下面加了Mac OS及Android上的binary布局。什么是Static Initializer? 简而言之就是全局C++对象的初始化。原创 2014-07-06 15:09:35 · 5171 阅读 · 1 评论 -
内存分配器 (Memory Allocator)
对于大多数开发者而言,系统的内存分配就是一个黑盒子,就是几个API的调用。有你就给我,没有我就想别的办法。实际深入进去时,才发现这个领域里也是百家争鸣,非常热闹。有操作系统层面的内存分配器(Memory Allocator),有应用程序层面的,有为实时系统设计的,有为服务程序设计的。但他们的目的确认一样的,平衡内存分配的性能和提高内存使用的效率。优化内存的对策总体就是两点:一是能不用就不用,代码里可能隐藏着不必要内存分配。二是能少用就少用,特别避免频繁分配,因为那样只会增加内存碎片,到了极端时即使仍有内存可原创 2014-06-29 03:50:49 · 21809 阅读 · 6 评论 -
使用VS2010编译Webkit r116410 ( Nightly Build @ 2012-5-8 )
转载请注明出处:http://blog.csdn.net/horkychen Webkit Night Build不能直接支持VS2010,需要自己多做些事情。和VS2005不同的是有一些工程转换上的问题和nullptr的支持的问题。简单说一下吧,供需要的同学参考。a. 如果本机已经安装了Python或 Perl,先从Path中移除。因为编译过程会有不少的python脚本要执行原创 2012-05-12 23:57:19 · 7318 阅读 · 3 评论 -
WebKit加载流程 - 概述
之前写了几篇加载流程的说明,是从下向上看,有点只见树木不见森林的感觉。经过最近一段时间的学习,有了能加以概括抽象的方法。WebKit加载流程和页面组成是直接相关的,页面就是WebKit要加载的对象。所以WebKit负责加载的类也与负责页面管理的类相对应。Apple关于WebView的说明里清楚表现了页面视图上的MVC结构:一个页面从元素上也有其层次结构,并且和加载类对应。原创 2014-05-21 06:52:00 · 7557 阅读 · 5 评论 -
Android SQLite性能分析
作为Android预置的数据库模块,SQLite精致而且强大,对它的深入理解对于提升应用的性能非常重要。这里对SQLite的性能和内存进行了一些测试分析,对比了不同操作的执行性能和内存占用的情况,粗略地列在这里算是作个小结。原创 2014-04-29 22:18:09 · 14449 阅读 · 4 评论 -
Android开发中的SQLite优化
关于SQLite的优化,首先是能用SQL语句的,就不要单笔操作,Cursor就更是能不用就不用。比如成批的删除,将条件组装到SQL语句,会比使用CURSOR一条条的查再删效率要高很多(若干年前就曾使用存储过程代替单笔操作,将一次批量计算时间从一晚上缩到了一小时以内)。其次是对操作的优化:对于INSERT/UPDATE操作较多时使用事务,如果SELECT操作较多时,使用索引。原创 2014-02-01 01:17:46 · 18075 阅读 · 2 评论 -
[WebKit]管好页面缓存
“最快的网络请求就是不发请求。”无论何时有人说到这句话,我都会心一笑。这的确是真理,HTTP Cache对网页速度至关重要。现在缓存的使用看似正渐入佳境,但还不够。下面HTTP Archive的数据显示在过去一年里(2011), 可以缓存的资源增加了10%,而同时页面资源却增加了12%,页面数据量增加了24%.翻译 2014-02-18 00:56:12 · 6908 阅读 · 0 评论 -
GDB扩展之Command File - 提高调试效率
工欲善其事,必先利其器。GDB的扩展可以通过command file和python脚本完成,这里针对Command file,一个简单高效的扩展方案。GDB Command File可以简单地理解为一串自定义的GDB指令,也就是GDB允许用户使用define将一串GDB操作定义为一个指令。原创 2013-07-18 19:03:47 · 9967 阅读 · 1 评论 -
页面相关的数据存储(缓存及Web Storage)
页面可用的缓存包括:Http Cache, Local Storage, Session Storage以及Application Cache. 它们都可以用来减少请求数量,以提高页面的性能及减少流量消耗,这对于移动端的浏览器来说更为重要 (另外还有Memory Cache, 不过对于前端工程而言是透明的)。原创 2014-02-24 00:33:36 · 11105 阅读 · 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 · 6105 阅读 · 0 评论 -
[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 · 4298 阅读 · 0 评论 -
[WebKit]C++类的数据结构及在反汇编上的应用
在反汇编常常要在无法使用调试信息和源代码的情况下查看数据内容,数据结构比较好处理,如果是C++的类,就需要做些总结了。基础 - POD?C++的成员变量的排列顺序关键在于区别是不是POD(Plain Old Data)类型,从而确定是否需要有VPTR。POD类型会保持和struct相同的数据排列顺序,但在类的定义中不能出现虚函数、析构函数及拷贝的赋值函数等,否则编译器会增加一个Vi原创 2013-06-17 23:56:17 · 4391 阅读 · 1 评论 -
从Secure Shell看Chrome强大的Native Client
Google Chrome App Store中有一个强大的SSH client(可以代替PuTTY), 关键它是集成在网页之中,下面是截图:它的强大正是Chrome强大的Native Client所造就的。Native Client可以理解为网页中可以与用户进程交互,从而有了其它plugin机制无法达到性能和功能。Goolge提供了完整的开发环境,比如:G原创 2012-10-09 23:56:25 · 6774 阅读 · 0 评论 -
Webkit中HTML5 Video的实现分析 (四) - 视频加载及播放的时序图
MediaPlayer同MediaPlayerPrivateInterface,再同播放控件的交互过程应当要简单、清晰。MediaPlayer通过自身的状态(Network States 和 Ready States)来控制操作的步骤。MediaPlayerPrivateInterface具体到不同的平台和视频格式,使用的具体的播放控件会不同。这里仅贴一张时序图,其中没有特别区分HTM原创 2012-08-21 23:45:13 · 15804 阅读 · 1 评论 -
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 · 10482 阅读 · 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 · 21820 阅读 · 3 评论 -
Webkit中HTML5 Video的实现分析 (三) - MediaPlayer & MediaPlayerPrivate的生命周期
明确主要类的生命周期有助于更好理解Webkit中视频的工作流程。下图展示了类间的引用关系。如HTMLVideoElement与一个MediaPlayer对应,MediaPlayer与MediaPlayerPrivate一一对应,它们都是一个组合关系,当所有者自身被析构时,会自动释放引用的实例。这个过程都是使用OwnPtr智能指针来实现的。 OwnPtr赋值操作的代码:原创 2012-08-17 01:00:59 · 10396 阅读 · 0 评论