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.aspxhttp://msdn.microsoft.com/en-us/library/aa741317%28v=vs.85%29.aspxhttp://msdn.microsoft.com/en-us/library/bb508514%28VS.85%29.aspx

标签:none

添加新评论

captcha
请输入验证码