webkit总结1

转载请注明出处:http://blog.csdn.net/awebkit


        最近翻了一些资料看,觉得还不错,对于webkit认识又有加深,在这里总结一下。

        当我们在地址栏里面输入url后,webkit是如何开始工作的呢?

        我们在浏览器里面看到的页面就是窗口,对应Chrome,而背后的控制交给Page(更常见的概念是WebView,而WebView的核心成员就是Page,我们可以认为一个是现象,一个是本质),显示交给FrameView。Page里面包含一个mainFrame。frame对应html标准中的frame。如果有frameset标签,那么自然还有其他的frame,为了管理这些frame,就有了FrameTree。

        frame的load过程在这里 http://blog.csdn.net/dlmu2001/article/details/6363380 ,说的非常详细。既然我这里是总结,那么就简单理一下思路,适合先看过上面的文章,再看一下这里。frame通过FrameLoader装载url。FrameLoader维护三个DocumentLoader,对应不同的阶段。首先通过FrameLoaderClient建立DocumentLoader,设置为m_policyDocumentLoader。m_policyDocumentLoader进行一系列的policy check,如果通过,则这个对象赋给m_provisionalDocumentLoader,负责startLoadingMainResource,在数据到来后则转变为m_docmentLoader。m_provisionalDocumentLoader就是一个空白网页,显示为白屏。不同的DocumentLoader是不是有点状态机的感觉?其实就是一个DocumentLoader,在不同场合身份不同罢了。

        让我们再回头看看startLoadingMainResource。主资源的加载


        解析的过程下文说的也很详细,http://blog.csdn.net/dlmu2001/article/details/6583280   解析的过程就是DOM树和Render树建立的过程。根据网络来的输入流,在HTMLTokenizer中分词,生成HTMLToken。一般来说,一个元素会对应三个HTMLToken,起始标签,结束标签,元素内容。而对应于DOM树,则是起始标签和结束标签对应一个节点,元素内容对应一个节点。

       根据HTMLToken创建Element派生类,然后添加到DOM树中,调用attach。注意attach是首先在Node里面定义的。Node是DOM模型的基础类,常见的派生类是Document,Element,Text类。其中,Document是文档树的根节点。原始文本转化成Text类。标签对应Element类。

        HTMLElement派生类元素的创建是通过HTMLElementFactory实现的,顾名思义,这里用到了工厂模式。这里远比你所想象的更精巧,这个类是自动生成的!一个perl脚本 bindings/scripts/generate-bindings.pl 自动生成这个类。

HTMLElementFactory.cpp HTMLNames.cpp : dom/make_names.pl html/HTMLTagNames.in html/HTMLAttributeNames.in
    perl -I $(WebCore)/bindings/scripts $< --tags $(WebCore)/html/HTMLTagNames.in --attrs $(WebCore)/html/HTMLAttributeNames.in --factory --wrapperFactory --extraDefines "$(HTML_FLAGS)"

       这句话的大致意思是,生成HTMLElementFactory.cpp HTMLNames.cpp,而这些文件依赖于dom/make_names.pl html/HTMLTagNames.in html/HTMLAttributesNames.in。下面是所执行的perl命令。自动化代码生成,很强大吧?

       我们再回过头来看看HTMLElementFactory,这个类提供了一个createHTMLElement方法,生成各种各样的HTMLElement派生类,如HTMLImageElement等。HTMLElementFactory维护了一个标签名到对应构造函数的map,前面生成的Token传进来后,根据标签名,生成对应的派生类。通过脚本以及几个配置文件,把这么多的派生类的生成很简单的做到了,清晰,强大,让人不得不佩服webkit开源软件的代码优秀的质量。



      javascript绑定的过程。

         









        











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值