[Chrome源码阅读] 理解Browser进程
来源:互联网 发布:oracle数据库sql语句 编辑:程序博客网 时间:2024/05/22 01:27
http://blog.csdn.net/zero_lee/article/details/7903911
首先贴出一张来自于Chrome官网上design document上的图。这张图描述了Browser进程中主要几个类之间的相互关系。
这张图仅仅列出了Browser进程里的2个线程:UI线程和IPC线程。UI线程是主线程,主要负责整个UI的渲染和消息的响应,包括自身的消息和从Render 进程发过来的消息。IPC线程负责Browser进程与Render进程之间的通信和网络资源消息的过滤。
一个Render Process Host对应一个Channel Proxy,负责跟一个Render Process通信,同时多个Render View Host可以share同一个Render Process Host,对应Render进程中的多个RenderView。RenderViewHost以IPC::Channel::Listener的身份出现在RenderProcessHost的listeners_列表中。一个WebContents对应一个RenderViewHost,以RenderViewHostDelegate的身份出现在RenderViewHost中。
当一个RenderProcessHost(BrowerRenderProcessHost的基类)初始化在主线程上是,它也同时创建了一个新的RenderProcess和一个ChannelProxy IPC对象实例,这个IPC::ChannelProxy会建立一个命名管道连接到render进程。需要注意的是IPC::ChannelProxy运行在IPC线程中,监听着那个命令管道,同时自动的将接收的消息转发到RenderProcessHost。
在UI线程上的RenderProcessHost负责派发所有的view-specific的消息到合适的RenderViewHost,同时它自己也会处理少量的消息(CONTROL类型)。这个派发发生在函数BrowserRenderProcessHost::OnMessageReceived(注意RenderProcessHost仍然是一个virtual interface,因为它并没有实现OnMessageReceived函数)。
- void BrowserRenderProcessHost::OnMessageReceived(const IPC::Message& msg) {
- if (msg.routing_id() == MSG_ROUTING_CONTROL) {
- // dispatch control messages
- bool msg_is_ok = true;
- IPC_BEGIN_MESSAGE_MAP_EX(BrowserRenderProcessHost, msg, msg_is_ok)
- IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents)
- IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats,
- OnUpdatedCacheStats)
- IPC_MESSAGE_UNHANDLED_ERROR()
- IPC_END_MESSAGE_MAP_EX()
- if (!msg_is_ok) {
- // The message had a handler, but its de-serialization failed.
- // We consider this a capital crime. Kill the renderer if we have one.
- ReceivedBadMessage(msg.type());
- }
- return;
- }
根据msg.routing_id来确定listener(也就是RenderViewHost),从而进行消息转发。
- // dispatch incoming messages to the appropriate TabContents
- IPC::Channel::Listener* listener = GetListenerByID(msg.routing_id());
- if (!listener) {
- if (msg.is_sync()) {
- // The listener has gone away, so we must respond or else the caller will
- // hang waiting for a reply.
- IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
- reply->set_reply_error();
- Send(reply);
- }
- return;
- }
- listener->OnMessageReceived(msg);
view-specific的消息会派发到RenderViewHost::OnMessageReceived函数中。大部分的消息会被处理在这个函数中,剩下的会被转发到基类RenderWidgetHost中。在Windows平台上,会有一个RenderWidgetHostHWND类相关于RenderWidgetHost类,用来特殊地处理一些事件和渲染native的HWND。其它平台也有类似的类。
- [Chrome源码阅读] 理解Browser进程
- [Chrome源码阅读] 理解Browser进程
- [Chrome源码阅读] Browser相关的类
- [Chrome源码阅读] Browser相关的类
- [Chrome源码阅读] 理解Chrome导航网址的流程及render进程启动模式
- [Chrome源码阅读] 理解Thread类实现
- [Chrome源码阅读] Chrome的多进程调试方法
- [Chrome源码阅读] 理解Chrome的smart pointer
- [Chrome源码阅读] 理解Chrome的smart pointer
- [Chrome源码阅读] 理解ObserverList类的实现技巧
- 源码阅读--进程管理
- ThinkPHP源码阅读理解
- Chrome源码剖析--Chrome的进程模型
- [Chrome源码阅读]IPC通信初探
- [Chrome源码阅读] MessageLoop类的点点滴滴
- ril进程源码阅读札记
- android源码阅读-----zygote进程
- [Chrome源码阅读]Chrome启动代码流程1
- cocos2d-x 中文乱码问题解决方案
- 0903
- Memcached 结构分析详解
- w7+eclipse +ndk9 NDK开发 hellow ndk 笔记(java调用c)
- Guava之eventbus
- [Chrome源码阅读] 理解Browser进程
- Windows 7 下配置VPN
- uva 133
- oracle配制环境变量
- 搜索引擎排名优化技巧有哪些
- 不调用库函数,实现strcpy() 函数
- Guava 之eventbus 二
- jenkins 集成 redmine 账户验证的方案
- bool