chromium进程间通信

因为chromium是多进程的架构,因此需要一种可靠的进程间通信机制。chromium在Windows上的进程间通信是基于命名管道实现的。异步的命名管道通信模式确保不会阻塞通信的双方。 browser中的IPC 在browser进程中,与renderers进程通信是在独立的I/O线程里。跟views的来往消息会通过主线程的ChannelProxy。这种架构的优势是资源请求等性能要求较高的消息会直接在I/O线程里处理了,不会导致UI的阻塞。 renderer中的IPC 每个renderer进程的主线程管理消息通信,大多数消息会调度到renderer线程去处理。 消息的类型 Chromium处理进程间通信类似于MFC/WTL的那套消息映射机制。一个进程创建一个IPC消息,然后打包上参数,发送到接收的进程。这里有两种类型的IPC消息,routed消息和control消息。两者的差别是发送routed的消息的时候需要一个routing_id参数,通过这个routing_id才能发送到正确的接收方。一般跟view或者frame概念相关的类才有routing_id。 举个例子,我要从主进程发送一个ViewMsg_ClosePage消息到渲染进程,通知它关闭某个网页。往往一个渲染进程里面存在多个RenderView对象,到底该哪个对象来处理ViewMsg_ClosePage消息呢。这种情况下需要用routed消息的routing_id参数来控制将消息传递到正确的RenderView里面。 control消息不带有routing_id参数,并不意味着RenderView、RenderFrame这样的类不能处理control消息。消息都可以自定义参数,你完全可以把routing_id加到control消息里面。但是通常的做法是routed消息是跟网页有关的,其他的情况则用control消息。 从另一个角度来看,IPC消息又可以分为同步消息跟异步消息。使用同步消息的时候应当特别注意,这可能会导致浏览器阻塞。应当尽量避免使用同步消息,事实上Chromium里面使用到同步消息的场景也很少。 声明消息 我们可以在各种*_messages.h的头文件看到IPC消息的定义。通过IPC_MESSAGE_ROUTED*、IPC_MESSAGE_CONTROL*这类的宏来定义异步消息。比如处理0个参数的消息,定义成IPC_MESSAGE_*0,处理2个参数的消息定义成IPC_MESSAGE_*2。 一些简单的参数类型,可以直接的打包到消息里面,比如: Chromium内部已经可以支持直接序列化GURL、base::FilePath、base::Time等类型了。更多支持直接序列化的类型,可以从ipc_message_utils.h文件中看到。只要某个类型T有sruct... Read More | Share it now!

熟悉chromium代码目录结构

很多项目结构都已发生了改变,可能与最新的项目结构不一致。 高层次概述 chromium可以分为三大部分:浏览器,渲染器,webkit。浏览器是主进程,代表着所有的UI和I/O。渲染器(通常)是每个标签对应一个子进程,被浏览器驱动着。它嵌入webkit用来布局和渲染。 sln文件的快速入门 chrome.sln 启动代码在... Read More | Share it now!

Chromium显示网页

原文链接:http://dev.chromium.org/developers/design-documents/displaying-a-web-page-in-chrome 概念应用层 每个框代表一个概念应用层。没有一层需要知道或者依赖他的上层。 WebKit:渲染引擎。Port是一个集成平台相关的系统服务的部分,比如资源加载和图像。 Glue:转换webkit类型到chromium类型。 Renderer... Read More | Share it now!

Chromium多进程架构

原文链接:http://dev.chromium.org/developers/design-documents/multi-process-architecture 这篇文章是从高层的架构来描述chromium,每个新接触chromium的人最好都能理解这篇文章的概念。 chromium为浏览器标签页使用隔离开的进程,使得浏览器渲染引擎的错误不会导致整个浏览器的错误。也限制每个渲染引擎进程去访问其他进程和系统。在某些方面,独立的多进程架构可以利用操作系统带来的内存保护和访问控制的好处。 我们运行界面、管理标签页和插件的进程称为主进程,或者是浏览器进程,浏览器。而每个标签页所对应的进程称之为渲染进程或者渲染器。渲染器使用webkit来解释排布html。 管理渲染进程 每个渲染进程有个全局的RenderProcess对象来管理跟他的父进程也就是浏览器进程的通信和维护各种全局状态。浏览器进程则是为每个渲染进程维护对应的RenderProcessHost对象,用来管理浏览器状态和跟渲染进程通信。浏览器进程和渲染进程是通过Chromium’s... Read More | Share it now!

Windows下面获取chromium代码

参考: http://dev.chromium.org/developers/how-tos/get-the-code http://dev.chromium.org/developers/how-tos/install-depot-tools chromium是个巨大的开源项目,目前的chromium27包含有700多个工程,2个多G的代码压缩包,解压出来5个G以上。要把这些代码同步到本地,一般要花费很长时间,由于中国的网络原因,同步代码经常被中断。所以不建议直接用svn去同步代码。 如果你只是想查看代码,可以通过这个网址在线的查看,http://src.chromium.org/viewvc/chrome/。 下面有几种方便的方式来获取代码到本地。 安装depot_tools 下面的方法都需要安装depot_tools。 从这里下载depot_tools:https://src.chromium.org/svn/trunk/tools/depot_tools.zip。 然后解压到一个目录,比如c:depot_tools,然后把这个目录加入PATH环境变量里面。 使用压缩包获取代码 去这里下载代码压缩包,http://chromium-browser-source.commondatastorage.googleapis.com/chromium_tarball.html。一般有几个G的大小,用迅雷下载比较方便。 把压缩包的中的代码解压到你本地的目录,目录的路径名不能包含空格。比如你建立一个c:chromium的目录,把解压包的src目录和同级的.gclient、.gclient_entries、README-archive等文件复制到c:chromium目录下。 安装depot_tools cmd里面切换到c:chromium目录,运行gclient... Read More | Share it now!

Mfc实现系统托盘功能

声明一个NOTIFYICONDATA类变量,该句可以放在Dlg类的声明中,作为Dlg类的一个成员;也可以放在Dlg类的实现中,作为全局变量来使用。 声明一个响应函数,用于响应鼠标操作。将这个函数放入Dlg类的声明中,作为Dlg类的一个成员。 定义消息名称以消息号,并注册消息,该步很重要!我就是因为没有注册消息,导致调试了很久都找不到问题所在。该步都是在Dlg.cpp(Dlg的实现中)中操作。定义消息名称和消息号:,1001只是用于指定一个消息号,可以随便指定。 注册则是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之间添加 初始化系统托盘: 有了上面的代码,当程序运行到含有如上代码的函数时就会在系统托盘处添加一个图标,想隐藏主对话框,就再添加一句ShowWindow(SW_HIDE);这样就实现了将MFC最小化到系统托盘。但还要添加点击托盘图标时响应鼠标的函数,也就是第二步中的函数OnNotifyIcon。OnNotifyIcon函数,如下: 退出时删除托盘 ... Read More | Share it now!