- 博客(116)
- 资源 (1)
- 收藏
- 关注
原创 点击链接加载网页 与 地址栏输入网址加载网页
点击链接加载网页与地址栏输入网址加载网页是我们打开一个网页的两种方式,我们平时很可能遇到一些看似诡异的情况,比如这两种方式一个好用一个不好用。这提醒我们,这看似一样的打开方式其实还是有诸多的不同。 它们的调用路径肯定是不同的,点击链接加载网页是通过WebCore中的相关节点相应事件,地址栏输入网址加载网页是通过浏览器直接调用loadurl的接口,它们最终在WebCore::FrameLo
2014-11-26 18:51:29 6732
原创 浅析浏览器事件响应及分发
浏览器的事件响应及分发机制是与用户互动的基石。我在之前一篇文章中简要分析过chromium24的事件响应及分发机制。那么这篇文章不涉及具体的浏览器,而是从宏观上分析浏览器的事件响应及分发机制的大体框架。其实任何一款浏览器基本都遵循于这个框架。1. 事件捕获及类型判断事件的捕获由系统传感器完成并调用到浏览器,事件类型的判断大都通过系统API进行,比如touch,scroll等等。也
2014-04-09 15:31:37 1443
原创 webkit关键代码浏览——CSS引擎
CSS解析是平时工作中基本不会接触到的一块,原因很简单,这部分代码基本不会出现BUG。这就说明了这部分代码比较“简单”,为何说它比较简单呢,因为它只干了三件事: 1. 解析CSS ,使用内部数据结构表示 2. 重新组织数据,为第三步做准备 3. 将样式信息装入相应RenderStyle,以备排版使用 这三件事在逻辑上来说相对比较简单,但怎样实现的优美、高效又是另外一
2014-03-01 16:56:22 1405
原创 webkit find功能浅析
Webkit的find功能是webkit比较小的一个功能,它在底层的主要接口就是android::WebViewCore::findTextOnPage。这个函数主要干了三件事情: A. 移除已有的标记B. 搜索符合条件的字符串(需记录字符串的个数和它们的位置),并为它们做上标记C. 显示新标记第一步和第三步比较简单,本质上就是向带有标记的node所
2014-02-28 14:25:00 1289
原创 webkit 图片解码与缓存
从之前的文章中我们知道,image是一种派生资源,它下载之后会有memory cache机制进行缓存,而image对应的缓存类为CacheImage。CacheImage有一个成员SharedBuffer存储的是图片元数据,也就是没解码前的数据(由loader传递而来)。还有一个Image对象(实际是个BitmapImage),该对象在GraphicsContext绘制时使用。看如下堆栈:#4
2014-02-28 14:13:01 3480 3
原创 webkit关键代码浏览——页面加载
关于webkit页面加载的文章也比较多,这篇和这篇都从机制上对webkit页面或者说资源加载进行了介绍。而这篇以代码为工具更为具体的介绍了加载流程。最后这篇以image为例介绍了其从解析、加载到显示的整个流程。 webkit的资源加载主要是分清主资源和派生资源它们有不同的流程,对于派生资源而言,它有一个memory cache的机制。我在这篇文章中介绍过浏览器中的几种缓存,并在这篇文章中以
2014-02-28 13:26:23 2292
原创 HTML5 Video 实现浅析
HTML5 Video实现浅析——基于android4.1browser1. 基本结构先上一张基本结构图,图中展示了webkit中与HTML5 Video实现相关的一些类。1.1 DOM TreeVideo标签在webkit内部对应于HTMLVideoElement类,该类的功能并不多,大多数的功能都在其父类HTMLMediaElement中。1.2
2014-02-27 16:00:52 10122 1
原创 webkit关键代码浏览——HTML解析
基础概念就不多说了,直接进入正题,HTML解析这部分我主要关注了6点:1. 词法解析 2. 语法解析 3. 容错机制 4. DOM树构建 5. Render树构建 6. 查看DOM树和Render树
2014-02-19 15:05:19 2556
原创 webkit关键代码浏览计划
最近由于工作重心的调整,今后一段时间重点会放在webkit上。接触webkit已有近两年时间,一直没有对webkit的关键代码进行系统的梳理学习,以至于到现在还是雾里看花不求甚解,很是惭愧。借由工作重心调整的契机,再加上最近工作不忙,准备正式启动这件一直想做的事情——对webkit关键代码进行系统学习。 学习的内容包括下面几部分: 1. 页面加载 2. H
2014-02-19 11:24:34 1324
原创 webkit---缩放重排
有的网页(特别是桌面版网页)在手机上浏览时字体特别小,用户们不得不放大才能看清,为了避免网页放大后需要左右移动来看其内容,浏览器一般都会很贴心的对该网页的文字进行重排,以适应屏幕的宽度。这个功能很实用,但现在好像并不是webkit的自带功能,而是需要各家浏览器独自实现。那么这个功能主要涉及到两个技术点:缩放重排和重新定位。 首先说一下缩放重排,实际上就只需要设置RenderBlo
2014-02-14 16:16:00 3454 1
原创 webkit--维护已访问链接
webkit会维护已经访问过到链接,最直观的表现是已经访问过到链接会变色。再比如CSS中提供了visited伪类,前端开发者可以据此指定已访问链接的表现形式。 该功能是在PageGroup类中维护的,有PageGroup::addVisitedLink,PageGroup::isLinkVisited两个接口。从这两个函数中可以看到,webkit是通过HASH表的方式来存储已访问的链接。ad
2014-02-10 15:44:23 1470
原创 深入理解surface系统
前一段时间以android4.1源码为基础比较深入的研究了一下其Surface系统部分的代码,主要是学习网上各位前辈的内容。其中老罗(http://blog.csdn.net/luoshengyang?viewmode=contents)和林学森(http://blog.csdn.net/uiop78uiop78/)的博客对我帮助最大, 在这里表示感谢。对于想要深入理解的朋友可以学习他们的博客
2014-01-17 15:13:41 224
原创 android4.4 browser渲染机制浅析
Android4.4 browser 渲染架构分析1. 整体分析Android4.4 browser与之前版本最大的不同就是在保持webview控件接口不变的情况下,将内核换成了chromium32。随之,它的硬件加速渲染架构也与之前版本和chromium本身都有一定差别,相当于androidbrowser与chromium的一个融合。它们都使用chromium的核心,直观来看
2014-01-17 14:40:05 5393 3
原创 Browser缓存机制浅析
更快的加载时间和更省的流量无疑是所有浏览器都追求的目标。为了达成这个目标,经典的以空间换时间的缓存机制自然必不可少。本文就总结一下浏览器中常见的几种缓存机制,目前本人还没有深入研究这几种缓存机制,所得的资料基本来源于网上,日后有时间必定要对这几种缓存机制进行下系统的研究。1. 资源分类 在介绍缓存机制之前,先将资源分类罚抄一下:WebCore 把要加载的资源分成两类,一类是主资源,比如
2013-11-23 17:49:00 2684
原创 ContentShell启动过程全分析(二)
一、Render进程初始化Render进程的初始化流程与Browser进程非常相似,启动service后会调用到ContentMain::Start,并且在RunNamedProcessTypeMain函数中走RenderMain的流程。上述流程图是Render进程消息循环及IPC相关类的初始化,可见它们在Render进程刚一建立就相继被初始化了,因为它们是一个进程最最基础的类
2013-11-07 19:22:31 2300 1
原创 ContentShell启动过程全分析(一)
一、概述ContentShell的启动过程比较复杂,涉及的类比较多,总是看了这忘了那,于是萌生了将看过的初始化过程记录一下的想法。本文从UI初始化,Browser进程初始化和Render进程初始化三个方面来浅析一下ContentShell的初始化过程。主要关注一些关键对象的构造。本文基于chromium31,android版本。二、UI的初始化整个CotnentShell的启动从U
2013-11-07 14:19:28 3903 2
原创 浅析chromium构建过程
本文只是简单记录一下在编译chromium前的一些准备工作的流程。关于chromium构建系统gyp的基本用法网上已经有不少文档介绍过,也可以参见gyp的官方网站:http://code.google.com/p/gyp/。无论gyp构建系统是优是劣,你习惯或不习惯,chromium已经使用了它,那我们就必须去适应。 开始编译chromium之前的一个关键步骤就是运行:android_gyp
2013-10-12 17:46:16 2288
原创 Chromium CC部分浅析(三)
3.2 工作流程chromium24和26在流程上的主要区别就是,26中painting被分成了record和raster两步。24中,painting过程发生在main线程(即上述的更新过程),26中record在main线程中执行,而将raster移到了impl线程。如图所示:painting过程是webkit将网页内容用skia绘制成skbitmap的过程。reco
2013-10-08 17:08:43 2482
原创 Chromium CC部分浅析(二)
CC的工作流程每个版本CC部分代码都有比较大的改动,所幸是主框架和主流程并没有改变,这里结合chromium24和chromium26,说一下CC模块的代码结构和工作流程。代码结构Cc模块porting自webkit的硬件加速部分,特别是GraphicsLayer类(该类即代表一个层)。Chromium对GraphicsLayer类的porting是Graphi
2013-10-08 17:00:50 2159
原创 Chromium CC部分浅析(一)
CC简介CC即是chromiumcompositing的简写,意思是chromium的合成器,是为webkit的硬件加速渲染提供合成和渲染逻辑的关键代码。关于硬件加速的基本知识可以参见chromium的官方文档http://dev.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome。最
2013-10-08 16:53:20 2300
原创 chromium启动下载任务
对于很多链接打开以后会启动一个下载任务,本来以为这个功能也是通过shouldoverrideurlloding回调接口来判断的。实际发现并不是,下载链接最初被当作正常的url打开,在webkit解析response过程中判断出这是一个下载任务,并且启动下载。先给出一个webkit的调用堆栈:#0 WebKit::FrameLoaderClientImpl::download Frame
2013-09-24 19:21:01 1806
原创 chromium shouldOverrideUrlLoading(HandleUrl)回调
我们的浏览器总是非常智能,除了可以打开http,ftp等众多常见协议之外,也可以调用第三方应用来打开某些特定url。比如调用淘宝客户端来打开taobao://的网页,再比如迅雷,你懂的。 实际上webkit或者说net库只支持标准的传输协议,对于特定的url就只有通过browser来支持了。在打开一个url之前,webkit总会回调到browser端的接口shouldOverrideUrl
2013-09-24 17:27:10 1879
原创 chromium恢复上次打开网页功能
恢复上次打开的网页是浏览器一个很实用的功能,相信大家都不会陌生。细心的人会发现,在恢复上次打开网页的过程中,不仅仅恢复了网页本身,还恢复了它的表单数据、滚动位置、缩放比例、历史记录列表等。 这不禁让我们想起历史记录功能,点击前进、后退按钮时也可以恢复网页的表单数据、滚动位置、缩放比例等。不难推测出,这两个功能应该是复用了相同的代码。所以实际上恢复上次打开的网页,关键是是恢复Navigatio
2013-08-15 10:40:36 1711
转载 页面缓存概述
人都知道浏览器将这个新特性称为Page Cache。Firefox将其称为“Back-Forward Cache”或“bfcache.” ,Opera则称其为“Fast History Navigation.” ,在WebKit的实现中我们称其为“Page Cache”, 以避免与“Back/Forward List.”的混淆。注意,页面缓存是使用用户更加流畅地浏览网页的一个客户端特性。而
2013-08-08 10:22:19 1243
原创 chromium保存网页功能
chromium保存网页的功能是通过将DOM树序列化为html语言字符串的形式来实现的,它能够很好的将用户所看到的网页转换成一个html字符串。从WebCore::WebPageSerializerImpl::serialize函数可以看到整个流程。 大体思想是以document节点为起点,在WebPageSerializerImpl::buildContentForNode函数中递归序列化
2013-08-05 19:38:31 1820
原创 chromium输出render树
对于排版问题的调试,能够查看render树无疑有很大的帮助,webkit也提供了这样的接口来方便开发人员。chromium输出render树的接口可以参见WebFrameImpl::renderTreeAsText,实际实现在RenderTreeAsText.cpp文件中,一个典型的树的深度优先搜索遍历。
2013-08-01 16:37:58 1665
原创 chromium阅读模式实现
实际上chromium是没有实现阅读模式的,但是阅读模式确实是移动浏览器比较实用的一个功能,特别对于喜欢在线浏览小说的人来说,一个良好的阅读模式可以提供极佳的阅读体验。所以实现阅读模式是非常必要的,但是想实现一个良好的阅读模式还算难度较大的。 其实实现方式是很容易理解的,就是玩弄当前的DOM树,一番折腾之后得出三个字符串:一是标题,二是内容,三是下一页或者上一页的URL。然后把这三个字符串
2013-08-01 15:01:30 2114
原创 chromium设置字体大小功能
其实对于手机浏览器来说,设置字体大小实在是一个非常鸡肋又蛋疼无比的功能,因为本身可以缩放,还有缩放重排等功能。谁会有那么无聊想设置字体大小。改变字体大小强制改变了原网页的意图,排版完全改变,很可能造成较差的用户体验,真是一个吃力不讨好的功能。 在browser端设置字体大小之后,不会意外会最终设置到WebCore::Settings::setTextAutosizingFontScaleF
2013-07-31 18:25:26 2240 1
原创 chromium历史记录实现(不完整版)
chromium整个历史记录功能比较复杂,包括前进后退,浏览历史,用插件以后还可以显示树形的浏览记录。这里只分析一下我所看到的部分代码,没有搞的特别清楚,主要跟前进后台的功能相关。其实在webkit中已经支持前进后退,浏览历史等功能。这些类主要集中在third_party/WebKit/Source/WebCore/history/目录下。其中HistoryItem类标识一条基本的历史
2013-07-29 17:06:17 3095
原创 chromium手势事件处理流程
chromium手势事件的处理,简而言之就是browser进程调用系统接口捕获并判断事件,传给render进程处理事件的过程。 捕获事件的接口:ContentViewGestureHandler::onTouchEvent。在这个函数中有一些判断这里不再赘述,只提一个重要的函数ContentViewGestureHandler::offerTouchEventToJavaScript。这个
2013-07-17 16:24:44 2607
原创 基于chromium24的HTML5特性实现(Custom search providers)
该特性主要包含两个js接口:window.external.AddSearchProvider(sUrl) 和 pdwResult = window.external.IsSearchProviderInstalled(sUrl)。主要功能是可以通过js来提示用户添加和管理搜索引擎。可以参见这个网页的介绍。 既然是js接口,那么首要的任务就是让v8能够识别这两个函数。自然的想法是在Web
2013-07-17 14:13:10 2285
原创 输入框(input)光标显示流程
光标显示的主要逻辑在FrameSelect.cpp文件中。FrameSelection::caretBlinkTimerFired函数即为光标的定时器,来控制光标闪烁。该定时器会调用invalidateCaretRect()来触发重绘请求。同时还会对m_caretPaint的值取反。m_caretPaint变量控制重绘过程中CaretBase::paintCaret 函数是否被调用。Caret
2013-07-16 19:20:11 2255
转载 gdb多线程调试
先介绍一下GDB多线程调试的基本命令。info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。thread ID 切换当前调试的线程为指定ID的线程。break thread_test.c:123 thread all 在所有线程中相应的行上设置断点thread app
2013-07-05 11:05:13 872
原创 基于chromium24的HTML5特性实现(input type = week date datetime datetimelocal month time)
inputtype= month (date datetime datetimelocal weektime),把这几个特性拿到一起说是因为它们的实现方法完全一样。以month为例,该特性的实现过程可以分为两步:一是记录type,二是相应事件。所谓记录type就是webcore在解析网页时记录下该input的type。Type主要分为下面几种(类似color那样需要特殊类支持的排除在外):
2013-06-26 17:05:56 2959
原创 基于chromium24的HTML5特性实现(web notifications)
webnotifications的实现与inputtyp=color一样清晰,其最重要的一个类是content::NotificationProvider,不同的是该特性是由V8触发。其堆栈如下:#0 content::NotificationProvider::show (this=0x4aa08c38,notification=...) at content/renderer/noti
2013-06-26 16:33:20 1396
深入理解Surface系统
2014-05-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人