SystemUpdateManager.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  3. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. "use strict";
  5. const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
  6. Cu.import("resource://gre/modules/XPCOMUtils.jsm");
  7. Cu.import("resource://gre/modules/Services.jsm");
  8. Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
  9. var debug = Services.prefs.getBoolPref("dom.system_update.debug")
  10. ? (aMsg) => dump("-*- SystemUpdateManager.js : " + aMsg + "\n")
  11. : (aMsg) => {};
  12. const SYSTEMUPDATEPROVIDER_CID = Components.ID("{11fbea3d-fd94-459a-b8fb-557fe19e473a}");
  13. const SYSTEMUPDATEMANAGER_CID = Components.ID("{e8530001-ba5b-46ab-a306-7fbeb692d0fe}");
  14. const SYSTEMUPDATEMANAGER_CONTRACTID = "@mozilla.org/system-update-manager;1";
  15. XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
  16. "@mozilla.org/childprocessmessagemanager;1",
  17. "nsISyncMessageSender");
  18. function SystemUpdateProvider(win, provider) {
  19. this.initDOMRequestHelper(win, [
  20. {name: "SystemUpdate:OnUpdateAvailable", weakRef: true},
  21. {name: "SystemUpdate:OnProgress", weakRef: true},
  22. {name: "SystemUpdate:OnUpdateReady", weakRef: true},
  23. {name: "SystemUpdate:OnError", weakRef: true},
  24. ]);
  25. this._provider = Cu.cloneInto(provider, win);
  26. }
  27. SystemUpdateProvider.prototype = {
  28. __proto__: DOMRequestIpcHelper.prototype,
  29. classID: SYSTEMUPDATEPROVIDER_CID,
  30. QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference,
  31. Ci.nsIObserver]),
  32. receiveMessage: function(aMsg) {
  33. if (!aMsg || !aMsg.json) {
  34. return;
  35. }
  36. let json = aMsg.json;
  37. if (json.uuid !== this._provider.uuid) {
  38. return;
  39. }
  40. debug("receive msg: " + aMsg.name);
  41. switch (aMsg.name) {
  42. case "SystemUpdate:OnUpdateAvailable": {
  43. let detail = {
  44. detail: {
  45. packageInfo: json.packageInfo
  46. }
  47. };
  48. let event = new this._window.CustomEvent("updateavailable",
  49. Cu.cloneInto(detail, this._window));
  50. this.__DOM_IMPL__.dispatchEvent(event);
  51. break;
  52. }
  53. case "SystemUpdate:OnProgress": {
  54. let event = new this._window.ProgressEvent("progress", {lengthComputable: true,
  55. loaded: json.loaded,
  56. total: json.total});
  57. this.__DOM_IMPL__.dispatchEvent(event);
  58. break;
  59. }
  60. case "SystemUpdate:OnUpdateReady": {
  61. let event = new this._window.Event("updateready");
  62. this.__DOM_IMPL__.dispatchEvent(event);
  63. break;
  64. }
  65. case "SystemUpdate:OnError": {
  66. let event = new this._window.ErrorEvent("error", {message: json.message});
  67. this.__DOM_IMPL__.dispatchEvent(event);
  68. break;
  69. }
  70. }
  71. },
  72. destroy: function() {
  73. this.destroyDOMRequestHelper();
  74. },
  75. get name() {
  76. return this._provider.name;
  77. },
  78. get uuid() {
  79. return this._provider.uuid;
  80. },
  81. get onupdateavailable() {
  82. return this.__DOM_IMPL__.getEventHandler("onupdateavailable");
  83. },
  84. set onupdateavailable(aHandler) {
  85. this.__DOM_IMPL__.setEventHandler("onupdateavailable", aHandler);
  86. },
  87. get onprogress() {
  88. return this.__DOM_IMPL__.getEventHandler("onprogress");
  89. },
  90. set onprogress(aHandler) {
  91. this.__DOM_IMPL__.setEventHandler("onprogress", aHandler);
  92. },
  93. get onupdateready() {
  94. return this.__DOM_IMPL__.getEventHandler("onupdateready");
  95. },
  96. set onupdateready(aHandler) {
  97. this.__DOM_IMPL__.setEventHandler("onupdateready", aHandler);
  98. },
  99. get onerror() {
  100. return this.__DOM_IMPL__.getEventHandler("onerror");
  101. },
  102. set onerror(aHandler) {
  103. this.__DOM_IMPL__.setEventHandler("onerror", aHandler);
  104. },
  105. checkForUpdate: function() {
  106. let self = this;
  107. cpmm.sendAsyncMessage("SystemUpdate:CheckForUpdate", {
  108. uuid: self._provider.uuid
  109. });
  110. },
  111. startDownload: function() {
  112. let self = this;
  113. cpmm.sendAsyncMessage("SystemUpdate:StartDownload", {
  114. uuid: self._provider.uuid
  115. });
  116. },
  117. stopDownload: function() {
  118. let self = this;
  119. cpmm.sendAsyncMessage("SystemUpdate:StopDownload", {
  120. uuid: self._provider.uuid
  121. });
  122. },
  123. applyUpdate: function() {
  124. let self = this;
  125. cpmm.sendAsyncMessage("SystemUpdate:ApplyUpdate", {
  126. uuid: self._provider.uuid
  127. });
  128. },
  129. setParameter: function(aName, aValue) {
  130. let self = this;
  131. return cpmm.sendSyncMessage("SystemUpdate:SetParameter", {
  132. uuid: self._provider.uuid,
  133. name: aName,
  134. value: aValue
  135. })[0];
  136. },
  137. getParameter: function(aName) {
  138. let self = this;
  139. return cpmm.sendSyncMessage("SystemUpdate:GetParameter", {
  140. uuid: self._provider.uuid,
  141. name: aName
  142. })[0];
  143. },
  144. };
  145. function SystemUpdateManager() {}
  146. SystemUpdateManager.prototype = {
  147. __proto__: DOMRequestIpcHelper.prototype,
  148. classID: SYSTEMUPDATEMANAGER_CID,
  149. QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference,
  150. Ci.nsIObserver,
  151. Ci.nsIDOMGlobalPropertyInitializer]),
  152. receiveMessage: function(aMsg) {
  153. if (!aMsg || !aMsg.json) {
  154. return;
  155. }
  156. let json = aMsg.json;
  157. let resolver = this.takePromiseResolver(json.requestId);
  158. if (!resolver) {
  159. return;
  160. }
  161. debug("receive msg: " + aMsg.name);
  162. switch (aMsg.name) {
  163. case "SystemUpdate:GetProviders:Result:OK": {
  164. resolver.resolve(Cu.cloneInto(json.providers, this._window));
  165. break;
  166. }
  167. case "SystemUpdate:SetActiveProvider:Result:OK":
  168. case "SystemUpdate:GetActiveProvider:Result:OK": {
  169. let updateProvider = new SystemUpdateProvider(this._window, json.provider);
  170. resolver.resolve(this._window.SystemUpdateProvider._create(this._window,
  171. updateProvider));
  172. break;
  173. }
  174. case "SystemUpdate:GetProviders:Result:Error":
  175. case "SystemUpdate:GetActiveProvider:Result:Error":
  176. case "SystemUpdate:SetActiveProvider:Result:Error": {
  177. resolver.reject(json.error);
  178. break;
  179. }
  180. }
  181. },
  182. init: function(aWindow) {
  183. this.initDOMRequestHelper(aWindow, [
  184. {name: "SystemUpdate:GetProviders:Result:OK", weakRef: true},
  185. {name: "SystemUpdate:GetProviders:Result:Error", weakRef: true},
  186. {name: "SystemUpdate:GetActiveProvider:Result:OK", weakRef: true},
  187. {name: "SystemUpdate:GetActiveProvider:Result:Error", weakRef: true},
  188. {name: "SystemUpdate:SetActiveProvider:Result:OK", weakRef: true},
  189. {name: "SystemUpdate:SetActiveProvider:Result:Error", weakRef: true},
  190. ]);
  191. },
  192. uninit: function() {
  193. let self = this;
  194. this.forEachPromiseResolver(function(aKey) {
  195. self.takePromiseResolver(aKey).reject("SystemUpdateManager got destroyed");
  196. });
  197. },
  198. getProviders: function() {
  199. return this.createPromiseWithId(function(aResolverId) {
  200. cpmm.sendAsyncMessage("SystemUpdate:GetProviders", {
  201. requestId: aResolverId,
  202. });
  203. });
  204. },
  205. getActiveProvider: function() {
  206. return this.createPromiseWithId(function(aResolverId) {
  207. cpmm.sendAsyncMessage("SystemUpdate:GetActiveProvider", {
  208. requestId: aResolverId,
  209. });
  210. });
  211. },
  212. setActiveProvider: function(aUuid) {
  213. return this.createPromiseWithId(function(aResolverId) {
  214. cpmm.sendAsyncMessage("SystemUpdate:SetActiveProvider", {
  215. requestId: aResolverId,
  216. uuid: aUuid
  217. });
  218. });
  219. }
  220. };
  221. this.NSGetFactory = XPCOMUtils.generateNSGetFactory([SystemUpdateManager]);