读蔡先生chrome源码分析2

本文详细介绍了WebKit在浏览器中的加载及渲染过程,包括资源加载、HTML解析、页面绘制等关键步骤,展示了从请求资源到最终呈现页面的完整路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

From http://hi.youkuaiyun.com/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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值