Internet Explorer 完全解析 [4]
第四章 文档的具象实现
前几个类的介绍都不是完整的,以后有需要再补充。
免责声明:本类文章全部是我的个人理解,可能存在理解错误,如有发现,敬请指正。
4.1 介绍
CDoc910
类将是我们要详细叙述的最后一个类,它可以说是网页文档的具象实现,同时,它也会贯穿在所有的类中,在分析时经常会看到许多类都关联着CDoc *pDoc这样一个成员函数,让我们看一看CDoc的真身吧。
4.2 CDoc概述
CDoc(formknl)也就是传说中的根对象(root object),对应传统的文档视图
结构的文档部分。有些像是MFC中的CDoc,事实上Internet Explorer中也确实还有一个CView类。CDoc作为IHTMLDocument2/3接口的一个具体的实现,它自身封装了许多与Markup有关的内容,例如创建、增删Markup等等。对Markup具体的介绍请见完全解析Internet Explorer [3]、[5]以及“对Markup的介绍[译]”。
可以极为简化地说,一个CDoc管理着一组CMarkup,而CMarkup又与一组CElement有关。这个便是前几个内容之间的内在联系。
4.3 CDoc的成员变量
CDoc的成员变量列举如下,即使在日常调试中没有私有符号,我想,这依然可以作为参考,至少通过成员变量可以了解这个类具体能做什么。
- CDefaultElement * _pElementDefault。 指定默认元素,如果文档中没有任何可用元素的话,那么就会用到这个默认元素。
- CMarkup * _pPrimaryMarkup。 主markup,也就是指向当前根元素的markup。
- CEditRouter _EditRouter。 提供垂直消息路由(也就是元素层级中传递消息)的。
- CCaret * _pCaret。判断用户是否在编辑文档时用的。
- CDocInfo _dci。 文档信息,文档内容传输时用。
- CElement * _pElemEditContext。存储着当前正在编辑的选区,或者就是当前选区。
- CElement * _pElemUIActive。当前正在显示着的UI。
- CElement * _pElemCurrent。当前获得焦点的元素,上面说的消息路由也会从这儿开始。
- CElement * _pElemDefault。 默认元素。
- long _lSubCurrent。用来细分当前元素功能用。
- CElement * _pElemNext。下一个会获得焦点的元素。
- CRect * _pRectFocus。上一个获得焦点并且被渲染的元素的区域。
- int _cSurface/_c3DSurface。 计数器。
- OPTIONSETTINGS * _pOptionSettings。指向当前用户可以编辑的属性,例如文字颜色等。
- CODEPAGESETTINGS * _pCodepageSettings。 指定codepage。
- long _icfDefault; 。默认charformat index。
- const CCharFormat * _pcfDefault;。 默认的charformat。
- unsigned _cInval; 调用CDoc的Invalidate的次数。
- unsigned _cProcessingTimeout;。 脚本执行时清空分块的超时值。
- SHORT _iWheelDeltaRemainder;。 缩放值(zDelta)
- CStr _cstrPasteUrl;。 粘贴时会用到的url。
- RADIOGRPNAME *_pRadioGrpName;。 Radio Box的名字。
- LONG _lRecursionLevel;。 最大递归层次。
- DWORD _dwHistoryIndex;。 下一个可用的历史记录index。
- CView _view;。 View的支持。
- long _lLastTextID; 。 TextID。
- long __lDocTreeVersion;。 当doc关联的markup中任何元素导致树变化时,这个值会加一。仅仅改变树中文本节点的值的时候不会改变这个版本号。
- long __lDocContentsVersion;。 任何内容的改变都会导致这个版本加一。不管是markup还是文本节点。
- CSelectionObject * _pCSelectionObject;。 选区对象。
- CAtomTable _AtomTable;。 存储着元素-名字(name)的映射
- IDocHostUIHandler * _pHostUIHandler;。 宿主的整合,这个是UIHandler的接口指针。
- IDocHostUIHandler * _pBackupHostUIHandler;。 上一个(称为主UIHandler)失败时调用这个备选的。
- IOleCommandTarget * _pHostUICommandHandler;。 UIHandler的Command Target。
- DWORD _dwFlagsHostInfo;。 宿主的flags
- DWORD _dwFrameOptions;。 框架选项。
- CStr _cstrHostCss; 。宿主下发下来的css规则。
- CStr _cstrHostNS;。 命名空间列表,用分号分割。
- CElement * _pElementOMCapture;。 用于处理鼠标捕获。
- PFN_VOID_MOUSECAPTURE _pfnCapture;。 鼠标捕获事件的处理函数。
- void * _pvCaptureObject;。 触发事件的对象。
- CElement * _pMenuObject;。 当前调用site(ie的这个术语当成
元素
来看比较靠谱?)的菜单对象。 - CTreeNode * _pNodeLastMouseOver;。 上一次触发mouseOver事件的元素。
- long _lSubDivisionLast; 鼠标移动过的上一个区域。
- CTreeNode * _pNodeGotButtonDown;。 捕获到鼠标按下的site。
- HMENU _hMenuCtx;。 菜单上下文。
- USHORT _usNumVerbs;。 上下文菜单中的verb(活动元素)
- HWND _hwndCached;。 处理状态时负责承载的窗口。
- ULONG _cFreeze;。 冻结计数
- IUnknown * _punkMimeOle;。 维持MimeOle对象的计数用。(保活)
- IStream * _pStmDirty;。 脏文档数据流,用于刷新。
- IMoniker * _pmkName; 。 为IPersistMoniker保存的当前使用的Moniker。
- CDwnPost * _pDwnPost;。 用于获取当前doc的推送数据。
- CStr _cstrUrl; 。 内部使用,当前doc的base url。
- CStr _cstrSetDomain;。 URL Host name的子集。
- SAFETYLEVEL _safetylevel;。 当前页面的安全等级。
- SSL_SECURITY_STATE _sslSecurity;。 当前页面安全等级,不安全,混合,安全。
- SSL_PROMPT_STATE _sslPrompt; 。 SSL提示,允许,询问,拒绝。
- LONG _cInSslPrompt;。 当前的提示字段指示。
- IHlinkBrowseContext *_phlbc;。 超链接的浏览上下文,用于历史等地方。
- DWORD _dwLoadf;。 加载标识,离线,安静,等等。
- IUrlHistoryStg *_pUrlHistoryStg;。 历史存储(history storage)
- CTaskLookForBookmark *_pTaskLookForBookmark;。 检查书签的task。
- CMapElement * _pMapHead;。指向树中的map对象。
- long _readyState;。 readystate的指示。
- ULONG _ulProgressPos;。 进度位置。
- ULONG _ulProgressMax;。 最大进度指示。
- (以下挑重要的来了,这里的东西实在是太多了)
- CDoc* _pDocParent;。 父文档的指针
- IHTMLEditor* _pIHTMLEditor;。 选区管理器
- CStyleSheetArray *_pHostStyleSheets;。 宿主传来的所有的样式表。
4.4 CDoc的成员函数
CDoc提供了一大堆的成员函数,在这里我们将列举出部分重要或者常用的成员函数,以供参考。
- InitDocClass。 初始化,生成一个CDoc类,由DLL的LibMain调用。
- CDoc::CDoc。 CDoc的构造函数,这个和CDoc::Init合起来完成了CDoc的初始化,当然,构造函数是第一个被调用的。
- CDoc::~CDoc。 CDoc类的析构函数。
- CDoc::CreateRoot。为当前CDoc创建一个主根元素。
- CDoc::Init。 初始化的第二阶段。
- CDoc::Passivate。释放对其他元素的引用,藉由可以释放主对象。
- CDoc::UnloadContents。 释放所有资源。
- CDoc::RunningToLoaded。 通知主根元素OS_RUNNING事件。
- CDoc::HitTestPoint。 在指定点击位置上向CView发出请求,找到对应位置的元素。
- CDoc::Update。 更新对应View的缓存。
- CDoc::IsUpToDate。 获取Cache状态是否为最新。
- CDoc::Close。 关闭当前对象。
- CDoc::ParentFrameSite。 当当前CDoc是在frameset中呈现的话,这个会返回它的parent site,否则返回null。
- CDoc::ParentIFrameSite。 同上,不过是iframe。
- CDoc::BroadcastNotify。向整个树中广播通知。
- CDoc::SetDocParent。 设置parent。
有参考意义的网页
http://msdn.microsoft.com/en-us/library/aa752038%28v=vs.85%29.aspx、http://msdn.microsoft.com/en-us/library/aa741317%28v=vs.85%29.aspx、http://msdn.microsoft.com/en-us/library/bb508514%28VS.85%29.aspx