dom/nfc/nsNfc.js

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     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");
    12 }
    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");
    20 Cu.import("resource://gre/modules/ObjectWrapper.jsm");
    22 XPCOMUtils.defineLazyServiceGetter(this,
    23                                    "appsService",
    24                                    "@mozilla.org/AppsService;1",
    25                                    "nsIAppsService");
    26 const NFC_PEER_EVENT_READY = 0x01;
    27 const NFC_PEER_EVENT_LOST  = 0x02;
    29 /**
    30  * NFCTag
    31  */
    32 function MozNFCTag() {
    33   debug("In MozNFCTag Constructor");
    34   this._nfcContentHelper = Cc["@mozilla.org/nfc/content-helper;1"]
    35                              .getService(Ci.nsINfcContentHelper);
    36   this.session = null;
    38   // Map WebIDL declared enum map names to integer
    39   this._techTypesMap = [];
    40   this._techTypesMap['NFC_A'] = 0;
    41   this._techTypesMap['NFC_B'] = 1;
    42   this._techTypesMap['NFC_ISO_DEP'] = 2;
    43   this._techTypesMap['NFC_F'] = 3;
    44   this._techTypesMap['NFC_V'] = 4;
    45   this._techTypesMap['NDEF'] = 5;
    46   this._techTypesMap['NDEF_FORMATABLE'] = 6;
    47   this._techTypesMap['MIFARE_CLASSIC'] = 7;
    48   this._techTypesMap['MIFARE_ULTRALIGHT'] = 8;
    49   this._techTypesMap['NFC_BARCODE'] = 9;
    50   this._techTypesMap['P2P'] = 10;
    51 }
    52 MozNFCTag.prototype = {
    53   _nfcContentHelper: null,
    54   _window: null,
    56   initialize: function(aWindow, aSessionToken) {
    57     this._window = aWindow;
    58     this.setSessionToken(aSessionToken);
    59   },
    61   // ChromeOnly interface
    62   setSessionToken: function setSessionToken(aSessionToken) {
    63     debug("Setting session token.");
    64     this.session = aSessionToken;
    65     // report to NFC worker:
    66     this._nfcContentHelper.setSessionToken(aSessionToken);
    67   },
    69   _techTypesMap: null,
    71   // NFCTag interface:
    72   getDetailsNDEF: function getDetailsNDEF() {
    73     return this._nfcContentHelper.getDetailsNDEF(this._window, this.session);
    74   },
    75   readNDEF: function readNDEF() {
    76     return this._nfcContentHelper.readNDEF(this._window, this.session);
    77   },
    78   writeNDEF: function writeNDEF(records) {
    79     return this._nfcContentHelper.writeNDEF(this._window, records, this.session);
    80   },
    81   makeReadOnlyNDEF: function makeReadOnlyNDEF() {
    82     return this._nfcContentHelper.makeReadOnlyNDEF(this._window, this.session);
    83   },
    84   connect: function connect(enum_tech_type) {
    85     let int_tech_type = this._techTypesMap[enum_tech_type];
    86     return this._nfcContentHelper.connect(this._window, int_tech_type, this.session);
    87   },
    88   close: function close() {
    89     return this._nfcContentHelper.close(this._window, this.session);
    90   },
    92   classID: Components.ID("{4e1e2e90-3137-11e3-aa6e-0800200c9a66}"),
    93   contractID: "@mozilla.org/nfc/NFCTag;1",
    94   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
    95                                          Ci.nsIDOMGlobalPropertyInitializer]),
    96 };
    98 /**
    99  * NFCPeer
   100  */
   101 function MozNFCPeer() {
   102   debug("In MozNFCPeer Constructor");
   103   this._nfcContentHelper = Cc["@mozilla.org/nfc/content-helper;1"]
   104                              .getService(Ci.nsINfcContentHelper);
   105   this.session = null;
   106 }
   107 MozNFCPeer.prototype = {
   108   _nfcContentHelper: null,
   109   _window: null,
   111   initialize: function(aWindow, aSessionToken) {
   112     this._window = aWindow;
   113     this.setSessionToken(aSessionToken);
   114   },
   116   // ChromeOnly interface
   117   setSessionToken: function setSessionToken(aSessionToken) {
   118     debug("Setting session token.");
   119     this.session = aSessionToken;
   120     // report to NFC worker:
   121     return this._nfcContentHelper.setSessionToken(aSessionToken);
   122   },
   124   // NFCPeer interface:
   125   sendNDEF: function sendNDEF(records) {
   126     // Just forward sendNDEF to writeNDEF
   127     return this._nfcContentHelper.writeNDEF(this._window, records, this.session);
   128   },
   130   sendFile: function sendFile(blob) {
   131     let data = {
   132       "blob": blob
   133     };
   134     return this._nfcContentHelper.sendFile(this._window,
   135                                            Cu.cloneInto(data, this._window),
   136                                            this.session);
   137   },
   139   classID: Components.ID("{c1b2bcf0-35eb-11e3-aa6e-0800200c9a66}"),
   140   contractID: "@mozilla.org/nfc/NFCPeer;1",
   141   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
   142                                          Ci.nsIDOMGlobalPropertyInitializer]),
   143 };
   145 /**
   146  * Navigator NFC object
   147  */
   148 function mozNfc() {
   149   debug("In mozNfc Constructor");
   150   try {
   151     this._nfcContentHelper = Cc["@mozilla.org/nfc/content-helper;1"]
   152                                .getService(Ci.nsINfcContentHelper);
   153   } catch(e) {
   154     debug("No NFC support.")
   155   }
   156 }
   157 mozNfc.prototype = {
   158   _nfcContentHelper: null,
   159   _window: null,
   160   _wrap: function _wrap(obj) {
   161     return Cu.cloneInto(obj, this._window);
   162   },
   164   init: function init(aWindow) {
   165     debug("mozNfc init called");
   166     this._window = aWindow;
   167   },
   169   // Only apps which have nfc-manager permission can call the following interfaces
   170   // 'checkP2PRegistration' , 'notifyUserAcceptedP2P' , 'notifySendFileStatus',
   171   // 'startPoll', 'stopPoll', and 'powerOff'.
   172   checkP2PRegistration: function checkP2PRegistration(manifestUrl) {
   173     // Get the AppID and pass it to ContentHelper
   174     let appID = appsService.getAppLocalIdByManifestURL(manifestUrl);
   175     return this._nfcContentHelper.checkP2PRegistration(this._window, appID);
   176   },
   178   notifyUserAcceptedP2P: function notifyUserAcceptedP2P(manifestUrl) {
   179     let appID = appsService.getAppLocalIdByManifestURL(manifestUrl);
   180     // Notify chrome process of user's acknowledgement
   181     this._nfcContentHelper.notifyUserAcceptedP2P(this._window, appID);
   182   },
   184   notifySendFileStatus: function notifySendFileStatus(status, requestId) {
   185     this._nfcContentHelper.notifySendFileStatus(this._window,
   186                                                 status, requestId);
   187   },
   189   startPoll: function startPoll() {
   190     return this._nfcContentHelper.startPoll(this._window);
   191   },
   193   stopPoll: function stopPoll() {
   194     return this._nfcContentHelper.stopPoll(this._window);
   195   },
   197   powerOff: function powerOff() {
   198     return this._nfcContentHelper.powerOff(this._window);
   199   },
   201   getNFCTag: function getNFCTag(sessionToken) {
   202     let obj = new MozNFCTag();
   203     let nfcTag = this._window.MozNFCTag._create(this._window, obj);
   204     if (nfcTag) {
   205       obj.initialize(this._window, sessionToken);
   206       return nfcTag;
   207     } else {
   208       debug("Error: Unable to create NFCTag");
   209       return null;
   210     }
   211   },
   213   getNFCPeer: function getNFCPeer(sessionToken) {
   214     let obj = new MozNFCPeer();
   215     let nfcPeer = this._window.MozNFCPeer._create(this._window, obj);
   216     if (nfcPeer) {
   217       obj.initialize(this._window, sessionToken);
   218       return nfcPeer;
   219     } else {
   220       debug("Error: Unable to create NFCPeer");
   221       return null;
   222     }
   223   },
   225   // get/set onpeerready
   226   get onpeerready() {
   227     return this.__DOM_IMPL__.getEventHandler("onpeerready");
   228   },
   230   set onpeerready(handler) {
   231     this.__DOM_IMPL__.setEventHandler("onpeerready", handler);
   232   },
   234   // get/set onpeerlost
   235   get onpeerlost() {
   236     return this.__DOM_IMPL__.getEventHandler("onpeerlost");
   237   },
   239   set onpeerlost(handler) {
   240     this.__DOM_IMPL__.setEventHandler("onpeerlost", handler);
   241   },
   243   eventListenerWasAdded: function(evt) {
   244     let eventType = this.getEventType(evt);
   245     if (eventType == -1)
   246       return;
   247     this.registerTarget(eventType);
   248   },
   250   eventListenerWasRemoved: function(evt) {
   251     let eventType = this.getEventType(evt);
   252     if (eventType == -1)
   253       return;
   254     this.unregisterTarget(eventType);
   255   },
   257   registerTarget: function registerTarget(event) {
   258     let self = this;
   259     let appId = this._window.document.nodePrincipal.appId;
   260     this._nfcContentHelper.registerTargetForPeerEvent(this._window, appId,
   261       event, function(evt, sessionToken) {
   262         self.session = sessionToken;
   263         self.firePeerEvent(evt, sessionToken);
   264     });
   265   },
   267   unregisterTarget: function unregisterTarget(event) {
   268     let appId = this._window.document.nodePrincipal.appId;
   269     this._nfcContentHelper.unregisterTargetForPeerEvent(this._window,
   270                                                         appId, event);
   271   },
   273   getEventType: function getEventType(evt) {
   274     let eventType = -1;
   275     switch (evt) {
   276       case 'peerready':
   277         eventType = NFC_PEER_EVENT_READY;
   278         break;
   279       case 'peerlost':
   280         eventType = NFC_PEER_EVENT_LOST;
   281         break;
   282       default:
   283         break;
   284     }
   285     return eventType;
   286   },
   288   firePeerEvent: function firePeerEvent(evt, sessionToken) {
   289     let peerEvent = (NFC_PEER_EVENT_READY === evt) ? "peerready" : "peerlost";
   290     let detail = {
   291       "detail":sessionToken
   292     };
   293     let event = new this._window.CustomEvent(peerEvent, this._wrap(detail));
   294     this.__DOM_IMPL__.dispatchEvent(event);
   295   },
   297   classID: Components.ID("{6ff2b290-2573-11e3-8224-0800200c9a66}"),
   298   contractID: "@mozilla.org/navigatorNfc;1",
   299   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
   300                                          Ci.nsIDOMGlobalPropertyInitializer]),
   301 };
   303 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MozNFCTag, MozNFCPeer, mozNfc]);

mercurial