****************************************************(本文从网上整理得到,源地址)谷歌浏览器的源码分析(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,它就是主要负责初始化对话框、布局、显示字符串等等,比如显示“关于可乐米”的字符串,就是这样实现的,先调用函数:#001std::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_ptrChromeViews::Throbberthrobber_;ChromeViews::ImageViewsuccess_indicator_;ChromeViews::ImageViewupdate_available_indicator_;ChromeViews::ImageViewtimeout_indicator_;ChromeViews::Labelupdate_label_;//KeepstrackofthevisiblestateoftheCheckForUpdatesbutton.CheckButtonStatuscheck_button_status_;//TheclassthatcommunicateswithGoogleUpdatetofindoutifanupdateis//availableandasksittostartanupgrade.GoogleUpdate*google_updater_;//Ourcur