firefox调试记录6——Firefox主窗口创建过程研究
来源:互联网 发布:日本黑帮电影 知乎 编辑:程序博客网 时间:2024/06/05 03:56
到此为止,可以说已经到了firefox比较关键的地方了,其打开过程弄得比较清楚了,现在先来理清楚firefox是如何创建浏览器窗口,并最终展示在用户面前。这里先分析一下AppShell->Run()开始调用到消息循环开始这个过程。
当程序运行到~\firefox-8.0.source\toolkit\components\startup\nsAppRunner.cpp第35444行(在函数XRE_main里面)调用appStartup->Run()的时候,单步跟踪进去,发现该函数首先对环境进行了一下判断(如,有没有打开的firefox窗口,或者打开的窗口已经调用了推出函数),然后直接调用函数mAppShell->Run(),跟进这个函数。
函数mAppShell->Run()首先调用了mozilla::widget::StartAudioSession();函数,然后直接调用nsBaseAppShell::Run()。StartAudioSession()的功能是启用音频会话,跟进nsBaseAppShell::Run()函数。
该函数首先获取当前进程*thread = NS_GetCurrentThread();然后调用MessageLoop::current()->Run();,跟进这个函数。
MessageLoop::current()->Run()函数只有两句话:AutoRunState save_state(this);(保存当前状态)和RunHandler();(运行消息处理器),跟进RunHandler()。
RunHandler()就在Run()函数后面,直接调用其下面的函数RunInternal();
RunInternal()直接调用pump_->Run(this); pump_是一个MessagePump类的对象,其Run函数中有一个for循环,就是前面提到的消息处理循环。
当程序运行到~\firefox-8.0.source\toolkit\components\startup\nsAppRunner.cpp第35444行(在函数XRE_main里面)调用appStartup->Run()的时候,单步跟踪进去,发现该函数首先对环境进行了一下判断(如,有没有打开的firefox窗口,或者打开的窗口已经调用了推出函数),然后直接调用函数mAppShell->Run(),跟进这个函数。
函数mAppShell->Run()首先调用了mozilla::widget::StartAudioSession();函数,然后直接调用nsBaseAppShell::Run()。StartAudioSession()的功能是启用音频会话,跟进nsBaseAppShell::Run()函数。
该函数首先获取当前进程*thread = NS_GetCurrentThread();然后调用MessageLoop::current()->Run();,跟进这个函数。
MessageLoop::current()->Run()函数只有两句话:AutoRunState save_state(this);(保存当前状态)和RunHandler();(运行消息处理器),跟进RunHandler()。
RunHandler()就在Run()函数后面,直接调用其下面的函数RunInternal();
RunInternal()直接调用pump_->Run(this); pump_是一个MessagePump类的对象,其Run函数中有一个for循环,就是前面提到的消息处理循环。
上面这个过程的调用堆栈截图如下:
- firefox调试记录6——Firefox主窗口创建过程研究
- firefox调试记录8——小结
- firefox调试记录2——Firefox运行流程初步跟踪
- firefox调试记录3——其他情况的跟踪
- firefox调试记录7——打开与修改文件
- firefox调试记录1——用VS2010调试跟踪firefox8
- firefox调试记录4——关于跨进程的调试
- firefox调试
- firefox调试记录5——事先确定profile情况下的跟踪
- firefox附加组件开发者指南(五)——创建一个firefox扩展(上)
- firefox附加组件开发者指南(五)——创建一个firefox扩展(下)
- JavaScript调试工具——Firefox中的插件Firebug介绍
- firefox关闭窗口问题
- Firefox extension 隐藏窗口
- firefox
- Firefox
- FireFox
- firefox
- VMware6.5上使用NAT网络配置,解决虽能ping通本地IP且DNS正常但就是打不开网页的问题
- Android媒体使用总结
- 2011最流行的几句话,太精辟了
- 写给即将入行的程序员的一封信
- MediaScanner分析
- firefox调试记录6——Firefox主窗口创建过程研究
- Android多媒体扫描过程
- jQuery(3-5)删除节点
- Thinking in Shader(5)
- 【Mod】简便方法转移dalvik-cache,释放data空间!【已提供toSystem及卸载方法】
- ProgressBar
- 火狐4浏览器动态下载统计背后的SQL技术
- Extjs如何动态加载Extjs脚本
- firefox调试记录7——打开与修改文件