https://github.com/web-platform-tests/wpt
Tip revision: ea1a9c736686a73256cd23b5531cd10f123ad468 authored by kritisingh1 on 15 March 2018, 16:30:55 UTC
updating changes
updating changes
Tip revision: ea1a9c7
nfc_push.https.html
<!DOCTYPE html>
<meta charset=utf-8>
<title>Web NFC: Test exceptions in nfc.push</title>
<link rel="author" title="Intel" href="http://www.intel.com"/>
<link rel="help" href="https://w3c.github.io/web-nfc/"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/nfc_help.js"></script>
<div id="log"></div>
<script>
"use strict";
const invalid_type_messages =
[
// Invalid NFCPushMessage type
undefined,
// NFCMessage.records: should have at least 1 valid record.
// https://w3c.github.io/web-nfc/#the-push-method - Step 8.
createMessage([{}]),
// https://w3c.github.io/web-nfc/#dfn-map-text-to-ndef
// NFCRecord must have data.
createMessage([createTextRecord()]),
// NFCRecord.data for 'text' record must be number or string.
createMessage([createTextRecord(test_buffer_data)]),
createMessage([createTextRecord(test_json_data)]),
// https://w3c.github.io/web-nfc/#dfn-map-a-json-object-to-ndef
// NFCRecord must have data.
createMessage([createJsonRecord()]),
// NFCRecord.data for 'json' record must be object.
createMessage([createJsonRecord(test_buffer_data)]),
createMessage([createJsonRecord(test_number_data)]),
createMessage([createJsonRecord(test_text_data)]),
// https://w3c.github.io/web-nfc/#dfn-map-a-url-to-ndef
// NFCRecord must have data.
createMessage([createUrlRecord()]),
// NFCRecord.data for 'url' record must be string.
createMessage([createUrlRecord(test_buffer_data)]),
createMessage([createUrlRecord(test_number_data)]),
createMessage([createUrlRecord(test_json_data)]),
// https://w3c.github.io/web-nfc/#dfn-map-binary-data-to-ndef
// NFCRecord must have data.
createMessage([createOpaqueRecord()]),
// NFCRecord.data for 'opaque' record must be ArrayBuffer.
createMessage([createOpaqueRecord(test_text_data)]),
createMessage([createOpaqueRecord(test_number_data)]),
createMessage([createOpaqueRecord(test_json_data)])
];
const invalid_syntax_messages =
[
// NFCRecord.mediaType for 'text' record must be 'text/*'.
createMessage([createRecord('text', 'application/json',
test_number_data)]),
// Data for 'url' record, must be a valid URL.
createMessage([createUrlRecord('Invalid URL:// Data')]),
// NFCRecord.mediaType for 'json' record must be 'application/json' or
// starts with 'application/' and ends with '+json'.
createMessage([createRecord('json', 'image/png', test_json_data)]),
createMessage([createRecord('json', 'application/x+y', test_json_data)]),
createMessage([createRecord('json', 'custom/app+json', test_json_data)]),
];
promise_test(t => {
let promises = [];
invalid_type_messages.forEach(message => {
promises.push(
promise_rejects(t, new TypeError(), navigator.nfc.push(message)));
});
return Promise.all(promises);
}, "Test that promise is rejected with TypeError if NFCMessage is invalid.");
promise_test(t => {
let promises = [];
invalid_syntax_messages.forEach(message => {
promises.push(
promise_rejects(t, 'SyntaxError', navigator.nfc.push(message)));
});
return Promise.all(promises);
}, "'Test that promise is rejected with SyntaxError if NFCMessage contains invalid records.");
promise_test(t => {
return promise_rejects(t, new TypeError(), navigator.nfc.push(test_text_data, { timeout: "invalid"}));
}, "nfc.push should fail with TypeError when invalid timeout is provided.");
promise_test(t => {
return promise_rejects(t, new TypeError(), navigator.nfc.push(test_text_data, { timeout: -1 }));
}, "nfc.push should fail with TypeError when invalid negative timeout value is provided.");
promise_test(t => {
return promise_rejects(t, 'TimeoutError', navigator.nfc.push(test_text_data, { timeout: 1 }));
}, "nfc.push should fail with TimeoutError when timer expires.");
promise_test(t => {
let promise = navigator.nfc.push(test_text_data, { timeout: 100 });
navigator.nfc.cancelPush();
return promise_rejects(t, 'AbortError', promise);
}, "nfc.cancelPush should reject pending promise with AbortError.");
promise_test(t => {
return promise_rejects(t, 'NotSupportedError', navigator.nfc.push(new ArrayBuffer(32 * 1024 + 1)));
}, "Reject promise with NotSupportedError if NFC message size exceeds 32KB.");
promise_test(t => {
let message = createMessage([createTextRecord(test_text_data)]);
message.url = '%00/invalid/ path';
return promise_rejects(t, 'SyntaxError', navigator.nfc.push(message));
}, "Reject promise with SyntaxError if WebNFC Id cannot be created from provided URL.");
promise_test(t => {
let message = createMessage([createRecord('json','application/json',
{ get x(){ return this; } })]);
return promise_rejects(t, 'SyntaxError', navigator.nfc.push(message));
}, "Reject promise with SyntaxError if 'json' record cannot be serialized.");
promise_test(t => {
return promise_rejects(t, new TypeError(), navigator.nfc.push(test_text_data, {target: "invalid"}));
}, "nfc.push should fail with TypeError when invalid target value is provided.");
promise_test(t => {
return promise_rejects(t, new TypeError(), navigator.nfc.cancelPush("invalid"));
}, "nfc.cancelPush should fail with TypeError when invalid id value is provided.");
promise_test(() => {
return new Promise((resolve,reject) => {
let iframe = document.createElement('iframe');
iframe.srcdoc = '<script>' +
' window.onmessage = message => {' +
' if (message.data === "Ready") {' +
' let onSuccess = () => { parent.postMessage("Failure", "*"); };' +
' let onError = error => {' +
' if (error.name == "SecurityError") {' +
' parent.postMessage("Success", "*");' +
' } else {' +
' parent.postMessage("Failure", "*");' +
' }' +
' };' +
' navigator.nfc.push("Test").then(onSuccess, onError);' +
' }' +
' };' +
'<\/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.');
</script>