chromium双核浏览器实现

注: 本文简要介绍IE内核在chromium中集成的主要原理和思路,并不涉及具体代码逻辑

概述

        chromium内核中,可以使用IE渲染模式来加载网页。其基本原理,就是将网页资源加载与渲染、事件处理、导航事件消息等等,由原本的blink实现替换为trident实现。
        整个开发过程中会涉及到render进程创建使用策略(RenderFrameHostImpl、SiteInstanceImpl相关类)、MessagePump类型切换、mojo通信管道创建及使用、Windows窗口与事件、COM组件(IWebBrowser相关)、Hook技术。 除此以外,需要对chrome的Out-of-Process iframes (OOPIFs)架构、 RenderFrameImpl类、RenderViewImpl类都有一定的了解。

进程模型

        兼容模式下,renderer进程不再创建默认的RenderView、RenderFrame以及RenderWidget,改为由trident相关类来接收来自browser进程的网址导航指令,并将加载结果反馈回browser进程。此过程中,mojo通道的browser端保持不变, renderer端由 blink 切换为 trident。

窗口结构

        兼容模式下,IE窗口附着在网页区域,父窗口名称为 "Chrome Legacy Window"。在browser进程创建一个新的RenderView时,可以获取父窗口句柄,待renderer进程创建完成,将窗口句柄通过mojo传递到render进程,随后render进程即可创建一个IE渲染子窗口,并通过UpdateParent函数与Chrome Legacy Window窗口绑定。

如何开始

1. 在chromium中了解一个网址导航的过程
        当用户在地址栏输入一个网址后,Browser层检测执行旧页面BeforeUnload,若用户未取消导航,开始BeginNavigation流程。
        此时网络层向服务器进行head请求,处理跳转、下载、网络错误等情况,若遇到特殊情况,导航失败,否则继续下面的流程。
        根据进程策略选取合适的或创建新的render进程,并向其发送Commit指令。
        对应的render进程收到Commit指令后,回复Commit成功到browser进程,browser进程执行旧网页的unload事件。
        与此同时,render进程与Network线程建立mojo连接,拉取网络资源,在解析完毕后,发送Loaded事件给browser进程,browser UI停止Loading状态,整个网页导航过程结束。

2. 在适当的地方替换为trident实现
        IE页面渲染相关的代码,要放在render进程。具体代码逻辑在不同chromium内核版本上略有不同,大体上是在,新的render进程中RenderView、RenderFrame创建的时候。渲染逻辑替换后,不应该再继续创建RenderView和RenderFrame实例,即此render进程不再执行blink下的任何代码。

3. 切核
        在固定IE模式可以正常渲染页面后,再通过UI控制的方式,切换回默认的chrome渲染,此时需要在chromeUI层增加一些标记,以区别当前tab中页面实例所使用的渲染模式(极速模式或兼容模式)。

其他问题

有不少,不过此处不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值