Skip to content

Commit

Permalink
Bug 1679943 [wpt PR 26094] - web-nfc: Merge NDEFWriter in NDEFReader,…
Browse files Browse the repository at this point in the history
… a=testonly

Automatic update from web-platform-tests
web-nfc: Merge NDEFWriter in NDEFReader

NDEFWriter and NDEFReader share a lot of similar
features and a writing device, will also read.

Therefore it was decided to simplify NDEF functionality,
and to have only one class called NDEFReader,
which can read and write.

refers to w3c/web-nfc#601

Because kWebNfcNdefReaderScan and kWebNfcNdefWriterWrite are now
used in idl extended attributes, their usages
may be higher now as they were fired after user granted permission.

Bug: 1131141
Change-Id: I8cc2ce053e5bb43c0fa5b299bdaf5cb5317bf859
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2424208
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Reviewed-by: François Beaufort <beaufort.francois@gmail.com>
Commit-Queue: François Beaufort <beaufort.francois@gmail.com>
Cr-Commit-Position: refs/heads/master@{#832236}

--

wpt-commits: 77f3f1533681dedef98a4c94c2abdb562d097002
wpt-pr: 26094
  • Loading branch information
beaufortfrancois authored and moz-wptsync-bot committed Dec 7, 2020
1 parent 94f0552 commit fb849ee
Show file tree
Hide file tree
Showing 7 changed files with 207 additions and 185 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@
<script>

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const ndef = new NDEFReader();
const ndefWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = new Promise((resolve, reject) => {
readerWatcher.wait_for("reading").then(event => {
ndefWatcher.wait_for("reading").then(event => {
if (document.hidden) reject();
else resolve();
});
});
await reader.scan();
await ndef.scan();
await promise;
}, "Test NDEFReader.onreading is not fired when document is hidden");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<title>NDEFWriter.write respect page visibility changes</title>
<title>NDEFReader.write respect page visibility changes</title>
<link rel="help" href="https://w3c.github.io/web-nfc/#visible-document">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/nfc-helpers.js"></script>
<script>

promise_test(async t => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const p1 = writer.write(test_text_data);

return await new Promise((resolve, reject) => {
Expand All @@ -20,7 +20,7 @@
reject();
});
});
}, "Test NDEFWriter.write operation should be suspend when document is not visible");
}, "Test NDEFReader.write operation should be suspended when document is not visible");

</script>

Expand Down
152 changes: 92 additions & 60 deletions testing/web-platform/tests/web-nfc/NDEFReader_scan.https.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,104 +21,136 @@
];

function waitSyntaxErrorPromise(t, scan_options) {
const reader = new NDEFReader();
return promise_rejects_dom(t, 'SyntaxError', reader.scan(scan_options));
const ndef = new NDEFReader();
return promise_rejects_dom(t, 'SyntaxError', ndef.scan(scan_options));
}

nfc_test(async t => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const promises = [];
invalid_signals.forEach(invalid_signal => {
promises.push(promise_rejects_js(t, TypeError,
reader.scan({ signal: invalid_signal })));
ndef.scan({ signal: invalid_signal })));
});
await Promise.all(promises);
}, "Test that NDEFReader.scan rejects if signal is not an AbortSignal.");

nfc_test(async t => {
await test_driver.set_permission({ name: 'nfc' }, 'denied', false);
const reader = new NDEFReader();
await promise_rejects_dom(t, 'NotAllowedError', reader.scan());
const ndef = new NDEFReader();
await promise_rejects_dom(t, 'NotAllowedError', ndef.scan());
}, "NDEFReader.scan should fail if user permission is not granted.");

// We do not provide NFC mock here to simulate that there has no available
// implementation for NFC Mojo interface.
nfc_test(async (t, mockNFC) => {
mockNFC.simulateClosedPipe();
const reader = new NDEFReader();
await promise_rejects_dom(t, 'NotSupportedError', reader.scan());
}, "NDEFReader.scan should faild if no implementation for NFC Mojo interface.");
const ndef = new NDEFReader();
await promise_rejects_dom(t, 'NotSupportedError', ndef.scan());
}, "NDEFReader.scan should fail if no implementation for NFC Mojo interface.");

nfc_test(async (t, mockNFC) => {
mockNFC.setHWStatus(NFCHWStatus.DISABLED);
const reader = new NDEFReader();
await promise_rejects_dom(t, 'NotReadableError', reader.scan());
const ndef = new NDEFReader();
await promise_rejects_dom(t, 'NotReadableError', ndef.scan());
}, "NDEFReader.scan should fail if NFC HW is disabled.");

nfc_test(async (t, mockNFC) => {
mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED);
const reader = new NDEFReader();
await promise_rejects_dom(t, 'NotSupportedError', reader.scan());
const ndef = new NDEFReader();
await promise_rejects_dom(t, 'NotSupportedError', ndef.scan());
}, "NDEFReader.scan should fail if NFC HW is not supported.");

nfc_test(async () => {
await new Promise((resolve,reject) => {
const iframe = document.createElement('iframe');
iframe.srcdoc = `<script>
window.onmessage = async (message) => {
if (message.data === "Ready") {
try {
const ndef = new NDEFReader();
await ndef.scan();
parent.postMessage("Failure", "*");
} catch (error) {
if (error.name == "NotAllowedError") {
parent.postMessage("Success", "*");
} else {
parent.postMessage("Failure", "*");
}
}
}
};
<\/script>`;
iframe.onload = () => iframe.contentWindow.postMessage('Ready', '*');
document.body.appendChild(iframe);
window.onmessage = message => {
if (message.data == 'Success') {
resolve();
} else if (message.data == 'Failure') {
reject();
}
}
});
}, 'Test that WebNFC API is not accessible from iframe context.');

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = readerWatcher.wait_for("reading").then(event => {
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const promise = ndefWatcher.wait_for("reading").then(event => {
assert_true(event instanceof NDEFReadingEvent);
controller.abort();
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
await promise;
}, "Test that nfc watch success if NFC HW is enabled.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = readerWatcher.wait_for("reading").then(event => {
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const promise = ndefWatcher.wait_for("reading").then(event => {
assert_true(event instanceof NDEFReadingEvent);
controller.abort();
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
await promise;
}, "Test that NDEFReader.scan matches any ids if NDEFScanOptions.id is undefined.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
controller.abort();
await promise_rejects_dom(t, 'AbortError', reader.scan({signal: controller.signal}));
await promise_rejects_dom(t, 'AbortError', ndef.scan({signal: controller.signal}));
}, "Test that NDEFReader.scan rejects if NDEFScanOptions.signal is already aborted.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const promise = reader.scan({signal: controller.signal});
const promise = ndef.scan({signal: controller.signal});
controller.abort();
await promise_rejects_dom(t, 'AbortError', promise);
}, "Test that NDEFReader.scan rejects if NDEFScanOptions.signal aborts right after \
the scan invocation.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const message = createMessage([createTextRecord(test_text_data)]);
const promise = readerWatcher.wait_for("reading").then(event => {
const promise = ndefWatcher.wait_for("reading").then(event => {
assert_true(event instanceof NDEFReadingEvent);
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

mockNFC.setReadingMessage(message);
await promise;

reader.onreading = t.unreached_func("reading event should not be fired.");
ndef.onreading = t.unreached_func("reading event should not be fired.");
mockNFC.setReadingMessage(message);
controller.abort();
await new Promise((resolve, reject) => {
Expand All @@ -127,10 +159,10 @@
}, "Test that NDEFReader can not get any reading events once the signal aborts.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = readerWatcher.wait_for("reading").then(event => {
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const promise = ndefWatcher.wait_for("reading").then(event => {
controller.abort();
assert_true(event instanceof NDEFReadingEvent);

Expand All @@ -151,7 +183,7 @@
assert_equals(decoder.decode(event.message.records[0].toRecords()[0].toRecords()[0].data),
test_text_data, 'data has the same content with the original dictionary');
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

// An external type record --contains-> a local type record --contains-> a text record.
const messageContainText = createMessage([createTextRecord(test_text_data)]);
Expand All @@ -164,10 +196,10 @@
}, "NDEFRecord.toRecords returns its embedded records correctly.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = readerWatcher.wait_for("reading").then(event => {
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const promise = ndefWatcher.wait_for("reading").then(event => {
controller.abort();
assert_true(event instanceof NDEFReadingEvent);

Expand Down Expand Up @@ -203,7 +235,7 @@
assert_array_equals(embedded_record_types.sort(), ['text', 'url'],
'smart-poster record\'s contained record types');
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

// A smart-poster record contains a uri record, text record.
const uri_record = createUrlRecord(test_url_data);
Expand All @@ -218,41 +250,41 @@
nfc_test(async (t, mockNFC) => {
const promises = [];

const reader1 = new NDEFReader();
const readerWatcher1 = new EventWatcher(t, reader1, ["reading", "readingerror"]);
const promise1 = readerWatcher1.wait_for("readingerror");
const ndef1 = new NDEFReader();
const ndefWatcher1 = new EventWatcher(t, ndef1, ["reading", "readingerror"]);
const promise1 = ndefWatcher1.wait_for("readingerror");
promises.push(promise1);
await reader1.scan();
await ndef1.scan();

const reader2 = new NDEFReader();
const readerWatcher2 = new EventWatcher(t, reader2, ["reading", "readingerror"]);
const promise2 = readerWatcher2.wait_for("readingerror");
const ndef2 = new NDEFReader();
const ndefWatcher2 = new EventWatcher(t, ndef2, ["reading", "readingerror"]);
const promise2 = ndefWatcher2.wait_for("readingerror");
promises.push(promise2);
await reader2.scan();
await ndef2.scan();

mockNFC.simulateNonNDEFTagDiscovered();
await Promise.all(promises);
}, "Test that NDEFReader.onreadingerror should be fired if the NFC tag does not \
expose NDEF technology.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = readerWatcher.wait_for("reading").then(event => {
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const promise = ndefWatcher.wait_for("reading").then(event => {
assert_equals(event.serialNumber, fake_tag_serial_number);
assert_equals(event.message.records.length, 0);
controller.abort();
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

mockNFC.setReadingMessage({ records: [] });
await promise;
}, "Test that NDEFReader.onreading should be fired on an unformatted NFC tag \
with empty records array for NDEFMessage.");

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const message = createMessage([createTextRecord(test_text_data),
createMimeRecordFromJson(test_json_data),
Expand All @@ -262,31 +294,31 @@
createUrlRecord(test_url_data, true),
createRecord('w3.org:xyz', test_buffer_data)],
test_message_origin);
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const promise = readerWatcher.wait_for("reading").then(event => {
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
const promise = ndefWatcher.wait_for("reading").then(event => {
assert_equals(event.serialNumber, fake_tag_serial_number);
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
controller.abort();
});
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});

mockNFC.setReadingMessage(message);
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());
const ndef = new NDEFReader();
const promise1 = ndef.scan();
const promise2 = promise_rejects_dom(t, 'InvalidStateError', ndef.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 ndef = new NDEFReader();
const controller = new AbortController();
await reader.scan({signal : controller.signal});
await ndef.scan({signal : controller.signal});
controller.abort();
await reader.scan();
await ndef.scan();
}, "Test that NDEFReader.scan can be started after the previous scan is aborted.");
</script>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<meta charset=utf-8>
<title>NDEFWriter.scan with an focused iframe</title>
<title>NDEFReader.scan with an focused iframe</title>
<link rel="help" href="https://w3c.github.io/web-nfc/"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
Expand All @@ -9,15 +9,15 @@
<script>

nfc_test(async (t, mockNFC) => {
const reader = new NDEFReader();
const ndef = new NDEFReader();
const controller = new AbortController();
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);

const promise = readerWatcher.wait_for("reading").then(event => {
const promise = ndefWatcher.wait_for("reading").then(event => {
assert_true(event instanceof NDEFReadingEvent);
controller.abort();
});
await reader.scan({ signal: controller.signal });
await ndef.scan({ signal: controller.signal });

const iframe = document.createElement('iframe');
iframe.src = 'resources/support-iframe.html';
Expand All @@ -37,7 +37,7 @@

// Remove iframe from main document.
iframe.parentNode.removeChild(iframe);
}, 'Test that NDEFWriter.scan is not suspended if iframe gains focus.');
}, 'Test that NDEFReader.scan is not suspended if iframe gains focus.');

</script>
</body>
Loading

0 comments on commit fb849ee

Please sign in to comment.