firefox調試記錄6——Firefox主窗口創建過程研究

到此爲止,可以說已經到了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循環,就是前面提到的消息處理循環。

上面這個過程的調用堆棧截圖如下:



發佈了32 篇原創文章 · 獲贊 83 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章