注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

写着玩

Bob

 
 
 

日志

 
 
 
 

读蔡先生chrome源码分析2  

2009-12-19 01:27:27|  分类: Chrome |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

From http://hi.csdn.net/caimouse

 


10,  loader 调用栈

void FrameLoader::load(DocumentLoader* newDocumentLoader)

void FrameLoader::load(DocumentLoader* loader, FrameLoadType type, PassRefPtr<FormState> formState)

void FrameLoader::continueLoadAfterWillSubmitForm(PolicyAction)

bool DocumentLoader::startLoadingMainResource(unsigned long identifier)

bool MainResourceLoader::load(const ResourceRequest& r, const SubstituteData&  substituteData)

bool MainResourceLoader::loadNow(ResourceRequest& r)

PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, ResourceHandleClient* client,

    Frame* frame, bool defersLoading, bool shouldContentSniff, bool mightDownloadFromHandle)

 

11,  ResourceHandle  -- Abstract layer

Different platform would implement defferent ResourceHandle class

Which are located in /webkit/webcore/platform/network   win,qt2,mac etc..

 

12. ResourceHandler 与job 的关系

在QT中,Resourcehandler 会调用QWebNetworkManager 类,QWebNetworkManager 会通过 job class 与 browser engine

通讯。

可以是IPC的方式,也可以是QT signal slot 方式 例如emit data( this, dat );

 

在chrome中,则主要是通过实现WebCore::ResourceHandleInternal来与WinHTTP交互的

 

13, Chrome 中如何把data 交给webkit

ResourceDispatcher类又把接收到的数据发往何处呢?

ResourceDispatcher::OnReceivedData函数调用WebCore::ResourceHandleInternal类来处理,也就是把接收到的数据抛给WebCore来处理了

 

经过如下面的调用过程:

1)  WebCore::ResourceLoader::didReceiveData

2)  WebCore::SubresourceLoader::didReceiveData

3)  WebCore::Loader::didReceiveData

4)  WebCore::CachedImage::data

 

14, webkit html 解析过程

 

1)  ResourceDispatcher::OnReceivedData()  资源分派类接收到网页数据。

2)  WebCore::ResourceHandleInternal::OnReceivedData()  WebCore::ResourceHandleInternal类接收到数据。

3)  WebCore::ResourceLoader::didReceiveData()  资源加载类接收到数据。

4)  WebCore::MainResourceLoader::didReceiveData()  主资源类接收到数据。

5)  WebCore::MainResourceLoader::addData() 主资源类保存数据。

6)  WebCore::FrameLoader::receivedData() 框架加载类保存数据。

7)  WebCore::DocumentLoader::receivedData() 文档加载类保存数据。

8)  WebCore::DocumentLoader::commitLoad() 文档加载类提交所有接收的数据。

9)  WebCore::FrameLoader::committedLoad() 框架加载类提交数据。

10)    WebFrameLoaderClient::committedLoad() 网页框架加载类提交数据。

 

11)    WebFrameImpl::DidReceiveData() 网页框架实现类保存提交的数据。

 

12)    WebCore::FrameLoader::addData() 框架加载类保存数据。

 

13)    WebCore::FrameLoader::write() 把网页数据写入HTML缓冲。   //在此函数中建立tokenizer

 

14)    WebCore::HTMLTokenizer::write()  HTML终结符分析器进行保存。

 

15)    WebCore::HTMLTokenizer::processToken()  HTML终结符分析器分析HTML数据。

 

16)    WebCore::HTMLParser::parseToken()  HTML分析器分析网页数据。

 

17)    WebCore::HTMLParser::insertNode() 分析到一个网页里的节点,开始插入。

 

18)    WebCore::Text::attach()  发现一个文本节点并保存。

 

19)    WebCore::Node::createRendererIfNeeded()  创建可以渲染的节点。

 

20)    WebCore::Text::createRenderer() 开始创建文本渲染对象。

 

21)    WebCore::RenderText::RenderText() 创建文本渲染对象RenderText。

 

15, 显示过程

Render 完毕之后,会发送paint 消息让UI去画

Chrome 中为

void RenderWidget::OnMsgRepaint(const gfx::Size& size_to_paint)

在这个函数,并不是最终的结果,它又会调用其它线程来处理渲染,以便达到异步的结果。它的调用过程如下:

 

1)  RenderWidget::DoDeferredPaint()  线程里开始渲染网页显示

 

2)  RenderWidget::PaintRect() 窗口里开始进行显示

 

3)  WebViewImpl::Paint() web视类开始显示。

 

4)  WebFrameImpl::Paint() web框架类开始显示。

 

5)  WebCore::ScrollView::paint() 滚动窗口显示。

 

6)  WebCore::Frame::paint() WebCore里的框架显示。

 

7)  WebCore::RenderLayer::paint() 分层显示。

 

8)  WebCore::RenderLayer::paintLayer()

 

9)  WebCore::RenderBlock::paint()  在每一层里显示每一块区域。

 

10)    WebCore::RenderBlock::paintObject() 显示这一区域的对象。

 

11)    WebCore::RenderBlock::paintContents() 显示需要显示的内容。

 

12)    WebCore::RenderFlow::paintLines() 这里需要显示文字。

 

13)    WebCore::RootInlineBox::paint() 开始显示一行文字。

 

14)    WebCore::InlineFlowBox::paint() 进行一行文字排列。

 

15)    WebCore::InlineTextBox::paint()

 

16)    WebCore::GraphicsContext::drawText()  进行一个一个文字显示。

 

17)    WebCore::Font::drawText()  这里调用字体类来把文字的编码变成位图。

 

18)    WebCore::Font::drawSimpleText()  这里把位图显示到界面内存里。让UI

 

  评论这张
 
阅读(1716)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017