Skip to content

Commit

Permalink
web-nfc: Merge NDEFWriter in NDEFReader
Browse files Browse the repository at this point in the history
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

Bug: 1131141
Change-Id: I8cc2ce053e5bb43c0fa5b299bdaf5cb5317bf859
  • Loading branch information
arskama authored and chromium-wpt-export-bot committed Oct 14, 2020
1 parent 5fcc1c2 commit fed2f49
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 68 deletions.
8 changes: 0 additions & 8 deletions interfaces/web-nfc.idl
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,6 @@ dictionary NDEFRecordInit {

typedef (DOMString or BufferSource or NDEFMessageInit) NDEFMessageSource;

[SecureContext, Exposed=Window]
interface NDEFWriter {
constructor();

Promise<undefined> write(NDEFMessageSource message,
optional NDEFWriteOptions options={});
};

[SecureContext, Exposed=Window]
interface NDEFReader : EventTarget {
constructor();
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
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
];

nfc_test(async t => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const promises = [];
invalid_type_messages.forEach(message => {
promises.push(
Expand All @@ -134,7 +134,7 @@
}, "Test that promise is rejected with TypeError if NDEFMessageSource is invalid.");

nfc_test(async t => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const promises = [];
invalid_syntax_messages.forEach(message => {
promises.push(
Expand All @@ -146,20 +146,20 @@

nfc_test(async t => {
await test_driver.set_permission({ name: 'nfc' }, 'denied', false);
const writer = new NDEFWriter();
const writer = new NDEFReader();
await promise_rejects_dom(t, 'NotAllowedError', writer.write(test_text_data));
}, 'NDEFWriter.write should fail if user permission is not granted.');
}, 'NDEFReader.write 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 writer = new NDEFWriter();
const writer = new NDEFReader();
await promise_rejects_dom(t, 'NotSupportedError', writer.write(test_text_data));
}, 'NDEFWriter.write should fail if no implementation for NFC Mojo interface is available.');
}, 'NDEFReader.write should fail if no implementation for NFC Mojo interface is available.');

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const controller = new AbortController();

//Make sure push is pending
Expand All @@ -176,31 +176,31 @@
});
await rejected;
assert_true(callback_called, 'timeout should have caused the abort');
}, "NDEFWriter.write should fail if abort write request before write happends.");
}, "NDEFReader.write should fail if abort write request before write happends.");

nfc_test(async t => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const controller = new AbortController();
assert_false(controller.signal.aborted);
controller.abort();
assert_true(controller.signal.aborted);
await promise_rejects_dom(t, 'AbortError',
writer.write(test_text_data, { signal: controller.signal }));
}, "NDEFWriter.write should fail if signal's aborted flag is set.");
}, "NDEFReader.write should fail if signal's aborted flag is set.");

nfc_test(async t => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const promises = [];
invalid_signals.forEach(invalid_signal => {
promises.push(promise_rejects_js(t, TypeError,
writer.write(test_text_data, { signal: invalid_signal })));
});
await Promise.all(promises);
}, "NDEFWriter.write should fail if signal is not an AbortSignal.");
}, "NDEFReader.write should fail if signal is not an AbortSignal.");

nfc_test(async (t, mockNFC) => {
const writer1 = new NDEFWriter();
const writer2 = new NDEFWriter();
const writer1 = new NDEFReader();
const writer2 = new NDEFReader();
const controller = new AbortController();
const p1 = writer1.write(test_text_data, { signal: controller.signal });

Expand All @@ -214,16 +214,16 @@
}, "Synchronously signaled abort.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
mockNFC.setHWStatus(NFCHWStatus.DISABLED);
await promise_rejects_dom(t, 'NotReadableError', writer.write(test_text_data));
}, "NDEFWriter.write should fail when NFC HW is disabled.");
}, "NDEFReader.write should fail when NFC HW is disabled.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED);
await promise_rejects_dom(t, 'NotSupportedError', writer.write(test_text_data));
}, "NDEFWriter.write should fail when NFC HW is not supported.");
}, "NDEFReader.write should fail when NFC HW is not supported.");

nfc_test(async () => {
await new Promise((resolve,reject) => {
Expand All @@ -242,7 +242,7 @@
}
};
try {
const writer = new NDEFWriter();
const writer = new NDEFReader();
writer.write("Test").then(onSuccess, onError);
} catch(e) {
parent.postMessage("Failure", "*");
Expand All @@ -263,12 +263,12 @@
}, 'Test that WebNFC API is not accessible from iframe context.');

nfc_test(async () => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_text_data);
}, 'NDEFWriter.write should succeed when NFC HW is enabled');
}, 'NDEFReader.write should succeed when NFC HW is enabled');

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const message = createMessage([createTextRecord(test_text_data),
createMimeRecordFromJson(test_json_data),
createMimeRecord(test_buffer_data),
Expand All @@ -279,7 +279,7 @@
test_message_origin);
await writer.write(message);
assertNDEFMessagesEqual(message, mockNFC.pushedMessage());
}, "NDEFWriter.write NDEFMessage containing text, mime, unknown, url, absolute-url \
}, "NDEFReader.write NDEFMessage containing text, mime, unknown, url, absolute-url \
and external records with default NDEFWriteOptions.");

nfc_test(async (t, mockNFC) => {
Expand All @@ -291,7 +291,7 @@
// Prepare an external type record that uses |messageContainLocal| as its payload.
const message = createMessage([createRecord('example.com:containsLocalRecord', messageContainLocal)]);

const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(message);
const pushed_message = mockNFC.pushedMessage();

Expand All @@ -311,7 +311,7 @@
assert_array_equals(pushed_message.data[0].payloadMessage.data[0].data, new Uint8Array(0),
'payloadMessage is used instead');
assertNDEFMessagesEqual(messageContainText, pushed_message.data[0].payloadMessage.data[0].payloadMessage);
}, "NDEFWriter.write NDEFMessage containing embedded records.");
}, "NDEFReader.write NDEFMessage containing embedded records.");

nfc_test(async (t, mockNFC) => {
// A smart-poster record contains a uri record, text record.
Expand All @@ -321,7 +321,7 @@
const message = createMessage([createRecord(
'smart-poster', payload_message, "dummy_record_id")]);

const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(message);
const pushed_message = mockNFC.pushedMessage();

Expand Down Expand Up @@ -350,50 +350,50 @@
}
assert_array_equals(embedded_record_types.sort(), ['text', 'url'],
'smart-poster record\'s contained record types');
}, "NDEFWriter.write NDEFMessage containing smart-poster record.");
}, "NDEFReader.write NDEFMessage containing smart-poster record.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_text_data);
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
}, "Test that NDEFWriter.write succeeds when message is DOMString.");
}, "Test that NDEFReader.write succeeds when message is DOMString.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_buffer_data);
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
}, "Test that NDEFWriter.write succeeds when message is ArrayBuffer.");
}, "Test that NDEFReader.write succeeds when message is ArrayBuffer.");

nfc_test(async (t, mockNFC) => {
let buffer_view = new Uint8Array(test_buffer_data, 2, 5);
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(buffer_view);
assertNDEFMessagesEqual(buffer_view, mockNFC.pushedMessage());
}, "Test that NDEFWriter.write succeeds when message is ArrayBufferView.");
}, "Test that NDEFReader.write succeeds when message is ArrayBufferView.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(createMessage([createRecord('empty')]));
const receivedMessage = mockNFC.pushedMessage();
assert_equals(receivedMessage.data.length, 1);
assert_equals(receivedMessage.data[0].recordType, 'empty', 'recordType');
}, "NDEFWriter.write with 'empty' record should succeed.");
}, "NDEFReader.write with 'empty' record should succeed.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_text_data);
assertNDEFWriteOptionsEqual({overwrite: true}, mockNFC.writeOptions());
}, "Check that default NDEFWriteOptions values are correctly set.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_text_data, {overwrite: false});
assertNDEFWriteOptionsEqual({overwrite: false}, mockNFC.writeOptions());
}, "Check that provided NDEFWriteOptions values are correctly converted.");

nfc_test(async (t, mockNFC) => {
const writer1 = new NDEFWriter();
const writer2 = new NDEFWriter();
const writer1 = new NDEFReader();
const writer2 = new NDEFReader();

const p1 = writer1.write(test_text_data, {overwrite: false});
const p2 = writer2.write(test_url_data, {overwrite: true});
Expand All @@ -414,10 +414,10 @@
resolve();
});
});
}, "NDEFWriter.write should replace all previously configured write operations.");
}, "NDEFReader.write should replace all previously configured write operations.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write({ records: [{ recordType: "mime", data: test_buffer_data }] });
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
}, "Test that mediaType should be set to 'application/octet-stream' if \
Expand All @@ -428,7 +428,7 @@
// Make sure the push will be pending in the mock.
mockNFC.setPendingPushCompleted(false);

const writer = new NDEFWriter();
const writer = new NDEFReader();
const promise = writer.write(test_text_data);

// Just to make sure the write() request has already reached to the mock.
Expand All @@ -437,37 +437,37 @@

mockNFC.simulateNonNDEFTagDiscovered();
await promise_rejects_dom(t, 'NotSupportedError', promise);
}, "NDEFWriter.write should fail when the NFC device coming up does not expose \
}, "NDEFReader.write should fail when the NFC device coming up does not expose \
NDEF technology.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_text_data, {overwrite: false});
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
}, "NDEFWriter.write should succeed to write data to an unformatted NFC device \
}, "NDEFReader.write should succeed to write data to an unformatted NFC device \
when the NDEFWriteOptions.overwrite is false.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
await writer.write(test_buffer_data);
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
await writer.write(test_text_data, {overwrite: true});
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
}, "NDEFWriter.write should succeed to overwrite the existing data \
}, "NDEFReader.write should succeed to overwrite the existing data \
when the NDEFWriteOptions.overwrite is true.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
const p = writer.write(test_text_data, {overwrite: false});
mockNFC.setIsFormattedTag(true);
await promise_rejects_dom(t, 'NotAllowedError', p);
}, "NDEFWriter.write should fail when there are NDEF records on the NFC device \
}, "NDEFReader.write should fail when there are NDEF records on the NFC device \
and NDEFWriteOptions.overwrite is false.");

nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
const writer = new NDEFReader();
mockNFC.simulateDataTransferFails();
await promise_rejects_dom(t, 'NetworkError', writer.write(test_text_data));
}, "NDEFWriter.write should fail with NetworkError when NFC data transfer fails.");
}, "NDEFReader.write should fail with NetworkError when NFC data transfer fails.");

</script>
1 change: 0 additions & 1 deletion web-nfc/idlharness.https.window.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ idl_test(
['html', 'dom', 'WebIDL'],
idl_array => {
idl_array.add_objects({
NDEFWriter: ['new NDEFWriter();'],
NDEFReader: ['new NDEFReader();'],
NDEFRecord: [`new NDEFRecord(${JSON.stringify(record)});`],
NDEFMessage: [`new NDEFMessage(${JSON.stringify(message)});`],
Expand Down
5 changes: 0 additions & 5 deletions web-nfc/nfc_insecure_context.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,6 @@ <h2>Note</h2>

"use strict";

test(t => {
assert_false(isSecureContext);
assert_false('NDEFWriter' in window);
}, 'NDEFWriter requires a secure context');

test(t => {
assert_false(isSecureContext);
assert_false('NDEFReader' in window);
Expand Down

0 comments on commit fed2f49

Please sign in to comment.