chrome浏览器集成IE内核的解决方案
1 架构图
双核功能的基本思路是,在chrome原有的render 管理的基础上,添加trident内核对象并在切换时将两个渲染的内核数据进行同步,进而将内核网络请求分发下来的数据,趋于一致,从而达到双核的无缝切换,内核数据同步主要包括cookie 数据同步和post 数据同步。
主要的流程包括:
窗口关联概要流程:由主窗口创建对应widget_host(即主窗口要bind的窗口)并与 trident 的容器窗口做bind(父子窗口关系设置)
Cookie数据同步概要流程:V68代码chrome中的网络模型是在主进程管理网络进程和cookie,V87独立network网络模型,需要注意。需要将trident 内核网络数据的cookie的获取和存储均通过进程去管理。
Post,Refere等数据同步概要流程:渲染内核在开启新页面或者页面内刷新时会将一部分数据(主要包括post,refere等)放入到要导航的页面中,如果跳转的页面需要切换内核,那么需要这部分数据从内核中取出来,并将这些数据放入新的核心去导航。
2 创建浏览器阶段
浏览器启动的时候会创建一个browser类,
启动流程期间会创建tab页面,然后渲染
StartupBrowserCreator::Start
StartupBrowserCreator::LaunchBrowser
StartupBrowserCreatorImpl::Launch
StartupBrowserCreatorImpl::DetermineURLsAndLaunch
StartupBrowserCreatorImpl::RestoreOrCreateBrowser
StartupBrowserCreatorImpl::OpenTabsInBrowser
void Navigate(NavigateParams* params)
NavigatorImpl::NavigateToEntry
NavigationRequest::BeginNavigation()
3 chrome内核模型
浏览器启动后打开chrome内核页面流程
NavigationRequest::BeginNavigation()
NavigationHandleImpl::WillStartRequest
NavigationURLLoader::Create
3.1 打开chrome内核网页
已经启动浏览器的情况下,新开chrome内核页面
RenderFrameHostImpl::BeginNavigation
NavigatorImpl::OnBeginNavigation
NavigationRequest::BeginNavigation()
3.2 地址栏输入网址消息流程
当前地址栏输入url开启访问
NavigatorImpl::RequestNavigation
NavigationRequest::CreateBrowserInitiated
4 IE内核接管
RenderFrameHostImpl::NavigateTrident
RenderFrameTrident::OnNavigate
TridentView::Navigate
TridentViewMessageHandlerImpl::OnNavigate
TridentView::DoNavigate
TridentControl::Navigate2
CHtmlView::Navigate2 系统函数