b2g/components/FxAccountsMgmtService.jsm

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:98c0a2878653
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
5 /**
6 * Some specific (certified) apps need to get access to certain Firefox Accounts
7 * functionality that allows them to manage accounts (this is mostly sign up,
8 * sign in, logout and delete) and get information about the currently existing
9 * ones.
10 *
11 * This service listens for requests coming from these apps, triggers the
12 * appropriate Fx Accounts flows and send reponses back to the UI.
13 *
14 * The communication mechanism is based in mozFxAccountsContentEvent (for
15 * messages coming from the UI) and mozFxAccountsChromeEvent (for messages
16 * sent from the chrome side) custom events.
17 */
18
19 "use strict";
20
21 this.EXPORTED_SYMBOLS = ["FxAccountsMgmtService"];
22
23 const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
24
25 Cu.import("resource://gre/modules/Services.jsm");
26 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
27 Cu.import("resource://gre/modules/FxAccountsCommon.js");
28
29 XPCOMUtils.defineLazyModuleGetter(this, "FxAccountsManager",
30 "resource://gre/modules/FxAccountsManager.jsm");
31
32 XPCOMUtils.defineLazyModuleGetter(this, "SystemAppProxy",
33 "resource://gre/modules/SystemAppProxy.jsm");
34
35 this.FxAccountsMgmtService = {
36 _onFulfill: function(aMsgId, aData) {
37 SystemAppProxy._sendCustomEvent("mozFxAccountsChromeEvent", {
38 id: aMsgId,
39 data: aData ? aData : null
40 });
41 },
42
43 _onReject: function(aMsgId, aReason) {
44 SystemAppProxy._sendCustomEvent("mozFxAccountsChromeEvent", {
45 id: aMsgId,
46 error: aReason ? aReason : null
47 });
48 },
49
50 init: function() {
51 Services.obs.addObserver(this, "content-start", false);
52 Services.obs.addObserver(this, ONLOGIN_NOTIFICATION, false);
53 Services.obs.addObserver(this, ONVERIFIED_NOTIFICATION, false);
54 Services.obs.addObserver(this, ONLOGOUT_NOTIFICATION, false);
55 },
56
57 observe: function(aSubject, aTopic, aData) {
58 log.debug("Observed " + aTopic);
59 switch (aTopic) {
60 case "content-start":
61 SystemAppProxy.addEventListener("mozFxAccountsContentEvent",
62 FxAccountsMgmtService);
63 Services.obs.removeObserver(this, "content-start");
64 break;
65 case ONLOGIN_NOTIFICATION:
66 case ONVERIFIED_NOTIFICATION:
67 case ONLOGOUT_NOTIFICATION:
68 // FxAccounts notifications have the form of fxaccounts:*
69 SystemAppProxy._sendCustomEvent("mozFxAccountsUnsolChromeEvent", {
70 eventName: aTopic.substring(aTopic.indexOf(":") + 1)
71 });
72 break;
73 }
74 },
75
76 handleEvent: function(aEvent) {
77 let msg = aEvent.detail;
78 log.debug("Got content msg " + JSON.stringify(msg));
79 let self = FxAccountsMgmtService;
80
81 if (!msg.id) {
82 return;
83 }
84
85 let data = msg.data;
86 if (!data) {
87 return;
88 }
89
90 switch(data.method) {
91 case "getAccounts":
92 FxAccountsManager.getAccount().then(
93 account => {
94 // We only expose the email and verification status so far.
95 self._onFulfill(msg.id, account);
96 },
97 reason => {
98 self._onReject(msg.id, reason);
99 }
100 ).then(null, Components.utils.reportError);
101 break;
102 case "logout":
103 FxAccountsManager.signOut().then(
104 () => {
105 self._onFulfill(msg.id);
106 },
107 reason => {
108 self._onReject(msg.id, reason);
109 }
110 ).then(null, Components.utils.reportError);
111 break;
112 case "queryAccount":
113 FxAccountsManager.queryAccount(data.accountId).then(
114 result => {
115 self._onFulfill(msg.id, result);
116 },
117 reason => {
118 self._onReject(msg.id, reason);
119 }
120 ).then(null, Components.utils.reportError);
121 break;
122 case "signIn":
123 case "signUp":
124 case "refreshAuthentication":
125 FxAccountsManager[data.method](data.accountId, data.password).then(
126 user => {
127 self._onFulfill(msg.id, user);
128 },
129 reason => {
130 self._onReject(msg.id, reason);
131 }
132 ).then(null, Components.utils.reportError);
133 break;
134 }
135 }
136 };
137
138 FxAccountsMgmtService.init();

mercurial