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