From 991978f0a9f6c2d1ebaf47c48dc012075dce5c18 Mon Sep 17 00:00:00 2001 From: Dimi Lee Date: Fri, 23 Jan 2015 11:35:03 +0800 Subject: [PATCH] Bug 1082440 - B2G NFC: Dispatch NFC events to foreground app. r=yoshi --- dom/nfc/NfcContentHelper.js | 2 +- dom/nfc/gonk/Nfc.js | 31 +++++++++++++++++-------------- dom/nfc/gonk/nfc_consts.js | 3 +++ dom/nfc/nsINfcContentHelper.idl | 4 +++- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/dom/nfc/NfcContentHelper.js b/dom/nfc/NfcContentHelper.js index 3f77d1794da..976ea44d29e 100644 --- a/dom/nfc/NfcContentHelper.js +++ b/dom/nfc/NfcContentHelper.js @@ -134,7 +134,7 @@ NfcContentHelper.prototype = { .getService(Ci.nsIXULRuntime) .processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; if (inParent) { - this._tabId = -1; + this._tabId = Ci.nsINfcBrowserAPI.SYSTEM_APP_ID; } else { throw Components.Exception("Can't get tab id in child process", Cr.NS_ERROR_UNEXPECTED); diff --git a/dom/nfc/gonk/Nfc.js b/dom/nfc/gonk/Nfc.js index e291fad8cdc..fa95b262b9a 100644 --- a/dom/nfc/gonk/Nfc.js +++ b/dom/nfc/gonk/Nfc.js @@ -181,7 +181,7 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () { this.focusApp = id; } else if (this.focusApp == id){ // Set focusApp to null means currently there is no foreground app. - this.focusApp = null; + this.focusApp = NFC.SYSTEM_APP_ID; } }, @@ -228,27 +228,30 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () { }, onTagFound: function onTagFound(message) { + let target = this.eventListeners[this.focusApp] || + this.eventListeners[NFC.SYSTEM_APP_ID]; + message.event = NFC.TAG_EVENT_FOUND; - for (let id in this.eventListeners) { - this.notifyDOMEvent(this.eventListeners[id], message); - } + + this.notifyDOMEvent(target, message); + delete message.event; }, onTagLost: function onTagLost(sessionToken) { - for (let id in this.eventListeners) { - this.notifyDOMEvent(this.eventListeners[id], - { event: NFC.TAG_EVENT_LOST, - sessionToken: sessionToken }); - } + let target = this.eventListeners[this.focusApp] || + this.eventListeners[NFC.SYSTEM_APP_ID]; + + this.notifyDOMEvent(target, { event: NFC.TAG_EVENT_LOST, + sessionToken: sessionToken }); }, onPeerEvent: function onPeerEvent(eventType, sessionToken) { - for (let id in this.eventListeners) { - this.notifyDOMEvent(this.eventListeners[id], - { event: eventType, - sessionToken: sessionToken }); - } + let target = this.eventListeners[this.focusApp] || + this.eventListeners[NFC.SYSTEM_APP_ID]; + + this.notifyDOMEvent(target, { event: eventType, + sessionToken: sessionToken }); }, onRFStateChange: function onRFStateChange(rfState) { diff --git a/dom/nfc/gonk/nfc_consts.js b/dom/nfc/gonk/nfc_consts.js index ad28542cd43..210dcb383ba 100644 --- a/dom/nfc/gonk/nfc_consts.js +++ b/dom/nfc/gonk/nfc_consts.js @@ -46,5 +46,8 @@ this.TAG_EVENT_LOST = 0x04; this.PEER_EVENT_FOUND = 0x05; this.RF_EVENT_STATE_CHANGE = 0x06; +// This value should sync with |SYSTEM_APP_ID| in nsINfcContentHelper.idl +this.SYSTEM_APP_ID = -1; + // Allow this file to be imported via Components.utils.import(). this.EXPORTED_SYMBOLS = Object.keys(this); diff --git a/dom/nfc/nsINfcContentHelper.idl b/dom/nfc/nsINfcContentHelper.idl index 844a6934be4..c1ce95fb26a 100644 --- a/dom/nfc/nsINfcContentHelper.idl +++ b/dom/nfc/nsINfcContentHelper.idl @@ -102,9 +102,11 @@ interface nsINfcRequestCallback : nsISupports void notifyError(in DOMString errorMsg); }; -[scriptable, uuid(7ae46728-bc42-44bd-8093-bc7563abf52d)] +[scriptable, uuid(7ae94107-adc9-4467-ae44-72f9a91f3ee8)] interface nsINfcBrowserAPI : nsISupports { + const int32_t SYSTEM_APP_ID = -1; + void setFocusApp(in uint64_t tabId, in boolean isFocus); };