HooHle_chrome_源代码_分析.docx
- 文档编号:30806603
- 上传时间:2024-01-30
- 格式:DOCX
- 页数:97
- 大小:1.02MB
HooHle_chrome_源代码_分析.docx
《HooHle_chrome_源代码_分析.docx》由会员分享,可在线阅读,更多相关《HooHle_chrome_源代码_分析.docx(97页珍藏版)》请在冰豆网上搜索。
****************************************************
(本文从网上整理得到,源地址
谷歌浏览器的源码分析
(1) 收藏
随着网络技术的发展,越来越多应用都已经离不开网络,特别像人类大脑一样的知识库的搜索引擎,更加是离不开功能强大的云计算。
不过,即便云计算非常强大,但它还不能直接地把结果呈现给用户,这样就需要一个客户端来呈现出来,这个客户端就是浏览器。
现在越来越多人上网,他们每一次上网,都离不开浏览的使用,这已经是一个不可缺少的软件了。
这里介绍和分析谷歌推出有创新的浏览器,它的速度比其它浏览器快很多,那么它是怎么实现的呢?
又采用了什么样的技术能达到这样呢?
又比如它的标签页是每一个进程进行显示的,这到底又是怎么样实现的呢?
下面来通过分析它的源码,一一地解开这种高新技术的使用,以及这种高效算法的奥秘。
谷歌浏览器的英语名称为Chrome,它的意义是铬。
铬是一种有光泽的、蓝灰色的坚硬金属元素。
不失光泽,抗腐蚀,最早在铬铁矿中发现。
用作催化剂,可加强钢合金的强度和生产不锈钢,可以做防腐镀层和玻璃制品中的颜料。
原子序数24;原子量51.996;比重7.18;化合价2,3,6。
谷歌起这个名称,可能是想让这个浏览器永远不失去光泽,永远那么吸引人。
铬是无毒,化学性质很稳定,有延展性,含杂质时硬而脆。
熔点1857C,沸点2672C,密度单晶为7.22克/厘米3,多晶为7.14克/厘米3;铬,原子序数24,原子量51.9961。
铬的名称来自希腊文Chroma,意为颜色。
因为这种元素以多种不同颜色的化合物存在,故被称为“多彩的元素”。
可用于制不锈钢,汽车零件,工具,磁带和录像带等。
铬镀在金属上可以防锈,也叫可多米,坚固美观。
红、绿宝石的色彩也来自于铬。
作为现代科技中最重要的金属,以不同百分比熔合的铬镍钢千变万化,种类繁多,令人难以置信。
谷歌的开发人员称,虽然网络的发展日新月异,但作为网络平台的浏览器,却没有跟上网络发展的步伐。
谷歌倾心打造的免费浏览器就是希望能跟随着网络的发展而不断升级换代,完美的切合网络时代的潮流。
据了解,谷歌员工每天使用的最多的应用程序就是浏览器,通过浏览器,查看新闻资讯,观看视频聊天,玩网络游戏。
谷歌的员工说,如果能够开发出一种全新的浏览器,才能够满足人们使用应用程序和网站管理员的要求。
谷歌希望能够提供一种速度更快,稳定性更高,安全性更强的浏览器。
因此GoogleChrome诞生了!
为了学习这个浏览器,需要通过网络把这份达到1G以上的代码下载下来,需要的时间就需要好几个小时,然后再把硬盘空间清空为10G左右大小,最后配置好VC2005,就可以编译这个“可多米”了。
在我的电脑上编译,共需要两个小时左右,才完全编译完成,最后生成下面的可多米,如下图:
缺省编译出来的可多米是英语版本的,从关于对话框里就可以看到。
下面是编译出来的目录图片,如下:
上面是调试版本的输出文件,所以程序大小都比较大,没有经过优化的处理。
整个程序的大小,需要编译137个工程,共1G多的源码大小,这是一个非常旁大的一个工程。
谷歌浏览器的源码分析
(2) 收藏
这么大的工程,我从哪里开始呢?
我认为从界面开始,这样才可以快速地深入研究。
下面就可以先尝试修改一个chrome的关于对话框,上一次看到它是英语的,那么我就来把它改成中文的吧,这样有目标了。
从chrome的工程里可以看到它是支持多种语言的,在Windows平台上支持多语言的标准做法,就是写多个语言的DLL。
因此,chrome也不例外,从app工程集里,就可以看到如下图所示:
上面显示了多种语言的动态连接库资源,其中zh-CN是简体中文的。
接着打开资源文件的字符串编辑,如下图:
把上面的字符串修改为“关于可多米”,然后把这个工程重新编译一下,就会生成下面的文件:
然后运行自己编译的可多米,就会显示出修改的成果,如下图:
可以看到关于对话框的标题,就变成我上面修改的了。
这样学习它的修改,就是几分钟的事情,哈哈......
这样就学习了可多米开发汉化的工作,这是本地化的重要做的一件事情,也学习到怎么样支持多语言的实现方式。
那么它的关于对话框是从那里显示出来的呢?
怎么样把字符串更新到上面的呢?
下一次再告诉你。
谷歌浏览器的源码分析(3) 收藏
前面修改了chrome关于对话框,并且编译显示出来了,那么它是在那里调用显示的呢?
现在就带你去了解它。
由于它是界面显示,那么不用想,直接到界面的工程里查找它,也就是到目录src\chrome\browser\views里查看到文件about_chrome_view.cc。
这个文件里声明了一个类AboutChromeView,它就是主要负责初始化对话框、布局、显示字符串等等,比如显示“关于可乐米”的字符串,就是这样实现的,先调用函数:
#001 std:
:
wstringAboutChromeView:
:
GetWindowTitle()const{
returnl10n_util:
:
GetString(IDS_ABOUT_CHROME_TITLE);
}
获取资源里的对话框标题,接着:
在上面的断点里就是响应菜单,然后创建关于对话框,主要调用函数CreateChromeWindow来创建窗口,把AboutChromeView窗口绑定到这个窗口类型里。
由于可多米都是统一的窗口样式,那么它是通过创建一样的窗口类CustomFrameWindow来实现的。
为了显示窗口的标题,是通过下面的函数关系调用:
1. Browser:
:
ExecuteCommand 浏览器执行菜单命令。
2. ChromeViews:
:
Window:
:
CreateChromeWindow 创建窗口。
3. ChromeViews:
:
CustomFrameWindow:
:
Init 初始化窗口。
4. ChromeViews:
:
Window:
:
Init 初始化窗口标题。
5. AboutChromeView:
:
GetWindowTitle 从关于对话框获取标题。
理解上面的函数关系调用就知道怎么样显示标题了,因此也知道关于对话框所有内容是由类AboutChromeView来管理的,但窗口的样式是由CustomFrameWindow类来管理的。
通过上面的分析,了解了关于对话框的标题显示过程,你想修改成什么样的内容,就要看你的需要了。
下一次再仔细地分析有关于对话框怎么样组织其它信息,比如重要的升级功能。
谷歌浏览器的源码分析(4) 收藏
关于对话框,主要实现了让用户查看当前软件的版本、软件信息和检查升级的功能。
因此这个类主要继续ChromeViews:
:
View类、ChromeViews:
:
DialogDelegate和GoogleUpdateStatusListener。
其中ChromeViews:
:
View实现窗口的布局和显示问题,ChromeViews:
:
DialogDelegate实现了事件响应,或者窗口某时是否可以显示按钮的问题,GoogleUpdateStatusListener是用来实现接收更新程序状态信息。
这个类的声明如下:
classAboutChromeView:
publicChromeViews:
:
View,
publicChromeViews:
:
DialogDelegate,
publicGoogleUpdateStatusListener{
public:
explicitAboutChromeView(Profile*profile);
virtual~AboutChromeView();
//Initializethecontrolsonthedialog.
voidInit();
//OverriddenfromChromeViews:
:
View:
virtualvoidGetPreferredSize(CSize*out);
virtualvoidLayout();
virtualvoidViewHierarchyChanged(boolis_add,
ChromeViews:
:
View*parent,
ChromeViews:
:
View*child);
//OverriddenfromChromeViews:
:
DialogDelegate:
virtualintGetDialogButtons()const;
virtualstd:
:
wstringGetDialogButtonLabel(DialogButtonbutton)const;
virtualboolIsDialogButtonEnabled(DialogButtonbutton)const;
virtualboolIsDialogButtonVisible(DialogButtonbutton)const;
virtualboolCanResize()const;
virtualboolCanMaximize()const;
virtualboolIsAlwaysOnTop()const;
virtualboolHasAlwaysOnTopMenu()const;
virtualboolIsModal()const;
virtualstd:
:
wstringGetWindowTitle()const;
virtualboolAccept();
virtualChromeViews:
:
View*GetContentsView();
//OverriddenfromGoogleUpdateStatusListener:
virtualvoidOnReportResults(GoogleUpdateUpgradeResultresult,
GoogleUpdateErrorCodeerror_code,
conststd:
:
wstring&version);
private:
//ThevisiblestateoftheCheckForUpdatesbutton.
enumCheckButtonStatus{
CHECKBUTTON_HIDDEN=0,
CHECKBUTTON_DISABLED,
CHECKBUTTON_ENABLED,
};
//UpdatetheUItoshowthestatusoftheupgrade.
voidUpdateStatus(GoogleUpdateUpgradeResultresult,
GoogleUpdateErrorCodeerror_code);
Profile*profile_;
//UIelementsonthedialog.
ChromeViews:
:
ImageView*about_dlg_background_;
ChromeViews:
:
Label*about_title_label_;
ChromeViews:
:
TextField*version_label_;
ChromeViews:
:
TextField*main_text_label_;
//UIelementsweaddtotheparentview.
scoped_ptr : Throbber>throbber_; ChromeViews: : ImageViewsuccess_indicator_; ChromeViews: : ImageViewupdate_available_indicator_; ChromeViews: : ImageViewtimeout_indicator_; ChromeViews: : Labelupdate_label_; //KeepstrackofthevisiblestateoftheCheckForUpdatesbutton. CheckButtonStatuscheck_button_status_; //TheclassthatcommunicateswithGoogleUpdatetofindoutifanupdateis //availableandasksittostartanupgrade. GoogleUpdate*google_updater_; //Ourcurrentversion. std: : wstringcurrent_version_; //TheversionGoogleUpdatereportsisavailabletous. std: : wstringnew_version_available_; DISALLOW_EVIL_CONSTRUCTORS(AboutChromeView); }; 通过关于对话框的分析,可以理解到chrome浏览器窗口基本组成,以及窗口继承关系,还有事件的响应方式。 前面三次分析,主要是入门的分析,也是了解这么一个大工程的一种手段。 比如测试整个工程是否可以编译,是否可以修改代码等等。 后面的分析会以浏览器输入HTTP连接开始,直到打开网页显示为一个主线,做一个基本的分析。 谷歌浏览器的源码分析(5) 收藏 当用户打开浏览器之后,最希望输入的地方,是浏览器的连接框。 目前谷歌浏览器把输入连接框与搜索引擎输入合并到一起,可以说完美的组合,让界面更加简洁,方便实用,并且它自动完成的功能更加强劲,如下图所示: 上面输入了www.c时,它就会自动地在后面添加智能选择的连接,并且可以GOOGLE里搜索输入的内容,又如下面: 上面在输入框里输入我的名字,就会自动弹出查找的内容,或者可能搜索的连接。 这些功能都比较完美的实现,这可以说是史无前例的输入创新,真正人性化的体现,那么它又是怎么样实现的呢? 其主要功能是在文件src\chrome\browser\autocomplete\autocomplete_edit.cc里实现,具体的实现方式内容等下一次再去分析。 谷歌浏览器的源码分析(6) 收藏 前面已经介绍了这么引人的输入自动完成功能,并且可以在输入超级连接框里直接通过GOOGLE搜索所有的内容,这是比较大的创新,不但可以节省界面的占用面积,还很方便大家查询的需要,比如记不住的连接,根本不需要去记了,只要你记住需要的内容就行了。 这样既不需要到什么门户网站去找连接,也不需要去记住众多的网站,这个功能是非常方便的。 这个输入框的自动完成的功能,是比较智能化的。 因为它会根据以往的输入自动完成,或者智能提示所需要的连接或者内容。 下面就来先看这个类的定义: #001 //Providestheimplementationofaneditcontrolwithadrop-down #002 //autocompletebox.Theboxitselfisimplementedinautocomplete_popup.cc #003 //Thisfileimplementstheeditboxandmanagementforthepopup. #004 // #005 //ThisimplementationiscurrentlyappropriatefortheURLbar,wherethe #006 //autocompletedropdownisalwaysdisplayedbecausethereisalwaysa #007 //defaultitem.Forwebpageautofillandotherapplications,thisis #008 //probablynotappropriate.Wemaywanttoaddaflagtodeterminewhich #009 //ofthesemodeswe'rein. #010 classAutocompleteEdit #011 : publicCWindowImpl #012 CRichEditCtrl, #013 CWinTraits #014 ES_NOHIDESEL>>, #015 publicCRichEditCommands #016 publicMenu: : Delegate{ 类AutocompleteEdit继承了类CWindowImpl、类CRichEditCommands、类Menu: : Delegate。 其中类CWindowImpl实现了Windows窗口,它是WTL里的窗口模板类,主要用来创建窗口界面类,并且使用类CRichEditCtrl作为基类,类CRichEditCtrl主要调用Windows里的编辑类。 类CRichEditCommands实现RichEdit的命令功能。 Menu: : Delegate类是实现智能下拉式菜单的提示界面。 因此,要学习开发chrome,需要先学习WTL的开发,它是一套基于模板的窗口框架。 下一次再仔细地分析自动完成的实现过程。 谷歌浏览器的源码分析(7) 收藏 当我们键入字母或者文字开始时,那么类AutocompleteEdit就会从窗口消息里获取到相应的字母或者文字,然后根据输入的信息到本地或者网络上保存的信息库里查找相应的输入提示,这就是自动完成的实现。 下面就来先分析输入的函数: #001 voidAutocompleteEdit: : OnChar(TCHARch,UINTrepeat_count,UINTflags){ #002 //Don'tletalt-enterbeep. Notsurethisisnecessary,asthestandard #003 //alt-enterwillhitDiscardWMSysChar()andgetthrownaway,and #004 //ctrl-alt-enterdoesn'tseemtoreachhereforsomereason? Atleastnoton #005 //mysystem...still,thisisharmlessandmaybenecessaryinotherlocales. 下面把alt-enter组合键消息过滤掉。 #006 if(ch==VK_RETURN&&(flags&KF_ALTDOWN)) #007 return; #008 #009 //EscapeisprocessedinOnKeyDown. Don'tletanyWM_CHARmessagespropagate #010 //aswedon'twanttheRichEdittodoanythingfunky. 下面把ESC键的消息过滤掉。 #011 if(ch==VK_ESCAPE&&! (flags&KF_ALTDOWN)) #012 return; #013 下面把TAB键的消息过滤掉。 #014 if(ch==VK_TAB){ #015 //Don'taddtabstotheinput. #016 return; #017 } #018 这里处理其它有用的按键消息。 #019 HandleKeystroke(GetCurrentMessage()->message,ch,repeat_count,flags); #020 } AutocompleteEdit: : OnChar函数是WTL里的WM_CHAR消息处理,当用户键入字母时就会触发这个消息。 这个函数先跳过几个不要处理的消息,最后调用函数HandleKeystroke来处理,如下: #001 voidAutocompleteEdit: : HandleKeystroke(UINTmessage,TCHARkey, #002 UINTrepeat_count,UINTflags){ 冻结RichEdit的更新。 #003 ScopedFreezefreeze(this,GetTextObjectModel()); 处理消息变化前的动作。 #004 OnBeforePossibleChange(); 处理消息 #005 DefWindowProc(message,key,MAKELPARAM(repeat_count,flags)); 处理消息变化后的动作。 #006 OnAfterPossibleChange(); #007 } 在这里为什么要进行窗口的消息冻结呢? 又为什么需要进行消息处理和消息变化后处理呢? 谷歌浏览器的源码分析(8) 收藏 上一次说到处理WM_CHAR消息,当用户每键入一个字符时,万能连接框就会去进行一次查找的过程,然后把智能提示信息显示出来。 说到AutocompleteEdit: : HandleKeystroke函数的操作,那么它为什么需要冻结这个函数的使用呢? 现在就来分析这部份的内容。 如下: ScopedFreezefreeze(this,GetTextObjectMo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HooHle_chrome_ 源代码 分析