(FFOS Gecko & Gaia) OTA - 进入Gecko层

  代码位置:gecko/b2g/components/UpdatePrompt.js

  SystemApp发出‘force-update-check‘事件,也就从gaia进入到了gecko层。

1. 首先大概介绍一下UpdatePrompt.js。

  (a) UpdatePrompt.js里包含了2个对象,分别是UpdatePrompt和UpdateCheckListener。

  (b) UpdatePrompt实现了“@mozilla.org/updates/update-prompt;1”这个XPCOM组件。在gecko/b2g/components/B2GComponents.manifest中有注册:

#ifdef MOZ_UPDATER
# UpdatePrompt.js
component {88b3eb21-d072-4e3b-886d-f89d8c49fe59} UpdatePrompt.js
contract @mozilla.org/updates/update-prompt;1 {88b3eb21-d072-4e3b-886d-f89d8c49fe59}
category system-update-provider MozillaProvider @mozilla.org/updates/update-prompt;1,{88b3eb21-d072-4e3b-886d-f89d8c49fe59}
#endif

  (c) UpdatePrompt还实现了5个interface,分别是nsISystemUpdateProvider、nsIUpdatePrompt、nsIObserver、nsIRequestObserver和nsIProgressEventSink。

  (d) UpdateCheckListener实现了nsIUpdateCheckListener。

2. “@mozilla.org/updates/update-prompt;1”在B2G启动后会自动被加载,代码在gecko/b2g/chrome/content/shell.js中:

window.addEventListener(‘ContentStart‘, function update_onContentStart() {
  Cu.import(‘resource://gre/modules/WebappsUpdater.jsm‘);
  WebappsUpdater.handleContentStart(shell);

  let promptCc = Cc["@mozilla.org/updates/update-prompt;1"];
  if (!promptCc) {
    return;
  }

  let updatePrompt = promptCc.createInstance(Ci.nsIUpdatePrompt);
  if (!updatePrompt) {
    return;
  }

  updatePrompt.wrappedJSObject.handleContentStart(shell);
});

3. handleContentStart:

  通过SystemAppProxy注册event listener来监听‘mozContentEvent’。

handleContentStart: function UP_handleContentStart() {
  SystemAppProxy.addEventListener("mozContentEvent", this);
},

4. SystemAppProxy的代码位置在:gecko/b2g/components/SystemAppProxy.jsm

// Listen for dom events on the system app
addEventListener: function systemApp_addEventListener() {
  let content = this._frame ? this._frame.contentWindow : null;
  if (!content) {
    this._pendingListeners.push(arguments);
    return false;
  }

  content.addEventListener.apply(content, arguments);
  return true;
},

5. UpdatePrompt.handleEvent

  上一步注册了mozContentEvent的监听,handleEvent是回调函数,主要对4种消息进行处理。其中‘force-update-check’正是上一篇分析的从SystemApp发送过来的event。此时OTA流程从gaia走到了gecko中。

handleEvent: function UP_handleEvent(evt) {
  if (evt.type !== "mozContentEvent") {
    return;
  }

  let detail = evt.detail;
  if (!detail) {
    return;
  }

  switch (detail.type) {
    case "force-update-check":
      this.forceUpdateCheck();
      break;
    case "update-available-result":
      this.handleAvailableResult(detail);
      // If we started the apply prompt timer, this means that we‘re waiting
      // for the user to press Later or Install Now. In this situation we
      // don‘t want to clear this._update, becuase handleApplyPromptResult
      // needs it.
      if (this._applyPromptTimer == null && !this._waitingForIdle) {
        this._update = null;
      }
      break;
    case "update-download-cancel":
      this.handleDownloadCancel();
      break;
    case "update-prompt-apply-result":
      this.handleApplyPromptResult(detail);
      break;
  }
},

6. UpdatePrompt.forceUpdateCheck函数

  check的工作交给了另外一个XPCOM组件"@mozilla.org/updates/update-checker;1",调用它的checkForUpdates函数,并传递一个UpdateCheckListener进去,这个UpdateCheckListener是UpdatePrompt对象初始化时,内部new出来的,用于接收checker的事件回调。

forceUpdateCheck: function UP_forceUpdateCheck() {
  log("Forcing update check");

  let checker = Cc["@mozilla.org/updates/update-checker;1"]
                  .createInstance(Ci.nsIUpdateChecker);
  checker.checkForUpdates(this._updateCheckListener, true);
},
时间: 2024-10-14 07:17:21

(FFOS Gecko & Gaia) OTA - 进入Gecko层的相关文章

(FFOS Gecko & Gaia) OTA - Do real check

虽然代码分析了很多,但是还没有真正做check的工作,下面就来找到真正的checker. 代码位置:gecko/toolkit/mozapps/update/nsUpdateService.js.参考之前的(FFOS Gecko & Gaia) OTA - 代码模块总览,nsUpdateService.js中的Checker对象,实现了nsIUpdateChecker这个interface.下面就来分析Checker对象的实现. 1.  checkForUpdates函数: 实现略长,在代码中添

(FFOS Gecko & Gaia) OTA - 代码模块总览

OTA整体框架里会涉及以下代码,从gaia到gecko都有,而且由于历史原因,复用了desktop browser的一些模块,还有一些冗余代码,分析时走了不少弯路. 1. Gaia部分 (a) gaia/apps/settings/js/panels/about/update_check.js 这个Settings中OTA功能的入口,通过AMD(Asynchronous Module Definition)规范,定义了一个模块UpdateCheck. (b) gaia/apps/system/j

(FFOS Gecko & Gaia) OTA - 又回到UpdatePrompt

当download完成时,又回到了UpdatePrompt,因为此时需要提示user下载完成,确认apply. 1. UpdatePrompt.showUpdateDownloaded showUpdateDownloaded: function UP_showUpdateDownloaded(aUpdate, aBackground) { if (this._systemUpdateListener) { this._systemUpdateListener.onUpdateReady();

(FFOS Gecko & Gaia) OTA - 重回Gaia层

SystemApp中的UpdateManager作为gaia和gecko的通信桥梁,会接收gecko中UpdatePrompt发送的'update-available'事件. 1. UpdateManager.handleEvent var detail = evt.detail; if (detail.type && detail.type === 'update-available') { // systemUpdatable是在UpdateManager初始化时new出来的,Upda

(FFOS Gecko & Gaia) OTA - 关键的apply

这篇分析已经是尾声了,在UpdatePrompt中,调用了UpdateService的applyOsUpdate函数. 1. UpdateService.applyOsUpdate 这个函数很简单,就是获取到update.zip以后,调用recovery service去完成更新. applyOsUpdate: function AUS_applyOsUpdate(aUpdate) { if (!aUpdate.isOSUpdate || aUpdate.state != STATE_APPLI

(FFOS Gecko & Gaia) OTA - 转移至System App

代码位置:gaia/apps/system/js/update_manager.js 1. update_manager.js向全局的window对象导出了一个对象UpdateManager,其他的js module可以直接访问UpdateManager. exports.UpdateManager = UpdateManager; 2. UpdateManager监听了settings app中对于‘gaia.system.checkForUpdates’的设置,也就是当‘gaia.syste

(FFOS Gecko & Gaia) OTA - 真正的download

前面分析了这么多,还没有真正的走到download流程.这篇就去了解真正的downloader. 1. UpdateService.downloadUpdate 看来这正的worker就是最后new出来的Downloader. downloadUpdate: function AUS_downloadUpdate(update, background) { if (!update) throw Cr.NS_ERROR_NULL_POINTER; // Don't download the upd

(FFOS Gecko & Gaia) OTA - 处理check结果

当通过Checker检测到update以后,会通知UpdatePrompt中的updateCheckListener. 1. UpdateCheckListener.onCheckComplete onCheckComplete: function UCL_onCheckComplete(request, updates, updateCount) { if (Services.um.activeUpdate) { // We're actively downloading an update,

Firefox OS简介

Firefox OS系统架构框图 一些Firefox相关的术语简介: B2G Boot to Gecko 的简称. Boot to Gecko Firefox OS 操作系统的工程代号. 因为在该项目拥有官方名称之前B2G已经使用了很久的原因,它经常用于指代 Firefox OS. Firefox OS FIrefox OS 基本上是指 Mozilla及合作伙伴应用在 B2G上的品牌和服务支持, 最终将创建一个发布的产品. Gaia Firefox OS 平台的用户接口层.屏幕启动时渲染到屏幕上