Skip to content

Commit

Permalink
[webnfc] Do not support multiple scans on the same reader.
Browse files Browse the repository at this point in the history
We added support for multiple scan invocations on the same Reader in
this CL https://chromium-review.googlesource.com/c/chromium/src/+/2145263

Since Origin Trials feedback was to remove Filtering,
spec : w3c/web-nfc#565
WIP CL : https://chromium-review.googlesource.com/c/chromium/src/+/2225770/
we tried to reason if in a world without filtering, multiple scans on
the same Reader is needed at all. The present thinking is to simply
reject scan promise when there's already an ongoing scan.

Spec discussions: w3c/web-nfc#592

Bug: 520391
Change-Id: Ic50873ddc30351cec6656ac7b030394dc9fa18ea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2297559
Commit-Queue: Rijubrata Bhaumik <rijubrata.bhaumik@intel.com>
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#790438}
  • Loading branch information
riju authored and chromium-wpt-export-bot committed Jul 21, 2020
1 parent 29d3cd4 commit 5f51831
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 75 deletions.
15 changes: 15 additions & 0 deletions web-nfc/NDEFReader_scan.https.html
Expand Up @@ -284,4 +284,19 @@
await promise;
}, "Test that reading message with multiple records should succeed.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const promise1 = reader.scan();
const promise2 = promise_rejects_dom(t, 'InvalidStateError', reader.scan());
await promise1;
await promise2;
}, "Test that NDEFReader.scan rejects if there is already an ongoing scan.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const controller = new AbortController();
await reader.scan({signal : controller.signal});
controller.abort();
await reader.scan();
}, "Test that NDEFReader.scan can be started after the previous scan is aborted.");
</script>
75 changes: 0 additions & 75 deletions web-nfc/NDEFReader_scan_filter.https.html
Expand Up @@ -162,79 +162,4 @@
);
}

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const controller = new AbortController();
const signal = controller.signal;
const textMsg = createMessage([createTextRecord(test_text_data)]);
const urlMsg = createMessage([createUrlRecord(test_url_data)]);
const mimeMsg = createMessage([createMimeRecord(test_buffer_data)]);

const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
const promise = readerWatcher.wait_for("reading").then(event => {
controller.abort();
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(mimeMsg));
});

const scanOptions1 = {recordType: "text", signal: signal};
const scanOptions2 = {recordType: "url", signal: signal};
const scanOptions3 = {recordType: "mime", signal: signal};

await reader.scan(scanOptions1);
await reader.scan(scanOptions2);
// There is maximum one filter for an NDEFReader object,
// last filter will replace all previous ones.
await reader.scan(scanOptions3);

mockNFC.setReadingMessage(textMsg);
mockNFC.setReadingMessage(urlMsg);
mockNFC.setReadingMessage(mimeMsg);
await promise;
}, "Multiple scan() from the same NDEFReader object with new options should \
replace existing filters.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const controller1 = new AbortController();
const controller2 = new AbortController();
const urlMsg = createMessage([createUrlRecord(test_url_data)]);
const mimeMsg = createMessage([createMimeRecord(test_buffer_data)]);

const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
const promise = readerWatcher.wait_for("reading").then(event => {
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(mimeMsg));
controller2.abort();
});

const scanOptions1 = {recordType: "url", signal: controller1.signal};
const scanOptions2 = {recordType: "mime", signal: controller2.signal};

// There is maximum one filter for an NDEFReader object,
// last filter will replace all previous ones.
await reader.scan(scanOptions1);
await reader.scan(scanOptions2);

mockNFC.setReadingMessage(urlMsg);

controller1.abort();

mockNFC.setReadingMessage(mimeMsg);
await promise;
}, "Aborting on previous signal should not stop current reading for multiple \
scan() with different signals.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const controller = new AbortController();
const scanOptions1 = {recordType: "url", signal: controller.signal };
const scanOptions2 = {recordType: "mime"};

await reader.scan(scanOptions1);
const promise = reader.scan(scanOptions2);
controller.abort();

await promise_rejects_dom(t, 'AbortError', promise);
}, "Aborting on previous signal can stop current reading if no new signals \
passed to successive scan().");

</script>

0 comments on commit 5f51831

Please sign in to comment.