Firefox OS启动过程分析-Shell入口

本文深入探讨Firefox OS的启动过程,重点关注Shell的入口点。从b2g进程的初始化开始,详细阐述了如何从b2g.js加载shell.html,通过nsICommandLineHandler组件按顺序执行,并在nsDefaultCLH.js中触发Shell窗口的加载。
摘要由CSDN通过智能技术生成

本节介绍Firefox OS 初始化Shell的过程。

Firefox OS启动过程分析-b2g进程启动
一节中,b2g进程在初始化过程中就会在某点开始加载Shell入口(它是所有应用的container)

从b2g/app/b2g.js中,我们得知Shell的入口:

pref("toolkit.defaultChromeURI", "chrome://b2g/content/shell.html");

那么shell.html是何时加载的?

具体运行流程如下所示:

main
    |
    |-RunProcesses
          |
          |-b2g_main
                |
                |-do_main
                     |
                     |-XRE_main
                         |
                         |-XREMain::XRE_main
                             |
                             |-mScopedXPCOM->Initialize(); 
                             |   |
                             |   |-NS_InitXPCOM2
                             |
                             |-XREMain::XRE_mainRun()
                                  |
                                  |--mozilla::ipc::ProcLoaderClientGeckoInit();
                                  |
                                  |-cmdLine->Init(...)
                                  |
                                  |-cmdLine->Run();    ((toolkit/components/commandlines/nsCommandLine.cpp))
                                  |    |
                                  |    |-nsCommandLine::EnumerateValidators
                                  |    |
                                  |    |-nsCommandLine::EnumerateHandlers
                                  |        |
                                  |        |-EnumRun
                                  |             |
                                  |             **|-nsICommandLineHandler->Handle**
                                  |    
                                  |
                                  |-appStartup->Run()
                                      |
                                      |-mAppShell->Run(); 
                                            |
                                            |-MessageLoop::current()->Run();

即,Shell入口(chrome://b2g/content/shell.html)是在

cmdLine->Run();

中开始加载的。

在该函数中:

cmdLine->Run()
    |
    |-nsCommandLine::EnumerateValidators
    |
    |-nsCommandLine::EnumerateHandlers
          |
          |-EnumRun
                  |
                  |-nsICommandLineHandler->Handle
nsCommandLine::EnumerateHandlers(...)

会按照字母顺序(见nsICommandLineHandler.idl)枚举所有category是”command-line-handler”的xpcom组件,这些xpcom组件都基于nsICommandLineHandler。

将xpcom组件传入EnumRun中:

static nsresult
EnumRun(nsICommandLineHandler* aHandler, nsICommandLine* aThis, void*)
{
  return aHandler->Handle(aThis);
}

开始执行nsICommandLineHandler->Handle。

看下nsICommandLineHandler.idl的说明

The entries in this category are read in alphabetical order, and each category value is treated as a service contractid implementing this interface.

说明,这些xpcom组件是按照category的字母排序的。

那么有哪些category是”command-line-handler”的xpcom组件呢?搜素下源码,包括:

category command-line-handler m-b2goop @mozilla.org/commandlinehandler/general-startup;1?type=b2goop
category command-line-handler m-b2gcmds @mozilla.org/commandlinehandler/general-startup;1?type=b2gcmds
category command-line-handler m-b2gbootstrap @mozilla.org/commandlinehandler/general-startup;1?type=b2gbootstrap
category command-line-handler a-webide @mozilla.org/browser/webide-clh;1
category command-line-handler m-setdefaultbrowser @mozilla.org/browser/default-browser-clh;1
category command-line-handler m-browser @mozilla.org/browser/clh;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
category command-line-handler x-default @mozilla.org/browser/final-clh;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
category command-line-handler m-recording @mozilla.org/commandlinehandler/general-startup;1?type=recording
category command-line-handler m-reftest @mozilla.org/commandlinehandler/general-startup;1?type=reftest
category command-line-handler x-browser @mozilla.org/browser/browser-clh;1
category command-line-handler m-browser @mozilla.org/browser/clh;
category command-line-handler m-tps @mozilla.org/commandlinehandler/general-startup;1?type=tps
category command-line-handler m-tp @mozilla.org/commandlinehandler/general-startup;1?type=tp
category command-line-handler b-marionette @mozilla.org/marionette;1
category command-line-handler y-default @mozilla.org/toolkit/default-clh;1
category command-line-handler b-jsconsole @mozilla.org/toolkit/console-clh;1
category command-line-handler x-default @mozilla.org/webapprt/clh;1

搜索下toolkit.defaultChromeURI,我们得知:Shell入口是在gecko/toolkit/components/nsDefaultCLH.js中开始加载的:

    // if the pref is missing, ignore the exception 
    try {
      var chromeURI = prefs.getCharPref("toolkit.defaultChromeURI");

      var flags = "chrome,dialog=no,all";
      try {
        flags = prefs.getCharPref("toolkit.defaultChromeFeatures");
      }
      catch (e) { }

      var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
                            .getService(nsIWindowWatcher);
      wwatch.openWindow(null, chromeURI, "_blank",
                        flags, cmdLine);
    }
    catch (e) { }

最后调用

      wwatch.openWindow(null, chromeURI, "_blank",
                        flags, cmdLine);

开始加载Shell窗口。

其中,nsDefaultCLH.manifest:

component {6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344} nsDefaultCLH.js
contract @mozilla.org/toolkit/default-clh;1 {6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344}
category command-line-handler y-default @mozilla.org/toolkit/default-clh;1

加载:

chrome://b2g/content/shell.html

都干了点啥?下节再进行分析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值