点击这里给我发消息 点击这里给我发消息

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

添加时间:2013-12-7
    相关阅读: 门户网站 门户网站 网页 软件 开发 模板 搜索引擎
副标题#e#
  前面修改了chrome关于对话框,并且编译显示出来了,那么它是在那里调用显示的呢?现在就带你去了解它。由于它是界面显示,那么不用想,直接到界面的工程里查找它,也就是到目录srcchromebrowserviews里查看到文件about_chrome_view.cc.
 
  这个文件里声明了一个类AboutChromeView,它就是主要负责初始化对话框、布局、显示字符串等等,比如显示“关于可乐米”的字符串,就是这样实现的,先调用函数:
 
 #001 std::wstring AboutChromeView::GetWindowTitle() const {
 return l10n_util::GetString(IDS_ABOUT_CHROME_TITLE);
}


  获取资源里的对话框标题,接着:
 谷歌浏览器的源码分析(2)

  在上面的断点里就是响应菜单,然后创建关于对话框,主要调用函数CreateChromeWindow来创建窗口,把AboutChromeView窗口绑定到这个窗口类型里。由于可多米都是统一的窗口样式,那么它是通过创建一样的窗口类CustomFrameWindow来实现的。
 
  为了显示窗口的标题,是通过下面的函数关系调用:
 
  1. Browser::ExecuteCommand 浏览器执行菜单命令。
 
  2. ChromeViews::Window::CreateChromeWindow 创建窗口。
 
  3. ChromeViews::CustomFrameWindow::Init 初始化窗口。
 
  4. ChromeViews::Window::Init 初始化窗口标题。
 
  5. AboutChromeView::GetWindowTitle 从关于对话框获取标题。
 
  理解上面的函数关系调用就知道怎么样显示标题了,因此也知道关于对话框所有内容是由类AboutChromeView来管理的,但窗口的样式是由CustomFrameWindow类来管理的。
 

#p#副标题#e#

  通过上面的分析,了解了关于对话框的标题显示过程,你想修改成什么样的内容,就要看你的需要了。下一次再仔细地分析有关于对话框怎么样组织其它信息,比如重要的升级功能。
 
  关于对话框,主要实现了让用户查看当前软件的版本、软件信息和检查升级的功能。因此这个类主要继续ChromeViews::View类、ChromeViews::DialogDelegate和GoogleUpdateStatusListener.其中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);
};

 

#p#副标题#e#

  通过关于对话框的分析,可以理解到chrome浏览器窗口基本组成,以及窗口继承关系,还有事件的响应方式。前面三次分析,主要是入门的分析,也是了解这么一个大工程的一种手段。比如测试整个工程是否可以编译,是否可以修改代码等等。后面的分析会以浏览器输入HTTP连接开始,直到打开网页显示为一个主线,做一个基本的分析。
 
  当用户打开浏览器之后,最希望输入的地方,是浏览器的连接框。目前谷歌浏览器把输入连接框与搜索引擎输入合并到一起,可以说完美的组合,让界面更加简洁,方便实用,并且它自动完成的功能更加强劲,如下图所示:

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

  上面输入了www.c时,它就会自动地在后面添加智能选择的连接,并且可以GOOGLE里搜索输入的内容,又如下面:
 谷歌浏览器的源码分析(2)

  上面在输入框里输入我的名字,就会自动弹出查找的内容,或者可能搜索的连接。这些功能都比较完美的实现,这可以说是史无前例的输入创新,真正人性化的体现,那么它又是怎么样实现的呢?其主要功能是在文件srcchromebrowserautocompleteautocomplete_edit.cc里实现,具体的实现方式内容等下一次再去分析。
 
  前面已经介绍了这么引人的输入自动完成功能,并且可以在输入超级连接框里直接通过GOOGLE搜索所有的内容,这是比较大的创新,不但可以节省界面的占用面积,还很方便大家查询的需要,比如记不住的连接,根本不需要去记了,只要你记住需要的内容就行了。这样既不需要到什么门户网站去找连接,也不需要去记住众多的网站,这个功能是非常方便的。
 

#p#副标题#e#

  这个输入框的自动完成的功能,是比较智能化的。因为它会根据以往的输入自动完成,或者智能提示所需要的连接或者内容。
 
  下面就来先看这个类的定义:

 #001 // Provides the implementation of an edit control with a drop-down
#002 // autocomplete box. The box itself is implemented in autocomplete_popup.cc
#003 // This file implements the edit box and management for the popup.
#004 //
#005 // This implementation is currently appropriate for the URL bar, where the
#006 // autocomplete dropdown is always displayed because there is always a
#007 // default item. For web page autofill and other applications, this is
#008 // probably not appropriate. We may want to add a flag to determine which
#009 // of these modes we're in.
#010 class AutocompleteEdit
#011   : public CWindowImpl<AutocompleteEdit,
#012              CRichEditCtrl,
#013              CWinTraits<WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL |
#014                   ES_NOHIDESEL> >,
#015    public CRichEditCommands<AutocompleteEdit>,
#016    public Menu::Delegate {

  类AutocompleteEdit继承了类CWindowImpl、类CRichEditCommands、类Menu::Delegate.其中类CWindowImpl实现了Windows窗口,它是WTL里的窗口模板类,主要用来创建窗口界面类,并且使用类CRichEditCtrl作为基类,类CRichEditCtrl主要调用Windows里的编辑类。类CRichEditCommands实现RichEdit的命令功能。Menu::Delegate类是实现智能下拉式菜单的提示界面。因此,要学习开发chrome,需要先学习WTL的开发,它是一套基于模板的窗口框架。下一次再仔细地分析自动完成的实现过程。

相关谷歌浏览器的源码分析(2)

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册