文档详情

Chromium网页RenderObjectTree创建过程分析解析.doc

发布:2017-01-05约2.76万字共21页下载文档
文本预览下载声明
Chromium网页Render Object Tree创建过程分析 在前面一文中,我们分析了网页DOM Tree的创建过程。网页DOM Tree创建完成之后,WebKit会根据它的内容创建一个Render Object Tree。Render Object Tree是和网页渲染有关的一个Tree。这意味着只有在DOM Tree中需要渲染的节点才会在Render Object Tree中有对应节点。本文接下来就分析网页Render Object Tree的创建过程。 从前面一文可以知道,每一个HTML标签在DOM Tree中都有一个对应的HTMLElement节点。相应地,在DOM Tree中每一个需要渲染的HTMLElement节点在Render Object Tree中都有一个对应的RenderObject节点,如图1所示: 从图1还可以看到,Render Object Tree创建完成之后,WebKit还会继续根据它的内容创建一个Render Layer Tree和一个Graphics Layer Tree。本文主要关注Render Object Tree的创建过程。 从前面一文还可以知道,DOM Tree是在网页内容的下载过程中创建的。一旦网页内容下载完成,DOM Tree就创建完成了。网页的Render Object Tree与DOM Tree不一样,它是在网页内容下载完成之后才开始创建的。因此,接下来我们就从网页内容下载完成时开始分析网页的Render Object Tree的创建过程。 从前面一文可以知道,WebKit是通过Browser进程下载网页内容的。Browser进程一方面通过Net模块中的URLRequest类去Web服务器请求网页内容,另一方面又通过Content模块中的ResourceLoader类的成员函数OnReadCompleted不断地获得URLRequest类请求回来的网页内容,如下所示: [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 void ResourceLoader::OnReadCompleted(net::URLRequest* unused, int bytes_read) { ...... CompleteRead(bytes_read); ...... if (bytes_read 0) { StartReading(true); // Read the next chunk. } else { // URLRequest reported an EOF. Call ResponseCompleted. DCHECK_EQ(0, bytes_read); ResponseCompleted(); } } 这个函数定义在文件external/chromium_org/content/browser/loader/resource_loader.cc中。 参数bytes_read表示当前这次从URLRequest类中读取回来的网页内容的长度。当这个长度值等于0的时候,就表示所有的网页内容已经读取完毕。这时候ResourceLoader类的成员函数OnReadCompleted就会调用另外一个成员函数ResponseCompleted进行下一步处理。 ResourceLoader类的成员函数ResponseCompleted的实现如下所示: [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 void ResourceLoader::ResponseCompleted() { ...... handler_-OnResponseCompleted(request_-status(), security_info, defer); ...... } 这个函数定义在文件external/chromium_org/content/browser/loader/resource_loader.cc中。 在前面一文中,我们假设ResourceLoader类的成员变量handler_指向的是一个AsyncResourceHandler对象。ResourceLoader类的成员函数ResponseCompleted调用这个AsyncResourceHandler对象的成员函
显示全部
相似文档