mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
merge b2g-inbound to mozilla-central a=merge
This commit is contained in:
commit
30fe807b6b
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -4,6 +4,6 @@
|
||||
"remote": "",
|
||||
"branch": ""
|
||||
},
|
||||
"revision": "bf8bc38f28bda6ccddffbbedd40693ed8a10322c",
|
||||
"revision": "8f61e7de9914bb7f66ac2faf0bc256dda628a679",
|
||||
"repo_path": "integration/gaia-central"
|
||||
}
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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,
|
||||
type: record.type,
|
||||
id: record.id,
|
||||
payload: record.payload}));
|
||||
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);
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
|
179
dom/nfc/nsNfc.js
179
dom/nfc/nsNfc.js
@ -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,11 +428,20 @@ MozNFCImpl.prototype = {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.nfcTag && (this.nfcTag.session == sessionToken)) {
|
||||
this.nfcTag.isLost = true;
|
||||
this.nfcTag = null;
|
||||
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");
|
||||
this.__DOM_IMPL__.dispatchEvent(event);
|
||||
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 = [
|
||||
|
@ -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() {
|
||||
|
@ -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) {
|
||||
|
@ -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,9 +1324,11 @@ DataConnectionHandler.prototype = {
|
||||
deactivateDataCalls: function() {
|
||||
let dataDisconnecting = false;
|
||||
this.dataNetworkInterfaces.forEach(function(networkInterface) {
|
||||
if (networkInterface.state == RIL.GECKO_NETWORK_STATE_CONNECTED) {
|
||||
if (networkInterface.enabled) {
|
||||
if (networkInterface.state == RIL.GECKO_NETWORK_STATE_CONNECTED) {
|
||||
dataDisconnecting = true;
|
||||
}
|
||||
networkInterface.disconnect();
|
||||
dataDisconnecting = true;
|
||||
}
|
||||
});
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
apnRetryTimer = this.NETWORK_APNRETRY_FACTOR *
|
||||
(this.apnRetryCounter * this.apnRetryCounter) +
|
||||
this.NETWORK_APNRETRY_ORIGIN;
|
||||
// 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): " +
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user