
谷歌浏览器
文章平均质量分 85
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
谷歌浏览器的源码分析(2)
这么大的工程,我从哪里开始呢?我认为从界面开始,这样才可以快速地深入研究。下面就可以先尝试修改一个chrome的关于对话框,上一次看到它是英语的,那么我就来把它改成中文的吧,这样有目标了。从chrome的工程里可以看到它是支持多种语言的,在Windows平台上支持多语言的标准做法,就是写多个语言的DLL。因此,chrome也不例外,从app工程集里,就可以看到如下图所示: 上面显示了多种语言的原创 2008-09-08 23:18:00 · 38990 阅读 · 36 评论 -
谷歌浏览器的源码分析(19)
继续上一次分析到类WebContents的Navigate函数,在这个函数里通过参数entry传送入来,这样它只需要根据这个参数去下载网页回来显示,应就可以了吧,但到底是怎么样工作的呢?这需要深入去分析它,才知道它是什么样的结果。#001 #002 bool WebContents::Navigate(const NavigationEntry& entry, bool relo原创 2008-10-03 20:07:00 · 8148 阅读 · 5 评论 -
谷歌浏览器的源码分析(20)
上一次介绍到把网页连接地址生成一个消息通过IPC机制把消息发送出去,那么IPC的通讯机制是怎么样的呢?又是发送给谁呢?由于这个浏览器是使用多进程的架构来工作的,所以进程之间就需要相互交流,这种交流是就是通讯,可以从源码里看到它是使用IPC的机制来通讯,实际采用的技术,就是Windows的命名管道的方式。可以看到这段代码:#001 bool Channel::CreatePipe(c原创 2008-10-04 13:38:00 · 7665 阅读 · 2 评论 -
谷歌浏览器的源码分析(22)
上一次说到消息转发,并分析了RenderThread类里处理消息的函数,其实大部份的消息都是在RenderView类里的OnMessageReceived函数处理,比如浏览的消息也是在这里处理。它的代码如下:#001 void RenderView::OnMessageReceived(const IPC::Message& message) {#002 // Let the原创 2008-10-07 21:34:00 · 7216 阅读 · 0 评论 -
谷歌浏览器的源码分析(23)
继续上一次来分析LoadRequest的代码,在分析这个函数代码之前,先看看WebFrame类的继承层次关系,如下:class WebFrame : public base::RefCounted {WebFrame是一个接口类,但它先继承引用计数类RefCounted,这样对于这个对象多次访问,就可以使用引用计数来判断对象的生命周期了。对于base::RefCounted的语法,其原创 2008-10-09 21:55:00 · 7614 阅读 · 3 评论 -
谷歌浏览器的源码分析(24)
继续上一次的分析,这里开始把连接址和其它相关的信息传送frame_->loader()->load函数里面,那么在这个函数里面到底是怎么样处理的呢,只有去分析它的代码,我们才能找到它的答案,现在就来开始看吧,如下:<span lang="EN-US" style="font-family:新宋体;mso-fareast-language:ZH-CN">#001 void FrameL原创 2008-10-12 13:54:00 · 7463 阅读 · 1 评论 -
谷歌浏览器的源码分析(25)
上一次说到需要把显示的网络连接地址变成一个资源的消息发送出去,它是通过函数ResourceHandle::create来实现的,但这个函数到底是怎么样实现的呢?现在就分析它的实现代码,了解它怎么样把资源变换成消息,并且通过IPC机制把消息发送到资源下载进程去。数ResourceHandle::create的代码如下:#001 PassRefPtr ResourceHandle::cre原创 2008-10-13 21:40:00 · 7565 阅读 · 2 评论 -
谷歌浏览器的源码分析(28)
上一次说到使用WinHTTP函数来创建HTTP连接,并且使用它来发送请求,那么数据接收回来,当然也是从它那里接收的,因此下面来分析它的接收数据的几个函数,然后再来看看chrome里收到数据后发送到那里处理。在WinHTTP里使用WinHttpOpen函数来创建HTTP连接,然后使用WinHttpConnect连接需要下载数据的网站,接着调函数WinHttpOpenRequest来创建一个原创 2008-10-27 22:02:00 · 8132 阅读 · 1 评论 -
谷歌浏览器的源码分析(29)
上一次说到通过WinHTTP来接收网络数据,但没有具体介绍怎么样接收,现在就来分析这方面的代码。首先是通过函数WinHttpQueryHeaders来查询HTTP协议头的大小,接着还是通过函数WinHttpQueryHeaders把数据接收到缓冲区里。下面这段代码,就是做这样的事情:#001 int HttpTransactionWinHttp::DidReceiveHeaders()原创 2008-11-02 19:40:00 · 8636 阅读 · 3 评论 -
谷歌浏览器的源码分析(30)
上次说到函数WinHttpReadData接收数据到缓冲区里,那么这些数据又是怎么样传送给下一步处理的呢?带着这个问题,我们来分析下面这段代码,如下:#001 void HttpTransactionWinHttp::HandleStatusCallback(DWORD status,#002原创 2008-11-05 22:51:00 · 10025 阅读 · 0 评论 -
谷歌浏览器的源码分析(31)
上一次说到通过管道把接收到的HTTP数据通知另一个线程处理,它不是直接发送数据过去,而是把数据在共享内存里的句柄发送过去,达到高效通讯的目的。下面就来分析资源处理进程里,接收到这个消息之后,做些什么处理。这个消息的处理代码如下: #001 void ResourceDispatcher::OnReceivedData(int request_id,#002原创 2008-11-09 23:30:00 · 6294 阅读 · 7 评论 -
谷歌浏览器的源码分析(32)
上一次说到在类ResourceDispatcher会收到接收HTTP数据消息,并进一步处理数据。那么ResourceDispatcher类又把接收到的数据发往何处呢?这是需要我们去搞懂它的。通过进一步的跟踪,会发现在ResourceDispatcher::OnReceivedData函数调用WebCore::ResourceHandleInternal类来处理,也就是把接收到的数据抛给Web原创 2008-11-13 22:35:00 · 5236 阅读 · 3 评论 -
谷歌浏览器的源码分析(33)
上一次说到图像缓存起来,其实很多情况下是文本的显示,也就是HTML的解释。要把网页显示出来,肯定是先从HTTP里收到网页数据,然后再使用HTML分析器来解释HTML语言,最后根据HTML来生成所有可以显示的元素,再由于这些元素生成BMP位图,这样只需要把BMP位置显示到窗口里就万事大吉了。这个过程看起来简单,其实是一个非常复杂的过程,现在就带你去深入地分析这个过程,就基本把Webkit的过程搞清楚原创 2008-11-16 16:21:00 · 5815 阅读 · 1 评论 -
谷歌浏览器的源码分析(34)
通过上一次的分析,我们看到所有网页数据经过HTML分析器之后,都会变成一个一个RenderObject对象,那么这些RenderObject对象又是怎么样显示到界面上面的呢?现在就带着这个疑问来分析下面的代码,这样肯定会找到解决方法的。怎么样找到入口呢?其实可以先从界面显示的类开始,可以看到显示界面的窗口类名称叫做Chrome_RenderWidgetHostHWND,有了这个类名称,就可以到代码原创 2008-11-18 22:54:00 · 19864 阅读 · 18 评论 -
从抢票软件到浏览器设计
自从12306网站上售票之后,彻夜排队的囧态被刷系统的焦虑所取代,而互联网公司则顺势推出了不同版本的“抢票插件”。将插件镶嵌在浏览器上,自春运以来,金山、360们运作得风生水起。看似为用户带来方便、操作简单的一款小小插件,背后却隐藏着一场关于浏览器的争夺战,一场收获真金白银利益之争。 首先来看看抢票软件是怎么样工作的。其实抢票软件很简单,最简单的情况就跟你登录网上邮箱一样,让浏览器帮你记住登录用户原创 2013-01-26 20:08:26 · 4828 阅读 · 1 评论 -
谷歌浏览器的源码分析(21)
上一次说到类RenderThread和类RenderView把消息处理,那么这两个类是怎么样处理消息的呢?又是怎么样处理浏览的消息呢?现在就带着这两个问题去分析它的源码,理解它处理消息的方法。类RenderThread处理消息的代码如下:#001 void RenderThread::OnMessageReceived(const IPC::Message& msg) {#002原创 2008-10-05 11:55:00 · 7280 阅读 · 3 评论 -
谷歌浏览器的源码分析(16)
上一次说到需要调用这个OpenURLFromTab函数,那么这个函数是做什么的呢?从名称上可能猜到它是打开网页,但是是从目前TAB页里打开呢?还是新建一个?或者使用每个TAB页一个进程呢?这些疑惑,只能通过代码的分析来理解它的实现,代码如下: 这个函数的参数意思:source是TAB内容。url是网络连接地址。disposition是窗口打开的位置。transitio原创 2008-09-30 23:55:00 · 7235 阅读 · 1 评论 -
谷歌浏览器的源码分析(4)
关于对话框,主要实现了让用户查看当前软件的版本、软件信息和检查升级的功能。因此这个类主要继续ChromeViews::View类、ChromeViews::DialogDelegate和GoogleUpdateStatusListener。其中ChromeViews::View实现窗口的布局和显示问题,ChromeViews::DialogDelegate实现了事件响应,或者窗口某时是否可以显示按原创 2008-09-12 14:29:00 · 22620 阅读 · 15 评论 -
谷歌浏览器的源码分析(6)
前面已经介绍了这么引人的输入自动完成功能,并且可以在输入超级连接框里直接通过GOOGLE搜索所有的内容,这是比较大的创新,不但可以节省界面的占用面积,还很方便大家查询的需要,比如记不住的连接,根本不需要去记了,只要你记住需要的内容就行了。这样既不需要到什么门户网站去找连接,也不需要去记住众多的网站,这个功能是非常方便的。<span style="font-family:新宋体;mso-fa原创 2008-09-14 23:33:00 · 16799 阅读 · 9 评论 -
谷歌浏览器的源码分析(3)
前面修改了chrome关于对话框,并且编译显示出来了,那么它是在那里调用显示的呢?现在就带你去了解它。由于它是界面显示,那么不用想,直接到界面的工程里查找它,也就是到目录src/chrome/browser/views里查看到文件about_chrome_view.cc。 这个文件里声明了一个类AboutChromeView,它就是主要负责初始化对话框、布局、显示字符串等等,比如显示“关于可乐原创 2008-09-10 22:23:00 · 36937 阅读 · 11 评论 -
谷歌浏览器的源码分析(5)
当用户打开浏览器之后,最希望输入的地方,是浏览器的连接框。目前谷歌浏览器把输入连接框与搜索引擎输入合并到一起,可以说完美的组合,让界面更加简洁,方便实用,并且它自动完成的功能更加强劲,如下图所示: 上面输入了www.c时,它就会自动地在后面添加智能选择的连接,并且可以GOOGLE里搜索输入的内容,又如下面: 上原创 2008-09-12 23:32:00 · 15969 阅读 · 8 评论 -
谷歌浏览器的源码分析(7)
当我们键入字母或者文字开始时,那么类AutocompleteEdit就会从窗口消息里获取到相应的字母或者文字,然后根据输入的信息到本地或者网络上保存的信息库里查找相应的输入提示,这就是自动完成的实现。下面就来先分析输入的函数:#001 void AutocompleteEdit::OnChar(TCHAR ch, UINT repeat_count, UINT flags) {#0原创 2008-09-16 23:00:00 · 12840 阅读 · 8 评论 -
谷歌浏览器的源码分析(9)
为了处理字符消息实现自动完成的功能,这是怎么样实现的呢?其实是先记录字符消息响应前的字符串以及选中状态,接着再处理消息,最后才查询可能的输入,做出智能提示。#001 void AutocompleteEdit::OnBeforePossibleChange() {#002 // Record our state. 记录当前已经输入的字符串。#003 text原创 2008-09-18 22:13:00 · 11879 阅读 · 3 评论 -
谷歌浏览器的源码分析(8)
上一次说到处理WM_CHAR消息,当用户每键入一个字符时,万能连接框就会去进行一次查找的过程,然后把智能提示信息显示出来。说到AutocompleteEdit::HandleKeystroke函数的操作,那么它为什么需要冻结这个函数的使用呢?现在就来分析这部份的内容。如下:ScopedFreeze freeze(this, GetTextObjectModel());在这行代码里,首原创 2008-09-17 23:14:00 · 11560 阅读 · 6 评论 -
谷歌浏览器的源码分析(10)
上一次已经分析到输入字符后,就需要把这些关键字去查找历史的连接,或者相关的内容,那么可多米的浏览器又是从那里去找到这些数据呢?现在就来分析这方面相关的内容。它主要通下面的函数来实现:<span lang="EN-US" style="font-family:新宋体;mso-fareast-language:ZH-CN">#001 voidAutocompleteEdit::Upd原创 2008-09-19 22:00:00 · 9011 阅读 · 0 评论 -
谷歌浏览器的源码分析(13)
上一次说到调用函数OpenURL来打开网络连接,这仅是网络浏览的开始,现在再来分析它怎么样去下载网页数据,然后再显示出来。#001 void AutocompleteEdit::OpenURL(const std::wstring& url,#002 WindowOpenDisposition disposition,原创 2008-09-24 21:29:00 · 8490 阅读 · 2 评论 -
谷歌浏览器的源码分析(11)
上一次介绍到怎么样从其它地方返回搜索到的超级连接,现在就来分析一下使用搜索引擎去查找的类<b style="mso-bidi-font-weight:normal">SearchProvider,它是通过搜索引擎来查找出来的,在这里是通过GOOGLE搜索引擎来查找出来。它的声明如下:<span lang="EN-US" style="font-family:新宋体;mso-fareas原创 2008-09-22 00:05:00 · 9086 阅读 · 4 评论 -
谷歌浏览器的源码分析(12)
当我们根据自动提示,或者完全自己输入连接后,再按下回车键,这时浏览器就会去打开网页,或者去查找内容。那么浏览器是怎么样实现这些功能的呢?又是怎么判断去打开网页,还是去打开GOOGLE的搜索引擎的呢?下面就来分析这部份的代码,如下:<span lang="EN-US" style="font-family:新宋体;mso-fareast-language:ZH-CN">#001 boo原创 2008-09-23 00:22:00 · 10076 阅读 · 11 评论 -
谷歌浏览器的源码分析(14)
上一次说到控制类的派生类LocationBarView,现在就来分析这个函数的功能,看看它又把URL连接传到那里去,立即就去看代码,在这行代码controller_->OnAutocompleteAccept里,可以看到调用函数OnAutocompleteAccept,它的代码如下:#001 void LocationBarView::OnAutocompleteAccept(#0原创 2008-09-26 22:09:00 · 8483 阅读 · 4 评论 -
谷歌浏览器的源码分析(26)
消息的流通过程,是一个不同类相互交流的过程,如果不了解这个过程,根本就不知道这些类是怎么样相互协作的。由于上一次说到ViewHostMsg_RequestResource消息已经发送出来,它的处理过徎其实就是一般资源的消息处理过程,下面就来看看这个消息的处理过程,如下:1. base::MessagePumpWin::Run函数消息2. base::Messa原创 2008-10-14 20:56:00 · 11506 阅读 · 5 评论 -
谷歌浏览器的源码分析(17)
当输入的网页连接传送给LoadURL函数之后,还需要处理很多内容,其实这是由类NavigationController来管理的,NavigationController类主要就是管理加载网页、退回、前进等等控制。#001 void NavigationController::LoadURL(const GURL& url,#002原创 2008-10-01 09:46:00 · 7726 阅读 · 1 评论 -
谷歌浏览器的源码分析(1)
随着网络技术的发展,越来越多应用都已经离不开网络,特别像人类大脑一样的知识库的搜索引擎,更加是离不开功能强大的云计算。不过,即便云计算非常强大,但它还不能直接地把结果呈现给用户,这样就需要一个客户端来呈现出来,这个客户端就是浏览器。现在越来越多人上网,他们每一次上网,都离不开浏览的使用,这已经是一个不可缺少的软件了。这里介绍和分析谷歌推出有创新的浏览器,它的速度比其它浏览器快很多,那么它是怎么实现原创 2008-09-07 10:28:00 · 59499 阅读 · 60 评论