Bug 996397 - B2G NFC: Replace DOMRequests with Promises. r=smaug, allstars.chh

This commit is contained in:
Dimi Lee 2014-11-21 17:54:04 +08:00
Родитель 392f9d0148
Коммит 889cfd218e
11 изменённых файлов: 331 добавлений и 166 удалений

Просмотреть файл

@ -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);
};

Просмотреть файл

@ -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}"),
@ -217,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) {
@ -231,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) {

Просмотреть файл

@ -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) {

Просмотреть файл

@ -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