chrome源码分析1:content模型

   程序通常可以简单的看做由模型+交互组成,外部请求通过交互接口转给模型去处理。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发展趋势的参与者。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值