首先,chromium是一个多进程多线程的浏览器,在运行的时候,通过查看系统的线程运行状况,可以看到在系统中有个browser process 和至少一个sandbox process。
本文重点介绍在启动contentshell的时候,sandbox process的创建路程。
1. shell.cc文件,Shell::CreateNewWindow方法中,shell->LoadURL(url);
2. shell.cc文件,Shell::LoadURL(const GURL& url)方法;
3. shell.cc文件,Shell::LoadURLForFrame方法中,web_contents_->GetController().LoadURLWithParams(params);
4. navigation_controller_impl.cc文件,NavigationControllerImpl::LoadURLWithParams方法中,LoadEntry(entry);
5. navigation_controller_impl.cc文件,NavigationControllerImpl::LoadEntry方法中,NavigateToPendingEntry(NO_RELOAD);
6. navigation_controller_impl.cc文件,NavigationControllerImpl::NavigateToPendingEntry方法中,
if (!web_contents_->NavigateToPendingEntry(reload_type))
7. web_contents_impl.cc文件,WebContentsImpl::NavigateToPendingEntry
8. web_contents_impl.cc文件,WebContentsImpl::NavigateToEntry方法中, RenderViewHostImpl* dest_render_view_host =
static_cast<RenderViewHostImpl*>(render_manager_.Navigate(entry));
9. render_view_host_manager.cc文件,RenderViewHostManager::Navigate方法中,RenderViewHostImpl* dest_render_view_host =
static_cast<RenderViewHostImpl*>(UpdateRendererStateForNavigate(entry));
10.render_view_host_manager.cc文件,RenderViewHostManager::UpdateRendererStateForNavigate方法,
int route_id = CreateRenderView(new_instance, opener_route_id, false,
delegate_->IsHidden());
11. render_view_host_manager.cc文件,RenderViewHostManager::CreateRenderView方法中,
bool success = InitRenderView(new_render_view_host, opener_route_id);
12. render_view_host_manager.cc文件,RenderViewHostManager::InitRenderView方法中,
return delegate_->CreateRenderViewForRenderManager(render_view_host, opener_route_id);
13. web_contents_impl.cc文件, WebContentsImpl::CreateRenderViewForRenderManager方法中,
(!static_cast<RenderViewHostImpl*>( render_view_host)->CreateRenderView(string16(),
opener_route_id, max_page_id))
14. render_view_host_impl.cc文件,RenderViewHostImpl::CreateRenderView方法中,if (!GetProcess()->Init())。
之后的创建路程可以参考下面的路径:
如上便展示了sandbox process 在contentshell的启动过程中的创建历程。
另外,当在地址栏上输入url的时候,也会创建sandbox process,其创建后面的实现相似,只是上面的第4步由content_view_core_impl.cc文件的
content::ContentViewCoreImpl::LoadUrl方法出发。
本人菜鸟,写的不好,请多吐槽,只是分享下自己看的心得,方便广大chromium爱好者。