Bumping manifests a=b2g-bump
[gecko.git] / dom / nfc / nsNfc.js
blob907c11caf83c21f603717fc593c73f18be9b89a3
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/. */
5 /* Copyright © 2013, Deutsche Telekom, Inc. */
7 "use strict";
9 const DEBUG = false;
10 function debug(s) {
11   if (DEBUG) dump("-*- Nfc DOM: " + s + "\n");
14 const Cc = Components.classes;
15 const Ci = Components.interfaces;
16 const Cu = Components.utils;
18 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
19 Cu.import("resource://gre/modules/Services.jsm");
21 XPCOMUtils.defineLazyServiceGetter(this,
22                                    "appsService",
23                                    "@mozilla.org/AppsService;1",
24                                    "nsIAppsService");
25 const NFC_PEER_EVENT_READY = 0x01;
26 const NFC_PEER_EVENT_LOST  = 0x02;
28 /**
29  * NFCTag
30  */
31 function MozNFCTag() {
32   debug("In MozNFCTag Constructor");
33   this._nfcContentHelper = Cc["@mozilla.org/nfc/content-helper;1"]
34                              .getService(Ci.nsINfcContentHelper);
35   this.session = null;
37   // Map WebIDL declared enum map names to integer
38   this._techTypesMap = [];
39   this._techTypesMap['NFC_A'] = 0;
40   this._techTypesMap['NFC_B'] = 1;
41   this._techTypesMap['NFC_ISO_DEP'] = 2;
42   this._techTypesMap['NFC_F'] = 3;
43   this._techTypesMap['NFC_V'] = 4;
44   this._techTypesMap['NDEF'] = 5;
45   this._techTypesMap['NDEF_FORMATABLE'] = 6;
46   this._techTypesMap['MIFARE_CLASSIC'] = 7;
47   this._techTypesMap['MIFARE_ULTRALIGHT'] = 8;
48   this._techTypesMap['NFC_BARCODE'] = 9;
49   this._techTypesMap['P2P'] = 10;
51 MozNFCTag.prototype = {
52   _nfcContentHelper: null,
53   _window: null,
55   initialize: function(aWindow, aSessionToken) {
56     this._window = aWindow;
57     this.session = aSessionToken;
58   },
60   _techTypesMap: null,
62   // NFCTag interface:
63   readNDEF: function readNDEF() {
64     return this._nfcContentHelper.readNDEF(this._window, this.session);
65   },
66   writeNDEF: function writeNDEF(records) {
67     return this._nfcContentHelper.writeNDEF(this._window, records, this.session);
68   },
69   makeReadOnlyNDEF: function makeReadOnlyNDEF() {
70     return this._nfcContentHelper.makeReadOnlyNDEF(this._window, this.session);
71   },
73   classID: Components.ID("{4e1e2e90-3137-11e3-aa6e-0800200c9a66}"),
74   contractID: "@mozilla.org/nfc/NFCTag;1",
75   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
76                                          Ci.nsIDOMGlobalPropertyInitializer]),
79 /**
80  * NFCPeer
81  */
82 function MozNFCPeer() {
83   debug("In MozNFCPeer Constructor");
84   this._nfcContentHelper = Cc["@mozilla.org/nfc/content-helper;1"]
85                              .getService(Ci.nsINfcContentHelper);
86   this.session = null;
88 MozNFCPeer.prototype = {
89   _nfcContentHelper: null,
90   _window: null,
91   _isLost: false,
93   initialize: function(aWindow, aSessionToken) {
94     this._window = aWindow;
95     this.session = aSessionToken;
96   },
98   // NFCPeer interface:
99   sendNDEF: function sendNDEF(records) {
100     if (this._isLost) {
101       throw new this._window.DOMError("InvalidStateError", "NFCPeer object is invalid");
102     }
104     // Just forward sendNDEF to writeNDEF
105     return this._nfcContentHelper.writeNDEF(this._window, records, this.session);
106   },
108   sendFile: function sendFile(blob) {
109     if (this._isLost) {
110       throw new this._window.DOMError("InvalidStateError", "NFCPeer object is invalid");
111     }
113     let data = {
114       "blob": blob
115     };
116     return this._nfcContentHelper.sendFile(this._window,
117                                            Cu.cloneInto(data, this._window),
118                                            this.session);
119   },
121   invalidate: function invalidate() {
122     this._isLost = true;
123   },
125   classID: Components.ID("{c1b2bcf0-35eb-11e3-aa6e-0800200c9a66}"),
126   contractID: "@mozilla.org/nfc/NFCPeer;1",
127   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
128                                          Ci.nsIDOMGlobalPropertyInitializer]),
132  * Navigator NFC object
133  */
134 function mozNfc() {
135   debug("In mozNfc Constructor");
136   try {
137     this._nfcContentHelper = Cc["@mozilla.org/nfc/content-helper;1"]
138                                .getService(Ci.nsINfcContentHelper);
139   } catch(e) {
140     debug("No NFC support.")
141   }
143   this._nfcContentHelper.registerPeerEventListener(this);
145 mozNfc.prototype = {
146   _nfcContentHelper: null,
147   _window: null,
148   nfcObject: null,
150   init: function init(aWindow) {
151     debug("mozNfc init called");
152     this._window = aWindow;
153   },
155   // Only apps which have nfc-manager permission can call the following interfaces
156   // 'checkP2PRegistration' , 'notifyUserAcceptedP2P' , 'notifySendFileStatus',
157   // 'startPoll', 'stopPoll', and 'powerOff'.
158   checkP2PRegistration: function checkP2PRegistration(manifestUrl) {
159     // Get the AppID and pass it to ContentHelper
160     let appID = appsService.getAppLocalIdByManifestURL(manifestUrl);
161     return this._nfcContentHelper.checkP2PRegistration(this._window, appID);
162   },
164   notifyUserAcceptedP2P: function notifyUserAcceptedP2P(manifestUrl) {
165     let appID = appsService.getAppLocalIdByManifestURL(manifestUrl);
166     // Notify chrome process of user's acknowledgement
167     this._nfcContentHelper.notifyUserAcceptedP2P(this._window, appID);
168   },
170   notifySendFileStatus: function notifySendFileStatus(status, requestId) {
171     this._nfcContentHelper.notifySendFileStatus(this._window,
172                                                 status, requestId);
173   },
175   startPoll: function startPoll() {
176     return this._nfcContentHelper.startPoll(this._window);
177   },
179   stopPoll: function stopPoll() {
180     return this._nfcContentHelper.stopPoll(this._window);
181   },
183   powerOff: function powerOff() {
184     return this._nfcContentHelper.powerOff(this._window);
185   },
187   getNFCTag: function getNFCTag(sessionToken) {
188     let obj = new MozNFCTag();
189     obj.initialize(this._window, sessionToken);
190     if (this._nfcContentHelper.checkSessionToken(sessionToken)) {
191       return this._window.MozNFCTag._create(this._window, obj);
192     }
193     return null;
194   },
196   getNFCPeer: function getNFCPeer(sessionToken) {
197     if (!sessionToken || !this._nfcContentHelper.checkSessionToken(sessionToken)) {
198       return null;
199     }
201     if (!this.nfcObject || this.nfcObject.session != sessionToken) {
202       let obj = new MozNFCPeer();
203       obj.initialize(this._window, sessionToken);
204       this.nfcObject = obj;
205       this.nfcObject.contentObject = this._window.MozNFCPeer._create(this._window, obj);
206     }
208     return this.nfcObject.contentObject;
209   },
211   // get/set onpeerready
212   get onpeerready() {
213     return this.__DOM_IMPL__.getEventHandler("onpeerready");
214   },
216   set onpeerready(handler) {
217     this.__DOM_IMPL__.setEventHandler("onpeerready", handler);
218   },
220   // get/set onpeerlost
221   get onpeerlost() {
222     return this.__DOM_IMPL__.getEventHandler("onpeerlost");
223   },
225   set onpeerlost(handler) {
226     this.__DOM_IMPL__.setEventHandler("onpeerlost", handler);
227   },
229   eventListenerWasAdded: function(evt) {
230     let eventType = this.getEventType(evt);
231     if (eventType != NFC_PEER_EVENT_READY) {
232       return;
233     }
235     let appId = this._window.document.nodePrincipal.appId;
236     this._nfcContentHelper.registerTargetForPeerReady(this._window, appId);
237   },
239   eventListenerWasRemoved: function(evt) {
240     let eventType = this.getEventType(evt);
241     if (eventType != NFC_PEER_EVENT_READY) {
242       return;
243     }
245     let appId = this._window.document.nodePrincipal.appId;
246     this._nfcContentHelper.unregisterTargetForPeerReady(this._window, appId);
247   },
249   notifyPeerReady: function notifyPeerReady(sessionToken) {
250     if (this.hasDeadWrapper()) {
251       dump("this._window or this.__DOM_IMPL__ is a dead wrapper.");
252       return;
253     }
255     this.session = sessionToken;
257     debug("fire onpeerready sessionToken : " + sessionToken);
258     let eventData = {
259       "peer":this.getNFCPeer(sessionToken)
260     };
261     let event = new this._window.MozNFCPeerEvent("peerready", eventData);
262     this.__DOM_IMPL__.dispatchEvent(event);
263   },
265   notifyPeerLost: function notifyPeerLost(sessionToken) {
266     if (this.hasDeadWrapper()) {
267       dump("this._window or this.__DOM_IMPL__ is a dead wrapper.");
268       return;
269     }
271     if (sessionToken != this.session) {
272       dump("Unpaired session for notifyPeerLost." + sessionToken);
273       return;
274     }
276     if (this.nfcObject && (this.nfcObject.session == sessionToken)) {
277       this.nfcObject.invalidate();
278       this.nfcObject = null;
279     }
281     this.session = null;
283     debug("fire onpeerlost");
284     let event = new this._window.Event("peerlost");
285     this.__DOM_IMPL__.dispatchEvent(event);
286   },
288   getEventType: function getEventType(evt) {
289     let eventType = -1;
290     switch (evt) {
291       case 'peerready':
292         eventType = NFC_PEER_EVENT_READY;
293         break;
294       case 'peerlost':
295         eventType = NFC_PEER_EVENT_LOST;
296         break;
297       default:
298         break;
299     }
300     return eventType;
301   },
303   hasDeadWrapper: function hasDeadWrapper() {
304     return Cu.isDeadWrapper(this._window) || Cu.isDeadWrapper(this.__DOM_IMPL__);
305   },
307   classID: Components.ID("{6ff2b290-2573-11e3-8224-0800200c9a66}"),
308   contractID: "@mozilla.org/navigatorNfc;1",
309   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
310                                          Ci.nsIDOMGlobalPropertyInitializer,
311                                          Ci.nsINfcPeerEventListener]),
314 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MozNFCTag, MozNFCPeer, mozNfc]);