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循环,就是前面提到的消息处理循环。

上面这个过程的调用堆栈截图如下:



原创粉丝点击