Skip to content

Commit e7974ae

Browse files
committed
Use navigator.nfc.ndef directly in examples
Signed-off-by: Zoltan Kis <[email protected]>
1 parent c5304c7 commit e7974ae

File tree

3 files changed

+54
-71
lines changed

3 files changed

+54
-71
lines changed

EXPLAINER.md

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,9 @@ when required, about granting access to Web NFC. It means sending and receiving
9292
info when users tap NFC devices can be done smoothly once permission is granted.
9393

9494
```js
95-
const reader = navigator.nfc.ndef;
96-
9795
async function startScanning() {
98-
await reader.scan();
99-
reader.onreading = event => {
96+
await navigator.nfc.ndef.scan();
97+
navigator.nfc.ndef.onreading = event => {
10098
/* handle NDEF messages */
10199
};
102100
}
@@ -126,10 +124,8 @@ cases where the text might even be in UTF-16 do to existing real life
126124
implementations.
127125

128126
```js
129-
const reader = navigator.nfc.ndef;
130-
131-
await reader.scan({ recordType: "example.com:smart-poster" });
132-
reader.onreading = event => {
127+
await navigator.nfc.ndef.scan();
128+
navigator.nfc.ndef.onreading = event => {
133129
const externalRecord = event.message.records.find(
134130
record => record.type == "example.com:smart-poster"
135131
);
@@ -163,10 +159,9 @@ abortController.signal.onabort = event => {
163159
// All NFC operations have been aborted.
164160
};
165161

166-
const reader = navigator.nfc.ndef;
167-
await ndef.scan({ signal: abortController.signal });
162+
navigator.nfc.ndef.scan({ signal: abortController.signal });
168163

169-
await ndef.push("foo", { signal: abortController.signal });
164+
navigator.nfc.ndef.write("foo", { signal: abortController.signal });
170165

171166
document.querySelector("#abortButton").onclick = event => {
172167
abortController.abort();
@@ -222,17 +217,19 @@ object/namespace, like Web Bluetooth, Web USB, etc. Unlike these APIs, the newer
222217
Generic Sensor APIs don’t attach themselves to the navigator object/namespace
223218
and have separate and dedicated objects like Accelerometer, Gyroscope, etc.
224219

225-
We decided to follow this newer pattern as it allows node.js to implement the
220+
The newer pattern allows node.js to implement the
226221
same API, and have it loaded as a separate module. People working on Web
227222
Assembly are also advocating for this patterns as it might be able to turn such
228223
globals into modules in the future, at least when accessed from WASM.
229224

225+
However, since Web NFC is close to Web Bluetooth and Web USB, and because scan
226+
filters were abandoned after Origin Trials feedback, attaching to the navigator
227+
object seemed to be a proper alignment.
228+
230229
### Separate objects for reader/writer
231230

232-
The reader and writer objects could have been merged into one single object, but
233-
as we allow multiple scans with filters to be active at the same time (maybe in
234-
multiple places/view of the app/site) then it makes more sense to be able to use
235-
separate objects.
231+
The reader and writer objects existed separately when scan filters were supported,
232+
but after filters have been abandoned, they have been merged into one single object.
236233

237234
## Considered alternatives
238235

index.html

Lines changed: 39 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,7 @@ <h4>
985985
The example checks if {{NDEFReader}} is available.
986986
</p>
987987
<pre class="example">
988-
if (navigator.nfc && navigator.nfc.ndef) {
988+
if (navigator.nfc?.ndef) {
989989
/* ... Scan and write NDEF Tags */
990990
}
991991
</pre>
@@ -1027,8 +1027,7 @@ <h4>
10271027
Writing a text string to an NFC tag is straightforward.
10281028
</p>
10291029
<pre class="example">
1030-
const ndef = navigator.nfc.ndef;
1031-
ndef.write(
1030+
navigator.nfc.ndef.write(
10321031
"Hello World"
10331032
).then(() => {
10341033
console.log("Message written.");
@@ -1044,9 +1043,8 @@ <h4>
10441043
we rely on async/await.
10451044
</p>
10461045
<pre class="example">
1047-
const ndef = navigator.nfc.ndef;
10481046
try {
1049-
ndef.write({
1047+
navigator.nfc.ndef.write({
10501048
records: [{ recordType: "url", data: "https://w3c.github.io/web-nfc/" }]
10511049
});
10521050
} catch {
@@ -1069,10 +1067,9 @@ <h4>
10691067
handler and one used specifically for a single write.
10701068
</p>
10711069
<pre class="example">
1072-
const ndef = navigator.nfc.ndef;
10731070
let ignoreRead = false;
10741071

1075-
ndef.onreading(event => {
1072+
navigator.nfc.ndef.onreading(event => {
10761073
if (ignoreRead) {
10771074
return; // write pending, ignore read.
10781075
}
@@ -1083,14 +1080,15 @@ <h4>
10831080
function write(data) {
10841081
ignoreRead = true;
10851082
return new Promise((resolve, reject) => {
1086-
ndef.addEventListener("reading", event => {
1083+
navigator.nfc.ndef.addEventListener("reading", event => {
10871084
// Check if we want to write to this tag, or reject.
1088-
ndef.write(data).then(resolve, reject).finally(() => ignoreRead = false);
1085+
navigator.nfc.ndef.write(data).then(resolve, reject)
1086+
.finally(() => ignoreRead = false);
10891087
}, { once: true });
10901088
});
10911089
}
10921090

1093-
await ndef.scan();
1091+
await navigator.nfc.ndef.scan();
10941092
try {
10951093
await write("Hello World");
10961094
console.log("We wrote to a tag!")
@@ -1119,7 +1117,8 @@ <h4>
11191117
}
11201118

11211119
ndef.addEventListener("reading", event => {
1122-
ndef.write(data, { signal: ctlr.signal }).then(resolve, reject);
1120+
ndef.write(data, { signal: ctlr.signal })
1121+
.then(resolve, reject);
11231122
}, { once: true });
11241123
});
11251124
}
@@ -1142,13 +1141,12 @@ <h4>
11421141
{{NDEFReader/onreadingerror}} is fired.
11431142
</p>
11441143
<pre class="example">
1145-
const ndef = navigator.nfc.ndef;
1146-
ndef.scan().then(() => {
1144+
navigator.nfc.ndef.scan().then(() => {
11471145
console.log("Scan started successfully.");
1148-
ndef.onreadingerror = event => {
1146+
navigator.nfc.ndef.onreadingerror = event => {
11491147
console.log("Error! Cannot read data from the NFC tag. Try a different one?");
11501148
};
1151-
ndef.onreading = event => {
1149+
navigator.nfc.ndef.onreading = event => {
11521150
console.log("NDEF message read.");
11531151
};
11541152
}).catch(error => {
@@ -1168,17 +1166,16 @@ <h4>
11681166
amount of milliseconds.
11691167
</p>
11701168
<pre class="example">
1171-
const ndef = navigator.nfc.ndef;
1172-
11731169
function read() {
11741170
return new Promise((resolve, reject) => {
11751171
const ctlr = new AbortController();
11761172
ctlr.signal.onabort = reject;
1177-
ndef.addEventListener("reading", event => {
1173+
navigator.nfc.ndef.addEventListener("reading", event => {
11781174
ctlr.abort();
11791175
resolve(event);
11801176
}, { once: true });
1181-
ndef.scan({ signal: ctlr.signal }).catch(err => reject(err));
1177+
navigator.nfc.ndef.scan({ signal: ctlr.signal })
1178+
.catch(err => reject(err));
11821179
});
11831180
}
11841181

@@ -1195,14 +1192,13 @@ <h4>
11951192
a text message is written with the value "Hello World".
11961193
</p>
11971194
<pre class="example">
1198-
const ndef = navigator.nfc.ndef;
1199-
await ndef.scan();
1200-
ndef.onreading = event => {
1195+
await navigator.nfc.ndef.scan();
1196+
navigator.nfc.ndef.onreading = event => {
12011197
const message = event.message;
12021198

12031199
if (message.records.length == 0 || // unformatted tag
12041200
message.records[0].recordType == 'empty' ) { // empty record
1205-
ndef.write({
1201+
navigator.nfc.ndef.write({
12061202
records: [{ recordType: "text", data: 'Hello World' }]
12071203
});
12081204
return;
@@ -1251,9 +1247,8 @@ <h4>
12511247
a write with a custom NDEF data layout.
12521248
</p>
12531249
<pre class="example">
1254-
const ndef = navigator.nfc.ndef;
1255-
await ndef.scan();
1256-
ndef.onreading = async event => {
1250+
await navigator.nfc.ndef.scan();
1251+
navigator.nfc.ndef.onreading = async event => {
12571252
if (event.message.id !== "my-game-progress")
12581253
return;
12591254
console.log(`Game state: ${ JSON.stringify(event.message.records) }`);
@@ -1271,7 +1266,7 @@ <h4>
12711266
}))
12721267
}]
12731268
};
1274-
await ndef.write(newMessage);
1269+
await navigator.nfc.ndef.write(newMessage);
12751270
console.log("Message written");
12761271
};
12771272
</pre>
@@ -1282,9 +1277,8 @@ <h4>
12821277
Storing and receiving JSON data is easy with serialization and deserialization.
12831278
</p>
12841279
<pre class="example">
1285-
const ndef = navigator.nfc.ndef;
1286-
await ndef.scan();
1287-
ndef.onreading = event => {
1280+
await navigator.nfc.ndef.scan();
1281+
navigator.nfc.ndef.onreading = event => {
12881282
const decoder = new TextDecoder();
12891283
for (const record of event.message.records) {
12901284
if (record.mediaType === 'application/json') {
@@ -1296,7 +1290,7 @@ <h4>
12961290
};
12971291

12981292
const encoder = new TextEncoder();
1299-
ndef.write({
1293+
navigator.nfc.ndef.write({
13001294
records: [
13011295
{
13021296
recordType: "mime",
@@ -1323,9 +1317,7 @@ <h4>
13231317
Writing data requires tapping an <a>NFC tag</a>.
13241318
</p>
13251319
<pre class="example">
1326-
const ndef = navigator.nfc.ndef;
1327-
1328-
ndef.onreading = async event => {
1320+
navigator.nfc.ndef.onreading = async event => {
13291321
const decoder = new TextDecoder();
13301322
for (const record of event.message.records) {
13311323
console.log("Record type: " + record.recordType);
@@ -1334,13 +1326,13 @@ <h4>
13341326
}
13351327

13361328
try {
1337-
await ndef.write("Overriding data is fun!");
1329+
await navigator.nfc.ndef.write("Overriding data is fun!");
13381330
} catch(error) {
13391331
console.log(`Write failed :-( try again: ${error}.`);
13401332
}
13411333
};
13421334

1343-
ndef.scan();
1335+
navigator.nfc.ndef.scan();
13441336
</pre>
13451337
</section>
13461338

@@ -1349,11 +1341,10 @@ <h4>
13491341
Read NDEF messages for 3 seconds by using {{NDEFScanOptions/signal}}.
13501342
</p>
13511343
<pre class="example">
1352-
const ndef = navigator.nfc.ndef;
13531344
const controller = new AbortController();
13541345

1355-
await ndef.scan({ signal: controller.signal });
1356-
ndef.onreading = event => {
1346+
await navigator.nfc.ndef.scan({ signal: controller.signal });
1347+
navigator.nfc.ndef.onreading = event => {
13571348
console.log("NDEF message read.");
13581349
};
13591350

@@ -1368,9 +1359,8 @@ <h4>
13681359

13691360
<section> <h3>Write a smart poster message</h3>
13701361
<pre class="example">
1371-
const ndef = navigator.nfc.ndef;
13721362
const encoder = new TextEncoder();
1373-
ndef.write({ records: [
1363+
navigator.nfc.ndef.write({ records: [
13741364
{
13751365
recordType: "smart-poster", // Sp
13761366
data: { records: [
@@ -1434,9 +1424,8 @@ <h4>
14341424
borrowed from <a>smart poster</a>, but used in local application context.
14351425
</p>
14361426
<pre class="example">
1437-
const ndef = navigator.nfc.ndef;
1438-
await ndef.scan();
1439-
ndef.onreading = event => {
1427+
await navigator.nfc.ndef.scan();
1428+
navigator.nfc.ndef.onreading = event => {
14401429
const externalRecord = event.message.records.find(
14411430
record => record.type == "example.com:smart-poster"
14421431
);
@@ -1473,8 +1462,7 @@ <h4>
14731462
that may even contain an <a>NDEF message</a> as payload.
14741463
</p>
14751464
<pre class="example">
1476-
const ndef = navigator.nfc.ndef;
1477-
ndef.write({ records: [
1465+
navigator.nfc.ndef.write({ records: [
14781466
{
14791467
recordType: "example.game:a",
14801468
data: {
@@ -1507,8 +1495,7 @@ <h4>
15071495
</p>
15081496
<pre class="example">
15091497
const encoder = new TextEncoder();
1510-
const ndef = navigator.nfc.ndef;
1511-
ndef.write({ records: [
1498+
navigator.nfc.ndef.write({ records: [
15121499
{
15131500
recordType: "example.com:shoppingItem", // External record
15141501
data: {
@@ -1527,9 +1514,8 @@ <h4>
15271514
]});
15281515
</pre>
15291516
<pre class="example">
1530-
const ndef = navigator.nfc.ndef;
1531-
await ndef.scan();
1532-
ndef.onreading = event => {
1517+
await navigator.nfc.ndef.scan();
1518+
navigator.nfc.ndef.onreading = event => {
15331519
const shoppingItemRecord = event.message.records[0];
15341520
if (!shoppingItemRecord ||
15351521
shoppingItemRecord.recordType !== "example.com:shoppingItem") {
@@ -1997,7 +1983,7 @@ <h2>The NFC object</h2>
19971983
</pre>
19981984
<p>The
19991985
<dfn>ndef</dfn> property is an {{NDEFReader}} object that provides
2000-
<a>NDEF</a> tag read and write functionality.
1986+
<a>NFC tag</a> read and write functionality.
20011987
</p>
20021988

20031989
<section><h3>NFC state associated with the settings object</h3>
@@ -2031,7 +2017,7 @@ <h2>The NFC object</h2>
20312017
<td>empty <a>set</a></td>
20322018
<td>
20332019
A &lt;|promise:Promise|, |reader:NDEFReader|&gt; tuple where |promise|
2034-
holds a {{Promise}} and |reader| holds an {{NDEFReader}}.
2020+
holds a pending {{Promise}} and |reader| holds an {{NDEFReader}}.
20352021
</td>
20362022
</tr>
20372023
<tr>

web-nfc.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
// https://w3c.github.io/web-nfc/#actual-idl-index
88

99
interface Navigator {
10-
nfc: NFC
10+
readonly nfc: NFC
1111
}
1212
declare class NFC {
13-
ndef: NDEFReader
13+
readonly ndef: NDEFReader
1414
}
1515
interface Window {
1616
NDEFMessage: NDEFMessage

0 commit comments

Comments
 (0)