chromium中的类 BrowserMainParts,这个类包含了由BrowserMain()函数执行的几个不同的阶段,该类中的每一个函数都代表一个阶段,这些方法都在BrowserMainLoop的通信方法中被调用。
主要有以下几个阶段:
- EarlyInitialization:Main Message Loop开始运行之前,此时需要完成在Main Message Loop运行之前就要完成的任务(例如设置信号处理函数);
- MainMessageLoopStart:Main Message Loop开始运行时,也就是在Main Message loop开始一直到主线程初始化完成,此时平台相关的操作应该放在PreMainMessageLoopStart()函数中完成;
- RunMainMessageLoopParts:在Main Message Loop开始运行之后。(例如:MessageLoopForUI::current()->Run())。
接下来看看如何添加内容,主要是为已经存在的parts:
- 指出你的新代码在什么时候被执行。在你的代码执行之前以及之后要做些什么?是否有合理的理由在特殊的时间运行你的代码?用文档记录下来!
- 分离出所有平台相关性的地方。请在各方面避免#ifdef 之类的宏定义。你有两个选择来处理与平台相关的代码:(1).在平台相关的方法中执行这些代码,当要执行的操作是平台唯一的,请在Pre/Post...()方法中完成;(2). 如果要执行的操作在不同的平台中有不同的实现,就放在某一个部分中去执行(例如:EarlyInitialization());
- 除非你的新代码特别少,否则请把这些代码放在分离的方法中,并且想法要很清晰。
主要成员函数如下:
virtual void PreEarlyInitialization() {}
virtual void PostEarlyInitialization() {}
virtual void PreMainMessageLoopStart() {}
virtual void PostMainMessageLoopStart() {}
初始化使用者的额外工具包
virtual void ToolkitInitialized() {}
这个函数在content framework的子线程创建之前运行,此时Main Message Loop已经创建但还未运行,并且用户自己的工具包也已初始化。返回值就是错误码,若为0,正执行成功。
virtual int PreCreateThreads();
virtual void ServiceManagerConnectionStarted(ServiceManagerConnection* connection) {}
这个函数只在Main Message Loop运行之前调用。此时,browser的多个线程都已经创建完毕。
virtual void PreMainMessageLoopRun() {}
返回true表示Main Message Loop已经开始运行,否则返回false。
如果返回false,将会调用此函数默认的实现。若设置了返回码,这个返回码将在BrowserMain()中得到。
virtual bool MainMessageLoopRun(int* result_code);
在Main Message Loop停止之后调用,此时线程还没有停止。
virtual void PostMainMessageLoopRun() {}
在程序结束之前调用
virtual void PreShutDown() {}
恰好是程序结束之前的最有一个部分,此时线程都已经停止并且被销毁
virtual void PostDestoryThreads() {}
关于这个类的具体功能还需要在工作中进一步学习,目前整理该类的虚方法以及基本介绍,作为一个熟悉和铺垫。