Skip to content

Commit 3e2b654

Browse files
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
1 parent 6c4a252 commit 3e2b654

7 files changed

+209
-177
lines changed

web-nfc/NDEFReader-document-hidden-manual.https.html renamed to web-nfc/NDEFReader-read-document-hidden-manual.https.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
<script>
1010

1111
nfc_test(async (t, mockNFC) => {
12-
const reader = new NDEFReader();
13-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
12+
const ndef = new NDEFReader();
13+
const ndefWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
1414
const promise = new Promise((resolve, reject) => {
15-
readerWatcher.wait_for("reading").then(event => {
15+
ndefWatcher.wait_for("reading").then(event => {
1616
if (document.hidden) reject();
1717
else resolve();
1818
});
1919
});
20-
await reader.scan();
20+
await ndef.scan();
2121
await promise;
2222
}, "Test NDEFReader.onreading is not fired when document is hidden");
2323

web-nfc/NDEFWriter-document-hidden-manual.https.html renamed to web-nfc/NDEFReader-write-document-hidden-manual.https.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<!DOCTYPE html>
22
<meta charset="utf-8">
33
<meta name="timeout" content="long">
4-
<title>NDEFWriter.write respect page visibility changes</title>
4+
<title>NDEFReader.write respect page visibility changes</title>
55
<link rel="help" href="https://w3c.github.io/web-nfc/#visible-document">
66
<script src="/resources/testharness.js"></script>
77
<script src="/resources/testharnessreport.js"></script>
88
<script src="resources/nfc-helpers.js"></script>
99
<script>
1010

1111
promise_test(async t => {
12-
const writer = new NDEFWriter();
12+
const writer = new NDEFReader();
1313
const p1 = writer.write(test_text_data);
1414

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

2525
</script>
2626

web-nfc/NDEFReader_scan.https.html

Lines changed: 97 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -21,104 +21,141 @@
2121
];
2222

2323
function waitSyntaxErrorPromise(t, scan_options) {
24-
const reader = new NDEFReader();
25-
return promise_rejects_dom(t, 'SyntaxError', reader.scan(scan_options));
24+
const ndef = new NDEFReader();
25+
return promise_rejects_dom(t, 'SyntaxError', ndef.scan(scan_options));
2626
}
2727

2828
nfc_test(async t => {
29-
const reader = new NDEFReader();
29+
const ndef = new NDEFReader();
3030
const promises = [];
3131
invalid_signals.forEach(invalid_signal => {
3232
promises.push(promise_rejects_js(t, TypeError,
33-
reader.scan({ signal: invalid_signal })));
33+
ndef.scan({ signal: invalid_signal })));
3434
});
3535
await Promise.all(promises);
3636
}, "Test that NDEFReader.scan rejects if signal is not an AbortSignal.");
3737

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

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

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

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

64+
nfc_test(async () => {
65+
await new Promise((resolve,reject) => {
66+
const iframe = document.createElement('iframe');
67+
iframe.srcdoc = `<script>
68+
window.onmessage = message => {
69+
if (message.data === "Ready") {
70+
const onSuccess = () => {
71+
parent.postMessage("Failure", "*");
72+
};
73+
const onError = error => {
74+
if (error.name == "NotAllowedError") {
75+
parent.postMessage("Success", "*");
76+
} else {
77+
parent.postMessage("Failure", "*");
78+
}
79+
};
80+
try {
81+
const ndef = new NDEFReader();
82+
ndef.scan().then(onSuccess, onError);
83+
} catch(e) {
84+
parent.postMessage("Failure", "*");
85+
}
86+
}
87+
};
88+
<\/script>`;
89+
iframe.onload = () => iframe.contentWindow.postMessage('Ready', '*');
90+
document.body.appendChild(iframe);
91+
window.onmessage = message => {
92+
if (message.data == 'Success') {
93+
resolve();
94+
} else if (message.data == 'Failure') {
95+
reject();
96+
}
97+
}
98+
});
99+
}, 'Test that WebNFC API is not accessible from iframe context.');
100+
64101
nfc_test(async (t, mockNFC) => {
65-
const reader = new NDEFReader();
102+
const ndef = new NDEFReader();
66103
const controller = new AbortController();
67-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
68-
const promise = readerWatcher.wait_for("reading").then(event => {
104+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
105+
const promise = ndefWatcher.wait_for("reading").then(event => {
69106
assert_true(event instanceof NDEFReadingEvent);
70107
controller.abort();
71108
});
72-
await reader.scan({signal : controller.signal});
109+
await ndef.scan({signal : controller.signal});
73110

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

78115
nfc_test(async (t, mockNFC) => {
79-
const reader = new NDEFReader();
116+
const ndef = new NDEFReader();
80117
const controller = new AbortController();
81-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
82-
const promise = readerWatcher.wait_for("reading").then(event => {
118+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
119+
const promise = ndefWatcher.wait_for("reading").then(event => {
83120
assert_true(event instanceof NDEFReadingEvent);
84121
controller.abort();
85122
});
86-
await reader.scan({signal : controller.signal});
123+
await ndef.scan({signal : controller.signal});
87124

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

92129
nfc_test(async (t, mockNFC) => {
93-
const reader = new NDEFReader();
130+
const ndef = new NDEFReader();
94131
const controller = new AbortController();
95132
controller.abort();
96-
await promise_rejects_dom(t, 'AbortError', reader.scan({signal: controller.signal}));
133+
await promise_rejects_dom(t, 'AbortError', ndef.scan({signal: controller.signal}));
97134
}, "Test that NDEFReader.scan rejects if NDEFScanOptions.signal is already aborted.");
98135

99136
nfc_test(async (t, mockNFC) => {
100-
const reader = new NDEFReader();
137+
const ndef = new NDEFReader();
101138
const controller = new AbortController();
102-
const promise = reader.scan({signal: controller.signal});
139+
const promise = ndef.scan({signal: controller.signal});
103140
controller.abort();
104141
await promise_rejects_dom(t, 'AbortError', promise);
105142
}, "Test that NDEFReader.scan rejects if NDEFScanOptions.signal aborts right after \
106143
the scan invocation.");
107144

108145
nfc_test(async (t, mockNFC) => {
109-
const reader = new NDEFReader();
146+
const ndef = new NDEFReader();
110147
const controller = new AbortController();
111-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
148+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
112149
const message = createMessage([createTextRecord(test_text_data)]);
113-
const promise = readerWatcher.wait_for("reading").then(event => {
150+
const promise = ndefWatcher.wait_for("reading").then(event => {
114151
assert_true(event instanceof NDEFReadingEvent);
115152
});
116-
await reader.scan({signal : controller.signal});
153+
await ndef.scan({signal : controller.signal});
117154

118155
mockNFC.setReadingMessage(message);
119156
await promise;
120157

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

129166
nfc_test(async (t, mockNFC) => {
130-
const reader = new NDEFReader();
167+
const ndef = new NDEFReader();
131168
const controller = new AbortController();
132-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
133-
const promise = readerWatcher.wait_for("reading").then(event => {
169+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
170+
const promise = ndefWatcher.wait_for("reading").then(event => {
134171
controller.abort();
135172
assert_true(event instanceof NDEFReadingEvent);
136173

@@ -151,7 +188,7 @@
151188
assert_equals(decoder.decode(event.message.records[0].toRecords()[0].toRecords()[0].data),
152189
test_text_data, 'data has the same content with the original dictionary');
153190
});
154-
await reader.scan({signal : controller.signal});
191+
await ndef.scan({signal : controller.signal});
155192

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

166203
nfc_test(async (t, mockNFC) => {
167-
const reader = new NDEFReader();
204+
const ndef = new NDEFReader();
168205
const controller = new AbortController();
169-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
170-
const promise = readerWatcher.wait_for("reading").then(event => {
206+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
207+
const promise = ndefWatcher.wait_for("reading").then(event => {
171208
controller.abort();
172209
assert_true(event instanceof NDEFReadingEvent);
173210

@@ -203,7 +240,7 @@
203240
assert_array_equals(embedded_record_types.sort(), ['text', 'url'],
204241
'smart-poster record\'s contained record types');
205242
});
206-
await reader.scan({signal : controller.signal});
243+
await ndef.scan({signal : controller.signal});
207244

208245
// A smart-poster record contains a uri record, text record.
209246
const uri_record = createUrlRecord(test_url_data);
@@ -218,41 +255,41 @@
218255
nfc_test(async (t, mockNFC) => {
219256
const promises = [];
220257

221-
const reader1 = new NDEFReader();
222-
const readerWatcher1 = new EventWatcher(t, reader1, ["reading", "readingerror"]);
223-
const promise1 = readerWatcher1.wait_for("readingerror");
258+
const ndef1 = new NDEFReader();
259+
const ndefWatcher1 = new EventWatcher(t, ndef1, ["reading", "readingerror"]);
260+
const promise1 = ndefWatcher1.wait_for("readingerror");
224261
promises.push(promise1);
225-
await reader1.scan();
262+
await ndef1.scan();
226263

227-
const reader2 = new NDEFReader();
228-
const readerWatcher2 = new EventWatcher(t, reader2, ["reading", "readingerror"]);
229-
const promise2 = readerWatcher2.wait_for("readingerror");
264+
const ndef2 = new NDEFReader();
265+
const ndefWatcher2 = new EventWatcher(t, ndef2, ["reading", "readingerror"]);
266+
const promise2 = ndefWatcher2.wait_for("readingerror");
230267
promises.push(promise2);
231-
await reader2.scan();
268+
await ndef2.scan();
232269

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

238275
nfc_test(async (t, mockNFC) => {
239-
const reader = new NDEFReader();
276+
const ndef = new NDEFReader();
240277
const controller = new AbortController();
241-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
242-
const promise = readerWatcher.wait_for("reading").then(event => {
278+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
279+
const promise = ndefWatcher.wait_for("reading").then(event => {
243280
assert_equals(event.serialNumber, fake_tag_serial_number);
244281
assert_equals(event.message.records.length, 0);
245282
controller.abort();
246283
});
247-
await reader.scan({signal : controller.signal});
284+
await ndef.scan({signal : controller.signal});
248285

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

254291
nfc_test(async (t, mockNFC) => {
255-
const reader = new NDEFReader();
292+
const ndef = new NDEFReader();
256293
const controller = new AbortController();
257294
const message = createMessage([createTextRecord(test_text_data),
258295
createMimeRecordFromJson(test_json_data),
@@ -262,31 +299,31 @@
262299
createUrlRecord(test_url_data, true),
263300
createRecord('w3.org:xyz', test_buffer_data)],
264301
test_message_origin);
265-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
266-
const promise = readerWatcher.wait_for("reading").then(event => {
302+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
303+
const promise = ndefWatcher.wait_for("reading").then(event => {
267304
assert_equals(event.serialNumber, fake_tag_serial_number);
268305
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
269306
controller.abort();
270307
});
271-
await reader.scan({signal : controller.signal});
308+
await ndef.scan({signal : controller.signal});
272309

273310
mockNFC.setReadingMessage(message);
274311
await promise;
275312
}, "Test that reading message with multiple records should succeed.");
276313

277314
nfc_test(async (t, mockNFC) => {
278-
const reader = new NDEFReader();
279-
const promise1 = reader.scan();
280-
const promise2 = promise_rejects_dom(t, 'InvalidStateError', reader.scan());
315+
const ndef = new NDEFReader();
316+
const promise1 = ndef.scan();
317+
const promise2 = promise_rejects_dom(t, 'InvalidStateError', ndef.scan());
281318
await promise1;
282319
await promise2;
283320
}, "Test that NDEFReader.scan rejects if there is already an ongoing scan.");
284321

285322
nfc_test(async (t, mockNFC) => {
286-
const reader = new NDEFReader();
323+
const ndef = new NDEFReader();
287324
const controller = new AbortController();
288-
await reader.scan({signal : controller.signal});
325+
await ndef.scan({signal : controller.signal});
289326
controller.abort();
290-
await reader.scan();
327+
await ndef.scan();
291328
}, "Test that NDEFReader.scan can be started after the previous scan is aborted.");
292329
</script>

web-nfc/NDEFReader_scan_iframe.https.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!DOCTYPE html>
22
<meta charset=utf-8>
3-
<title>NDEFWriter.scan with an focused iframe</title>
3+
<title>NDEFReader.scan with an focused iframe</title>
44
<link rel="help" href="https://w3c.github.io/web-nfc/"/>
55
<script src="/resources/testharness.js"></script>
66
<script src="/resources/testharnessreport.js"></script>
@@ -9,15 +9,15 @@
99
<script>
1010

1111
nfc_test(async (t, mockNFC) => {
12-
const reader = new NDEFReader();
12+
const ndef = new NDEFReader();
1313
const controller = new AbortController();
14-
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
14+
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
1515

16-
const promise = readerWatcher.wait_for("reading").then(event => {
16+
const promise = ndefWatcher.wait_for("reading").then(event => {
1717
assert_true(event instanceof NDEFReadingEvent);
1818
controller.abort();
1919
});
20-
await reader.scan({ signal: controller.signal });
20+
await ndef.scan({ signal: controller.signal });
2121

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

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

4242
</script>
4343
</body>

0 commit comments

Comments
 (0)