Monqueror源码简介

Monqueror源码简介(2006-7-7)
Main.c
 主消息循环函数MainWndMsgProc中有很多发送MSG_OPENURL 消息的调用,如浏览器刚创建打开默认主页、按了刷新按钮、后退、前进、在地址栏输入URL后回车等。SendNotifyMessage(frametopview->getHwnd(), MSG_OPENURL, 1, 0) 该消息是发送到类MGHTMLView 的消息循环中。

Mghtmlview.c
 HTMLViewProc 函数中case MSG_OPENURL:段中,根据需要打开的URL生成一个网络请求工作结构JobElement添加到工作队列中AddJobToQueue(temp); 接着就是等待下载线程完成下载工作了

Network.cpp
 void * thread_network(void * arg) 线程在浏览器初始化就运行了,一个死循环(当然有信号灯来控制,防止过多的占用cpu事件和共享冲突)不断的从对列中取得工作结构JobElement,并进行下载工作。一个工作完成后它会发一个MSG_URLREADY消息给MGHTMLView类的HTMLViewProc过程进行下一步处理。

Mghtmlview.c
 HTMLViewProc 函数中 case MSG_URLREADY:段中,根据下载文件的类型有分支,若为html文件则调用view->openURLFromBuffer((char *)temp->strBuffer),最后调用m_doc->write(str)开始html的解析过程了否则调用view->LoadedMsgFromNet(…)对新下载的资源进行处理(调用的是MGDocLoader 类的操作)。

开始解析前的一些说明
 

Html_documentImpl.cpp
 m_doc->write(str) 直接调用了tokenizer->write 开始解析过程。

htmltokenizer.cpp
 void HTMLTokenizer::write( const QString &str ),解析主要在while ( src.length() )这个循环中进行的。一个字符一个字符的往前读,读到’<’时,若下一个字符不是’/’’!’’?’,那就是一个普通token的开始了。具体见《基于MiniGUI的嵌入式浏览器的研究与开发.KDH》
 

如上图调用  parser->parseToken(currToken);后进入Token处理了。

Htmlparser.cpp
 void KHTMLParser::parseToken(Token *t)。这个函数中主要调用了连个函数。NodeImpl *n = getElement(t) 和   insertNode(n)。getElement根据获取的标签建立对应得html元素类,返回的结果再通过insertNode(n)插入dom树。在insertNode过程中,会调用NodeImpl *newNode = current->addChild(n)。

dom_nodeimpl.cpp
每添加一个子节点前会调用childAllowed ,若失败就会抛出异常。下面是代码片断。
NodeImpl *NodeBaseImpl::addChild(NodeImpl *newChild)
{
    if(!childAllowed(newChild))
{
 throw DOMException(DOMException::HIERARCHY_REQUEST_ERR);
}
。。。。
当然不是每个节点都是仅仅如上同样的调用,因为addChild是一个虚函数,不同的节点类都是NodeBaseImpl类的子类,它们会在自己的类中重载addChild增加自己特定的判断,但最后都会调用NodeBaseImpl类的addChild。childAllowed主要判断增加的节点是不是允许放在当前节点下。这种允许情况是事先在dtd.cpp中定义好的。

又回到Htmlparser.cpp
采用异常抛出机制,主要是使程序直接返回到insertNode函数,然后根据异常返回集中的进行容错处理。容错处理代码就在    catch(DOMException exception) 段中。

Mgloader.cpp
在解析过程中,会解析到一些资源文件,如图片、css文件、js文件。类MGDocLoader(Mghtmlview.c段中曾提到过这个类)就负责这些资源的获取和并在获取后发出处理请求。
 
MGDocLoader简单的对三个类封装了一下,形成一个统一的资源管理模块。具体工作还是根据资源类型分配给三个成员进行处理。这里就说一下图片资源的处理过程。回到Htmlparser.cpp::InsertNode,若节点插入成功则会调用n->attach(HTMLWidget)。attach也为虚函数。这里说的是图片资源所以就是对应HTMLImageElementImpl节点类的attach函数。

Html_imageimpl.cpp
 void HTMLImageElementImpl::attach(MGHTMLView *w)。这个函数主要完成新节点插入的同时生成对应得render节点以便布局和页面显示。在函数的最后调用了renderImage->setImageUrl(…)。图片的下载请求就是通过docLoader->requestImage(…)加入下载工作队列的。在Mghtmlview.c段中我们提到的LoadedMsgFromNet就是调用MGDocLoader::LoadedMsgFromNet,如果是图片那么就最后分配到MGImageLoader::LoadedMsgFromNet中执行,进行图片下载完成后的页面布局等处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值