Index: third_party/WebKit/LayoutTests/nfc/resources/nfc-helpers.js |
diff --git a/third_party/WebKit/LayoutTests/nfc/resources/nfc-helpers.js b/third_party/WebKit/LayoutTests/nfc/resources/nfc-helpers.js |
index cede4dacff017628d9cd12c8f0604af5d562d67b..cede7cbb2be26b86606a3a56e9ae96a7df91e1a8 100644 |
--- a/third_party/WebKit/LayoutTests/nfc/resources/nfc-helpers.js |
+++ b/third_party/WebKit/LayoutTests/nfc/resources/nfc-helpers.js |
@@ -37,6 +37,10 @@ function createNFCPushOptions(target, timeout, ignoreRead) { |
return { target: target, timeout: timeout, ignoreRead: ignoreRead }; |
} |
+function createNFCWatchOptions(url, recordType, mediaType, mode) { |
+ return { url: url, recordType: recordType, mediaType: mediaType, mode: mode}; |
kenneth.christiansen
2016/04/25 08:22:48
Actually if you use the same name this is not need
shalamov
2016/04/25 11:31:03
Done.
|
+} |
+ |
function createTextRecord(text) { |
return createRecord('text', 'text/plain', text); |
} |
@@ -86,6 +90,36 @@ function nfc_mocks(mojo) { |
return nfc.NFCPushTarget.ANY; |
} |
+ function toMojoNFCWatchMode(mode) { |
+ switch (mode) { |
+ case 'web-nfc-only': |
+ return nfc.NFCWatchMode.WEBNFC_ONLY; |
+ case 'any': |
+ return nfc.NFCWatchMode.ANY; |
kenneth.christiansen
2016/04/25 08:31:47
You can add a default here instead of the return b
shalamov
2016/04/25 11:31:03
Done.
|
+ } |
+ |
+ return nfc.NFCWatchMode.ANY; |
+ } |
+ |
+ // Converts between NFCMessage https://w3c.github.io/web-nfc/#dom-nfcmessage |
+ // and mojo::NFCMessage structure, so that nfc.watch function can be tested. |
+ function toMojoNFCMessage(message) { |
+ let nfcMessage = new nfc.NFCMessage(); |
+ nfcMessage.url = message.url; |
+ nfcMessage.data = new Array; |
kenneth.christiansen
2016/04/25 08:31:47
wouldn't = [] do?
shalamov
2016/04/25 11:31:03
Done.
|
+ for(let i in message.data) |
kenneth.christiansen
2016/04/25 08:31:46
I would add a space after 'for'
Don't you mean 'o
shalamov
2016/04/25 11:31:03
Done.
|
+ nfcMessage.data.push(toMojoNFCRecord(message.data[i])); |
+ return nfcMessage; |
+ } |
+ |
+ function toMojoNFCRecord(record) { |
+ let nfcRecord = new nfc.NFCRecord(); |
+ nfcRecord.recordType = toMojoNFCRecordType(record.recordType); |
+ nfcRecord.mediaType = record.mediaType; |
+ nfcRecord.data = toByteArray(record.data); |
+ return nfcRecord; |
+ } |
+ |
function toByteArray(data) { |
// Convert JS objects to byte array |
let byteArray; |
@@ -123,6 +157,32 @@ function nfc_mocks(mojo) { |
compareNFCRecords(provided.data[i], receivedMessage.data[i]); |
} |
+ // Used to compare two WebNFC messages, one that is provided to mock NFC |
+ // service through triggerWatchCallback and another that is received by |
+ // callback that is provided to navigator.nfc.watch function. |
+ function assertWebNFCMessagesEqual(a, b) { |
+ assert_equals(a.url, b.url); |
+ assert_equals(a.data.length, b.data.length); |
+ for(let i in a.data) { |
+ let recordA = a.data[i]; |
+ let recordB = b.data[i]; |
+ assert_equals(recordA.recordType, recordB.recordType); |
+ assert_equals(recordA.mediaType, recordB.mediaType); |
+ |
+ if (recordA.data instanceof ArrayBuffer) { |
+ assert_array_equals(new Uint8Array(recordA.data), |
+ new Uint8Array(recordB.data)); |
+ } else if (typeof recordA.data === 'object') { |
+ assert_object_equals(recordA.data, recordB.data); |
+ } |
+ |
+ if (typeof recordA.data === 'number' |
+ || typeof recordA.data === 'string') { |
+ assert_true(recordA.data == recordB.data); |
+ } |
+ } |
+ } |
+ |
// Compares NFCRecords that were provided / received by the mock service. |
function compareNFCRecords(providedRecord, receivedRecord) { |
assert_equals(toMojoNFCRecordType(providedRecord.recordType), |
@@ -160,6 +220,31 @@ function nfc_mocks(mojo) { |
assert_equals(received.target, nfc.NFCPushTarget.ANY); |
} |
+ // Compares NFCWatchOptions structures that were provided to API and |
+ // received by the mock mojo service. |
+ function assertNFCWatchOptionsEqual(provided, received) { |
+ if (provided.url !== undefined) |
+ assert_equals(provided.url, received.url); |
+ else |
+ assert_equals(received.url, ''); |
+ |
+ if (provided.mediaType !== undefined) |
+ assert_equals(provided.mediaType, received.mediaType); |
+ else |
+ assert_equals(received.mediaType, ''); |
+ |
+ if (provided.mode !== undefined) |
+ assert_equals(toMojoNFCWatchMode(provided.mode), received.mode); |
+ else |
+ assert_equals(received.mode, nfc.NFCWatchMode.WEBNFC_ONLY); |
+ |
+ if (provided.recordType !== undefined) { |
+ assert_equals(!+received.recordFilter, true); |
+ assert_equals(toMojoNFCRecordType(provided.recordType), |
+ received.recordFilter.recordType); |
+ } |
+ } |
+ |
function createNFCError(type) { |
return { error: type ? |
new nfc.NFCError({ error_type: type }) : null }; |
@@ -175,6 +260,9 @@ function nfc_mocks(mojo) { |
this.pending_promise_func_ = null; |
this.push_timeout_id_ = null; |
this.push_completed_ = true; |
+ this.client_ = null; |
+ this.watch_id_ = 0; |
+ this.watchers_ = new Array; |
kenneth.christiansen
2016/04/25 08:31:46
= [] ?
shalamov
2016/04/25 11:31:03
Done.
|
} |
// NFC.stubClass delegate functions |
@@ -209,6 +297,40 @@ function nfc_mocks(mojo) { |
return Promise.resolve(createNFCError(null)); |
} |
+ setClient(client) { |
+ this.client_ = new nfc.NFCClient.proxyClass(new mojo.router.Router(client)); |
+ } |
+ |
+ watch(options) { |
+ let error = this.isReady(); |
+ if (error) { |
+ error.id = 0; |
+ return Promise.resolve(error); |
+ } |
+ |
+ let retVal = createNFCError(null); |
+ retVal.id = ++this.watch_id_; |
+ this.watchers_.push({id: this.watch_id_, options: options}); |
+ return Promise.resolve(retVal); |
+ } |
+ |
+ cancelWatch(id) { |
+ let index = this.watchers_.findIndex(value => { return value.id === id;}); |
kenneth.christiansen
2016/04/25 08:31:47
you can remove the "{ return " and the "}" part :)
shalamov
2016/04/25 11:31:03
Done.
|
+ if (index === -1) |
kenneth.christiansen
2016/04/25 08:31:47
we usually add {} even for single lines in JS
shalamov
2016/04/25 11:31:03
Done.
|
+ return Promise.resolve(createNFCError(nfc.NFCErrorType.NOT_FOUND)); |
+ |
+ this.watchers_.splice(index, 1); |
+ return Promise.resolve(createNFCError(null)); |
+ } |
+ |
+ cancelAllWatches() { |
+ if (this.watchers_.length === 0) |
+ return Promise.resolve(createNFCError(nfc.NFCErrorType.NOT_FOUND)); |
+ |
+ this.watchers_.splice(0, this.watchers_.length); |
+ return Promise.resolve(createNFCError(null)); |
+ } |
+ |
// Mock utility functions |
bindToPipe(pipe) { |
assert_equals(this.router_, null); |
@@ -236,6 +358,10 @@ function nfc_mocks(mojo) { |
return this.push_options_; |
} |
+ watchOptions() { |
+ return this.watchers_[this.watchers_.length - 1].options; |
kenneth.christiansen
2016/04/25 08:31:46
what if there are no watchers?
shalamov
2016/04/25 11:31:03
Done.
|
+ } |
+ |
setPendingPushCompleted(result) { |
this.push_completed_ = result; |
} |
@@ -243,18 +369,27 @@ function nfc_mocks(mojo) { |
reset() { |
this.hw_status_ = NFCHWStatus.ENABLED; |
this.push_completed_ = true; |
+ this.watch_id_ = 0; |
+ this.watchers_ = new Array; |
this.cancelPendingPushOperation(); |
- if (this.push_timeout_id_) |
- window.clearTimeout(this.push_timeout_id_); |
} |
cancelPendingPushOperation() { |
+ if (this.push_timeout_id_) |
+ window.clearTimeout(this.push_timeout_id_); |
if (this.pending_promise_func_) |
this.pending_promise_func_(createNFCError(nfc.NFCErrorType.OPERATION_CANCELLED)); |
this.pushed_message_ = null; |
this.push_options_ = null; |
this.pending_promise_func_ = null; |
} |
+ |
+ triggerWatchCallback(id, message) { |
+ assert_true(this.client_ !== null); |
+ if (this.watchers_.length > 0) |
kenneth.christiansen
2016/04/25 08:31:47
this definitely needs {}
shalamov
2016/04/25 11:31:03
Done.
|
+ this.client_.onWatch(id, |
+ toMojoNFCMessage(message)); |
+ } |
} |
let mockNFC = new MockNFC; |
@@ -268,6 +403,8 @@ function nfc_mocks(mojo) { |
mockNFC: mockNFC, |
assertNFCMessagesEqual: assertNFCMessagesEqual, |
assertNFCPushOptionsEqual: assertNFCPushOptionsEqual, |
+ assertWebNFCMessagesEqual: assertWebNFCMessagesEqual, |
+ assertNFCWatchOptionsEqual: assertNFCWatchOptionsEqual, |
}); |
}); |
} |