现在的位置: 首页 > 综合 > 正文

[Chrome源码阅读] Browser相关的类

2013年01月09日 ⁄ 综合 ⁄ 共 1808字 ⁄ 字号 评论关闭

1. TabStripModel

在正式解释Brower类之前,来简要概述下TabStripModel与Browser的关系:

Browser类相当于一个controller,而TabStripModel相当于一个model。Browser聚合model(在类初始化时就实例化一个model)。Browser反过来又是TabStripModel的delegate,帮忙做一些TabStripModel不能做的事情,譬如UI方面的事情。另外Browser又是TabStripModel的一个观察者。
//  A TabStripModel has one delegate that it relies on to perform certain tasks
//  like creating new TabStripModels (probably hosted in Browser windows) when
//  required. See TabStripDelegate above for more information.
这里提到Browser作为TabStripModel的Delegate,是想让Browser创建一个全新的TabStripModel,这种情况发生在shuffling tab时发生的。

//  A TabStripModel also has N observers (see TabStripModelObserver above),
//  which can be registered via Add/RemoveObserver. An Observer is notified of
//  tab creations, removals, moves, and other interesting events. The
//  TabStrip implements this interface to know when to create new tabs in
//  the View, and the Browser object likewise implements to be able to update
//  its bookkeeping when such events happen.
关于TabStripModel的观察者,这里也提到了,主要是对Add/Remove/Move Tabs会触发观察者做一些后续的事情,譬如TabStrip会做一些UI/View之类的事情。
TabStripModel维护着一个包含TabContent的列表。

2. Browser

我们从UI角度解释Browser与UI类的相互关系。

我们知道BrowserInit类将会实例化一个Browser对象,这个对象此时并没有被任何对象所拥有,直到后面创建Browser相关的UI对象。

请看下面:


当实例化Browser时,Chrome会紧接着实例化一个BrowserView,作为BrowserWindow传给Browser::browser_成员,在实例化BrowserView时,是将Browser自己作为参数传入进去的,也就是说BrowserView必须要有一个Browser来进行初始化,维护着它的生命周期(用scopred_ptr来管理)。通过这样的过程,Browser/BrowserView就建立了紧密的关系。

BrowserView类是一个非常重要的类,代表着Chrome主窗口中的Non-Client的窗口,比如TabStrip,Toolbar,BookMarkbar等,请看下图:

所以BrowserView将会负责产生并布局TabStrip/Toolbar/BookMarkBar/TabContent/DownloadShelf的UI.

实例化BrowserView时,就会实例化BrowserFrame,并把自己传入进去,让BrowseFrame来帮忙来管理自己的生命周期。

BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) {
  BrowserView* browser_view = new BrowserView(browser);
  (new BrowserFrame(browser_view))->Init();
  return browser_view;
}

Browser->window_->Show()函数将会转调用Frame->Show()从而达到整个Frame window的显示。


抱歉!评论已关闭.