chrome源码分析1:content模型
2016-05-02 21:54
471 查看
程序通常可以简单的看做由模型+交互组成,外部请求通过交互接口转给模型去处理。chrome也不例外,总体看,chrome由模型content、content-api、交互界面组成(下图中的chrome)。
Content模型和交互接口如下图所示。WebContents表示一个网页,向该对象传递一个url,该对象可以将url对应的页面显示在屏幕上。浏览器的交互界面通过NavigationController对象操作WebContents。一个网页会包含多个iframe,WebContents内部维持着一个FrameTree来表示网页的Frame结构。当让WebContents显示一个新的url时,FrameTree对象并不会重新创建,而是让FrameTree的根节点去渲染新的url。
FrameTreeNode模型及交互接口如下图所示。FrameTreeNode表示页面中的一个frame,该frame会被绘制到显示屏幕上。通过FrameTreeNode的交互接口Navigator。在默认配置下,FrameTreeNode会由一个独立的渲染渲染。由于FrameTreeNode对象由主进程维护,FrameTreeNode有一个相关联的RenderFrameHostManager负责与渲染进程进行垮进程通信。RenderFrameHostManager通过RenderFrameHostManager::Delegate接口维持着对WebContents的引用,RenderFrameHostManager可以通过该接口创建显示区域(一块内存区域),渲染进程将要显示的内容绘制到此显示区域中。
实例分析:
当打开一个chrome标签页时,chrome做了什么事呢(详情见chrome::Navigate(NavigateParams* params)。新建tab的事件处理函数创建WebContents对象,然后调用WebContents的GetController().LoadURLWithParams(const LoadURLParams&
params)函数导航到指定的url(注:GetController()函数获取的是与WebContents关联的NavigationControllerImpl对象)。随后该函数将请求转给NavigationControllerImpl::NavigateToPendingEntry(ReloadType
reload_type)处理【reload_type值为NO_RELOAD】。
chrome的每个tab关联一个WebContents对象。当刷新页面时,刷新事件处理函数调用 WebContents关联的NavigationController对象的NavigationControllerImpl::Reload(bool check_for_repost)函数。该函数会设置pending_entry_对象,再将请求转发给NavigationControllerImpl::NavigateToPendingEntry(ReloadType
reload_type)处理【reload_type值为RELOAD】。
NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type)处理流程为:获取frametree的root节点调用frame->navigator()->NavigateToPendingEntry(frame, *frame_entry,reload_type, false)。navigator()获取的是FrameTreeNode的交互接口Navigator对象。
NavigatorImpl::NavigateToPendingEntry函数调用RenderFrameHostManager::Navigate将当前页面导航到指定的url。而RenderFrameHostManager::Navigate通过垮进程通信机制,通知渲染进程渲染指定的url。
后记
刚毕业进入公司从事后端开发,写了半年的java代码,深感团队的后端系统设计思想太落伍,做出的系统扩展难、代码重复率高、可维护性差。然后转入前端开发,前端开发离不开chrome,个人比较喜欢探求内部细节,所以下载了chromium源码,探索chrome结构、运行机制;
熟悉chrome内部机制能够更好的优化页面;
chrome的发展,也影响着app的开发方式。chrome的发展可以赋予web程序更多的native api,让曾经需要使用笨重的app才能实现的功能使用html+js就能实现,增强了app的动态能力。了解chrome源码,进而能了解chrome的最新发展动态,成为chrome发展趋势的参与者。
Content模型和交互接口如下图所示。WebContents表示一个网页,向该对象传递一个url,该对象可以将url对应的页面显示在屏幕上。浏览器的交互界面通过NavigationController对象操作WebContents。一个网页会包含多个iframe,WebContents内部维持着一个FrameTree来表示网页的Frame结构。当让WebContents显示一个新的url时,FrameTree对象并不会重新创建,而是让FrameTree的根节点去渲染新的url。
FrameTreeNode模型及交互接口如下图所示。FrameTreeNode表示页面中的一个frame,该frame会被绘制到显示屏幕上。通过FrameTreeNode的交互接口Navigator。在默认配置下,FrameTreeNode会由一个独立的渲染渲染。由于FrameTreeNode对象由主进程维护,FrameTreeNode有一个相关联的RenderFrameHostManager负责与渲染进程进行垮进程通信。RenderFrameHostManager通过RenderFrameHostManager::Delegate接口维持着对WebContents的引用,RenderFrameHostManager可以通过该接口创建显示区域(一块内存区域),渲染进程将要显示的内容绘制到此显示区域中。
实例分析:
当打开一个chrome标签页时,chrome做了什么事呢(详情见chrome::Navigate(NavigateParams* params)。新建tab的事件处理函数创建WebContents对象,然后调用WebContents的GetController().LoadURLWithParams(const LoadURLParams&
params)函数导航到指定的url(注:GetController()函数获取的是与WebContents关联的NavigationControllerImpl对象)。随后该函数将请求转给NavigationControllerImpl::NavigateToPendingEntry(ReloadType
reload_type)处理【reload_type值为NO_RELOAD】。
chrome的每个tab关联一个WebContents对象。当刷新页面时,刷新事件处理函数调用 WebContents关联的NavigationController对象的NavigationControllerImpl::Reload(bool check_for_repost)函数。该函数会设置pending_entry_对象,再将请求转发给NavigationControllerImpl::NavigateToPendingEntry(ReloadType
reload_type)处理【reload_type值为RELOAD】。
NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type)处理流程为:获取frametree的root节点调用frame->navigator()->NavigateToPendingEntry(frame, *frame_entry,reload_type, false)。navigator()获取的是FrameTreeNode的交互接口Navigator对象。
NavigatorImpl::NavigateToPendingEntry函数调用RenderFrameHostManager::Navigate将当前页面导航到指定的url。而RenderFrameHostManager::Navigate通过垮进程通信机制,通知渲染进程渲染指定的url。
后记
刚毕业进入公司从事后端开发,写了半年的java代码,深感团队的后端系统设计思想太落伍,做出的系统扩展难、代码重复率高、可维护性差。然后转入前端开发,前端开发离不开chrome,个人比较喜欢探求内部细节,所以下载了chromium源码,探索chrome结构、运行机制;
熟悉chrome内部机制能够更好的优化页面;
chrome的发展,也影响着app的开发方式。chrome的发展可以赋予web程序更多的native api,让曾经需要使用笨重的app才能实现的功能使用html+js就能实现,增强了app的动态能力。了解chrome源码,进而能了解chrome的最新发展动态,成为chrome发展趋势的参与者。
相关文章推荐
- Java中多态的实现机制
- android 小技巧
- windows 下VS2015配置opencv
- 深入了解viewport和px
- 堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)
- 给大家推荐一些学习android的书籍(第一篇博客)
- Vector容器介绍(一)
- 《Motion Design for iOS》(八)
- linux清空linux 和history
- fzoj Problem 2190 非提的救赎 【单调栈】
- hdoj 1074 Doing Homework 【状压dp】
- hdoj 1505 City Game 【dp or 单调栈】
- elasticsearch中初步使用filter
- 非常详细到docker学习资料
- 数据结构初学过程中对算法效率度量的理解
- POJ 3254 状压dp
- BZOJ 2342: [Shoi2011]双倍回文 (Manacher+set)
- 【数据结构】二叉树相关操作
- hdoj 1506 Largest Rectangle in a Histogram 【单调栈】
- malloc和free的实现原理