谷歌chrome浏览器的源码分析(一)

来源:互联网 发布:核酸数据库 编辑:程序博客网 时间:2024/05/18 01:29
随着网络技术的发展,越来越多应用都已经离不开网络,特别像人类大脑一样的知识库的搜索引擎,更加是离不开功能强大的云计算。不过,即便云计算非常强大,但它还不能直接地把结果呈现给用户,这样就需要一个客户端来呈现出来,这个客户端就是浏览器。现在越来越多人上网,他们每一次上网,都离不开浏览的使用,这已经是一个不可缺少的软件了。这里介绍和分析谷歌推出有创新的浏览器,它的速度比其它浏览器快很多,那么它是怎么实现的呢?又采用了什么样的技术能达到这样呢?又比如它的标签页是每一个进程进行显示的,这到底又是怎么样实现的呢?下面来通过分析它的源码,一一地解开这种高新技术的使用,以及这种高效算法的奥秘。

谷歌浏览器的英语名称为Chrome,它的意义是铬。铬是一种有光泽的、蓝灰色的坚硬金属元素。不失光泽,抗腐蚀,最早在铬铁矿中发现。用作催化剂,可加强钢合金的强度和生产不锈钢,可以做防腐镀层和玻璃制品中的颜料。原子序数24;原子量51.996;比重7.18;化合价2,3,6。谷歌起这个名称,可能是想让这个浏览器永远不失去光泽,永远那么吸引人。铬是无毒,化学性质很稳定,有延展性,含杂质时硬而脆。熔点1857C,沸点2672C,密度单晶为7.22克/厘米3,多晶为7.14克/厘米3;铬,原子序数24,原子量51.9961。铬的名称来自希腊文Chroma,意为颜色。因为这种元素以多种不同颜色的化合物存在,故被称为“多彩的元素”。可用于制不锈钢,汽车零件,工具,磁带和录像带等。铬镀在金属上可以防锈,也叫可多米,坚固美观。红、绿宝石的色彩也来自于铬。作为现代科技中最重要的金属,以不同百分比熔合的铬镍钢千变万化,种类繁多,令人难以置信。

 

谷歌的开发人员称,虽然网络的发展日新月异,但作为网络平台的浏览器,却没有跟上网络发展的步伐。谷歌倾心打造的免费浏览器就是希望能跟随着网络的发展而不断升级换代,完美的切合网络时代的潮流。

 

据了解,谷歌员工每天使用的最多的应用程序就是浏览器,通过浏览器,查看新闻资讯,观看视频聊天,玩网络游戏。谷歌的员工说,如果能够开发出一种全新的浏览器,才能够满足人们使用应用程序和网站管理员的要求。谷歌希望能够提供一种速度更快,稳定性更高,安全性更强的浏览器。因此Google Chrome诞生了!

 

为了学习这个浏览器,需要通过网络把这份达到1G以上的代码下载下来,需要的时间就需要好几个小时,然后再把硬盘空间清空为10G左右大小,最后配置好VC 2005,就可以编译这个“可多米”了。在我的电脑上编译,共需要两个小时左右,才完全编译完成,最后生成下面的可多米,如下图:


 

缺省编译出来的可多米是英语版本的,从关于对话框里就可以看到。下面是编译出来的目录图片,如下:


 

 

上面是调试版本的输出文件,所以程序大小都比较大,没有经过优化的处理。整个程序的大小,需要编译137个工程,共1G多的源码大小,这是一个非常旁大的一个工程。






这么大的工程,我从哪里开始呢?我认为从界面开始,这样才可以快速地深入研究。下面就可以先尝试修改一个chrome的关于对话框,上一次看到它是英语的,那么我就来把它改成中文的吧,这样有目标了。从chrome的工程里可以看到它是支持多种语言的,在Windows平台上支持多语言的标准做法,就是写多个语言的DLL。因此,chrome也不例外,从app工程集里,就可以看到如下图所示:

 


上面显示了多种语言的动态连接库资源,其中zh-CN是简体中文的。

 

接着打开资源文件的字符串编辑,如下图:

 


把上面的字符串修改为 “关于 可多米”,然后把这个工程重新编译一下,就会生成下面的文件:

 


然后运行自己编译的可多米,就会显示出修改的成果,如下图:

 


可以看到关于对话框的标题,就变成我上面修改的了。这样学习它的修改,就是几分钟的事情,哈哈......

这样就学习了可多米开发汉化的工作,这是本地化的重要做的一件事情,也学习到怎么样支持多语言的实现方式。那么它的关于对话框是从那里显示出来的呢?怎么样把字符串更新到上面的呢?下一次再告诉你。




前面修改了chrome关于对话框,并且编译显示出来了,那么它是在那里调用显示的呢?现在就带你去了解它。由于它是界面显示,那么不用想,直接到界面的工程里查找它,也就是到目录src/chrome/browser/views里查看到文件about_chrome_view.cc。

 

这个文件里声明了一个类AboutChromeView,它就是主要负责初始化对话框、布局、显示字符串等等,比如显示“关于可乐米”的字符串,就是这样实现的,先调用函数:

#001  std::wstring AboutChromeView::GetWindowTitle() const {

  return l10n_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类来管理的。

 

通过上面的分析,了解了关于对话框的标题显示过程,你想修改成什么样的内容,就要看你的需要了。下一次再仔细地分析有关于对话框怎么样组织其它信息,比如重要的升级功能。





关于对话框,主要实现了让用户查看当前软件的版本、软件信息和检查升级的功能。因此这个类主要继续ChromeViews::View类、ChromeViews::DialogDelegateGoogleUpdateStatusListener。其中ChromeViews::View实现窗口的布局和显示问题,ChromeViews::DialogDelegate实现了事件响应,或者窗口某时是否可以显示按钮的问题,GoogleUpdateStatusListener是用来实现接收更新程序状态信息。

 

这个类的声明如下:

class AboutChromeView : public ChromeViews::View,

                        public ChromeViews::DialogDelegate,

                        public GoogleUpdateStatusListener {

 public:

  explicit AboutChromeView(Profile* profile);

  virtual ~AboutChromeView();

 

  // Initialize the controls on the dialog.

  void Init();

 

  // Overridden from ChromeViews::View:

  virtual void GetPreferredSize(CSize *out);

  virtual void Layout();

  virtual void ViewHierarchyChanged(bool is_add,

                                    ChromeViews::View* parent,

                                    ChromeViews::View* child);

 

  // Overridden from ChromeViews::DialogDelegate:

  virtual int GetDialogButtons() const;

  virtual std::wstring GetDialogButtonLabel(DialogButton button) const;

  virtual bool IsDialogButtonEnabled(DialogButton button) const;

  virtual bool IsDialogButtonVisible(DialogButton button) const;

  virtual bool CanResize() const;

  virtual bool CanMaximize() const;

  virtual bool IsAlwaysOnTop() const;

  virtual bool HasAlwaysOnTopMenu() const;

  virtual bool IsModal() const;

  virtual std::wstring GetWindowTitle() const;

  virtual bool Accept();

  virtual ChromeViews::View* GetContentsView();

 

  // Overridden from GoogleUpdateStatusListener:

  virtual void OnReportResults(GoogleUpdateUpgradeResult result,

                               GoogleUpdateErrorCode error_code,

                               const std::wstring& version);

 

 private:

  // The visible state of the Check For Updates button.

  enum CheckButtonStatus {

    CHECKBUTTON_HIDDEN = 0,

    CHECKBUTTON_DISABLED,

    CHECKBUTTON_ENABLED,

  };

 

  // Update the UI to show the status of the upgrade.

  void UpdateStatus(GoogleUpdateUpgradeResult result,

                    GoogleUpdateErrorCode error_code);

 

  Profile* profile_;

 

  // UI elements on the dialog.

  ChromeViews::ImageView* about_dlg_background_;

  ChromeViews::Label* about_title_label_;

  ChromeViews::TextField* version_label_;

  ChromeViews::TextField* main_text_label_;

  // UI elements we add to the parent view.

  scoped_ptr<ChromeViews::Throbber> throbber_;

  ChromeViews::ImageView success_indicator_;

  ChromeViews::ImageView update_available_indicator_;

  ChromeViews::ImageView timeout_indicator_;

  ChromeViews::Label update_label_;

 

  // Keeps track of the visible state of the Check For Updates button.

  CheckButtonStatus check_button_status_;

 

  // The class that communicates with Google Update to find out if an update is

  // available and asks it to start an upgrade.

  GoogleUpdate* google_updater_;

 

  // Our current version.

  std::wstring current_version_;

 

  // The version Google Update reports is available to us.

  std::wstring new_version_available_;

 

  DISALLOW_EVIL_CONSTRUCTORS(AboutChromeView);

};

 

通过关于对话框的分析,可以理解到chrome浏览器窗口基本组成,以及窗口继承关系,还有事件的响应方式。前面三次分析,主要是入门的分析,也是了解这么一个大工程的一种手段。比如测试整个工程是否可以编译,是否可以修改代码等等。后面的分析会以浏览器输入HTTP连接开始,直到打开网页显示为一个主线,做一个基本的分析。






当用户打开浏览器之后,最希望输入的地方,是浏览器的连接框。目前谷歌浏览器把输入连接框与搜索引擎输入合并到一起,可以说完美的组合,让界面更加简洁,方便实用,并且它自动完成的功能更加强劲,如下图所示:

 

 

 

 

面输入了www.c时,它就会自动地在后面添加智能选择的连接,并且可以GOOGLE里搜索输入的内容,又如下面:

 

 

 

 

 

 

上面在输入框里输入我的名字,就会自动弹出查找的内容,或者可能搜索的连接。这些功能都比较完美的实现,这可以说是史无前例的输入创新,真正人性化的体现,那么它又是怎么样实现的呢?其主要功能是在文件src/chrome/browser/autocomplete/autocomplete_edit.cc里实现,具体的实现方式内容等下一次再去分析。



from: http://blog.csdn.net/caimouse/article/details/2919897

0 0
原创粉丝点击