注: 本文简要介绍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中页面实例所使用的渲染模式(极速模式或兼容模式)。
其他问题
有不少,不过此处不再赘述。