Gecko:Key Gecko Structures And Invariants翻译

来源:互联网 发布:佳能打印机扫描 mac 编辑:程序博客网 时间:2024/05/16 05:50

 

 

 

Gecko:Key Gecko Structures And Invariants

https://wiki.mozilla.org/Gecko:Key_Gecko_Structures_And_Invariants

 

对于一个页面有4个树

内容树:

代表的文件的DOM结构。它基本上是你期待的一个看起来像的XML文件的数据结构。这是一个对象树实施nsIContent接口。

 

帧树:

是文档的视图表示。每个帧可以被看作页面的一个矩形区域。XML元素的内容节点通常跟显示这个元素的一个或多个帧相关---如果元素是长方形就一个帧,如果元素更复杂就多个帧(就像一个右自动换行的粗体文本):

帧实现nsIFrame接口,帧可以在不同的连接列上有孩子,每一个被称为“孩子列”

nsIFrame::GetAdditonalChildListName可以遍历特定帧的孩子列通过孩子列名字,理论上一个给定的文档有多个帧树(理论上同一个DOM结构可以有不同的显示),现实中没有使用这个特性。

 

视图树

视图树是帧树的投影。帧是轻量级的,因为我们经常创建很多帧。有时我们需要重量级的来处理复杂的元素显示(比喻,一个原始有CSS3不透明属性设置,或者由CSS2布局定位),在这些或别的情况下,我们为帧附上视图。视图能被组成树在某种程度上对应于帧树。视图有另外的问题,如在文档排列成树(如文档包含子文档HTML FRAMEIFRAME元素)这文档的视图被排列成单个树,视图实现nsIView接口。

 

窗口部件树

是视图树的投影,一个视图需要平台相关的窗口部件(如win32 HWND)与特定的函数相关。大部分视图不会。窗口部件树必须对应于视图树,窗口部件实现nsIWidget接口

 

内容树的动态改变将导致其他树的层叠改变。因为我们需要有效的处理这些改变,代码是复杂的,很容易改变树的一直性。如果改变可能会崩溃。

 

下面是不变的:

http://lxr.mozilla.org/mozilla/source/content/base/public/nsIContent.h

通过操作nsIContent::GetParent(),nsIContent::GetChildCount/GetChildAt得到的真正的是一个一致树。

 

http://lxr.mozilla.org/mozilla/source/layout/generic/nsIFrame.h

通过操作nsIFrame::GetParent(),nsIFrame::GetFirstChild(), nsIFrame::GetNextSibling()得到的真正的是一个一致树。(不要忘记使用nsIFrame::GetAdditionalChildListName()来找所有的孩子在潜在的孩子列上)。nsIFrame::GetPrevInFlow/GetNextInFlow将得到一个一致的帧链(每一个以null结束)匹配一给定的nsIContent节点(就是说链中的每个帧有相同的nsIFrame::GetContent(),链中的每个帧是在相同的帧树中,如果同一树中的两帧返回相同的nsIFrame::GetContent(),那么他们就在相同的链中,【我认为这在嵌套块中例外,嵌套块的的第一部分的NextSibling()是子块,改块的NextSibling()是内联的第二块,内联的这两部分有相同的GetContent(),但他们不是在同一链中】)

 

http://lxr.mozilla.org/mozilla/source/view/public/nsIView.h

通过操作nsIView::GetParent(),nsIView::GetFirstChild() nsIView::GetNextSibling()得到的真正的是一个一致树。如果viewframe,存在nsIView->GetClientData()中,对于frame F,如果F->HasView()是真,那么F->GetView()非空,并且F->GetView()->GetClientData()==F。所以,视图树是帧树的影视,如果F1,F2帧有视图,并且,在视图上,F2F1最近的祖先,那么F1->GetView()->GetParent() == F2->GetView()

 

http://lxr.mozilla.org/mozilla/source/widget/public/nsIWidget.h

通过操作nsIWidget::GetParent(),GetFirstChild(), GetNextSibling()得到的真正的是一个一致树。如果窗口有视图,那么存在于nsIWidget->GetClientData(),同样,窗口树是视图树的映射就像视图树是帧树的映射。

原创粉丝点击