merge b2g-inbound to mozilla-central a=merge

This commit is contained in:
Carsten "Tomcat" Book 2014-11-24 14:13:25 +01:00
commit 30fe807b6b
26 changed files with 470 additions and 214 deletions

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="3ab0d9c70f0b2e1ededc679112c392303f037361">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

View File

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d5d3f93914558b6f168447b805cd799c8233e300"/>

View File

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0870da2b5a71b6f48be8222e3f056498fea66e10"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="3ab0d9c70f0b2e1ededc679112c392303f037361">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

View File

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d5d3f93914558b6f168447b805cd799c8233e300"/>

View File

@ -1,8 +1,9 @@
[
{
"size": 91247216,
"digest": "2b4be549f98695488ea7288d9e7f8ac0fa45112bedefa485a6e016c4af73fa21bb6b3992beda516f268417207c5deb57afad3959d3b1fbd07d5269b3a6be6a27",
"size": 120750384,
"digest": "0e0a0b0dcca020e3283ce8deb33d0eed48fab16ef2fd919120bd7b5abba00713210be17f466d11bf77cca3c9e3b663805be61774476cc669f0a75736d901edfd",
"algorithm": "sha512",
"filename": "backup-flame.tar.xz"
"filename": "backup-flame.tar.xz",
"comment": "v188-1"
}
]

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="3ab0d9c70f0b2e1ededc679112c392303f037361">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

View File

@ -17,7 +17,7 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0870da2b5a71b6f48be8222e3f056498fea66e10"/>

View File

@ -4,6 +4,6 @@
"remote": "",
"branch": ""
},
"revision": "bf8bc38f28bda6ccddffbbedd40693ed8a10322c",
"revision": "8f61e7de9914bb7f66ac2faf0bc256dda628a679",
"repo_path": "integration/gaia-central"
}

View File

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>

View File

@ -15,7 +15,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

View File

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0870da2b5a71b6f48be8222e3f056498fea66e10"/>

View File

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c5bad6d78c5fe168e3bb894fc5cb70902c9b19b1"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3b4c64b5a05d106568dae3f88d38bdbb3d5bc29e"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

View File

@ -139,22 +139,19 @@ NfcContentHelper.prototype = {
},
// NFCTag interface
readNDEF: function readNDEF(sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
readNDEF: function readNDEF(sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:ReadNDEF", {
requestId: requestId,
sessionToken: sessionToken
});
return request;
},
writeNDEF: function writeNDEF(records, sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
writeNDEF: function writeNDEF(records, sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
let encodedRecords = this.encodeNDEFRecords(records);
cpmm.sendAsyncMessage("NFC:WriteNDEF", {
@ -162,69 +159,58 @@ NfcContentHelper.prototype = {
sessionToken: sessionToken,
records: encodedRecords
});
return request;
},
makeReadOnlyNDEF: function makeReadOnlyNDEF(sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
makeReadOnly: function makeReadOnly(sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:MakeReadOnly", {
requestId: requestId,
sessionToken: sessionToken
});
return request;
},
format: function format(sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
format: function format(sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:Format", {
requestId: requestId,
sessionToken: sessionToken
});
return request;
},
connect: function connect(techType, sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
connect: function connect(techType, sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:Connect", {
requestId: requestId,
sessionToken: sessionToken,
techType: techType
});
return request;
},
close: function close(sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
close: function close(sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:Close", {
requestId: requestId,
sessionToken: sessionToken
});
return request;
},
sendFile: function sendFile(data, sessionToken) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
sendFile: function sendFile(data, sessionToken, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:SendFile", {
requestId: requestId,
sessionToken: sessionToken,
blob: data.blob
});
return request;
},
notifySendFileStatus: function notifySendFileStatus(status, requestId) {
@ -247,16 +233,14 @@ NfcContentHelper.prototype = {
cpmm.sendAsyncMessage("NFC:UnregisterPeerReadyTarget", { appId: appId });
},
checkP2PRegistration: function checkP2PRegistration(appId) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
checkP2PRegistration: function checkP2PRegistration(appId, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:CheckP2PRegistration", {
appId: appId,
requestId: requestId
});
return request;
},
notifyUserAcceptedP2P: function notifyUserAcceptedP2P(appId) {
@ -265,16 +249,13 @@ NfcContentHelper.prototype = {
});
},
changeRFState: function changeRFState(rfState) {
let request = Services.DOMRequest.createRequest(this._window);
let requestId = btoa(this.getRequestId(request));
this._requestMap[requestId] = this._window;
changeRFState: function changeRFState(rfState, callback) {
let requestId = callback.getCallbackId();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("NFC:ChangeRFState",
{requestId: requestId,
rfState: rfState});
return request;
},
// nsIObserver
@ -295,31 +276,6 @@ NfcContentHelper.prototype = {
},
// nsIMessageListener
fireRequestSuccess: function fireRequestSuccess(requestId, result) {
let request = this.takeRequest(requestId);
if (!request) {
debug("not firing success for id: " + requestId);
return;
}
debug("fire request success, id: " + requestId);
Services.DOMRequest.fireSuccess(request, result);
},
fireRequestError: function fireRequestError(requestId, errorMsg) {
let request = this.takeRequest(requestId);
if (!request) {
debug("not firing error for id: " + requestId +
", errormsg: " + errorMsg);
return;
}
debug("fire request error, id: " + requestId +
", errormsg: " + errorMsg);
Services.DOMRequest.fireError(request, errorMsg);
},
receiveMessage: function receiveMessage(message) {
DEBUG && debug("Message received: " + JSON.stringify(message));
let result = message.json;
@ -338,11 +294,7 @@ NfcContentHelper.prototype = {
case "NFC:FormatResponse":
case "NFC:NotifySendFileStatusResponse":
case "NFC:ChangeRFStateResponse":
if (result.errorMsg) {
this.fireRequestError(atob(result.requestId), result.errorMsg);
} else {
this.fireRequestSuccess(atob(result.requestId), result);
}
this.handleGeneralResponse(result);
break;
case "NFC:DOMEvent":
switch (result.event) {
@ -381,37 +333,60 @@ NfcContentHelper.prototype = {
}
},
handleReadNDEFResponse: function handleReadNDEFResponse(result) {
let requester = this._requestMap[result.requestId];
if (!requester) {
debug("Response Invalid requestId=" + result.requestId);
handleGeneralResponse: function handleReadNDEFResponse(result) {
let requestId = result.requestId;
let callback = this._requestMap[requestId];
if (!callback) {
debug("not firing message " + result.type + " for id: " + requestId);
return;
}
delete this._requestMap[result.requestId];
delete this._requestMap[requestId];
if (result.errorMsg) {
this.fireRequestError(atob(result.requestId), result.errorMsg);
callback.notifyError(result.errorMsg);
} else {
callback.notifySuccess();
}
},
handleReadNDEFResponse: function handleReadNDEFResponse(result) {
let requestId = result.requestId;
let callback = this._requestMap[requestId];
if (!callback) {
debug("not firing message handleReadNDEFResponse for id: " + requestId);
return;
}
delete this._requestMap[requestId];
if (result.errorMsg) {
callback.notifyError(result.errorMsg);
return;
}
let requestId = atob(result.requestId);
let ndefMsg = [];
let records = result.records;
for (let i = 0; i < records.length; i++) {
let record = records[i];
ndefMsg.push(new requester.MozNDEFRecord({tnf: record.tnf,
ndefMsg.push(new this._window.MozNDEFRecord({tnf: record.tnf,
type: record.type,
id: record.id,
payload: record.payload}));
}
this.fireRequestSuccess(requestId, ndefMsg);
callback.notifySuccessWithNDEFRecords(ndefMsg);
},
handleCheckP2PRegistrationResponse: function handleCheckP2PRegistrationResponse(result) {
let requestId = result.requestId;
let callback = this._requestMap[requestId];
if (!callback) {
debug("not firing message handleCheckP2PRegistrationResponse for id: " + requestId);
return;
}
delete this._requestMap[requestId];
// Privilaged status API. Always fire success to avoid using exposed props.
// The receiver must check the boolean mapped status code to handle.
let requestId = atob(result.requestId);
this.fireRequestSuccess(requestId, !result.errorMsg);
callback.notifySuccessWithBoolean(!result.errorMsg);
},
};

View File

@ -3,9 +3,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsISupports.idl"
#include "nsIDOMDOMRequest.idl"
interface nsIVariant;
interface nsIDOMWindow;
[scriptable, uuid(9b43bdda-52f4-4712-b28c-ad7cba736e14)]
interface nsINfcTagEvent : nsISupports
@ -65,20 +65,106 @@ interface nsINfcEventListener : nsISupports
void notifyPeerLost(in DOMString sessionToken);
};
[scriptable, uuid(9343ae1a-6e2f-11e4-b5c4-fbb166b38b62)]
[scriptable, uuid(a8ef3590-d853-4766-b54a-a4547da4dde4)]
interface nsINfcRequestCallback : nsISupports
{
DOMString getCallbackId();
void notifySuccess();
void notifySuccessWithBoolean(in boolean result);
void notifySuccessWithNDEFRecords(in nsIVariant records);
void notifyError(in DOMString errorMsg);
};
[scriptable, uuid(9da02537-c4d0-4b2d-b294-d3250ff1720e)]
interface nsINfcContentHelper : nsISupports
{
void init(in nsIDOMWindow window);
boolean checkSessionToken(in DOMString sessionToken, in boolean isP2P);
nsIDOMDOMRequest readNDEF(in DOMString sessionToken);
nsIDOMDOMRequest writeNDEF(in nsIVariant records, in DOMString sessionToken);
nsIDOMDOMRequest makeReadOnly(in DOMString sessionToken);
nsIDOMDOMRequest format(in DOMString sessionToken);
/**
* Read current NDEF data on the tag.
*
* @param sessionToken
* Current token
*
* @param callback
* Called when request is finished
*/
void readNDEF(in DOMString sessionToken,
in nsINfcRequestCallback callback);
nsIDOMDOMRequest connect(in unsigned long techType, in DOMString sessionToken);
nsIDOMDOMRequest close(in DOMString sessionToken);
/**
* Write NDEF data to a peer device or a tag.
*
* @param records
* NDEF records to be written
*
* @param sessionToken
* Current token
*
* @param callback
* Called when request is finished
*/
void writeNDEF(in nsIVariant records,
in DOMString sessionToken,
in nsINfcRequestCallback callback);
/**
* Make a tag read-only
*
* @param sessionToken
* Current token
*
* @param callback
* Called when request is finished
*/
void makeReadOnly(in DOMString sessionToken,
in nsINfcRequestCallback callback);
/**
* Format a tag as NDEF
*
* @param sessionToken
* Current token
*
* @param callback
* Called when request is finished
*/
void format(in DOMString sessionToken,
in nsINfcRequestCallback callback);
/**
* Enable I/O operations to the tag
*
* @param techType
* Interface to a technology in a Tag
*
* @param sessionToken
* Current token
*
* @param callback
* Called when request is finished
*/
void connect(in unsigned long techType,
in DOMString sessionToken,
in nsINfcRequestCallback callback);
/**
* Disable I/O operations to the tag
*
* @param sessionToken
* Current token
*
* @param callback
* Called when request is finished
*/
void close(in DOMString sessionToken,
in nsINfcRequestCallback callback);
/**
* Initiate send file operation.
@ -91,11 +177,12 @@ interface nsINfcContentHelper : nsISupports
* @param sessionToken
* Current token
*
* Returns DOMRequest, if initiation of send file operation is successful
* then 'onsuccess' is called else 'onerror'
* @param callback
* Called when request is finished
*/
nsIDOMDOMRequest sendFile(in jsval blob,
in DOMString sessionToken);
void sendFile(in jsval blob,
in DOMString sessionToken,
in nsINfcRequestCallback callback);
/**
* Add the event listener.
@ -127,9 +214,11 @@ interface nsINfcContentHelper : nsISupports
* @param appId
* Application ID to be updated with parent process
*
* Returns DOMRequest, if appId is registered then 'onsuccess' is called else 'onerror'
* @param callback
* Called when request is finished
*/
nsIDOMDOMRequest checkP2PRegistration(in unsigned long appId);
void checkP2PRegistration(in unsigned long appId,
in nsINfcRequestCallback callback);
/**
* Notify the parent process that user has accepted to share nfc message on P2P UI
@ -155,6 +244,10 @@ interface nsINfcContentHelper : nsISupports
* Change RF state.
*
* @param rfState. Possible values are 'idle', 'listen' and 'discovery'.
*
* @param callback
* Called when request is finished
*/
nsIDOMDOMRequest changeRFState(in DOMString rfState);
void changeRFState(in DOMString rfState,
in nsINfcRequestCallback callback);
};

View File

@ -17,12 +17,78 @@ const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
XPCOMUtils.defineLazyServiceGetter(this,
"appsService",
"@mozilla.org/AppsService;1",
"nsIAppsService");
function NfcCallback(aWindow) {
this.initDOMRequestHelper(aWindow, null);
this._createPromise();
}
NfcCallback.prototype = {
__proto__: DOMRequestIpcHelper.prototype,
promise: null,
_requestId: null,
_createPromise: function _createPromise() {
this.promise = this.createPromise((aResolve, aReject) => {
this._requestId = btoa(this.getPromiseResolverId({
resolve: aResolve,
reject: aReject
}));
});
},
getCallbackId: function getCallbackId() {
return this._requestId;
},
notifySuccess: function notifySuccess() {
let resolver = this.takePromiseResolver(atob(this._requestId));
if (!resolver) {
debug("can not find promise resolver for id: " + this._requestId);
return;
}
resolver.resolve();
},
notifySuccessWithBoolean: function notifySuccessWithBoolean(aResult) {
let resolver = this.takePromiseResolver(atob(this._requestId));
if (!resolver) {
debug("can not find promise resolver for id: " + this._requestId);
return;
}
resolver.resolve(aResult);
},
notifySuccessWithNDEFRecords: function notifySuccessWithNDEFRecords(aRecords) {
let resolver = this.takePromiseResolver(atob(this._requestId));
if (!resolver) {
debug("can not find promise resolver for id: " + this._requestId);
return;
}
resolver.resolve(aRecords);
},
notifyError: function notifyError(aErrorMsg) {
let resolver = this.takePromiseResolver(atob(this._requestId));
if (!resolver) {
debug("can not find promise resolver for id: " + this._requestId +
", errormsg: " + aErrorMsg);
return;
}
resolver.reject(aErrorMsg);
},
QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference,
Ci.nsIObserver,
Ci.nsINfcRequestCallback]),
};
/**
* Implementation of NFCTag.
*
@ -64,7 +130,9 @@ MozNFCTagImpl.prototype = {
throw new this._window.DOMError("InvalidStateError", "NFCTag object is invalid");
}
return this._nfcContentHelper.readNDEF(this.session);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.readNDEF(this.session, callback);
return callback.promise;
},
writeNDEF: function writeNDEF(records) {
@ -85,7 +153,9 @@ MozNFCTagImpl.prototype = {
throw new this._window.DOMError("NotSupportedError", "Exceed max NDEF size");
}
return this._nfcContentHelper.writeNDEF(records, this.session);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.writeNDEF(records, this.session, callback);
return callback.promise;
},
makeReadOnly: function makeReadOnly() {
@ -98,7 +168,9 @@ MozNFCTagImpl.prototype = {
"NFCTag object cannot be made read-only");
}
return this._nfcContentHelper.makeReadOnly(this.session);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.makeReadOnly(this.session, callback);
return callback.promise;
},
format: function format() {
@ -111,7 +183,9 @@ MozNFCTagImpl.prototype = {
"NFCTag object is not formatable");
}
return this._nfcContentHelper.format(this.session);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.format(this.session, callback);
return callback.promise;
},
classID: Components.ID("{4e1e2e90-3137-11e3-aa6e-0800200c9a66}"),
@ -146,7 +220,9 @@ MozNFCPeerImpl.prototype = {
}
// Just forward sendNDEF to writeNDEF
return this._nfcContentHelper.writeNDEF(records, this.session);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.writeNDEF(records, this.session, callback);
return callback.promise;
},
sendFile: function sendFile(blob) {
@ -157,8 +233,11 @@ MozNFCPeerImpl.prototype = {
let data = {
"blob": blob
};
return this._nfcContentHelper.sendFile(Cu.cloneInto(data, this._window),
this.session);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.sendFile(Cu.cloneInto(data, this._window),
this.session, callback);
return callback.promise;
},
classID: Components.ID("{c1b2bcf0-35eb-11e3-aa6e-0800200c9a66}"),
@ -179,6 +258,8 @@ function MozNFCImpl() {
debug("No NFC support.")
}
this.eventService = Cc["@mozilla.org/eventlistenerservice;1"]
.getService(Ci.nsIEventListenerService);
this._nfcContentHelper.addEventListener(this);
}
MozNFCImpl.prototype = {
@ -186,6 +267,7 @@ MozNFCImpl.prototype = {
_window: null,
nfcPeer: null,
nfcTag: null,
eventService: null,
// Should be mapped to the RFState defined in WebIDL.
rfState: {
@ -214,7 +296,10 @@ MozNFCImpl.prototype = {
checkP2PRegistration: function checkP2PRegistration(manifestUrl) {
// Get the AppID and pass it to ContentHelper
let appID = appsService.getAppLocalIdByManifestURL(manifestUrl);
return this._nfcContentHelper.checkP2PRegistration(appID);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.checkP2PRegistration(appID, callback);
return callback.promise;
},
notifyUserAcceptedP2P: function notifyUserAcceptedP2P(manifestUrl) {
@ -228,15 +313,21 @@ MozNFCImpl.prototype = {
},
startPoll: function startPoll() {
return this._nfcContentHelper.changeRFState(this.rfState.DISCOVERY);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.changeRFState(this.rfState.DISCOVERY, callback);
return callback.promise;
},
stopPoll: function stopPoll() {
return this._nfcContentHelper.changeRFState(this.rfState.LISTEN);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.changeRFState(this.rfState.LISTEN, callback);
return callback.promise;
},
powerOff: function powerOff() {
return this._nfcContentHelper.changeRFState(this.rfState.IDLE);
let callback = new NfcCallback(this._window);
this._nfcContentHelper.changeRFState(this.rfState.IDLE, callback);
return callback.promise;
},
_createNFCPeer: function _createNFCPeer(sessionToken) {
@ -291,10 +382,18 @@ MozNFCImpl.prototype = {
return;
}
if (!this.eventService.hasListenersFor(this.__DOM_IMPL__, "tagfound")) {
debug("ontagfound is not registered.");
return;
}
if (!this.checkPermissions(["nfc-read", "nfc-write"])) {
return;
}
this.eventService.addSystemEventListener(this._window, "visibilitychange",
this, /* useCapture */false);
let tagImpl = new MozNFCTagImpl(this._window, sessionToken, event);
let tag = this._window.MozNFCTag._create(this._window, tagImpl);
this.nfcTag = tag;
@ -329,10 +428,19 @@ MozNFCImpl.prototype = {
return;
}
if (this.nfcTag && (this.nfcTag.session == sessionToken)) {
if (!this.nfcTag) {
debug("No NFCTag object existing.");
return;
}
// Remove system event listener only when tag and peer are both lost.
if (!this.nfcPeer) {
this.eventService.removeSystemEventListener(this._window, "visibilitychange",
this, /* useCapture */false);
}
this.nfcTag.isLost = true;
this.nfcTag = null;
}
debug("fire ontaglost " + sessionToken);
let event = new this._window.Event("taglost");
@ -345,11 +453,19 @@ MozNFCImpl.prototype = {
return;
}
if (!isPeerReady &&
!this.eventService.hasListenersFor(this.__DOM_IMPL__, "peerfound")) {
debug("onpeerfound is not registered.");
return;
}
if (!this.checkPermissions(["nfc-write"])) {
return;
}
this.session = sessionToken;
this.eventService.addSystemEventListener(this._window, "visibilitychange",
this, /* useCapture */false);
this.nfcPeer = this._createNFCPeer(sessionToken);
let eventData = { "peer": this.nfcPeer };
let type = (isPeerReady) ? "peerready" : "peerfound";
@ -369,23 +485,41 @@ MozNFCImpl.prototype = {
return;
}
if (sessionToken != this.session) {
dump("Unpaired session for notifyPeerLost." + sessionToken);
if (!this.nfcPeer) {
debug("No NFCPeer object existing.");
return;
}
if (this.nfcPeer && (this.nfcPeer.session == sessionToken)) {
this.nfcPeer.isLost = true;
this.nfcPeer = null;
// Remove system event listener only when tag and peer are both lost.
if (!this.nfcTag) {
this.eventService.removeSystemEventListener(this._window, "visibilitychange",
this, /* useCapture */false);
}
this.session = null;
this.nfcPeer.isLost = true;
this.nfcPeer = null;
debug("fire onpeerlost");
let event = new this._window.Event("peerlost");
this.__DOM_IMPL__.dispatchEvent(event);
},
handleEvent: function handleEvent (event) {
if (!this._window.document.hidden) {
return;
}
if (this.nfcTag) {
debug("handleEvent notifyTagLost");
this.notifyTagLost(this.nfcTag.session);
}
if (this.nfcPeer) {
debug("handleEvent notifyPeerLost");
this.notifyPeerLost(this.nfcPeer.session);
}
},
checkPermissions: function checkPermissions(perms) {
let principal = this._window.document.nodePrincipal;
for (let perm of perms) {
@ -409,7 +543,8 @@ MozNFCImpl.prototype = {
contractID: "@mozilla.org/navigatorNfc;1",
QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
Ci.nsIDOMGlobalPropertyInitializer,
Ci.nsINfcEventListener]),
Ci.nsINfcEventListener,
Ci.nsIDOMEventListener]),
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MozNFCTagImpl,

View File

@ -194,22 +194,20 @@ let SNEP = (function() {
function toggleNFC(enabled) {
let deferred = Promise.defer();
let req;
let promise;
if (enabled) {
req = nfc.startPoll();
promise = nfc.startPoll();
} else {
req = nfc.powerOff();
promise = nfc.powerOff();
}
req.onsuccess = function() {
promise.then(() => {
deferred.resolve();
};
req.onerror = function() {
}).catch(() => {
ok(false, 'operation failed, error ' + req.error.name);
deferred.reject();
finish();
};
});
return deferred.promise;
}

View File

@ -111,16 +111,14 @@ function registerOnpeerready() {
function fireCheckP2PReg(manifestUrl) {
let deferred = Promise.defer();
let request = nfc.checkP2PRegistration(manifestUrl);
request.onsuccess = function() {
let promise = nfc.checkP2PRegistration(manifestUrl);
promise.then(() => {
ok(true, 'checkP2PRegistration allways results in success');
deferred.resolve(request.result);
};
request.onerror = function() {
}).catch(() => {
ok(false, 'see NfcContentHelper.handleCheckP2PRegistrationResponse');
deferred.reject();
};
});
return deferred.promise;
}

View File

@ -6,41 +6,38 @@ MARIONETTE_HEAD_JS = 'head.js';
function testEnableNFC() {
log('Running \'testEnableNFC\'');
let req = nfc.startPoll();
req.onsuccess = function () {
let promise = nfc.startPoll();
promise.then(() => {
ok(true);
runNextTest();
};
req.onerror = function () {
}).catch(() => {
ok(false, "startPoll failed");
runNextTest();
};
});
}
function testDisableNFC() {
log('Running \'testDisableNFC\'');
let req = nfc.powerOff();
req.onsuccess = function () {
let promise = nfc.powerOff();
promise.then(() => {
ok(true);
runNextTest();
};
req.onerror = function () {
}).catch(() => {
ok(false, "powerOff failed");
runNextTest();
};
});
}
function testStopPollNFC() {
log('Running \'testStopPollNFC\'');
let req = nfc.stopPoll();
req.onsuccess = function () {
let promise = nfc.stopPoll();
promise.then(() => {
ok(true);
runNextTest();
};
req.onerror = function () {
}).catch(() => {
ok(false, "stopPoll failed");
runNextTest();
};
});
}
let tests = [

View File

@ -44,20 +44,18 @@ function handleTechnologyDiscoveredRE0ForP2PRegFailure(msg) {
nfc.onpeerready = peerReadyCb;
let request = nfc.checkP2PRegistration(INCORRECT_MANIFEST_URL);
request.onsuccess = function (evt) {
let promise = nfc.checkP2PRegistration(INCORRECT_MANIFEST_URL);
promise.then(evt => {
is(request.result, false, "check for P2P registration result");
nfc.onpeerready = null;
NCI.deactivate().then(() => toggleNFC(false)).then(runNextTest);
}
request.onerror = function () {
}).catch(() => {
ok(false, "checkP2PRegistration failed.");
nfc.onpeerready = null;
NCI.deactivate().then(() => toggleNFC(false)).then(runNextTest);
}
});
}
function testPeerReady() {

View File

@ -13,8 +13,8 @@ function sendNDEF(techType, sessionToken) {
let ndef = [new MozNDEFRecord({tnf: tnf, type: type, payload: payload})];
let peer = window.navigator.mozNfc.getNFCPeer(sessionToken);
let req = peer.sendNDEF(ndef);
req.onsuccess = function() {
let promise = peer.sendNDEF(ndef);
promise.then(() => {
log("Successfully sent NDEF message");
let cmd = "nfc snep put -1 -1"; /* read last SNEP PUT from emulator */
@ -24,11 +24,10 @@ function sendNDEF(techType, sessionToken) {
NDEF.compare(ndef, NDEF.parseString(result.pop()));
toggleNFC(false).then(runNextTest);
});
};
req.onerror = function() {
}).catch(() => {
ok(false, "Failed to send NDEF message, error \'" + this.error + "\'");
toggleNFC(false).then(runNextTest);
};
});
}
function handleTechnologyDiscoveredRE0(msg) {

View File

@ -87,6 +87,8 @@ const RADIO_POWER_OFF_TIMEOUT = 30000;
const SMS_HANDLED_WAKELOCK_TIMEOUT = 5000;
const HW_DEFAULT_CLIENT_ID = 0;
const INT32_MAX = 2147483647;
const RIL_IPC_ICCMANAGER_MSG_NAMES = [
"RIL:GetRilContext",
"RIL:SendStkResponse",
@ -776,13 +778,12 @@ XPCOMUtils.defineLazyGetter(this, "gDataConnectionManager", function () {
oldSettings.enabled = false;
}
if (oldConnHandler.anyDataConnected()) {
if (oldConnHandler.deactivateDataCalls()) {
this._pendingDataCallRequest = applyPendingDataSettings;
if (DEBUG) {
this.debug("_handleDataClientIdChange: existing data call(s) active" +
", wait for them to get disconnected.");
}
oldConnHandler.deactivateDataCalls();
return;
}
@ -1145,18 +1146,6 @@ DataConnectionHandler.prototype = {
return true;
},
/**
* Check if there is any activated data connection.
*/
anyDataConnected: function() {
for (let i = 0; i < this._dataCalls.length; i++) {
if (this._dataCalls[i].state == RIL.GECKO_NETWORK_STATE_CONNECTED) {
return true;
}
}
return false;
},
updateApnSettings: function(newApnSettings) {
if (!newApnSettings) {
return;
@ -1335,10 +1324,12 @@ DataConnectionHandler.prototype = {
deactivateDataCalls: function() {
let dataDisconnecting = false;
this.dataNetworkInterfaces.forEach(function(networkInterface) {
if (networkInterface.enabled) {
if (networkInterface.state == RIL.GECKO_NETWORK_STATE_CONNECTED) {
networkInterface.disconnect();
dataDisconnecting = true;
}
networkInterface.disconnect();
}
});
// No data calls exist. It's safe to proceed the pending radio power off
@ -1346,6 +1337,8 @@ DataConnectionHandler.prototype = {
if (gRadioEnabledController.isDeactivatingDataCalls() && !dataDisconnecting) {
gRadioEnabledController.finishDeactivatingDataCalls(this.clientId);
}
return dataDisconnecting;
},
/**
@ -3812,9 +3805,26 @@ DataCall.prototype = {
chappap: null,
dataCallError: function(message) {
if (DEBUG) this.debug("Data call error on APN: " + message.apn);
if (DEBUG) {
this.debug("Data call error on APN " + message.apn + ": " +
message.errorMsg + " (" + message.status + "), retry time: " +
message.suggestedRetryTime);
}
this.state = RIL.GECKO_NETWORK_STATE_DISCONNECTED;
this.retry();
if (this.requestedNetworkIfaces.length === 0) {
if (DEBUG) this.debug("This DataCall is not requested anymore.");
return;
}
// For suggestedRetryTime, the value of INT32_MAX(0x7fffffff) means no retry.
if (message.suggestedRetryTime === INT32_MAX ||
this.isPermanentFail(message.status, message.errorMsg)) {
if (DEBUG) this.debug("Data call error: no retry needed.");
return;
}
this.retry(message.suggestedRetryTime);
},
dataCallStateChanged: function(datacall) {
@ -3832,6 +3842,7 @@ DataCall.prototype = {
switch (datacall.state) {
case RIL.GECKO_NETWORK_STATE_CONNECTED:
if (this.state == RIL.GECKO_NETWORK_STATE_CONNECTING) {
this.apnRetryCounter = 0;
this.linkInfo.cid = datacall.cid;
if (this.requestedNetworkIfaces.length === 0) {
@ -3919,6 +3930,29 @@ DataCall.prototype = {
return this.state == RIL.GECKO_NETWORK_STATE_CONNECTED;
},
isPermanentFail: function(dataFailCause, errorMsg) {
// Check ril.h for 'no retry' data call fail causes.
if (errorMsg === RIL.GECKO_ERROR_RADIO_NOT_AVAILABLE ||
errorMsg === RIL.GECKO_ERROR_INVALID_PARAMETER ||
dataFailCause === RIL.DATACALL_FAIL_OPERATOR_BARRED ||
dataFailCause === RIL.DATACALL_FAIL_MISSING_UKNOWN_APN ||
dataFailCause === RIL.DATACALL_FAIL_UNKNOWN_PDP_ADDRESS_TYPE ||
dataFailCause === RIL.DATACALL_FAIL_USER_AUTHENTICATION ||
dataFailCause === RIL.DATACALL_FAIL_ACTIVATION_REJECT_GGSN ||
dataFailCause === RIL.DATACALL_FAIL_SERVICE_OPTION_NOT_SUPPORTED ||
dataFailCause === RIL.DATACALL_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED ||
dataFailCause === RIL.DATACALL_FAIL_NSAPI_IN_USE ||
dataFailCause === RIL.DATACALL_FAIL_ONLY_IPV4_ALLOWED ||
dataFailCause === RIL.DATACALL_FAIL_ONLY_IPV6_ALLOWED ||
dataFailCause === RIL.DATACALL_FAIL_PROTOCOL_ERRORS ||
dataFailCause === RIL.DATACALL_FAIL_RADIO_POWER_OFF ||
dataFailCause === RIL.DATACALL_FAIL_TETHERED_CALL_ACTIVE) {
return true;
}
return false;
},
inRequestedTypes: function(type) {
for (let i = 0; i < this.requestedNetworkIfaces.length; i++) {
if (this.requestedNetworkIfaces[i].type == type) {
@ -4045,7 +4079,7 @@ DataCall.prototype = {
this.state = RIL.GECKO_NETWORK_STATE_CONNECTING;
},
retry: function() {
retry: function(suggestedRetryTime) {
let apnRetryTimer;
// We will retry the connection in increasing times
@ -4057,9 +4091,14 @@ DataCall.prototype = {
return;
}
// If there is a valid suggestedRetryTime, override the retry timer.
if (suggestedRetryTime !== undefined && suggestedRetryTime >= 0) {
apnRetryTimer = suggestedRetryTime / 1000;
} else {
apnRetryTimer = this.NETWORK_APNRETRY_FACTOR *
(this.apnRetryCounter * this.apnRetryCounter) +
this.NETWORK_APNRETRY_ORIGIN;
}
this.apnRetryCounter++;
if (DEBUG) {
this.debug("Data call - APN Connection Retry Timer (secs-counter): " +

View File

@ -4141,6 +4141,10 @@ RilObject.prototype = {
// can be removed if is the same as the current one.
for each (let newDataCall in datacalls) {
if (newDataCall.status != DATACALL_FAIL_NONE) {
if (newDataCallOptions) {
newDataCallOptions.status = newDataCall.status;
newDataCallOptions.suggestedRetryTime = newDataCall.suggestedRetryTime;
}
this._sendDataCallError(newDataCallOptions || newDataCall,
newDataCall.status);
}

View File

@ -42,7 +42,7 @@ interface MozNFCManager {
* otherwise error
*/
[CheckPermissions="nfc-manager"]
DOMRequest checkP2PRegistration(DOMString manifestUrl);
Promise<boolean> checkP2PRegistration(DOMString manifestUrl);
/**
* Notify that user has accepted to share nfc message on P2P UI
@ -60,19 +60,19 @@ interface MozNFCManager {
* Power on the NFC hardware and start polling for NFC tags or devices.
*/
[CheckPermissions="nfc-manager"]
DOMRequest startPoll();
Promise<void> startPoll();
/**
* Stop polling for NFC tags or devices. i.e. enter low power mode.
*/
[CheckPermissions="nfc-manager"]
DOMRequest stopPoll();
Promise<void> stopPoll();
/**
* Power off the NFC hardware.
*/
[CheckPermissions="nfc-manager"]
DOMRequest powerOff();
Promise<void> powerOff();
};
[JSImplementation="@mozilla.org/navigatorNfc;1",

View File

@ -10,10 +10,17 @@
[JSImplementation="@mozilla.org/nfc/NFCPeer;1", AvailableIn="CertifiedApps"]
interface MozNFCPeer {
/**
* Send NDEF data to peer device.
*/
[Throws]
DOMRequest sendNDEF(sequence<MozNDEFRecord> records);
Promise<void> sendNDEF(sequence<MozNDEFRecord> records);
/**
* Send file to peer device.
*/
[Throws]
DOMRequest sendFile(Blob blob);
Promise<void> sendFile(Blob blob);
};
// Mozilla Only

View File

@ -66,17 +66,29 @@ interface MozNFCTag {
*/
readonly attribute boolean? canBeMadeReadOnly;
/**
* Read current NDEF data on the tag.
*/
[Throws]
DOMRequest readNDEF();
Promise<sequence<MozNDEFRecord>> readNDEF();
/**
* Write NDEF data to the tag.
*/
[Throws]
DOMRequest writeNDEF(sequence<MozNDEFRecord> records);
Promise<void> writeNDEF(sequence<MozNDEFRecord> records);
/**
* Make a tag read-only.
*/
[Throws]
DOMRequest makeReadOnly();
Promise<void> makeReadOnly();
/**
* Format a tag as NDEF.
*/
[Throws]
DOMRequest format();
Promise<void> format();
};
// Mozilla Only